Version 16.187

This commit is contained in:
Antonio Cañas Vargas 2017-04-24 13:00:59 +02:00
parent fb5204c443
commit 1b25600327
7 changed files with 319 additions and 236 deletions

View File

@ -219,13 +219,61 @@
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 16.186.1 (2017-04-24)" #define Log_PLATFORM_VERSION "SWAD 16.187 (2017-04-24)"
#define CSS_FILE "swad16.185.3.css" #define CSS_FILE "swad16.185.3.css"
#define JS_FILE "swad16.181.js" #define JS_FILE "swad16.181.js"
// Number of lines (includes comments but not blank lines) has been got with the following command: // Number of lines (includes comments but not blank lines) has been got with the following command:
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1 // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1
/* /*
Version 16.187: Apr 24, 2017 Changes in timetable. Not finished. (217947 lines)
35 changes necessary in database.
ALTER TABLE timetable_crs CHANGE COLUMN Day DayOld ENUM('L','M','X','J','V','S','D') NOT NULL;
ALTER TABLE timetable_crs CHANGE COLUMN Hour HourOld TINYINT NOT NULL;
ALTER TABLE timetable_crs CHANGE COLUMN Duration DurationOld TINYINT NOT NULL;
ALTER TABLE timetable_crs CHANGE COLUMN ClassType ClassTypeOld ENUM('libre','teoria','practicas') NOT NULL;
ALTER TABLE timetable_crs ADD COLUMN Weekday TINYINT NOT NULL AFTER GrpCod;
ALTER TABLE timetable_crs ADD COLUMN StartTime TIME NOT NULL AFTER Weekday;
ALTER TABLE timetable_crs ADD COLUMN Duration TIME NOT NULL AFTER StartTime;
ALTER TABLE timetable_crs ADD COLUMN ClassType ENUM('free','lecture','practical') NOT NULL AFTER Duration;
UPDATE timetable_crs SET Weekday=0 WHERE DayOld='L';
UPDATE timetable_crs SET Weekday=1 WHERE DayOld='M';
UPDATE timetable_crs SET Weekday=2 WHERE DayOld='X';
UPDATE timetable_crs SET Weekday=3 WHERE DayOld='J';
UPDATE timetable_crs SET Weekday=4 WHERE DayOld='V';
UPDATE timetable_crs SET Weekday=5 WHERE DayOld='S';
UPDATE timetable_crs SET Weekday=6 WHERE DayOld='D';
UPDATE timetable_crs SET StartTime=ADDTIME('06:00:00',SEC_TO_TIME(TIME_TO_SEC('00:30:00')*HourOld));
UPDATE timetable_crs SET Duration=SEC_TO_TIME(TIME_TO_SEC('00:30:00')*DurationOld);
UPDATE timetable_crs SET ClassType='free' WHERE ClassTypeOld='libre';
UPDATE timetable_crs SET ClassType='lecture' WHERE ClassTypeOld='teoria';
UPDATE timetable_crs SET ClassType='practical' WHERE ClassTypeOld='practicas';
ALTER TABLE timetable_tut CHANGE COLUMN Day DayOld ENUM('L','M','X','J','V','S','D') NOT NULL;
ALTER TABLE timetable_tut CHANGE COLUMN Hour HourOld TINYINT NOT NULL;
ALTER TABLE timetable_tut CHANGE COLUMN Duration DurationOld TINYINT NOT NULL;
ALTER TABLE timetable_tut ADD COLUMN Weekday TINYINT NOT NULL AFTER UsrCod;
ALTER TABLE timetable_tut ADD COLUMN StartTime TIME NOT NULL AFTER Weekday;
ALTER TABLE timetable_tut ADD COLUMN Duration TIME NOT NULL AFTER StartTime;
UPDATE timetable_tut SET Weekday=0 WHERE DayOld='L';
UPDATE timetable_tut SET Weekday=1 WHERE DayOld='M';
UPDATE timetable_tut SET Weekday=2 WHERE DayOld='X';
UPDATE timetable_tut SET Weekday=3 WHERE DayOld='J';
UPDATE timetable_tut SET Weekday=4 WHERE DayOld='V';
UPDATE timetable_tut SET Weekday=5 WHERE DayOld='S';
UPDATE timetable_tut SET Weekday=6 WHERE DayOld='D';
UPDATE timetable_tut SET StartTime=ADDTIME('06:00:00',SEC_TO_TIME(TIME_TO_SEC('00:30:00')*HourOld));
UPDATE timetable_tut SET Duration=SEC_TO_TIME(TIME_TO_SEC('00:30:00')*DurationOld);
Version 16.186.1: Apr 24, 2017 Changes in timetable. Not finished. (217881 lines) Version 16.186.1: Apr 24, 2017 Changes in timetable. Not finished. (217881 lines)
Version 16.186: Apr 24, 2017 Changes in timetable. Not finished. (217867 lines) Version 16.186: Apr 24, 2017 Changes in timetable. Not finished. (217867 lines)
Version 16.185.4: Apr 21, 2017 Warning about Java no longer working. (217849 lines) Version 16.185.4: Apr 21, 2017 Warning about Java no longer working. (217849 lines)

View File

@ -2245,27 +2245,38 @@ mysql> DESCRIBE svy_users;
/***** Table timetable_crs *****/ /***** Table timetable_crs *****/
/* /*
mysql> DESCRIBE timetable_crs; mysql> DESCRIBE timetable_crs;
+-----------+------------------------------------+------+-----+---------+-------+ +--------------+------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra | | Field | Type | Null | Key | Default | Extra |
+-----------+------------------------------------+------+-----+---------+-------+ +--------------+------------------------------------+------+-----+---------+-------+
| CrsCod | int(11) | NO | MUL | -1 | | | CrsCod | int(11) | NO | MUL | -1 | |
| GrpCod | int(11) | NO | | -1 | | | GrpCod | int(11) | NO | | -1 | |
| Day | enum('L','M','X','J','V','S','D') | NO | | NULL | | | Weekday | tinyint(4) | NO | | NULL | |
| Hour | tinyint(4) | NO | | NULL | | | StartTime | time | NO | | NULL | |
| Duration | tinyint(4) | NO | | NULL | | | Duration | time | NO | | NULL | |
| ClassType | enum('libre','teoria','practicas') | NO | | NULL | | | ClassType | enum('free','lecture','practical') | NO | | NULL | |
| Place | varchar(511) | NO | | NULL | | | DayOld | enum('L','M','X','J','V','S','D') | NO | | NULL | |
| GroupName | varchar(2047) | NO | | NULL | | | HourOld | tinyint(4) | NO | | NULL | |
+-----------+------------------------------------+------+-----+---------+-------+ | DurationOld | tinyint(4) | NO | | NULL | |
8 rows in set (0,00 sec) | ClassTypeOld | enum('libre','teoria','practicas') | NO | | NULL | |
| Place | varchar(511) | NO | | NULL | |
| GroupName | varchar(2047) | NO | | NULL | |
+--------------+------------------------------------+------+-----+---------+-------+
12 rows in set (0,00 sec)
*/ */
DB_CreateTable ("CREATE TABLE IF NOT EXISTS timetable_crs (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS timetable_crs ("
"CrsCod INT NOT NULL DEFAULT -1," "CrsCod INT NOT NULL DEFAULT -1,"
"GrpCod INT NOT NULL DEFAULT -1," "GrpCod INT NOT NULL DEFAULT -1,"
"Day ENUM('L','M','X','J','V','S','D') NOT NULL,"
"Hour TINYINT NOT NULL," "Weekday TINYINT NOT NULL," // 0=Monday...6=Sunday
"Duration TINYINT NOT NULL," "StartTime TIME NOT NULL,"
"ClassType ENUM('libre','teoria','practicas') NOT NULL," "Duration TIME NOT NULL,"
"ClassType ENUM('free','lecture','practical') NOT NULL,"
"DayOld ENUM('L','M','X','J','V','S','D') NOT NULL,"
"HourOld TINYINT NOT NULL,"
"DurationOld TINYINT NOT NULL,"
"ClassTypeOld ENUM('libre','teoria','practicas') NOT NULL,"
"Place VARCHAR(511) NOT NULL," // TT_MAX_BYTES_PLACE "Place VARCHAR(511) NOT NULL," // TT_MAX_BYTES_PLACE
"GroupName VARCHAR(2047) NOT NULL," // Grp_MAX_BYTES_GROUP_NAME "GroupName VARCHAR(2047) NOT NULL," // Grp_MAX_BYTES_GROUP_NAME
"INDEX(CrsCod,GrpCod))"); "INDEX(CrsCod,GrpCod))");
@ -2273,22 +2284,31 @@ mysql> DESCRIBE timetable_crs;
/***** Table timetable_tut *****/ /***** Table timetable_tut *****/
/* /*
mysql> DESCRIBE timetable_tut; mysql> DESCRIBE timetable_tut;
+----------+-----------------------------------+------+-----+---------+-------+ +-------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra | | Field | Type | Null | Key | Default | Extra |
+----------+-----------------------------------+------+-----+---------+-------+ +-------------+-----------------------------------+------+-----+---------+-------+
| UsrCod | int(11) | NO | MUL | NULL | | | UsrCod | int(11) | NO | MUL | NULL | |
| Day | enum('L','M','X','J','V','S','D') | NO | | NULL | | | Weekday | tinyint(4) | NO | | NULL | |
| Hour | tinyint(4) | NO | | NULL | | | StartTime | time | NO | | NULL | |
| Duration | tinyint(4) | NO | | NULL | | | Duration | time | NO | | NULL | |
| Place | varchar(511) | NO | | NULL | | | DayOld | enum('L','M','X','J','V','S','D') | NO | | NULL | |
+----------+-----------------------------------+------+-----+---------+-------+ | HourOld | tinyint(4) | NO | | NULL | |
5 rows in set (0,00 sec) | DurationOld | tinyint(4) | NO | | NULL | |
| Place | varchar(511) | NO | | NULL | |
+-------------+-----------------------------------+------+-----+---------+-------+
8 rows in set (0,01 sec)
*/ */
DB_CreateTable ("CREATE TABLE IF NOT EXISTS timetable_tut (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS timetable_tut ("
"UsrCod INT NOT NULL," "UsrCod INT NOT NULL,"
"Day ENUM('L','M','X','J','V','S','D') NOT NULL,"
"Hour TINYINT NOT NULL," "Weekday TINYINT NOT NULL," // 0=Monday...6=Sunday
"Duration TINYINT NOT NULL," "StartTime TIME NOT NULL,"
"Duration TIME NOT NULL,"
"DayOld ENUM('L','M','X','J','V','S','D') NOT NULL,"
"HourOld TINYINT NOT NULL,"
"DurationOld TINYINT NOT NULL,"
"Place VARCHAR(511) NOT NULL," // TT_MAX_BYTES_PLACE "Place VARCHAR(511) NOT NULL," // TT_MAX_BYTES_PLACE
"INDEX(UsrCod))"); "INDEX(UsrCod))");

