Version 22.47: Oct 15, 2022 Code optimization related to forms.

This commit is contained in:
acanas 2022-10-15 10:42:32 +02:00
parent 80a32b1f05
commit 5b4a928226
10 changed files with 56 additions and 43 deletions

View File

@ -539,25 +539,14 @@ static ALn_LinkType_t ALn_CheckNickname (char **PtrSrc,char PrevCh,
(*Link)->NickAnchor[1].Str = (*Link)->NickAnchor[1].Str =
(*Link)->NickAnchor[2].Str = NULL; (*Link)->NickAnchor[2].Str = NULL;
/***** Create id for this form *****/
Gbl.Form.Num++;
if (Gbl.Usrs.Me.Logged)
snprintf (Gbl.Form.UniqueId,sizeof (Gbl.Form.UniqueId),
"form_%s_%d",Gbl.UniqueNameEncrypted,Gbl.Form.Num);
else
snprintf (Gbl.Form.Id,sizeof (Gbl.Form.Id),
"form_%d",Gbl.Form.Num);
/***** Store first part of anchor *****/ /***** Store first part of anchor *****/
Frm_SetParamsForm (ParamsStr,ActSeeOthPubPrf,true); Frm_SetParamsForm (ParamsStr,ActSeeOthPubPrf,true);
if (asprintf (&(*Link)->NickAnchor[0].Str, if (asprintf (&(*Link)->NickAnchor[0].Str,
"<form method=\"post\" action=\"%s/%s\" id=\"%s\">" "<form method=\"post\" action=\"%s/%s\">"
"%s" // Parameters "%s" // Parameters
"<input type=\"hidden\" name=\"usr\" value=\"", "<input type=\"hidden\" name=\"usr\" value=\"",
Cfg_URL_SWAD_CGI, Cfg_URL_SWAD_CGI,
Lan_STR_LANG_ID[Gbl.Prefs.Language], Lan_STR_LANG_ID[Gbl.Prefs.Language],
Gbl.Usrs.Me.Logged ? Gbl.Form.UniqueId :
Gbl.Form.Id,
ParamsStr) < 0) ParamsStr) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
(*Link)->NickAnchor[0].Len = strlen ((*Link)->NickAnchor[0].Str); (*Link)->NickAnchor[0].Len = strlen ((*Link)->NickAnchor[0].Str);
@ -566,9 +555,7 @@ static ALn_LinkType_t ALn_CheckNickname (char **PtrSrc,char PrevCh,
if (asprintf (&(*Link)->NickAnchor[1].Str, if (asprintf (&(*Link)->NickAnchor[1].Str,
"\">" "\">"
"<a href=\"\"" "<a href=\"\""
" onclick=\"document.getElementById('%s').submit();return false;\">", " onclick=\"this.closest('form').submit();return false;\">") < 0)
Gbl.Usrs.Me.Logged ? Gbl.Form.UniqueId :
Gbl.Form.Id) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
(*Link)->NickAnchor[1].Len = strlen ((*Link)->NickAnchor[1].Str); (*Link)->NickAnchor[1].Len = strlen ((*Link)->NickAnchor[1].Str);

View File

@ -606,10 +606,11 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate
TODO: Attach pdf files in multimedia. TODO: Attach pdf files in multimedia.
*/ */
#define Log_PLATFORM_VERSION "SWAD 22.46.3 (2022-10-15)" #define Log_PLATFORM_VERSION "SWAD 22.47 (2022-10-15)"
#define CSS_FILE "swad22.46.css" #define CSS_FILE "swad22.46.css"
#define JS_FILE "swad21.100.js" #define JS_FILE "swad21.100.js"
/* /*
Version 22.47: Oct 15, 2022 Code optimization related to forms. (333227 lines)
Version 22.46.3: Oct 15, 2022 Code refactoring submiting forms. (333211 lines) Version 22.46.3: Oct 15, 2022 Code refactoring submiting forms. (333211 lines)
Version 22.46.2: Oct 14, 2022 Changes in anchors behavior in project listing. (333228 lines) Version 22.46.2: Oct 14, 2022 Changes in anchors behavior in project listing. (333228 lines)
Version 22.46.1: Oct 14, 2022 Fixed bug filtering projects by department. (333227 lines) Version 22.46.1: Oct 14, 2022 Fixed bug filtering projects by department. (333227 lines)

View File

@ -174,10 +174,13 @@ void Con_ShowGlobalConnectedUsrs (void)
/***** Number of sessions *****/ /***** Number of sessions *****/
/* Link to view more details about connected users */ /* Link to view more details about connected users */
/*
Frm_BeginFormUnique (ActLstCon); // Must be unique because Frm_BeginFormUnique (ActLstCon); // Must be unique because
// the list of connected users // the list of connected users
// is dynamically updated via AJAX // is dynamically updated via AJAX
HTM_BUTTON_Submit_Begin (Txt_Connected_users,"class=\"BT_LINK\""); */
Frm_BeginForm (ActLstCon);
HTM_BUTTON_Submit_Begin (Txt_Connected_users,"class=\"BT_LINK\"");
/* Write total number of sessions */ /* Write total number of sessions */
HTM_TxtF ("%u&nbsp;%s",Gbl.Session.NumSessions, HTM_TxtF ("%u&nbsp;%s",Gbl.Session.NumSessions,
@ -326,9 +329,12 @@ void Con_ShowConnectedUsrsBelongingToCurrentCrs (void)
/***** Number of connected users who belong to course *****/ /***** Number of connected users who belong to course *****/
/* Link to view more details about connected users */ /* Link to view more details about connected users */
/*
Frm_BeginFormUnique (ActLstCon); // Must be unique because Frm_BeginFormUnique (ActLstCon); // Must be unique because
// the list of connected users // the list of connected users
// is dynamically updated via AJAX // is dynamically updated via AJAX
*/
Frm_BeginForm (ActLstCon);
HTM_BUTTON_Submit_Begin (Txt_Connected_users,"class=\"BT_LINK\""); HTM_BUTTON_Submit_Begin (Txt_Connected_users,"class=\"BT_LINK\"");
Str_Copy (CourseName,Gbl.Hierarchy.Crs.ShrtName,sizeof (CourseName) - 1); Str_Copy (CourseName,Gbl.Hierarchy.Crs.ShrtName,sizeof (CourseName) - 1);
Con_GetNumConnectedWithARoleBelongingToCurrentScope (Rol_UNK,&Usrs); Con_GetNumConnectedWithARoleBelongingToCurrentScope (Rol_UNK,&Usrs);
@ -414,9 +420,12 @@ static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentCrsOnRightColumn (Ro
{ {
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
HTM_TD_Begin ("colspan=\"3\" class=\"CM\""); HTM_TD_Begin ("colspan=\"3\" class=\"CM\"");
/*
Frm_BeginFormUnique (ActLstCon); // Must be unique because Frm_BeginFormUnique (ActLstCon); // Must be unique because
// the list of connected users // the list of connected users
// is dynamically updated via AJAX // is dynamically updated via AJAX
*/
Frm_BeginForm (ActLstCon);
Sco_PutParamScope ("ScopeCon",HieLvl_CRS); Sco_PutParamScope ("ScopeCon",HieLvl_CRS);
HTM_INPUT_IMAGE (Cfg_URL_ICON_PUBLIC,"ellipsis-h.svg", HTM_INPUT_IMAGE (Cfg_URL_ICON_PUBLIC,"ellipsis-h.svg",
Txt_Connected_users, Txt_Connected_users,
@ -604,12 +613,14 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
ClassTxt = (Gbl.Usrs.Connected.Lst[Gbl.Usrs.Connected.NumUsr].ThisCrs) ? "CON_NAME_NARROW CON_CRS" : ClassTxt = (Gbl.Usrs.Connected.Lst[Gbl.Usrs.Connected.NumUsr].ThisCrs) ? "CON_NAME_NARROW CON_CRS" :
"CON_NAME_NARROW CON_NO_CRS"; "CON_NAME_NARROW CON_NO_CRS";
HTM_TD_Begin ("class=\"%s %s\"",ClassTxt,The_GetColorRows ()); HTM_TD_Begin ("class=\"%s %s\"",ClassTxt,The_GetColorRows ());
// The form must be unique because
// the list of connected users
// is dynamically updated via AJAX
if (!NextAction[Role]) if (!NextAction[Role])
Err_WrongRoleExit (); Err_WrongRoleExit ();
Frm_BeginFormUnique (NextAction[Role]); /*
Frm_BeginFormUnique (NextAction[Role]); // The form must be unique because
// the list of connected users
// is dynamically updated via AJAX
*/
Frm_BeginForm (NextAction[Role]);
Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod); Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod);
HTM_DIV_Begin ("class=\"CON_NAME_NARROW\""); // Limited width HTM_DIV_Begin ("class=\"CON_NAME_NARROW\""); // Limited width

View File

@ -80,7 +80,7 @@ void Frm_BeginFormAnchorOnSubmit (Act_Action_t NextAction,const char *Anchor,con
snprintf (Gbl.Form.Id,sizeof (Gbl.Form.Id),"form_%d",Gbl.Form.Num); snprintf (Gbl.Form.Id,sizeof (Gbl.Form.Id),"form_%d",Gbl.Form.Num);
Frm_BeginFormInternal (NextAction,true,Gbl.Form.Id,Anchor,OnSubmit); // Do put now parameter location (if no open session) Frm_BeginFormInternal (NextAction,true,Gbl.Form.Id,Anchor,OnSubmit); // Do put now parameter location (if no open session)
} }
/*
void Frm_BeginFormUnique (Act_Action_t NextAction) void Frm_BeginFormUnique (Act_Action_t NextAction)
{ {
Frm_BeginFormUniqueAnchor (NextAction,NULL); Frm_BeginFormUniqueAnchor (NextAction,NULL);
@ -101,7 +101,7 @@ void Frm_BeginFormUniqueAnchorOnSubmit (Act_Action_t NextAction,const char *Anch
Gbl.UniqueNameEncrypted,Gbl.Form.Num); Gbl.UniqueNameEncrypted,Gbl.Form.Num);
Frm_BeginFormInternal (NextAction,true,Gbl.Form.UniqueId,Anchor,OnSubmit); // Do put now parameter location (if no open session) Frm_BeginFormInternal (NextAction,true,Gbl.Form.UniqueId,Anchor,OnSubmit); // Do put now parameter location (if no open session)
} }
*/
void Frm_BeginFormId (Act_Action_t NextAction,const char *Id) void Frm_BeginFormId (Act_Action_t NextAction,const char *Id)
{ {
Gbl.Form.Num++; // Initialized to -1. The first time it is incremented, it will be equal to 0 Gbl.Form.Num++; // Initialized to -1. The first time it is incremented, it will be equal to 0

View File

@ -50,10 +50,10 @@ void Frm_BeginFormGoTo (Act_Action_t NextAction);
void Frm_BeginForm (Act_Action_t NextAction); void Frm_BeginForm (Act_Action_t NextAction);
void Frm_BeginFormOnSubmit (Act_Action_t NextAction,const char *OnSubmit); void Frm_BeginFormOnSubmit (Act_Action_t NextAction,const char *OnSubmit);
void Frm_BeginFormAnchorOnSubmit (Act_Action_t NextAction,const char *Anchor,const char *OnSubmit); void Frm_BeginFormAnchorOnSubmit (Act_Action_t NextAction,const char *Anchor,const char *OnSubmit);
void Frm_BeginFormUnique (Act_Action_t NextAction); // void Frm_BeginFormUnique (Act_Action_t NextAction);
void Frm_BeginFormAnchor (Act_Action_t NextAction,const char *Anchor); void Frm_BeginFormAnchor (Act_Action_t NextAction,const char *Anchor);
void Frm_BeginFormUniqueAnchor (Act_Action_t NextAction,const char *Anchor); // void Frm_BeginFormUniqueAnchor (Act_Action_t NextAction,const char *Anchor);
void Frm_BeginFormUniqueAnchorOnSubmit (Act_Action_t NextAction,const char *Anchor,const char *OnSubmit); // void Frm_BeginFormUniqueAnchorOnSubmit (Act_Action_t NextAction,const char *Anchor,const char *OnSubmit);
void Frm_BeginFormId (Act_Action_t NextAction,const char *Id); void Frm_BeginFormId (Act_Action_t NextAction,const char *Id);
void Frm_BeginFormNoAction (void); void Frm_BeginFormNoAction (void);
void Frm_SetParamsForm (char ParamsStr[Frm_MAX_BYTES_PARAMS_STR],Act_Action_t NextAction, void Frm_SetParamsForm (char ParamsStr[Frm_MAX_BYTES_PARAMS_STR],Act_Action_t NextAction,

View File

@ -79,7 +79,7 @@ struct Globals
{ {
int Num; // Number of form, used in form submit links int Num; // Number of form, used in form submit links
char Id[32]; // Identifier string used in forms char Id[32]; // Identifier string used in forms
char UniqueId[32 + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 10 + 1]; // Unique identifier string used in forms // char UniqueId[32 + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 10 + 1]; // Unique identifier string used in forms
bool Inside; // Set to true inside a form to avoid nested forms bool Inside; // Set to true inside a form to avoid nested forms
} Form; } Form;
struct struct

View File

@ -1263,8 +1263,9 @@ void Pho_ShowUsrPhoto (const struct Usr_Data *UsrDat,const char *PhotoURL,
if (PutLinkToPublicProfile) if (PutLinkToPublicProfile)
{ {
if (FormUnique) if (FormUnique)
Frm_BeginFormUnique (ActSeeOthPubPrf); // Frm_BeginFormUnique (ActSeeOthPubPrf);
else Frm_BeginForm (ActSeeOthPubPrf);
else
Frm_BeginForm (ActSeeOthPubPrf); Frm_BeginForm (ActSeeOthPubPrf);
Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod); Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod);
HTM_BUTTON_Submit_Begin (NULL,"class=\"BT_LINK\""); HTM_BUTTON_Submit_Begin (NULL,"class=\"BT_LINK\"");

View File

@ -617,7 +617,8 @@ static void TmlCom_WriteAuthorName (const struct Usr_Data *UsrDat) // Author
/***** Show user's name inside form to go to user's public profile *****/ /***** Show user's name inside form to go to user's public profile *****/
/* Begin form */ /* Begin form */
Frm_BeginFormUnique (ActSeeOthPubPrf); // Frm_BeginFormUnique (ActSeeOthPubPrf);
Frm_BeginForm (ActSeeOthPubPrf);
Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod); Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod);
/* Author's name */ /* Author's name */

View File

@ -224,7 +224,8 @@ void TmlFrm_FormFavSha (const struct Tml_Form *Form)
ParamStr, ParamStr,
Gbl.Usrs.Other.UsrDat.EnUsrCod) < 0) Gbl.Usrs.Other.UsrDat.EnUsrCod) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
Frm_BeginFormUniqueAnchorOnSubmit (ActUnk,"timeline",OnSubmit); // Frm_BeginFormUniqueAnchorOnSubmit (ActUnk,"timeline",OnSubmit);
Frm_BeginFormAnchorOnSubmit (ActUnk,"timeline",OnSubmit);
free (OnSubmit); free (OnSubmit);
Ico_PutIconLink (Form->Icon,Form->Color, Ico_PutIconLink (Form->Icon,Form->Color,
TmlFrm_ActionUsr[Form->Action]); TmlFrm_ActionUsr[Form->Action]);
@ -238,7 +239,8 @@ void TmlFrm_FormFavSha (const struct Tml_Form *Form)
Gbl.Session.Id, Gbl.Session.Id,
ParamStr) < 0) ParamStr) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
Frm_BeginFormUniqueAnchorOnSubmit (ActUnk,NULL,OnSubmit); // Frm_BeginFormUniqueAnchorOnSubmit (ActUnk,NULL,OnSubmit);
Frm_BeginFormAnchorOnSubmit (ActUnk,NULL,OnSubmit);
free (OnSubmit); free (OnSubmit);
Ico_PutIconLink (Form->Icon,Form->Color, Ico_PutIconLink (Form->Icon,Form->Color,
TmlFrm_ActionGbl[Form->Action]); TmlFrm_ActionGbl[Form->Action]);
@ -299,7 +301,8 @@ void TmlFrm_FormToShowHiddenComms (long NotCod,
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
Anchor = NULL; Anchor = NULL;
} }
Frm_BeginFormUniqueAnchorOnSubmit (ActUnk,Anchor,OnSubmit); // Frm_BeginFormUniqueAnchorOnSubmit (ActUnk,Anchor,OnSubmit);
Frm_BeginFormAnchorOnSubmit (ActUnk,Anchor,OnSubmit);
free (OnSubmit); free (OnSubmit);
/* Put icon and text with link to show the first hidden comments */ /* Put icon and text with link to show the first hidden comments */

View File

@ -352,7 +352,8 @@ void TmlNot_WriteAuthorName (const struct Usr_Data *UsrDat,
/***** Show user's name inside form to go to user's public profile *****/ /***** Show user's name inside form to go to user's public profile *****/
/* Begin form */ /* Begin form */
Frm_BeginFormUnique (ActSeeOthPubPrf); // Frm_BeginFormUnique (ActSeeOthPubPrf);
Frm_BeginForm (ActSeeOthPubPrf);
Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod); Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod);
/* Author's name */ /* Author's name */
@ -623,36 +624,42 @@ static void TmlNot_PutFormGoToAction (const struct TmlNot_Note *Not,
{ {
case TmlNot_INS_DOC_PUB_FILE: case TmlNot_INS_DOC_PUB_FILE:
case TmlNot_INS_SHA_PUB_FILE: case TmlNot_INS_SHA_PUB_FILE:
Frm_BeginFormUnique (Tml_DefaultActions[Not->Type]); // Frm_BeginFormUnique (Tml_DefaultActions[Not->Type]);
Frm_BeginForm (Tml_DefaultActions[Not->Type]);
Brw_PutHiddenParamFilCod (Not->Cod); Brw_PutHiddenParamFilCod (Not->Cod);
if (Not->HieCod != Gbl.Hierarchy.Ins.InsCod) // Not the current institution if (Not->HieCod != Gbl.Hierarchy.Ins.InsCod) // Not the current institution
Ins_PutParamInsCod (Not->HieCod); // Go to another institution Ins_PutParamInsCod (Not->HieCod); // Go to another institution
break; break;
case TmlNot_CTR_DOC_PUB_FILE: case TmlNot_CTR_DOC_PUB_FILE:
case TmlNot_CTR_SHA_PUB_FILE: case TmlNot_CTR_SHA_PUB_FILE:
Frm_BeginFormUnique (Tml_DefaultActions[Not->Type]); // Frm_BeginFormUnique (Tml_DefaultActions[Not->Type]);
Frm_BeginForm (Tml_DefaultActions[Not->Type]);
Brw_PutHiddenParamFilCod (Not->Cod); Brw_PutHiddenParamFilCod (Not->Cod);
if (Not->HieCod != Gbl.Hierarchy.Ctr.CtrCod) // Not the current center if (Not->HieCod != Gbl.Hierarchy.Ctr.CtrCod) // Not the current center
Ctr_PutParamCtrCod (Not->HieCod); // Go to another center Ctr_PutParamCtrCod (Not->HieCod); // Go to another center
break; break;
case TmlNot_DEG_DOC_PUB_FILE: case TmlNot_DEG_DOC_PUB_FILE:
case TmlNot_DEG_SHA_PUB_FILE: case TmlNot_DEG_SHA_PUB_FILE:
Frm_BeginFormUnique (Tml_DefaultActions[Not->Type]); // Frm_BeginFormUnique (Tml_DefaultActions[Not->Type]);
Frm_BeginForm (Tml_DefaultActions[Not->Type]);
Brw_PutHiddenParamFilCod (Not->Cod); Brw_PutHiddenParamFilCod (Not->Cod);
if (Not->HieCod != Gbl.Hierarchy.Deg.DegCod) // Not the current degree if (Not->HieCod != Gbl.Hierarchy.Deg.DegCod) // Not the current degree
Deg_PutParamDegCod (Not->HieCod); // Go to another degree Deg_PutParamDegCod (Not->HieCod); // Go to another degree
break; break;
case TmlNot_CRS_DOC_PUB_FILE: case TmlNot_CRS_DOC_PUB_FILE:
case TmlNot_CRS_SHA_PUB_FILE: case TmlNot_CRS_SHA_PUB_FILE:
Frm_BeginFormUnique (Tml_DefaultActions[Not->Type]); // Frm_BeginFormUnique (Tml_DefaultActions[Not->Type]);
Frm_BeginForm (Tml_DefaultActions[Not->Type]);
Brw_PutHiddenParamFilCod (Not->Cod); Brw_PutHiddenParamFilCod (Not->Cod);
if (Not->HieCod != Gbl.Hierarchy.Crs.CrsCod) // Not the current course if (Not->HieCod != Gbl.Hierarchy.Crs.CrsCod) // Not the current course
Crs_PutParamCrsCod (Not->HieCod); // Go to another course Crs_PutParamCrsCod (Not->HieCod); // Go to another course
break; break;
case TmlNot_CALL_FOR_EXAM: case TmlNot_CALL_FOR_EXAM:
Frm_SetAnchorStr (Not->Cod,&Anchor); Frm_SetAnchorStr (Not->Cod,&Anchor);
Frm_BeginFormUniqueAnchor (Tml_DefaultActions[Not->Type], // Frm_BeginFormUniqueAnchor (Tml_DefaultActions[Not->Type],
Anchor); // Locate on this specific exam // Anchor); // Locate on this specific exam
Frm_BeginFormAnchor (Tml_DefaultActions[Not->Type],
Anchor); // Locate on this specific exam
Frm_FreeAnchorStr (Anchor); Frm_FreeAnchorStr (Anchor);
Cfe_PutHiddenParamExaCod (Not->Cod); Cfe_PutHiddenParamExaCod (Not->Cod);
if (Not->HieCod != Gbl.Hierarchy.Crs.CrsCod) // Not the current course if (Not->HieCod != Gbl.Hierarchy.Crs.CrsCod) // Not the current course
@ -661,7 +668,8 @@ static void TmlNot_PutFormGoToAction (const struct TmlNot_Note *Not,
case TmlNot_POST: // Not applicable case TmlNot_POST: // Not applicable
return; return;
case TmlNot_FORUM_POST: case TmlNot_FORUM_POST:
Frm_BeginFormUnique (For_ActionsSeeFor[Forums->Forum.Type]); // Frm_BeginFormUnique (For_ActionsSeeFor[Forums->Forum.Type]);
Frm_BeginForm (For_ActionsSeeFor[Forums->Forum.Type]);
For_PutAllHiddenParamsForum (1, // Page of threads = first For_PutAllHiddenParamsForum (1, // Page of threads = first
1, // Page of posts = first 1, // Page of posts = first
Forums->ForumSet, Forums->ForumSet,
@ -674,8 +682,9 @@ static void TmlNot_PutFormGoToAction (const struct TmlNot_Note *Not,
break; break;
case TmlNot_NOTICE: case TmlNot_NOTICE:
Frm_SetAnchorStr (Not->Cod,&Anchor); Frm_SetAnchorStr (Not->Cod,&Anchor);
Frm_BeginFormUniqueAnchor (Tml_DefaultActions[Not->Type], // Frm_BeginFormUniqueAnchor (Tml_DefaultActions[Not->Type],
Anchor); // Anchor);
Frm_BeginFormAnchor (Tml_DefaultActions[Not->Type],Anchor);
Frm_FreeAnchorStr (Anchor); Frm_FreeAnchorStr (Anchor);
Not_PutHiddenParamNotCod (Not->Cod); Not_PutHiddenParamNotCod (Not->Cod);
if (Not->HieCod != Gbl.Hierarchy.Crs.CrsCod) // Not the current course if (Not->HieCod != Gbl.Hierarchy.Crs.CrsCod) // Not the current course