Version19.178

This commit is contained in:
acanas 2020-04-12 21:33:02 +02:00
parent bf1010c1a7
commit 8850c114d0
12 changed files with 509 additions and 440 deletions

View File

@ -497,7 +497,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD: En OpenSWAD:
ps2pdf source.ps destination.pdf ps2pdf source.ps destination.pdf
*/ */
#define Log_PLATFORM_VERSION "SWAD 19.177 (2020-04-12)" #define Log_PLATFORM_VERSION "SWAD 19.178 (2020-04-12)"
#define CSS_FILE "swad19.146.css" #define CSS_FILE "swad19.146.css"
#define JS_FILE "swad19.172.1.js" #define JS_FILE "swad19.172.1.js"
/* /*
@ -548,6 +548,7 @@ Funci
// TODO: Oresti Baños: cambiar ojos por candados en descriptores para prohibir/permitir y dejar los ojos para poder elegir descriptores // TODO: Oresti Baños: cambiar ojos por candados en descriptores para prohibir/permitir y dejar los ojos para poder elegir descriptores
// TODO: Integrar pull requests con traducciones del alemán del usuario eruedin en GitHub // TODO: Integrar pull requests con traducciones del alemán del usuario eruedin en GitHub
Version 19.178: Apr 12, 2020 Code refactoring in statistics. (285569 lines)
Version 19.177: Apr 12, 2020 Code refactoring in exam announcements. (285509 lines) Version 19.177: Apr 12, 2020 Code refactoring in exam announcements. (285509 lines)
Version 19.176: Apr 12, 2020 Code refactoring in agenda. (285419 lines) Version 19.176: Apr 12, 2020 Code refactoring in agenda. (285419 lines)
Version 19.175: Apr 12, 2020 Code refactoring in syllabus. (285345 lines) Version 19.175: Apr 12, 2020 Code refactoring in syllabus. (285345 lines)

View File

@ -448,13 +448,13 @@ static void CrsCfg_Indicators (void)
{ {
extern const char *Txt_Indicators; extern const char *Txt_Indicators;
extern const char *Txt_of_PART_OF_A_TOTAL; extern const char *Txt_of_PART_OF_A_TOTAL;
struct Ind_IndicatorsCrs Indicators; struct Ind_IndicatorsCrs IndicatorsCrs;
int NumIndicatorsFromDB = Ind_GetNumIndicatorsCrsFromDB (Gbl.Hierarchy.Crs.CrsCod); int NumIndicatorsFromDB = Ind_GetNumIndicatorsCrsFromDB (Gbl.Hierarchy.Crs.CrsCod);
char *Title; char *Title;
/***** Compute indicators ******/ /***** Compute indicators ******/
Ind_ComputeAndStoreIndicatorsCrs (Gbl.Hierarchy.Crs.CrsCod, Ind_ComputeAndStoreIndicatorsCrs (Gbl.Hierarchy.Crs.CrsCod,
NumIndicatorsFromDB,&Indicators); NumIndicatorsFromDB,&IndicatorsCrs);
/***** Number of indicators *****/ /***** Number of indicators *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
@ -466,13 +466,13 @@ static void CrsCfg_Indicators (void)
HTM_TD_Begin ("class=\"LB\""); HTM_TD_Begin ("class=\"LB\"");
Frm_StartForm (ActReqStaCrs); Frm_StartForm (ActReqStaCrs);
if (asprintf (&Title,"%u %s %u", if (asprintf (&Title,"%u %s %u",
Indicators.NumIndicators, IndicatorsCrs.NumIndicators,
Txt_of_PART_OF_A_TOTAL,Ind_NUM_INDICATORS) < 0) Txt_of_PART_OF_A_TOTAL,Ind_NUM_INDICATORS) < 0)
Lay_NotEnoughMemoryExit (); Lay_NotEnoughMemoryExit ();
HTM_BUTTON_SUBMIT_Begin (Title,"BT_LINK DAT",NULL); HTM_BUTTON_SUBMIT_Begin (Title,"BT_LINK DAT",NULL);
HTM_TxtF ("%s&nbsp;",Title); HTM_TxtF ("%s&nbsp;",Title);
Ico_PutIcon ((Indicators.NumIndicators == Ind_NUM_INDICATORS) ? "check-circle.svg" : Ico_PutIcon ((IndicatorsCrs.NumIndicators == Ind_NUM_INDICATORS) ? "check-circle.svg" :
"exclamation-triangle.svg", "exclamation-triangle.svg",
Title,"ICO16x16"); Title,"ICO16x16");
HTM_BUTTON_End (); HTM_BUTTON_End ();
free (Title); free (Title);

View File

@ -103,7 +103,7 @@ static void DT_EditingDegreeTypeDestructor (void);
/************** Show selector of degree types for statistics *****************/ /************** Show selector of degree types for statistics *****************/
/*****************************************************************************/ /*****************************************************************************/
void DT_WriteSelectorDegreeTypes (void) void DT_WriteSelectorDegreeTypes (long SelectedDegTypCod)
{ {
extern const char *Txt_Any_type_of_degree; extern const char *Txt_Any_type_of_degree;
unsigned NumDegTyp; unsigned NumDegTyp;
@ -116,13 +116,13 @@ void DT_WriteSelectorDegreeTypes (void)
HTM_SELECT_Begin (true, HTM_SELECT_Begin (true,
"id=\"OthDegTypCod\" name=\"OthDegTypCod\""); "id=\"OthDegTypCod\" name=\"OthDegTypCod\"");
HTM_OPTION (HTM_Type_STRING,"-1", HTM_OPTION (HTM_Type_STRING,"-1",
Gbl.Stat.DegTypCod == -1L,false, SelectedDegTypCod == -1L,false,
"%s",Txt_Any_type_of_degree); "%s",Txt_Any_type_of_degree);
for (NumDegTyp = 0; for (NumDegTyp = 0;
NumDegTyp < Gbl.DegTypes.Num; NumDegTyp < Gbl.DegTypes.Num;
NumDegTyp++) NumDegTyp++)
HTM_OPTION (HTM_Type_LONG,&Gbl.DegTypes.Lst[NumDegTyp].DegTypCod, HTM_OPTION (HTM_Type_LONG,&Gbl.DegTypes.Lst[NumDegTyp].DegTypCod,
Gbl.DegTypes.Lst[NumDegTyp].DegTypCod == Gbl.Stat.DegTypCod,false, Gbl.DegTypes.Lst[NumDegTyp].DegTypCod == SelectedDegTypCod,false,
"%s",Gbl.DegTypes.Lst[NumDegTyp].DegTypName); "%s",Gbl.DegTypes.Lst[NumDegTyp].DegTypName);
HTM_SELECT_End (); HTM_SELECT_End ();

View File

@ -58,7 +58,7 @@ typedef enum
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
void DT_WriteSelectorDegreeTypes (void); void DT_WriteSelectorDegreeTypes (long SelectedDegTypCod);
void DT_SeeDegreeTypesInDegTab (void); void DT_SeeDegreeTypesInDegTab (void);
void DT_SeeDegreeTypesInStaTab (void); void DT_SeeDegreeTypesInStaTab (void);

View File

@ -300,13 +300,6 @@ void Gbl_InitializeGlobals (void)
Gbl.Usrs.ClassPhoto.AllGroups = true; Gbl.Usrs.ClassPhoto.AllGroups = true;
Gbl.Usrs.ClassPhoto.Cols = Usr_CLASS_PHOTO_COLS_DEF; Gbl.Usrs.ClassPhoto.Cols = Usr_CLASS_PHOTO_COLS_DEF;
/* Statistics */
Gbl.Stat.ClicksGroupedBy = Sta_CLICKS_GROUPED_BY_DEFAULT;
Gbl.Stat.CountType = Sta_COUNT_TYPE_DEFAULT;
Gbl.Stat.Role = Sta_ROLE_DEFAULT;
Gbl.Stat.NumAction = Sta_NUM_ACTION_DEFAULT;
Gbl.Stat.RowsPerPage = Sta_DEF_ROWS_PER_PAGE;
Gbl.Scope.Current = Hie_CRS; Gbl.Scope.Current = Hie_CRS;
Gbl.Usrs.Connected.TimeToRefreshInMs = Con_MAX_TIME_TO_REFRESH_CONNECTED_IN_MS; Gbl.Usrs.Connected.TimeToRefreshInMs = Con_MAX_TIME_TO_REFRESH_CONNECTED_IN_MS;

View File

@ -486,7 +486,6 @@ struct Globals
struct DateTime DateEnd; // TODO: Remove in future versions struct DateTime DateEnd; // TODO: Remove in future versions
time_t TimeUTC[Dat_NUM_START_END_TIME]; time_t TimeUTC[Dat_NUM_START_END_TIME];
} DateRange; } DateRange;
struct Sta_Stats Stat;
/* Cache */ /* Cache */
struct struct

View File

