Version 16.101

This commit is contained in:
Antonio Cañas Vargas 2016-12-15 00:39:52 +01:00
parent 4de0ee76b1
commit d42ab47768
14 changed files with 130 additions and 151 deletions

View File

@ -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;
}
}

View File

@ -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,"<u>");
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,"</u>");
fprintf (Gbl.F.Out,"</a>");

View File

@ -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,"<table class=\"FRAME_TBL_MARGIN CELLS_PAD_2\">"
"<tr>");
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,"<th class=\"LEFT_MIDDLE\">");
@ -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,"<u>");
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,"</u>");
fprintf (Gbl.F.Out,"</a>");
@ -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,"<td class=\"LEFT_TOP COLOR%u\">"
@ -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,

View File

@ -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 *****************************/

View File

@ -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,"<table class=\"FRAME_TBL_MARGIN CELLS_PAD_2\">"
"<tr>");
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,"<th class=\"LEFT_MIDDLE\">");
@ -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,"<u>");
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,"</u>");
fprintf (Gbl.F.Out,"</a>");
@ -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

View File

@ -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 *****************************/

View File

@ -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)

View File

@ -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)
"</td>"
"<td class=\"LEFT_MIDDLE\">",
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)
"</td>"
"<td class=\"LEFT_MIDDLE\">",
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,"<tr>"
"<td class=\"RIGHT_MIDDLE\">"
@ -308,12 +301,12 @@ void Dat_PutFormStartEndClientLocalDateTimes (time_t TimeUTC[2],
"<table class=\"CELLS_PAD_2\">"
"<tr>"
"<td class=\"LEFT_TOP\">",
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,"<table>"
@ -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,"<option value=\"%u\">%02u &#39;</option>",
Minute,Minute);
fprintf (Gbl.F.Out,"</select>"
"</td>");
@ -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

View File

@ -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,

View File

@ -6155,7 +6155,7 @@ static void Brw_WriteDatesAssignment (void)
"%ld,',&nbsp;','%s',true,false,true);"
"</script>",
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,"</span>");
/***** Arrow *****/
@ -6176,7 +6176,7 @@ static void Brw_WriteDatesAssignment (void)
"%ld,',&nbsp;','%s',false,false,true);"
"</script>",
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,"</span>");
}
else

View File

@ -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;

View File

@ -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)
"</tr>",
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,"<tr>"
@ -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);
}

View File

@ -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,"<u>");
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,"</u>");
fprintf (Gbl.F.Out,"</a>");
@ -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);

View File

@ -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&ccedil;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&ccedil;&atilde;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&eogon;cia";
#elif L==9
"Data de in&iacute;cio";
#endif
const char *Txt_STAT_CLICKS_GROUPED_BY[Sta_NUM_CLICKS_GROUPED_BY] =
{
#if L==1