diff --git a/js/swad16.99.js b/js/swad16.101.js similarity index 99% rename from js/swad16.99.js rename to js/swad16.101.js index 0fd4b3bf..0bf920cb 100644 --- a/js/swad16.99.js +++ b/js/swad16.101.js @@ -163,6 +163,7 @@ function setLocalDateTimeFormFromUTC (id,TimeUTC) { var d; var Year; var YearIsValid = false; + var Min; if (TimeUTC) { d = new Date(); @@ -174,11 +175,18 @@ function setLocalDateTimeFormFromUTC (id,TimeUTC) { YearIsValid = true; } if (YearIsValid) { - FormMon.options[d.getMonth() ].selected = true; - FormDay.options[d.getDate()-1 ].selected = true; - FormHou.options[d.getHours() ].selected = true; - FormMin.options[d.getMinutes()].selected = true; - FormSec.options[d.getSeconds()].selected = true; + FormMon.options[d.getMonth() ].selected = true; + FormDay.options[d.getDate()-1].selected = true; + FormHou.options[d.getHours() ].selected = true; + + Min = d.getMinutes(); + for (var i=FormMin.options.length-1; i>=0; i--) + if (FormMin.options[i].value <= Min) { + FormMin.options[i].selected = true; + break; + } + if (FormSec) + FormSec.options[d.getSeconds()].selected = true; } } diff --git a/swad_agenda.c b/swad_agenda.c index e4e7a3fe..d2d7afd3 100644 --- a/swad_agenda.c +++ b/swad_agenda.c @@ -391,8 +391,8 @@ static void Agd_ShowEventsToday (Agd_AgendaType_t AgendaType) static void Agd_WriteHeaderListEvents (Agd_AgendaType_t AgendaType) { - extern const char *Txt_ASG_ATT_SVY_OR_AGD_HELP_ORDER[2]; - extern const char *Txt_ASG_ATT_SVY_OR_AGD_ORDER[2]; + extern const char *Txt_START_END_TIME_HELP[2]; + extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; extern const char *Txt_Event; extern const char *Txt_Location; Agd_Order_t Order; @@ -422,10 +422,10 @@ static void Agd_WriteHeaderListEvents (Agd_AgendaType_t AgendaType) } Pag_PutHiddenParamPagNum (Gbl.Pag.CurrentPage); Par_PutHiddenParamUnsigned ("Order",(unsigned) Order); - Act_LinkFormSubmit (Txt_ASG_ATT_SVY_OR_AGD_HELP_ORDER[Order],"TIT_TBL",NULL); + Act_LinkFormSubmit (Txt_START_END_TIME_HELP[Order],"TIT_TBL",NULL); if (Order == Gbl.Agenda.SelectedOrderType) fprintf (Gbl.F.Out,""); - fprintf (Gbl.F.Out,"%s",Txt_ASG_ATT_SVY_OR_AGD_ORDER[Order]); + fprintf (Gbl.F.Out,"%s",Txt_START_END_TIME[Order]); if (Order == Gbl.Agenda.SelectedOrderType) fprintf (Gbl.F.Out,""); fprintf (Gbl.F.Out,""); diff --git a/swad_assignment.c b/swad_assignment.c index d0041fc7..d035fefd 100644 --- a/swad_assignment.c +++ b/swad_assignment.c @@ -114,13 +114,13 @@ static void Asg_ShowAllAssignments (void) { extern const char *Hlp_ASSESSMENT_Assignments; extern const char *Txt_Assignments; - extern const char *Txt_ASG_ATT_SVY_OR_AGD_HELP_ORDER[2]; - extern const char *Txt_ASG_ATT_SVY_OR_AGD_ORDER[2]; + extern const char *Txt_START_END_TIME_HELP[Dat_NUM_START_END_TIME]; + extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; extern const char *Txt_Assignment; extern const char *Txt_Upload_files_QUESTION; extern const char *Txt_Folder; extern const char *Txt_No_assignments; - tAsgsOrderType Order; + Dat_StartEndTime_t Order; struct Pagination Pagination; unsigned NumAsg; @@ -150,8 +150,8 @@ static void Asg_ShowAllAssignments (void) /***** Table head *****/ fprintf (Gbl.F.Out,"" ""); - for (Order = Asg_ORDER_BY_START_DATE; - Order <= Asg_ORDER_BY_END_DATE; + for (Order = Dat_START_TIME; + Order <= Dat_END_TIME; Order++) { fprintf (Gbl.F.Out,"
"); @@ -159,10 +159,10 @@ static void Asg_ShowAllAssignments (void) Grp_PutParamWhichGrps (); Pag_PutHiddenParamPagNum (Gbl.Pag.CurrentPage); Par_PutHiddenParamUnsigned ("Order",(unsigned) Order); - Act_LinkFormSubmit (Txt_ASG_ATT_SVY_OR_AGD_HELP_ORDER[Order],"TIT_TBL",NULL); + Act_LinkFormSubmit (Txt_START_END_TIME_HELP[Order],"TIT_TBL",NULL); if (Order == Gbl.Asgs.SelectedOrderType) fprintf (Gbl.F.Out,""); - fprintf (Gbl.F.Out,"%s",Txt_ASG_ATT_SVY_OR_AGD_ORDER[Order]); + fprintf (Gbl.F.Out,"%s",Txt_START_END_TIME[Order]); if (Order == Gbl.Asgs.SelectedOrderType) fprintf (Gbl.F.Out,""); fprintf (Gbl.F.Out,""); @@ -326,7 +326,7 @@ static void Asg_ShowOneAssignment (long AsgCod) (Asg.Open ? "DATE_GREEN" : "DATE_RED"), Gbl.RowEvenOdd, - UniqueId,Asg.TimeUTC[Asg_START_TIME],Txt_Today); + UniqueId,Asg.TimeUTC[Dat_START_TIME],Txt_Today); /* End date/time */ UniqueId++; @@ -342,7 +342,7 @@ static void Asg_ShowOneAssignment (long AsgCod) (Asg.Open ? "DATE_GREEN" : "DATE_RED"), Gbl.RowEvenOdd, - UniqueId,Asg.TimeUTC[Asg_END_TIME],Txt_Today); + UniqueId,Asg.TimeUTC[Dat_END_TIME],Txt_Today); /* Assignment title */ fprintf (Gbl.F.Out,"" @@ -520,7 +520,7 @@ static void Asg_GetParamAsgOrderType (void) Par_GetParToText ("Order",UnsignedStr,10); if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1) - Gbl.Asgs.SelectedOrderType = (tAsgsOrderType) UnsignedNum; + Gbl.Asgs.SelectedOrderType = (Dat_StartEndTime_t) UnsignedNum; else Gbl.Asgs.SelectedOrderType = Asg_DEFAULT_ORDER_TYPE; } @@ -618,10 +618,10 @@ void Asg_GetListAssignments (void) } switch (Gbl.Asgs.SelectedOrderType) { - case Asg_ORDER_BY_START_DATE: + case Dat_START_TIME: sprintf (OrderBySubQuery,"StartTime DESC,EndTime DESC,Title DESC"); break; - case Asg_ORDER_BY_END_DATE: + case Dat_END_TIME: sprintf (OrderBySubQuery,"EndTime DESC,StartTime DESC,Title DESC"); break; } @@ -731,8 +731,8 @@ static void Asg_GetDataOfAssignment (struct Assignment *Asg,const char *Query) Asg->AsgCod = -1L; Asg->Hidden = false; Asg->UsrCod = -1L; - Asg->TimeUTC[Asg_START_TIME] = - Asg->TimeUTC[Asg_END_TIME ] = (time_t) 0; + Asg->TimeUTC[Dat_START_TIME] = + Asg->TimeUTC[Dat_END_TIME ] = (time_t) 0; Asg->Open = false; Asg->Title[0] = '\0'; Asg->SendWork = false; @@ -757,10 +757,10 @@ static void Asg_GetDataOfAssignment (struct Assignment *Asg,const char *Query) Asg->UsrCod = Str_ConvertStrCodToLongCod (row[2]); /* Get start date (row[3] holds the start UTC time) */ - Asg->TimeUTC[Asg_START_TIME] = Dat_GetUNIXTimeFromStr (row[3]); + Asg->TimeUTC[Dat_START_TIME] = Dat_GetUNIXTimeFromStr (row[3]); /* Get end date (row[4] holds the end UTC time) */ - Asg->TimeUTC[Asg_END_TIME ] = Dat_GetUNIXTimeFromStr (row[4]); + Asg->TimeUTC[Dat_END_TIME ] = Dat_GetUNIXTimeFromStr (row[4]); /* Get whether the assignment is open or closed (row(5)) */ Asg->Open = (row[5][0] == '1'); @@ -1090,8 +1090,8 @@ void Asg_RequestCreatOrEditAsg (void) { /* Initialize to empty assignment */ Asg.AsgCod = -1L; - Asg.TimeUTC[Asg_START_TIME] = Gbl.StartExecutionTimeUTC; - Asg.TimeUTC[Asg_END_TIME ] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours + Asg.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC; + Asg.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours Asg.Open = true; Asg.Title[0] = '\0'; Asg.SendWork = false; @@ -1275,8 +1275,8 @@ void Asg_RecFormAssignment (void) } /***** Get start/end date-times *****/ - NewAsg.TimeUTC[Asg_START_TIME] = Dat_GetTimeUTCFromForm ("StartTimeUTC"); - NewAsg.TimeUTC[Asg_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" ); + NewAsg.TimeUTC[Dat_START_TIME] = Dat_GetTimeUTCFromForm ("StartTimeUTC"); + NewAsg.TimeUTC[Dat_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" ); /***** Get assignment title *****/ Par_GetParToText ("Title",NewAsg.Title,Asg_MAX_LENGTH_ASSIGNMENT_TITLE); @@ -1290,10 +1290,10 @@ void Asg_RecFormAssignment (void) Par_GetParToHTML ("Txt",Txt,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) /***** Adjust dates *****/ - if (NewAsg.TimeUTC[Asg_START_TIME] == 0) - NewAsg.TimeUTC[Asg_START_TIME] = Gbl.StartExecutionTimeUTC; - if (NewAsg.TimeUTC[Asg_END_TIME] == 0) - NewAsg.TimeUTC[Asg_END_TIME] = NewAsg.TimeUTC[Asg_START_TIME] + 2*60*60; // +2 hours + if (NewAsg.TimeUTC[Dat_START_TIME] == 0) + NewAsg.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC; + if (NewAsg.TimeUTC[Dat_END_TIME] == 0) + NewAsg.TimeUTC[Dat_END_TIME] = NewAsg.TimeUTC[Dat_START_TIME] + 2*60*60; // +2 hours /***** Check if title is correct *****/ if (NewAsg.Title[0]) // If there's an assignment title @@ -1420,8 +1420,8 @@ static void Asg_CreateAssignment (struct Assignment *Asg,const char *Txt) "'%s','%s','%s')", Gbl.CurrentCrs.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod, - Asg->TimeUTC[Asg_START_TIME], - Asg->TimeUTC[Asg_END_TIME ], + Asg->TimeUTC[Dat_START_TIME], + Asg->TimeUTC[Dat_END_TIME ], Asg->Title, Asg->Folder, Txt); @@ -1446,8 +1446,8 @@ static void Asg_UpdateAssignment (struct Assignment *Asg,const char *Txt) "EndTime=FROM_UNIXTIME('%ld')," "Title='%s',Folder='%s',Txt='%s'" " WHERE AsgCod='%ld' AND CrsCod='%ld'", - Asg->TimeUTC[Asg_START_TIME], - Asg->TimeUTC[Asg_END_TIME ], + Asg->TimeUTC[Dat_START_TIME], + Asg->TimeUTC[Dat_END_TIME ], Asg->Title, Asg->Folder, Txt, diff --git a/swad_assignment.h b/swad_assignment.h index 8c1fc918..7ce63601 100644 --- a/swad_assignment.h +++ b/swad_assignment.h @@ -45,19 +45,12 @@ typedef enum Asg_SEND_WORK = 1, } Asg_SendWork_t; -#define Asg_NUM_DATES 2 -typedef enum - { - Asg_START_TIME = 0, - Asg_END_TIME = 1, - } Asg_StartOrEndTime_t; - struct Assignment { long AsgCod; bool Hidden; long UsrCod; - time_t TimeUTC[Asg_NUM_DATES]; + time_t TimeUTC[Dat_NUM_START_END_TIME]; bool Open; char Title[Asg_MAX_LENGTH_ASSIGNMENT_TITLE+1]; Asg_SendWork_t SendWork; @@ -68,13 +61,7 @@ struct Assignment // I belong to any of the groups) }; -typedef enum - { - Asg_ORDER_BY_START_DATE = 0, - Asg_ORDER_BY_END_DATE = 1, - } tAsgsOrderType; - -#define Asg_DEFAULT_ORDER_TYPE Asg_ORDER_BY_START_DATE +#define Asg_DEFAULT_ORDER_TYPE Dat_START_TIME /*****************************************************************************/ /***************************** Public prototypes *****************************/ diff --git a/swad_attendance.c b/swad_attendance.c index 1f396dbb..26d90899 100644 --- a/swad_attendance.c +++ b/swad_attendance.c @@ -194,12 +194,12 @@ static void Att_ShowAllAttEvents (void) { extern const char *Hlp_USERS_Attendance; extern const char *Txt_Events; - extern const char *Txt_ASG_ATT_SVY_OR_AGD_HELP_ORDER[2]; - extern const char *Txt_ASG_ATT_SVY_OR_AGD_ORDER[2]; + extern const char *Txt_START_END_TIME_HELP[Dat_NUM_START_END_TIME]; + extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; extern const char *Txt_Event; extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; extern const char *Txt_No_events; - Att_EventsOrderType_t Order; + Dat_StartEndTime_t Order; struct Pagination Pagination; unsigned NumAttEvent; bool ICanEdit = (Gbl.Usrs.Me.LoggedRole == Rol_TEACHER || @@ -230,8 +230,8 @@ static void Att_ShowAllAttEvents (void) /***** Table head *****/ fprintf (Gbl.F.Out,"" ""); - for (Order = Att_ORDER_BY_START_DATE; - Order <= Att_ORDER_BY_END_DATE; + for (Order = Dat_START_TIME; + Order <= Dat_END_TIME; Order++) { fprintf (Gbl.F.Out,"" "" "
"); @@ -239,10 +239,10 @@ static void Att_ShowAllAttEvents (void) Grp_PutParamWhichGrps (); Pag_PutHiddenParamPagNum (Gbl.Pag.CurrentPage); Par_PutHiddenParamUnsigned ("Order",(unsigned) Order); - Act_LinkFormSubmit (Txt_ASG_ATT_SVY_OR_AGD_HELP_ORDER[Order],"TIT_TBL",NULL); + Act_LinkFormSubmit (Txt_START_END_TIME_HELP[Order],"TIT_TBL",NULL); if (Order == Gbl.AttEvents.SelectedOrderType) fprintf (Gbl.F.Out,""); - fprintf (Gbl.F.Out,"%s",Txt_ASG_ATT_SVY_OR_AGD_ORDER[Order]); + fprintf (Gbl.F.Out,"%s",Txt_START_END_TIME[Order]); if (Order == Gbl.AttEvents.SelectedOrderType) fprintf (Gbl.F.Out,""); fprintf (Gbl.F.Out,""); @@ -520,7 +520,7 @@ static void Att_GetParamAttOrderType (void) Par_GetParToText ("Order",UnsignedStr,10); if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1) - Gbl.AttEvents.SelectedOrderType = (Att_EventsOrderType_t) UnsignedNum; + Gbl.AttEvents.SelectedOrderType = (Dat_StartEndTime_t) UnsignedNum; else Gbl.AttEvents.SelectedOrderType = Att_DEFAULT_ORDER_TYPE; } @@ -652,13 +652,13 @@ static void Att_GetListAttEvents (Att_OrderTime_t Order) } switch (Gbl.AttEvents.SelectedOrderType) { - case Att_ORDER_BY_START_DATE: + case Dat_START_TIME: if (Order == Att_NEWEST_FIRST) sprintf (OrderBySubQuery,"StartTime DESC,EndTime DESC,Title DESC"); else sprintf (OrderBySubQuery,"StartTime,EndTime,Title"); break; - case Att_ORDER_BY_END_DATE: + case Dat_END_TIME: if (Order == Att_NEWEST_FIRST) sprintf (OrderBySubQuery,"EndTime DESC,StartTime DESC,Title DESC"); else diff --git a/swad_attendance.h b/swad_attendance.h index e5d27c0f..48c98d2f 100644 --- a/swad_attendance.h +++ b/swad_attendance.h @@ -58,19 +58,13 @@ struct AttendanceEvent bool Selected; // I have selected this attendance event }; -typedef enum - { - Att_ORDER_BY_START_DATE = 0, - Att_ORDER_BY_END_DATE = 1, - } Att_EventsOrderType_t; - typedef enum { Att_NEWEST_FIRST, Att_OLDEST_FIRST, } Att_OrderTime_t; -#define Att_DEFAULT_ORDER_TYPE Att_ORDER_BY_START_DATE +#define Att_DEFAULT_ORDER_TYPE Dat_START_TIME /*****************************************************************************/ /***************************** Public prototypes *****************************/ diff --git a/swad_changelog.h b/swad_changelog.h index 650a022d..58226112 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -187,13 +187,15 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 16.100.1 (2016-12-13)" +#define Log_PLATFORM_VERSION "SWAD 16.101 (2016-12-14)" #define CSS_FILE "swad16.97.css" -#define JS_FILE "swad16.99.js" +#define JS_FILE "swad16.101.js" // 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 /* + Version 16.101: Dec 14, 2016 Interval in range of times is 5 minutes when no seconds needed. + Code refactoring related to start and end date-time. (210806 lines) Version 16.100.1: Dec 13, 2016 Fixed bugs checking if users share courses. (210828 lines) Version 16.100: Dec 13, 2016 Changes in layout of list of attendance events. Code refactoring related with roles. (210820 lines) diff --git a/swad_date.c b/swad_date.c index a5e0b3a8..0a5fb562 100644 --- a/swad_date.c +++ b/swad_date.c @@ -219,8 +219,7 @@ void Dat_ConvDateToDateStr (struct Date *Date,char *DateStr) void Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (void) { extern const char *The_ClassForm[The_NUM_THEMES]; - extern const char *Txt_Start_date; - extern const char *Txt_End_date; + extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; extern const char *Txt_Yesterday; extern const char *Txt_Today; @@ -231,7 +230,7 @@ void Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (void) "" "", The_ClassForm[Gbl.Prefs.Theme], - Txt_Start_date); + Txt_START_END_TIME[Dat_START_TIME]); /* Date-time */ Dat_WriteFormClientLocalDateTimeFromTimeUTC ("Start", "Start", @@ -260,7 +259,7 @@ void Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (void) "", The_ClassForm[Gbl.Prefs.Theme], - Txt_End_date); + Txt_START_END_TIME[Dat_END_TIME]); /* Date-time */ Dat_WriteFormClientLocalDateTimeFromTimeUTC ("End", "End", @@ -282,23 +281,17 @@ void Dat_PutFormStartEndClientLocalDateTimes (time_t TimeUTC[2], Dat_FormSeconds FormSeconds) { extern const char *The_ClassForm[The_NUM_THEMES]; - extern const char *Txt_Start_date; - extern const char *Txt_End_date; - Asg_StartOrEndTime_t StartOrEndTime; - const char *Id[Asg_NUM_DATES] = + extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; + Dat_StartEndTime_t StartEndTime; + const char *Id[Dat_NUM_START_END_TIME] = { - "Start", - "End" - }; - const char *Dates[Asg_NUM_DATES] = - { - Txt_Start_date, - Txt_End_date + "Start", // Dat_START_TIME + "End" // Dat_END_TIME }; - for (StartOrEndTime = 0; - StartOrEndTime <= 1; - StartOrEndTime++) + for (StartEndTime = Dat_START_TIME; + StartEndTime <= Dat_END_TIME; + StartEndTime++) { fprintf (Gbl.F.Out,"
" @@ -308,12 +301,12 @@ void Dat_PutFormStartEndClientLocalDateTimes (time_t TimeUTC[2], "" "" "
", - The_ClassForm[Gbl.Prefs.Theme],Dates[StartOrEndTime]); + The_ClassForm[Gbl.Prefs.Theme],Txt_START_END_TIME[StartEndTime]); /* Date-time */ - Dat_WriteFormClientLocalDateTimeFromTimeUTC (Id[StartOrEndTime], - Id[StartOrEndTime], - TimeUTC[StartOrEndTime], + Dat_WriteFormClientLocalDateTimeFromTimeUTC (Id[StartEndTime], + Id[StartEndTime], + TimeUTC[StartEndTime], Gbl.Now.Date.Year - 1, Gbl.Now.Date.Year + 1, FormSeconds, @@ -346,6 +339,12 @@ void Dat_WriteFormClientLocalDateTimeFromTimeUTC (const char *Id, unsigned Hour; unsigned Minute; unsigned Second; + unsigned MinutesIInterval[Dat_NUM_FORM_SECONDS] = + { + 5, // Dat_FORM_SECONDS_OFF + 1, // Dat_FORM_SECONDS_ON + }; + /***** Start table *****/ fprintf (Gbl.F.Out,"" @@ -432,11 +431,13 @@ void Dat_WriteFormClientLocalDateTimeFromTimeUTC (const char *Id, fprintf (Gbl.F.Out,"document.getElementById('%s').submit();", Gbl.Form.Id); fprintf (Gbl.F.Out,"\">"); + for (Minute = 0; - Minute <= 59; - Minute++) + Minute < 60; + Minute += MinutesIInterval[FormSeconds]) fprintf (Gbl.F.Out,"", Minute,Minute); + fprintf (Gbl.F.Out,"" ""); @@ -1130,10 +1131,10 @@ continue: 181f: ba 1f 85 eb 51 mov $0x51eb851f,%edx // 1374389535 - 1824: 8d 0c 70 lea (SumAux,Month,2),Sum // Sum = Day + Year + 2 + Month*2 + 1824: 8d 0c 70 lea (SumAux,Month,2),n // n = Day + Year + 2 + Month*2 1827: 89 f8 mov Year,%eax 1829: c1 e8 02 shr $2,%eax // Year / 4 - 182c: 01 c1 add %eax,Sum // Sum = Day + Year + 2 + Month*2 + Year/4 + 182c: 01 c1 add %eax,n // n = Day + Year + 2 + Month*2 + Year/4 182e: 89 f8 mov Year,%eax 1830: bf 25 49 92 24 mov $0x24924925,%edi // 613566757 1835: f7 e2 mul %edx // Year * 1374389535 @@ -1141,26 +1142,28 @@ continue: 1837: 89 d0 mov %edx,%eax // (Year * 1374389535) / 2^32 = (Year * 2^32 * 2^5 / 100) / 2^32 = (Year * 2^5) / 100 1839: c1 ea 05 shr $5,%edx // (Year * 1374389535) / 2^32 / 2^5 = Year / 100 183c: c1 e8 07 shr $7,%eax // (Year * 1374389535) / 2^32 / 2^7 = Year / 400 - 183f: 01 c1 add %eax,Sum // Sum = Day + Year + 2 + Month*2 + Year/4 + Year/400 + 183f: 01 c1 add %eax,n // n = Day + Year + 2 + Month*2 + Year/4 + Year/400 1841: 8d 44 76 03 lea 3(Month,Month,2),%eax // Month*3 + 3 - 1845: 29 d1 sub %edx,Sum // Sum = Day + Year + 2 + Month*2 + Year/4 + Year/400 - Year/100 + 1845: 29 d1 sub %edx,n // n = Day + Year + 2 + Month*2 + Year/4 + Year/400 - Year/100 1847: ba cd cc cc cc mov $0xcccccccd,%edx 184c: f7 e2 mul %edx // (Month*3 + 3) * 3435973837 184e: c1 ea 02 shr $2,%edx // (Month*3 + 3) * 3435973837 / 2^32 / 2^2 = (Month*3 + 3) / 5 - 1851: 01 d1 add %edx,Sum // Sum = Day + Year + 2 + Month*2 + Year/4 + Year/400 - Year/100 + (Month*3 + 3) / 5 + 1851: 01 d1 add %edx,n // n = Day + Year + 2 + Month*2 + Year/4 + Year/400 - Year/100 + (Month*3 + 3) / 5 - 1853: 89 c8 mov Sum,%eax - 1855: 89 ce mov Sum,%esi + 1853: 89 c8 mov n,%eax + 1855: 89 ce mov n,%esi - 1857: f7 e7 mul %edi // edx = Sum * 613566757 / 2^32 - 1859: 29 d6 sub %edx,%esi // - 185b: d1 ee shr %esi // - 185d: 01 f2 add %esi,%edx // - 185f: c1 ea 02 shr $2,%edx // - 1862: 8d 04 d5 00 00 00 00 lea 0(,%rdx,8),%eax // - 1869: 29 d0 sub %edx,%eax // - 186b: 29 c1 sub %eax,Sum // Sum % 7 + // Algorithm for remainder: https://doc.lagout.org/security/Hackers%20Delight.pdf, page 209 + + 1857: f7 e7 mul %edi // edx = q = M*n/2**32 + 1859: 29 d6 sub %edx,%esi // esi = t = n - q + 185b: d1 ee shr %esi // esi = t = (n - q)/2 + 185d: 01 f2 add %esi,%edx // edx = t = (n - q)/2 + q = (n + q)/2 + 185f: c1 ea 02 shr $2,%edx // edx = q = (n + q)/8 = (n+Mn/2**32)/8 = floor(n/7) + 1862: 8d 04 d5 00 00 00 00 lea 0(,%rdx,8),%eax // eax = q*8 + 1869: 29 d0 sub %edx,%eax // eax = q*8-q = q*7 + 186b: 29 c1 sub %eax,%ecx // ecx = r = n - q*7 186d: 83 c1 05 add $5,Mod // Mod += 5 1870: 89 c8 mov Mod,%eax diff --git a/swad_date.h b/swad_date.h index c1166cbe..1d39a46c 100644 --- a/swad_date.h +++ b/swad_date.h @@ -77,6 +77,14 @@ typedef enum Dat_FUTURE = 2, } Dat_TimeStatus_t; +#define Dat_NUM_START_END_TIME 2 +typedef enum + { + Dat_START_TIME = 0, + Dat_END_TIME = 1, + } Dat_StartEndTime_t; + +#define Dat_NUM_FORM_SECONDS 2 typedef enum { Dat_FORM_SECONDS_OFF, diff --git a/swad_file_browser.c b/swad_file_browser.c index ceaf4c1c..da2c9989 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -6155,7 +6155,7 @@ static void Brw_WriteDatesAssignment (void) "%ld,', ','%s',true,false,true);" "", UniqueId, - (long) Gbl.FileBrowser.Asg.TimeUTC[Asg_START_TIME],Txt_Today); + (long) Gbl.FileBrowser.Asg.TimeUTC[Dat_START_TIME],Txt_Today); fprintf (Gbl.F.Out,""); /***** Arrow *****/ @@ -6176,7 +6176,7 @@ static void Brw_WriteDatesAssignment (void) "%ld,', ','%s',false,false,true);" "", UniqueId, - (long) Gbl.FileBrowser.Asg.TimeUTC[Asg_END_TIME],Txt_Today); + (long) Gbl.FileBrowser.Asg.TimeUTC[Dat_END_TIME],Txt_Today); fprintf (Gbl.F.Out,""); } else diff --git a/swad_global.h b/swad_global.h index e56bb3e3..272e06d8 100644 --- a/swad_global.h +++ b/swad_global.h @@ -550,7 +550,7 @@ struct Globals bool LstIsRead; // Is the list already read from database, or it needs to be read? unsigned Num; // Number of assignments long *LstAsgCods; // List of assigment codes - tAsgsOrderType SelectedOrderType; + Dat_StartEndTime_t SelectedOrderType; long AsgCodToEdit; // Used as parameter in contextual links } Asgs; struct @@ -558,7 +558,7 @@ struct Globals bool LstIsRead; // Is the list already read from database, or it needs to be read? unsigned Num; // Number of attendance events struct AttendanceEvent *Lst; // List of attendance events - Att_EventsOrderType_t SelectedOrderType; + Dat_StartEndTime_t SelectedOrderType; long AttCod; bool ShowDetails; char *StrAttCodsSelected; diff --git a/swad_holiday.c b/swad_holiday.c index f44f74d5..020b2257 100644 --- a/swad_holiday.c +++ b/swad_holiday.c @@ -904,8 +904,7 @@ static void Hld_PutFormToCreateHoliday (void) extern const char *Txt_New_holiday; extern const char *Txt_Place; extern const char *Txt_Type; - extern const char *Txt_Start_date; - extern const char *Txt_End_date; + extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; extern const char *Txt_Holiday; extern const char *Txt_HOLIDAY_TYPES[Hld_NUM_TYPES_HOLIDAY]; extern const char *Txt_Create_holiday; @@ -942,8 +941,8 @@ static void Hld_PutFormToCreateHoliday (void) "", Txt_Place, Txt_Type, - Txt_Start_date, - Txt_End_date, + Txt_START_END_TIME[Dat_START_TIME], + Txt_START_END_TIME[Dat_END_TIME], Txt_Holiday); /***** Holiday place *****/ @@ -1023,8 +1022,7 @@ static void Hld_PutHeadHolidays (void) extern const char *Txt_Code; extern const char *Txt_Place; extern const char *Txt_Type; - extern const char *Txt_Start_date; - extern const char *Txt_End_date; + extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; extern const char *Txt_Holiday; fprintf (Gbl.F.Out,"" @@ -1051,8 +1049,8 @@ static void Hld_PutHeadHolidays (void) Txt_Code, Txt_Place, Txt_Type, - Txt_Start_date, - Txt_End_date, + Txt_START_END_TIME[Dat_START_TIME], + Txt_START_END_TIME[Dat_END_TIME], Txt_Holiday); } diff --git a/swad_survey.c b/swad_survey.c index 0dcb2032..39dd1bba 100644 --- a/swad_survey.c +++ b/swad_survey.c @@ -187,8 +187,8 @@ static void Svy_ListAllSurveys (struct SurveyQuestion *SvyQst) { extern const char *Hlp_STATS_Surveys; extern const char *Txt_Surveys; - extern const char *Txt_ASG_ATT_SVY_OR_AGD_HELP_ORDER[2]; - extern const char *Txt_ASG_ATT_SVY_OR_AGD_ORDER[2]; + extern const char *Txt_START_END_TIME_HELP[Dat_NUM_START_END_TIME]; + extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; extern const char *Txt_Survey; extern const char *Txt_Status; extern const char *Txt_No_surveys; @@ -237,10 +237,10 @@ static void Svy_ListAllSurveys (struct SurveyQuestion *SvyQst) Grp_PutParamWhichGrps (); Pag_PutHiddenParamPagNum (Gbl.Pag.CurrentPage); Par_PutHiddenParamUnsigned ("Order",(unsigned) Order); - Act_LinkFormSubmit (Txt_ASG_ATT_SVY_OR_AGD_HELP_ORDER[Order],"TIT_TBL",NULL); + Act_LinkFormSubmit (Txt_START_END_TIME_HELP[Order],"TIT_TBL",NULL); if (Order == Gbl.Svys.SelectedOrderType) fprintf (Gbl.F.Out,""); - fprintf (Gbl.F.Out,"%s",Txt_ASG_ATT_SVY_OR_AGD_ORDER[Order]); + fprintf (Gbl.F.Out,"%s",Txt_START_END_TIME[Order]); if (Order == Gbl.Svys.SelectedOrderType) fprintf (Gbl.F.Out,""); fprintf (Gbl.F.Out,""); @@ -2163,8 +2163,8 @@ void Svy_RecFormSurvey (void) } /***** Get start/end date-times *****/ - NewSvy.TimeUTC[Asg_START_TIME] = Dat_GetTimeUTCFromForm ("StartTimeUTC"); - NewSvy.TimeUTC[Asg_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" ); + NewSvy.TimeUTC[Dat_START_TIME] = Dat_GetTimeUTCFromForm ("StartTimeUTC"); + NewSvy.TimeUTC[Dat_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" ); /***** Get survey title *****/ Par_GetParToText ("Title",NewSvy.Title,Svy_MAX_LENGTH_SURVEY_TITLE); diff --git a/swad_text.c b/swad_text.c index 44668b23..f86cdeae 100644 --- a/swad_text.c +++ b/swad_text.c @@ -3036,7 +3036,7 @@ const char *Txt_Assignments_and_other_works = "Atividades e outros trabalhos"; #endif -const char *Txt_ASG_ATT_SVY_OR_AGD_HELP_ORDER[2] = +const char *Txt_START_END_TIME_HELP[Dat_NUM_START_END_TIME] = { #if L==1 "Ordenar per data de començament" @@ -3079,7 +3079,7 @@ const char *Txt_ASG_ATT_SVY_OR_AGD_HELP_ORDER[2] = #endif }; -const char *Txt_ASG_ATT_SVY_OR_AGD_ORDER[2] = +const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME] = { #if L==1 "Inici" @@ -37751,27 +37751,6 @@ const char *Txt_Source_of_information = "Fonte de informação"; #endif -const char *Txt_Start_date = -#if L==1 - "Data inicial"; -#elif L==2 - "Startdatum"; -#elif L==3 - "Start date"; -#elif L==4 - "Fecha inicial"; -#elif L==5 - "Date initiale"; -#elif L==6 - "Fecha inicial"; // Okoteve traducción -#elif L==7 - "Data iniziale"; -#elif L==8 - "Data rozpoczęcia"; -#elif L==9 - "Data de início"; -#endif - const char *Txt_STAT_CLICKS_GROUPED_BY[Sta_NUM_CLICKS_GROUPED_BY] = { #if L==1