Version19.31.19

This commit is contained in:
Antonio Cañas Vargas 2019-10-07 23:02:50 +02:00
parent 0d2202bb72
commit 11a1a2f04b
4 changed files with 200 additions and 208 deletions

View File

@ -410,15 +410,21 @@ static void Att_ShowOneAttEvent (struct AttendanceEvent *Att,bool ShowOnlyThisAt
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
StartEndTime++)
{
fprintf (Gbl.F.Out,"<td id=\"att_date_%u_%u\" class=\"%s LEFT_BOTTOM",
(unsigned) StartEndTime,UniqueId,
Att->Hidden ? (Att->Open ? "DATE_GREEN_LIGHT" :
"DATE_RED_LIGHT") :
(Att->Open ? "DATE_GREEN" :
"DATE_RED"));
if (!ShowOnlyThisAttEventComplete)
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"\">");
if (ShowOnlyThisAttEventComplete)
Tbl_StartCellAttr ("id=\"att_date_%u_%u\" class=\"%s LEFT_BOTTOM\"",
(unsigned) StartEndTime,UniqueId,
Att->Hidden ? (Att->Open ? "DATE_GREEN_LIGHT" :
"DATE_RED_LIGHT") :
(Att->Open ? "DATE_GREEN" :
"DATE_RED"));
else
Tbl_StartCellAttr ("id=\"att_date_%u_%u\" class=\"%s LEFT_BOTTOM COLOR%u\"",
(unsigned) StartEndTime,UniqueId,
Att->Hidden ? (Att->Open ? "DATE_GREEN_LIGHT" :
"DATE_RED_LIGHT") :
(Att->Open ? "DATE_GREEN" :
"DATE_RED"),
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"<script type=\"text/javascript\">"
"writeLocalDateHMSFromUTC('att_date_%u_%u',%ld,"
"%u,'<br />','%s',true,true,0x7);"
@ -429,10 +435,10 @@ static void Att_ShowOneAttEvent (struct AttendanceEvent *Att,bool ShowOnlyThisAt
}
/* Attendance event title */
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP");
if (!ShowOnlyThisAttEventComplete)
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"\">");
if (ShowOnlyThisAttEventComplete)
Tbl_StartCellAttr ("class=\"LEFT_TOP\"");
else
Tbl_StartCellAttr ("class=\"LEFT_TOP COLOR%u\"",Gbl.RowEvenOdd);
Lay_StartArticle (Anchor);
Att_PutLinkAttEvent (Att,Txt_View_event,Att->Title,
Att->Hidden ? "ASG_TITLE_LIGHT" :
@ -441,14 +447,16 @@ static void Att_ShowOneAttEvent (struct AttendanceEvent *Att,bool ShowOnlyThisAt
Tbl_EndCell ();
/* Number of students in this event */
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP",
Att->Hidden ? "ASG_TITLE_LIGHT" :
"ASG_TITLE");
if (!ShowOnlyThisAttEventComplete)
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"\">"
"%u",
Att->NumStdsTotal);
if (ShowOnlyThisAttEventComplete)
Tbl_StartCellAttr ("class=\"%s RIGHT_TOP\"",
Att->Hidden ? "ASG_TITLE_LIGHT" :
"ASG_TITLE");
else
Tbl_StartCellAttr ("class=\"%s RIGHT_TOP COLOR%u\"",
Att->Hidden ? "ASG_TITLE_LIGHT" :
"ASG_TITLE",
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"%u",Att->NumStdsTotal);
Tbl_EndCell ();
Tbl_EndRow ();
@ -456,14 +464,12 @@ static void Att_ShowOneAttEvent (struct AttendanceEvent *Att,bool ShowOnlyThisAt
/***** Write second row of data of this attendance event *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td colspan=\"2\" class=\"LEFT_TOP");
if (!ShowOnlyThisAttEventComplete)
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"\">");
/* Author of the attendance event */
if (ShowOnlyThisAttEventComplete)
Tbl_StartCellAttr ("colspan=\"2\" class=\"LEFT_TOP\"");
else
Tbl_StartCellAttr ("colspan=\"2\" class=\"LEFT_TOP COLOR%u\"",Gbl.RowEvenOdd);
Att_WriteAttEventAuthor (Att);
Tbl_EndCell ();
/* Text of the attendance event */
@ -471,20 +477,16 @@ static void Att_ShowOneAttEvent (struct AttendanceEvent *Att,bool ShowOnlyThisAt
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
Description,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to recpectful HTML
Str_InsertLinks (Description,Cns_MAX_BYTES_TEXT,60); // Insert links
fprintf (Gbl.F.Out,"<td colspan=\"2\" class=\"LEFT_TOP");
if (!ShowOnlyThisAttEventComplete)
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"\">");
if (ShowOnlyThisAttEventComplete)
Tbl_StartCellAttr ("colspan=\"2\" class=\"LEFT_TOP\"");
else
Tbl_StartCellAttr ("colspan=\"2\" class=\"LEFT_TOP COLOR%u\"",Gbl.RowEvenOdd);
if (Gbl.Crs.Grps.NumGrps)
Att_GetAndWriteNamesOfGrpsAssociatedToAttEvent (Att);
fprintf (Gbl.F.Out,"<div class=\"%s\">%s</div>",
Att->Hidden ? "DAT_LIGHT" :
"DAT",
Description);
Tbl_EndCell ();
Tbl_EndRow ();
@ -1101,12 +1103,12 @@ void Att_RequestCreatOrEditAttEvent (void)
/***** Attendance event title *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"RIGHT_TOP\">");
Tbl_StartCellAttr ("class=\"RIGHT_TOP\"");
fprintf (Gbl.F.Out,"<label for=\"Title\" class=\"%s\">%s:</label>",
The_ClassFormInBox[Gbl.Prefs.Theme],Txt_Title);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP\">");
Tbl_StartCellAttr ("class=\"LEFT_TOP\"");
fprintf (Gbl.F.Out,"<input type=\"text\" id=\"Title\" name=\"Title\""
" size=\"45\" maxlength=\"%u\" value=\"%s\""
" required=\"required\" />",
@ -1121,12 +1123,12 @@ void Att_RequestCreatOrEditAttEvent (void)
/***** Visibility of comments *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"RIGHT_TOP\">");
Tbl_StartCellAttr ("class=\"RIGHT_TOP\"");
fprintf (Gbl.F.Out,"<label for=\"ComTchVisible\" class=\"%s\">%s:</label>",
The_ClassFormInBox[Gbl.Prefs.Theme],Txt_Teachers_comment);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP\">");
Tbl_StartCellAttr ("class=\"LEFT_TOP\"");
fprintf (Gbl.F.Out,"<select id=\"ComTchVisible\" name=\"ComTchVisible\">");
fprintf (Gbl.F.Out,"<option value=\"N\"");
@ -1148,12 +1150,12 @@ void Att_RequestCreatOrEditAttEvent (void)
/***** Attendance event description *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"RIGHT_TOP\">");
Tbl_StartCellAttr ("class=\"RIGHT_TOP\"");
fprintf (Gbl.F.Out,"<label for=\"Txt\" class=\"%s\">%s:</label>",
The_ClassFormInBox[Gbl.Prefs.Theme],Txt_Description);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP\">");
Tbl_StartCellAttr ("class=\"LEFT_TOP\"");
fprintf (Gbl.F.Out,"<textarea id=\"Txt\" name=\"Txt\""
" cols=\"60\" rows=\"5\">");
if (!ItsANewAttEvent)
@ -1199,19 +1201,18 @@ static void Att_ShowLstGrpsToEditAttEvent (long AttCod)
/***** Start box and table *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP\">",
The_ClassFormInBox[Gbl.Prefs.Theme]);
Tbl_StartCellAttr ("class=\"%s RIGHT_TOP\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
fprintf (Gbl.F.Out,"%s:",Txt_Groups);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP\">");
Tbl_StartCellAttr ("class=\"LEFT_TOP\"");
Box_StartBoxTable ("100%",NULL,NULL,
NULL,Box_NOT_CLOSABLE,0);
/***** First row: checkbox to select the whole course *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td colspan=\"7\" class=\"DAT LEFT_MIDDLE\">");
Tbl_StartCellAttr ("colspan=\"7\" class=\"DAT LEFT_MIDDLE\"");
fprintf (Gbl.F.Out,"<label>"
"<input type=\"checkbox\" id=\"WholeCrs\" name=\"WholeCrs\" value=\"Y\"");
if (!Att_CheckIfAttEventIsAssociatedToGrps (AttCod))
@ -2098,21 +2099,17 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
/***** Icon to show if the user is already present *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"BT%u\">",
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"<label for=\"Std%u\">",
NumUsr);
Tbl_StartCellAttr ("class=\"BT%u\"",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"<label for=\"Std%u\">",NumUsr);
Att_PutCheckOrCross (Present);
fprintf (Gbl.F.Out,"</label>");
Tbl_EndCell ();
/***** Checkbox to select user *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_TOP COLOR%u\">",
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"<input type=\"checkbox\" id=\"Std%u\" name=\"UsrCodStd\""
" value=\"%s\"",
NumUsr,
UsrDat->EncryptedUsrCod);
Tbl_StartCellAttr ("class=\"CENTER_TOP COLOR%u\"",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"<input type=\"checkbox\""
" id=\"Std%u\" name=\"UsrCodStd\" value=\"%s\"",
NumUsr,UsrDat->EncryptedUsrCod);
if (Present) // This student has attended to the event?
fprintf (Gbl.F.Out," checked=\"checked\"");
if (!ICanChangeStdAttendance)
@ -2121,18 +2118,17 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
Tbl_EndCell ();
/***** Write number of student in the list *****/
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">",
UsrDat->Accepted ? "DAT_N" :
"DAT",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"%s RIGHT_TOP COLOR%u\">",
UsrDat->Accepted ? "DAT_N" :
"DAT",
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"%u",NumUsr);
Tbl_EndCell ();
/***** Show student's photo *****/
if (Gbl.Usrs.Listing.WithPhotos)
{
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"LEFT_TOP COLOR%u\">",Gbl.RowEvenOdd);
ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (UsrDat,PhotoURL);
Pho_ShowUsrPhoto (UsrDat,ShowPhoto ? PhotoURL :
NULL,
@ -2141,18 +2137,18 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
}
/***** Write user's ID ******/
fprintf (Gbl.F.Out,"<td class=\"%s LEFT_TOP COLOR%u\">",
UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"%s LEFT_TOP COLOR%u\">",
UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL",
Gbl.RowEvenOdd);
ID_WriteUsrIDs (UsrDat,NULL);
Tbl_EndCell ();
/***** Write student's name *****/
fprintf (Gbl.F.Out,"<td class=\"%s LEFT_TOP COLOR%u\">",
UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"%s LEFT_TOP COLOR%u\"",
UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL",
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"%s",UsrDat->Surname1);
if (UsrDat->Surname2[0])
fprintf (Gbl.F.Out," %s",UsrDat->Surname2);
@ -2160,8 +2156,7 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
Tbl_EndCell ();
/***** Student's comment: write form or text */
fprintf (Gbl.F.Out,"<td class=\"DAT_SMALL LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"DAT_SMALL LEFT_TOP COLOR%u\"",Gbl.RowEvenOdd);
if (ICanEditStdComment) // Show with form
fprintf (Gbl.F.Out,"<textarea name=\"CommentStd%ld\""
" cols=\"40\" rows=\"3\">"
@ -2177,8 +2172,7 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
Tbl_EndCell ();
/***** Teacher's comment: write form, text or nothing */
fprintf (Gbl.F.Out,"<td class=\"DAT_SMALL LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"DAT_SMALL LEFT_TOP COLOR%u\"",Gbl.RowEvenOdd);
if (ICanEditTchComment) // Show with form
fprintf (Gbl.F.Out,"<textarea name=\"CommentTch%ld\""
" cols=\"40\" rows=\"3\">"
@ -3146,8 +3140,7 @@ static void Att_ListEventsToSelect (Att_TypeOfView_t TypeOfView)
/* Write a row for this event */
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_TOP COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"DAT CENTER_TOP COLOR%u\"",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"<input type=\"checkbox\""
" id=\"Att%u\" name=\"AttCods\" value=\"%ld\"",
NumAttEvent,
@ -3157,14 +3150,12 @@ static void Att_ListEventsToSelect (Att_TypeOfView_t TypeOfView)
fprintf (Gbl.F.Out," />");
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT RIGHT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"DAT RIGHT_TOP COLOR%u\"",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"<label for=\"Att%u\">%u:</label>",
NumAttEvent,NumAttEvent + 1);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"DAT LEFT_TOP COLOR%u\"",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"<label for=\"Att%u\">"
"<span id=\"att_date_start_%u\"></span>"
"</label>"
@ -3177,13 +3168,11 @@ static void Att_ListEventsToSelect (Att_TypeOfView_t TypeOfView)
(unsigned) Gbl.Prefs.DateFormat,Txt_Today);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"DAT LEFT_TOP COLOR%u\"",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"%s",Gbl.AttEvents.Lst[NumAttEvent].Title);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT RIGHT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"DAT RIGHT_TOP COLOR%u\"",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"%u",Gbl.AttEvents.Lst[NumAttEvent].NumStdsTotal);
Tbl_EndCell ();
@ -3195,7 +3184,7 @@ static void Att_ListEventsToSelect (Att_TypeOfView_t TypeOfView)
{
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td colspan=\"5\" class=\"CENTER_MIDDLE\">");
Tbl_StartCellAttr ("colspan=\"5\" class=\"CENTER_MIDDLE\"");
Frm_LinkFormSubmitAnimated (Txt_Update_attendance,
The_ClassFormInBoxBold[Gbl.Prefs.Theme],
NULL);
@ -3281,9 +3270,9 @@ static void Att_ListUsrsAttendanceTable (Att_TypeOfView_t TypeOfView,
{
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td colspan=\"%u\" class=\"DAT_N_LINE_TOP RIGHT_MIDDLE\">",
Gbl.Usrs.Listing.WithPhotos ? 4 :
3);
Tbl_StartCellAttr ("colspan=\"%u\" class=\"DAT_N_LINE_TOP RIGHT_MIDDLE\"",
Gbl.Usrs.Listing.WithPhotos ? 4 :
3);
fprintf (Gbl.F.Out,"%s:",Txt_Number_of_users);
Tbl_EndCell ();
@ -3292,7 +3281,7 @@ static void Att_ListUsrsAttendanceTable (Att_TypeOfView_t TypeOfView,
NumAttEvent++)
if (Gbl.AttEvents.Lst[NumAttEvent].Selected)
{
fprintf (Gbl.F.Out,"<td class=\"DAT_N_LINE_TOP RIGHT_MIDDLE\">");
Tbl_StartCellAttr ("class=\"DAT_N_LINE_TOP RIGHT_MIDDLE\"");
fprintf (Gbl.F.Out,"%u",
Gbl.AttEvents.Lst[NumAttEvent].NumStdsFromList);
Tbl_EndCell ();
@ -3300,7 +3289,7 @@ static void Att_ListUsrsAttendanceTable (Att_TypeOfView_t TypeOfView,
Total += Gbl.AttEvents.Lst[NumAttEvent].NumStdsFromList;
}
fprintf (Gbl.F.Out,"<td class=\"DAT_N_LINE_TOP RIGHT_MIDDLE\">");
Tbl_StartCellAttr ("class=\"DAT_N_LINE_TOP RIGHT_MIDDLE\"");
fprintf (Gbl.F.Out,"%u",Total);
Tbl_EndCell ();
@ -3383,19 +3372,18 @@ static void Att_WriteRowUsrSeveralAttEvents (unsigned NumUsr,struct UsrData *Usr
/***** Write number of user in the list *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_MIDDLE COLOR%u\">",
UsrDat->Accepted ? "DAT_N" :
"DAT",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"%s RIGHT_MIDDLE COLOR%u\"",
UsrDat->Accepted ? "DAT_N" :
"DAT",
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"%u",NumUsr + 1);
Tbl_EndCell ();
/***** Show user's photo *****/
if (Gbl.Usrs.Listing.WithPhotos)
{
fprintf (Gbl.F.Out,"<td class=\"LEFT_MIDDLE COLOR%u\""
" style=\"width:22px;\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"LEFT_MIDDLE COLOR%u\" style=\"width:22px;\"",
Gbl.RowEvenOdd);
ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (UsrDat,PhotoURL);
Pho_ShowUsrPhoto (UsrDat,ShowPhoto ? PhotoURL :
NULL,
@ -3404,18 +3392,18 @@ static void Att_WriteRowUsrSeveralAttEvents (unsigned NumUsr,struct UsrData *Usr
}
/***** Write user's ID ******/
fprintf (Gbl.F.Out,"<td class=\"%s LEFT_MIDDLE COLOR%u\">",
UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"%s LEFT_MIDDLE COLOR%u\">",
UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL",
Gbl.RowEvenOdd);
ID_WriteUsrIDs (UsrDat,NULL);
Tbl_EndCell ();
/***** Write user's name *****/
fprintf (Gbl.F.Out,"<td class=\"%s LEFT_MIDDLE COLOR%u\">",
UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"%s LEFT_MIDDLE COLOR%u\"",
UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL",
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"%s",UsrDat->Surname1);
if (UsrDat->Surname2[0])
fprintf (Gbl.F.Out," %s",UsrDat->Surname2);
@ -3435,7 +3423,7 @@ static void Att_WriteRowUsrSeveralAttEvents (unsigned NumUsr,struct UsrData *Usr
UsrDat->UsrCod);
/* Write check or cross */
fprintf (Gbl.F.Out,"<td class=\"BM%u\">",Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"BM%u\"",Gbl.RowEvenOdd);
Att_PutCheckOrCross (Present);
Tbl_EndCell ();
@ -3444,8 +3432,7 @@ static void Att_WriteRowUsrSeveralAttEvents (unsigned NumUsr,struct UsrData *Usr
}
/***** Last column with the number of times this user is present *****/
fprintf (Gbl.F.Out,"<td class=\"DAT_N RIGHT_MIDDLE COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"DAT_N RIGHT_MIDDLE COLOR%u\"",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"%u",NumTimesPresent);
Tbl_EndCell ();
@ -3545,16 +3532,15 @@ static void Att_ListAttEventsForAStd (unsigned NumUsr,struct UsrData *UsrDat)
NumUsr++;
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_MIDDLE COLOR%u\">",
UsrDat->Accepted ? "DAT_N" :
"DAT",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"%s RIGHT_MIDDLE COLOR%u\"",
UsrDat->Accepted ? "DAT_N" :
"DAT",
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"%u:",NumUsr);
Tbl_EndCell ();
/***** Show student's photo *****/
fprintf (Gbl.F.Out,"<td colspan=\"2\" class=\"RIGHT_MIDDLE COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("colspan=\"2\" class=\"RIGHT_MIDDLE COLOR%u\"",Gbl.RowEvenOdd);
ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (UsrDat,PhotoURL);
Pho_ShowUsrPhoto (UsrDat,ShowPhoto ? PhotoURL :
NULL,
@ -3562,21 +3548,20 @@ static void Att_ListAttEventsForAStd (unsigned NumUsr,struct UsrData *UsrDat)
Tbl_EndCell ();
/***** Write user's ID ******/
fprintf (Gbl.F.Out,"<td class=\"LEFT_MIDDLE COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"LEFT_MIDDLE COLOR%u\"",Gbl.RowEvenOdd);
Tbl_StartTable ();
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"%s LEFT_MIDDLE\">",
UsrDat->Accepted ? "DAT_N" :
"DAT");
Tbl_StartCellAttr ("class=\"%s LEFT_MIDDLE\"",
UsrDat->Accepted ? "DAT_N" :
"DAT");
ID_WriteUsrIDs (UsrDat,NULL);
Tbl_EndCell ();
/***** Write student's name *****/
fprintf (Gbl.F.Out,"<td class=\"%s LEFT_MIDDLE\">",
UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL");
Tbl_StartCellAttr ("class=\"%s LEFT_MIDDLE\"",
UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL");
fprintf (Gbl.F.Out,"%s",UsrDat->Surname1);
if (UsrDat->Surname2[0])
fprintf (Gbl.F.Out," %s",UsrDat->Surname2);
@ -3610,20 +3595,18 @@ static void Att_ListAttEventsForAStd (unsigned NumUsr,struct UsrData *UsrDat)
Tbl_PutEmptyColouredCells (1);
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">",
Present ? "DAT_GREEN" :
"DAT_RED",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"%s RIGHT_TOP COLOR%u\"",
Present ? "DAT_GREEN" :
"DAT_RED",
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"%u:",NumAttEvent + 1);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"BT%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"BT%u\"",Gbl.RowEvenOdd);
Att_PutCheckOrCross (Present);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"DAT LEFT_TOP COLOR%u\"",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"<span id=\"att_date_start_%u_%u\"></span>"
"<br />%s"
"<script type=\"text/javascript\">"
@ -3646,12 +3629,10 @@ static void Att_ListAttEventsForAStd (unsigned NumUsr,struct UsrData *UsrDat)
Tbl_PutEmptyColouredCells (2);
fprintf (Gbl.F.Out,"<td class=\"BT%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"BT%u\"",Gbl.RowEvenOdd);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_MIDDLE COLOR%u\">",
Gbl.RowEvenOdd);
Tbl_StartCellAttr ("class=\"DAT LEFT_MIDDLE COLOR%u\"",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"<dl>");
if (ShowCommentStd)
{

View File

@ -422,12 +422,13 @@ static void Ban_ListBannersForEdition (void)
/* Put icon to remove banner */
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"BM\">");
Tbl_StartCellAttr ("class=\"BM\"");
Ico_PutContextualIconToRemove (ActRemBan,Ban_PutParamBanCodToEdit);
Tbl_EndCell ();
/* Put icon to hide/show banner */
fprintf (Gbl.F.Out,"<td class=\"BM\">");
Tbl_StartCellAttr ("class=\"BM\"");
if (Ban->Hidden)
Ico_PutContextualIconToUnhide (ActShoBan,Anchor,Ban_PutParamBanCodToEdit);
else
@ -435,16 +436,16 @@ static void Ban_ListBannersForEdition (void)
Tbl_EndCell ();
/* Banner code */
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_MIDDLE\">",
Ban->Hidden ? "DAT_LIGHT" :
"DAT");
Tbl_StartCellAttr ("class=\"%s RIGHT_MIDDLE\"",
Ban->Hidden ? "DAT_LIGHT" :
"DAT");
Lay_StartArticle (Anchor);
fprintf (Gbl.F.Out,"%ld",Ban->BanCod);
Lay_EndArticle ();
Tbl_EndCell ();
/* Banner short name */
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">");
Tbl_StartCellAttr ("class=\"CENTER_MIDDLE\"");
Frm_StartForm (ActRenBanSho);
Ban_PutParamBanCodToEdit ();
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"ShortName\""
@ -456,7 +457,7 @@ static void Ban_ListBannersForEdition (void)
Tbl_EndCell ();
/* Banner full name */
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">");
Tbl_StartCellAttr ("class=\"CENTER_MIDDLE\"");
Frm_StartForm (ActRenBanFul);
Ban_PutParamBanCodToEdit ();
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"FullName\""
@ -468,7 +469,7 @@ static void Ban_ListBannersForEdition (void)
Tbl_EndCell ();
/* Banner image */
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">");
Tbl_StartCellAttr ("class=\"CENTER_MIDDLE\"");
Frm_StartForm (ActChgBanImg);
Ban_PutParamBanCodToEdit ();
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"Img\""
@ -479,7 +480,7 @@ static void Ban_ListBannersForEdition (void)
Tbl_EndCell ();
/* Banner WWW */
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">");
Tbl_StartCellAttr ("class=\"CENTER_MIDDLE\"");
Frm_StartForm (ActChgBanWWW);
Ban_PutParamBanCodToEdit ();
fprintf (Gbl.F.Out,"<input type=\"url\" name=\"WWW\""
@ -489,6 +490,7 @@ static void Ban_ListBannersForEdition (void)
Cns_MAX_CHARS_WWW,Ban->WWW,Gbl.Form.Id);
Frm_EndForm ();
Tbl_EndCell ();
Tbl_EndRow ();
/* Free anchor string */
@ -865,15 +867,18 @@ static void Ban_PutFormToCreateBanner (void)
/***** Banner code *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"BM\">");
Tbl_StartCellAttr ("class=\"BM\"");
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"BM\">");
Tbl_StartCellAttr ("class=\"BM\"");
Tbl_EndCell ();
Tbl_PutEmptyCells (1);
/***** Banner short name *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">"
"<input type=\"text\" name=\"ShortName\""
Tbl_StartCellAttr ("class=\"CENTER_MIDDLE\"");
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"ShortName\""
" maxlength=\"%u\" value=\"%s\""
" class=\"INPUT_SHORT_NAME\""
" required=\"required\" />",
@ -881,8 +886,8 @@ static void Ban_PutFormToCreateBanner (void)
Tbl_EndCell ();
/***** Banner full name *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">"
"<input type=\"text\" name=\"FullName\""
Tbl_StartCellAttr ("class=\"CENTER_MIDDLE\"");
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"FullName\""
" maxlength=\"%u\" value=\"%s\""
" class=\"INPUT_FULL_NAME\""
" required=\"required\" />",
@ -890,21 +895,22 @@ static void Ban_PutFormToCreateBanner (void)
Tbl_EndCell ();
/***** Banner image *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">"
"<input type=\"text\" name=\"Img\""
Tbl_StartCellAttr ("class=\"CENTER_MIDDLE\"");
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"Img\""
" size=\"12\" maxlength=\"%u\" value=\"%s\""
" required=\"required\" />",
Ban_MAX_CHARS_IMAGE,Ban_EditingBan->Img);
Tbl_EndCell ();
/***** Banner WWW *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">"
"<input type=\"url\" name=\"WWW\""
Tbl_StartCellAttr ("class=\"CENTER_MIDDLE\"");
fprintf (Gbl.F.Out,"<input type=\"url\" name=\"WWW\""
" maxlength=\"%u\" value=\"%s\""
" class=\"INPUT_WWW\""
" required=\"required\" />",
Cns_MAX_CHARS_WWW,Ban_EditingBan->WWW);
Tbl_EndCell ();
Tbl_EndRow ();
/***** End table, send button and end box *****/

View File

@ -209,16 +209,15 @@ void Ctr_SeeCtrWithPendingDegs (void)
/* Centre logo and full name */
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"LEFT_MIDDLE %s\">",
BgColor);
Tbl_StartCellAttr ("class=\"LEFT_MIDDLE %s\"",BgColor);
Ctr_DrawCentreLogoAndNameWithLink (&Ctr,ActSeeDeg,
"DAT_NOBR","CENTER_MIDDLE");
Tbl_EndCell ();
/* Number of pending degrees (row[1]) */
fprintf (Gbl.F.Out,"<td class=\"DAT RIGHT_MIDDLE %s\">"
"%s",
BgColor,row[1]);
Tbl_StartCellAttr ("class=\"DAT RIGHT_MIDDLE %s\"",BgColor);
fprintf (Gbl.F.Out,"%s",row[1]);
Tbl_EndCell ();
Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd;
@ -409,13 +408,14 @@ static void Ctr_Configuration (bool PrintView)
/***** Institution *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"RIGHT_MIDDLE\">"
"<label for=\"OthInsCod\" class=\"%s\">%s:</label>",
Tbl_StartCellAttr ("class=\"RIGHT_MIDDLE\"");
fprintf (Gbl.F.Out,"<label for=\"OthInsCod\" class=\"%s\">%s:</label>",
The_ClassFormInBox[Gbl.Prefs.Theme],
Txt_Institution);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT_N LEFT_MIDDLE\">");
Tbl_StartCellAttr ("class=\"DAT_N LEFT_MIDDLE\"");
if (!PrintView &&
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)
// Only system admins can move a centre to another institution
@ -445,19 +445,20 @@ static void Ctr_Configuration (bool PrintView)
}
else // I can not move centre to another institution
fprintf (Gbl.F.Out,"%s",Gbl.Hierarchy.Ins.FullName);
Tbl_EndCell ();
Tbl_EndRow ();
/***** Centre full name *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"RIGHT_MIDDLE\">"
"<label for=\"FullName\" class=\"%s\">%s:</label>",
Tbl_StartCellAttr ("class=\"RIGHT_MIDDLE\"");
fprintf (Gbl.F.Out,"<label for=\"FullName\" class=\"%s\">%s:</label>",
The_ClassFormInBox[Gbl.Prefs.Theme],
Txt_Centre);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT_N LEFT_MIDDLE\">");
Tbl_StartCellAttr ("class=\"DAT_N LEFT_MIDDLE\"");
if (!PrintView &&
Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM)
// Only institution admins and system admins can edit centre full name
@ -477,17 +478,19 @@ static void Ctr_Configuration (bool PrintView)
else // I can not edit centre full name
fprintf (Gbl.F.Out,"%s",Gbl.Hierarchy.Ctr.FullName);
Tbl_EndCell ();
Tbl_EndRow ();
/***** Centre short name *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"RIGHT_MIDDLE\">"
"<label for=\"ShortName\" class=\"%s\">%s:</label>",
Tbl_StartCellAttr ("class=\"RIGHT_MIDDLE\"");
fprintf (Gbl.F.Out,"<label for=\"ShortName\" class=\"%s\">%s:</label>",
The_ClassFormInBox[Gbl.Prefs.Theme],
Txt_Short_name);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT_N LEFT_MIDDLE\">");
Tbl_StartCellAttr ("class=\"DAT_N LEFT_MIDDLE\"");
if (!PrintView &&
Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM)
// Only institution admins and system admins can edit centre short name
@ -507,19 +510,19 @@ static void Ctr_Configuration (bool PrintView)
else // I can not edit centre short name
fprintf (Gbl.F.Out,"%s",Gbl.Hierarchy.Ctr.ShrtName);
Tbl_EndCell ();
Tbl_EndRow ();
/***** Place *****/
Plc.PlcCod = Gbl.Hierarchy.Ctr.PlcCod;
Plc_GetDataOfPlaceByCod (&Plc);
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_MIDDLE\">"
"%s:",
The_ClassFormInBox[Gbl.Prefs.Theme],
Txt_Place);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_MIDDLE\">");
Tbl_StartCellAttr ("class=\"%s RIGHT_MIDDLE\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
fprintf (Gbl.F.Out,"%s:",Txt_Place);
Tbl_EndCell ();
Tbl_StartCellAttr ("class=\"DAT LEFT_MIDDLE\"");
if (!PrintView &&
Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM)
// Only centre admins, institution admins and system admins
@ -555,17 +558,19 @@ static void Ctr_Configuration (bool PrintView)
else // I can not change centre place
fprintf (Gbl.F.Out,"%s",Plc.FullName);
Tbl_EndCell ();
Tbl_EndRow ();
/***** Centre WWW *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"RIGHT_MIDDLE\">"
"<label for=\"WWW\" class=\"%s\">%s:</label>",
Tbl_StartCellAttr ("class=\"RIGHT_MIDDLE\"");
fprintf (Gbl.F.Out,"<label for=\"WWW\" class=\"%s\">%s:</label>",
The_ClassFormInBox[Gbl.Prefs.Theme],
Txt_Web);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"LEFT_MIDDLE\">");
Tbl_StartCellAttr ("class=\"LEFT_MIDDLE\"");
if (!PrintView &&
Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM)
// Only centre admins, institution admins and system admins
@ -591,17 +596,18 @@ static void Ctr_Configuration (bool PrintView)
Gbl.Hierarchy.Ctr.WWW,
Gbl.Hierarchy.Ctr.WWW);
Tbl_EndCell ();
Tbl_EndRow ();
/***** Shortcut to the centre *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_MIDDLE\">"
"%s:",
The_ClassFormInBox[Gbl.Prefs.Theme],
Txt_Shortcut);
Tbl_StartCellAttr ("class=\"%s RIGHT_MIDDLE\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
fprintf (Gbl.F.Out,"%s:",Txt_Shortcut);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_MIDDLE\">"
"<a href=\"%s/%s?ctr=%ld\" class=\"DAT\" target=\"_blank\">"
Tbl_StartCellAttr ("class=\"DAT LEFT_MIDDLE\"");
fprintf (Gbl.F.Out,"<a href=\"%s/%s?ctr=%ld\" class=\"DAT\" target=\"_blank\">"
"%s/%s?ctr=%ld"
"</a>",
Cfg_URL_SWAD_CGI,
@ -611,6 +617,7 @@ static void Ctr_Configuration (bool PrintView)
Lan_STR_LANG_ID[Gbl.Prefs.Language],
Gbl.Hierarchy.Ctr.CtrCod);
Tbl_EndCell ();
Tbl_EndRow ();
if (PrintView)
@ -618,13 +625,11 @@ static void Ctr_Configuration (bool PrintView)
/***** QR code with link to the centre *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_MIDDLE\">"
"%s:",
The_ClassFormInBox[Gbl.Prefs.Theme],
Txt_QR_code);
Tbl_StartCellAttr ("class=\"%s RIGHT_MIDDLE\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
fprintf (Gbl.F.Out,"%s:",Txt_QR_code);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_MIDDLE\">");
Tbl_StartCellAttr ("class=\"DAT LEFT_MIDDLE\"");
QR_LinkTo (250,"ctr",Gbl.Hierarchy.Ctr.CtrCod);
Tbl_EndCell ();
@ -634,27 +639,26 @@ static void Ctr_Configuration (bool PrintView)
{
/***** Number of users who claim to belong to this centre *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_MIDDLE\">"
"%s:",
The_ClassFormInBox[Gbl.Prefs.Theme],
Txt_Users_of_the_centre);
Tbl_StartCellAttr ("class=\"%s RIGHT_MIDDLE\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
fprintf (Gbl.F.Out,"%s:",Txt_Users_of_the_centre);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_MIDDLE\">"
"%u",
Usr_GetNumUsrsWhoClaimToBelongToCtr (Gbl.Hierarchy.Ctr.CtrCod));
Tbl_StartCellAttr ("class=\"DAT LEFT_MIDDLE\"");
fprintf (Gbl.F.Out,"%u",Usr_GetNumUsrsWhoClaimToBelongToCtr (Gbl.Hierarchy.Ctr.CtrCod));
Tbl_EndCell ();
Tbl_EndRow ();
/***** Number of degrees *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_MIDDLE\">"
"%s:",
The_ClassFormInBox[Gbl.Prefs.Theme],
Txt_Degrees);
Tbl_StartCellAttr ("class=\"%s RIGHT_MIDDLE\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
fprintf (Gbl.F.Out,"%s:",Txt_Degrees);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"LEFT_MIDDLE\">");
/* Form to go to see degrees of this centre */
Tbl_StartCellAttr ("class=\"LEFT_MIDDLE\"");
Frm_StartFormGoTo (ActSeeDeg);
Ctr_PutParamCtrCod (Gbl.Hierarchy.Ctr.CtrCod);
snprintf (Gbl.Title,sizeof (Gbl.Title),
@ -664,21 +668,21 @@ static void Ctr_Configuration (bool PrintView)
fprintf (Gbl.F.Out,"%u</a>",
Deg_GetNumDegsInCtr (Gbl.Hierarchy.Ctr.CtrCod));
Frm_EndForm ();
Tbl_EndCell ();
Tbl_EndRow ();
/***** Number of courses *****/
Tbl_StartRow ();
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_MIDDLE\">"
"%s:",
The_ClassFormInBox[Gbl.Prefs.Theme],
Txt_Courses);
Tbl_StartCellAttr ("class=\"%s RIGHT_MIDDLE\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
fprintf (Gbl.F.Out,"%s:",Txt_Courses);
Tbl_EndCell ();
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_MIDDLE\">"
"%u",
Crs_GetNumCrssInCtr (Gbl.Hierarchy.Ctr.CtrCod));
Tbl_StartCellAttr ("class=\"DAT LEFT_MIDDLE\"");
fprintf (Gbl.F.Out,"%u",Crs_GetNumCrssInCtr (Gbl.Hierarchy.Ctr.CtrCod));
Tbl_EndCell ();
Tbl_EndRow ();
/***** Number of users in courses of this centre *****/

View File

@ -487,7 +487,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.31.18 (2019-10-07)"
#define Log_PLATFORM_VERSION "SWAD 19.31.19 (2019-10-07)"
#define CSS_FILE "swad19.29.css"
#define JS_FILE "swad19.30.js"
/*
@ -495,6 +495,7 @@ ps2pdf source.ps destination.pdf
// TODO: Un TFG preasignado sin estudiante tiene que salir un triángulo amarillo
// TODO: Hacer un nuevo rol en los TFG: tutor externo (profesor de áreas no vinculadas con el centro, profesionales de empresas, etc.)
Version 19.31.19: Oct 07, 2019 Code refactoring in HTML tables. (247211 lines)
Version 19.31.18: Oct 07, 2019 Code refactoring in HTML tables. (247239 lines)
Version 19.31.17: Oct 07, 2019 Code refactoring in HTML tables. (247221 lines)
Version 19.31.16: Oct 07, 2019 Code refactoring in HTML tables. (247185 lines)