View File

@ -624,10 +624,10 @@ struct Globals
{ {
TT_TimeTableType_t Type; TT_TimeTableType_t Type;
unsigned Day; unsigned Day;
unsigned Hour; unsigned HourOld;
unsigned Column; unsigned Column;
TT_ClassType_t ClassType; TT_ClassTypeOld_t ClassTypeOld;
unsigned Duration; unsigned DurationOld;
char Place[TT_MAX_BYTES_PLACE + 1]; char Place[TT_MAX_BYTES_PLACE + 1];
char Group[Grp_MAX_BYTES_GROUP_NAME + 1]; char Group[Grp_MAX_BYTES_GROUP_NAME + 1];
long GrpCod; // Group code (-1 if no group selected) long GrpCod; // Group code (-1 if no group selected)

View File

@ -1293,7 +1293,7 @@ static void Rec_ShowRecordOneTchCrs (void)
/* Office hours */ /* Office hours */
if (ShowOfficeHours) if (ShowOfficeHours)
{ {
Gbl.TimeTable.Type = TT_TUTOR_TIMETABLE; Gbl.TimeTable.Type = TT_TUTORING_TIMETABLE;
Lay_StartRoundFrame (Width,Txt_TIMETABLE_TYPES[Gbl.TimeTable.Type], Lay_StartRoundFrame (Width,Txt_TIMETABLE_TYPES[Gbl.TimeTable.Type],
NULL,Hlp_USERS_Teachers_timetable); NULL,Hlp_USERS_Teachers_timetable);
TT_ShowTimeTable (Gbl.Usrs.Other.UsrDat.UsrCod); TT_ShowTimeTable (Gbl.Usrs.Other.UsrDat.UsrCod);
@ -1398,7 +1398,7 @@ void Rec_ListRecordsTchs (void)
/* Office hours */ /* Office hours */
if (ShowOfficeHours) if (ShowOfficeHours)
{ {
Gbl.TimeTable.Type = TT_TUTOR_TIMETABLE; Gbl.TimeTable.Type = TT_TUTORING_TIMETABLE;
Lay_StartRoundFrame (Width,Txt_TIMETABLE_TYPES[Gbl.TimeTable.Type], Lay_StartRoundFrame (Width,Txt_TIMETABLE_TYPES[Gbl.TimeTable.Type],
NULL,Hlp_USERS_Teachers_timetable); NULL,Hlp_USERS_Teachers_timetable);
TT_ShowTimeTable (UsrDat.UsrCod); TT_ShowTimeTable (UsrDat.UsrCod);

View File

@ -47722,7 +47722,7 @@ const char *Txt_TIMETABLE_TYPES[TT_NUM_TIMETABLE_TYPES] =
"Horário minha disciplinas" "Horário minha disciplinas"
#endif #endif
, ,
// TT_TUTOR_TIMETABLE // TT_TUTORING_TIMETABLE
#if L==1 #if L==1
"Horari de tutories" "Horari de tutories"
#elif L==2 #elif L==2
@ -47746,7 +47746,7 @@ const char *Txt_TIMETABLE_TYPES[TT_NUM_TIMETABLE_TYPES] =
const char *Txt_TIMETABLE_CLASS_TYPES[TT_NUM_CLASS_TYPES] = const char *Txt_TIMETABLE_CLASS_TYPES[TT_NUM_CLASS_TYPES] =
{ {
// TT_NO_CLASS // TT_FREE
#if L==1 #if L==1
"Lliure" "Lliure"
#elif L==2 #elif L==2
@ -47767,7 +47767,7 @@ const char *Txt_TIMETABLE_CLASS_TYPES[TT_NUM_CLASS_TYPES] =
"Livre" "Livre"
#endif #endif
, ,
// TT_THEORY_CLASS // TT_LECTURE
#if L==1 #if L==1
"Teoria" "Teoria"
#elif L==2 #elif L==2
@ -47788,7 +47788,7 @@ const char *Txt_TIMETABLE_CLASS_TYPES[TT_NUM_CLASS_TYPES] =
"Teoria" "Teoria"
#endif #endif
, ,
// TT_PRACT_CLASS // TT_PRACTICAL
#if L==1 #if L==1
"Pràct." "Pràct."
#elif L==2 #elif L==2
@ -47809,7 +47809,7 @@ const char *Txt_TIMETABLE_CLASS_TYPES[TT_NUM_CLASS_TYPES] =
"Práct." "Práct."
#endif #endif
, ,
// TT_TUTOR_CLASS // TT_TUTORING
#if L==1 #if L==1
"Tutories" "Tutories"
#elif L==2 #elif L==2

View File

@ -85,7 +85,14 @@ char TimeTableCharsDays[TT_DAYS] = // TODO: Change from Spanish to numbers, also
'D', // Sunday 'D', // Sunday
}; };
char *TimeTableStrsClassTypeDB[TT_NUM_CLASS_TYPES] = // TODO: Change from Spanish to English, also in database char *TimeTableStrsClassTypeOldDB[TT_NUM_CLASS_TYPES] =
{
"free",
"lecture",
"practical",
"tutoring",
};
char *TimeTableStrsClassTypeOldDBOld[TT_NUM_CLASS_TYPES] = // TODO: Remove
{ {
"libre", "libre",
"teoria", "teoria",
@ -98,8 +105,8 @@ struct TimeTableColumn
long CrsCod; // Course code (-1 if no course selected) long CrsCod; // Course code (-1 if no course selected)
long GrpCod; // Group code (-1 if no group selected) long GrpCod; // Group code (-1 if no group selected)
TT_HourType_t HourType; TT_HourType_t HourType;
TT_ClassType_t ClassType; TT_ClassTypeOld_t ClassTypeOld;
unsigned Duration; unsigned DurationOld;
char Place[TT_MAX_BYTES_PLACE + 1]; char Place[TT_MAX_BYTES_PLACE + 1];
char Group[Grp_MAX_BYTES_GROUP_NAME + 1]; char Group[Grp_MAX_BYTES_GROUP_NAME + 1];
}; };
@ -129,12 +136,12 @@ static void TT_ModifTimeTable (void);
static void TT_DrawTimeTable (void); static void TT_DrawTimeTable (void);
static void TT_TimeTableDrawAdjustRow (void); static void TT_TimeTableDrawAdjustRow (void);
static void TT_TimeTableDrawDaysCells (void); static void TT_TimeTableDrawDaysCells (void);
static void TT_TimeTableDrawHourCell (unsigned Hour,unsigned Min,const char *Align); static void TT_TimeTableDrawHourCell (unsigned HourOld,unsigned Min,const char *Align);
static unsigned TT_TimeTableCalculateColsToDraw (unsigned Day,unsigned Hour); static unsigned TT_TimeTableCalculateColsToDraw (unsigned Day,unsigned HourOld);
static void TT_DrawCellAlignTimeTable (void); static void TT_DrawCellAlignTimeTable (void);
static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,unsigned ColSpan, static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,unsigned ColSpan,
long CrsCod,TT_HourType_t HourType,TT_ClassType_t ClassType, long CrsCod,TT_HourType_t HourType,TT_ClassTypeOld_t ClassTypeOld,
unsigned Duration,char *Group,long GrpCod,char *Place); unsigned DurationOld,char *Group,long GrpCod,char *Place);
/*****************************************************************************/ /*****************************************************************************/
/*********** Show whether only my groups or all groups are shown *************/ /*********** Show whether only my groups or all groups are shown *************/
@ -165,7 +172,7 @@ static void TT_ShowTimeTableGrpsSelected (void)
static void TT_GetParamsTimeTable (void) static void TT_GetParamsTimeTable (void)
{ {
char StrClassType[TT_MAX_BYTES_STR_CLASS_TYPE + 1]; char StrClassTypeOld[TT_MAX_BYTES_STR_CLASS_TYPE + 1];
char StrDuration[TT_MAX_BYTES_STR_DURATION + 1]; char StrDuration[TT_MAX_BYTES_STR_DURATION + 1];
unsigned Hours; unsigned Hours;
unsigned Minutes; unsigned Minutes;
@ -178,7 +185,7 @@ static void TT_GetParamsTimeTable (void)
0); 0);
/***** Get hour *****/ /***** Get hour *****/
Gbl.TimeTable.Hour = (unsigned) Gbl.TimeTable.HourOld = (unsigned)
Par_GetParToUnsignedLong ("ModTTHour", Par_GetParToUnsignedLong ("ModTTHour",
0, 0,
TT_HOURS_PER_DAY * 2 - 1, TT_HOURS_PER_DAY * 2 - 1,
@ -192,20 +199,20 @@ static void TT_GetParamsTimeTable (void)
0); 0);
/***** Get class type *****/ /***** Get class type *****/
Par_GetParToText ("ModTTClassType",StrClassType,TT_MAX_BYTES_STR_CLASS_TYPE); Par_GetParToText ("ModTTClassTypeOld",StrClassTypeOld,TT_MAX_BYTES_STR_CLASS_TYPE);
for (Gbl.TimeTable.ClassType = (TT_ClassType_t) 0; for (Gbl.TimeTable.ClassTypeOld = (TT_ClassTypeOld_t) 0;
Gbl.TimeTable.ClassType < (TT_ClassType_t) TT_NUM_CLASS_TYPES; Gbl.TimeTable.ClassTypeOld < (TT_ClassTypeOld_t) TT_NUM_CLASS_TYPES;
Gbl.TimeTable.ClassType++) Gbl.TimeTable.ClassTypeOld++)
if (!strcmp (StrClassType,TimeTableStrsClassTypeDB[Gbl.TimeTable.ClassType])) if (!strcmp (StrClassTypeOld,TimeTableStrsClassTypeOldDB[Gbl.TimeTable.ClassTypeOld]))
break; break;
if (Gbl.TimeTable.ClassType == (TT_ClassType_t) TT_NUM_CLASS_TYPES) if (Gbl.TimeTable.ClassTypeOld == (TT_ClassTypeOld_t) TT_NUM_CLASS_TYPES)
Lay_ShowErrorAndExit ("Type of timetable cell is missing."); Lay_ShowErrorAndExit ("Type of timetable cell is missing.");
/***** Get class duration *****/ /***** Get class duration *****/
Par_GetParToText ("ModTTDur",StrDuration,TT_MAX_BYTES_STR_DURATION); Par_GetParToText ("ModTTDur",StrDuration,TT_MAX_BYTES_STR_DURATION);
if (sscanf (StrDuration,"%u:%u",&Hours,&Minutes) != 2) if (sscanf (StrDuration,"%u:%u",&Hours,&Minutes) != 2)
Lay_ShowErrorAndExit ("Duration is missing."); Lay_ShowErrorAndExit ("Duration is missing.");
Gbl.TimeTable.Duration = Hours * 2 + Minutes / 30; Gbl.TimeTable.DurationOld = Hours * 2 + Minutes / 30;
/***** Get group code *****/ /***** Get group code *****/
Gbl.TimeTable.GrpCod = Par_GetParToLong ("ModTTGrpCod"); Gbl.TimeTable.GrpCod = Par_GetParToLong ("ModTTGrpCod");
@ -227,13 +234,13 @@ void TT_ShowClassTimeTable (void)
{ {
Hlp_COURSE_Timetable, // TT_COURSE_TIMETABLE Hlp_COURSE_Timetable, // TT_COURSE_TIMETABLE
Hlp_PROFILE_Timetable, // TT_MY_TIMETABLE Hlp_PROFILE_Timetable, // TT_MY_TIMETABLE
NULL, // TT_TUTOR_TIMETABLE NULL, // TT_TUTORING_TIMETABLE
}; };
Act_Action_t ActChgTT1stDay[TT_NUM_TIMETABLE_TYPES] = Act_Action_t ActChgTT1stDay[TT_NUM_TIMETABLE_TYPES] =
{ {
ActChgCrsTT1stDay,// TT_COURSE_TIMETABLE ActChgCrsTT1stDay,// TT_COURSE_TIMETABLE
ActChgMyTT1stDay, // TT_MY_TIMETABLE ActChgMyTT1stDay, // TT_MY_TIMETABLE
ActUnk, // TT_TUTOR_TIMETABLE ActUnk, // TT_TUTORING_TIMETABLE
}; };
bool PrintView = (Gbl.Action.Act == ActPrnCrsTT || bool PrintView = (Gbl.Action.Act == ActPrnCrsTT ||
Gbl.Action.Act == ActPrnMyTT);; Gbl.Action.Act == ActPrnMyTT);;
@ -344,7 +351,7 @@ static void TT_PutFormToSelectWhichGroupsToShow (void)
{ {
ActSeeCrsTT, // TT_COURSE_TIMETABLE ActSeeCrsTT, // TT_COURSE_TIMETABLE
ActSeeMyTT, // TT_MY_TIMETABLE ActSeeMyTT, // TT_MY_TIMETABLE
ActUnk, // TT_TUTOR_TIMETABLE ActUnk, // TT_TUTORING_TIMETABLE
}; };
Grp_ShowFormToSelWhichGrps (ActSeeTT[Gbl.TimeTable.Type],NULL); Grp_ShowFormToSelWhichGrps (ActSeeTT[Gbl.TimeTable.Type],NULL);
@ -377,7 +384,7 @@ void TT_EditMyTutTimeTable (void)
extern const char *Txt_TIMETABLE_TYPES[TT_NUM_TIMETABLE_TYPES]; extern const char *Txt_TIMETABLE_TYPES[TT_NUM_TIMETABLE_TYPES];
/***** Time table *****/ /***** Time table *****/
Gbl.TimeTable.Type = TT_TUTOR_TIMETABLE; Gbl.TimeTable.Type = TT_TUTORING_TIMETABLE;
Lay_StartRoundFrame ("100%",Txt_TIMETABLE_TYPES[Gbl.TimeTable.Type], Lay_StartRoundFrame ("100%",Txt_TIMETABLE_TYPES[Gbl.TimeTable.Type],
TT_PutIconToViewMyTT,Hlp_PROFILE_Timetable); TT_PutIconToViewMyTT,Hlp_PROFILE_Timetable);
TT_ShowTimeTable (Gbl.Usrs.Me.UsrDat.UsrCod); TT_ShowTimeTable (Gbl.Usrs.Me.UsrDat.UsrCod);
@ -439,7 +446,7 @@ void TT_ShowTimeTable (long UsrCod)
case TT_COURSE_TIMETABLE: case TT_COURSE_TIMETABLE:
TT_WriteCrsTimeTableIntoDB (Gbl.CurrentCrs.Crs.CrsCod); TT_WriteCrsTimeTableIntoDB (Gbl.CurrentCrs.Crs.CrsCod);
break; break;
case TT_TUTOR_TIMETABLE: case TT_TUTORING_TIMETABLE:
TT_WriteTutTimeTableIntoDB (UsrCod); TT_WriteTutTimeTableIntoDB (UsrCod);
break; break;
default: default:
@ -463,7 +470,7 @@ static void TT_WriteCrsTimeTableIntoDB (long CrsCod)
char Query[512 + char Query[512 +
TT_MAX_BYTES_PLACE + TT_MAX_BYTES_PLACE +
Grp_MAX_BYTES_GROUP_NAME]; Grp_MAX_BYTES_GROUP_NAME];
unsigned Hour; unsigned HourOld;
unsigned Day; unsigned Day;
unsigned Column; unsigned Column;
@ -476,27 +483,27 @@ static void TT_WriteCrsTimeTableIntoDB (long CrsCod)
for (Day = 0; for (Day = 0;
Day < TT_DAYS; Day < TT_DAYS;
Day++) Day++)
for (Hour = 0; for (HourOld = 0;
Hour < TT_HOURS_PER_DAY * 2; HourOld < TT_HOURS_PER_DAY * 2;
Hour++) HourOld++)
for (Column = 0; for (Column = 0;
Column < TT_MAX_COLUMNS_PER_CELL; Column < TT_MAX_COLUMNS_PER_CELL;
Column++) Column++)
if (TimeTable[Day][Hour].Columns[Column].HourType == TT_FIRST_HOUR && if (TimeTable[Day][HourOld].Columns[Column].HourType == TT_FIRST_HOUR &&
TimeTable[Day][Hour].Columns[Column].Duration > 0) TimeTable[Day][HourOld].Columns[Column].DurationOld > 0)
{ {
sprintf (Query,"INSERT INTO timetable_crs" sprintf (Query,"INSERT INTO timetable_crs"
" (CrsCod,GrpCod,Day,Hour,Duration,ClassType,Place,GroupName)" " (CrsCod,GrpCod,DayOld,HourOld,DurationOld,ClassTypeOld,Place,GroupName)"
" VALUES" " VALUES"
" (%ld,%ld,'%c',%u,%d,'%s','%s','%s')", " (%ld,%ld,'%c',%u,%d,'%s','%s','%s')",
CrsCod, CrsCod,
TimeTable[Day][Hour].Columns[Column].GrpCod, TimeTable[Day][HourOld].Columns[Column].GrpCod,
TimeTableCharsDays[Day], TimeTableCharsDays[Day],
Hour, HourOld,
TimeTable[Day][Hour].Columns[Column].Duration, TimeTable[Day][HourOld].Columns[Column].DurationOld,
TimeTableStrsClassTypeDB[TimeTable[Day][Hour].Columns[Column].ClassType], TimeTableStrsClassTypeOldDB[TimeTable[Day][HourOld].Columns[Column].ClassTypeOld],
TimeTable[Day][Hour].Columns[Column].Place, TimeTable[Day][HourOld].Columns[Column].Place,
TimeTable[Day][Hour].Columns[Column].Group); TimeTable[Day][HourOld].Columns[Column].Group);
DB_QueryINSERT (Query,"can not create course timetable"); DB_QueryINSERT (Query,"can not create course timetable");
} }
} }
@ -509,7 +516,9 @@ static void TT_WriteTutTimeTableIntoDB (long UsrCod)
{ {
char Query[512 + char Query[512 +
TT_MAX_BYTES_PLACE]; TT_MAX_BYTES_PLACE];
unsigned Hour,Day,Column; unsigned HourOld;
unsigned Day;
unsigned Column;
/***** Remove former timetable *****/ /***** Remove former timetable *****/
sprintf (Query,"DELETE FROM timetable_tut WHERE UsrCod=%ld", sprintf (Query,"DELETE FROM timetable_tut WHERE UsrCod=%ld",
@ -520,22 +529,22 @@ static void TT_WriteTutTimeTableIntoDB (long UsrCod)
for (Day = 0; for (Day = 0;
Day < TT_DAYS; Day < TT_DAYS;
Day++) Day++)
for (Hour = 0; for (HourOld = 0;
Hour < TT_HOURS_PER_DAY * 2; HourOld < TT_HOURS_PER_DAY * 2;
Hour++) HourOld++)
for (Column = 0; for (Column = 0;
Column < TT_MAX_COLUMNS_PER_CELL; Column < TT_MAX_COLUMNS_PER_CELL;
Column++) Column++)
if (TimeTable[Day][Hour].Columns[Column].HourType == TT_FIRST_HOUR && if (TimeTable[Day][HourOld].Columns[Column].HourType == TT_FIRST_HOUR &&
TimeTable[Day][Hour].Columns[Column].Duration > 0) TimeTable[Day][HourOld].Columns[Column].DurationOld > 0)
{ {
sprintf (Query,"INSERT INTO timetable_tut" sprintf (Query,"INSERT INTO timetable_tut"
" (UsrCod,Day,Hour,Duration,Place)" " (UsrCod,DayOld,HourOld,DurationOld,Place)"
" VALUES" " VALUES"
" (%ld,'%c',%u,%d,'%s')", " (%ld,'%c',%u,%d,'%s')",
UsrCod,TimeTableCharsDays[Day],Hour, UsrCod,TimeTableCharsDays[Day],HourOld,
TimeTable[Day][Hour].Columns[Column].Duration, TimeTable[Day][HourOld].Columns[Column].DurationOld,
TimeTable[Day][Hour].Columns[Column].Place); TimeTable[Day][HourOld].Columns[Column].Place);
DB_QueryINSERT (Query,"can not create office timetable"); DB_QueryINSERT (Query,"can not create office timetable");
} }
} }
@ -550,10 +559,16 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
char Query[4096]; char Query[4096];
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRow,NumRows; unsigned long NumRow;
unsigned Hour,Day,Column,FirstFreeColumn,Duration,H; unsigned long NumRows;
unsigned HourOld;
unsigned Day;
unsigned Column;
unsigned FirstFreeColumn;
unsigned DurationOld;
unsigned H;
long GrpCod; long GrpCod;
TT_ClassType_t ClassType = TT_NO_CLASS; // Initialized to avoid warning TT_ClassTypeOld_t ClassTypeOld = TT_FREE; // Initialized to avoid warning
bool TimeTableIsIncomplete = false; bool TimeTableIsIncomplete = false;
bool TimeTableHasSpaceForThisClass; bool TimeTableHasSpaceForThisClass;
bool Found; bool Found;
@ -562,22 +577,22 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
for (Day = 0; for (Day = 0;
Day < TT_DAYS; Day < TT_DAYS;
Day++) Day++)
for (Hour = 0; for (HourOld = 0;
Hour < TT_HOURS_PER_DAY * 2; HourOld < TT_HOURS_PER_DAY * 2;
Hour++) HourOld++)
{ {
TimeTable[Day][Hour].NumColumns = 0; TimeTable[Day][HourOld].NumColumns = 0;
for (Column = 0; for (Column = 0;
Column < TT_MAX_COLUMNS_PER_CELL; Column < TT_MAX_COLUMNS_PER_CELL;
Column++) Column++)
{ {
TimeTable[Day][Hour].Columns[Column].CrsCod = -1L; TimeTable[Day][HourOld].Columns[Column].CrsCod = -1L;
TimeTable[Day][Hour].Columns[Column].GrpCod = -1L; TimeTable[Day][HourOld].Columns[Column].GrpCod = -1L;
TimeTable[Day][Hour].Columns[Column].HourType = TT_FREE_HOUR; TimeTable[Day][HourOld].Columns[Column].HourType = TT_FREE_HOUR;
TimeTable[Day][Hour].Columns[Column].ClassType = TT_NO_CLASS; TimeTable[Day][HourOld].Columns[Column].ClassTypeOld = TT_FREE;
TimeTable[Day][Hour].Columns[Column].Duration = 0; TimeTable[Day][HourOld].Columns[Column].DurationOld = 0;
TimeTable[Day][Hour].Columns[Column].Group[0] = '\0'; TimeTable[Day][HourOld].Columns[Column].Group[0] = '\0';
TimeTable[Day][Hour].Columns[Column].Place[0] = '\0'; TimeTable[Day][HourOld].Columns[Column].Place[0] = '\0';
} }
} }
@ -588,41 +603,41 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
switch (Gbl.CurrentCrs.Grps.WhichGrps) switch (Gbl.CurrentCrs.Grps.WhichGrps)
{ {
case Grp_ONLY_MY_GROUPS: case Grp_ONLY_MY_GROUPS:
sprintf (Query,"SELECT timetable_crs.Day,timetable_crs.Hour,timetable_crs.Duration,timetable_crs.Place," sprintf (Query,"SELECT timetable_crs.DayOld,timetable_crs.HourOld,timetable_crs.DurationOld,timetable_crs.Place,"
"timetable_crs.ClassType,timetable_crs.GroupName,timetable_crs.GrpCod,timetable_crs.CrsCod" "timetable_crs.ClassTypeOld,timetable_crs.GroupName,timetable_crs.GrpCod,timetable_crs.CrsCod"
" FROM timetable_crs,crs_usr" " FROM timetable_crs,crs_usr"
" WHERE crs_usr.UsrCod=%ld" " WHERE crs_usr.UsrCod=%ld"
" AND timetable_crs.GrpCod=-1" " AND timetable_crs.GrpCod=-1"
" AND timetable_crs.CrsCod=crs_usr.CrsCod" " AND timetable_crs.CrsCod=crs_usr.CrsCod"
" UNION DISTINCT " " UNION DISTINCT "
"SELECT timetable_crs.Day,timetable_crs.Hour,timetable_crs.Duration,timetable_crs.Place," "SELECT timetable_crs.DayOld,timetable_crs.HourOld,timetable_crs.DurationOld,timetable_crs.Place,"
"timetable_crs.ClassType,timetable_crs.GroupName,timetable_crs.GrpCod,timetable_crs.CrsCod" "timetable_crs.ClassTypeOld,timetable_crs.GroupName,timetable_crs.GrpCod,timetable_crs.CrsCod"
" FROM timetable_crs,crs_grp_usr" " FROM timetable_crs,crs_grp_usr"
" WHERE crs_grp_usr.UsrCod=%ld" " WHERE crs_grp_usr.UsrCod=%ld"
" AND timetable_crs.GrpCod=crs_grp_usr.GrpCod" " AND timetable_crs.GrpCod=crs_grp_usr.GrpCod"
" UNION " " UNION "
"SELECT Day,Hour,Duration,Place," "SELECT DayOld,HourOld,DurationOld,Place,"
"'tutorias' AS ClassType,'' AS GroupName," "'tutorias' AS ClassTypeOld,'' AS GroupName,"
"-1 AS GrpCod,-1 AS CrsCod" "-1 AS GrpCod,-1 AS CrsCod"
" FROM timetable_tut" " FROM timetable_tut"
" WHERE UsrCod=%ld" " WHERE UsrCod=%ld"
" ORDER BY Day,Hour,ClassType,GroupName,GrpCod,Place,Duration DESC,CrsCod", " ORDER BY DayOld,HourOld,ClassTypeOld,GroupName,GrpCod,Place,DurationOld DESC,CrsCod",
UsrCod,UsrCod,UsrCod); UsrCod,UsrCod,UsrCod);
break; break;
case Grp_ALL_GROUPS: case Grp_ALL_GROUPS:
sprintf (Query,"SELECT timetable_crs.Day,timetable_crs.Hour,timetable_crs.Duration,timetable_crs.Place," sprintf (Query,"SELECT timetable_crs.DayOld,timetable_crs.HourOld,timetable_crs.DurationOld,timetable_crs.Place,"
"timetable_crs.ClassType,timetable_crs.GroupName,timetable_crs.GrpCod,timetable_crs.CrsCod" "timetable_crs.ClassTypeOld,timetable_crs.GroupName,timetable_crs.GrpCod,timetable_crs.CrsCod"
" FROM timetable_crs,crs_usr" " FROM timetable_crs,crs_usr"
" WHERE crs_usr.UsrCod=%ld" " WHERE crs_usr.UsrCod=%ld"
" AND timetable_crs.CrsCod=crs_usr.CrsCod" " AND timetable_crs.CrsCod=crs_usr.CrsCod"
" UNION " " UNION "
"SELECT Day,Hour,Duration,Place," "SELECT DayOld,HourOld,DurationOld,Place,"
"'tutorias' AS ClassType,'' AS GroupName," "'tutorias' AS ClassTypeOld,'' AS GroupName,"
"-1 AS GrpCod,-1 AS CrsCod" "-1 AS GrpCod,-1 AS CrsCod"
" FROM timetable_tut" " FROM timetable_tut"
" WHERE UsrCod=%ld" " WHERE UsrCod=%ld"
" ORDER BY Day,Hour,ClassType," " ORDER BY DayOld,HourOld,ClassTypeOld,"
"GroupName,GrpCod,Place,Duration DESC,CrsCod", "GroupName,GrpCod,Place,DurationOld DESC,CrsCod",
UsrCod,UsrCod); UsrCod,UsrCod);
break; break;
} }
@ -631,33 +646,33 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS || if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS ||
Gbl.Action.Act == ActEdiCrsTT || Gbl.Action.Act == ActEdiCrsTT ||
Gbl.Action.Act == ActChgCrsTT) // If we are editing, all groups are shown Gbl.Action.Act == ActChgCrsTT) // If we are editing, all groups are shown
sprintf (Query,"SELECT Day,Hour,Duration,Place,ClassType,GroupName,GrpCod" sprintf (Query,"SELECT DayOld,HourOld,DurationOld,Place,ClassTypeOld,GroupName,GrpCod"
" FROM timetable_crs" " FROM timetable_crs"
" WHERE CrsCod=%ld" " WHERE CrsCod=%ld"
" ORDER BY Day,Hour,ClassType,GroupName,GrpCod,Place,Duration DESC", " ORDER BY DayOld,HourOld,ClassTypeOld,GroupName,GrpCod,Place,DurationOld DESC",
Gbl.CurrentCrs.Crs.CrsCod); Gbl.CurrentCrs.Crs.CrsCod);
else else
sprintf (Query,"SELECT timetable_crs.Day,timetable_crs.Hour,timetable_crs.Duration,timetable_crs.Place,timetable_crs.ClassType,timetable_crs.GroupName,timetable_crs.GrpCod" sprintf (Query,"SELECT timetable_crs.DayOld,timetable_crs.HourOld,timetable_crs.DurationOld,timetable_crs.Place,timetable_crs.ClassTypeOld,timetable_crs.GroupName,timetable_crs.GrpCod"
" FROM timetable_crs,crs_usr" " FROM timetable_crs,crs_usr"
" WHERE timetable_crs.CrsCod=%ld" " WHERE timetable_crs.CrsCod=%ld"
" AND timetable_crs.GrpCod=-1 AND crs_usr.UsrCod=%ld" " AND timetable_crs.GrpCod=-1 AND crs_usr.UsrCod=%ld"
" AND timetable_crs.CrsCod=crs_usr.CrsCod" " AND timetable_crs.CrsCod=crs_usr.CrsCod"
" UNION DISTINCT " " UNION DISTINCT "
"SELECT timetable_crs.Day,timetable_crs.Hour,timetable_crs.Duration,timetable_crs.Place," "SELECT timetable_crs.DayOld,timetable_crs.HourOld,timetable_crs.DurationOld,timetable_crs.Place,"
"timetable_crs.ClassType,timetable_crs.GroupName,timetable_crs.GrpCod" "timetable_crs.ClassTypeOld,timetable_crs.GroupName,timetable_crs.GrpCod"
" FROM timetable_crs,crs_grp_usr" " FROM timetable_crs,crs_grp_usr"
" WHERE timetable_crs.CrsCod=%ld" " WHERE timetable_crs.CrsCod=%ld"
" AND crs_grp_usr.UsrCod=%ld" " AND crs_grp_usr.UsrCod=%ld"
" AND timetable_crs.GrpCod=crs_grp_usr.GrpCod" " AND timetable_crs.GrpCod=crs_grp_usr.GrpCod"
" ORDER BY Day,Hour,ClassType,GroupName,GrpCod,Place,Duration DESC", " ORDER BY DayOld,HourOld,ClassTypeOld,GroupName,GrpCod,Place,DurationOld DESC",
Gbl.CurrentCrs.Crs.CrsCod,UsrCod, Gbl.CurrentCrs.Crs.CrsCod,UsrCod,
Gbl.CurrentCrs.Crs.CrsCod,UsrCod); Gbl.CurrentCrs.Crs.CrsCod,UsrCod);
break; break;
case TT_TUTOR_TIMETABLE: case TT_TUTORING_TIMETABLE:
sprintf (Query,"SELECT Day,Hour,Duration,Place" sprintf (Query,"SELECT DayOld,HourOld,DurationOld,Place"
" FROM timetable_tut" " FROM timetable_tut"
" WHERE UsrCod=%ld" " WHERE UsrCod=%ld"
" ORDER BY Day,Hour,Place,Duration DESC", " ORDER BY DayOld,HourOld,Place,DurationOld DESC",
UsrCod); UsrCod);
break; break;
} }
@ -685,12 +700,12 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
if (Day == TT_DAYS) if (Day == TT_DAYS)
Lay_ShowErrorAndExit ("Wrong day of week in timetable."); Lay_ShowErrorAndExit ("Wrong day of week in timetable.");
/* Hour (row[1]) */ /* HourOld (row[1]) */
if (sscanf (row[1],"%u",&Hour) != 1) if (sscanf (row[1],"%u",&HourOld) != 1)
Lay_ShowErrorAndExit ("Wrong hour in timetable."); Lay_ShowErrorAndExit ("Wrong hour in timetable.");
/* Duration (row[2]) */ /* DurationOld (row[2]) */
if (sscanf (row[2],"%u",&Duration) != 1) if (sscanf (row[2],"%u",&DurationOld) != 1)
Lay_ShowErrorAndExit ("Wrong duration in timetable."); Lay_ShowErrorAndExit ("Wrong duration in timetable.");
/* Type of class */ /* Type of class */
@ -698,10 +713,10 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
{ {
case TT_COURSE_TIMETABLE: case TT_COURSE_TIMETABLE:
case TT_MY_TIMETABLE: case TT_MY_TIMETABLE:
for (ClassType = TT_THEORY_CLASS, Found = false; for (ClassTypeOld = TT_LECTURE, Found = false;
ClassType <= TT_TUTOR_CLASS; ClassTypeOld <= TT_TUTORING;
ClassType++) ClassTypeOld++)
if (!strcmp (row[4],TimeTableStrsClassTypeDB[ClassType])) if (!strcmp (row[4],TimeTableStrsClassTypeOldDB[ClassTypeOld]))
{ {
Found = true; Found = true;
break; break;
@ -709,20 +724,20 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
if (!Found) if (!Found)
Lay_ShowErrorAndExit ("Wrong type of class in timetable."); Lay_ShowErrorAndExit ("Wrong type of class in timetable.");
break; break;
case TT_TUTOR_TIMETABLE: case TT_TUTORING_TIMETABLE:
ClassType = TT_TUTOR_CLASS; ClassTypeOld = TT_TUTORING;
break; break;
} }
/* Cell has been read without errors. */ /* Cell has been read without errors. */
if (TimeTable[Day][Hour].NumColumns < TT_MAX_COLUMNS_PER_CELL) // If there's place for another column in this cell... if (TimeTable[Day][HourOld].NumColumns < TT_MAX_COLUMNS_PER_CELL) // If there's place for another column in this cell...
{ {
/* Find the first free column for this day-hour */ /* Find the first free column for this day-hour */
FirstFreeColumn = TT_MAX_COLUMNS_PER_CELL; FirstFreeColumn = TT_MAX_COLUMNS_PER_CELL;
for (Column = 0; for (Column = 0;
Column < TT_MAX_COLUMNS_PER_CELL; Column < TT_MAX_COLUMNS_PER_CELL;
Column++) Column++)
if (TimeTable[Day][Hour].Columns[Column].HourType == TT_FREE_HOUR) if (TimeTable[Day][HourOld].Columns[Column].HourType == TT_FREE_HOUR)
{ {
FirstFreeColumn = Column; FirstFreeColumn = Column;
break; break;
@ -731,8 +746,8 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
{ {
/* Check if there's place for all the rows of this class */ /* Check if there's place for all the rows of this class */
TimeTableHasSpaceForThisClass = true; TimeTableHasSpaceForThisClass = true;
for (H = Hour + 1; for (H = HourOld + 1;
H < Hour + Duration && H < TT_HOURS_PER_DAY * 2; H < HourOld + DurationOld && H < TT_HOURS_PER_DAY * 2;
H++) H++)
if (TimeTable[Day][H].Columns[FirstFreeColumn].HourType != TT_FREE_HOUR) if (TimeTable[Day][H].Columns[FirstFreeColumn].HourType != TT_FREE_HOUR)
{ {
@ -742,11 +757,11 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
} }
if (TimeTableHasSpaceForThisClass) if (TimeTableHasSpaceForThisClass)
{ {
TimeTable[Day][Hour].Columns[FirstFreeColumn].ClassType = ClassType; TimeTable[Day][HourOld].Columns[FirstFreeColumn].ClassTypeOld = ClassTypeOld;
TimeTable[Day][Hour].Columns[FirstFreeColumn].Duration = Duration; TimeTable[Day][HourOld].Columns[FirstFreeColumn].DurationOld = DurationOld;
TimeTable[Day][Hour].Columns[FirstFreeColumn].HourType = TT_FIRST_HOUR; TimeTable[Day][HourOld].Columns[FirstFreeColumn].HourType = TT_FIRST_HOUR;
for (H = Hour + 1; for (H = HourOld + 1;
H < Hour + Duration && H < TT_HOURS_PER_DAY * 2; H < HourOld + DurationOld && H < TT_HOURS_PER_DAY * 2;
H++) H++)
{ {
TimeTable[Day][H].Columns[FirstFreeColumn].HourType = TT_NEXT_HOUR; TimeTable[Day][H].Columns[FirstFreeColumn].HourType = TT_NEXT_HOUR;
@ -758,23 +773,23 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
{ {
case TT_MY_TIMETABLE: case TT_MY_TIMETABLE:
case TT_COURSE_TIMETABLE: case TT_COURSE_TIMETABLE:
TimeTable[Day][Hour].Columns[FirstFreeColumn].CrsCod = TimeTable[Day][HourOld].Columns[FirstFreeColumn].CrsCod =
(Gbl.TimeTable.Type == TT_MY_TIMETABLE ? Str_ConvertStrCodToLongCod (row[7]) : (Gbl.TimeTable.Type == TT_MY_TIMETABLE ? Str_ConvertStrCodToLongCod (row[7]) :
Gbl.CurrentCrs.Crs.CrsCod); Gbl.CurrentCrs.Crs.CrsCod);
Str_Copy (TimeTable[Day][Hour].Columns[FirstFreeColumn].Group, Str_Copy (TimeTable[Day][HourOld].Columns[FirstFreeColumn].Group,
row[5], row[5],
Grp_MAX_BYTES_GROUP_NAME); Grp_MAX_BYTES_GROUP_NAME);
TimeTable[Day][Hour].Columns[FirstFreeColumn].GrpCod = GrpCod; TimeTable[Day][HourOld].Columns[FirstFreeColumn].GrpCod = GrpCod;
// no break; // no break;
case TT_TUTOR_TIMETABLE: case TT_TUTORING_TIMETABLE:
Str_Copy (TimeTable[Day][Hour].Columns[FirstFreeColumn].Place, Str_Copy (TimeTable[Day][HourOld].Columns[FirstFreeColumn].Place,
row[3], row[3],
TT_MAX_BYTES_PLACE); TT_MAX_BYTES_PLACE);
break; break;
} }
/* Increment number of items in this cell */ /* Increment number of items in this cell */
TimeTable[Day][Hour].NumColumns++; TimeTable[Day][HourOld].NumColumns++;
} }
} }
else else
@ -797,31 +812,31 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
static void TT_ModifTimeTable (void) static void TT_ModifTimeTable (void)
{ {
if (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].HourType == TT_FIRST_HOUR) if (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].HourType == TT_FIRST_HOUR)
{ {
/***** Free this cell *****/ /***** Free this cell *****/
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].GrpCod = -1; TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].GrpCod = -1;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].HourType = TT_FREE_HOUR; TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].HourType = TT_FREE_HOUR;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].ClassType = TT_NO_CLASS; TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].ClassTypeOld = TT_FREE;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Duration = 0; TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].DurationOld = 0;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Group[0] = '\0'; TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Group[0] = '\0';
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Place[0] = '\0'; TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Place[0] = '\0';
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].NumColumns--; TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].NumColumns--;
} }
if (Gbl.TimeTable.ClassType != TT_NO_CLASS && Gbl.TimeTable.Duration > 0 && if (Gbl.TimeTable.ClassTypeOld != TT_FREE && Gbl.TimeTable.DurationOld > 0 &&
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].NumColumns < TT_MAX_COLUMNS_PER_CELL) TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].NumColumns < TT_MAX_COLUMNS_PER_CELL)
{ {
/***** Change this cell *****/ /***** Change this cell *****/
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].NumColumns++; TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].NumColumns++;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].GrpCod = Gbl.TimeTable.GrpCod; TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].GrpCod = Gbl.TimeTable.GrpCod;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].HourType = TT_FIRST_HOUR; TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].HourType = TT_FIRST_HOUR;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].ClassType = Gbl.TimeTable.ClassType; TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].ClassTypeOld = Gbl.TimeTable.ClassTypeOld;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Duration = Gbl.TimeTable.Duration; TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].DurationOld = Gbl.TimeTable.DurationOld;
Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Group, Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Group,
Gbl.TimeTable.Group, Gbl.TimeTable.Group,
Grp_MAX_BYTES_GROUP_NAME); Grp_MAX_BYTES_GROUP_NAME);
Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Place, Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Place,
Gbl.TimeTable.Place, Gbl.TimeTable.Place,
TT_MAX_BYTES_PLACE); TT_MAX_BYTES_PLACE);
} }
@ -836,7 +851,7 @@ static void TT_DrawTimeTable (void)
bool Editing = false; bool Editing = false;
unsigned DayColumn; // Column from left (0) to right (6) unsigned DayColumn; // Column from left (0) to right (6)
unsigned Day; // Day of week unsigned Day; // Day of week
unsigned Hour; unsigned HourOld;
unsigned Min; unsigned Min;
unsigned H; unsigned H;
unsigned Column; unsigned Column;
@ -888,15 +903,15 @@ static void TT_DrawTimeTable (void)
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS); Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
/***** Write the table row by row *****/ /***** Write the table row by row *****/
for (Hour = 0, Min = 5; for (HourOld = 0, Min = 5;
Hour < TT_HOURS_PER_DAY * 12; HourOld < TT_HOURS_PER_DAY * 12;
Hour++, Min = (Min + 5) % 60) HourOld++, Min = (Min + 5) % 60)
{ {
fprintf (Gbl.F.Out,"<tr>"); fprintf (Gbl.F.Out,"<tr>");
/* Hour */ /* HourOld */
if (Hour % 2) if (HourOld % 2)
TT_TimeTableDrawHourCell (TT_START_HOUR + (Hour + 2) / 12,Min,"RIGHT_MIDDLE"); TT_TimeTableDrawHourCell (TT_START_HOUR + (HourOld + 2) / 12,Min,"RIGHT_MIDDLE");
/* Empty column used to adjust height */ /* Empty column used to adjust height */
TT_DrawCellAlignTimeTable (); TT_DrawCellAlignTimeTable ();
@ -917,7 +932,7 @@ static void TT_DrawTimeTable (void)
H < TT_HOURS_PER_DAY * 12; H < TT_HOURS_PER_DAY * 12;
H++) H++)
TimeTableHoursChecked[H] = false; TimeTableHoursChecked[H] = false;
ColumnsToDraw = TT_TimeTableCalculateColsToDraw (Day,Hour); ColumnsToDraw = TT_TimeTableCalculateColsToDraw (Day,HourOld);
if (!Editing && ColumnsToDraw == 0) if (!Editing && ColumnsToDraw == 0)
ColumnsToDraw = 1; ColumnsToDraw = 1;
ColumnsToDrawIncludingExtraColumn = ColumnsToDraw; ColumnsToDrawIncludingExtraColumn = ColumnsToDraw;
@ -928,36 +943,36 @@ static void TT_DrawTimeTable (void)
for (Column = 0, ContinuousFreeMinicolumns = 0; for (Column = 0, ContinuousFreeMinicolumns = 0;
Column < ColumnsToDrawIncludingExtraColumn; Column < ColumnsToDrawIncludingExtraColumn;
Column++) Column++)
if (TimeTable[Day][Hour].Columns[Column].HourType == TT_FREE_HOUR) if (TimeTable[Day][HourOld].Columns[Column].HourType == TT_FREE_HOUR)
ContinuousFreeMinicolumns += TT_NUM_MINICOLUMNS_PER_DAY / ColumnsToDrawIncludingExtraColumn; ContinuousFreeMinicolumns += TT_NUM_MINICOLUMNS_PER_DAY / ColumnsToDrawIncludingExtraColumn;
else else
{ {
if (ContinuousFreeMinicolumns) if (ContinuousFreeMinicolumns)
{ {
TT_TimeTableDrawCell (Day,Hour,Column-1,ContinuousFreeMinicolumns, TT_TimeTableDrawCell (Day,HourOld,Column-1,ContinuousFreeMinicolumns,
-1L,TT_FREE_HOUR,TT_NO_CLASS,0,NULL,-1,NULL); -1L,TT_FREE_HOUR,TT_FREE,0,NULL,-1,NULL);
ContinuousFreeMinicolumns = 0; ContinuousFreeMinicolumns = 0;
} }
TT_TimeTableDrawCell (Day,Hour,Column,TT_NUM_MINICOLUMNS_PER_DAY/ColumnsToDrawIncludingExtraColumn, TT_TimeTableDrawCell (Day,HourOld,Column,TT_NUM_MINICOLUMNS_PER_DAY/ColumnsToDrawIncludingExtraColumn,
TimeTable[Day][Hour].Columns[Column].CrsCod, TimeTable[Day][HourOld].Columns[Column].CrsCod,
TimeTable[Day][Hour].Columns[Column].HourType, TimeTable[Day][HourOld].Columns[Column].HourType,
TimeTable[Day][Hour].Columns[Column].ClassType, TimeTable[Day][HourOld].Columns[Column].ClassTypeOld,
TimeTable[Day][Hour].Columns[Column].Duration, TimeTable[Day][HourOld].Columns[Column].DurationOld,
TimeTable[Day][Hour].Columns[Column].Group, TimeTable[Day][HourOld].Columns[Column].Group,
TimeTable[Day][Hour].Columns[Column].GrpCod, TimeTable[Day][HourOld].Columns[Column].GrpCod,
TimeTable[Day][Hour].Columns[Column].Place); TimeTable[Day][HourOld].Columns[Column].Place);
} }
if (ContinuousFreeMinicolumns) if (ContinuousFreeMinicolumns)
TT_TimeTableDrawCell (Day,Hour,Column-1,ContinuousFreeMinicolumns, TT_TimeTableDrawCell (Day,HourOld,Column-1,ContinuousFreeMinicolumns,
-1L,TT_FREE_HOUR,TT_NO_CLASS,0,NULL,-1L,NULL); -1L,TT_FREE_HOUR,TT_FREE,0,NULL,-1L,NULL);
} }
/* Empty column used to adjust height */ /* Empty column used to adjust height */
TT_DrawCellAlignTimeTable (); TT_DrawCellAlignTimeTable ();
/* Hour */ /* HourOld */
if (Hour % 2) if (HourOld % 2)
TT_TimeTableDrawHourCell (TT_START_HOUR + (Hour + 2) / 12,Min,"LEFT_MIDDLE"); TT_TimeTableDrawHourCell (TT_START_HOUR + (HourOld + 2) / 12,Min,"LEFT_MIDDLE");
fprintf (Gbl.F.Out,"</tr>"); fprintf (Gbl.F.Out,"</tr>");
} }
@ -1047,7 +1062,7 @@ static void TT_TimeTableDrawDaysCells (void)
/****************** Draw cells with day names in a time table ****************/ /****************** Draw cells with day names in a time table ****************/
/*****************************************************************************/ /*****************************************************************************/
static void TT_TimeTableDrawHourCell (unsigned Hour,unsigned Min,const char *Align) static void TT_TimeTableDrawHourCell (unsigned HourOld,unsigned Min,const char *Align)
{ {
fprintf (Gbl.F.Out,"<td rowspan=\"2\"" fprintf (Gbl.F.Out,"<td rowspan=\"2\""
" class=\"TT_HOUR %s %s\"" " class=\"TT_HOUR %s %s\""
@ -1056,7 +1071,7 @@ static void TT_TimeTableDrawHourCell (unsigned Hour,unsigned Min,const char *Ali
"TT_HOUR_BIG", "TT_HOUR_BIG",
Align, Align,
TT_PERCENT_WIDTH_OF_AN_HOUR_COLUMN); TT_PERCENT_WIDTH_OF_AN_HOUR_COLUMN);
fprintf (Gbl.F.Out,"%02u",Hour); fprintf (Gbl.F.Out,"%02u",HourOld);
if (Min) if (Min)
fprintf (Gbl.F.Out,":%02u",Min); fprintf (Gbl.F.Out,":%02u",Min);
fprintf (Gbl.F.Out,"</td>"); fprintf (Gbl.F.Out,"</td>");
@ -1066,7 +1081,7 @@ static void TT_TimeTableDrawHourCell (unsigned Hour,unsigned Min,const char *Ali
/**** Calculate recursively number of columns to draw for a day and hour *****/ /**** Calculate recursively number of columns to draw for a day and hour *****/
/*****************************************************************************/ /*****************************************************************************/
static unsigned TT_TimeTableCalculateColsToDraw (unsigned Day,unsigned Hour) static unsigned TT_TimeTableCalculateColsToDraw (unsigned Day,unsigned HourOld)
{ {
unsigned ColumnsToDraw; unsigned ColumnsToDraw;
unsigned Column; unsigned Column;
@ -1074,23 +1089,23 @@ static unsigned TT_TimeTableCalculateColsToDraw (unsigned Day,unsigned Hour)
unsigned FirstHour; unsigned FirstHour;
unsigned Cols; unsigned Cols;
ColumnsToDraw = TimeTable[Day][Hour].NumColumns; ColumnsToDraw = TimeTable[Day][HourOld].NumColumns;
if (!TimeTableHoursChecked[Hour]) if (!TimeTableHoursChecked[HourOld])
{ {
TimeTableHoursChecked[Hour] = true; TimeTableHoursChecked[HourOld] = true;
for (Column = 0; for (Column = 0;
Column < TT_MAX_COLUMNS_PER_CELL; Column < TT_MAX_COLUMNS_PER_CELL;
Column++) Column++)
{ {
switch (TimeTable[Day][Hour].Columns[Column].HourType) switch (TimeTable[Day][HourOld].Columns[Column].HourType)
{ {
case TT_FREE_HOUR: case TT_FREE_HOUR:
break; break;
case TT_FIRST_HOUR: case TT_FIRST_HOUR:
/* Check from first hour (this one) to last hour searching maximum number of columns */ /* Check from first hour (this one) to last hour searching maximum number of columns */
for (H = Hour + 1; for (H = HourOld + 1;
H < Hour + TimeTable[Day][Hour].Columns[Column].Duration; H < HourOld + TimeTable[Day][HourOld].Columns[Column].DurationOld;
H++) H++)
if (!TimeTableHoursChecked[H]) if (!TimeTableHoursChecked[H])
{ {
@ -1101,12 +1116,12 @@ static unsigned TT_TimeTableCalculateColsToDraw (unsigned Day,unsigned Hour)
break; break;
case TT_NEXT_HOUR: case TT_NEXT_HOUR:
/* Find first hour for this item (class) */ /* Find first hour for this item (class) */
for (FirstHour = Hour; for (FirstHour = HourOld;
TimeTable[Day][FirstHour].Columns[Column].HourType == TT_NEXT_HOUR; TimeTable[Day][FirstHour].Columns[Column].HourType == TT_NEXT_HOUR;
FirstHour--); FirstHour--);
/* Check from first hour to last hour searching maximum number of columns */ /* Check from first hour to last hour searching maximum number of columns */
for (H = FirstHour; for (H = FirstHour;
H < FirstHour + TimeTable[Day][FirstHour].Columns[Column].Duration; H < FirstHour + TimeTable[Day][FirstHour].Columns[Column].DurationOld;
H++) H++)
if (!TimeTableHoursChecked[H]) if (!TimeTableHoursChecked[H])
{ {
@ -1137,9 +1152,9 @@ static void TT_DrawCellAlignTimeTable (void)
/*************************** Write a timetable cell **************************/ /*************************** Write a timetable cell **************************/
/*****************************************************************************/ /*****************************************************************************/
static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,unsigned ColSpan, static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,unsigned ColSpan,
long CrsCod,TT_HourType_t HourType,TT_ClassType_t ClassType, long CrsCod,TT_HourType_t HourType,TT_ClassTypeOld_t ClassTypeOld,
unsigned Duration,char *Group,long GrpCod,char *Place) unsigned DurationOld,char *Group,long GrpCod,char *Place)
{ {
extern const char *Txt_unknown_removed_course; extern const char *Txt_unknown_removed_course;
extern const char *Txt_TIMETABLE_CLASS_TYPES[TT_NUM_CLASS_TYPES]; extern const char *Txt_TIMETABLE_CLASS_TYPES[TT_NUM_CLASS_TYPES];
@ -1168,7 +1183,7 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
unsigned Dur; unsigned Dur;
unsigned MaxDuration; unsigned MaxDuration;
unsigned RowSpan = 0; unsigned RowSpan = 0;
TT_ClassType_t CT; TT_ClassTypeOld_t CT;
struct Course Crs; struct Course Crs;
/***** Compute row span and background color depending on hour type *****/ /***** Compute row span and background color depending on hour type *****/
@ -1178,7 +1193,7 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
RowSpan = 1; RowSpan = 1;
break; break;
case TT_FIRST_HOUR: // Normal cell written case TT_FIRST_HOUR: // Normal cell written
RowSpan = Duration; RowSpan = DurationOld;
break; break;
case TT_NEXT_HOUR: // Nothing written case TT_NEXT_HOUR: // Nothing written
break; break;
@ -1219,9 +1234,9 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
/***** Cell start *****/ /***** Cell start *****/
fprintf (Gbl.F.Out,"<td rowspan=\"%u\" colspan=\"%u\" class=\"%s", fprintf (Gbl.F.Out,"<td rowspan=\"%u\" colspan=\"%u\" class=\"%s",
RowSpan,ColSpan,TimeTableClasses[ClassType]); RowSpan,ColSpan,TimeTableClasses[ClassTypeOld]);
if (ClassType == TT_NO_CLASS) if (ClassTypeOld == TT_FREE)
fprintf (Gbl.F.Out,"%u",Hour % 4); fprintf (Gbl.F.Out,"%u",HourOld % 4);
fprintf (Gbl.F.Out," CENTER_MIDDLE DAT_SMALL\">"); fprintf (Gbl.F.Out," CENTER_MIDDLE DAT_SMALL\">");
/***** Form to modify this cell *****/ /***** Form to modify this cell *****/
@ -1242,16 +1257,16 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
{ {
Crs.CrsCod = CrsCod; Crs.CrsCod = CrsCod;
Crs_GetDataOfCourseByCod (&Crs); Crs_GetDataOfCourseByCod (&Crs);
if (ClassType == TT_THEORY_CLASS || if (ClassTypeOld == TT_LECTURE ||
ClassType == TT_PRACT_CLASS) ClassTypeOld == TT_PRACTICAL)
fprintf (Gbl.F.Out,"%s<br />", fprintf (Gbl.F.Out,"%s<br />",
Crs.ShrtName[0] ? Crs.ShrtName : Crs.ShrtName[0] ? Crs.ShrtName :
Txt_unknown_removed_course); Txt_unknown_removed_course);
} }
fprintf (Gbl.F.Out,"%s (%dh%s)", fprintf (Gbl.F.Out,"%s (%dh%s)",
Txt_TIMETABLE_CLASS_TYPES[ClassType], Txt_TIMETABLE_CLASS_TYPES[ClassTypeOld],
Duration / 2, DurationOld / 2,
Duration % 2 ? "30'" : DurationOld % 2 ? "30'" :
""); "");
if (TimeTableView == TT_CRS_SHOW) if (TimeTableView == TT_CRS_SHOW)
{ {
@ -1275,37 +1290,37 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
case TT_CRS_EDIT: case TT_CRS_EDIT:
case TT_TUT_EDIT: case TT_TUT_EDIT:
Par_PutHiddenParamUnsigned ("ModTTDay",Day); Par_PutHiddenParamUnsigned ("ModTTDay",Day);
Par_PutHiddenParamUnsigned ("ModTTHour",Hour); Par_PutHiddenParamUnsigned ("ModTTHour",HourOld);
Par_PutHiddenParamUnsigned ("ModTTCol",Column); Par_PutHiddenParamUnsigned ("ModTTCol",Column);
/***** Class type *****/ /***** Class type *****/
fprintf (Gbl.F.Out,"<select name=\"ModTTClassType\" style=\"width:68px;\"" fprintf (Gbl.F.Out,"<select name=\"ModTTClassTypeOld\" style=\"width:68px;\""
" onchange=\"document.getElementById('%s').submit();\">", " onchange=\"document.getElementById('%s').submit();\">",
Gbl.Form.Id); Gbl.Form.Id);
for (CT = (TT_ClassType_t) 0; for (CT = (TT_ClassTypeOld_t) 0;
CT < (TT_ClassType_t) TT_NUM_CLASS_TYPES; CT < (TT_ClassTypeOld_t) TT_NUM_CLASS_TYPES;
CT++) CT++)
if ((CT == TT_NO_CLASS) || if ((CT == TT_FREE) ||
((TimeTableView == TT_CRS_EDIT) && (CT == TT_THEORY_CLASS || CT == TT_PRACT_CLASS)) || ((TimeTableView == TT_CRS_EDIT) && (CT == TT_LECTURE || CT == TT_PRACTICAL)) ||
((TimeTableView == TT_TUT_EDIT) && (CT == TT_TUTOR_CLASS))) ((TimeTableView == TT_TUT_EDIT) && (CT == TT_TUTORING)))
{ {
fprintf (Gbl.F.Out,"<option"); fprintf (Gbl.F.Out,"<option");
if (CT == ClassType) if (CT == ClassTypeOld)
fprintf (Gbl.F.Out," selected=\"selected\""); fprintf (Gbl.F.Out," selected=\"selected\"");
fprintf (Gbl.F.Out," value=\"%s\">%s</option>", fprintf (Gbl.F.Out," value=\"%s\">%s</option>",
TimeTableStrsClassTypeDB[CT], TimeTableStrsClassTypeOldDB[CT],
Txt_TIMETABLE_CLASS_TYPES[CT]); Txt_TIMETABLE_CLASS_TYPES[CT]);
} }
fprintf (Gbl.F.Out,"</select>"); fprintf (Gbl.F.Out,"</select>");
if (HourType == TT_FREE_HOUR) if (HourType == TT_FREE_HOUR)
{ {
fprintf (Gbl.F.Out,"<input type=\"hidden\" name=\"ModTTDur\" value=\""); fprintf (Gbl.F.Out,"<input type=\"hidden\" name=\"ModTTDur\" value=\"");
for (H = Hour + 1; for (H = HourOld + 1;
H < TT_HOURS_PER_DAY * 2; H < TT_HOURS_PER_DAY * 2;
H++) H++)
if (TimeTable[Day][H].NumColumns == TT_MAX_COLUMNS_PER_CELL) if (TimeTable[Day][H].NumColumns == TT_MAX_COLUMNS_PER_CELL)
break; break;
MaxDuration = H - Hour; MaxDuration = H - HourOld;
if (MaxDuration > 1) if (MaxDuration > 1)
fprintf (Gbl.F.Out,"1:00"); fprintf (Gbl.F.Out,"1:00");
else else
@ -1318,20 +1333,20 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
fprintf (Gbl.F.Out,"<select name=\"ModTTDur\" style=\"width:57px;\"" fprintf (Gbl.F.Out,"<select name=\"ModTTDur\" style=\"width:57px;\""
" onchange=\"document.getElementById('%s').submit();\">", " onchange=\"document.getElementById('%s').submit();\">",
Gbl.Form.Id); Gbl.Form.Id);
for (H = Hour + TimeTable[Day][Hour].Columns[Column].Duration; for (H = HourOld + TimeTable[Day][HourOld].Columns[Column].DurationOld;
H < TT_HOURS_PER_DAY * 2; H < TT_HOURS_PER_DAY * 2;
H++) H++)
if (TimeTable[Day][H].NumColumns == TT_MAX_COLUMNS_PER_CELL) if (TimeTable[Day][H].NumColumns == TT_MAX_COLUMNS_PER_CELL)
break; break;
MaxDuration = H - Hour; MaxDuration = H - HourOld;
if (TimeTable[Day][Hour].Columns[Column].Duration > MaxDuration) if (TimeTable[Day][HourOld].Columns[Column].DurationOld > MaxDuration)
MaxDuration = TimeTable[Day][Hour].Columns[Column].Duration; MaxDuration = TimeTable[Day][HourOld].Columns[Column].DurationOld;
for (Dur = 0; for (Dur = 0;
Dur <= MaxDuration; Dur <= MaxDuration;
Dur++) Dur++)
{ {
fprintf (Gbl.F.Out,"<option"); fprintf (Gbl.F.Out,"<option");
if (Dur == Duration) if (Dur == DurationOld)
fprintf (Gbl.F.Out," selected=\"selected\""); fprintf (Gbl.F.Out," selected=\"selected\"");
fprintf (Gbl.F.Out,">%u:%02u h</option>", fprintf (Gbl.F.Out,">%u:%02u h</option>",
Dur / 2, Dur / 2,

View File

@ -39,9 +39,9 @@
#define TT_NUM_TIMETABLE_TYPES 3 #define TT_NUM_TIMETABLE_TYPES 3
typedef enum typedef enum
{ {
TT_COURSE_TIMETABLE = 0, TT_COURSE_TIMETABLE = 0,
TT_MY_TIMETABLE = 1, TT_MY_TIMETABLE = 1,
TT_TUTOR_TIMETABLE = 2, TT_TUTORING_TIMETABLE = 2,
} TT_TimeTableType_t; } TT_TimeTableType_t;
typedef enum typedef enum
@ -54,11 +54,11 @@ typedef enum
#define TT_NUM_CLASS_TYPES 4 #define TT_NUM_CLASS_TYPES 4
typedef enum typedef enum
{ {
TT_NO_CLASS = 0, TT_FREE = 0,
TT_THEORY_CLASS = 1, TT_LECTURE = 1,
TT_PRACT_CLASS = 2, TT_PRACTICAL = 2,
TT_TUTOR_CLASS = 3, TT_TUTORING = 3,
} TT_ClassType_t; } TT_ClassTypeOld_t;
/*****************************************************************************/ /*****************************************************************************/
/****************************** Public prototypes ****************************/ /****************************** Public prototypes ****************************/