@ -59,6 +59,8 @@ typedef enum
Ind_INDICATORS_FULL, Ind_INDICATORS_FULL,
} Ind_IndicatorsLayout_t; } Ind_IndicatorsLayout_t;
struct Ind_Indicators Indicators;
/*****************************************************************************/ /*****************************************************************************/
/***************************** Private prototypes ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -68,7 +70,7 @@ static void Ind_GetParamNumIndicators (void);
static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res); static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res);
static bool Ind_GetIfShowBigList (unsigned NumCrss); static bool Ind_GetIfShowBigList (unsigned NumCrss);
static void Ind_PutButtonToConfirmIWantToSeeBigList (unsigned NumCrss); static void Ind_PutButtonToConfirmIWantToSeeBigList (unsigned NumCrss);
static void Ind_PutParamsConfirmIWantToSeeBigList (void *Stats); static void Ind_PutParamsConfirmIWantToSeeBigList (void *Indicators);
static void Ind_GetNumCoursesWithIndicators (unsigned NumCrssWithIndicatorYes[1 + Ind_NUM_INDICATORS], static void Ind_GetNumCoursesWithIndicators (unsigned NumCrssWithIndicatorYes[1 + Ind_NUM_INDICATORS],
unsigned NumCrss,MYSQL_RES *mysql_res); unsigned NumCrss,MYSQL_RES *mysql_res);
@ -139,7 +141,7 @@ void Ind_ReqIndicatorsCourses (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"DAT LT\""); HTM_TD_Begin ("class=\"DAT LT\"");
DT_WriteSelectorDegreeTypes (); DT_WriteSelectorDegreeTypes (Indicators.DegTypCod);
HTM_Txt (" ("); HTM_Txt (" (");
HTM_TxtF (Txt_only_if_the_scope_is_X,Cfg_PLATFORM_SHORT_NAME); HTM_TxtF (Txt_only_if_the_scope_is_X,Cfg_PLATFORM_SHORT_NAME);
HTM_Txt (")"); HTM_Txt (")");
@ -156,7 +158,7 @@ void Ind_ReqIndicatorsCourses (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
Dpt_WriteSelectorDepartment (Gbl.Hierarchy.Ins.InsCod, // Departments in current insitution Dpt_WriteSelectorDepartment (Gbl.Hierarchy.Ins.InsCod, // Departments in current insitution
Gbl.Stat.DptCod, // Selected department Indicators.DptCod, // Selected department
"INDICATORS_INPUT", // Selector class "INDICATORS_INPUT", // Selector class
-1L, // First option -1L, // First option
Txt_Any_department, // Text when no department selected Txt_Any_department, // Text when no department selected
@ -167,9 +169,9 @@ void Ind_ReqIndicatorsCourses (void)
/***** Get courses from database *****/ /***** Get courses from database *****/
/* The result will contain courses with any number of indicators /* The result will contain courses with any number of indicators
If Gbl.Stat.NumIndicators < 0 ==> all courses in result will be listed If Indicators.NumIndicators < 0 ==> all courses in result will be listed
If Gbl.Stat.NumIndicators >= 0 ==> only those courses in result If Indicators.NumIndicators >= 0 ==> only those courses in result
with Gbl.Stat.NumIndicators set to yes with Indicators.NumIndicators set to yes
will be listed */ will be listed */
NumCrss = Ind_GetTableOfCourses (&mysql_res); NumCrss = Ind_GetTableOfCourses (&mysql_res);
@ -197,7 +199,7 @@ void Ind_ReqIndicatorsCourses (void)
for (Ind = 0, NumCrssToList = 0; for (Ind = 0, NumCrssToList = 0;
Ind <= Ind_NUM_INDICATORS; Ind <= Ind_NUM_INDICATORS;
Ind++) Ind++)
if (Gbl.Stat.IndicatorsSelected[Ind]) if (Indicators.IndicatorsSelected[Ind])
NumCrssToList += NumCrssWithIndicatorYes[Ind]; NumCrssToList += NumCrssWithIndicatorYes[Ind];
if (Ind_GetIfShowBigList (NumCrssToList)) if (Ind_GetIfShowBigList (NumCrssToList))
{ {
@ -207,10 +209,10 @@ void Ind_ReqIndicatorsCourses (void)
/* Button to show more details */ /* Button to show more details */
Frm_StartForm (ActSeeAllStaCrs); Frm_StartForm (ActSeeAllStaCrs);
Sco_PutParamScope ("ScopeInd",Gbl.Scope.Current); Sco_PutParamScope ("ScopeInd",Gbl.Scope.Current);
Par_PutHiddenParamLong (NULL,"OthDegTypCod",Gbl.Stat.DegTypCod); Par_PutHiddenParamLong (NULL,"OthDegTypCod",Indicators.DegTypCod);
Par_PutHiddenParamLong (NULL,Dpt_PARAM_DPT_COD_NAME,Gbl.Stat.DptCod); Par_PutHiddenParamLong (NULL,Dpt_PARAM_DPT_COD_NAME,Indicators.DptCod);
if (Gbl.Stat.StrIndicatorsSelected[0]) if (Indicators.StrIndicatorsSelected[0])
Par_PutHiddenParamString (NULL,"Indicators",Gbl.Stat.StrIndicatorsSelected); Par_PutHiddenParamString (NULL,"Indicators",Indicators.StrIndicatorsSelected);
Btn_PutConfirmButton (Txt_Show_more_details); Btn_PutConfirmButton (Txt_Show_more_details);
Frm_EndForm (); Frm_EndForm ();
} }
@ -239,12 +241,12 @@ static void Ind_GetParamsIndicators (void)
Sco_GetScope ("ScopeInd"); Sco_GetScope ("ScopeInd");
/***** Get degree type code *****/ /***** Get degree type code *****/
Gbl.Stat.DegTypCod = (Gbl.Scope.Current == Hie_SYS) ? Indicators.DegTypCod = (Gbl.Scope.Current == Hie_SYS) ?
DT_GetAndCheckParamOtherDegTypCod (-1L) : // -1L (any degree type) is allowed here DT_GetAndCheckParamOtherDegTypCod (-1L) : // -1L (any degree type) is allowed here
-1L; -1L;
/***** Get department code *****/ /***** Get department code *****/
Gbl.Stat.DptCod = Dpt_GetAndCheckParamDptCod (-1L); // -1L (any department) is allowed here Indicators.DptCod = Dpt_GetAndCheckParamDptCod (-1L); // -1L (any department) is allowed here
/***** Get number of indicators *****/ /***** Get number of indicators *****/
Ind_GetParamNumIndicators (); Ind_GetParamNumIndicators ();
@ -291,19 +293,19 @@ static void Ind_GetParamNumIndicators (void)
long Indicator; long Indicator;
/***** Get parameter multiple with list of indicators selected *****/ /***** Get parameter multiple with list of indicators selected *****/
Par_GetParMultiToText ("Indicators",Gbl.Stat.StrIndicatorsSelected,Ind_MAX_SIZE_INDICATORS_SELECTED); Par_GetParMultiToText ("Indicators",Indicators.StrIndicatorsSelected,Ind_MAX_SIZE_INDICATORS_SELECTED);
/***** Set which indicators have been selected (checkboxes on) *****/ /***** Set which indicators have been selected (checkboxes on) *****/
if (Gbl.Stat.StrIndicatorsSelected[0]) if (Indicators.StrIndicatorsSelected[0])
{ {
/* Reset all indicators */ /* Reset all indicators */
for (Ind = 0; for (Ind = 0;
Ind <= Ind_NUM_INDICATORS; Ind <= Ind_NUM_INDICATORS;
Ind++) Ind++)
Gbl.Stat.IndicatorsSelected[Ind] = false; Indicators.IndicatorsSelected[Ind] = false;
/* Set indicators selected */ /* Set indicators selected */
for (Ptr = Gbl.Stat.StrIndicatorsSelected; for (Ptr = Indicators.StrIndicatorsSelected;
*Ptr; *Ptr;
) )
{ {
@ -316,7 +318,7 @@ static void Ind_GetParamNumIndicators (void)
Ind <= Ind_NUM_INDICATORS; Ind <= Ind_NUM_INDICATORS;
Ind++) Ind++)
if ((long) Ind == Indicator) if ((long) Ind == Indicator)
Gbl.Stat.IndicatorsSelected[Ind] = true; Indicators.IndicatorsSelected[Ind] = true;
} }
} }
else else
@ -324,7 +326,7 @@ static void Ind_GetParamNumIndicators (void)
for (Ind = 0; for (Ind = 0;
Ind <= Ind_NUM_INDICATORS; Ind <= Ind_NUM_INDICATORS;
Ind++) Ind++)
Gbl.Stat.IndicatorsSelected[Ind] = true; Indicators.IndicatorsSelected[Ind] = true;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -339,9 +341,9 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
switch (Gbl.Scope.Current) switch (Gbl.Scope.Current)
{ {
case Hie_SYS: case Hie_SYS:
if (Gbl.Stat.DptCod >= 0) // 0 means another department if (Indicators.DptCod >= 0) // 0 means another department
{ {
if (Gbl.Stat.DegTypCod > 0) if (Indicators.DegTypCod > 0)
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
"SELECT DISTINCTROW degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod" "SELECT DISTINCTROW degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod"
@ -353,9 +355,9 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
" AND crs_usr.UsrCod=usr_data.UsrCod" " AND crs_usr.UsrCod=usr_data.UsrCod"
" AND usr_data.DptCod=%ld" " AND usr_data.DptCod=%ld"
" ORDER BY degrees.FullName,courses.FullName", " ORDER BY degrees.FullName,courses.FullName",
Gbl.Stat.DegTypCod, Indicators.DegTypCod,
(unsigned) Rol_TCH, (unsigned) Rol_TCH,
Gbl.Stat.DptCod); Indicators.DptCod);
else else
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
@ -368,11 +370,11 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
" AND usr_data.DptCod=%ld" " AND usr_data.DptCod=%ld"
" ORDER BY degrees.FullName,courses.FullName", " ORDER BY degrees.FullName,courses.FullName",
(unsigned) Rol_TCH, (unsigned) Rol_TCH,
Gbl.Stat.DptCod); Indicators.DptCod);
} }
else else
{ {
if (Gbl.Stat.DegTypCod > 0) if (Indicators.DegTypCod > 0)
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
"SELECT degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod" "SELECT degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod"
@ -380,7 +382,7 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
" WHERE degrees.DegTypCod=%ld" " WHERE degrees.DegTypCod=%ld"
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" ORDER BY degrees.FullName,courses.FullName", " ORDER BY degrees.FullName,courses.FullName",
Gbl.Stat.DegTypCod); Indicators.DegTypCod);
else else
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
@ -391,7 +393,7 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
} }
break; break;
case Hie_CTY: case Hie_CTY:
if (Gbl.Stat.DptCod >= 0) // 0 means another department if (Indicators.DptCod >= 0) // 0 means another department
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
"SELECT DISTINCTROW degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod" "SELECT DISTINCTROW degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod"
@ -407,7 +409,7 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
" ORDER BY degrees.FullName,courses.FullName", " ORDER BY degrees.FullName,courses.FullName",
Gbl.Hierarchy.Cty.CtyCod, Gbl.Hierarchy.Cty.CtyCod,
(unsigned) Rol_TCH, (unsigned) Rol_TCH,
Gbl.Stat.DptCod); Indicators.DptCod);
else else
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
@ -421,7 +423,7 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
Gbl.Hierarchy.Cty.CtyCod); Gbl.Hierarchy.Cty.CtyCod);
break; break;
case Hie_INS: case Hie_INS:
if (Gbl.Stat.DptCod >= 0) // 0 means another department if (Indicators.DptCod >= 0) // 0 means another department
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
"SELECT DISTINCTROW degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod" "SELECT DISTINCTROW degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod"
@ -436,7 +438,7 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
" ORDER BY degrees.FullName,courses.FullName", " ORDER BY degrees.FullName,courses.FullName",
Gbl.Hierarchy.Ins.InsCod, Gbl.Hierarchy.Ins.InsCod,
(unsigned) Rol_TCH, (unsigned) Rol_TCH,
Gbl.Stat.DptCod); Indicators.DptCod);
else else
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
@ -449,7 +451,7 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
Gbl.Hierarchy.Ins.InsCod); Gbl.Hierarchy.Ins.InsCod);
break; break;
case Hie_CTR: case Hie_CTR:
if (Gbl.Stat.DptCod >= 0) // 0 means another department if (Indicators.DptCod >= 0) // 0 means another department
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
"SELECT DISTINCTROW degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod" "SELECT DISTINCTROW degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod"
@ -463,7 +465,7 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
" ORDER BY degrees.FullName,courses.FullName", " ORDER BY degrees.FullName,courses.FullName",
Gbl.Hierarchy.Ctr.CtrCod, Gbl.Hierarchy.Ctr.CtrCod,
(unsigned) Rol_TCH, (unsigned) Rol_TCH,
Gbl.Stat.DptCod); Indicators.DptCod);
else else
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
@ -475,7 +477,7 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
Gbl.Hierarchy.Ctr.CtrCod); Gbl.Hierarchy.Ctr.CtrCod);
break; break;
case Hie_DEG: case Hie_DEG:
if (Gbl.Stat.DptCod >= 0) // 0 means another department if (Indicators.DptCod >= 0) // 0 means another department
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
"SELECT DISTINCTROW degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod" "SELECT DISTINCTROW degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod"
@ -489,7 +491,7 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
" ORDER BY degrees.FullName,courses.FullName", " ORDER BY degrees.FullName,courses.FullName",
Gbl.Hierarchy.Deg.DegCod, Gbl.Hierarchy.Deg.DegCod,
(unsigned) Rol_TCH, (unsigned) Rol_TCH,
Gbl.Stat.DptCod); Indicators.DptCod);
else else
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
@ -501,7 +503,7 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
Gbl.Hierarchy.Deg.DegCod); Gbl.Hierarchy.Deg.DegCod);
break; break;
case Hie_CRS: case Hie_CRS:
if (Gbl.Stat.DptCod >= 0) // 0 means another department if (Indicators.DptCod >= 0) // 0 means another department
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
"SELECT DISTINCTROW degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod" "SELECT DISTINCTROW degrees.FullName,courses.FullName,courses.CrsCod,courses.InsCrsCod"
@ -517,7 +519,7 @@ static unsigned Ind_GetTableOfCourses (MYSQL_RES **mysql_res)
Gbl.Hierarchy.Crs.CrsCod, Gbl.Hierarchy.Crs.CrsCod,
Gbl.Hierarchy.Crs.CrsCod, Gbl.Hierarchy.Crs.CrsCod,
(unsigned) Rol_TCH, (unsigned) Rol_TCH,
Gbl.Stat.DptCod); Indicators.DptCod);
else else
NumCrss = NumCrss =
(unsigned) DB_QuerySELECT (mysql_res,"can not get courses", (unsigned) DB_QuerySELECT (mysql_res,"can not get courses",
@ -566,21 +568,21 @@ static void Ind_PutButtonToConfirmIWantToSeeBigList (unsigned NumCrss)
/***** Show alert and button to confirm that I want to see the big list *****/ /***** Show alert and button to confirm that I want to see the big list *****/
Ale_ShowAlertAndButton (Gbl.Action.Act,NULL,NULL, Ale_ShowAlertAndButton (Gbl.Action.Act,NULL,NULL,
Ind_PutParamsConfirmIWantToSeeBigList,&Gbl.Stat, Ind_PutParamsConfirmIWantToSeeBigList,&Indicators,
Btn_CONFIRM_BUTTON,Txt_Show_anyway, Btn_CONFIRM_BUTTON,Txt_Show_anyway,
Ale_WARNING,Txt_The_list_of_X_courses_is_too_large_to_be_displayed, Ale_WARNING,Txt_The_list_of_X_courses_is_too_large_to_be_displayed,
NumCrss); NumCrss);
} }
static void Ind_PutParamsConfirmIWantToSeeBigList (void *Stats) static void Ind_PutParamsConfirmIWantToSeeBigList (void *Indicators)
{ {
if (Stats) if (Indicators)
{ {
Sco_PutParamScope ("ScopeInd",Gbl.Scope.Current); Sco_PutParamScope ("ScopeInd",Gbl.Scope.Current);
Par_PutHiddenParamLong (NULL,"OthDegTypCod",((struct Sta_Stats *) Stats)->DegTypCod); Par_PutHiddenParamLong (NULL,"OthDegTypCod",((struct Ind_Indicators *) Indicators)->DegTypCod);
Par_PutHiddenParamLong (NULL,Dpt_PARAM_DPT_COD_NAME,((struct Sta_Stats *) Stats)->DptCod); Par_PutHiddenParamLong (NULL,Dpt_PARAM_DPT_COD_NAME,((struct Ind_Indicators *) Indicators)->DptCod);
if (((struct Sta_Stats *) Stats)->StrIndicatorsSelected[0]) if (((struct Ind_Indicators *) Indicators)->StrIndicatorsSelected[0])
Par_PutHiddenParamString (NULL,"Indicators",((struct Sta_Stats *) Stats)->StrIndicatorsSelected); Par_PutHiddenParamString (NULL,"Indicators",((struct Ind_Indicators *) Indicators)->StrIndicatorsSelected);
Par_PutHiddenParamChar ("ShowBigList",'Y'); Par_PutHiddenParamChar ("ShowBigList",'Y');
} }
} }
@ -653,7 +655,7 @@ static void Ind_ShowNumCoursesWithIndicators (unsigned NumCrssWithIndicatorYes[1
Ind <= Ind_NUM_INDICATORS; Ind <= Ind_NUM_INDICATORS;
Ind++) Ind++)
{ {
Class = Gbl.Stat.IndicatorsSelected[Ind] ? ClassHighlight : Class = Indicators.IndicatorsSelected[Ind] ? ClassHighlight :
ClassNormal; ClassNormal;
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
@ -663,7 +665,7 @@ static void Ind_ShowNumCoursesWithIndicators (unsigned NumCrssWithIndicatorYes[1
HTM_INPUT_CHECKBOX ("Indicators",HTM_SUBMIT_ON_CHANGE, HTM_INPUT_CHECKBOX ("Indicators",HTM_SUBMIT_ON_CHANGE,
"id=\"Indicators%u\" value=\"%u\"%s", "id=\"Indicators%u\" value=\"%u\"%s",
Ind,Ind, Ind,Ind,
Gbl.Stat.IndicatorsSelected[Ind] ? " checked=\"checked\"" : ""); Indicators.IndicatorsSelected[Ind] ? " checked=\"checked\"" : "");
HTM_TD_End (); HTM_TD_End ();
} }
@ -748,7 +750,7 @@ static void Ind_ShowTableOfCoursesWithIndicators (Ind_IndicatorsLayout_t Indicat
unsigned NumTchs; unsigned NumTchs;
unsigned NumStds; unsigned NumStds;
unsigned NumIndicators; unsigned NumIndicators;
struct Ind_IndicatorsCrs Indicators; struct Ind_IndicatorsCrs IndicatorsCrs;
long ActCod; long ActCod;
/***** Begin table *****/ /***** Begin table *****/
@ -883,13 +885,13 @@ static void Ind_ShowTableOfCoursesWithIndicators (Ind_IndicatorsLayout_t Indicat
/* Get stored number of indicators of this course */ /* Get stored number of indicators of this course */
NumIndicators = Ind_GetAndUpdateNumIndicatorsCrs (CrsCod); NumIndicators = Ind_GetAndUpdateNumIndicatorsCrs (CrsCod);
if (Gbl.Stat.IndicatorsSelected[NumIndicators]) if (Indicators.IndicatorsSelected[NumIndicators])
{ {
/* Compute and store indicators */ /* Compute and store indicators */
Ind_ComputeAndStoreIndicatorsCrs (CrsCod,(int) NumIndicators,&Indicators); Ind_ComputeAndStoreIndicatorsCrs (CrsCod,(int) NumIndicators,&IndicatorsCrs);
/* The number of indicators may have changed */ /* The number of indicators may have changed */
if (Gbl.Stat.IndicatorsSelected[Indicators.NumIndicators]) if (Indicators.IndicatorsSelected[IndicatorsCrs.NumIndicators])
{ {
ActCod = Act_GetActCod (ActReqStaCrs); ActCod = Act_GetActCod (ActReqStaCrs);
@ -900,25 +902,25 @@ static void Ind_ShowTableOfCoursesWithIndicators (Ind_IndicatorsLayout_t Indicat
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"%s LM COLOR%u\"", HTM_TD_Begin ("class=\"%s LM COLOR%u\"",
Indicators.CourseAllOK ? "DAT_SMALL_GREEN" : IndicatorsCrs.CourseAllOK ? "DAT_SMALL_GREEN" :
(Indicators.CoursePartiallyOK ? "DAT_SMALL" : (IndicatorsCrs.CoursePartiallyOK ? "DAT_SMALL" :
"DAT_SMALL_RED"), "DAT_SMALL_RED"),
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Txt (row[0]); HTM_Txt (row[0]);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LM COLOR%u\"", HTM_TD_Begin ("class=\"%s LM COLOR%u\"",
Indicators.CourseAllOK ? "DAT_SMALL_GREEN" : IndicatorsCrs.CourseAllOK ? "DAT_SMALL_GREEN" :
(Indicators.CoursePartiallyOK ? "DAT_SMALL" : (IndicatorsCrs.CoursePartiallyOK ? "DAT_SMALL" :
"DAT_SMALL_RED"), "DAT_SMALL_RED"),
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Txt (row[1]); HTM_Txt (row[1]);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LM COLOR%u\"", HTM_TD_Begin ("class=\"%s LM COLOR%u\"",
Indicators.CourseAllOK ? "DAT_SMALL_GREEN" : IndicatorsCrs.CourseAllOK ? "DAT_SMALL_GREEN" :
(Indicators.CoursePartiallyOK ? "DAT_SMALL" : (IndicatorsCrs.CoursePartiallyOK ? "DAT_SMALL" :
"DAT_SMALL_RED"), "DAT_SMALL_RED"),
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Txt (row[3]); HTM_Txt (row[3]);
HTM_TD_End (); HTM_TD_End ();
@ -932,70 +934,70 @@ static void Ind_ShowTableOfCoursesWithIndicators (Ind_IndicatorsLayout_t Indicat
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"", HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
Indicators.CourseAllOK ? "DAT_SMALL_GREEN" : IndicatorsCrs.CourseAllOK ? "DAT_SMALL_GREEN" :
(Indicators.CoursePartiallyOK ? "DAT_SMALL" : (IndicatorsCrs.CoursePartiallyOK ? "DAT_SMALL" :
"DAT_SMALL_RED"), "DAT_SMALL_RED"),
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Unsigned (Indicators.NumIndicators); HTM_Unsigned (IndicatorsCrs.NumIndicators);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (Indicators.ThereIsSyllabus) if (IndicatorsCrs.ThereIsSyllabus)
HTM_Txt (Txt_YES); HTM_Txt (Txt_YES);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (!Indicators.ThereIsSyllabus) if (!IndicatorsCrs.ThereIsSyllabus)
HTM_Txt (Txt_NO); HTM_Txt (Txt_NO);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (Indicators.ThereAreAssignments) if (IndicatorsCrs.ThereAreAssignments)
HTM_Txt (Txt_YES); HTM_Txt (Txt_YES);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (!Indicators.ThereAreAssignments) if (!IndicatorsCrs.ThereAreAssignments)
HTM_Txt (Txt_NO); HTM_Txt (Txt_NO);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (Indicators.ThereIsOnlineTutoring) if (IndicatorsCrs.ThereIsOnlineTutoring)
HTM_Txt (Txt_YES); HTM_Txt (Txt_YES);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (!Indicators.ThereIsOnlineTutoring) if (!IndicatorsCrs.ThereIsOnlineTutoring)
HTM_Txt (Txt_NO); HTM_Txt (Txt_NO);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (Indicators.ThereAreMaterials) if (IndicatorsCrs.ThereAreMaterials)
HTM_Txt (Txt_YES); HTM_Txt (Txt_YES);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (!Indicators.ThereAreMaterials) if (!IndicatorsCrs.ThereAreMaterials)
HTM_Txt (Txt_NO); HTM_Txt (Txt_NO);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (Indicators.ThereIsAssessment) if (IndicatorsCrs.ThereIsAssessment)
HTM_Txt (Txt_YES); HTM_Txt (Txt_YES);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (!Indicators.ThereIsAssessment) if (!IndicatorsCrs.ThereIsAssessment)
HTM_Txt (Txt_NO); HTM_Txt (Txt_NO);
HTM_TD_End (); HTM_TD_End ();
@ -1012,25 +1014,25 @@ static void Ind_ShowTableOfCoursesWithIndicators (Ind_IndicatorsLayout_t Indicat
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"%s LM COLOR%u\"", HTM_TD_Begin ("class=\"%s LM COLOR%u\"",
Indicators.CourseAllOK ? "DAT_SMALL_GREEN" : IndicatorsCrs.CourseAllOK ? "DAT_SMALL_GREEN" :
(Indicators.CoursePartiallyOK ? "DAT_SMALL" : (IndicatorsCrs.CoursePartiallyOK ? "DAT_SMALL" :
"DAT_SMALL_RED"), "DAT_SMALL_RED"),
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Txt (row[0]); HTM_Txt (row[0]);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LM COLOR%u\"", HTM_TD_Begin ("class=\"%s LM COLOR%u\"",
Indicators.CourseAllOK ? "DAT_SMALL_GREEN" : IndicatorsCrs.CourseAllOK ? "DAT_SMALL_GREEN" :
(Indicators.CoursePartiallyOK ? "DAT_SMALL" : (IndicatorsCrs.CoursePartiallyOK ? "DAT_SMALL" :
"DAT_SMALL_RED"), "DAT_SMALL_RED"),
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Txt (row[1]); HTM_Txt (row[1]);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LM COLOR%u\"", HTM_TD_Begin ("class=\"%s LM COLOR%u\"",
Indicators.CourseAllOK ? "DAT_SMALL_GREEN" : IndicatorsCrs.CourseAllOK ? "DAT_SMALL_GREEN" :
(Indicators.CoursePartiallyOK ? "DAT_SMALL" : (IndicatorsCrs.CoursePartiallyOK ? "DAT_SMALL" :
"DAT_SMALL_RED"), "DAT_SMALL_RED"),
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Txt (row[3]); HTM_Txt (row[3]);
HTM_TD_End (); HTM_TD_End ();
@ -1058,162 +1060,162 @@ static void Ind_ShowTableOfCoursesWithIndicators (Ind_IndicatorsLayout_t Indicat
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"", HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
Indicators.CourseAllOK ? "DAT_SMALL_GREEN" : IndicatorsCrs.CourseAllOK ? "DAT_SMALL_GREEN" :
(Indicators.CoursePartiallyOK ? "DAT_SMALL" : (IndicatorsCrs.CoursePartiallyOK ? "DAT_SMALL" :
"DAT_SMALL_RED"), "DAT_SMALL_RED"),
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Unsigned (Indicators.NumIndicators); HTM_Unsigned (IndicatorsCrs.NumIndicators);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (Indicators.ThereIsSyllabus) if (IndicatorsCrs.ThereIsSyllabus)
HTM_Txt (Txt_YES); HTM_Txt (Txt_YES);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (!Indicators.ThereIsSyllabus) if (!IndicatorsCrs.ThereIsSyllabus)
HTM_Txt (Txt_NO); HTM_Txt (Txt_NO);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LM COLOR%u\"", HTM_TD_Begin ("class=\"%s LM COLOR%u\"",
(Indicators.SyllabusLecSrc != Inf_INFO_SRC_NONE) ? "DAT_SMALL_GREEN" : (IndicatorsCrs.SyllabusLecSrc != Inf_INFO_SRC_NONE) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED", "DAT_SMALL_RED",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Txt (Txt_INFO_SRC_SHORT_TEXT[Indicators.SyllabusLecSrc]); HTM_Txt (Txt_INFO_SRC_SHORT_TEXT[IndicatorsCrs.SyllabusLecSrc]);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LM COLOR%u\"", HTM_TD_Begin ("class=\"%s LM COLOR%u\"",
(Indicators.SyllabusPraSrc != Inf_INFO_SRC_NONE) ? "DAT_SMALL_GREEN" : (IndicatorsCrs.SyllabusPraSrc != Inf_INFO_SRC_NONE) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED", "DAT_SMALL_RED",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Txt (Txt_INFO_SRC_SHORT_TEXT[Indicators.SyllabusPraSrc]); HTM_Txt (Txt_INFO_SRC_SHORT_TEXT[IndicatorsCrs.SyllabusPraSrc]);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LM COLOR%u\">", HTM_TD_Begin ("class=\"%s LM COLOR%u\">",
(Indicators.TeachingGuideSrc != Inf_INFO_SRC_NONE) ? "DAT_SMALL_GREEN" : (IndicatorsCrs.TeachingGuideSrc != Inf_INFO_SRC_NONE) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED", "DAT_SMALL_RED",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Txt (Txt_INFO_SRC_SHORT_TEXT[Indicators.TeachingGuideSrc]); HTM_Txt (Txt_INFO_SRC_SHORT_TEXT[IndicatorsCrs.TeachingGuideSrc]);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (Indicators.ThereAreAssignments) if (IndicatorsCrs.ThereAreAssignments)
HTM_Txt (Txt_YES); HTM_Txt (Txt_YES);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (!Indicators.ThereAreAssignments) if (!IndicatorsCrs.ThereAreAssignments)
HTM_Txt (Txt_NO); HTM_Txt (Txt_NO);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"", HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(Indicators.NumAssignments != 0) ? "DAT_SMALL_GREEN" : (IndicatorsCrs.NumAssignments != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED",
Gbl.RowEvenOdd);
HTM_Unsigned (Indicators.NumAssignments);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(Indicators.NumFilesAssignments != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED",
Gbl.RowEvenOdd);
HTM_UnsignedLong (Indicators.NumFilesAssignments);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(Indicators.NumFilesWorks != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED",
Gbl.RowEvenOdd);
HTM_UnsignedLong (Indicators.NumFilesWorks);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"",
Gbl.RowEvenOdd);
if (Indicators.ThereIsOnlineTutoring)
HTM_Txt (Txt_YES);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"",
Gbl.RowEvenOdd);
if (!Indicators.ThereIsOnlineTutoring)
HTM_Txt (Txt_NO);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(Indicators.NumThreads != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED",
Gbl.RowEvenOdd);
HTM_Unsigned (Indicators.NumThreads);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(Indicators.NumPosts != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED",
Gbl.RowEvenOdd);
HTM_Unsigned (Indicators.NumPosts);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(Indicators.NumMsgsSentByTchs != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED", "DAT_SMALL_RED",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Unsigned (Indicators.NumMsgsSentByTchs); HTM_Unsigned (IndicatorsCrs.NumAssignments);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(IndicatorsCrs.NumFilesAssignments != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED",
Gbl.RowEvenOdd);
HTM_UnsignedLong (IndicatorsCrs.NumFilesAssignments);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(IndicatorsCrs.NumFilesWorks != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED",
Gbl.RowEvenOdd);
HTM_UnsignedLong (IndicatorsCrs.NumFilesWorks);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (Indicators.ThereAreMaterials) if (IndicatorsCrs.ThereIsOnlineTutoring)
HTM_Txt (Txt_YES); HTM_Txt (Txt_YES);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (!Indicators.ThereAreMaterials) if (!IndicatorsCrs.ThereIsOnlineTutoring)
HTM_Txt (Txt_NO); HTM_Txt (Txt_NO);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"", HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(Indicators.NumFilesInDocumentZones != 0) ? "DAT_SMALL_GREEN" : (IndicatorsCrs.NumThreads != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED", "DAT_SMALL_RED",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_UnsignedLong (Indicators.NumFilesInDocumentZones); HTM_Unsigned (IndicatorsCrs.NumThreads);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"", HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(Indicators.NumFilesInSharedZones != 0) ? "DAT_SMALL_GREEN" : (IndicatorsCrs.NumPosts != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED", "DAT_SMALL_RED",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_UnsignedLong (Indicators.NumFilesInSharedZones); HTM_Unsigned (IndicatorsCrs.NumPosts);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(IndicatorsCrs.NumMsgsSentByTchs != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED",
Gbl.RowEvenOdd);
HTM_Unsigned (IndicatorsCrs.NumMsgsSentByTchs);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (Indicators.ThereIsAssessment) if (IndicatorsCrs.ThereAreMaterials)
HTM_Txt (Txt_YES); HTM_Txt (Txt_YES);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"", HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
if (!Indicators.ThereIsAssessment) if (!IndicatorsCrs.ThereAreMaterials)
HTM_Txt (Txt_NO);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(IndicatorsCrs.NumFilesInDocumentZones != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED",
Gbl.RowEvenOdd);
HTM_UnsignedLong (IndicatorsCrs.NumFilesInDocumentZones);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s RM COLOR%u\"",
(IndicatorsCrs.NumFilesInSharedZones != 0) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED",
Gbl.RowEvenOdd);
HTM_UnsignedLong (IndicatorsCrs.NumFilesInSharedZones);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_GREEN CM COLOR%u\"",
Gbl.RowEvenOdd);
if (IndicatorsCrs.ThereIsAssessment)
HTM_Txt (Txt_YES);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_SMALL_RED CM COLOR%u\"",
Gbl.RowEvenOdd);
if (!IndicatorsCrs.ThereIsAssessment)
HTM_Txt (Txt_NO); HTM_Txt (Txt_NO);
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LM COLOR%u\"", HTM_TD_Begin ("class=\"%s LM COLOR%u\"",
(Indicators.AssessmentSrc != Inf_INFO_SRC_NONE) ? "DAT_SMALL_GREEN" : (IndicatorsCrs.AssessmentSrc != Inf_INFO_SRC_NONE) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED",
Gbl.RowEvenOdd);
HTM_Txt (Txt_INFO_SRC_SHORT_TEXT[Indicators.AssessmentSrc]);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LM COLOR%u\"",
(Indicators.TeachingGuideSrc != Inf_INFO_SRC_NONE) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED", "DAT_SMALL_RED",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
HTM_Txt (Txt_INFO_SRC_SHORT_TEXT[Indicators.TeachingGuideSrc]); HTM_Txt (Txt_INFO_SRC_SHORT_TEXT[IndicatorsCrs.AssessmentSrc]);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LM COLOR%u\"",
(IndicatorsCrs.TeachingGuideSrc != Inf_INFO_SRC_NONE) ? "DAT_SMALL_GREEN" :
"DAT_SMALL_RED",
Gbl.RowEvenOdd);
HTM_Txt (Txt_INFO_SRC_SHORT_TEXT[IndicatorsCrs.TeachingGuideSrc]);
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -1235,7 +1237,7 @@ static void Ind_ShowTableOfCoursesWithIndicators (Ind_IndicatorsLayout_t Indicat
static unsigned Ind_GetAndUpdateNumIndicatorsCrs (long CrsCod) static unsigned Ind_GetAndUpdateNumIndicatorsCrs (long CrsCod)
{ {
unsigned NumIndicators; unsigned NumIndicators;
struct Ind_IndicatorsCrs Indicators; struct Ind_IndicatorsCrs IndicatorsCrs;
int NumIndicatorsFromDB = Ind_GetNumIndicatorsCrsFromDB (CrsCod); int NumIndicatorsFromDB = Ind_GetNumIndicatorsCrsFromDB (CrsCod);
/***** If number of indicators is not already computed ==> compute it! *****/ /***** If number of indicators is not already computed ==> compute it! *****/
@ -1244,8 +1246,8 @@ static unsigned Ind_GetAndUpdateNumIndicatorsCrs (long CrsCod)
else // Number of indicators is not already computed else // Number of indicators is not already computed
{ {
/***** Compute and store number of indicators *****/ /***** Compute and store number of indicators *****/
Ind_ComputeAndStoreIndicatorsCrs (CrsCod,NumIndicatorsFromDB,&Indicators); Ind_ComputeAndStoreIndicatorsCrs (CrsCod,NumIndicatorsFromDB,&IndicatorsCrs);
NumIndicators = Indicators.NumIndicators; NumIndicators = IndicatorsCrs.NumIndicators;
} }
return NumIndicators; return NumIndicators;
} }
@ -1302,67 +1304,67 @@ static void Ind_StoreIndicatorsCrsIntoDB (long CrsCod,unsigned NumIndicators)
==> update it into database */ ==> update it into database */
void Ind_ComputeAndStoreIndicatorsCrs (long CrsCod,int NumIndicatorsFromDB, void Ind_ComputeAndStoreIndicatorsCrs (long CrsCod,int NumIndicatorsFromDB,
struct Ind_IndicatorsCrs *Indicators) struct Ind_IndicatorsCrs *IndicatorsCrs)
{ {
/***** Initialize number of indicators *****/ /***** Initialize number of indicators *****/
Indicators->NumIndicators = 0; IndicatorsCrs->NumIndicators = 0;
/***** Get whether download zones are empty or not *****/ /***** Get whether download zones are empty or not *****/
Indicators->NumFilesInDocumentZones = Ind_GetNumFilesInDocumZonesOfCrsFromDB (CrsCod); IndicatorsCrs->NumFilesInDocumentZones = Ind_GetNumFilesInDocumZonesOfCrsFromDB (CrsCod);
Indicators->NumFilesInSharedZones = Ind_GetNumFilesInShareZonesOfCrsFromDB (CrsCod); IndicatorsCrs->NumFilesInSharedZones = Ind_GetNumFilesInShareZonesOfCrsFromDB (CrsCod);
/***** Indicator #1: information about syllabus *****/ /***** Indicator #1: information about syllabus *****/
Indicators->SyllabusLecSrc = Inf_GetInfoSrcFromDB (CrsCod,Inf_LECTURES); IndicatorsCrs->SyllabusLecSrc = Inf_GetInfoSrcFromDB (CrsCod,Inf_LECTURES);
Indicators->SyllabusPraSrc = Inf_GetInfoSrcFromDB (CrsCod,Inf_PRACTICALS); IndicatorsCrs->SyllabusPraSrc = Inf_GetInfoSrcFromDB (CrsCod,Inf_PRACTICALS);
Indicators->TeachingGuideSrc = Inf_GetInfoSrcFromDB (CrsCod,Inf_TEACHING_GUIDE); IndicatorsCrs->TeachingGuideSrc = Inf_GetInfoSrcFromDB (CrsCod,Inf_TEACHING_GUIDE);
Indicators->ThereIsSyllabus = (Indicators->SyllabusLecSrc != Inf_INFO_SRC_NONE) || IndicatorsCrs->ThereIsSyllabus = (IndicatorsCrs->SyllabusLecSrc != Inf_INFO_SRC_NONE) ||
(Indicators->SyllabusPraSrc != Inf_INFO_SRC_NONE) || (IndicatorsCrs->SyllabusPraSrc != Inf_INFO_SRC_NONE) ||
(Indicators->TeachingGuideSrc != Inf_INFO_SRC_NONE); (IndicatorsCrs->TeachingGuideSrc != Inf_INFO_SRC_NONE);
if (Indicators->ThereIsSyllabus) if (IndicatorsCrs->ThereIsSyllabus)
Indicators->NumIndicators++; IndicatorsCrs->NumIndicators++;
/***** Indicator #2: information about assignments *****/ /***** Indicator #2: information about assignments *****/
Indicators->NumAssignments = Asg_GetNumAssignmentsInCrs (CrsCod); IndicatorsCrs->NumAssignments = Asg_GetNumAssignmentsInCrs (CrsCod);
Indicators->NumFilesAssignments = Ind_GetNumFilesInAssigZonesOfCrsFromDB (CrsCod); IndicatorsCrs->NumFilesAssignments = Ind_GetNumFilesInAssigZonesOfCrsFromDB (CrsCod);
Indicators->NumFilesWorks = Ind_GetNumFilesInWorksZonesOfCrsFromDB (CrsCod); IndicatorsCrs->NumFilesWorks = Ind_GetNumFilesInWorksZonesOfCrsFromDB (CrsCod);
Indicators->ThereAreAssignments = (Indicators->NumAssignments != 0) || IndicatorsCrs->ThereAreAssignments = (IndicatorsCrs->NumAssignments != 0) ||
(Indicators->NumFilesAssignments != 0) || (IndicatorsCrs->NumFilesAssignments != 0) ||
(Indicators->NumFilesWorks != 0); (IndicatorsCrs->NumFilesWorks != 0);
if (Indicators->ThereAreAssignments) if (IndicatorsCrs->ThereAreAssignments)
Indicators->NumIndicators++; IndicatorsCrs->NumIndicators++;
/***** Indicator #3: information about online tutoring *****/ /***** Indicator #3: information about online tutoring *****/
Indicators->NumThreads = For_GetNumTotalThrsInForumsOfType (For_FORUM_COURSE_USRS,-1L,-1L,-1L,-1L,CrsCod); IndicatorsCrs->NumThreads = For_GetNumTotalThrsInForumsOfType (For_FORUM_COURSE_USRS,-1L,-1L,-1L,-1L,CrsCod);
Indicators->NumPosts = For_GetNumTotalPstsInForumsOfType (For_FORUM_COURSE_USRS,-1L,-1L,-1L,-1L,CrsCod,&(Indicators->NumUsrsToBeNotifiedByEMail)); IndicatorsCrs->NumPosts = For_GetNumTotalPstsInForumsOfType (For_FORUM_COURSE_USRS,-1L,-1L,-1L,-1L,CrsCod,&(IndicatorsCrs->NumUsrsToBeNotifiedByEMail));
Indicators->NumMsgsSentByTchs = Msg_GetNumMsgsSentByTchsCrs (CrsCod); IndicatorsCrs->NumMsgsSentByTchs = Msg_GetNumMsgsSentByTchsCrs (CrsCod);
Indicators->ThereIsOnlineTutoring = (Indicators->NumThreads != 0) || IndicatorsCrs->ThereIsOnlineTutoring = (IndicatorsCrs->NumThreads != 0) ||
(Indicators->NumPosts != 0) || (IndicatorsCrs->NumPosts != 0) ||
(Indicators->NumMsgsSentByTchs != 0); (IndicatorsCrs->NumMsgsSentByTchs != 0);
if (Indicators->ThereIsOnlineTutoring) if (IndicatorsCrs->ThereIsOnlineTutoring)
Indicators->NumIndicators++; IndicatorsCrs->NumIndicators++;
/***** Indicator #4: information about materials *****/ /***** Indicator #4: information about materials *****/
Indicators->ThereAreMaterials = (Indicators->NumFilesInDocumentZones != 0) || IndicatorsCrs->ThereAreMaterials = (IndicatorsCrs->NumFilesInDocumentZones != 0) ||
(Indicators->NumFilesInSharedZones != 0); (IndicatorsCrs->NumFilesInSharedZones != 0);
if (Indicators->ThereAreMaterials) if (IndicatorsCrs->ThereAreMaterials)
Indicators->NumIndicators++; IndicatorsCrs->NumIndicators++;
/***** Indicator #5: information about assessment *****/ /***** Indicator #5: information about assessment *****/
Indicators->AssessmentSrc = Inf_GetInfoSrcFromDB (CrsCod,Inf_ASSESSMENT); IndicatorsCrs->AssessmentSrc = Inf_GetInfoSrcFromDB (CrsCod,Inf_ASSESSMENT);
Indicators->ThereIsAssessment = (Indicators->AssessmentSrc != Inf_INFO_SRC_NONE) || IndicatorsCrs->ThereIsAssessment = (IndicatorsCrs->AssessmentSrc != Inf_INFO_SRC_NONE) ||
(Indicators->TeachingGuideSrc != Inf_INFO_SRC_NONE); (IndicatorsCrs->TeachingGuideSrc != Inf_INFO_SRC_NONE);
if (Indicators->ThereIsAssessment) if (IndicatorsCrs->ThereIsAssessment)
Indicators->NumIndicators++; IndicatorsCrs->NumIndicators++;
/***** All the indicators are OK? *****/ /***** All the indicators are OK? *****/
Indicators->CoursePartiallyOK = Indicators->NumIndicators >= 1 && IndicatorsCrs->CoursePartiallyOK = IndicatorsCrs->NumIndicators >= 1 &&
Indicators->NumIndicators < Ind_NUM_INDICATORS; IndicatorsCrs->NumIndicators < Ind_NUM_INDICATORS;
Indicators->CourseAllOK = Indicators->NumIndicators == Ind_NUM_INDICATORS; IndicatorsCrs->CourseAllOK = IndicatorsCrs->NumIndicators == Ind_NUM_INDICATORS;
/***** Update number of indicators into database /***** Update number of indicators into database
if different to the stored one *****/ if different to the stored one *****/
if (NumIndicatorsFromDB != (int) Indicators->NumIndicators) if (NumIndicatorsFromDB != (int) IndicatorsCrs->NumIndicators)
Ind_StoreIndicatorsCrsIntoDB (CrsCod,Indicators->NumIndicators); Ind_StoreIndicatorsCrsIntoDB (CrsCod,IndicatorsCrs->NumIndicators);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -59,6 +59,14 @@ struct Ind_IndicatorsCrs
bool CourseAllOK; bool CourseAllOK;
}; };
struct Ind_Indicators
{
long DegTypCod;
long DptCod;
char StrIndicatorsSelected[Ind_MAX_SIZE_INDICATORS_SELECTED + 1];
bool IndicatorsSelected[1 + Ind_NUM_INDICATORS];
};
/*****************************************************************************/ /*****************************************************************************/
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -67,6 +75,6 @@ void Ind_ReqIndicatorsCourses (void);
void Ind_ShowIndicatorsCourses (void); void Ind_ShowIndicatorsCourses (void);
int Ind_GetNumIndicatorsCrsFromDB (long CrsCod); int Ind_GetNumIndicatorsCrsFromDB (long CrsCod);
void Ind_ComputeAndStoreIndicatorsCrs (long CrsCod,int NumIndicatorsFromDB, void Ind_ComputeAndStoreIndicatorsCrs (long CrsCod,int NumIndicatorsFromDB,
struct Ind_IndicatorsCrs *Indicators); struct Ind_IndicatorsCrs *IndicatorsCrs);
#endif #endif

View File

@ -87,6 +87,8 @@ static const char *Pho_StrAvgPhotoPrograms[Pho_NUM_AVERAGE_PHOTO_TYPES] =
/***************************** Private variables *****************************/ /***************************** Private variables *****************************/
/*****************************************************************************/ /*****************************************************************************/
struct Pho_DegPhotos DegPhotos;
/*****************************************************************************/ /*****************************************************************************/
/***************************** Private prototypes ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -1350,7 +1352,7 @@ void Pho_CalcPhotoDegree (void)
long TotalTimeToComputeAvgPhotoInMicroseconds,PartialTimeToComputeAvgPhotoInMicroseconds; long TotalTimeToComputeAvgPhotoInMicroseconds,PartialTimeToComputeAvgPhotoInMicroseconds;
/***** Get type of average *****/ /***** Get type of average *****/
Gbl.Stat.DegPhotos.TypeOfAverage = Pho_GetPhotoAvgTypeFromForm (); DegPhotos.TypeOfAverage = Pho_GetPhotoAvgTypeFromForm ();
/***** Create public directories for average photos if not exist *****/ /***** Create public directories for average photos if not exist *****/
Fil_CreateDirIfNotExists (Cfg_PATH_PHOTO_PUBLIC); Fil_CreateDirIfNotExists (Cfg_PATH_PHOTO_PUBLIC);
@ -1685,7 +1687,7 @@ static void Pho_ComputeAveragePhoto (long DegCod,Usr_Sex_t Sex,Rol_Role_t Role,
void Pho_ShowPhotoDegree (void) void Pho_ShowPhotoDegree (void)
{ {
/***** Get type of average *****/ /***** Get type of average *****/
Gbl.Stat.DegPhotos.TypeOfAverage = Pho_GetPhotoAvgTypeFromForm (); DegPhotos.TypeOfAverage = Pho_GetPhotoAvgTypeFromForm ();
Pho_ShowOrPrintPhotoDegree (Pho_DEGREES_SEE); Pho_ShowOrPrintPhotoDegree (Pho_DEGREES_SEE);
} }
@ -1697,7 +1699,7 @@ void Pho_ShowPhotoDegree (void)
void Pho_PrintPhotoDegree (void) void Pho_PrintPhotoDegree (void)
{ {
/***** Get type of average *****/ /***** Get type of average *****/
Gbl.Stat.DegPhotos.TypeOfAverage = Pho_GetPhotoAvgTypeFromForm (); DegPhotos.TypeOfAverage = Pho_GetPhotoAvgTypeFromForm ();
Pho_ShowOrPrintPhotoDegree (Pho_DEGREES_PRINT); Pho_ShowOrPrintPhotoDegree (Pho_DEGREES_PRINT);
} }
@ -1712,10 +1714,10 @@ void Pho_ShowOrPrintPhotoDegree (Pho_AvgPhotoSeeOrPrint_t SeeOrPrint)
extern const char *Txt_Degrees; extern const char *Txt_Degrees;
/***** Get photo size from form *****/ /***** Get photo size from form *****/
Gbl.Stat.DegPhotos.HowComputePhotoSize = Pho_GetHowComputePhotoSizeFromForm (); DegPhotos.HowComputePhotoSize = Pho_GetHowComputePhotoSizeFromForm ();
/***** Get how to order degrees from form *****/ /***** Get how to order degrees from form *****/
Gbl.Stat.DegPhotos.HowOrderDegrees = Pho_GetHowOrderDegreesFromForm (); DegPhotos.HowOrderDegrees = Pho_GetHowOrderDegreesFromForm ();
/***** Get and update type of list, /***** Get and update type of list,
number of columns in class photo number of columns in class photo
@ -1819,7 +1821,7 @@ static void Pho_PutSelectorForTypeOfAvg (void)
{ {
TypeOfAvgUnsigned = (unsigned) TypeOfAvg; TypeOfAvgUnsigned = (unsigned) TypeOfAvg;
HTM_OPTION (HTM_Type_UNSIGNED,&TypeOfAvgUnsigned, HTM_OPTION (HTM_Type_UNSIGNED,&TypeOfAvgUnsigned,
TypeOfAvg == Gbl.Stat.DegPhotos.TypeOfAverage,false, TypeOfAvg == DegPhotos.TypeOfAverage,false,
"%s",Txt_AVERAGE_PHOTO_TYPES[TypeOfAvg]); "%s",Txt_AVERAGE_PHOTO_TYPES[TypeOfAvg]);
} }
HTM_SELECT_End (); HTM_SELECT_End ();
@ -1835,7 +1837,7 @@ static void Pho_PutSelectorForTypeOfAvg (void)
void Pho_PutHiddenParamTypeOfAvg (void) void Pho_PutHiddenParamTypeOfAvg (void)
{ {
Par_PutHiddenParamUnsigned (NULL,"AvgType",(unsigned) Gbl.Stat.DegPhotos.TypeOfAverage); Par_PutHiddenParamUnsigned (NULL,"AvgType",(unsigned) DegPhotos.TypeOfAverage);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1883,7 +1885,7 @@ static void Pho_PutSelectorForHowComputePhotoSize (void)
{ {
PhoSiUnsigned = (unsigned) PhoSi; PhoSiUnsigned = (unsigned) PhoSi;
HTM_OPTION (HTM_Type_UNSIGNED,&PhoSiUnsigned, HTM_OPTION (HTM_Type_UNSIGNED,&PhoSiUnsigned,
PhoSi == Gbl.Stat.DegPhotos.HowComputePhotoSize,false, PhoSi == DegPhotos.HowComputePhotoSize,false,
"%s",Txt_STAT_DEGREE_PHOTO_SIZE[PhoSi]); "%s",Txt_STAT_DEGREE_PHOTO_SIZE[PhoSi]);
} }
HTM_SELECT_End (); HTM_SELECT_End ();
@ -1899,7 +1901,7 @@ static void Pho_PutSelectorForHowComputePhotoSize (void)
void Pho_PutHiddenParamPhotoSize (void) void Pho_PutHiddenParamPhotoSize (void)
{ {
Par_PutHiddenParamUnsigned (NULL,"PhotoSize",(unsigned) Gbl.Stat.DegPhotos.HowComputePhotoSize); Par_PutHiddenParamUnsigned (NULL,"PhotoSize",(unsigned) DegPhotos.HowComputePhotoSize);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1947,7 +1949,7 @@ static void Pho_PutSelectorForHowOrderDegrees (void)
{ {
OrderUnsigned = (unsigned) Order; OrderUnsigned = (unsigned) Order;
HTM_OPTION (HTM_Type_UNSIGNED,&OrderUnsigned, HTM_OPTION (HTM_Type_UNSIGNED,&OrderUnsigned,
Order == Gbl.Stat.DegPhotos.HowOrderDegrees,false, Order == DegPhotos.HowOrderDegrees,false,
"%s",Txt_STAT_DEGREE_PHOTO_ORDER[Order]); "%s",Txt_STAT_DEGREE_PHOTO_ORDER[Order]);
} }
HTM_SELECT_End (); HTM_SELECT_End ();
@ -1963,7 +1965,7 @@ static void Pho_PutSelectorForHowOrderDegrees (void)
void Pho_PutHiddenParamOrderDegrees (void) void Pho_PutHiddenParamOrderDegrees (void)
{ {
Par_PutHiddenParamUnsigned (NULL,"Order",(unsigned) Gbl.Stat.DegPhotos.HowOrderDegrees); Par_PutHiddenParamUnsigned (NULL,"Order",(unsigned) DegPhotos.HowOrderDegrees);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -2101,27 +2103,27 @@ static void Pho_GetMaxStdsPerDegree (void)
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
if (row[0] == NULL) if (row[0] == NULL)
Gbl.Stat.DegPhotos.MaxStds = -1; DegPhotos.MaxStds = -1;
else if (sscanf (row[0],"%d",&Gbl.Stat.DegPhotos.MaxStds) != 1) else if (sscanf (row[0],"%d",&DegPhotos.MaxStds) != 1)
Gbl.Stat.DegPhotos.MaxStds = -1; DegPhotos.MaxStds = -1;
if (row[1] == NULL) if (row[1] == NULL)
Gbl.Stat.DegPhotos.MaxStdsWithPhoto = -1; DegPhotos.MaxStdsWithPhoto = -1;
else if (sscanf (row[1],"%d",&Gbl.Stat.DegPhotos.MaxStdsWithPhoto) != 1) else if (sscanf (row[1],"%d",&DegPhotos.MaxStdsWithPhoto) != 1)
Gbl.Stat.DegPhotos.MaxStdsWithPhoto = -1; DegPhotos.MaxStdsWithPhoto = -1;
if (row[2] == NULL) if (row[2] == NULL)
Gbl.Stat.DegPhotos.MaxPercent = -1.0; DegPhotos.MaxPercent = -1.0;
else if (sscanf (row[2],"%lf",&Gbl.Stat.DegPhotos.MaxPercent) != 1) else if (sscanf (row[2],"%lf",&DegPhotos.MaxPercent) != 1)
Gbl.Stat.DegPhotos.MaxPercent = -1.0; DegPhotos.MaxPercent = -1.0;
/***** Free structure that stores the query result *****/ /***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res); DB_FreeMySQLResult (&mysql_res);
} }
else else
{ {
Gbl.Stat.DegPhotos.MaxStds = Gbl.Stat.DegPhotos.MaxStdsWithPhoto = -1; DegPhotos.MaxStds = DegPhotos.MaxStdsWithPhoto = -1;
Gbl.Stat.DegPhotos.MaxPercent = -1.0; DegPhotos.MaxPercent = -1.0;
} }
} }
@ -2314,7 +2316,7 @@ static unsigned long Pho_BuildQueryOfDegrees (MYSQL_RES **mysql_res)
{ {
unsigned long NumDegs = 0; // Initialized to avoid warning unsigned long NumDegs = 0; // Initialized to avoid warning
switch (Gbl.Stat.DegPhotos.HowOrderDegrees) switch (DegPhotos.HowOrderDegrees)
{ {
case Pho_NUMBER_OF_STUDENTS: case Pho_NUMBER_OF_STUDENTS:
NumDegs = DB_QuerySELECT (mysql_res,"can not get degrees", NumDegs = DB_QuerySELECT (mysql_res,"can not get degrees",
@ -2485,14 +2487,14 @@ static void Pho_ShowDegreeAvgPhotoAndStat (struct Degree *Deg,
snprintf (PathRelAvgPhoto,sizeof (PathRelAvgPhoto), snprintf (PathRelAvgPhoto,sizeof (PathRelAvgPhoto),
"%s/%s/%ld_%s.jpg", "%s/%s/%ld_%s.jpg",
Cfg_PATH_PHOTO_PUBLIC, Cfg_PATH_PHOTO_PUBLIC,
Pho_StrAvgPhotoDirs[Gbl.Stat.DegPhotos.TypeOfAverage], Pho_StrAvgPhotoDirs[DegPhotos.TypeOfAverage],
Deg->DegCod,Usr_StringsSexDB[Sex]); Deg->DegCod,Usr_StringsSexDB[Sex]);
if (Fil_CheckIfPathExists (PathRelAvgPhoto)) if (Fil_CheckIfPathExists (PathRelAvgPhoto))
{ {
snprintf (PhotoURL,sizeof (PhotoURL), snprintf (PhotoURL,sizeof (PhotoURL),
"%s/%s/%ld_%s.jpg", "%s/%s/%ld_%s.jpg",
Cfg_URL_PHOTO_PUBLIC, Cfg_URL_PHOTO_PUBLIC,
Pho_StrAvgPhotoDirs[Gbl.Stat.DegPhotos.TypeOfAverage], Pho_StrAvgPhotoDirs[DegPhotos.TypeOfAverage],
Deg->DegCod,Usr_StringsSexDB[Sex]); Deg->DegCod,Usr_StringsSexDB[Sex]);
if (SeeOrPrint == Pho_DEGREES_SEE) if (SeeOrPrint == Pho_DEGREES_SEE)
{ {
@ -2572,26 +2574,26 @@ static void Pho_ComputePhotoSize (int NumStds,int NumStdsWithPhoto,unsigned *Pho
{ {
unsigned PhotoPixels = DEF_PIXELS_PHOTO; unsigned PhotoPixels = DEF_PIXELS_PHOTO;
switch (Gbl.Stat.DegPhotos.HowComputePhotoSize) switch (DegPhotos.HowComputePhotoSize)
{ {
case Pho_PROPORTIONAL_TO_NUMBER_OF_STUDENTS: case Pho_PROPORTIONAL_TO_NUMBER_OF_STUDENTS:
if (Gbl.Stat.DegPhotos.MaxStds > 0) if (DegPhotos.MaxStds > 0)
PhotoPixels = (unsigned) (((double) (MAX_PIXELS_PHOTO - MIN_PIXELS_PHOTO) / PhotoPixels = (unsigned) (((double) (MAX_PIXELS_PHOTO - MIN_PIXELS_PHOTO) /
Gbl.Stat.DegPhotos.MaxStds) * NumStds + DegPhotos.MaxStds) * NumStds +
MIN_PIXELS_PHOTO + 0.5); MIN_PIXELS_PHOTO + 0.5);
break; break;
case Pho_PROPORTIONAL_TO_NUMBER_OF_PHOTOS: case Pho_PROPORTIONAL_TO_NUMBER_OF_PHOTOS:
if (Gbl.Stat.DegPhotos.MaxStdsWithPhoto > 0) if (DegPhotos.MaxStdsWithPhoto > 0)
PhotoPixels = (unsigned) (((double) (MAX_PIXELS_PHOTO - MIN_PIXELS_PHOTO) / PhotoPixels = (unsigned) (((double) (MAX_PIXELS_PHOTO - MIN_PIXELS_PHOTO) /
Gbl.Stat.DegPhotos.MaxStdsWithPhoto) * NumStdsWithPhoto + DegPhotos.MaxStdsWithPhoto) * NumStdsWithPhoto +
MIN_PIXELS_PHOTO + 0.5); MIN_PIXELS_PHOTO + 0.5);
break; break;
case Pho_PROPORTIONAL_TO_PERCENT: case Pho_PROPORTIONAL_TO_PERCENT:
if (Gbl.Stat.DegPhotos.MaxPercent > 0.0) if (DegPhotos.MaxPercent > 0.0)
{ {
if (NumStds) if (NumStds)
PhotoPixels = (unsigned) (((double) (MAX_PIXELS_PHOTO - MIN_PIXELS_PHOTO) / PhotoPixels = (unsigned) (((double) (MAX_PIXELS_PHOTO - MIN_PIXELS_PHOTO) /
Gbl.Stat.DegPhotos.MaxPercent) * DegPhotos.MaxPercent) *
((double) NumStdsWithPhoto / NumStds) + ((double) NumStdsWithPhoto / NumStds) +
MIN_PIXELS_PHOTO + 0.5); MIN_PIXELS_PHOTO + 0.5);
else else

View File

@ -79,6 +79,16 @@ typedef enum
#define Pho_MAX_CLICKS_WITHOUT_PHOTO 50 #define Pho_MAX_CLICKS_WITHOUT_PHOTO 50
struct Pho_DegPhotos
{
Pho_AvgPhotoTypeOfAverage_t TypeOfAverage;
Pho_HowComputePhotoSize_t HowComputePhotoSize;
Pho_HowOrderDegrees_t HowOrderDegrees;
int MaxStds;
int MaxStdsWithPhoto;
double MaxPercent;
} DegPhotos;
/*****************************************************************************/ /*****************************************************************************/
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -100,25 +100,34 @@ typedef enum
/***************************** Private prototypes ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_WriteSelectorCountType (void); static void Sta_WriteSelectorCountType (const struct Sta_Stats *Stats);
static void Sta_WriteSelectorAction (void); static void Sta_WriteSelectorAction (const struct Sta_Stats *Stats);
static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse); static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse);
static void Sta_ShowDetailedAccessesList (unsigned long NumRows,MYSQL_RES *mysql_res); static void Sta_ShowDetailedAccessesList (const struct Sta_Stats *Stats,
unsigned long NumRows,
MYSQL_RES *mysql_res);
static void Sta_WriteLogComments (long LogCod); static void Sta_WriteLogComments (long LogCod);
static void Sta_ShowNumHitsPerUsr (unsigned long NumRows,MYSQL_RES *mysql_res); static void Sta_ShowNumHitsPerUsr (Sta_CountType_t CountType,
static void Sta_ShowNumHitsPerDay (unsigned long NumRows,MYSQL_RES *mysql_res); unsigned long NumRows,MYSQL_RES *mysql_res);
static void Sta_ShowDistrAccessesPerDayAndHour (unsigned long NumRows,MYSQL_RES *mysql_res); static void Sta_ShowNumHitsPerDay (Sta_CountType_t CountType,
unsigned long NumRows,MYSQL_RES *mysql_res);
static void Sta_ShowDistrAccessesPerDayAndHour (const struct Sta_Stats *Stats,
unsigned long NumRows,
MYSQL_RES *mysql_res);
static void Sta_PutHiddenParamScopeSta (void); static void Sta_PutHiddenParamScopeSta (void);
static Sta_ColorType_t Sta_GetStatColorType (void); static Sta_ColorType_t Sta_GetStatColorType (void);
static void Sta_DrawBarColors (Sta_ColorType_t ColorType,double HitsMax); static void Sta_DrawBarColors (Sta_ColorType_t ColorType,double HitsMax);
static void Sta_DrawAccessesPerHourForADay (Sta_ColorType_t ColorType,double HitsNum[24],double HitsMax); static void Sta_DrawAccessesPerHourForADay (Sta_ColorType_t ColorType,double HitsNum[24],double HitsMax);
static void Sta_SetColor (Sta_ColorType_t ColorType,double HitsNum,double HitsMax, static void Sta_SetColor (Sta_ColorType_t ColorType,double HitsNum,double HitsMax,
unsigned *R,unsigned *G,unsigned *B); unsigned *R,unsigned *G,unsigned *B);
static void Sta_ShowNumHitsPerWeek (unsigned long NumRows, static void Sta_ShowNumHitsPerWeek (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res);
static void Sta_ShowNumHitsPerMonth (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Sta_ShowNumHitsPerMonth (unsigned long NumRows, static void Sta_ShowNumHitsPerYear (Sta_CountType_t CountType,
MYSQL_RES *mysql_res); unsigned long NumRows,
static void Sta_ShowNumHitsPerYear (unsigned long NumRows,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Sta_ShowNumHitsPerHour (unsigned long NumRows, static void Sta_ShowNumHitsPerHour (unsigned long NumRows,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
@ -126,35 +135,58 @@ static void Sta_WriteAccessHour (unsigned Hour,struct Sta_Hits *Hits,unsigned Co
static void Sta_ShowAverageAccessesPerMinute (unsigned long NumRows,MYSQL_RES *mysql_res); static void Sta_ShowAverageAccessesPerMinute (unsigned long NumRows,MYSQL_RES *mysql_res);
static void Sta_WriteLabelsXAxisAccMin (double IncX,const char *Format); static void Sta_WriteLabelsXAxisAccMin (double IncX,const char *Format);
static void Sta_WriteAccessMinute (unsigned Minute,double HitsNum,double MaxX); static void Sta_WriteAccessMinute (unsigned Minute,double HitsNum,double MaxX);
static void Sta_ShowNumHitsPerAction (unsigned long NumRows, static void Sta_ShowNumHitsPerAction (Sta_CountType_t CountTypes,
unsigned long NumRows,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Sta_ShowNumHitsPerPlugin (unsigned long NumRows, static void Sta_ShowNumHitsPerPlugin (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Sta_ShowNumHitsPerWSFunction (unsigned long NumRows, static void Sta_ShowNumHitsPerWSFunction (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Sta_ShowNumHitsPerBanner (unsigned long NumRows, static void Sta_ShowNumHitsPerBanner (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Sta_ShowNumHitsPerCountry (unsigned long NumRows, static void Sta_ShowNumHitsPerCountry (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Sta_WriteCountry (long CtyCod); static void Sta_WriteCountry (long CtyCod);
static void Sta_ShowNumHitsPerInstitution (unsigned long NumRows, static void Sta_ShowNumHitsPerInstitution (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Sta_WriteInstit (long InsCod); static void Sta_WriteInstit (long InsCod);
static void Sta_ShowNumHitsPerCentre (unsigned long NumRows, static void Sta_ShowNumHitsPerCentre (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Sta_WriteCentre (long CtrCod); static void Sta_WriteCentre (long CtrCod);
static void Sta_ShowNumHitsPerDegree (unsigned long NumRows, static void Sta_ShowNumHitsPerDegree (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Sta_WriteDegree (long DegCod); static void Sta_WriteDegree (long DegCod);
static void Sta_ShowNumHitsPerCourse (unsigned long NumRows, static void Sta_ShowNumHitsPerCourse (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Sta_DrawBarNumHits (char Color, static void Sta_DrawBarNumHits (char Color,
double HitsNum,double HitsMax,double HitsTotal, double HitsNum,double HitsMax,double HitsTotal,
unsigned MaxBarWidth); unsigned MaxBarWidth);
/*****************************************************************************/
/**************************** Reset stats context ****************************/
/*****************************************************************************/
void Sta_ResetStats (struct Sta_Stats *Stats)
{
Stats->ClicksGroupedBy = Sta_CLICKS_GROUPED_BY_DEFAULT;
Stats->Role = Sta_ROLE_DEFAULT;
Stats->CountType = Sta_COUNT_TYPE_DEFAULT;
Stats->NumAction = Sta_NUM_ACTION_DEFAULT;
Stats->FirstRow = 0;
Stats->LastRow = 0;
Stats->RowsPerPage = Sta_DEF_ROWS_PER_PAGE;
}
/*****************************************************************************/ /*****************************************************************************/
/*************** Read CGI environment variable REMOTE_ADDR *******************/ /**************** Read CGI environment variable REMOTE_ADDR ******************/
/*****************************************************************************/ /*****************************************************************************/
/* /*
CGI Environment Variables: CGI Environment Variables:
@ -202,12 +234,16 @@ void Sta_AskShowCrsHits (void)
Sta_MAX_ROWS_PER_PAGE, Sta_MAX_ROWS_PER_PAGE,
}; };
#define NUM_OPTIONS_ROWS_PER_PAGE (sizeof (RowsPerPage) / sizeof (RowsPerPage[0])) #define NUM_OPTIONS_ROWS_PER_PAGE (sizeof (RowsPerPage) / sizeof (RowsPerPage[0]))
struct Sta_Stats Stats;
Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME]; Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME];
unsigned NumTotalUsrs; unsigned NumTotalUsrs;
Sta_ClicksGroupedBy_t ClicksGroupedBy; Sta_ClicksGroupedBy_t ClicksGroupedBy;
unsigned ClicksGroupedByUnsigned; unsigned ClicksGroupedByUnsigned;
size_t i; size_t i;
/***** Reset stats context *****/
Sta_ResetStats (&Stats);
/***** Contextual menu *****/ /***** Contextual menu *****/
Mnu_ContextMenuBegin (); Mnu_ContextMenuBegin ();
Sta_PutLinkToGlobalHits (); // Global hits Sta_PutLinkToGlobalHits (); // Global hits
@ -296,7 +332,7 @@ void Sta_AskShowCrsHits (void)
Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (SetHMS); Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (SetHMS);
/***** Selection of action *****/ /***** Selection of action *****/
Sta_WriteSelectorAction (); Sta_WriteSelectorAction (&Stats);
/***** Option a) Listing of clicks distributed by some metric *****/ /***** Option a) Listing of clicks distributed by some metric *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
@ -307,18 +343,19 @@ void Sta_AskShowCrsHits (void)
HTM_TD_Begin ("class=\"LM\""); HTM_TD_Begin ("class=\"LM\"");
if ((Gbl.Stat.ClicksGroupedBy < Sta_CLICKS_CRS_PER_USR || if ((Stats.ClicksGroupedBy < Sta_CLICKS_CRS_PER_USR ||
Gbl.Stat.ClicksGroupedBy > Sta_CLICKS_CRS_PER_ACTION) && Stats.ClicksGroupedBy > Sta_CLICKS_CRS_PER_ACTION) &&
Gbl.Stat.ClicksGroupedBy != Sta_CLICKS_CRS_DETAILED_LIST) Stats.ClicksGroupedBy != Sta_CLICKS_CRS_DETAILED_LIST)
Gbl.Stat.ClicksGroupedBy = Sta_CLICKS_GROUPED_BY_DEFAULT; Stats.ClicksGroupedBy = Sta_CLICKS_GROUPED_BY_DEFAULT;
HTM_INPUT_RADIO ("GroupedOrDetailed",false, HTM_INPUT_RADIO ("GroupedOrDetailed",false,
"value=\"%u\"%s onclick=\"disableDetailedClicks();\"", "value=\"%u\"%s onclick=\"disableDetailedClicks();\"",
(unsigned) Sta_CLICKS_GROUPED, (unsigned) Sta_CLICKS_GROUPED,
Gbl.Stat.ClicksGroupedBy == Sta_CLICKS_CRS_DETAILED_LIST ? "" : " checked=\"checked\""); Stats.ClicksGroupedBy == Sta_CLICKS_CRS_DETAILED_LIST ? "" :
" checked=\"checked\"");
/* Selection of count type (number of pages generated, accesses per user, etc.) */ /* Selection of count type (number of pages generated, accesses per user, etc.) */
Sta_WriteSelectorCountType (); Sta_WriteSelectorCountType (&Stats);
HTM_LABEL_Begin ("class=\"%s\"",The_ClassFormInBox[Gbl.Prefs.Theme]); HTM_LABEL_Begin ("class=\"%s\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
HTM_TxtF ("&nbsp;%s&nbsp;",Txt_distributed_by); HTM_TxtF ("&nbsp;%s&nbsp;",Txt_distributed_by);
@ -330,7 +367,7 @@ void Sta_AskShowCrsHits (void)
{ {
ClicksGroupedByUnsigned = (unsigned) ClicksGroupedBy; ClicksGroupedByUnsigned = (unsigned) ClicksGroupedBy;
HTM_OPTION (HTM_Type_UNSIGNED,&ClicksGroupedByUnsigned, HTM_OPTION (HTM_Type_UNSIGNED,&ClicksGroupedByUnsigned,
ClicksGroupedBy == Gbl.Stat.ClicksGroupedBy,false, ClicksGroupedBy == Stats.ClicksGroupedBy,false,
"%s",Txt_STAT_CLICKS_GROUPED_BY[ClicksGroupedBy]); "%s",Txt_STAT_CLICKS_GROUPED_BY[ClicksGroupedBy]);
} }
HTM_SELECT_End (); HTM_SELECT_End ();
@ -344,7 +381,8 @@ void Sta_AskShowCrsHits (void)
HTM_INPUT_RADIO ("GroupedOrDetailed",false, HTM_INPUT_RADIO ("GroupedOrDetailed",false,
"value=\"%u\"%s onclick=\"enableDetailedClicks();\"", "value=\"%u\"%s onclick=\"enableDetailedClicks();\"",
(unsigned) Sta_CLICKS_DETAILED, (unsigned) Sta_CLICKS_DETAILED,
Gbl.Stat.ClicksGroupedBy == Sta_CLICKS_CRS_DETAILED_LIST ? " checked=\"checked\"" : ""); Stats.ClicksGroupedBy == Sta_CLICKS_CRS_DETAILED_LIST ? " checked=\"checked\"" :
"");
HTM_Txt (Txt_STAT_CLICKS_GROUPED_BY[Sta_CLICKS_CRS_DETAILED_LIST]); HTM_Txt (Txt_STAT_CLICKS_GROUPED_BY[Sta_CLICKS_CRS_DETAILED_LIST]);
HTM_LABEL_End (); HTM_LABEL_End ();
@ -357,13 +395,13 @@ void Sta_AskShowCrsHits (void)
HTM_TxtF ("(%s: ",Txt_results_per_page); HTM_TxtF ("(%s: ",Txt_results_per_page);
HTM_SELECT_Begin (false, HTM_SELECT_Begin (false,
"id=\"RowsPage\" name=\"RowsPage\"%s", "id=\"RowsPage\" name=\"RowsPage\"%s",
Gbl.Stat.ClicksGroupedBy == Sta_CLICKS_CRS_DETAILED_LIST ? "" : Stats.ClicksGroupedBy == Sta_CLICKS_CRS_DETAILED_LIST ? "" :
" disabled=\"disabled\""); " disabled=\"disabled\"");
for (i = 0; for (i = 0;
i < NUM_OPTIONS_ROWS_PER_PAGE; i < NUM_OPTIONS_ROWS_PER_PAGE;
i++) i++)
HTM_OPTION (HTM_Type_UNSIGNED,&RowsPerPage[i], HTM_OPTION (HTM_Type_UNSIGNED,&RowsPerPage[i],
RowsPerPage[i] == Gbl.Stat.RowsPerPage,false, RowsPerPage[i] == Stats.RowsPerPage,false,
"%u",RowsPerPage[i]); "%u",RowsPerPage[i]);
HTM_SELECT_End (); HTM_SELECT_End ();
HTM_Txt (")"); HTM_Txt (")");
@ -417,12 +455,16 @@ void Sta_AskShowGblHits (void)
extern const char *Txt_distributed_by; extern const char *Txt_distributed_by;
extern const char *Txt_STAT_CLICKS_GROUPED_BY[Sta_NUM_CLICKS_GROUPED_BY]; extern const char *Txt_STAT_CLICKS_GROUPED_BY[Sta_NUM_CLICKS_GROUPED_BY];
extern const char *Txt_Show_hits; extern const char *Txt_Show_hits;
struct Sta_Stats Stats;
Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME]; Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME];
Sta_Role_t RoleStat; Sta_Role_t RoleStat;
unsigned RoleStatUnsigned; unsigned RoleStatUnsigned;
Sta_ClicksGroupedBy_t ClicksGroupedBy; Sta_ClicksGroupedBy_t ClicksGroupedBy;
unsigned ClicksGroupedByUnsigned; unsigned ClicksGroupedByUnsigned;
/***** Reset stats context *****/
Sta_ResetStats (&Stats);
/***** Contextual menu *****/ /***** Contextual menu *****/
Mnu_ContextMenuBegin (); Mnu_ContextMenuBegin ();
Sta_PutLinkToCourseHits (); // Course hits Sta_PutLinkToCourseHits (); // Course hits
@ -466,7 +508,7 @@ void Sta_AskShowGblHits (void)
{ {
RoleStatUnsigned = (unsigned) RoleStat; RoleStatUnsigned = (unsigned) RoleStat;
HTM_OPTION (HTM_Type_UNSIGNED,&RoleStatUnsigned, HTM_OPTION (HTM_Type_UNSIGNED,&RoleStatUnsigned,
RoleStat == Gbl.Stat.Role,false, RoleStat == Stats.Role,false,
"%s",Txt_ROLE_STATS[RoleStat]); "%s",Txt_ROLE_STATS[RoleStat]);
} }
HTM_SELECT_End (); HTM_SELECT_End ();
@ -475,7 +517,7 @@ void Sta_AskShowGblHits (void)
HTM_TR_End (); HTM_TR_End ();
/***** Selection of action *****/ /***** Selection of action *****/
Sta_WriteSelectorAction (); Sta_WriteSelectorAction (&Stats);
/***** Clicks made from anywhere, current centre, current degree or current course *****/ /***** Clicks made from anywhere, current centre, current degree or current course *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
@ -506,15 +548,15 @@ void Sta_AskShowGblHits (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
Sta_WriteSelectorCountType (); Sta_WriteSelectorCountType (&Stats);
/***** Type of statistic *****/ /***** Type of statistic *****/
HTM_LABEL_Begin ("class=\"%s\"",The_ClassFormInBox[Gbl.Prefs.Theme]); HTM_LABEL_Begin ("class=\"%s\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
HTM_TxtF ("&nbsp;%s&nbsp;",Txt_distributed_by); HTM_TxtF ("&nbsp;%s&nbsp;",Txt_distributed_by);
if (Gbl.Stat.ClicksGroupedBy < Sta_CLICKS_GBL_PER_DAY || if (Stats.ClicksGroupedBy < Sta_CLICKS_GBL_PER_DAY ||
Gbl.Stat.ClicksGroupedBy > Sta_CLICKS_GBL_PER_COURSE) Stats.ClicksGroupedBy > Sta_CLICKS_GBL_PER_COURSE)
Gbl.Stat.ClicksGroupedBy = Sta_CLICKS_GBL_PER_DAY; Stats.ClicksGroupedBy = Sta_CLICKS_GBL_PER_DAY;
HTM_SELECT_Begin (false, HTM_SELECT_Begin (false,
"name=\"GroupedBy\""); "name=\"GroupedBy\"");
@ -524,7 +566,7 @@ void Sta_AskShowGblHits (void)
{ {
ClicksGroupedByUnsigned = (unsigned) ClicksGroupedBy; ClicksGroupedByUnsigned = (unsigned) ClicksGroupedBy;
HTM_OPTION (HTM_Type_UNSIGNED,&ClicksGroupedByUnsigned, HTM_OPTION (HTM_Type_UNSIGNED,&ClicksGroupedByUnsigned,
ClicksGroupedBy == Gbl.Stat.ClicksGroupedBy,false, ClicksGroupedBy == Stats.ClicksGroupedBy,false,
"%s",Txt_STAT_CLICKS_GROUPED_BY[ClicksGroupedBy]); "%s",Txt_STAT_CLICKS_GROUPED_BY[ClicksGroupedBy]);
} }
HTM_SELECT_End (); HTM_SELECT_End ();
@ -588,7 +630,7 @@ void Sta_PutLinkToGlobalHits (void)
/****** Put selectors for type of access count and for degree or course ******/ /****** Put selectors for type of access count and for degree or course ******/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_WriteSelectorCountType (void) static void Sta_WriteSelectorCountType (const struct Sta_Stats *Stats)
{ {
extern const char *Txt_STAT_TYPE_COUNT_SMALL[Sta_NUM_COUNT_TYPES]; extern const char *Txt_STAT_TYPE_COUNT_SMALL[Sta_NUM_COUNT_TYPES];
Sta_CountType_t StatCountType; Sta_CountType_t StatCountType;
@ -603,7 +645,7 @@ static void Sta_WriteSelectorCountType (void)
{ {
StatCountTypeUnsigned = (unsigned) StatCountType; StatCountTypeUnsigned = (unsigned) StatCountType;
HTM_OPTION (HTM_Type_UNSIGNED,&StatCountTypeUnsigned, HTM_OPTION (HTM_Type_UNSIGNED,&StatCountTypeUnsigned,
StatCountType == Gbl.Stat.CountType,false, StatCountType == Stats->CountType,false,
"%s",Txt_STAT_TYPE_COUNT_SMALL[StatCountType]); "%s",Txt_STAT_TYPE_COUNT_SMALL[StatCountType]);
} }
HTM_SELECT_End (); HTM_SELECT_End ();
@ -613,7 +655,7 @@ static void Sta_WriteSelectorCountType (void)
/******************** Put selector for type of action ************************/ /******************** Put selector for type of action ************************/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_WriteSelectorAction (void) static void Sta_WriteSelectorAction (const struct Sta_Stats *Stats)
{ {
extern const char *The_ClassFormInBox[The_NUM_THEMES]; extern const char *The_ClassFormInBox[The_NUM_THEMES];
extern const char *Txt_Action; extern const char *Txt_Action;
@ -632,7 +674,7 @@ static void Sta_WriteSelectorAction (void)
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
HTM_SELECT_Begin (false, HTM_SELECT_Begin (false,
"id=\"StatAct\" name=\"StatAct\" class=\"STAT_SEL\""); "id=\"StatAct\" name=\"StatAct\" class=\"STAT_SEL\"");
HTM_OPTION (HTM_Type_STRING,"0",Gbl.Stat.NumAction == 0,false, HTM_OPTION (HTM_Type_STRING,"0",Stats->NumAction == 0,false,
"%s",Txt_Any_action); "%s",Txt_Any_action);
for (Action = (Act_Action_t) 1; for (Action = (Act_Action_t) 1;
Action <= (Act_Action_t) (Act_NUM_ACTIONS - 1); Action <= (Act_Action_t) (Act_NUM_ACTIONS - 1);
@ -641,7 +683,7 @@ static void Sta_WriteSelectorAction (void)
Tab = Act_GetTab (Act_GetSuperAction (Action)); Tab = Act_GetTab (Act_GetSuperAction (Action));
ActionUnsigned = (unsigned) Action; ActionUnsigned = (unsigned) Action;
HTM_OPTION (HTM_Type_UNSIGNED,&ActionUnsigned, HTM_OPTION (HTM_Type_UNSIGNED,&ActionUnsigned,
Action == Gbl.Stat.NumAction,false, Action == Stats->NumAction,false,
"%u: %s &gt; %s", "%u: %s &gt; %s",
(unsigned) Action,Txt_TABS_TXT[Tab],Act_GetActionText (Action)); (unsigned) Action,Txt_TABS_TXT[Tab],Act_GetActionText (Action));
} }
@ -693,6 +735,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
extern const char *Txt_List_of_detailed_clicks; extern const char *Txt_List_of_detailed_clicks;
extern const char *Txt_STAT_TYPE_COUNT_CAPS[Sta_NUM_COUNT_TYPES]; extern const char *Txt_STAT_TYPE_COUNT_CAPS[Sta_NUM_COUNT_TYPES];
extern const char *Txt_Time_zone_used_in_the_calculation_of_these_statistics; extern const char *Txt_Time_zone_used_in_the_calculation_of_these_statistics;
struct Sta_Stats Stats;
char *Query = NULL; char *Query = NULL;
char QueryAux[512]; char QueryAux[512];
long LengthQuery; long LengthQuery;
@ -709,6 +752,9 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
unsigned NumDays; unsigned NumDays;
bool ICanQueryWholeRange; bool ICanQueryWholeRange;
/***** Reset stats context *****/
Sta_ResetStats (&Stats);
/***** Get initial and ending dates *****/ /***** Get initial and ending dates *****/
Dat_GetIniEndDatesFromForm (); Dat_GetIniEndDatesFromForm ();
@ -730,38 +776,38 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
(unsigned long) Sta_CLICKS_DETAILED_OR_GROUPED_DEFAULT); (unsigned long) Sta_CLICKS_DETAILED_OR_GROUPED_DEFAULT);
if (DetailedOrGrouped == Sta_CLICKS_DETAILED) if (DetailedOrGrouped == Sta_CLICKS_DETAILED)
Gbl.Stat.ClicksGroupedBy = Sta_CLICKS_CRS_DETAILED_LIST; Stats.ClicksGroupedBy = Sta_CLICKS_CRS_DETAILED_LIST;
else // DetailedOrGrouped == Sta_CLICKS_GROUPED else // DetailedOrGrouped == Sta_CLICKS_GROUPED
Gbl.Stat.ClicksGroupedBy = (Sta_ClicksGroupedBy_t) Stats.ClicksGroupedBy = (Sta_ClicksGroupedBy_t)
Par_GetParToUnsignedLong ("GroupedBy", Par_GetParToUnsignedLong ("GroupedBy",
0, 0,
Sta_NUM_CLICKS_GROUPED_BY - 1, Sta_NUM_CLICKS_GROUPED_BY - 1,
(unsigned long) Sta_CLICKS_GROUPED_BY_DEFAULT); (unsigned long) Sta_CLICKS_GROUPED_BY_DEFAULT);
/***** Get the type of count of clicks *****/ /***** Get the type of count of clicks *****/
if (Gbl.Stat.ClicksGroupedBy != Sta_CLICKS_CRS_DETAILED_LIST) if (Stats.ClicksGroupedBy != Sta_CLICKS_CRS_DETAILED_LIST)
Gbl.Stat.CountType = (Sta_CountType_t) Stats.CountType = (Sta_CountType_t)
Par_GetParToUnsignedLong ("CountType", Par_GetParToUnsignedLong ("CountType",
0, 0,
Sta_NUM_COUNT_TYPES - 1, Sta_NUM_COUNT_TYPES - 1,
(unsigned long) Sta_COUNT_TYPE_DEFAULT); (unsigned long) Sta_COUNT_TYPE_DEFAULT);
/***** Get action *****/ /***** Get action *****/
Gbl.Stat.NumAction = (Act_Action_t) Stats.NumAction = (Act_Action_t)
Par_GetParToUnsignedLong ("StatAct", Par_GetParToUnsignedLong ("StatAct",
0, 0,
Act_NUM_ACTIONS - 1, Act_NUM_ACTIONS - 1,
(unsigned long) Sta_NUM_ACTION_DEFAULT); (unsigned long) Sta_NUM_ACTION_DEFAULT);
switch (GlobalOrCourse) switch (GlobalOrCourse)
{ {
case Sta_SHOW_GLOBAL_ACCESSES: case Sta_SHOW_GLOBAL_ACCESSES:
/***** Get the type of user of clicks *****/ /***** Get the type of user of clicks *****/
Gbl.Stat.Role = (Sta_Role_t) Stats.Role = (Sta_Role_t)
Par_GetParToUnsignedLong ("Role", Par_GetParToUnsignedLong ("Role",
0, 0,
Sta_NUM_ROLES_STAT - 1, Sta_NUM_ROLES_STAT - 1,
(unsigned long) Sta_ROLE_DEFAULT); (unsigned long) Sta_ROLE_DEFAULT);
/***** Get users range for access statistics *****/ /***** Get users range for access statistics *****/
Gbl.Scope.Allowed = 1 << Hie_SYS | Gbl.Scope.Allowed = 1 << Hie_SYS |
@ -780,10 +826,10 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
HTM_SECTION_Begin (Sta_STAT_RESULTS_SECTION_ID); HTM_SECTION_Begin (Sta_STAT_RESULTS_SECTION_ID);
/***** Check selection *****/ /***** Check selection *****/
if ((Gbl.Stat.Role == Sta_ROLE_ALL_USRS || if ((Stats.Role == Sta_ROLE_ALL_USRS ||
Gbl.Stat.Role == Sta_ROLE_UNKNOWN_USRS) && Stats.Role == Sta_ROLE_UNKNOWN_USRS) &&
(Gbl.Stat.CountType == Sta_DISTINCT_USRS || (Stats.CountType == Sta_DISTINCT_USRS ||
Gbl.Stat.CountType == Sta_CLICKS_PER_USR)) // These types of query will never give a valid result Stats.CountType == Sta_CLICKS_PER_USR)) // These types of query will never give a valid result
{ {
/* Write warning message and abort */ /* Write warning message and abort */
Ale_ShowAlert (Ale_WARNING,Txt_There_is_no_knowing_how_many_users_not_logged_have_accessed); Ale_ShowAlert (Ale_WARNING,Txt_There_is_no_knowing_how_many_users_not_logged_have_accessed);
@ -791,22 +837,22 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
} }
break; break;
case Sta_SHOW_COURSE_ACCESSES: case Sta_SHOW_COURSE_ACCESSES:
if (Gbl.Stat.ClicksGroupedBy == Sta_CLICKS_CRS_DETAILED_LIST) if (Stats.ClicksGroupedBy == Sta_CLICKS_CRS_DETAILED_LIST)
{ {
/****** Get the number of the first row to show ******/ /****** Get the number of the first row to show ******/
Gbl.Stat.FirstRow = Par_GetParToUnsignedLong ("FirstRow", Stats.FirstRow = Par_GetParToUnsignedLong ("FirstRow",
1, 1,
ULONG_MAX, ULONG_MAX,
0); 0);
/****** Get the number of the last row to show ******/ /****** Get the number of the last row to show ******/
Gbl.Stat.LastRow = Par_GetParToUnsignedLong ("LastRow", Stats.LastRow = Par_GetParToUnsignedLong ("LastRow",
1, 1,
ULONG_MAX, ULONG_MAX,
0); 0);
/****** Get the number of rows per page ******/ /****** Get the number of rows per page ******/
Gbl.Stat.RowsPerPage = Stats.RowsPerPage =
(unsigned) Par_GetParToUnsignedLong ("RowsPage", (unsigned) Par_GetParToUnsignedLong ("RowsPage",
Sta_MIN_ROWS_PER_PAGE, Sta_MIN_ROWS_PER_PAGE,
Sta_MAX_ROWS_PER_PAGE, Sta_MAX_ROWS_PER_PAGE,
@ -856,7 +902,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
} }
/***** Query depending on the type of count *****/ /***** Query depending on the type of count *****/
switch (Gbl.Stat.CountType) switch (Stats.CountType)
{ {
case Sta_TOTAL_CLICKS: case Sta_TOTAL_CLICKS:
Str_Copy (StrQueryCountType,"COUNT(*)", Str_Copy (StrQueryCountType,"COUNT(*)",
@ -882,7 +928,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
Lay_NotEnoughMemoryExit (); Lay_NotEnoughMemoryExit ();
/* Start the query */ /* Start the query */
switch (Gbl.Stat.ClicksGroupedBy) switch (Stats.ClicksGroupedBy)
{ {
case Sta_CLICKS_CRS_DETAILED_LIST: case Sta_CLICKS_CRS_DETAILED_LIST:
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1, snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
@ -1078,14 +1124,14 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
} }
/* Type of users */ /* Type of users */
switch (Gbl.Stat.Role) switch (Stats.Role)
{ {
case Sta_ROLE_IDENTIFIED_USRS: case Sta_ROLE_IDENTIFIED_USRS:
sprintf (StrRole," AND %s.Role<>%u", sprintf (StrRole," AND %s.Role<>%u",
LogTable,(unsigned) Rol_UNK); LogTable,(unsigned) Rol_UNK);
break; break;
case Sta_ROLE_ALL_USRS: case Sta_ROLE_ALL_USRS:
switch (Gbl.Stat.CountType) switch (Stats.CountType)
{ {
case Sta_TOTAL_CLICKS: case Sta_TOTAL_CLICKS:
case Sta_GENERATION_TIME: case Sta_GENERATION_TIME:
@ -1143,7 +1189,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
Str_Concat (Query,StrRole, Str_Concat (Query,StrRole,
Sta_MAX_BYTES_QUERY_ACCESS); Sta_MAX_BYTES_QUERY_ACCESS);
switch (Gbl.Stat.ClicksGroupedBy) switch (Stats.ClicksGroupedBy)
{ {
case Sta_CLICKS_GBL_PER_PLUGIN: case Sta_CLICKS_GBL_PER_PLUGIN:
case Sta_CLICKS_GBL_PER_API_FUNCTION: case Sta_CLICKS_GBL_PER_API_FUNCTION:
@ -1202,16 +1248,16 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
} }
/* Select action */ /* Select action */
if (Gbl.Stat.NumAction != ActAll) if (Stats.NumAction != ActAll)
{ {
sprintf (QueryAux," AND %s.ActCod=%ld", sprintf (QueryAux," AND %s.ActCod=%ld",
LogTable,Act_GetActCod (Gbl.Stat.NumAction)); LogTable,Act_GetActCod (Stats.NumAction));
Str_Concat (Query,QueryAux, Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS); Sta_MAX_BYTES_QUERY_ACCESS);
} }
/* End the query */ /* End the query */
switch (Gbl.Stat.ClicksGroupedBy) switch (Stats.ClicksGroupedBy)
{ {
case Sta_CLICKS_CRS_DETAILED_LIST: case Sta_CLICKS_CRS_DETAILED_LIST:
Str_Concat (Query," ORDER BY F", Str_Concat (Query," ORDER BY F",
@ -1317,43 +1363,43 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
else else
{ {
/***** Put the table with the clicks *****/ /***** Put the table with the clicks *****/
if (Gbl.Stat.ClicksGroupedBy == Sta_CLICKS_CRS_DETAILED_LIST) if (Stats.ClicksGroupedBy == Sta_CLICKS_CRS_DETAILED_LIST)
Box_BoxBegin ("100%",Txt_List_of_detailed_clicks, Box_BoxBegin ("100%",Txt_List_of_detailed_clicks,
NULL,NULL, NULL,NULL,
NULL,Box_NOT_CLOSABLE); NULL,Box_NOT_CLOSABLE);
else else
Box_BoxBegin (NULL,Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType], Box_BoxBegin (NULL,Txt_STAT_TYPE_COUNT_CAPS[Stats.CountType],
NULL,NULL, NULL,NULL,
NULL,Box_NOT_CLOSABLE); NULL,Box_NOT_CLOSABLE);
HTM_TABLE_BeginPadding (Sta_CellPadding[Gbl.Stat.ClicksGroupedBy]); HTM_TABLE_BeginPadding (Sta_CellPadding[Stats.ClicksGroupedBy]);
switch (Gbl.Stat.ClicksGroupedBy) switch (Stats.ClicksGroupedBy)
{ {
case Sta_CLICKS_CRS_DETAILED_LIST: case Sta_CLICKS_CRS_DETAILED_LIST:
Sta_ShowDetailedAccessesList (NumRows,mysql_res); Sta_ShowDetailedAccessesList (&Stats,NumRows,mysql_res);
break; break;
case Sta_CLICKS_CRS_PER_USR: case Sta_CLICKS_CRS_PER_USR:
Sta_ShowNumHitsPerUsr (NumRows,mysql_res); Sta_ShowNumHitsPerUsr (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_CRS_PER_DAY: case Sta_CLICKS_CRS_PER_DAY:
case Sta_CLICKS_GBL_PER_DAY: case Sta_CLICKS_GBL_PER_DAY:
Sta_ShowNumHitsPerDay (NumRows,mysql_res); Sta_ShowNumHitsPerDay (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_CRS_PER_DAY_AND_HOUR: case Sta_CLICKS_CRS_PER_DAY_AND_HOUR:
case Sta_CLICKS_GBL_PER_DAY_AND_HOUR: case Sta_CLICKS_GBL_PER_DAY_AND_HOUR:
Sta_ShowDistrAccessesPerDayAndHour (NumRows,mysql_res); Sta_ShowDistrAccessesPerDayAndHour (&Stats,NumRows,mysql_res);
break; break;
case Sta_CLICKS_CRS_PER_WEEK: case Sta_CLICKS_CRS_PER_WEEK:
case Sta_CLICKS_GBL_PER_WEEK: case Sta_CLICKS_GBL_PER_WEEK:
Sta_ShowNumHitsPerWeek (NumRows,mysql_res); Sta_ShowNumHitsPerWeek (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_CRS_PER_MONTH: case Sta_CLICKS_CRS_PER_MONTH:
case Sta_CLICKS_GBL_PER_MONTH: case Sta_CLICKS_GBL_PER_MONTH:
Sta_ShowNumHitsPerMonth (NumRows,mysql_res); Sta_ShowNumHitsPerMonth (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_CRS_PER_YEAR: case Sta_CLICKS_CRS_PER_YEAR:
case Sta_CLICKS_GBL_PER_YEAR: case Sta_CLICKS_GBL_PER_YEAR:
Sta_ShowNumHitsPerYear (NumRows,mysql_res); Sta_ShowNumHitsPerYear (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_CRS_PER_HOUR: case Sta_CLICKS_CRS_PER_HOUR:
case Sta_CLICKS_GBL_PER_HOUR: case Sta_CLICKS_GBL_PER_HOUR:
@ -1365,31 +1411,31 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
break; break;
case Sta_CLICKS_CRS_PER_ACTION: case Sta_CLICKS_CRS_PER_ACTION:
case Sta_CLICKS_GBL_PER_ACTION: case Sta_CLICKS_GBL_PER_ACTION:
Sta_ShowNumHitsPerAction (NumRows,mysql_res); Sta_ShowNumHitsPerAction (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_GBL_PER_PLUGIN: case Sta_CLICKS_GBL_PER_PLUGIN:
Sta_ShowNumHitsPerPlugin (NumRows,mysql_res); Sta_ShowNumHitsPerPlugin (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_GBL_PER_API_FUNCTION: case Sta_CLICKS_GBL_PER_API_FUNCTION:
Sta_ShowNumHitsPerWSFunction (NumRows,mysql_res); Sta_ShowNumHitsPerWSFunction (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_GBL_PER_BANNER: case Sta_CLICKS_GBL_PER_BANNER:
Sta_ShowNumHitsPerBanner (NumRows,mysql_res); Sta_ShowNumHitsPerBanner (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_GBL_PER_COUNTRY: case Sta_CLICKS_GBL_PER_COUNTRY:
Sta_ShowNumHitsPerCountry (NumRows,mysql_res); Sta_ShowNumHitsPerCountry (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_GBL_PER_INSTITUTION: case Sta_CLICKS_GBL_PER_INSTITUTION:
Sta_ShowNumHitsPerInstitution (NumRows,mysql_res); Sta_ShowNumHitsPerInstitution (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_GBL_PER_CENTRE: case Sta_CLICKS_GBL_PER_CENTRE:
Sta_ShowNumHitsPerCentre (NumRows,mysql_res); Sta_ShowNumHitsPerCentre (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_GBL_PER_DEGREE: case Sta_CLICKS_GBL_PER_DEGREE:
Sta_ShowNumHitsPerDegree (NumRows,mysql_res); Sta_ShowNumHitsPerDegree (Stats.CountType,NumRows,mysql_res);
break; break;
case Sta_CLICKS_GBL_PER_COURSE: case Sta_CLICKS_GBL_PER_COURSE:
Sta_ShowNumHitsPerCourse (NumRows,mysql_res); Sta_ShowNumHitsPerCourse (Stats.CountType,NumRows,mysql_res);
break; break;
} }
HTM_TABLE_End (); HTM_TABLE_End ();
@ -1407,7 +1453,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected);
/***** Write time zone used in the calculation of these statistics *****/ /***** Write time zone used in the calculation of these statistics *****/
switch (Gbl.Stat.ClicksGroupedBy) switch (Stats.ClicksGroupedBy)
{ {
case Sta_CLICKS_CRS_PER_DAY: case Sta_CLICKS_CRS_PER_DAY:
case Sta_CLICKS_GBL_PER_DAY: case Sta_CLICKS_GBL_PER_DAY:
@ -1436,7 +1482,9 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
/******************* Show a listing of detailed clicks ***********************/ /******************* Show a listing of detailed clicks ***********************/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowDetailedAccessesList (unsigned long NumRows,MYSQL_RES *mysql_res) static void Sta_ShowDetailedAccessesList (const struct Sta_Stats *Stats,
unsigned long NumRows,
MYSQL_RES *mysql_res)
{ {
extern Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD]; extern Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD];
extern const char *Txt_Show_previous_X_clicks; extern const char *Txt_Show_previous_X_clicks;
@ -1472,31 +1520,31 @@ static void Sta_ShowDetailedAccessesList (unsigned long NumRows,MYSQL_RES *mysql
Usr_UsrDataConstructor (&UsrDat); Usr_UsrDataConstructor (&UsrDat);
/***** Compute the first and the last row to show *****/ /***** Compute the first and the last row to show *****/
FirstRow = Gbl.Stat.FirstRow; FirstRow = Stats->FirstRow;
LastRow = Gbl.Stat.LastRow; LastRow = Stats->LastRow;
if (FirstRow == 0 && LastRow == 0) // Call from main form if (FirstRow == 0 && LastRow == 0) // Call from main form
{ {
// Show last clicks // Show last clicks
FirstRow = (NumRows / Gbl.Stat.RowsPerPage - 1) * Gbl.Stat.RowsPerPage + 1; FirstRow = (NumRows / Stats->RowsPerPage - 1) * Stats->RowsPerPage + 1;
if ((FirstRow + Gbl.Stat.RowsPerPage - 1) < NumRows) if ((FirstRow + Stats->RowsPerPage - 1) < NumRows)
FirstRow += Gbl.Stat.RowsPerPage; FirstRow += Stats->RowsPerPage;
LastRow = NumRows; LastRow = NumRows;
} }
if (FirstRow < 1) // For security reasons; really it should never be less than 1 if (FirstRow < 1) // For security reasons; really it should never be less than 1
FirstRow = 1; FirstRow = 1;
if (LastRow > NumRows) if (LastRow > NumRows)
LastRow = NumRows; LastRow = NumRows;
if ((LastRow - FirstRow) >= Gbl.Stat.RowsPerPage) // For if there have been clicks that have increased the number of rows if ((LastRow - FirstRow) >= Stats->RowsPerPage) // For if there have been clicks that have increased the number of rows
LastRow = FirstRow + Gbl.Stat.RowsPerPage - 1; LastRow = FirstRow + Stats->RowsPerPage - 1;
/***** Compute the number total of pages *****/ /***** Compute the number total of pages *****/
/* Number of pages before the current one */ /* Number of pages before the current one */
NumPagesBefore = (FirstRow-1) / Gbl.Stat.RowsPerPage; NumPagesBefore = (FirstRow-1) / Stats->RowsPerPage;
if (NumPagesBefore * Gbl.Stat.RowsPerPage < (FirstRow-1)) if (NumPagesBefore * Stats->RowsPerPage < (FirstRow-1))
NumPagesBefore++; NumPagesBefore++;
/* Number of pages after the current one */ /* Number of pages after the current one */
NumPagesAfter = (NumRows - LastRow) / Gbl.Stat.RowsPerPage; NumPagesAfter = (NumRows - LastRow) / Stats->RowsPerPage;
if (NumPagesAfter * Gbl.Stat.RowsPerPage < (NumRows - LastRow)) if (NumPagesAfter * Stats->RowsPerPage < (NumRows - LastRow))
NumPagesAfter++; NumPagesAfter++;
/* Count the total number of pages */ /* Count the total number of pages */
NumPagsTotal = NumPagesBefore + 1 + NumPagesAfter; NumPagsTotal = NumPagesBefore + 1 + NumPagesAfter;
@ -1514,17 +1562,17 @@ static void Sta_ShowDetailedAccessesList (unsigned long NumRows,MYSQL_RES *mysql
Frm_StartFormAnchor (ActSeeAccCrs,Sta_STAT_RESULTS_SECTION_ID); Frm_StartFormAnchor (ActSeeAccCrs,Sta_STAT_RESULTS_SECTION_ID);
Dat_WriteParamsIniEndDates (); Dat_WriteParamsIniEndDates ();
Par_PutHiddenParamUnsigned (NULL,"GroupedBy",(unsigned) Sta_CLICKS_CRS_DETAILED_LIST); Par_PutHiddenParamUnsigned (NULL,"GroupedBy",(unsigned) Sta_CLICKS_CRS_DETAILED_LIST);
Par_PutHiddenParamUnsigned (NULL,"StatAct" ,(unsigned) Gbl.Stat.NumAction); Par_PutHiddenParamUnsigned (NULL,"StatAct" ,(unsigned) Stats->NumAction);
Par_PutHiddenParamLong (NULL,"FirstRow",FirstRow - Gbl.Stat.RowsPerPage); Par_PutHiddenParamLong (NULL,"FirstRow",FirstRow - Stats->RowsPerPage);
Par_PutHiddenParamLong (NULL,"LastRow" ,FirstRow - 1); Par_PutHiddenParamLong (NULL,"LastRow" ,FirstRow - 1);
Par_PutHiddenParamUnsigned (NULL,"RowsPage",Gbl.Stat.RowsPerPage); Par_PutHiddenParamUnsigned (NULL,"RowsPage",Stats->RowsPerPage);
Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected);
} }
HTM_TD_Begin ("class=\"LM\""); HTM_TD_Begin ("class=\"LM\"");
if (FirstRow > 1) if (FirstRow > 1)
{ {
HTM_BUTTON_SUBMIT_Begin (Str_BuildStringLong (Txt_Show_previous_X_clicks, HTM_BUTTON_SUBMIT_Begin (Str_BuildStringLong (Txt_Show_previous_X_clicks,
(long) Gbl.Stat.RowsPerPage), (long) Stats->RowsPerPage),
"BT_LINK TIT_TBL",NULL); "BT_LINK TIT_TBL",NULL);
Str_FreeString (); Str_FreeString ();
HTM_STRONG_Begin (); HTM_STRONG_Begin ();
@ -1552,17 +1600,17 @@ static void Sta_ShowDetailedAccessesList (unsigned long NumRows,MYSQL_RES *mysql
Frm_StartFormAnchor (ActSeeAccCrs,Sta_STAT_RESULTS_SECTION_ID); Frm_StartFormAnchor (ActSeeAccCrs,Sta_STAT_RESULTS_SECTION_ID);
Dat_WriteParamsIniEndDates (); Dat_WriteParamsIniEndDates ();
Par_PutHiddenParamUnsigned (NULL,"GroupedBy",(unsigned) Sta_CLICKS_CRS_DETAILED_LIST); Par_PutHiddenParamUnsigned (NULL,"GroupedBy",(unsigned) Sta_CLICKS_CRS_DETAILED_LIST);
Par_PutHiddenParamUnsigned (NULL,"StatAct" ,(unsigned) Gbl.Stat.NumAction); Par_PutHiddenParamUnsigned (NULL,"StatAct" ,(unsigned) Stats->NumAction);
Par_PutHiddenParamUnsigned (NULL,"FirstRow" ,(unsigned) (LastRow + 1)); Par_PutHiddenParamUnsigned (NULL,"FirstRow" ,(unsigned) (LastRow + 1));
Par_PutHiddenParamUnsigned (NULL,"LastRow" ,(unsigned) (LastRow + Gbl.Stat.RowsPerPage)); Par_PutHiddenParamUnsigned (NULL,"LastRow" ,(unsigned) (LastRow + Stats->RowsPerPage));
Par_PutHiddenParamUnsigned (NULL,"RowsPage" ,(unsigned) Gbl.Stat.RowsPerPage); Par_PutHiddenParamUnsigned (NULL,"RowsPage" ,(unsigned) Stats->RowsPerPage);
Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected);
} }
HTM_TD_Begin ("class=\"RM\""); HTM_TD_Begin ("class=\"RM\"");
if (LastRow < NumRows) if (LastRow < NumRows)
{ {
HTM_BUTTON_SUBMIT_Begin (Str_BuildStringLong (Txt_Show_next_X_clicks, HTM_BUTTON_SUBMIT_Begin (Str_BuildStringLong (Txt_Show_next_X_clicks,
(long) Gbl.Stat.RowsPerPage), (long) Stats->RowsPerPage),
"BT_LINK TIT_TBL",NULL); "BT_LINK TIT_TBL",NULL);
Str_FreeString (); Str_FreeString ();
HTM_STRONG_Begin (); HTM_STRONG_Begin ();
@ -1694,7 +1742,8 @@ static void Sta_WriteLogComments (long LogCod)
/********* Show a listing of with the number of clicks of each user **********/ /********* Show a listing of with the number of clicks of each user **********/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerUsr (unsigned long NumRows,MYSQL_RES *mysql_res) static void Sta_ShowNumHitsPerUsr (Sta_CountType_t CountType,
unsigned long NumRows,MYSQL_RES *mysql_res)
{ {
extern const char *Txt_No_INDEX; extern const char *Txt_No_INDEX;
extern const char *Txt_Photo; extern const char *Txt_Photo;
@ -1722,7 +1771,7 @@ static void Sta_ShowNumHitsPerUsr (unsigned long NumRows,MYSQL_RES *mysql_res)
HTM_TH (1,1,"LT",Txt_ID); HTM_TH (1,1,"LT",Txt_ID);
HTM_TH (1,1,"LT",Txt_Name); HTM_TH (1,1,"LT",Txt_Name);
HTM_TH (1,1,"CT",Txt_Role); HTM_TH (1,1,"CT",Txt_Role);
HTM_TH (1,2,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,2,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -1806,7 +1855,8 @@ static void Sta_ShowNumHitsPerUsr (unsigned long NumRows,MYSQL_RES *mysql_res)
/********** Show a listing of with the number of clicks in each date *********/ /********** Show a listing of with the number of clicks in each date *********/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerDay (unsigned long NumRows,MYSQL_RES *mysql_res) static void Sta_ShowNumHitsPerDay (Sta_CountType_t CountType,
unsigned long NumRows,MYSQL_RES *mysql_res)
{ {
extern const char *Txt_Date; extern const char *Txt_Date;
extern const char *Txt_Day; extern const char *Txt_Day;
@ -1831,7 +1881,7 @@ static void Sta_ShowNumHitsPerDay (unsigned long NumRows,MYSQL_RES *mysql_res)
HTM_TH (1,1,"CT",Txt_Date); HTM_TH (1,1,"CT",Txt_Date);
HTM_TH (1,1,"LT",Txt_Day); HTM_TH (1,1,"LT",Txt_Day);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -1936,7 +1986,9 @@ static void Sta_ShowNumHitsPerDay (unsigned long NumRows,MYSQL_RES *mysql_res)
#define GRAPH_DISTRIBUTION_PER_HOUR_HOUR_WIDTH 25 #define GRAPH_DISTRIBUTION_PER_HOUR_HOUR_WIDTH 25
#define GRAPH_DISTRIBUTION_PER_HOUR_TOTAL_WIDTH (GRAPH_DISTRIBUTION_PER_HOUR_HOUR_WIDTH * 24) #define GRAPH_DISTRIBUTION_PER_HOUR_TOTAL_WIDTH (GRAPH_DISTRIBUTION_PER_HOUR_HOUR_WIDTH * 24)
static void Sta_ShowDistrAccessesPerDayAndHour (unsigned long NumRows,MYSQL_RES *mysql_res) static void Sta_ShowDistrAccessesPerDayAndHour (const struct Sta_Stats *Stats,
unsigned long NumRows,
MYSQL_RES *mysql_res)
{ {
extern const char *The_ClassFormInBox[The_NUM_THEMES]; extern const char *The_ClassFormInBox[The_NUM_THEMES];
extern const char *Txt_Color_of_the_graphic; extern const char *Txt_Color_of_the_graphic;
@ -1974,14 +2026,14 @@ static void Sta_ShowDistrAccessesPerDayAndHour (unsigned long NumRows,MYSQL_RES
Frm_StartFormAnchor (Gbl.Action.Act,Sta_STAT_RESULTS_SECTION_ID); Frm_StartFormAnchor (Gbl.Action.Act,Sta_STAT_RESULTS_SECTION_ID);
Dat_WriteParamsIniEndDates (); Dat_WriteParamsIniEndDates ();
Par_PutHiddenParamUnsigned (NULL,"GroupedBy",(unsigned) Gbl.Stat.ClicksGroupedBy); Par_PutHiddenParamUnsigned (NULL,"GroupedBy",(unsigned) Stats->ClicksGroupedBy);
Par_PutHiddenParamUnsigned (NULL,"CountType",(unsigned) Gbl.Stat.CountType); Par_PutHiddenParamUnsigned (NULL,"CountType",(unsigned) Stats->CountType);
Par_PutHiddenParamUnsigned (NULL,"StatAct" ,(unsigned) Gbl.Stat.NumAction); Par_PutHiddenParamUnsigned (NULL,"StatAct" ,(unsigned) Stats->NumAction);
if (Gbl.Action.Act == ActSeeAccCrs) if (Gbl.Action.Act == ActSeeAccCrs)
Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected);
else // Gbl.Action.Act == ActSeeAccGbl else // Gbl.Action.Act == ActSeeAccGbl
{ {
Par_PutHiddenParamUnsigned (NULL,"Role",(unsigned) Gbl.Stat.Role); Par_PutHiddenParamUnsigned (NULL,"Role",(unsigned) Stats->Role);
Sta_PutHiddenParamScopeSta (); Sta_PutHiddenParamScopeSta ();
} }
@ -2021,7 +2073,7 @@ static void Sta_ShowDistrAccessesPerDayAndHour (unsigned long NumRows,MYSQL_RES
HTM_TH (3,1,"CT",Txt_Date); HTM_TH (3,1,"CT",Txt_Date);
HTM_TH (3,1,"LT",Txt_Day); HTM_TH (3,1,"LT",Txt_Day);
HTM_TH (1,24,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,24,"LT",Txt_STAT_TYPE_COUNT_CAPS[Stats->CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -2384,8 +2436,9 @@ static void Sta_SetColor (Sta_ColorType_t ColorType,double HitsNum,double HitsMa
/********** Show listing with number of pages generated per week *************/ /********** Show listing with number of pages generated per week *************/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerWeek (unsigned long NumRows, static void Sta_ShowNumHitsPerWeek (Sta_CountType_t CountType,
MYSQL_RES *mysql_res) unsigned long NumRows,
MYSQL_RES *mysql_res)
{ {
extern const char *Txt_Week; extern const char *Txt_Week;
extern const char *Txt_STAT_TYPE_COUNT_CAPS[Sta_NUM_COUNT_TYPES]; extern const char *Txt_STAT_TYPE_COUNT_CAPS[Sta_NUM_COUNT_TYPES];
@ -2406,7 +2459,7 @@ static void Sta_ShowNumHitsPerWeek (unsigned long NumRows,
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
HTM_TH (1,1,"LT",Txt_Week); HTM_TH (1,1,"LT",Txt_Week);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -2485,8 +2538,9 @@ static void Sta_ShowNumHitsPerWeek (unsigned long NumRows,
/********** Show a graph with the number of clicks in each month *************/ /********** Show a graph with the number of clicks in each month *************/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerMonth (unsigned long NumRows, static void Sta_ShowNumHitsPerMonth (Sta_CountType_t CountType,
MYSQL_RES *mysql_res) unsigned long NumRows,
MYSQL_RES *mysql_res)
{ {
extern const char *Txt_Month; extern const char *Txt_Month;
extern const char *Txt_STAT_TYPE_COUNT_CAPS[Sta_NUM_COUNT_TYPES]; extern const char *Txt_STAT_TYPE_COUNT_CAPS[Sta_NUM_COUNT_TYPES];
@ -2506,7 +2560,7 @@ static void Sta_ShowNumHitsPerMonth (unsigned long NumRows,
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
HTM_TH (1,1,"LT",Txt_Month); HTM_TH (1,1,"LT",Txt_Month);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -2585,7 +2639,8 @@ static void Sta_ShowNumHitsPerMonth (unsigned long NumRows,
/*********** Show a graph with the number of clicks in each year *************/ /*********** Show a graph with the number of clicks in each year *************/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerYear (unsigned long NumRows, static void Sta_ShowNumHitsPerYear (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res) MYSQL_RES *mysql_res)
{ {
extern const char *Txt_Year; extern const char *Txt_Year;
@ -2606,7 +2661,7 @@ static void Sta_ShowNumHitsPerYear (unsigned long NumRows,
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
HTM_TH (1,1,"LT",Txt_Year); HTM_TH (1,1,"LT",Txt_Year);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -3010,7 +3065,8 @@ static void Sta_WriteAccessMinute (unsigned Minute,double HitsNum,double MaxX)
/**** Show a listing of accesses with the number of clicks a each action *****/ /**** Show a listing of accesses with the number of clicks a each action *****/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerAction (unsigned long NumRows, static void Sta_ShowNumHitsPerAction (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res) MYSQL_RES *mysql_res)
{ {
extern Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD]; extern Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD];
@ -3025,7 +3081,7 @@ static void Sta_ShowNumHitsPerAction (unsigned long NumRows,
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
HTM_TH (1,1,"RT",Txt_Action); HTM_TH (1,1,"RT",Txt_Action);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -3065,7 +3121,8 @@ static void Sta_ShowNumHitsPerAction (unsigned long NumRows,
/*************** Show number of clicks distributed by plugin *****************/ /*************** Show number of clicks distributed by plugin *****************/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerPlugin (unsigned long NumRows, static void Sta_ShowNumHitsPerPlugin (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res) MYSQL_RES *mysql_res)
{ {
extern const char *Txt_Plugin; extern const char *Txt_Plugin;
@ -3079,7 +3136,7 @@ static void Sta_ShowNumHitsPerPlugin (unsigned long NumRows,
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
HTM_TH (1,1,"RT",Txt_Plugin); HTM_TH (1,1,"RT",Txt_Plugin);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -3120,7 +3177,8 @@ static void Sta_ShowNumHitsPerPlugin (unsigned long NumRows,
/******** Show number of clicks distributed by web service function **********/ /******** Show number of clicks distributed by web service function **********/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerWSFunction (unsigned long NumRows, static void Sta_ShowNumHitsPerWSFunction (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res) MYSQL_RES *mysql_res)
{ {
extern const char *Txt_Function; extern const char *Txt_Function;
@ -3134,7 +3192,7 @@ static void Sta_ShowNumHitsPerWSFunction (unsigned long NumRows,
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
HTM_TH (1,1,"LT",Txt_Function); HTM_TH (1,1,"LT",Txt_Function);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -3172,7 +3230,8 @@ static void Sta_ShowNumHitsPerWSFunction (unsigned long NumRows,
/******** Show number of clicks distributed by web service function **********/ /******** Show number of clicks distributed by web service function **********/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerBanner (unsigned long NumRows, static void Sta_ShowNumHitsPerBanner (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res) MYSQL_RES *mysql_res)
{ {
extern const char *Txt_Banner; extern const char *Txt_Banner;
@ -3188,7 +3247,7 @@ static void Sta_ShowNumHitsPerBanner (unsigned long NumRows,
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
HTM_TH (1,1,"CT",Txt_Banner); HTM_TH (1,1,"CT",Txt_Banner);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -3241,7 +3300,8 @@ static void Sta_ShowNumHitsPerBanner (unsigned long NumRows,
/******* Show a listing with the number of hits distributed by country *******/ /******* Show a listing with the number of hits distributed by country *******/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerCountry (unsigned long NumRows, static void Sta_ShowNumHitsPerCountry (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res) MYSQL_RES *mysql_res)
{ {
extern const char *Txt_No_INDEX; extern const char *Txt_No_INDEX;
@ -3258,7 +3318,7 @@ static void Sta_ShowNumHitsPerCountry (unsigned long NumRows,
HTM_TH (1,1,"CT",Txt_No_INDEX); HTM_TH (1,1,"CT",Txt_No_INDEX);
HTM_TH (1,1,"CT",Txt_Country); HTM_TH (1,1,"CT",Txt_Country);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -3331,7 +3391,8 @@ static void Sta_WriteCountry (long CtyCod)
/***** Show a listing with the number of hits distributed by institution *****/ /***** Show a listing with the number of hits distributed by institution *****/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerInstitution (unsigned long NumRows, static void Sta_ShowNumHitsPerInstitution (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res) MYSQL_RES *mysql_res)
{ {
extern const char *Txt_No_INDEX; extern const char *Txt_No_INDEX;
@ -3348,7 +3409,7 @@ static void Sta_ShowNumHitsPerInstitution (unsigned long NumRows,
HTM_TH (1,1,"CT",Txt_No_INDEX); HTM_TH (1,1,"CT",Txt_No_INDEX);
HTM_TH (1,1,"CT",Txt_Institution); HTM_TH (1,1,"CT",Txt_Institution);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -3423,7 +3484,8 @@ static void Sta_WriteInstit (long InsCod)
/******* Show a listing with the number of hits distributed by centre ********/ /******* Show a listing with the number of hits distributed by centre ********/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerCentre (unsigned long NumRows, static void Sta_ShowNumHitsPerCentre (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res) MYSQL_RES *mysql_res)
{ {
extern const char *Txt_No_INDEX; extern const char *Txt_No_INDEX;
@ -3440,7 +3502,7 @@ static void Sta_ShowNumHitsPerCentre (unsigned long NumRows,
HTM_TH (1,1,"CT",Txt_No_INDEX); HTM_TH (1,1,"CT",Txt_No_INDEX);
HTM_TH (1,1,"CT",Txt_Centre); HTM_TH (1,1,"CT",Txt_Centre);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -3515,7 +3577,8 @@ static void Sta_WriteCentre (long CtrCod)
/******* Show a listing with the number of hits distributed by degree ********/ /******* Show a listing with the number of hits distributed by degree ********/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerDegree (unsigned long NumRows, static void Sta_ShowNumHitsPerDegree (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res) MYSQL_RES *mysql_res)
{ {
extern const char *Txt_No_INDEX; extern const char *Txt_No_INDEX;
@ -3532,7 +3595,7 @@ static void Sta_ShowNumHitsPerDegree (unsigned long NumRows,
HTM_TH (1,1,"CT",Txt_No_INDEX); HTM_TH (1,1,"CT",Txt_No_INDEX);
HTM_TH (1,1,"CT",Txt_Degree); HTM_TH (1,1,"CT",Txt_Degree);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();
@ -3607,7 +3670,8 @@ static void Sta_WriteDegree (long DegCod)
/********* Show a listing with the number of clicks to each course ***********/ /********* Show a listing with the number of clicks to each course ***********/
/*****************************************************************************/ /*****************************************************************************/
static void Sta_ShowNumHitsPerCourse (unsigned long NumRows, static void Sta_ShowNumHitsPerCourse (Sta_CountType_t CountType,
unsigned long NumRows,
MYSQL_RES *mysql_res) MYSQL_RES *mysql_res)
{ {
extern const char *Txt_No_INDEX; extern const char *Txt_No_INDEX;
@ -3630,7 +3694,7 @@ static void Sta_ShowNumHitsPerCourse (unsigned long NumRows,
HTM_TH (1,1,"CT",Txt_Degree); HTM_TH (1,1,"CT",Txt_Degree);
HTM_TH (1,1,"CT",Txt_Year_OF_A_DEGREE); HTM_TH (1,1,"CT",Txt_Year_OF_A_DEGREE);
HTM_TH (1,1,"CT",Txt_Course); HTM_TH (1,1,"CT",Txt_Course);
HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[Gbl.Stat.CountType]); HTM_TH (1,1,"LT",Txt_STAT_TYPE_COUNT_CAPS[CountType]);
HTM_TR_End (); HTM_TR_End ();

View File

@ -137,26 +137,16 @@ struct Sta_Stats
unsigned long FirstRow; unsigned long FirstRow;
unsigned long LastRow; unsigned long LastRow;
unsigned RowsPerPage; unsigned RowsPerPage;
long DegTypCod;
long DptCod;
char StrIndicatorsSelected[Ind_MAX_SIZE_INDICATORS_SELECTED + 1];
bool IndicatorsSelected[1 + Ind_NUM_INDICATORS];
struct
{
Pho_AvgPhotoTypeOfAverage_t TypeOfAverage;
Pho_HowComputePhotoSize_t HowComputePhotoSize;
Pho_HowOrderDegrees_t HowOrderDegrees;
int MaxStds;
int MaxStdsWithPhoto;
double MaxPercent;
} DegPhotos;
}; };
/*****************************************************************************/ /*****************************************************************************/
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
void Sta_ResetStats (struct Sta_Stats *Stats);
void Sta_GetRemoteAddr (void); void Sta_GetRemoteAddr (void);
void Sta_AskShowCrsHits (void); void Sta_AskShowCrsHits (void);
void Sta_AskShowGblHits (void); void Sta_AskShowGblHits (void);
void Sta_PutLinkToCourseHits (void); void Sta_PutLinkToCourseHits (void);