Version19.193.1

This commit is contained in:
acanas 2020-04-23 02:28:28 +02:00
parent 5600f40aea
commit ae8d4978dd
8 changed files with 640 additions and 111 deletions

View File

@ -2743,6 +2743,359 @@ table.CELLS_PAD_10 > tbody > tr > td {padding:10px;}
padding-bottom:20px;
}
/*********************************** Exams ***********************************/
.EXA_BG
{
background-image:url("/swad/icon/bg.jpg");
background-size:cover;
background-repeat:no-repeat;
height:100%;
background-color:white;
}
.EXA_CONT
{
box-sizing:border-box;
display:table;
margin:2%;
width:96%;
}
.EXA_LEFT_TCH
{
box-sizing:border-box;
float:left;
width:20%;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.EXA_LEFT_STD
{
box-sizing:border-box;
float:left;
width:40%;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.EXA_RIGHT_TCH
{
box-sizing:border-box;
display:table;
float:left;
width:80%;
}
.EXA_RIGHT_STD
{
box-sizing:border-box;
display:table;
float:left;
width:60%;
}
.EXA_TOP
{
box-sizing:border-box;
width:100%;
height:64px;
color:#404040;
font-size:16pt;
font-weight:bold;
text-overflow:ellipsis;
}
.EXA_BOTTOM
{
box-sizing:border-box;
width:100%;
}
.EXA_REFRESHABLE_TEACHER
{
box-sizing:border-box;
width:100%;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.EXA_NUM_QST
{
color:#404040;
font-size:32pt;
font-weight:bold;
text-align:center;
vertical-align:top;
}
.EXA_TIME_QST
{
color:#404040;
font-size:16pt;
font-weight:bold;
text-align:center;
vertical-align:top;
}
.EXA_SHOW_HOURGLASS, .EXA_SHOW_ANSWERED, .EXA_REM_MY_ANS, .EXA_SHOW_RESULTS
{
text-align:center;
padding:16pt 0;
}
.EXA_NUM_ANSWERERS
{
text-align:center;
padding:8pt 0;
color:#404040;
font-size:16pt;
}
.EXA_BUTTONS_CONT
{
display:table;
box-sizing:border-box;
width:100%;
padding:20px 0;
}
.EXA_BUTTON_LEFT_CONT
{
display:table;
box-sizing:border-box;
float:left;
width:35%;
text-align:center;
}
.EXA_BUTTON_CENTER_CONT
{
display:table;
box-sizing:border-box;
float:left;
width:30%;
text-align:center;
}
.EXA_BUTTON_RIGHT_CONT
{
display:table;
box-sizing:border-box;
float:left;
width:35%;
text-align:center;
}
.EXA_BIGBUTTON_CONT
{
box-sizing:border-box;
display:inline-block;
font-size:32pt;
font-weight:bold;
padding:2px;
text-align:center;
vertical-align:middle;
}
.EXA_SMALLBUTTON_CONT
{
box-sizing:border-box;
display:inline-block;
font-size:16pt;
font-weight:bold;
padding:2px;
text-align:center;
vertical-align:middle;
}
.EXA_BUTTON_ON, .EXA_BUTTON_OFF
{
display:table-cell;
width:100%;
text-align:center;
vertical-align:middle;
opacity:0.7;
}
.EXA_BUTTON_ON:hover
{
opacity:1;
}
.EXA_BUTTON_HIDDEN
{
display:table-cell;
width:100%;
text-align:center;
vertical-align:middle;
opacity:0.1;
}
.EXA_RED {color:#913b00;}
.EXA_YELLOW {color:#a27600;}
.EXA_LIMEGREEN {color:#636e00;}
.EXA_GREEN {color:#246600;}
.EXA_TCH_STEM
{
color:#202020;
font-size:24pt;
padding-bottom:24pt;
}
.EXA_TCH_ANS
{
color:#202020;
font-size:24pt;
}
.EXA_WAIT_CONT
{
box-sizing:border-box;
margin-top:5%;
text-align:center;
}
.EXA_WAIT_IMG
{
box-sizing:border-box;
width:100px;
}
.EXA_SCO_SCO
{
width:5%;
text-align:right;
vertical-align:middle;
height:10px;
font-size:6pt;
font-weight:bold;
}
.EXA_SCO_NUM
{
width:95%;
text-align:left;
vertical-align:middle;
background:white;
height:10px;
font-size:6pt;
font-weight:bold;
}
.EXA_SCO_BAR
{
display:inline-block;
height:10px;
vertical-align:middle;
}
.EXA_SCO_TOP
{
color:grey;
border-style:solid solid none solid;
border-width:1px;
}
.EXA_SCO_MID
{
color:grey;
border-style:none solid none solid;
border-width:1px;
}
.EXA_SCO_BOT
{
color:grey;
border-style:none solid solid solid;
border-width:1px;
}
.EXA_TCH_BUTTON_TD
{
box-sizing:border-box;
width:84px;
text-align:center;
vertical-align:top;
}
.EXA_TCH_BUTTON
{
box-sizing:border-box;
width:64px;
margin:0 16px;
padding:8px;
border-radius:2px;
border-width:1px;
border-style:solid;
color:rgba(255,255,255,0.75);
font-size:36pt;
font-weight:bold;
line-height:normal;
white-space:nowrap;
}
.EXA_NUM_COL_OFF
{
display:table-cell;
box-sizing:border-box;
padding:6px;
text-align:center;
vertical-align:middle;
border:solid 1px;
border-color:transparent;
}
.EXA_NUM_COL_ON
{
display:table-cell;
box-sizing:border-box;
padding:6px;
text-align:center;
vertical-align:middle;
border:solid 1px;
border-color:#404040;
background-color:rgba(0,0,0,0.1);
}
.EXA_STD_CELL
{
text-align:center;
vertical-align:middle;
}
.EXA_STD_BUTTON
{
box-sizing:border-box;
width:100%;
margin:10px auto;
padding:20px;
border-radius:2px;
border-width:1px;
border-style:solid;
color:rgba(255,255,255,0.75);
font-size:44pt;
font-weight:bold;
line-height:normal;
white-space:nowrap;
}
.EXA_STD_ANSWER_SELECTED
{
box-shadow: 0px 0px 18px 12px rgba(0,128,0,1);
animation:fadeinshadow 1s ease forwards;
}
@keyframes fadeinshadow
{
from {box-shadow:0px 0px 18px 12px rgba(0,128,0,1);}
to {box-shadow:none;}
}
.EXA_RESULT
{
padding:10px 0;
color:#404040;
font-size:16pt;
text-align:left;
vertical-align:top;
}
.EXA_RES_TR
{
height:10px;
}
.EXA_RES_CORRECT
{
width:1%;
background:green;
}
.EXA_RES_WRONG
{
width:1%;
background:red;
}
.EXA_RES_VOID
{
width:1%;
}
/********************************** Matches **********************************/
.MCH_BG
{

View File

@ -547,6 +547,117 @@ function readConnUsrsData () {
}
}
/*****************************************************************************/
/******* Automatic refresh of current exam event question using AJAX *********/
/*****************************************************************************/
// This function must be called from time to time
var objXMLHttpReqExaEvtStd = false;
function refreshExamEventStd () {
objXMLHttpReqExaEvtStd = AJAXCreateObject();
if (objXMLHttpReqExaEvtStd) {
var RefreshParams = RefreshParamNxtActExaEvt + '&' +
RefreshParamExaEvtCod + '&' +
RefreshParamIdSes;
objXMLHttpReqExaEvtStd.onreadystatechange = readExamEventStdData; // onreadystatechange must be lowercase
objXMLHttpReqExaEvtStd.open('POST',ActionAJAX,true);
objXMLHttpReqExaEvtStd.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
objXMLHttpReqExaEvtStd.send(RefreshParams);
}
}
function readExamEventStdData () {
if (objXMLHttpReqExaEvtStd.readyState == 4) { // Check if data have been received
if (objXMLHttpReqExaEvtStd.status == 200) {
var htmlExamEvent = objXMLHttpReqExaEvtStd.responseText; // Get HTML code
var div = document.getElementById('exam_event'); // Access to refreshable DIV
if (div)
div.innerHTML = htmlExamEvent; // Update DIV content
// Global delay variable is set initially in swad-core
setTimeout('refreshExamEventStd()',delayExamEvent);
}
}
}
/*****************************************************************************/
/** Automatic refresh of left part of current exam event question using AJAX **/
/*****************************************************************************/
//This function must be called from time to time
var objXMLHttpReqExaEvtTch = false;
function refreshExamEventTch () {
objXMLHttpReqExaEvtTch = AJAXCreateObject();
if (objXMLHttpReqExaEvtTch) {
var RefreshParams = RefreshParamNxtActExaEvt + '&' +
RefreshParamExaEvtCod + '&' +
RefreshParamIdSes;
objXMLHttpReqExaEvtTch.onreadystatechange = readExamEventTchData; // onreadystatechange must be lowercase
objXMLHttpReqExaEvtTch.open('POST',ActionAJAX,true);
objXMLHttpReqExaEvtTch.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
objXMLHttpReqExaEvtTch.send(RefreshParams);
}
}
function readExamEventTchData () {
if (objXMLHttpReqExaEvtTch.readyState == 4) { // Check if data have been received
if (objXMLHttpReqExaEvtTch.status == 200) {
var endOfId = objXMLHttpReqExaEvtTch.responseText.indexOf('|',0 ); // Get separator position
var endOfEv = objXMLHttpReqExaEvtTch.responseText.indexOf('|',endOfId + 1); // Get separator position
var id = objXMLHttpReqExaEvtTch.responseText.substring(0 ,endOfId); // Get id
var ev = objXMLHttpReqExaEvtTch.responseText.substring(endOfId + 1,endOfEv); // Get ev ('0' / '1')
var html = objXMLHttpReqExaEvtTch.responseText.substring(endOfEv + 1); // Get HTML code
var div = document.getElementById(id); // Access to refreshable DIV
if (div) {
div.innerHTML = html; // Update DIV content
if (parseInt(ev)) { // 0 / 1
// Scripts in div got via AJAX are not executed ==> execute them
evalScriptsInElem (div);
// Process mathematics; see http://docs.mathjax.org/en/latest/advanced/typeset.html
// MathJax.Hub.Queue(["Typeset",MathJax.Hub,div]); // old versions
MathJax.typeset();
}
}
// Global delay variable is set initially in swad-core
setTimeout('refreshExamEventTch()',delayExamEvent);
}
}
}
/*****************************************************************************/
/**************** Update exam event control area using AJAX ******************/
/*****************************************************************************/
// This function is called when user submit a form inside two parent divs
function updateExamEventTch (id,Params) {
var objXMLHttp = false;
objXMLHttp = AJAXCreateObject ();
if (objXMLHttp) {
/* Send request to server */
objXMLHttp.onreadystatechange = function() { // onreadystatechange must be lowercase
if (objXMLHttp.readyState == 4) { // Check if data have been received
if (objXMLHttp.status == 200)
if (id) {
var div = document.getElementById(id); // Access to DIV
if (div)
div.innerHTML = objXMLHttp.responseText; // Update DIV content
}
}
};
objXMLHttp.open('POST',ActionAJAX,true);
objXMLHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
objXMLHttp.send(Params);
}
}
/*****************************************************************************/
/********** Automatic refresh of current match question using AJAX ***********/
/*****************************************************************************/

View File

@ -546,7 +546,7 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActSeeAsg ] = { 801, 1,TabAss,ActSeeAsg ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Asg_SeeAssignments ,"edit" },
[ActSeePrj ] = {1674, 2,TabAss,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_SeeProjects ,"file-invoice" },
[ActReqTst ] = { 103, 3,TabAss,ActReqTst ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_RequestTest ,"check" },
[ActSeeAllExa ] = {1848, 4,TabAss,ActSeeAllExa ,0x200,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Exa_SeeAllExams ,"file-signature" },
[ActSeeAllExa ] = {1848, 4,TabAss,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Exa_SeeAllExams ,"file-signature" },
[ActSeeAllGam ] = {1649, 4,TabAss,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_SeeAllGames ,"gamepad" },
[ActSeeAllSvy ] = { 966, 5,TabAss,ActSeeAllSvy ,0x3F8,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Svy_SeeAllSurveys ,"poll" },
[ActSeeAllExaAnn ] = { 85, 6,TabAss,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaAnn_ListExamAnnouncementsSee,"bullhorn" },

View File

@ -497,9 +497,9 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.193 (2020-04-22)"
#define CSS_FILE "swad19.190.css"
#define JS_FILE "swad19.172.1.js"
#define Log_PLATFORM_VERSION "SWAD 19.193.1 (2020-04-23)"
#define CSS_FILE "swad19.193.1.css"
#define JS_FILE "swad19.193.1.js"
/*
*
Call parameters:
@ -552,6 +552,8 @@ Funci
// TODO: Cambiar icono notificaciones nuevas con "bell-on.svg"
// TODO: Ahmed El Moukhtari Koubaa: Cuando le damos a la opción de mostrar solo los mensajes no leídos, se muestran estos mensajes, pero cuando los intentamos leer, es decir, hacemos clic sobre ellos se recarga toda la página por así decirlo y vuelve a dar una lista con los mensajes, pero descartando aquel que clicamos porque, entiendo yo al menos, que ya lo ha marcado como leído.
Version 19.193.1: Apr 23, 2020 Changes in CSS for exams.
Changes in JavaScript for exams. (297623 lines)
Version 19.193: Apr 22, 2020 Created database tables related to exams. (297127 lines)
2 changes necessary in database:
CREATE TABLE IF NOT EXISTS exa_answers (EvtCod INT NOT NULL,UsrCod INT NOT NULL,QstInd INT NOT NULL,NumOpt TINYINT NOT NULL,AnsInd TINYINT NOT NULL,UNIQUE INDEX(EvtCod,UsrCod,QstInd));

View File

@ -119,7 +119,7 @@ static void ExaEvt_ListOneOrMoreEventsAuthor (const struct ExaEvt_Event *Event);
static void ExaEvt_ListOneOrMoreEventsTimes (const struct ExaEvt_Event *Event,unsigned UniqueId);
static void ExaEvt_ListOneOrMoreEventsTitleGrps (const struct ExaEvt_Event *Event);
static void ExaEvt_GetAndWriteNamesOfGrpsAssociatedToEvent (const struct ExaEvt_Event *Event);
static void ExaEvt_ListOneOrMoreEventsNumPlayers (const struct ExaEvt_Event *Event);
static void ExaEvt_ListOneOrMoreEventsNumParticipants (const struct ExaEvt_Event *Event);
static void ExaEvt_ListOneOrMoreEventsStatus (struct ExaEvt_Event *Event,unsigned NumQsts);
static void ExaEvt_ListOneOrMoreEventsResult (struct Exa_Exams *Exams,
const struct ExaEvt_Event *Event);
@ -221,11 +221,11 @@ static void ExaEvt_PutBigButtonClose (void);
static void ExaEvt_ShowWaitImage (const char *Txt);
static void ExaEvt_RemoveOldPlayers (void);
static void ExaEvt_RemoveOldParticipants (void);
static void ExaEvt_UpdateEventAsBeingPlayed (long EvtCod);
static void ExaEvt_SetEventAsNotBeingPlayed (long EvtCod);
static bool ExaEvt_GetIfEventIsBeingPlayed (long EvtCod);
static void ExaEvt_GetNumPlayers (struct ExaEvt_Event *Event);
static void ExaEvt_GetNumParticipants (struct ExaEvt_Event *Event);
static void ExaEvt_RemoveMyAnswerToEventQuestion (const struct ExaEvt_Event *Event);
@ -397,8 +397,8 @@ void ExaEvt_GetDataOfEventByCod (struct ExaEvt_Event *Event)
Event->Status.QstStartTimeUTC = (time_t) 0;
Event->Status.Showing = ExaEvt_START;
Event->Status.Countdown = -1L;
Event->Status.Playing = false;
Event->Status.NumPlayers = 0;
Event->Status.Happening = false;
Event->Status.NumParticipants = 0;
Event->Status.NumCols = ExaEvt_NUM_COLS_DEFAULT;
Event->Status.ShowQstResults = false;
Event->Status.ShowUsrResults = false;
@ -476,7 +476,7 @@ static void ExaEvt_ListOneOrMoreEvents (struct Exa_Exams *Exams,
if (ICanEditEvents)
ExaEvt_ListOneOrMoreEventsIcons (Exams,&Event);
/* Event player */
/* Event participant */
ExaEvt_ListOneOrMoreEventsAuthor (&Event);
/* Start/end date/time */
@ -485,8 +485,8 @@ static void ExaEvt_ListOneOrMoreEvents (struct Exa_Exams *Exams,
/* Title and groups */
ExaEvt_ListOneOrMoreEventsTitleGrps (&Event);
/* Number of players who have answered any question in the exam event */
ExaEvt_ListOneOrMoreEventsNumPlayers (&Event);
/* Number of participants who have answered any question in the exam event */
ExaEvt_ListOneOrMoreEventsNumParticipants (&Event);
/* Event status */
ExaEvt_ListOneOrMoreEventsStatus (&Event,Exam->NumQsts);
@ -508,8 +508,8 @@ static void ExaEvt_ListOneOrMoreEventsHeading (bool ICanEditEvents)
{
extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
extern const char *Txt_Match;
extern const char *Txt_Players;
extern const char *Txt_Event;
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
extern const char *Txt_Status;
extern const char *Txt_Results;
@ -524,8 +524,8 @@ static void ExaEvt_ListOneOrMoreEventsHeading (bool ICanEditEvents)
HTM_TH (1,1,"LT",Txt_ROLES_SINGUL_Abc[Rol_TCH][Usr_SEX_UNKNOWN]);
HTM_TH (1,1,"LT",Txt_START_END_TIME[Exa_ORDER_BY_START_DATE]);
HTM_TH (1,1,"LT",Txt_START_END_TIME[Exa_ORDER_BY_END_DATE ]);
HTM_TH (1,1,"LT",Txt_Match);
HTM_TH (1,1,"RT",Txt_Players);
HTM_TH (1,1,"LT",Txt_Event);
HTM_TH (1,1,"RT",Txt_ROLES_PLURAL_Abc[Rol_STD][Usr_SEX_UNKNOWN]);
HTM_TH (1,1,"CT",Txt_Status);
HTM_TH (1,1,"CT",Txt_Results);
@ -739,12 +739,12 @@ bool ExaEvt_CheckIfMatchIsAssociatedToGrp (long EvtCod,long GrpCod)
}
/*****************************************************************************/
/******************* Put a column for number of players **********************/
/**************** Put a column for number of participants ********************/
/*****************************************************************************/
static void ExaEvt_ListOneOrMoreEventsNumPlayers (const struct ExaEvt_Event *Event)
static void ExaEvt_ListOneOrMoreEventsNumParticipants (const struct ExaEvt_Event *Event)
{
/***** Number of players who have answered any question in the exam event ******/
/***** Number of participants who have answered any question in the exam event ******/
HTM_TD_Begin ("class=\"DAT RT COLOR%u\"",Gbl.RowEvenOdd);
HTM_Unsigned (ExaEvt_GetNumUsrsWhoHaveAnswerEvt (Event->EvtCod));
HTM_TD_End ();
@ -983,9 +983,9 @@ static void ExaEvt_GetEventDataFromRow (MYSQL_RES *mysql_res,
/***** Get whether the exam event is being played or not *****/
if (Event->Status.Showing == ExaEvt_END) // Event over
Event->Status.Playing = false;
Event->Status.Happening = false;
else // Event not over
Event->Status.Playing = ExaEvt_GetIfEventIsBeingPlayed (Event->EvtCod);
Event->Status.Happening = ExaEvt_GetIfEventIsBeingPlayed (Event->EvtCod);
}
/*****************************************************************************/
@ -1434,10 +1434,10 @@ void ExaEvt_ResumeEvent (void)
{
struct ExaEvt_Event Event;
/***** Remove old players.
/***** Remove old participants.
This function must be called by a teacher
before getting exam event status. *****/
ExaEvt_RemoveOldPlayers ();
ExaEvt_RemoveOldParticipants ();
/***** Get data of the exam event from database *****/
Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed ();
@ -1451,7 +1451,7 @@ void ExaEvt_ResumeEvent (void)
ExaEvt_UpdateEventStatusInDB (&Event);
/***** Show current exam event status *****/
HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\"");
HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\"");
ExaEvt_ShowMatchStatusForTch (&Event);
HTM_DIV_End ();
}
@ -1730,7 +1730,7 @@ static void ExaEvt_UpdateEventStatusInDB (const struct ExaEvt_Event *Event)
char *EvtSubQuery;
/***** Update end time only if exam event is currently being played *****/
if (Event->Status.Playing) // Event is being played
if (Event->Status.Happening) // Event is being played
{
if (asprintf (&EvtSubQuery,"exa_events.EndTime=NOW(),") < 0)
Lay_NotEnoughMemoryExit ();
@ -1763,7 +1763,7 @@ static void ExaEvt_UpdateEventStatusInDB (const struct ExaEvt_Event *Event)
Event->EvtCod,Gbl.Hierarchy.Crs.CrsCod);
free (EvtSubQuery);
if (Event->Status.Playing) // Event is being played
if (Event->Status.Happening) // Event is being played
/* Update exam event as being played */
ExaEvt_UpdateEventAsBeingPlayed (Event->EvtCod);
else // Event is paused, not being played
@ -1778,7 +1778,7 @@ static void ExaEvt_UpdateEventStatusInDB (const struct ExaEvt_Event *Event)
static void ExaEvt_UpdateElapsedTimeInQuestion (const struct ExaEvt_Event *Event)
{
/***** Update elapsed time in current question in database *****/
if (Event->Status.Playing && // Event is being played
if (Event->Status.Happening && // Event is being played
Event->Status.Showing != ExaEvt_START &&
Event->Status.Showing != ExaEvt_END)
DB_QueryINSERT ("can not update elapsed time in question",
@ -1874,28 +1874,28 @@ void ExaEvt_PlayPauseEvent (void)
{
struct ExaEvt_Event Event;
/***** Remove old players.
/***** Remove old participants.
This function must be called by a teacher
before getting exam event status. *****/
ExaEvt_RemoveOldPlayers ();
ExaEvt_RemoveOldParticipants ();
/***** Get data of the exam event from database *****/
Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed ();
ExaEvt_GetDataOfEventByCod (&Event);
/***** Update status *****/
if (Event.Status.Playing) // Event is being played ==> pause it
Event.Status.Playing = false; // Pause exam event
if (Event.Status.Happening) // Event is being played ==> pause it
Event.Status.Happening = false; // Pause exam event
else // Event is paused, not being played ==> play it
/* If not over, update status */
if (Event.Status.Showing != ExaEvt_END) // Event not over
Event.Status.Playing = true; // Start/resume exam event
Event.Status.Happening = true; // Start/resume exam event
/***** Update exam event status in database *****/
ExaEvt_UpdateEventStatusInDB (&Event);
/***** Show current exam event status *****/
HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\"");
HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\"");
ExaEvt_ShowMatchStatusForTch (&Event);
HTM_DIV_End ();
}
@ -1908,10 +1908,10 @@ void ExaEvt_ChangeNumColsEvt (void)
{
struct ExaEvt_Event Event;
/***** Remove old players.
/***** Remove old participants.
This function must be called by a teacher
before getting exam event status. *****/
ExaEvt_RemoveOldPlayers ();
ExaEvt_RemoveOldParticipants ();
/***** Get data of the exam event from database *****/
Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed ();
@ -1928,7 +1928,7 @@ void ExaEvt_ChangeNumColsEvt (void)
ExaEvt_UpdateEventStatusInDB (&Event);
/***** Show current exam event status *****/
HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\"");
HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\"");
ExaEvt_ShowMatchStatusForTch (&Event);
HTM_DIV_End ();
}
@ -1941,10 +1941,10 @@ void ExaEvt_ToggleVisibilResultsEvtQst (void)
{
struct ExaEvt_Event Event;
/***** Remove old players.
/***** Remove old participants.
This function must be called by a teacher
before getting exam event status. *****/
ExaEvt_RemoveOldPlayers ();
ExaEvt_RemoveOldParticipants ();
/***** Get data of the exam event from database *****/
Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed ();
@ -1960,7 +1960,7 @@ void ExaEvt_ToggleVisibilResultsEvtQst (void)
ExaEvt_UpdateEventStatusInDB (&Event);
/***** Show current exam event status *****/
HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\"");
HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\"");
ExaEvt_ShowMatchStatusForTch (&Event);
HTM_DIV_End ();
}
@ -1973,10 +1973,10 @@ void ExaEvt_BackEvent (void)
{
struct ExaEvt_Event Event;
/***** Remove old players.
/***** Remove old participants.
This function must be called by a teacher
before getting exam event status. *****/
ExaEvt_RemoveOldPlayers ();
ExaEvt_RemoveOldParticipants ();
/***** Get data of the exam event from database *****/
Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed ();
@ -1989,7 +1989,7 @@ void ExaEvt_BackEvent (void)
ExaEvt_UpdateEventStatusInDB (&Event);
/***** Show current exam event status *****/
HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\"");
HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\"");
ExaEvt_ShowMatchStatusForTch (&Event);
HTM_DIV_End ();
}
@ -2002,10 +2002,10 @@ void ExaEvt_ForwardEvent (void)
{
struct ExaEvt_Event Event;
/***** Remove old players.
/***** Remove old participants.
This function must be called by a teacher
before getting exam event status. *****/
ExaEvt_RemoveOldPlayers ();
ExaEvt_RemoveOldParticipants ();
/***** Get data of the exam event from database *****/
Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed ();
@ -2018,7 +2018,7 @@ void ExaEvt_ForwardEvent (void)
ExaEvt_UpdateEventStatusInDB (&Event);
/***** Show current exam event status *****/
HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\"");
HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\"");
ExaEvt_ShowMatchStatusForTch (&Event);
HTM_DIV_End ();
}
@ -2077,7 +2077,7 @@ static void ExaEvt_SetMatchStatusToStart (struct ExaEvt_Event *Event)
{
Event->Status.QstInd = 0; // Before first question
Event->Status.QstCod = -1L;
Event->Status.Playing = false;
Event->Status.Happening = false;
Event->Status.Showing = ExaEvt_START;
}
@ -2141,7 +2141,7 @@ static void ExaEvt_SetMatchStatusToEnd (struct ExaEvt_Event *Event)
{
Event->Status.QstInd = ExaEvt_AFTER_LAST_QUESTION; // After last question
Event->Status.QstCod = -1L;
Event->Status.Playing = false;
Event->Status.Happening = false;
Event->Status.Showing = ExaEvt_END;
}
@ -2268,7 +2268,7 @@ static void ExaEvt_ShowLeftColumnTch (struct ExaEvt_Event *Event)
HTM_DIV_Begin ("class=\"EXA_LEFT_TCH\"");
/***** Refreshable part *****/
HTM_DIV_Begin ("id=\"match_left\" class=\"EXA_REFRESHABLE_TEACHER\"");
HTM_DIV_Begin ("id=\"exam_event_left\" class=\"EXA_REFRESHABLE_TEACHER\"");
ExaEvt_ShowRefreshablePartTch (Event);
HTM_DIV_End ();
@ -2383,14 +2383,14 @@ static void ExaEvt_WriteNumRespondersQst (struct ExaEvt_Event *Event)
break;
}
/***** Write number of players *****/
if (Event->Status.Playing) // Event is being played
/***** Write number of participants *****/
if (Event->Status.Happening) // Event is being played
{
/* Get current number of players */
ExaEvt_GetNumPlayers (Event);
/* Get current number of participants */
ExaEvt_GetNumParticipants (Event);
/* Show current number of players */
HTM_TxtF ("/%u",Event->Status.NumPlayers);
/* Show current number of participants */
HTM_TxtF ("/%u",Event->Status.NumParticipants);
}
/***** End block *****/
@ -2487,7 +2487,7 @@ static void ExaEvt_PutFormCountdown (struct ExaEvt_Event *Event,long Seconds,con
if (PutForm)
{
/***** Start form *****/
if (asprintf (&OnSubmit,"updateMatchTch('match_left',"
if (asprintf (&OnSubmit,"updateMatchTch('exam_event_left',"
"'act=%ld&ses=%s&EvtCod=%ld&Countdown=%ld');"
" return false;", // return false is necessary to not submit form
Act_GetActCod (ActExaEvtCntDwn),Gbl.Session.Id,
@ -2582,7 +2582,7 @@ static void ExaEvt_ShowLeftColumnStd (const struct ExaEvt_Event *Event,
/***** Write whether question is answered or not *****/
ExaEvt_PutIfAnswered (Event,Answered);
if (Event->Status.Playing && // Event is being played
if (Event->Status.Happening && // Event is being played
Event->Status.Showing == ExaEvt_ANSWERS && // Teacher's screen is showing question answers
Answered) // I have answered this question
/***** Put icon to remove my answet *****/
@ -2611,7 +2611,7 @@ static void ExaEvt_ShowRightColumnStd (struct ExaEvt_Event *Event,
ExaEvt_ShowEventTitleStd (Event);
/***** Bottom row *****/
if (Event->Status.Playing) // Event is being played
if (Event->Status.Happening) // Event is being played
{
if (Event->Status.Showing == ExaEvt_END) // Event over
ExaEvt_ShowWaitImage (Txt_Please_wait_);
@ -2619,8 +2619,8 @@ static void ExaEvt_ShowRightColumnStd (struct ExaEvt_Event *Event,
{
HTM_DIV_Begin ("class=\"EXA_BOTTOM\"");
/***** Update players ******/
if (ExaEvt_RegisterMeAsPlayerInEvent (Event))
/***** Update participants ******/
if (ExaEvt_RegisterMeAsParticipantInEvent (Event))
{
if (Event->Status.Showing == ExaEvt_ANSWERS) // Teacher's screen is showing question answers
/* Show current question and possible answers */
@ -2698,7 +2698,7 @@ static void ExaEvt_PutMatchControlButtons (const struct ExaEvt_Event *Event)
/***** Center button *****/
HTM_DIV_Begin ("class=\"EXA_BUTTON_CENTER_CONT\"");
if (Event->Status.Playing) // Event is being played
if (Event->Status.Happening) // Event is being played
/* Put button to pause exam event */
ExaEvt_PutBigButton (ActPlyPauExaEvt,"play_pause",Event->EvtCod,
ExaEvt_ICON_PAUSE,Txt_Pause);
@ -2844,7 +2844,7 @@ static void ExaEvt_PutIfAnswered (const struct ExaEvt_Event *Event,bool Answered
HTM_DIV_Begin ("class=\"EXA_SHOW_ANSWERED\"");
/***** Put icon with link *****/
if (Event->Status.Playing && // Event is being played
if (Event->Status.Happening && // Event is being played
Event->Status.Showing == ExaEvt_ANSWERS && // Teacher's screen is showing question answers
Answered) // I have answered this question
{
@ -2976,7 +2976,7 @@ static void ExaEvt_ShowQuestionAndAnswersTch (const struct ExaEvt_Event *Event)
switch (Event->Status.Showing)
{
case ExaEvt_ANSWERS:
if (Event->Status.Playing) // Event is being played
if (Event->Status.Happening) // Event is being played
/* Write answers */
ExaEvt_WriteAnswersEventResult (Event,
&Question,
@ -3494,10 +3494,10 @@ static void ExaEvt_ShowWaitImage (const char *Txt)
}
/*****************************************************************************/
/**************************** Remove old players *****************************/
/************************** Remove old participants **************************/
/*****************************************************************************/
static void ExaEvt_RemoveOldPlayers (void)
static void ExaEvt_RemoveOldParticipants (void)
{
/***** Delete events not being played by teacher *****/
DB_QueryDELETE ("can not update events as not being played",
@ -3505,8 +3505,8 @@ static void ExaEvt_RemoveOldPlayers (void)
" WHERE TS<FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)",
Cfg_SECONDS_TO_REFRESH_MATCH_TCH*3);
/***** Delete players (students) who have left events *****/
DB_QueryDELETE ("can not update exam event players",
/***** Delete participants (students) who have left events *****/
DB_QueryDELETE ("can not update exam event participants",
"DELETE FROM exa_participants"
" WHERE TS<FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)",
Cfg_SECONDS_TO_REFRESH_MATCH_STD*3);
@ -3530,8 +3530,8 @@ static void ExaEvt_UpdateEventAsBeingPlayed (long EvtCod)
static void ExaEvt_SetEventAsNotBeingPlayed (long EvtCod)
{
/***** Delete all exam event players ******/
DB_QueryDELETE ("can not update exam event players",
/***** Delete all exam event participants ******/
DB_QueryDELETE ("can not update exam event participants",
"DELETE FROM exa_participants"
" WHERE EvtCod=%ld",
EvtCod);
@ -3558,32 +3558,32 @@ static bool ExaEvt_GetIfEventIsBeingPlayed (long EvtCod)
}
/*****************************************************************************/
/*************************** Get number of players ***************************/
/************************** Get number of participants ***********************/
/*****************************************************************************/
static void ExaEvt_GetNumPlayers (struct ExaEvt_Event *Event)
static void ExaEvt_GetNumParticipants (struct ExaEvt_Event *Event)
{
/***** Get number of players who are playing an exam event *****/
Event->Status.NumPlayers =
(unsigned) DB_QueryCOUNT ("can not get number of players",
/***** Get number of participants who are playing an exam event *****/
Event->Status.NumParticipants =
(unsigned) DB_QueryCOUNT ("can not get number of participants",
"SELECT COUNT(*) FROM exa_participants"
" WHERE EvtCod=%ld",
Event->EvtCod);
}
/*****************************************************************************/
/******************* Register me as a player in an exam event **********************/
/************** Register me as a participant in an exam event ****************/
/*****************************************************************************/
// Return true on success
bool ExaEvt_RegisterMeAsPlayerInEvent (struct ExaEvt_Event *Event)
bool ExaEvt_RegisterMeAsParticipantInEvent (struct ExaEvt_Event *Event)
{
/***** Trivial check: exam event code must be > 0 *****/
if (Event->EvtCod <= 0)
return false;
/***** Trivial check: exam event must be being played *****/
if (!Event->Status.Playing) // Event is paused, not being played
if (!Event->Status.Happening) // Event is paused, not being played
return false;
/***** Trivial check: exam event must not be over *****/
@ -3594,8 +3594,8 @@ bool ExaEvt_RegisterMeAsPlayerInEvent (struct ExaEvt_Event *Event)
if (Gbl.Usrs.Me.Role.Logged != Rol_STD) // I am not logged as student
return false;
/***** Insert me as exam event player *****/
DB_QueryREPLACE ("can not insert exam event player",
/***** Insert me as exam event participant *****/
DB_QueryREPLACE ("can not insert exam event participant",
"REPLACE exa_participants (EvtCod,UsrCod) VALUES (%ld,%ld)",
Event->EvtCod,Gbl.Usrs.Me.UsrDat.UsrCod);
return true;
@ -3629,7 +3629,7 @@ void ExaEvt_JoinEventAsStd (void)
ExaEvt_GetDataOfEventByCod (&Event);
/***** Show current exam event status *****/
HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\"");
HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\"");
ExaEvt_ShowMatchStatusForStd (&Event,ExaEvt_CHANGE_STATUS_BY_STUDENT);
HTM_DIV_End ();
}
@ -3652,14 +3652,14 @@ void ExaEvt_RemoveMyQuestionAnswer (void)
/***** Check that teacher's screen is showing answers
and question index is the current one being played *****/
if (Event.Status.Playing && // Event is being played
if (Event.Status.Happening && // Event is being played
Event.Status.Showing == ExaEvt_ANSWERS && // Teacher's screen is showing answers
QstInd == Event.Status.QstInd) // Removing answer to the current question being played
/***** Remove answer to this question *****/
ExaEvt_RemoveMyAnswerToEventQuestion (&Event);
/***** Show current exam event status *****/
HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\"");
HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\"");
ExaEvt_ShowMatchStatusForStd (&Event,ExaEvt_CHANGE_STATUS_BY_STUDENT);
HTM_DIV_End ();
}
@ -3676,10 +3676,10 @@ void ExaEvt_StartCountdown (void)
/***** Get countdown parameter ****/
NewCountdown = Par_GetParToLong ("Countdown");
/***** Remove old players.
/***** Remove old participants.
This function must be called by a teacher
before getting exam event status. *****/
ExaEvt_RemoveOldPlayers ();
ExaEvt_RemoveOldParticipants ();
/***** Get data of the exam event from database *****/
Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed ();
@ -3707,10 +3707,10 @@ void ExaEvt_RefreshEventTch (void)
if (!Gbl.Session.IsOpen) // If session has been closed, do not write anything
return;
/***** Remove old players.
/***** Remove old participants.
This function must be called by a teacher
before getting exam event status. *****/
ExaEvt_RemoveOldPlayers ();
ExaEvt_RemoveOldParticipants ();
/***** Get data of the exam event from database *****/
Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed ();
@ -3719,7 +3719,7 @@ void ExaEvt_RefreshEventTch (void)
/***** Update countdown *****/
// If current countdown is < 0 ==> no countdown in progress
WhatToRefresh = REFRESH_LEFT;
if (Event.Status.Playing && // Event is being played
if (Event.Status.Happening && // Event is being played
Event.Status.Countdown >= 0) // Countdown in progress
{
/* Decrease countdown */
@ -3743,11 +3743,11 @@ void ExaEvt_RefreshEventTch (void)
switch (WhatToRefresh)
{
case REFRESH_LEFT: // Refresh only left part
HTM_Txt ("match_left|0|"); // 0 ==> do not evaluate MatJax scripts after updating HTML
HTM_Txt ("exam_event_left|0|"); // 0 ==> do not evaluate MatJax scripts after updating HTML
ExaEvt_ShowRefreshablePartTch (&Event);
break;
case REFRESH_ALL: // Refresh the whole page
HTM_Txt ("exam event|1|"); // 1 ==> evaluate MatJax scripts after updating HTML
HTM_Txt ("exam_event|1|"); // 1 ==> evaluate MatJax scripts after updating HTML
ExaEvt_ShowMatchStatusForTch (&Event);
break;
}
@ -3921,7 +3921,7 @@ void ExaEvt_ReceiveQuestionAnswer (void)
}
/***** Show current exam event status *****/
HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\"");
HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\"");
ExaEvt_ShowMatchStatusForStd (&Event,ExaEvt_CHANGE_STATUS_BY_STUDENT);
HTM_DIV_End ();
}

View File

@ -68,8 +68,8 @@ struct ExaEvt_Event
unsigned NumCols; // Number of columns for answers on teacher's screen
bool ShowQstResults; // Show global results of current question while playing
bool ShowUsrResults; // Show exam with results of all questions for the student
bool Playing; // Is being played now?
unsigned NumPlayers;
bool Happening; // Is being played now?
unsigned NumParticipants;
} Status; // Status related to event playing
};
@ -128,7 +128,7 @@ void ExaEvt_WriteChoiceAnsViewEvent (const struct ExaEvt_Event *Event,
const struct Tst_Question *Question,
const char *Class,bool ShowResult);
bool ExaEvt_RegisterMeAsPlayerInEvent (struct ExaEvt_Event *Event);
bool ExaEvt_RegisterMeAsParticipantInEvent (struct ExaEvt_Event *Event);
void ExaEvt_GetEventBeingPlayed (void);
void ExaEvt_JoinEventAsStd (void);

View File

@ -949,7 +949,7 @@ static void ExaRes_ShowEvtResults (struct Exa_Exams *Exams,
ExaEvt_PutParamsEdit (Exams);
break;
case Usr_OTHER:
Frm_StartForm (ActSeeOneMchResOth);
Frm_StartForm (ActSeeOneExaEvtResOth);
ExaEvt_PutParamsEdit (Exams);
Usr_PutParamOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EncryptedUsrCod);
break;
@ -1075,8 +1075,8 @@ void ExaRes_ShowOneExaResult (void)
ExaEvt_GetAndCheckParameters (&Exams,&Exam,&Event);
/***** Pointer to user's data *****/
MeOrOther = (Gbl.Action.Act == ActSeeOneMchResMe) ? Usr_ME :
Usr_OTHER;
MeOrOther = (Gbl.Action.Act == ActSeeOneExaEvtResMe) ? Usr_ME :
Usr_OTHER;
switch (MeOrOther)
{
case Usr_ME:

View File

@ -39,6 +39,7 @@
#include "swad_connected.h"
#include "swad_database.h"
#include "swad_exam_announcement.h"
#include "swad_exam_event.h"
#include "swad_firewall.h"
#include "swad_follow.h"
#include "swad_form.h"
@ -751,16 +752,24 @@ static void Lay_WriteScriptInit (void)
{
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
bool RefreshConnected;
bool RefreshNewTimeline = false;
bool RefreshMatchStd = false;
bool RefreshMatchTch = false;
bool RefreshLastClicks = false;
bool RefreshLastClicks = false;
bool RefreshNewTimeline = false;
bool RefreshExamEventStd = false;
bool RefreshExamEventTch = false;
bool RefreshMatchStd = false;
bool RefreshMatchTch = false;
RefreshConnected = Act_GetBrowserTab (Gbl.Action.Act) == Act_BRW_1ST_TAB &&
(Gbl.Prefs.SideCols & Lay_SHOW_RIGHT_COLUMN); // Right column visible
switch (Gbl.Action.Act)
{
/* Last clicks */
case ActLstClk:
RefreshLastClicks = true;
break;
/* Timeline */
case ActSeeSocTmlGbl:
case ActRcvSocPstGbl:
case ActRcvSocComGbl:
@ -770,6 +779,26 @@ static void Lay_WriteScriptInit (void)
case ActRemSocComGbl:
RefreshNewTimeline = true;
break;
/* Exam event */
case ActJoiExaEvt:
case ActSeeExaEvtAnsQstStd:
case ActRemExaEvtAnsQstStd:
case ActAnsExaEvtQstStd:
RefreshExamEventStd = true;
break;
case ActNewExaEvt:
case ActResExaEvt:
case ActBckExaEvt:
case ActPlyPauExaEvt:
case ActFwdExaEvt:
case ActChgNumColExaEvt:
case ActChgVisResExaEvtQst:
case ActExaEvtCntDwn:
RefreshExamEventTch = true;
break;
/* Match */
case ActJoiMch:
case ActSeeMchAnsQstStd:
case ActRemMchAnsQstStd:
@ -786,9 +815,7 @@ static void Lay_WriteScriptInit (void)
case ActMchCntDwn:
RefreshMatchTch = true;
break;
case ActLstClk:
RefreshLastClicks = true;
break;
default:
break;
}
@ -797,11 +824,15 @@ static void Lay_WriteScriptInit (void)
Dat_WriteScriptMonths ();
if (RefreshNewTimeline) // Refresh new timeline via AJAX
if (RefreshNewTimeline) // Refresh new timeline via AJAX
HTM_TxtF ("\tvar delayNewTL = %lu;\n",Cfg_TIME_TO_REFRESH_TIMELINE);
else if (RefreshMatchStd) // Refresh match via AJAX
else if (RefreshExamEventStd) // Refresh exam event via AJAX
HTM_TxtF ("\tvar delayExamEvent = %lu;\n",Cfg_TIME_TO_REFRESH_MATCH_STD);
else if (RefreshExamEventTch) // Refresh exam event via AJAX
HTM_TxtF ("\tvar delayExamEvent = %lu;\n",Cfg_TIME_TO_REFRESH_MATCH_TCH);
else if (RefreshMatchStd) // Refresh match via AJAX
HTM_TxtF ("\tvar delayMatch = %lu;\n",Cfg_TIME_TO_REFRESH_MATCH_STD);
else if (RefreshMatchTch) // Refresh match via AJAX
else if (RefreshMatchTch) // Refresh match via AJAX
HTM_TxtF ("\tvar delayMatch = %lu;\n",Cfg_TIME_TO_REFRESH_MATCH_TCH);
/***** Function init () ******/
@ -816,15 +847,19 @@ static void Lay_WriteScriptInit (void)
Gbl.Usrs.Connected.TimeToRefreshInMs);
}
if (RefreshLastClicks) // Refresh last clicks via AJAX
if (RefreshLastClicks) // Refresh last clicks via AJAX
HTM_TxtF ("\tsetTimeout(\"refreshLastClicks()\",%lu);\n",
Cfg_TIME_TO_REFRESH_LAST_CLICKS);
else if (RefreshMatchStd) // Refresh match for a student via AJAX
HTM_Txt ("\tsetTimeout(\"refreshMatchStd()\",delayMatch);\n");
else if (RefreshMatchTch) // Refresh match for a teacher via AJAX
HTM_Txt ("\tsetTimeout(\"refreshMatchTch()\",delayMatch);\n");
else if (RefreshNewTimeline) // Refresh timeline via AJAX
else if (RefreshNewTimeline) // Refresh timeline via AJAX
HTM_Txt ("\tsetTimeout(\"refreshNewTL()\",delayNewTL);\n");
else if (RefreshExamEventStd) // Refresh exam event for a student via AJAX
HTM_Txt ("\tsetTimeout(\"refreshExamEventStd()\",delayExamEvent);\n");
else if (RefreshExamEventTch) // Refresh exam event for a teacher via AJAX
HTM_Txt ("\tsetTimeout(\"refreshExamEventTch()\",delayExamEvent);\n");
else if (RefreshMatchStd) // Refresh match for a student via AJAX
HTM_Txt ("\tsetTimeout(\"refreshMatchStd()\",delayMatch);\n");
else if (RefreshMatchTch) // Refresh match for a teacher via AJAX
HTM_Txt ("\tsetTimeout(\"refreshMatchTch()\",delayMatch);\n");
HTM_Txt ("}\n");
@ -902,6 +937,34 @@ static void Lay_WriteScriptParamsAJAX (void)
Act_GetActCod (ActRefOldSocPubUsr),
Gbl.Usrs.Other.UsrDat.EncryptedUsrCod);
break;
/* Parameters related with exam event refreshing (for students) */
case ActJoiExaEvt:
case ActSeeExaEvtAnsQstStd:
case ActRemExaEvtAnsQstStd:
case ActAnsExaEvtQstStd:
// Refresh parameters
HTM_TxtF ("var RefreshParamNxtActExaEvt = \"act=%ld\";\n"
"var RefreshParamExaEvtCod = \"EvtCod=%ld\";\n",
Act_GetActCod (ActRefExaEvtStd),
ExaEvt_GetEvtCodBeingPlayed ());
break;
/* Parameters related with exam event refreshing (for teachers) */
case ActNewExaEvt:
case ActResExaEvt:
case ActBckExaEvt:
case ActPlyPauExaEvt:
case ActFwdExaEvt:
case ActChgNumColExaEvt:
case ActChgVisResExaEvtQst:
case ActExaEvtCntDwn:
// Handle keys in keyboard/presenter
HTM_Txt ("document.addEventListener(\"keydown\",handleMatchKeys);\n");
// Refresh parameters
HTM_TxtF ("var RefreshParamNxtActExaEvt = \"act=%ld\";\n"
"var RefreshParamExaEvtCod = \"EvtCod=%ld\";\n",
Act_GetActCod (ActRefExaEvtTch),
ExaEvt_GetEvtCodBeingPlayed ());
break;
/* Parameters related with match refreshing (for students) */
case ActJoiMch:
case ActSeeMchAnsQstStd: