diff --git a/css/swad16.189.css b/css/swad16.189.css
deleted file mode 100644
index a2c6b373..00000000
--- a/css/swad16.189.css
+++ /dev/null
@@ -1,3266 +0,0 @@
-/* swad_desktop.css:style-sheet for desktop layout of SWAD */
-
-/*
- SWAD (Shared Workspace At a Distance),
- is a web platform developed at the University of Granada (Spain),
- and used to support university teaching.
-
- This file is part of SWAD core.
- Copyright (C) 1999-2017 Antonio Cañas Vargas
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General 3 License as
- published by the Free Software Foundation,either version 3 of the
- License,or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not,see .
-*/
-/********************************* Body **************************************/
-body
- {
- margin:0;
- background-color:white;
- font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
- font-size:1em;
- overflow-y:scroll; /* force vertical scrollbar */
- }
-input
- {
- font-size:12pt;
- }
-select
- {
- font-size:12pt;
- }
-textarea
- {
- font-size:13pt;
- font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
- }
-table
- {
- box-sizing:border-box;
- border-width:0;
- border-style:none;
- border-spacing:0;
- }
-table th
- {
- box-sizing:border-box;
- padding:0;
- color:#4D88A1;
- font-weight:bold;
- }
-table td
- {
- box-sizing:border-box;
- padding:0;
- }
-img
- {
- border-width:0;
- border-style:none;
- }
-form
- {
- display:inline;
- margin:0;
- }
-address
- {
- font-style: normal;
- }
-hr.WHITE_SEPARA {height:0; border-top:0; border-bottom:#707070 dotted 1px;}
-hr.GREY_SEPARA {height:0; border-top:0; border-bottom:#707070 dotted 1px;}
-hr.BLUE_SEPARA {height:0; border-top:0; border-bottom:#4D88A1 dotted 1px;}
-hr.YELLOW_SEPARA {height:0; border-top:0; border-bottom:#BD4815 dotted 1px;}
-
-/*********************** Text decoration of links ****************************/
-a
- {
- color:#4D88A1;
- }
-a:link, a:visited, a:active
- {
- text-decoration:none;
- }
-a:hover /* Default ==> underlined */
- {
- text-decoration:underline;
- }
-.TAB_OFF a, .TAB_ON a, .MENU_LIST_ITEM a /* Tabs and menus are the exceptions */
- {
- text-decoration:none;
- }
-
-/****************** Layout (the whole page with a background) ****************/
-#whole_page
- {
- display:table;
- box-sizing:border-box;
- width:100%;
- /*
- background-color:black;
- background-image:url('/swad/background.jpg');
- background-repeat:no-repeat;
- background-size:100%;
- */
- }
-
-/************************* Layout (first heading row) ************************/
-#head_row_1
- {
- display:table;
- box-sizing:border-box;
- width:100%;
- height:40px;
- }
-.HEAD_ROW_1_WHITE
- {
- background-color:black;
- }
-.HEAD_ROW_1_GREY
- {
- background-image:-webkit-linear-gradient(#383838 0,#383838 26px,#404040 100%); /* Safari */
- background-image:linear-gradient(#383838 0,#383838 26px,#404040 100%);
- background-repeat:no-repeat;
- }
-.HEAD_ROW_1_BLUE
- {
- background-image:-webkit-linear-gradient(#5fa5df 0,#4f90c8 26px,#4f90c8 100%); /* Safari */
- background-image:linear-gradient(#5fa5df 0,#4f90c8 26px,#4f90c8 100%);
- background-repeat:no-repeat;
- }
-.HEAD_ROW_1_YELLOW
- {
- background-color:#201420;
- }
-
-#head_row_1_left
- {
- display:table-cell;
- text-align:left;
- vertical-align:middle;
- }
-@media only screen and (max-width: 1024px)
- { /* For mobile-phones */
- #head_row_1_logo_small
- {
- display:inline-block;
- }
- #head_row_1_logo_big
- {
- display:none;
- }
- #head_row_1_tagline
- {
- display:none;
- }
- }
-@media only screen and (min-width: 1024px)
- { /* For tablets and desktop */
- #head_row_1_logo_small
- {
- display:none;
- }
- #head_row_1_logo_big
- {
- display:inline-block;
- }
- #head_row_1_tagline
- {
- display:inline-block;
- box-sizing:border-box;
- padding:0 4px;
- font-size:11pt;
- font-weight:bold;
- line-height:110%;
- white-space:nowrap;
- text-align:left;
- vertical-align:middle;
- }
- }
-.WHITE_TAGLINE {color:#B0B0B0;}
-.GREY_TAGLINE {color:#E0E0E0;}
-.BLUE_TAGLINE {color:#BAD2DA;}
-.YELLOW_TAGLINE {color:#B3B0B3;}
-
-#head_row_1_search
- {
- display:inline-block;
- padding:0 10px;
- }
-@media only screen and (max-width: 1280px)
- { /* For mobile phones and tablets */
- #head_search_text
- {
- display:none;
- }
- }
-
-@media only screen and (max-width: 480px)
- { /* For mobile phones */
- .SEL_ROLE {width:55px;}
- .HEAD_USR
- {
- display:inline-block;
- box-sizing:border-box;
- max-width:200px;
- text-align:left;
- vertical-align:middle;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
- }
-@media only screen and (min-width: 480px)
- { /* For mobile phones */
- .SEL_ROLE {width:130px;}
- .HEAD_USR
- {
- display:inline-block;
- box-sizing:border-box;
- max-width:320px;
- text-align:left;
- vertical-align:middle;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
- }
-.WHITE_USR {color:#E0E0E0; font-size:15pt; font-weight:bold; white-space:nowrap;}
-.GREY_USR {color:#E0E0E0; font-size:15pt; font-weight:bold; white-space:nowrap;}
-.BLUE_USR {color:white; font-size:15pt; font-weight:bold; white-space:nowrap;}
-.YELLOW_USR {color:#B3B0B3; font-size:15pt; font-weight:bold; white-space:nowrap;}
-
-#head_row_1_right
- {
- display:table-cell;
- text-align:right;
- vertical-align:middle;
- }
-#login_box
- {
- display:inline;
- padding:0 10px;
- }
-@media only screen and (max-width: 1024px)
- { /* For mobile phones and tablets */
- #login_txt
- {
- display:none;
- }
- }
-.WHITE_HEAD {color:#E0E0E0; font-size:12pt; white-space:nowrap;}
-.GREY_HEAD {color:#E0E0E0; font-size:12pt; white-space:nowrap;}
-.BLUE_HEAD {color:white; font-size:12pt; white-space:nowrap;}
-.YELLOW_HEAD {color:#B3B0B3; font-size:12pt; white-space:nowrap;}
-
-/************************ Layout (second heading row) ************************/
-#head_row_2
- {
- display:table;
- box-sizing:border-box;
- width:100%;
- vertical-align:top;
- }
-.HEAD_ROW_2_WHITE
- {
- background-image:-webkit-linear-gradient(#cfcfce 0,white 40px,white 100%); /* Safari */
- background-image:linear-gradient(#cfcfce 0,white 40px,white 100%);
- }
-.HEAD_ROW_2_GREY
- {
- background-color:#404040;
- }
-.HEAD_ROW_2_BLUE
- {
- background-color:#4f90c8;
- }
-.HEAD_ROW_2_YELLOW
- {
- background-color:#201420;
- }
-
-/******************************* Current time ********************************/
-#head_row_2_time
- {
- display:table-cell;
- box-sizing:border-box;
- width:160px;
- text-align:center;
- vertical-align:middle;
- }
-#current_date
- {
- box-sizing:border-box;
- background-color:rgba(255, 255, 255, 0.8);
- width:80px;
- margin-left:6px;
- border-radius:4px;
- box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 2px 1px -2px rgba(0,0,0,0.2), 0 1px 5px 0 rgba(0,0,0,0.12);
- }
-#current_month
- {
- border-radius:4px 4px 0 0;
- background-color:rgba(222, 33, 33, 0.8);
- color:white;
- font-size:10pt;
- font-weight:bold;
- white-space:nowrap;
- overflow:hidden;
- }
-.CURRENT_MONTH
- {
- color:white;
- }
-#current_day
- {
- color:#606060;
- margin:2px 0 -2px 0;
- font-size:20pt;
- font-weight:bold;
- line-height:100%;
- }
-.CURRENT_DAY
- {
- color:#606060;
- }
-#current_time
- {
- border-radius:0 0 4px 4px;
- color:#606060;
- font-size:12pt;
- font-weight:bold;
- }
-
-@media only screen and (max-width: 1024px)
- { /* For mobile phones */
- #head_row_2_time
- {
- display:none;
- }
- }
-
-/****** Breadcrumb (platform/country/institution/centre/degree/course) *******/
-#head_row_2_hierarchy
- {
- display:table-cell;
- text-align:center;
- vertical-align:middle;
- }
-.TOP_LOGO /* Institution / Centre / Degree logo in top title */
- {
- height:40px;
- margin-right:10px;
- text-align:left;
- vertical-align:top !important;
- }
-@media only screen and (max-width: 480px)
- { /* For mobile-phones */
- #breadcrumb
- {
- display:table;
- margin:0 auto;
- font-size:6pt;
- font-weight:bold;
- white-space:nowrap;
- }
- .BC
- {
- display:table-cell;
- max-width:28px;
- overflow:hidden;
- }
- }
-@media only screen and (min-width: 480px) and (max-width: 800px)
- { /* For mobile-phones */
- #breadcrumb
- {
- display:table;
- margin:0 auto;
- font-size:8pt;
- font-weight:bold;
- white-space:nowrap;
- }
- .BC
- {
- display:table-cell;
- max-width:60px;
- overflow:hidden;
- }
- }
-@media only screen and (min-width: 800px) and (max-width: 1024px)
- { /* For tablets */
- #breadcrumb
- {
- display:table;
- margin:0 auto;
- font-size:10pt;
- font-weight:bold;
- white-space:nowrap;
- }
- .BC
- {
- display:table-cell;
- max-width:100px;
- overflow:hidden;
- }
- }
-@media only screen and (min-width: 1024px)
- { /* For desktop */
- #breadcrumb
- {
- display:table;
- margin:0 auto;
- font-size:12pt;
- font-weight:bold;
- white-space:nowrap;
- }
- .BC
- {
- display:table-cell;
- max-width:150px;
- overflow:hidden;
- }
- }
-
-.BC_SEMIOFF {opacity:0.67;}
-.BC_OFF {opacity:0.33;}
-
-.BC_WHITE {color:#707070;}
-.BC_GREY {color:#FFB42E;}
-.BC_BLUE {color:#FFE880;}
-.BC_YELLOW {color:#FFC040;}
-
-/******** Big name of country, institution, centre, degree or course *********/
-#main_title
- {
- margin:0;
- padding:0;
- font-size:24pt;
- font-weight:normal;
- line-height:100%;
- white-space:nowrap;
- }
-#big_name_container
- {
- display:inline-block;
- }
-@media only screen and (max-width: 1024px)
- { /* For mobile-phones */
- #big_short_name
- {
- display:table-cell;
- max-width:560px;
- height:40px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- margin:0 auto;
- vertical-align:middle;
- }
- #big_full_name
- {
- display:none;
- }
- }
-@media only screen and (min-width: 1024px)
- { /* For tablets and desktop */
- #big_short_name
- {
- display:none;
- }
- #big_full_name
- {
- display:table-cell;
- max-width:899px;
- height:40px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- margin:0 auto;
- vertical-align:middle;
- }
- }
-.WHITE_COURSE {color:#4D88A1;}
-.GREY_COURSE {color:#F7F6F5;}
-.BLUE_COURSE {color:white;}
-.YELLOW_COURSE {color:white;}
-#my_courses
- {
- width:130px;
- margin:1px;
- }
-
-/***************************** Notifications *********************************/
-#msg /* Notifications, used for AJAX based refresh */
- {
- display:table-cell;
- box-sizing:border-box;
- width:160px;
- text-align:center;
- vertical-align:top;
- padding-top:10px;
- }
-@media only screen and (max-width: 1024px)
- { /* For mobile phones */
- #msg
- {
- display:none;
- }
- }
-@media only screen and (min-width: 1024px) and (max-width: 1280px)
- { /* For tablets */
- #notif_all
- {
- display:none;
- }
- }
-.WHITE_NOTIF {color:#707070; font-size:12pt; white-space:nowrap;}
-.GREY_NOTIF {color:#E0E0E0; font-size:12pt; white-space:nowrap;}
-.BLUE_NOTIF {color:white; font-size:12pt; white-space:nowrap;}
-.YELLOW_NOTIF {color:#B3B0B3; font-size:12pt; white-space:nowrap;}
-
-/******************* Layout (third heading row with tabs) ********************/
-.HEAD_ROW_3_WHITE
- {
- background-color:white;
- }
-.HEAD_ROW_3_GREY
- {
- background-image:-webkit-linear-gradient(#404040 0,#404040 54px,white 54px,white 100%); /* Safari */
- background-image:linear-gradient(#404040 0,#404040 54px,white 54px,white 100%);
- }
-.HEAD_ROW_3_BLUE
- {
- background-image:-webkit-linear-gradient(#4f90c8 0,#4f90c8 54px,white 54px,white 100%); /* Safari */
- background-image:linear-gradient(#4f90c8 0,#4f90c8 54px,white 54px,white 100%);
- }
-.HEAD_ROW_3_YELLOW
- {
- background-image:-webkit-linear-gradient(#201420 0,#201420 54px,white 54px,white 100%); /* Safari */
- background-image:linear-gradient(#201420 0,#201420 54px,white 54px,white 100%);
- }
-@media only screen and (max-width: 480px)
- { /* For mobile-phones */
- #tabs
- {
- display:table;
- box-sizing:border-box;
- margin:0 auto;
- border-spacing:1px 0;
- }
- .TAB_OFF
- {
- display:table-cell;
- box-sizing:border-box;
- width:38px;
- height:60px;
- margin:0;
- padding:0;
- border-radius:4px 4px 0 0;
- box-shadow:inset 0 -1px 1px 0 rgba(50,50,50,0.2);
- text-align:center;
- vertical-align:top;
- overflow:hidden;
- }
- .TAB_ON
- {
- display:table-cell;
- box-sizing:border-box;
- width:38px;
- height:60px;
- margin:0;
- padding:0;
- border-radius:4px 4px 0 0;
- box-shadow:inset 0 -1px 1px 0 rgba(50,50,50,0.2);
- text-align:center;
- vertical-align:top;
- overflow:hidden;
- }
- .TAB_TXT
- {
- font-size:9pt;
- font-weight:bold;
- line-height:100%;
- max-width:30px;
- white-space:nowrap;
- overflow:hidden;
- margin:0 auto;
- text-transform:uppercase;
- }
- }
-@media only screen and (min-width: 480px) and (max-width: 800px)
- { /* For mobile-phones */
- #tabs
- {
- display:table;
- box-sizing:border-box;
- margin:0 auto;
- border-spacing:1px 0;
- }
- .TAB_OFF
- {
- display:table-cell;
- box-sizing:border-box;
- width:58px;
- height:60px;
- margin:0;
- padding:0;
- border-radius:4px 4px 0 0;
- box-shadow:inset 0 -1px 1px 0 rgba(50,50,50,0.2);
- text-align:center;
- vertical-align:top;
- overflow:hidden;
- }
- .TAB_ON
- {
- display:table-cell;
- box-sizing:border-box;
- width:58px;
- height:60px;
- margin:0;
- padding:0;
- border-radius:4px 4px 0 0;
- box-shadow:inset 0 -1px 1px 0 rgba(50,50,50,0.2);
- text-align:center;
- vertical-align:top;
- overflow:hidden;
- }
- .TAB_TXT
- {
- font-size:9pt;
- font-weight:bold;
- line-height:100%;
- max-width:50px;
- white-space:nowrap;
- overflow:hidden;
- margin:0 auto;
- text-transform:uppercase;
- }
- }
-@media only screen and (min-width: 800px)
- { /* For tablets and desktop */
- #tabs
- {
- display:table;
- box-sizing:border-box;
- margin:0 auto;
- border-spacing:1px 0;
- }
- .TAB_OFF
- {
- display:table-cell;
- box-sizing:border-box;
- width:98px;
- height:60px;
- margin:0;
- padding:0;
- border-radius:4px 4px 0 0;
- box-shadow:inset 0 -1px 1px 0 rgba(50,50,50,0.2);
- text-align:center;
- vertical-align:top;
- overflow:hidden;
- }
- .TAB_ON
- {
- display:table-cell;
- box-sizing:border-box;
- width:98px;
- height:60px;
- margin:0;
- padding:0;
- border-radius:4px 4px 0 0;
- box-shadow:inset 0 -1px 1px 0 rgba(50,50,50,0.2);
- text-align:center;
- vertical-align:top;
- overflow:hidden;
- }
- .TAB_TXT
- {
- font-size:9pt;
- font-weight:bold;
- line-height:100%;
- max-width:90px;
- white-space:nowrap;
- overflow:hidden;
- margin:0 auto;
- text-transform:uppercase;
- }
- }
-.TAB_OFF a:hover, .TAB_ON a:hover
- {
- text-decoration:none;
- }
-
-.TAB_ON_WHITE {background-color:rgba(247, 246, 245, 0.99);}
-.TAB_ON_GREY {background-color:rgba(247, 246, 245, 0.99);}
-.TAB_ON_BLUE {background-color:rgba(232, 243, 246, 0.99);}
-.TAB_ON_YELLOW {background-color:rgba(255, 242, 189, 0.99);}
-
-.TAB_OFF_WHITE {background-color:#D4D4D4;}
-.TAB_OFF_GREY {background-color:#AEA79F;}
-.TAB_OFF_BLUE {background-color:#CAE1E8;}
-.TAB_OFF_YELLOW {background-color:#FADE94;}
-
-.WHITE_TAB_OFF {color:#707070;}
-.GREY_TAB_OFF {color:#505050;}
-.BLUE_TAB_OFF {color:#365E6E;}
-.YELLOW_TAB_OFF {color:#4A2E19;}
-
-.WHITE_TAB_ON {color:#4D88A1;}
-.GREY_TAB_ON {color:#606060;}
-.BLUE_TAB_ON {color:#4D88A1;}
-.YELLOW_TAB_ON {color:#BD4815;}
-
-.TAB_ICO
- {
- width:36px;
- height:36px;
- vertical-align:middle;
- margin-top:2px;
- }
-
-/*********************** Layout (fourth row, main zone) **********************/
-#main_zone
- {
- display:table;
- box-sizing:border-box;
- width:100%;
- }
-.LEFT_RIGHT_CELL
- {
- padding:0 6px 6px 6px;
- text-align:center;
- vertical-align:top;
- }
-
-@media only screen and (max-width: 1280px)
- { /* For mobile phones and tablets */
- #main_zone_central_none, #main_zone_central_left, #main_zone_central_right, #main_zone_central_both
- {
- display:table-cell;
- text-align:center;
- vertical-align:top;
- }
- #left_col
- {
- display:none;
- }
- #right_col
- {
- display:none;
- }
- }
-@media only screen and (min-width: 1280px)
- { /* For desktop */
- #main_zone_central_none /* Hide left and right columns */
- {
- display:table-cell;
- text-align:center;
- vertical-align:top;
- }
- #main_zone_central_left /* Show left column, hide right column */
- {
- display:table-cell;
- text-align:center;
- vertical-align:top;
- }
- #main_zone_central_right /* Hide left column, show right column */
- {
- display:table-cell;
- text-align:center;
- vertical-align:top;
- padding-right:160px;
- }
- #main_zone_central_both /* Show both columns */
- {
- display:table-cell;
- text-align:center;
- vertical-align:top;
- padding-right:160px;
- }
- #left_col
- {
- display:table-cell;
- box-sizing:border-box;
- width:160px;
- text-align:center;
- vertical-align:top;
- }
- #right_col
- {
- display:table-cell;
- box-sizing:border-box;
- width:160px;
- text-align:center;
- vertical-align:top;
- position:absolute;
- right:0;
- }
- }
-
-@media only screen and (max-width: 800px)
- { /* For mobile-phones */
- #main_zone_central_container
- {
- box-sizing:border-box;
- margin:-6px 0 0 0;
- padding:4px 0;
- border-radius:4px;
- box-shadow:inset 0 -1px 1px 0 rgba(50,50,50,0.2);
- text-align:center;
- vertical-align:top;
- position:relative;
- }
- }
-@media only screen and (min-width: 800px)
- { /* For tablets and desktop */
- #main_zone_central_container
- {
- box-sizing:border-box;
- min-height:900px;
- margin:-6px 0 0 0;
- padding:4px 0;
- border-radius:4px;
- box-shadow:inset 0 -1px 1px 0 rgba(50,50,50,0.2);
- text-align:center;
- vertical-align:top;
- position:relative;
- }
- }
-
-/************* Main central zone with horizontal menu and canvas *************/
-#main_horizontal
- {
- box-sizing:border-box;
- width:100%;
- }
-#main_horizontal .MENU_LIST_CONTAINER
- {
- width:100%;
- }
-#main_horizontal .MENU_LIST
- {
- display:table;
- box-sizing:border-box;
- height:60px;
- margin:0 auto;
- padding:0 8px;
- list-style-type:none;
- }
-#main_horizontal .MENU_LIST_ITEM
- {
- display:table-cell;
- width:128px;
- height:60px;
- margin:0 auto;
- text-align:center;
- vertical-align:middle;
- }
-#main_horizontal .MENU_OPT_OFF
- {
- opacity:0.67;
- }
-#main_horizontal .MENU_OPT_OFF:hover, #main_horizontal .MENU_OPT_ON
- {
- opacity:1;
- transform:scale(1.286,1.286);
- }
-#main_horizontal .MENU_ICO
- {
- box-sizing:border-box;
- padding:28px 0 0 0;
- background-size:28px 28px;
- background-repeat:no-repeat;
- background-position:center top;
- }
-#main_horizontal .MAIN_ZONE_CANVAS /* Where content for each action is written */
- {
- box-sizing:border-box;
- width:100%;
- padding:4px 8px;
- margin:0 auto;
- text-align:left;
- vertical-align:top;
- }
-
-/************** Main central zone with vertical menu and canvas **************/
-@media only screen and (max-width: 1024px)
- { /* For mobile phones */
- /* Mobile phone will display menu always in horizontal
- so the CSS must draw menu really in horizontal */
- #main_vertical
- {
- box-sizing:border-box;
- width:100%;
- }
- #main_vertical .MENU_LIST_CONTAINER
- {
- width:100%;
- }
- #main_vertical .MENU_LIST
- {
- display:table;
- box-sizing:border-box;
- height:60px;
- margin:0 auto;
- padding:0 8px;
- list-style-type:none;
- }
- #main_vertical .MENU_LIST_ITEM
- {
- display:table-cell;
- width:128px;
- height:60px;
- margin:0 auto;
- text-align:center;
- vertical-align:middle;
- }
- #main_vertical .MENU_OPT_OFF
- {
- opacity:0.67;
- }
- #main_vertical .MENU_OPT_OFF:hover, #main_vertical .MENU_OPT_ON
- {
- opacity:1;
- transform:scale(1.286,1.286);
- }
- #main_vertical .MENU_ICO
- {
- box-sizing:border-box;
- padding:28px 0 0 0;
- background-size:28px 28px;
- background-repeat:no-repeat;
- background-position:center top;
- }
- #main_vertical .MAIN_ZONE_CANVAS /* Where content for each action is written */
- {
- box-sizing:border-box;
- width:100%;
- padding:4px 8px;
- margin:0 auto;
- text-align:left;
- vertical-align:top;
- }
- #action_title /* Do not display action title */
- {
- display:none;
- }
- }
-
-@media only screen and (min-width: 1024px)
- { /* For tablets and desktop */
- #main_vertical
- {
- display:table;
- box-sizing:border-box;
- width:100%;
- }
- #main_vertical .MENU_LIST_CONTAINER
- {
- display:table-cell;
- box-sizing:border-box;
- width:170px;
- }
- #main_vertical .MENU_LIST
- {
- display:table;
- margin:0;
- padding-left:8px;
- list-style-type:none;
- }
- #main_vertical .MENU_LIST_ITEM
- {
- text-align:left;
- }
- #main_vertical .MENU_OPT_OFF
- {
- opacity:0.67;
- }
- #main_vertical .MENU_OPT_OFF:hover, #main_vertical .MENU_OPT_ON
- {
- opacity:1;
- }
- #main_vertical .MENU_ICO
- {
- display:table-cell;
- height:40px;
- vertical-align:middle;
- padding:2px 2px 2px 46px;
- background-size:36px 36px;
- background-repeat:no-repeat;
- background-position:2px 2px;
- }
- #main_vertical .MAIN_ZONE_CANVAS /* Where content for each action is written */
- {
- display:table-cell;
- box-sizing:border-box;
- padding:4px 8px;
- margin:0 auto;
- text-align:left;
- vertical-align:top;
- }
- #action_title
- {
- box-sizing:border-box;
- width:400px;
- min-height:64px;
- clear:both;
- margin:0 auto;
- text-align:left;
- background-size:60px 60px;
- background-position:0 0;
- background-repeat:no-repeat;
- padding:4px 0 8px 70px;
- overflow:hidden;
- }
- }
-
-/********************************* Menu fonts ********************************/
-@media only screen and (max-width: 800px)
- { /* For mobile-phones */
- .MENU_TEXT
- {
- font-size:12pt;
- font-weight:bold;
- line-height:110%;
- white-space:nowrap;
- overflow:hidden;
- width:30px;
- margin:0 auto;
- }
- }
-@media only screen and (min-width: 800px)
- { /* For tablets and desktop */
- .MENU_TEXT
- {
- font-size:12pt;
- font-weight:bold;
- line-height:110%;
- margin:0 auto;
- }
- }
-
-.WHITE_MENU_OFF {color:#4D88A1;}
-.GREY_MENU_OFF {color:#707070;}
-.BLUE_MENU_OFF {color:#4D88A1;}
-.YELLOW_MENU_OFF {color:#BD4815;}
-
-.WHITE_MENU_ON {color:#4D88A1;}
-.GREY_MENU_ON {color:#606060;}
-.BLUE_MENU_ON {color:#4D88A1;}
-.YELLOW_MENU_ON {color:#BD4815;}
-
-/****************** Title of current action in main block ********************/
-.WHITE_TITLE_ACTION {color:#606060; font-size:20pt;}
-.GREY_TITLE_ACTION {color:#606060; font-size:20pt;}
-.BLUE_TITLE_ACTION {color:#4D88A1; font-size:20pt;}
-.YELLOW_TITLE_ACTION {color:#BD4815; font-size:20pt;}
-
-.WHITE_SUBTITLE_ACTION {color:#606060; font-size:12pt;}
-.GREY_SUBTITLE_ACTION {color:#606060; font-size:12pt;}
-.BLUE_SUBTITLE_ACTION {color:#4D88A1; font-size:12pt;}
-.YELLOW_SUBTITLE_ACTION {color:#BD4815; font-size:12pt;}
-
-/***************************** Users connected *******************************/
-.CONNECTED
- {
- box-sizing:border-box;
- width:148px;
- margin:0 auto;
- background:white;
- border-style:solid;
- border-width:1px;
- border-color:#80C040;
- padding:5px;
- border-radius:4px;
- font-size:12pt;
- color:#398000;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.CONNECTED_LIST
- {
- box-sizing:border-box;
- margin-top:2px;
- padding-top:2px;
- border-style:solid;
- border-width:1px 0 0 0;
- border-color:#BFDF9F;
- white-space:nowrap;
- overflow:hidden;
- }
-.CONNECTED_TXT
- {
- color:#398000;
- font-size:12pt;
- }
-.CON_USR_NARROW
- {
- width:68px;
- text-align:left;
- vertical-align:middle;
- }
-.CON_USR_WIDE
- {
- width:320px;
- text-align:left;
- vertical-align:middle;
- }
-.CON_NAME_NARROW
- {
- max-width:68px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.CON_NAME_WIDE
- {
- max-width:320px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.CON_NO_CRS {color:#B8D070; font-size:11pt; line-height:110%; white-space:nowrap;}
-.CON_CRS {color:#398000; font-size:11pt; line-height:110%; white-space:nowrap;}
-
-/*************************** Most frequent actions ***************************/
-#MFU_actions
- {
- box-sizing:border-box;
- width:148px;
- margin:0;
- background:white;
- border-style:solid;
- border-width:1px;
- border-color:#8CBCCE;
- padding:5px;
- border-radius:4px;
- font-size:11pt;
- color:#4D88A1;
- }
-#MFU_actions ul
- {
- box-sizing:border-box;
- width:138px;
- margin-top:2px;
- padding-top:2px;
- border-style:solid;
- border-width:1px 0 0 0;
- border-color:#DDECF1;
- }
-#MFU_actions li
- {
- width:138px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-#MFU_actions img
- {
- width:20px;
- height:20px;
- margin:1px;
- vertical-align:middle;
- }
-
-#MFU_actions_big
- {
- padding:5px;
- }
-#MFU_actions_big img
- {
- width:40px;
- height:40px;
- margin:1px 4px 1px 0;
- vertical-align:middle;
- }
-
-/*********************************** Month ***********************************/
-.MONTH_CONTAINER
- {
- box-sizing:border-box;
- width:148px;
- margin:0;
- padding:5px;
- background:white;
- border-style:solid;
- border-width:1px;
- border-color:#8CBCCE;
- border-radius:4px;
- text-align:center;
- overflow:hidden;
- }
-.MONTH_TABLE_DAYS
- {
- box-sizing:border-box;
- width:138px;
- margin-top:2px;
- padding-top:2px;
- border-style:solid;
- border-width:1px 0 0 0;
- border-color:#DDECF1;
- }
-.MONTH
- {
- color:#4D88A1;
- font-size:9pt;
- white-space:nowrap;
- }
-.DAY_WRK_HEAD
- {
- color:#4D88A1;
- font-size:9pt;
- text-align:center;
- }
-.DAY_NO_WRK_HEAD
- {
- color:red;
- font-size:9pt;
- text-align:center;
- }
-.DAY_WRK
- {
- color:#202020;
- font-size:9pt;
- text-align:center;
- }
-.DAY_NO_WORK
- {
- color:#C04080;
- font-size:9pt;
- text-align:center;
- }
-.DAY_HLD
- {
- color:red;
- font-size:9pt;
- text-align:center;
- }
-.DAY_WRK_LIGHT
- {
- color:#E0E0E0;
- font-size:9pt;
- text-align:center;
- }
-.DAY_NO_WORK_LIGHT
- {
- color:#FFE0FF;
- font-size:9pt;
- text-align:center;
- }
-.DAY_HLD_LIGHT
- {
- color:#FFE0E0;
- font-size:9pt;
- text-align:center;
- }
-.DAY
- {
- border:solid 1px;
- border-color:white;
- text-align:center;
- }
-.TODAY
- {
- border:solid 1px;
- border-color:#50B800;
- text-align:center;
- }
-.DAY_EVENT
- {
- border:solid 1px;
- border-color:white;
- background-color:#FFF080;
- text-align:center;
- }
-.TODAY_EVENT
- {
- border:solid 1px;
- border-color:#50B800;
- background-color:#FFF080;
- text-align:center;
- }
-
-/********************************* Buttons ***********************************/
-.BT_CREATE
- {
- background-color:#5BC33B;
- border:1px solid #518741;
- }
-.BT_CONFIRM
- {
- background-color:#55ACEE;
- border:1px solid #3B88C3;
- }
-.BT_REMOVE
- {
- background-color:#EF5555;
- border:1px solid #C33B3B;
- }
-.BT_SUBMIT
- {
- color:white;
- font-size:20px;
- font-weight:bold;
- line-height:normal;
- margin:8px auto;
- padding:10px 20px;
- border-radius:4px;
- box-shadow:0 1px 0 rgba(255,255,255,0.15) inset;
- }
-.BT_SUBMIT_INLINE
- {
- box-sizing:border-box;
- min-width:170px;
- color:white;
- font-size:15px;
- font-weight:bold;
- line-height:normal;
- margin:0 10px;
- padding:4px;
- border-radius:4px;
- box-shadow:0 1px 0 rgba(255,255,255,0.15) inset;
- }
-.BT_SUBMIT:hover
- {
- background-image:-webkit-linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0.2)); /* Safari */
- background-image:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0.2));
- }
-.BT_SUBMIT_INLINE:hover
- {
- background-image:-webkit-linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0.2)); /* Safari */
- background-image:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0.2));
- }
-.BUTTONS_AFTER_ALERT
- {
- text-align:center;
- vertical-align:middle;
- padding:8px 0 16px 0;
- }
-
-/********************************** Notice ***********************************/
-.NOTICE_CONTAINER_ACTIVE
- {
- box-sizing:border-box;
- margin:0 auto 10px auto;
- padding:10px;
- background-image:-webkit-linear-gradient(rgba(238,216,108,0.8) 0%,rgba(248,237,149,0.8) 15%,rgba(250,240,152,0.8) 100%); /* Safari */
- background-image:linear-gradient(rgba(238,216,108,0.8) 0%,rgba(248,237,149,0.8) 15%,rgba(250,240,152,0.8) 100%);
- box-shadow:0 8px 10px -5px rgba(125,113,0,0.8);
- text-align:left;
- overflow:hidden;
- }
-.NOTICE_CONTAINER_OBSOLETE
- {
- box-sizing:border-box;
- margin:0 auto 10px auto;
- padding:10px;
- background-image:-webkit-linear-gradient(rgba(238,216,108,0.4) 0%,rgba(248,237,149,0.4) 15%,rgba(250,240,152,0.4) 100%); /* Safari */
- background-image:linear-gradient(rgba(238,216,108,0.4) 0%,rgba(248,237,149,0.4) 15%,rgba(250,240,152,0.4) 100%);
- box-shadow:0 8px 10px -5px rgba(125,113,0,0.4);
- text-align:left;
- overflow:hidden;
- }
-.NOTICE_DATE_ACTIVE
- {
- display:inline-block;
- float:right;
- font-size:12pt;
- color:#404040;
- text-align:right;
- overflow:hidden;
- }
-.NOTICE_DATE_OBSOLETE
- {
- display:inline-block;
- float:right;
- font-size:12pt;
- color:#808080;
- text-align:right;
- overflow:hidden;
- }
-.NOTICE_SUBJECT_ACTIVE
- {
- margin:12px auto;
- font-size:15pt;
- font-weight:bold;
- color:#404040;
- text-align:center;
- overflow:hidden;
- }
-.NOTICE_SUBJECT_OBSOLETE
- {
- margin:12px auto;
- font-size:15pt;
- font-weight:bold;
- color:#808080;
- text-align:center;
- overflow:hidden;
- }
-.NOTICE_TEXT_BRIEF
- {
- clear:both;
- font-size:12pt;
- color:#204080;
- overflow:hidden;
- }
-.NOTICE_TEXT_ACTIVE
- {
- padding:10px 20px;
- clear:both;
- font-size:12pt;
- color:#204080;
- overflow:hidden;
- }
-.NOTICE_TEXT_OBSOLETE
- {
- padding:10px 20px;
- clear:both;
- font-size:12pt;
- color:#4070A0;
- overflow:hidden;
- }
-.NOTICE_AUTHOR
- {
- display:inline-block;
- box-sizing:border-box;
- float:right;
- max-width:120px;
- text-align:right;
- vertical-align:middle;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- font-size:12pt;
- }
-.NOTICE_AUTHOR_ACTIVE
- {
- color:#404040;
- }
-.NOTICE_AUTHOR_OBSOLETE
- {
- color:#808080;
- }
-
-/**************************** Institutional links ****************************/
-#institutional_links
- {
- box-sizing:border-box;
- width:148px;
- margin:0;
- background:white;
- border-style:solid;
- border-width:1px;
- border-color:#8CBCCE;
- padding:5px;
- border-radius:4px;
- font-size:11pt;
- color:#4D88A1;
- }
-#institutional_links ul
- {
- box-sizing:border-box;
- width:138px;
- margin-top:2px;
- padding-top:2px;
- border-style:solid;
- border-width:1px 0 0 0;
- border-color:#DDECF1;
- }
-#institutional_links li
- {
- width:138px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.INS_LNK
- {
- padding:1px;
- font-size:11pt;
- color:#4D88A1;
- }
-
-/*********************************** Alerts **********************************/
-.ALERT
- {
- display:inline-block;
- box-sizing:border-box;
- max-width:90%;
- margin:8px auto 0 auto;
- background-color:#FFF9EA;
- background-position:12px 12px;
- background-size:20px 20px;
- background-repeat:no-repeat;
- padding:12px 12px 12px 45px;
- border-radius:2px;
- box-shadow: 0 2px 2px 0 rgba(124,121,109,0.14), 0 2px 1px -2px rgba(124,121,109,0.2), 0 1px 5px 0 rgba(124,121,109,0.12);
- opacity:0.9;
- font-size:12pt;
- color:#632921;
- text-align:left;
- overflow:hidden;
- }
-
-/*********************************** Icons ***********************************/
-.ICO20x15 {width:20px; height:15px; vertical-align:middle;}
-.ICO20x20 {width:20px; height:20px; vertical-align:middle;}
-.ICO20x20B {width:20px; height:20px; vertical-align:middle; display:block;}
-.ICO25x25 {width:25px; height:25px; vertical-align:middle;}
-.ICO40x25B {width:40px; height:25px; vertical-align:middle;}
-.ICO40x40 {width:40px; height:40px; vertical-align:middle;}
-.ICO40x40B {width:40px; height:40px; vertical-align:middle; display:block;}
-.ICO64x64 {width:64px; height:64px; vertical-align:middle;}
-.ICO160x160 {width:160px; height:160px; vertical-align:middle;}
-.BANNER {width:150px; height:50px;}
-.BANNER_SMALL {width:75px; height:25px;}
-
-/****** Contextual links with small icons and text to go to some action ******/
-.CONTEXT_MENU
- {
- margin:4px auto 6px auto;
- text-align:center;
- }
-.CONTEXT_OPT
- {
- display:inline;
- margin-left:6px;
- margin-right:6px;
- white-space:nowrap;
- }
-
-/********************************** Frame ************************************/
-.FRAME_INLINE
- {
- display:inline-block;
- margin:0 8px;
- }
-.FRAME_CONTAINER
- {
- box-sizing:border-box;
- width:100%;
- text-align:center;
- vertical-align:middle;
- }
-.FRAME
- {
- display:inline-block;
- box-sizing:border-box;
- margin:5px 0;
- padding:8px 12px 20px 12px;
- background-color:white;
- border-radius:2px;
- box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 2px 1px -2px rgba(0,0,0,0.2), 0 1px 5px 0 rgba(0,0,0,0.12);
- text-align:center;
- overflow:hidden;
- }
-.FRAME_SHADOW
- {
- display:inline-block;
- box-sizing:border-box;
- margin:5px 0 18px 0;
- padding:12px;
- background-color:rgba(255,255,255,0.95);
- border-width:1px;
- border-style:solid;
- border-color:#C0C0C0;
- border-radius:4px;
- box-shadow:2px 5px 15px #888;
- text-align:center;
- overflow:hidden;
- }
-.FRAME_ICO
- {
- box-sizing:border-box;
- height:20px;
- text-align:left;
- }
-.FRAME_ICO_LEFT
- {
- display:inline-block;
- }
-.FRAME_ICO_RIGHT
- {
- display:inline-block;
- float:right;
- }
-.FRAME_TBL_WIDE
- {
- box-sizing:border-box;
- width:100%;
- }
-.FRAME_TBL_WIDE_MARGIN
- {
- box-sizing:border-box;
- width:100%;
- margin-bottom:20px;
- }
-.FRAME_TBL_CENTER
- {
- margin:0 auto;
- }
-.FRAME_TBL_CENTER_MARGIN
- {
- margin:0 auto;
- margin-bottom:20px;
- }
-.FRAME_TITLE
- {
- display:table;
- box-sizing:border-box;
- width:100%;
- margin:0 auto;
- padding:0 12px 12px 12px;
- }
-.FRAME_TITLE_BIG
- {
- color:#606060;
- font-size:22pt;
- }
-.FRAME_TITLE_SMALL
- {
- color:#808080;
- font-size:18pt;
- }
-
-/* Apply only to the first level of th and td */
-table.CELLS_PAD_1 > tbody > tr > th {padding: 1px;}
-table.CELLS_PAD_1 > tbody > tr > td {padding: 1px;}
-table.CELLS_PAD_2 > tbody > tr > th {padding: 2px;}
-table.CELLS_PAD_2 > tbody > tr > td {padding: 2px;}
-table.CELLS_PAD_5 > tbody > tr > th {padding: 5px;}
-table.CELLS_PAD_5 > tbody > tr > td {padding: 5px;}
-table.CELLS_PAD_10 > tbody > tr > th {padding:10px;}
-table.CELLS_PAD_10 > tbody > tr > td {padding:10px;}
-
-/******************** Selector below the title of a frame ********************/
-.SEL_BELOW_TITLE
- {
- text-align:center;
- vertical-align:middle;
- margin-bottom:8px;
- }
-.SEL_BELOW_TITLE ul
- {
- display:inline-block;
- list-style-type:none;
- padding:0;
- margin:0;
- text-align:left;
- vertical-align:middle;
- }
-.SEL_BELOW_TITLE li
- {
- display:inline;
- text-align:left;
- vertical-align:middle;
- }
-.SEL_BELOW_TITLE label
- {
- color:#404040;
- font-size:13pt;
- }
-
-/*********************************** Title ***********************************/
-.TIT
- {
- margin:13px auto 0 auto;
- font-size:13pt;
- font-weight:bold;
- color:#94745C;
- text-align:center;
- }
-
-/********** Title of country, institution, centre, degree, course ************/
-.TITLE_LOCATION
- {
- color:#808080;
- font-size:20pt;
- font-weight:bold;
- }
-
-/************************** Map and name of country **************************/
-.COUNTRY_SMALL
- {
- display:inline-block;
- box-sizing:border-box;
- max-width:300px;
- text-align:left;
- vertical-align:middle;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.COUNTRY_TINY
- {
- display:inline-block;
- box-sizing:border-box;
- max-width:120px;
- text-align:left;
- vertical-align:middle;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.COUNTRY_MAP_TITLE
- {
- box-sizing:border-box;
- width:40px;
- height:40px;
- margin-right:10px;
- vertical-align:top;
- }
-.COUNTRY_MAP_SMALL
- {
- box-sizing:border-box;
- width:64px;
- height:64px;
- vertical-align:middle;
- }
-.COUNTRY_MAP_TINY
- {
- box-sizing:border-box;
- width:20px;
- height:20px;
- vertical-align:middle;
- }
-.COUNTRY_MAP_SHOW
- {
- box-sizing:border-box;
- width:320px;
- height:320px;
- margin:10px;
- }
-.COUNTRY_MAP_PRINT
- {
- box-sizing:border-box;
- width:625px;
- height:625px;
- margin:12px;
- }
-
-/********************* List of my courses ************************************/
-.MY_CRSS_LNK
- {
- box-sizing:border-box;
- max-width:500px;
- text-align:left;
- vertical-align:middle;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-
-/******************* Web of institution, centre, degree **********************/
-.EXTERNAL_WWW_SHORT
- {
- box-sizing:border-box;
- max-width:100px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.EXTERNAL_WWW_LONG
- {
- box-sizing:border-box;
- max-width:250px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-
-/****************************** Photo of centre ******************************/
-.CENTRE_PHOTO_SHOW
- {
- box-sizing:border-box;
- width:480px;
- padding:6px; margin:9px;
- border:solid 1px #EEE;
- }
-a:hover img.CENTRE_PHOTO_SHOW
- {
- border:solid 1px #CCC;
- box-shadow:1px 1px 6px #999;
- }
-.CENTRE_PHOTO_PRINT
- {
- box-sizing:border-box;
- width:600px;
- padding:10px; margin:15px;
- border:solid 1px #EEE;
- box-shadow:1px 1px 6px #999;
- }
-
-/**************** Attribution (author and license) of images *****************/
-#AttributionArea
- {
- box-sizing:border-box;
- width:480px;
- }
-.ATTRIBUTION
- {
- box-sizing:border-box;
- margin-bottom:15px;
- color:#A0A0A0;
- font-size:8pt;
- text-align:center;
- }
-
-/******************************* User's photo ********************************/
-.PHOTO15x20 {width: 15px; height: 20px; vertical-align:middle; border-radius:2px;}
-.PHOTO15x20B {width: 15px; height: 20px; vertical-align:middle; border-radius:2px; display:block; margin:0 auto;}
-.PHOTO18x24 {width: 18px; height: 24px; vertical-align:middle; border-radius:2px;}
-.PHOTO21x28 {width: 21px; height: 28px; vertical-align:middle; border-radius:2px;}
-.PHOTO30x40 {width: 30px; height: 40px; vertical-align:middle; border-radius:2px;}
-.PHOTO42x56 {width: 42px; height: 56px; vertical-align:middle; border-radius:3px;}
-.PHOTO45x60 {width: 45px; height: 60px; vertical-align:middle; border-radius:3px;}
-.PHOTO60x80 {width: 60px; height: 80px; vertical-align:middle; border-radius:3px;}
-.PHOTO186x248 {width:186px; height:248px; vertical-align:middle; border-radius:8px;}
-.IMG_USR
- {
- box-sizing:border-box;
- width:186px;
- height:248px;
- border-radius:4px;
- }
-.ZOOM
- {
- box-sizing:border-box;
- position:absolute;
- z-index:1000;
- left:-300px;
- top:-400px;
- padding:6px;
- background-color:rgba(255,255,255,0.95);
- border-width:1px;
- border-style:solid;
- border-color:#C0C0C0;
- border-radius:6px;
- box-shadow:2px 5px 15px #888;
- }
-.ZOOM_TXT_LINE
- {
- box-sizing:border-box;
- display:block;
- width:186px;
- margin:0 auto;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-
-.NO_BR {white-space:nowrap;}
-
-/********************************* Messages **********************************/
-.MSG_RECIPIENTS, .MSG_SUBJECT, .MSG_CONTENT
- {
- box-sizing:border-box;
- width:640px;
- }
-.BG_MSG_BLUE
- {
- background-image:-webkit-linear-gradient(#eaf3f6 0,#eaf3f6 80%,white 100%); /* Safari */
- background-image:linear-gradient(#eaf3f6 0,#eaf3f6 80%,white 100%);
- background-repeat:no-repeat;
- }
-.BG_MSG_GREEN
- {
- background-image:-webkit-linear-gradient(#f5ffd7 0,#f5ffd7 80%,white 100%); /* Safari */
- background-image:linear-gradient(#f5ffd7 0,#f5ffd7 80%,white 100%);
- background-repeat:no-repeat;
- }
-
-/************************** Listing of users *********************************/
-.USR_LIST_NUM {color:#A0A0A0; font-size:15pt; font-weight:bold;}
-.USR_LIST_NUM_N {color:#404040; font-size:15pt; font-weight:bold;}
-
-/*****************************************************************************/
-.WHITE_TITLE {color:#505050; font-size:18pt;}
-.GREY_TITLE {color:#505050; font-size:18pt;}
-.BLUE_TITLE {color:#4D88A1; font-size:18pt;}
-.YELLOW_TITLE {color:#BD4815; font-size:18pt;}
-
-/*********************** Icon and checkbox highlighting **********************/
-.ICO_HIDDEN
- {
- opacity:0.2;
- }
-.ICO_HIGHLIGHT, .CHECKBOX_UNCHECKED
- {
- opacity:0.6;
- }
-.ICO_HIGHLIGHT:hover, .CHECKBOX_UNCHECKED:hover, .CHECKBOX_CHECKED
- {
- opacity:1;
- }
-
-.HLP_HIGHLIGHT
- {
- opacity:0.3;
- }
-.HLP_HIGHLIGHT:hover
- {
- opacity:1;
- }
-
-/********************************* Form fonts ********************************/
-.WHITE_FORM {color:#4D88A1; font-size:13pt;}
-.GREY_FORM {color:#4D88A1; font-size:13pt;}
-.BLUE_FORM {color:#4D88A1; font-size:13pt;}
-.YELLOW_FORM {color:#7C4D2A; font-size:13pt;}
-
-.WHITE_FORM_DARK {color:#365E6E; font-size:13pt;}
-.GREY_FORM_DARK {color:#365E6E; font-size:13pt;}
-.BLUE_FORM_DARK {color:#365E6E; font-size:13pt;}
-.YELLOW_FORM_DARK {color:#4A2E19; font-size:13pt;}
-
-.WHITE_FORM_NOWRAP {color:#4D88A1; font-size:13pt; white-space:nowrap;}
-.GREY_FORM_NOWRAP {color:#4D88A1; font-size:13pt; white-space:nowrap;}
-.BLUE_FORM_NOWRAP {color:#4D88A1; font-size:13pt; white-space:nowrap;}
-.YELLOW_FORM_NOWRAP {color:#7C4D2A; font-size:13pt; white-space:nowrap;}
-
-.WHITE_FORM_BOLD {color:#4D88A1; font-size:13pt; font-weight:bold;}
-.GREY_FORM_BOLD {color:#4D88A1; font-size:13pt; font-weight:bold;}
-.BLUE_FORM_BOLD {color:#4D88A1; font-size:13pt; font-weight:bold;}
-.YELLOW_FORM_BOLD {color:#7C4D2A; font-size:13pt; font-weight:bold;}
-
-/****************************** Placing of objects ***************************/
-.LEFT_TOP {text-align:left; vertical-align:top;}
-.LEFT_MIDDLE {text-align:left; vertical-align:middle;}
-.LEFT_BOTTOM {text-align:left; vertical-align:bottom;}
-.CENTER_TOP {text-align:center; vertical-align:top;}
-.CENTER_MIDDLE {text-align:center; vertical-align:middle;}
-.CENTER_BOTTOM {text-align:center; vertical-align:bottom;}
-.RIGHT_TOP {text-align:right; vertical-align:top;}
-.RIGHT_MIDDLE {text-align:right; vertical-align:middle;}
-.RIGHT_BOTTOM {text-align:right; vertical-align:bottom;}
-
-/***************** Colors used in headers,backgrounds,etc. *****************/
-.COLOR0 {background-color:#F4F2EA;}
-.COLOR1 {background-color:#FBFAF7;}
-.LIGHT_GREEN {background-color:#C0FF40;}
-.LIGHT_BLUE {background-color:#DDECF1;}
-.VERY_LIGHT_BLUE {background-color:#EAF3F6;}
-
-/********************************* Course info *******************************/
-#crs_info
- {
- margin:0;
- padding:0 12px;
- color:inherit;
- }
-#crs_info table
- {
- border:1px solid grey;
- }
-#crs_info th
- {
- border:1px solid grey;
- background-color:#F0F0F0;
- padding:6px;
- }
-#crs_info td
- {
- border:1px solid grey;
- padding:6px;
- }
-
-/************************ Help for the text editor ***************************/
-.HELP_EDIT
- {
- margin:10px;
- text-align:center;
- color:#808080;
- font-size:8pt;
- }
-
-/*********************************** Lists ***********************************/
-.LIST_LEFT
- {
- display:inline-block;
- list-style-type:none;
- padding:0;
- margin:0;
- text-align:left;
- vertical-align:middle;
- }
-
-/******************************* File browsers *******************************/
-.FILENAME
- {
- display:inline-block;
- box-sizing:border-box;
- width:260px; /* width of LST_EDIT + 10 */
- text-align:left;
- vertical-align:middle;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.FILENAME_TXT
- {
- color:#404040;
- font-size:18pt;
- font-weight:bold;
- }
-.BROWSER_TITLE {color:#94745C; font-size:13pt; font-weight:bold;}
-.BROWSER_TITLE_LIGHT {color:#D5C6BB; font-size:13pt; font-weight:bold;}
-.BROWSER_SUBTITLE {color:#94745C; font-size:12pt;}
-.BROWSER_TABLE
- {
- box-sizing:border-box;
- width:100%;
- }
-.LST {color:#404040; font-size:11pt; white-space:nowrap;}
-.LST_HID {color:#A0A0A0; font-size:11pt; white-space:nowrap;}
-.LST_REC {color:#008000; font-size:11pt; white-space:nowrap;}
-.LST_REC_HID {color:#89BE87; font-size:11pt; white-space:nowrap;}
-.LST_EDIT {width:250px; color:#404040; font-weight:bold; font-size:11pt; height:20px; padding:0; margin:-1px; border-width:1px; border-style:solid; border-color:#ECE9D8;}
-.LST_EDIT_HID {width:250px; color:#A0A0A0; font-weight:bold; font-size:11pt; height:20px; padding:0; margin:-1px; border-width:1px; border-style:solid; border-color:#ECE9D8;}
-.LST_EDIT_REC {width:250px; color:#008000; font-weight:bold; font-size:11pt; height:20px; padding:0; margin:-1px; border-width:1px; border-style:solid; border-color:#ECE9D8;}
-.LST_EDIT_REC_HID {width:250px; color:#89BE87; font-weight:bold; font-size:11pt; height:20px; padding:0; margin:-1px; border-width:1px; border-style:solid; border-color:#ECE9D8;}
-
-/*****************************************************************************/
-
-.T1 {color:#404040; font-size:15pt;}
-.T2 {color:#404040; font-size:13pt;}
-.T3 {color:#404040; font-size:12pt;}
-
-.DAT {color:#606060; font-size:13pt;}
-.DAT_NOBR {color:#606060; font-size:13pt; white-space:nowrap;}
-.DAT_BOLD {color:#606060; font-size:13pt; font-weight:bold;}
-.DAT_GREEN {color:#008000; font-size:13pt;}
-.DAT_LIGHT {color:#A0A0A0; font-size:13pt;}
-.DAT_N {color:black; font-size:13pt;}
-.DAT_NOBR_N {color:black; font-size:13pt; white-space:nowrap;}
-.DAT_N_BOLD {color:black; font-size:13pt; font-weight:bold;}
-
-/*********************** Line in top part of a table row *********************/
-.DAT_N_LINE_TOP
- {
- color:black;
- font-size:13pt;
- border-style:solid none none none;
- border-width:1px;
- }
-
-.DAT_SMALL {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#606060; font-size:12pt;}
-.DAT_SMALL_LIGHT {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#A0A0A0; font-size:12pt;}
-.DAT_SMALL_NOBR {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#606060; font-size:12pt; white-space:nowrap;}
-.DAT_SMALL_N {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt;}
-.DAT_SMALL_NOBR_N {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt; white-space:nowrap;}
-
-.DAT_SMALL_GREY {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#707070; font-size:12pt;}
-.DAT_SMALL_RED {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:red; font-size:12pt;}
-.DAT_SMALL_GREEN {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#008000; font-size:12pt;}
-.DAT_SMALL_BLUE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#0080FF; font-size:12pt;}
-.DAT_SMALL_YELLOW {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#C0C000; font-size:12pt;}
-
-/******************************** User's IDs *********************************/
-.USR_ID {font-size:18pt; font-weight:bold;}
-.USR_ID_C {color:#408020}
-.USR_ID_NC {color:#A02020}
-
-/******************************* Record card *********************************/
-.REC_C1_TOP
- {
- box-sizing:border-box;
- width:68px;
- padding-top:8px !important;
- vertical-align:top;
- }
-.REC_C2_TOP
- {
- box-sizing:border-box;
- width:278px;
- height:68px;
- padding-top:8px !important;
- }
-.REC_C3_TOP
- {
- box-sizing:border-box;
- width:190px;
- }
-
-.REC_C1_MID
- {
- box-sizing:border-box;
- width:68px;
- }
-.REC_C2_MID
- {
- box-sizing:border-box;
- width:278px;
- }
-.REC_C3_MID
- {
- box-sizing:border-box;
- width:190px;
- }
-
-.REC_C1_BOT
- {
- box-sizing:border-box;
- width:170px;
- }
-.REC_C2_BOT
- {
- box-sizing:border-box;
- width:362px;
- }
-.REC_C2_BOT_INPUT
- {
- box-sizing:border-box;
- width:358px;
- }
-
-.REC_HEAD {font-family:Georgia,"DejaVu LGC Serif","Bitstream Vera Serif",serif; color:#808080; font-size:12pt;}
-.REC_NAME
- {
- box-sizing:border-box;
- max-width:274px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- color:#808080;
- font-size:20pt;
- font-weight:bold;
- }
-.REC_NICK
- {
- color:#808080;
- font-size:15pt;
- font-weight:bold;
- }
-.REC_WEBS
- {
- width:180px;
- margin:0 auto;
- }
-.REC_EMAIL
- {
- box-sizing:border-box;
- max-width:358px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.REC_DAT
- {
- color:#808080;
- font-size:13pt;
- line-height:110%;
- }
-.REC_DAT_BOLD
- {
- color:black;
- font-size:13pt;
- line-height:110%;
- }
-
-/******************************** Class photo ********************************/
-.CLASSPHOTO_TITLE
- {
- color:#606060;
- font-family:Georgia,"DejaVu LGC Serif","Bitstream Vera Serif",serif;
- font-size:13pt;
- }
-.CLASSPHOTO
- {
- color:#606060;
- font-size:10pt;
- line-height:110%;
- white-space:nowrap;
- }
-.CLASSPHOTO_CAPTION
- {
- display:block;
- box-sizing:border-box;
- max-width:60px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- margin:0 auto;
- }
-
-/*****************************************************************************/
-.MSJ_AVISO {color:#632921; font-size:12pt;}
-.TIT_TBL {color:#4D88A1; font-size:12pt; font-weight:bold;}
-
-.GRP_TITLE {color:#4D88A1; font-size:15pt; font-weight:bold;}
-
-.ASG_TITLE {color:#4D88A1; font-size:15pt; font-weight:bold;}
-.ASG_TITLE_LIGHT {color:#AFC4CC; font-size:15pt; font-weight:bold;}
-.ASG_GRP {color:#4D88A1; font-size:12pt;}
-.ASG_GRP_LIGHT {color:#AFC4CC; font-size:12pt;}
-
-.DATE_RED {color:red; font-size:13pt;}
-.DATE_RED_LIGHT {color:#F98A8A; font-size:13pt;}
-.DATE_GREEN {color:#008000; font-size:13pt;}
-.DATE_GREEN_LIGHT {color:#89BE87; font-size:13pt;}
-.DATE_BLUE {color:#4D88A1; font-size:13pt;}
-.DATE_BLUE_LIGHT {color:#AFC4CC; font-size:13pt;}
-
-.ASG_LST_DATE_GREEN {color:#008000; font-size:11pt; white-space:nowrap;}
-.ASG_LST_DATE_RED {color:red; font-size:11pt; white-space:nowrap;}
-
-.STATUS_GREEN {color:#008000; font-size:12pt;}
-.STATUS_GREEN_LIGHT {color:#89BE87; font-size:12pt;}
-.STATUS_RED {color:red; font-size:12pt;}
-.STATUS_RED_LIGHT {color:#F98A8A; font-size:12pt;}
-
-/********************************** Tests ************************************/
-.TAG_SEL {box-sizing:border-box; width:346px;}
-.TAG_TXT {box-sizing:border-box; width:346px;}
-.STEM {box-sizing:border-box; width:700px;}
-.ANS {color:#404040; font-size:13pt; font-weight:bold;}
-.ANS_OK {color:#008000; font-size:13pt; font-weight:bold;}
-.ANS_BAD {color:red; font-size:13pt; font-weight:bold;}
-.ANS_STR {box-sizing:border-box; width:600px;}
-.TEST_SUBTITLE
- {
- margin:10px;
- color:#404040;
- font-size:13pt;
- text-align:center;
- vertical-align:middle;
- }
-.TEST_NUM_QST {color:#808080; font-size:20pt; font-weight:bold;}
-.TEST {color:#404040; font-size:12pt;}
-.TEST_EXA {color:#404040; font-size:12pt;}
-.TEST_EXA_LIGHT {color:#A0A0A0; font-size:12pt;}
-.TEST_EDI {color:#404040; font-size:12pt;}
-.TEST_EDI_LIGHT {color:#A0A0A0; font-size:12pt;}
-
-.TEST_IMG_SHOW_STEM_CONTAINER
- {
- box-sizing:border-box;
- width:100%;
- margin:10px 0;
- }
-.TEST_IMG_SHOW_STEM
- {
- box-sizing:border-box;
- width:100%;
- border-radius:4px;
- }
-.TEST_IMG_SHOW_ANS_CONTAINER
- {
- box-sizing:border-box;
- width:100%;
- margin:10px 0;
- }
-.TEST_IMG_SHOW_ANS
- {
- box-sizing:border-box;
- width:100%;
- border-radius:4px;
- }
-.TEST_IMG_EDIT_LIST_STEM_CONTAINER
- {
- box-sizing:border-box;
- width:100%;
- margin:5px 0;
- }
-.TEST_IMG_EDIT_LIST_STEM
- {
- box-sizing:border-box;
- width:100%;
- border-radius:2px;
- }
-.TEST_IMG_EDIT_LIST_ANS_CONTAINER
- {
- box-sizing:border-box;
- width:100%;
- margin:5px 0;
- }
-.TEST_IMG_EDIT_LIST_ANS
- {
- box-sizing:border-box;
- width:100%;
- border-radius:2px;
- }
-
-.TEST_FORM_EDIT_IMG
- {
- box-sizing:border-box;
- margin:15px 0;
- text-align:left;
- vertical-align:top;
- }
-
-.TEST_IMG_EDIT_ONE_STEM_CONTAINER
- {
- box-sizing:border-box;
- width:100%;
- }
-.TEST_IMG_EDIT_ONE_STEM
- {
- box-sizing:border-box;
- width:100%;
- border-radius:4px;
- }
-.TEST_IMG_EDIT_ONE_ANS_CONTAINER
- {
- box-sizing:border-box;
- width:100%;
- }
-.TEST_IMG_EDIT_ONE_ANS
- {
- box-sizing:border-box;
- width:100%;
- border-radius:4px;
- }
-
-.TEST_EDI_ANS_LEFT_COL
- {
- box-sizing:border-box;
- width:50px;
- text-align:left;
- vertical-align:top;
- }
-.TEST_EDI_ANS_CENTER_COL
- {
- box-sizing:border-box;
- width:50px;
- text-align:right;
- vertical-align:top;
- }
-.TEST_EDI_ANS_RIGHT_COL
- {
- box-sizing:border-box;
- width:604px;
- text-align:left;
- vertical-align:top;
- }
-
-/******************************* Time table **********************************/
-#timetable
- {
- width:100%;
- margin:0 auto;
- }
-.TT_CELL
- {
- box-sizing:border-box;
- max-width:80px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- margin:0 auto;
- }
-.TT_TXT
- {
- font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif;
- color:#345C6C;
- font-size:10pt;
- line-height:100%;
- letter-spacing:0;
- }
-.TT_DAY
- {
- font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif;
- color:#404040;
- font-size:10pt;
- letter-spacing:0;
- }
-.TT_SUNDAY
- {
- font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif;
- color:red;
- font-size:10pt;
- letter-spacing:0;
- }
-.TT_HOUR_BIG
- {
- /* font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; */
- color:#808080;
- font-size:10pt;
- font-weight:bold;
- line-height:100%;
- letter-spacing:0;
- }
-.TT_HOUR_SMALL
- {
- font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif;
- color:#A0A0A0;
- font-size:10pt;
- line-height:100%;
- letter-spacing:0;
- }
-.TT_HOUR {height:24px;}
-.TT_ALIGN {height:12px;}
-.TT_FREE0 {height:12px; background-color:#F4F2EA; border:solid 1px; border-color:#F4F2EA #E0D9C2 #EEEADC #E0D9C2;}
-.TT_FREE1 {height:12px; background-color:#F4F2EA; border:solid 1px; border-color:#F4F2EA #E0D9C2 #E0D9C2 #E0D9C2;}
-.TT_FREE2 {height:12px; background-color:#FBFAF7; border:solid 1px; border-color:#FBFAF7 #E0D9C2 #F5F2E9 #E0D9C2;}
-.TT_FREE3 {height:12px; background-color:#FBFAF7; border:solid 1px; border-color:#FBFAF7 #E0D9C2 #E0D9C2 #E0D9C2;}
-.TT_THEO {height:12px; background-color:#C0DAE4; border:solid 2px; border-color:#C9E3ED #B5CFD9 #B5CFD9 #C9E3ED;}
-.TT_PRAC {height:12px; background-color:#DBE5E9; border:solid 2px; border-color:#E4EEF2 #D0DADE #D0DADE #E4EEF2;}
-.TT_TUTO {height:12px; background-color:#D6E9C3; border:solid 2px; border-color:#DFEEE0 #CAE3B1 #CAE3B1 #DFEEE0;}
-
-/********************************* Preference ********************************/
-.PREF_CONTAINER
- {
- display:inline-block;
- margin:0 10px;
- }
-.PREF_OFF
- {
- display:table-cell;
- box-sizing:border-box;
- padding:6px;
- text-align:center;
- vertical-align:middle;
- border:solid 1px;
- border-color:transparent;
- }
-.PREF_ON
- {
- display:table-cell;
- box-sizing:border-box;
- padding:6px;
- text-align:center;
- vertical-align:middle;
- border:solid 1px;
- border-color:#C0DAE4;
- background-color:#DDECF1;
- }
-
-/************************************* Log ***********************************/
-.LOG
- {
- font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif;
- font-size:11pt;
- color:#606060;
- }
-.LOG_R
- {
- font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif;
- font-size:11pt;
- color:red;
- }
-
-/***************************** Exam announcement *****************************/
-/* Bottom space is used for signatures */
-.EXA_ANN_VISIBLE
- {
- box-sizing:border-box;
- width:100%;
- padding:25px 25px 125px 25px;
- }
-.EXA_ANN_HIDDEN
- {
- box-sizing:border-box;
- width:100%;
- padding:25px 25px 125px 25px;
- opacity:0.33;
- }
-
-/****************************** Image uploading ******************************/
-.IMG_UPLOAD_CONTAINER
- {
- vertical-align:top;
- margin-bottom:10px;
- }
-.IMG_UPLOAD_BUTTON
- {
- cursor:pointer;
- }
-.IMG_UPLOAD_ICO
- {
- width:20px;
- height:20px;
- margin:0 5px;
- vertical-align:middle;
- }
-.IMG_UPLOAD_FILE
- {
- display:none;
- }
-.IMG_UPLOAD_FILENAME
- {
- color:#808080;
- font-size:12pt;
- }
-
-/********** Author of assignments, attendance, messages, surveys... **********/
-.AUTHOR_1_LINE
- {
- display:inline-block;
- box-sizing:border-box;
- max-width:100px;
- height:20px;
- text-align:left;
- vertical-align:middle;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.AUTHOR_2_LINES
- {
- display:inline-block;
- box-sizing:border-box;
- max-width:60px;
- height:40px;
- text-align:left;
- vertical-align:middle;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.AUTHOR_TXT {color:#4D88A1; font-size:11pt;}
-.AUTHOR_TXT_LIGHT {color:#AFC4CC; font-size:11pt;}
-.AUTHOR_TXT_NEW {color:#4D88A1; font-size:11pt; font-weight:bold;}
-
-/************************** Owner of assignments and works *******************/
-.OWNER_WORKS_PHOTO
- {
- box-sizing:border-box;
- width:64px;
- text-align:left;
- vertical-align:top;
- }
-.OWNER_WORKS_DATA
- {
- display:inline-block;
- box-sizing:border-box;
- width:100px;
- text-align:left;
- vertical-align:top;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-
-/***************************** Listing of users ******************************/
-.USR_DAT
- {
- box-sizing:border-box;
- max-width:120px;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-
-/**************************** Enrolment requests *****************************/
-.REQUESTER_NAME
- {
- box-sizing:border-box;
- max-width:100px;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-
-/******************************** Social activity ****************************/
-#view_new_posts_container,#view_old_posts_container
- {
- display:table-cell;
- height:50px;
- text-align:center;
- vertical-align:middle;
- }
-#just_now_timeline_list,#new_timeline_list,#old_timeline_list
- {
- display:none;
- margin:0;
- padding:0;
- }
-#old_timeline_list
- {
- margin:0;
- padding:0;
- }
-
-.SOCIAL_PUB
- {
- width:536px;
- border-top:1px solid silver;
- }
-.SOCIAL_NEW_PUB
- {
- background-color:#DDECF1;
- animation: fadein 2s linear forwards;
- }
-@keyframes fadein
- {
- to {background-color:white;}
- }
-
-.SOCIAL_FORM_NEW_POST
- {
- padding:10px 0;
- width:480px;
- text-align:center;
- }
-.SOCIAL_TOP_CONTAINER
- {
- box-sizing:border-box;
- width:536px;
- padding-top:10px;
- text-align:left;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.SOCIAL_TOP_PUBLISHER
- {
- color:#808080;
- font-size:13pt;
- }
-
-.SOCIAL_NOTE_LEFT_PHOTO
- {
- display:inline-block;
- box-sizing:border-box;
- width:56px;
- height:70px;
- padding:10px 0;
- text-align:left;
- vertical-align:top;
- }
-.SOCIAL_NOTE_RIGHT_CONTAINER
- {
- display:inline-block;
- box-sizing:border-box;
- width:480px;
- padding-top:10px;
- }
-.SOCIAL_RIGHT_AUTHOR
- {
- display:inline-block;
- box-sizing:border-box;
- width:320px;
- text-align:left;
- vertical-align:top;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.SOCIAL_RIGHT_TIME
- {
- display:inline-block;
- box-sizing:border-box;
- width:160px;
- text-align:right;
- vertical-align:top;
- }
-.SOCIAL_BOTTOM_LEFT /* Container for button used to toggle new comment form */
- {
- display:inline-block;
- box-sizing:border-box;
- width:56px;
- vertical-align:bottom;
- }
-.SOCIAL_BOTTOM_RIGHT /* Container for fav, share, remove and comments */
- {
- display:inline-block;
- box-sizing:border-box;
- width:480px;
- vertical-align:top;
- }
-.SOCIAL_ICOS_FAV_SHA_REM /* Container for fav, share and remove */
- {
- padding-bottom:10px;
- }
-.SOCIAL_TEXTAREA_POST
- {
- box-sizing:border-box;
- width:480px;
- margin:0;
- resize:none;
- }
-.SOCIAL_TXT
- {
- padding:5px 0;
- color:#404040;
- font-size:13pt;
- }
-.SOCIAL_POST_IMG_CONTAINER
- {
- box-sizing:border-box;
- width:480px;
- margin:10px 0;
- }
-.SOCIAL_POST_IMG
- {
- box-sizing:border-box;
- width:480px;
- border-radius:4px;
- }
-.SOCIAL_POST_IMG_TIT_URL
- {
- box-sizing:border-box;
- width:440px;
- }
-.SOCIAL_ICO_COMMENT
- {
- display:inline-block;
- padding-bottom:10px;
- }
-.SOCIAL_ICO_COMMENT_DISABLED
- {
- display:inline-block;
- padding-bottom:10px;
- opacity:0.1;
- }
-.SOCIAL_ICO_FAV
- {
- display:inline-block;
- vertical-align:bottom;
- }
-.SOCIAL_ICO_SHARE
- {
- display:inline-block;
- padding-left:20px;
- vertical-align:bottom;
- }
-.SOCIAL_ICO_FAV_DISABLED
- {
- display:inline-block;
- vertical-align:bottom;
- opacity:0.1;
- }
-.SOCIAL_ICO_SHARE_DISABLED
- {
- display:inline-block;
- padding-left:20px;
- vertical-align:bottom;
- opacity:0.1;
- }
-.SOCIAL_ICO_REMOVE
- {
- display:inline-block;
- vertical-align:bottom;
- float:right;
- }
-.SOCIAL_NUM_SHARES_FAVS
- {
- color:#A0A0A0;
- font-size:12pt;
- font-weight:bold;
- }
-.SOCIAL_SHARER
- {
- display:inline-block;
- padding-left:4px;
- vertical-align:bottom;
- }
-.SOCIAL_COMMENT
- {
- border-top:1px solid silver;
- }
-.SOCIAL_COMMENT_PHOTO
- {
- display:inline-block;
- box-sizing:border-box;
- width:40px;
- height:54px;
- padding:10px 0;
- text-align:left;
- vertical-align:top;
- }
-.SOCIAL_COMMENT_RIGHT_CONTAINER
- {
- display:inline-block;
- box-sizing:border-box;
- width:440px;
- padding:10px 0;
- }
-.SOCIAL_COMMENT_RIGHT_AUTHOR
- {
- display:inline-block;
- box-sizing:border-box;
- width:280px;
- text-align:left;
- vertical-align:top;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.SOCIAL_FORM_NEW_COMMENT
- {
- display:inline-block;
- margin-left:56px;
- border-top:1px solid silver;
- padding-bottom:10px;
- width:480px;
- text-align:center;
- }
-.SOCIAL_TEXTAREA_COMMENT
- {
- box-sizing:border-box;
- width:440px;
- margin:0;
- resize:none;
- }
-.SOCIAL_COMMENT_IMG_CONTAINER
- {
- box-sizing:border-box;
- width:440px;
- margin:10px 0;
- }
-.SOCIAL_COMMENT_IMG
- {
- box-sizing:border-box;
- width:440px;
- border-radius:4px;
- }
-.SOCIAL_COMMENT_IMG_TIT_URL
- {
- box-sizing:border-box;
- width:440px;
- }
-
-/************************************ Forum **********************************/
-.FOR_IMG_CONTAINER
- {
- box-sizing:border-box;
- width:100%;
- margin:10px 0;
- }
-.FOR_IMG
- {
- box-sizing:border-box;
- width:100%;
- border-radius:4px;
- }
-.FOR_IMG_TIT_URL
- {
- box-sizing:border-box;
- width:480px;
- }
-
-/*********************************** Messages ********************************/
-.MSG_TO_ONE_RCP
- {
- display:inline-block;
- padding-left:4px;
- text-align:left;
- vertical-align:middle;
- }
-.MSG_IMG_CONTAINER
- {
- box-sizing:border-box;
- width:100%;
- margin:10px 0;
- }
-.MSG_IMG
- {
- box-sizing:border-box;
- width:100%;
- border-radius:4px;
- }
-.MSG_IMG_TIT_URL
- {
- box-sizing:border-box;
- width:480px;
- }
-.MSG_TXT {color:#404040; font-size:13pt;}
-.MSG_TIT {color:#4D88A1; font-size:13pt;}
-.MSG_TIT_NEW {color:#4D88A1; font-size:13pt; font-weight:bold;}
-.MSG_TIT_REM {color:#AFC4CC; font-size:13pt;}
-.MSG_TIT_BG
- {
- background-image:-webkit-linear-gradient(#eaf3f6 0,#eaf3f6 80%,white 100%); /* Safari */
- background-image:linear-gradient(#eaf3f6 0,#eaf3f6 80%,white 100%);
- background-repeat:no-repeat;
- color:#4D88A1;
- font-size:13pt;
- }
-.MSG_TIT_BG_NEW
- {
- background-image:-webkit-linear-gradient(#f5ffd7 0,#f5ffd7 80%,white 100%); /* Safari */
- background-image:linear-gradient(#f5ffd7 0,#f5ffd7 80%,white 100%);
- background-repeat:no-repeat;
- color:#4D88A1;
- font-size:13pt;
- font-weight:bold;
- }
-.MSG_TIT_BG_REM
- {
- background-image:-webkit-linear-gradient(#f3fcff 0,#f3fcff 80%,white 100%); /* Safari */
- background-image:linear-gradient(#f3fcff 0,#f3fcff 80%,white 100%);
- background-repeat:no-repeat;
- color:#AFC4CC;
- font-size:13pt;
- }
-.MSG_AUT_BG
- {
- background-image:-webkit-linear-gradient(#eaf3f6 0,#eaf3f6 80%,white 100%); /* Safari */
- background-image:linear-gradient(#eaf3f6 0,#eaf3f6 80%,white 100%);
- background-repeat:no-repeat;
- color:#4D88A1;
- font-size:11pt;
- }
-.MSG_AUT_BG_NEW
- {
- background-image:-webkit-linear-gradient(#f5ffd7 0,#f5ffd7 80%,white 100%); /* Safari */
- background-image:linear-gradient(#f5ffd7 0,#f5ffd7 80%,white 100%);
- background-repeat:no-repeat;
- color:#4D88A1;
- font-size:11pt;
- font-weight:bold;
- }
-.MSG_AUT_BG_REM
- {
- background-image:-webkit-linear-gradient(#f3fcff 0,#f3fcff 80%,white 100%); /* Safari */
- background-image:linear-gradient(#f3fcff 0,#f3fcff 80%,white 100%);
- background-repeat:no-repeat;
- color:#AFC4CC;
- font-size:11pt;
- }
-.MSG_DATE {color:#4D88A1; font-size:11pt;}
-.MSG_DATE_NEW {color:#4D88A1; font-size:11pt; font-weight:bold;}
-
-.BT {width:20px; text-align:center; vertical-align:top;}
-.BT0 {width:20px; text-align:center; vertical-align:top; background-color:#F4F2EA;}
-.BT1 {width:20px; text-align:center; vertical-align:top; background-color:#FBFAF7;}
-.BM {width:20px; text-align:center; vertical-align:middle;}
-.BM_SEL {width:20px; text-align:center; vertical-align:middle; background-color:#C0FF40;}
-.BM0 {width:20px; text-align:center; vertical-align:middle; background-color:#F4F2EA;}
-.BM1 {width:20px; text-align:center; vertical-align:middle; background-color:#FBFAF7;}
-
-/******************************** Pagination *********************************/
-.PAG
- {
- display:inline-block;
- box-sizing:border-box;
- margin:4px 2px;
- padding:2px 8px;
- border-style:solid;
- border-width:1px;
- border-radius:4px;
- border-color:#C0DAE4;
- }
-a.PAG:hover, .PAG_CUR
- {
- display:inline-block;
- box-sizing:border-box;
- margin:4px 2px;
- padding:2px 8px;
- border-style:solid;
- border-width:1px;
- border-radius:4px;
- border-color:#C0DAE4;
- background-color:#DDECF1;
- text-decoration:none;
- }
-.PAG_TXT
- {
- font-size:13pt;
- font-weight:bold;
- color:#4D88A1;
- }
-
-/***************************** Calls for exams *******************************/
-.CONV_TIT
- {
- font-family:Garamond,"DejaVu LGC Serif","Bitstream Vera Serif",serif;
- color:#404040;
- font-weight:bold;
- font-size:18pt;
- }
-.CONV_TIT_IMPR
- {
- font-family:Garamond,"DejaVu LGC Serif","Bitstream Vera Serif",serif;
- color:#202020;
- font-weight:bold;
- font-size:18pt;
- }
-.CONV_NEG
- {
- font-family:Garamond,"DejaVu LGC Serif","Bitstream Vera Serif",serif;
- color:#404040;
- font-weight:bold;
- font-size:13pt;
- white-space:nowrap;
- }
-.CONV_NEG_IMPR
- {
- font-family:Garamond,"DejaVu LGC Serif","Bitstream Vera Serif",serif;
- color:#202020;
- font-weight:bold;
- font-size:13pt;
- white-space:nowrap;
- text-align:right;
- }
-.CONV
- {
- font-family:Garamond,"DejaVu LGC Serif","Bitstream Vera Serif",serif;
- color:#404040;
- font-size:13pt;
- }
-.CONV_IMPR
- {
- font-family:Garamond,"DejaVu LGC Serif","Bitstream Vera Serif",serif;
- color:#202020;
- font-size:13pt;
- }
-
-/***************************** Public user's profile *************************/
-.PRF_FIG_LEFT_CONTAINER
- {
- display:inline-block;
- box-sizing:border-box;
- width:50%;
- padding-right:10px;
- text-align:right;
- vertical-align:top;
- }
-.PRF_FIG_RIGHT_CONTAINER
- {
- display:inline-block;
- box-sizing:border-box;
- width:50%;
- padding-left:10px;
- text-align:left;
- vertical-align:top;
- }
-.PRF_FIG_UL
- {
- display:inline-block;
- list-style-type:none;
- padding:0;
- margin:0;
- text-align:left;
- vertical-align:middle;
- }
-.PRF_FIG_LI
- {
- padding:0 0 0 24px;
- background-size:20px 20px;
- background-repeat:no-repeat;
- background-position:left center;
- opacity:0.67;
- }
-
-#following_side
- {
- display:inline-block;
- box-sizing:border-box;
- width:50%;
- padding-right:10px;
- }
-#followers_side
- {
- display:inline-block;
- box-sizing:border-box;
- width:50%;
- padding-left:10px;
- }
-.FOLLOW_SIDE
- {
- display:table;
- box-sizing:border-box;
- width:100%;
- }
-#follows_me
- {
- display:table-cell;
- box-sizing:border-box;
- padding-right:20px;
- text-align:right;
- vertical-align:middle;
- }
-#follow_usr
- {
- display:table-cell;
- height:60px;
- box-sizing:border-box;
- padding-left:20px;
- text-align:left;
- vertical-align:middle;
- }
-.FOLLOW_BOX
- {
- display:table-cell;
- width:140px;
- text-align:center;
- vertical-align:middle;
- }
-.FOLLOW_NUM
- {
- color:#404040;
- font-size:30pt;
- font-weight:bold;
- opacity:0.5;
- }
-.FOLLOW_NUM_B
- {
- color:#404040;
- font-size:30pt;
- font-weight:bold;
- }
-.FOLLOW_PHOTO
- {
- box-sizing:border-box;
- width:72px;
- height:90px;
- text-align:left;
- vertical-align:bottom;
- }
-.FOLLOW_USR
- {
- box-sizing:border-box;
- width:100px;
- height:90px;
- }
-.FOLLOW_USR_NAME
- {
- box-sizing:border-box;
- max-width:100px;
- text-align:left;
- vertical-align:bottom;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-.FOLLOW_USR_ICO
- {
- padding:4px;
- }
-
-/****************************** Users ranking ********************************/
-.RANK_USR
- {
- box-sizing:border-box;
- max-width:50px;
- text-align:left;
- vertical-align:middle;
- white-space:nowrap;
- overflow:hidden;
- text-overflow:ellipsis;
- }
-
-/************************* Indicators about courses **************************/
-.INDICATORS td,.INDICATORS th
- {
- border:1px solid silver;
- border-collapse:collapse;
- padding:1px;
- }
-.INDICATORS th
- {
- color:#4D88A1;
- font-size:12pt;
- font-weight:bold;
- }
-
-/********************* Used to align buttons in account forms ****************/
-.FORM_ACCOUNT
- {
- display:inline-block;
- box-sizing:border-box;
- min-width:312px;
- }
-
-/************* Forms to edit institution, centre, degree, course *************/
-.CODE
- {
- min-width:60px;
- text-align:right;
- vertical-align:middle;
- }
-.INPUT_INS_CODE
- {
- width:90px;
- }
-.INPUT_SHORT_NAME
- {
- width:90px;
- }
-.INPUT_FULL_NAME
- {
- width:180px;
- }
-.INPUT_WWW
- {
- width:90px;
- }
-
-.INPUT_STATUS
- {
- width:80px;
- }
-.INPUT_REQUESTER
- {
- width:90px;
- }
-
-/********************************* Page foot *********************************/
-@media only screen and (max-width: 800px)
- { /* For mobile-phones */
- #foot_zone, #about_zone
- {
- display:none;
- }
- }
-@media only screen and (min-width: 800px)
- { /* For tablets and desktop */
- #foot_zone
- {
- padding:20px;
- }
- #about_zone
- {
- padding:20px;
- text-align:center;
- }
- }
-.FOOT_LIST_CONTAINER
- {
- position:relative;
- float:left;
- text-align:left;
- padding-bottom:20px;
- background:white;
- }
-.FOOT_LIST_TITLE
- {
- color:#666;
- font-size:14pt;
- font-weight:bold;
- white-space:nowrap;
- }
-.FOOT_LIST
- {
- box-sizing:border-box;
- list-style-type:none;
- margin:0;
- padding:0;
- border-width:0;
- font-size:12pt;
- white-space:nowrap;
- line-height:140%;
- }
-.FOOT_LINK
- {
- color:#2C90C9;
- }
-.ABOUT
- {
- color:#A0A0A0;
- font-size:12pt;
- }
-
-/************** Something that does not take up space and is not shown *******/
-.NOT_SHOWN
- {
- display:none;
- }
-
-/************ Something that takes up space but which is invisible ***********/
-.HIDDEN
- {
- visibility:hidden;
- }
diff --git a/swad_changelog.h b/swad_changelog.h
index bbb11a6f..238b2860 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -219,14 +219,15 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
-#define Log_PLATFORM_VERSION "SWAD 16.191 (2017-04-25)"
-#define CSS_FILE "swad16.189.css"
+#define Log_PLATFORM_VERSION "SWAD 16.192 (2017-04-25)"
+#define CSS_FILE "swad16.192.css"
#define JS_FILE "swad16.181.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.191: Apr 25, 2017 Changes in timetable. (218183 lines)
+ Version 16.192: Apr 25, 2017 Changes in layout and code refactoring in timetable. (? lines)
+ Version 16.191: Apr 25, 2017 Changes in layout of timetable. (218183 lines)
Version 16.190: Apr 25, 2017 Code refactoring in timetable. (218106 lines)
Version 16.189: Apr 25, 2017 Changes in timetable. (218027 lines)
7 changes necessary in database.
diff --git a/swad_global.h b/swad_global.h
index 398769cd..5bac2a14 100644
--- a/swad_global.h
+++ b/swad_global.h
@@ -624,9 +624,7 @@ struct Globals
{
struct
{
- unsigned StartHour; // Day starts at this hour
- unsigned EndHour; // Day ends at this hour
- unsigned MinutesPerInterval; // Number of minutes per interval
+ struct TT_Range Range;
unsigned HoursPerDay; // From start hour to end hour
unsigned SecondsPerInterval;
unsigned IntervalsPerHour;
@@ -639,7 +637,7 @@ struct Globals
unsigned Interval;
unsigned Column;
TT_ClassType_t ClassType;
- unsigned DurationNumIntervals;
+ unsigned DurationIntervals;
char Place[TT_MAX_BYTES_PLACE + 1];
char Group[Grp_MAX_BYTES_GROUP_NAME + 1];
long GrpCod; // Group code (-1 if no group selected)
diff --git a/swad_text.c b/swad_text.c
index dc08e229..f9cd9355 100644
--- a/swad_text.c
+++ b/swad_text.c
@@ -45560,6 +45560,27 @@ const char *Txt_The_thread_X_is_already_in_this_forum = // Warning: it is very i
"The thread %s is already in this forum."; // Necessita de tradução
#endif
+const char *Txt_The_timetable_is_empty =
+#if L==1
+ "L'horari està buit.";
+#elif L==2
+ "Der Fahrplan ist leer.";
+#elif L==3
+ "The timetable is empty.";
+#elif L==4
+ "El horario está vacío.";
+#elif L==5
+ "L'horaire est vide.";
+#elif L==6
+ "El horario está vacío."; // Okoteve traducción
+#elif L==7
+ "Il orario è vuoto.";
+#elif L==8
+ "Harmonogram jest pusty.";
+#elif L==9
+ "O horário está vazio.";
+#endif
+
const char *Txt_The_type_of_degree_X_already_exists = // Warning: it is very important to include %s in the following sentences
#if L==1
"El tipo de titulación %s ya existe."; // Necessita traduccio
diff --git a/swad_timetable.c b/swad_timetable.c
index 75f58012..d48f4e2a 100644
--- a/swad_timetable.c
+++ b/swad_timetable.c
@@ -54,6 +54,7 @@ extern struct Globals Gbl;
#define TT_MINUTES_PER_HOUR 60 // Number of minutes in 1 hour
#define TT_SECONDS_PER_MINUTE 60 // Number of seconds in 1 minute
+#define TT_SECONDS_PER_HOUR (TT_SECONDS_PER_MINUTE * TT_MINUTES_PER_HOUR) // Number of seconds in 1 hour
#define TT_START_HOUR 6 // Day starts at this hour
#define TT_END_HOUR 24 // Day ends at this hour
@@ -79,7 +80,7 @@ struct TT_Column
long GrpCod; // Group code (-1 if no group selected)
TT_IntervalType_t IntervalType;
TT_ClassType_t ClassType;
- unsigned DurationNumIntervals;
+ unsigned DurationIntervals;
char Place[TT_MAX_BYTES_PLACE + 1];
char Group[Grp_MAX_BYTES_GROUP_NAME + 1];
};
@@ -106,7 +107,7 @@ struct TT_Cell *TT_TimeTable[TT_DAYS_PER_WEEK];
/* Possible resolutions of the timetable in minutes */
#define TT_NUM_RESOLUTIONS 3
-unsigned TT_Resolutions[TT_NUM_RESOLUTIONS] =
+unsigned TT_MinutesPerInterval[TT_NUM_RESOLUTIONS] =
{
5, // 5 minutes
15, // 15 minutes // Use 10 or 15 minutes (15 looks better), never both together
@@ -117,9 +118,8 @@ unsigned TT_Resolutions[TT_NUM_RESOLUTIONS] =
/***************************** Internal prototypes **************************/
/*****************************************************************************/
-static void TT_TimeTableConstructor (void);
static void TT_TimeTableConfigureIntervalsAndAllocateTimeTable (void);
-static void TT_TimeTableDestructor (void);
+static void TT_FreeTimeTable (void);
static void TT_ShowTimeTableGrpsSelected (void);
static void TT_GetParamsTimeTable (void);
@@ -132,7 +132,10 @@ static void TT_PutIconToViewMyTT (void);
static void TT_WriteCrsTimeTableIntoDB (long CrsCod);
static void TT_WriteTutTimeTableIntoDB (long UsrCod);
static void TT_FillTimeTableFromDB (long UsrCod);
-static unsigned TT_GetResolution (unsigned Seconds);
+static void TT_CalculateRangeCell (unsigned StartTimeSeconds,
+ unsigned EndTimeSeconds,
+ struct TT_Range *Range);
+static unsigned TT_CalculateMinutesPerInterval (unsigned Seconds);
static void TT_ModifTimeTable (void);
static void TT_DrawTimeTable (void);
@@ -150,68 +153,56 @@ static void TT_TimeTableDrawCell (unsigned Weekday,unsigned Interval,unsigned Co
/******************** Create internal timetable in memory ********************/
/*****************************************************************************/
-static void TT_TimeTableConstructor (void)
- {
- /***** Start configuration of timetable *****/
- Gbl.TimeTable.Config.StartHour = TT_START_HOUR; // Day starts at this hour
- Gbl.TimeTable.Config.EndHour = TT_END_HOUR; // Day ends at this hour
- Gbl.TimeTable.Config.HoursPerDay = Gbl.TimeTable.Config.EndHour -
- Gbl.TimeTable.Config.StartHour; // From start hour to end hour
-
- /***** Editing or viewing? *****/
- switch (Gbl.Action.Act)
- {
- case ActSeeCrsTT: case ActPrnCrsTT: case ActChgCrsTT1stDay:
- case ActSeeMyTT: case ActPrnMyTT: case ActChgMyTT1stDay:
- case ActSeeRecOneTch: case ActSeeRecSevTch:
- Gbl.TimeTable.Editing = false;
- break;
- case ActEdiCrsTT: case ActChgCrsTT:
- case ActEdiTut: case ActChgTut:
- Gbl.TimeTable.Editing = true;
- break;
- }
-
- /***** End configuration and allocation of timetable *****/
- if (Gbl.TimeTable.Editing)
- {
- Gbl.TimeTable.Config.MinutesPerInterval = TT_Resolutions[0]; // The smallest interval
- TT_TimeTableConfigureIntervalsAndAllocateTimeTable ();
- }
- /* If viewing (not editing) ==>
- configuration and allocation of memory ends
- when table is read from database */
- }
-
static void TT_TimeTableConfigureIntervalsAndAllocateTimeTable (void)
{
unsigned Weekday;
- /***** End configuration depending on resolution *****/
- Gbl.TimeTable.Config.SecondsPerInterval = Gbl.TimeTable.Config.MinutesPerInterval *
- TT_SECONDS_PER_MINUTE;
- Gbl.TimeTable.Config.IntervalsPerHour = TT_MINUTES_PER_HOUR /
- Gbl.TimeTable.Config.MinutesPerInterval;
- Gbl.TimeTable.Config.IntervalsPerDay = Gbl.TimeTable.Config.IntervalsPerHour *
- Gbl.TimeTable.Config.HoursPerDay;
- Gbl.TimeTable.Config.IntervalsBeforeStartHour = Gbl.TimeTable.Config.IntervalsPerHour *
- Gbl.TimeTable.Config.StartHour;
+ if (Gbl.TimeTable.Config.Range.Hours.End >
+ Gbl.TimeTable.Config.Range.Hours.Start)
+ {
+ /***** Configuration of timetable depending on hours and resolution *****/
+ Gbl.TimeTable.Config.HoursPerDay = Gbl.TimeTable.Config.Range.Hours.End -
+ Gbl.TimeTable.Config.Range.Hours.Start; // From start hour to end hour
+ Gbl.TimeTable.Config.SecondsPerInterval = Gbl.TimeTable.Config.Range.MinutesPerInterval *
+ TT_SECONDS_PER_MINUTE;
+ Gbl.TimeTable.Config.IntervalsPerHour = TT_MINUTES_PER_HOUR /
+ Gbl.TimeTable.Config.Range.MinutesPerInterval;
+ Gbl.TimeTable.Config.IntervalsPerDay = Gbl.TimeTable.Config.IntervalsPerHour *
+ Gbl.TimeTable.Config.HoursPerDay;
+ Gbl.TimeTable.Config.IntervalsBeforeStartHour = Gbl.TimeTable.Config.IntervalsPerHour *
+ Gbl.TimeTable.Config.Range.Hours.Start;
- /***** Allocate memory for timetable *****/
- for (Weekday = 0;
- Weekday < TT_DAYS_PER_WEEK;
- Weekday++)
- if ((TT_TimeTable[Weekday] = (struct TT_Cell *)
- malloc (Gbl.TimeTable.Config.IntervalsPerDay *
- sizeof (struct TT_Cell))) == NULL)
- Lay_ShowErrorAndExit ("Error allocating memory for timetable.");
+ /***** Allocate memory for timetable *****/
+ for (Weekday = 0;
+ Weekday < TT_DAYS_PER_WEEK;
+ Weekday++)
+ if ((TT_TimeTable[Weekday] = (struct TT_Cell *)
+ malloc (Gbl.TimeTable.Config.IntervalsPerDay *
+ sizeof (struct TT_Cell))) == NULL)
+ Lay_ShowErrorAndExit ("Error allocating memory for timetable.");
+ }
+ else
+ {
+ /***** Table is empty *****/
+ Gbl.TimeTable.Config.HoursPerDay = 0;
+ Gbl.TimeTable.Config.SecondsPerInterval = 0;
+ Gbl.TimeTable.Config.IntervalsPerHour = 0;
+ Gbl.TimeTable.Config.IntervalsPerDay = 0;
+ Gbl.TimeTable.Config.IntervalsBeforeStartHour = 0;
+
+ /***** Clear timetable in order to not try to free it *****/
+ for (Weekday = 0;
+ Weekday < TT_DAYS_PER_WEEK;
+ Weekday++)
+ TT_TimeTable[Weekday] = NULL;
+ }
}
/*****************************************************************************/
/******************** Destroy internal timetable in memory *******************/
/*****************************************************************************/
-static void TT_TimeTableDestructor (void)
+static void TT_FreeTimeTable (void)
{
unsigned Weekday;
@@ -219,7 +210,11 @@ static void TT_TimeTableDestructor (void)
for (Weekday = 0;
Weekday < TT_DAYS_PER_WEEK;
Weekday++)
- free ((void *) TT_TimeTable[Weekday]);
+ if (TT_TimeTable[Weekday])
+ {
+ free ((void *) TT_TimeTable[Weekday]);
+ TT_TimeTable[Weekday] = NULL;
+ }
}
/*****************************************************************************/
@@ -258,27 +253,27 @@ static void TT_GetParamsTimeTable (void)
/***** Get day (0: monday, 1: tuesday,..., 6: sunday *****/
Gbl.TimeTable.Weekday = (unsigned)
- Par_GetParToUnsignedLong ("ModTTDay",
+ Par_GetParToUnsignedLong ("TTDay",
0,
TT_DAYS_PER_WEEK - 1,
0);
/***** Get hour *****/
Gbl.TimeTable.Interval = (unsigned)
- Par_GetParToUnsignedLong ("ModTTHour",
+ Par_GetParToUnsignedLong ("TTInt",
0,
Gbl.TimeTable.Config.IntervalsPerDay - 1,
0);
/***** Get number of column *****/
Gbl.TimeTable.Column = (unsigned)
- Par_GetParToUnsignedLong ("ModTTCol",
+ Par_GetParToUnsignedLong ("TTCol",
0,
TT_MAX_COLUMNS_PER_CELL - 1,
0);
/***** Get class type *****/
- Par_GetParToText ("ModTTClassType",StrClassType,TT_MAX_BYTES_STR_CLASS_TYPE);
+ Par_GetParToText ("TTTyp",StrClassType,TT_MAX_BYTES_STR_CLASS_TYPE);
for (Gbl.TimeTable.ClassType = (TT_ClassType_t) 0;
Gbl.TimeTable.ClassType < (TT_ClassType_t) TT_NUM_CLASS_TYPES;
Gbl.TimeTable.ClassType++)
@@ -288,17 +283,17 @@ static void TT_GetParamsTimeTable (void)
Lay_ShowErrorAndExit ("Type of timetable cell is missing.");
/***** Get class duration *****/
- Par_GetParToText ("ModTTDur",StrDuration,TT_MAX_BYTES_STR_DURATION);
+ Par_GetParToText ("TTDur",StrDuration,TT_MAX_BYTES_STR_DURATION);
if (sscanf (StrDuration,"%u:%u",&Hours,&Minutes) != 2)
Lay_ShowErrorAndExit ("Duration is missing.");
- Gbl.TimeTable.DurationNumIntervals = Hours * Gbl.TimeTable.Config.IntervalsPerHour +
- Minutes / Gbl.TimeTable.Config.MinutesPerInterval;
+ Gbl.TimeTable.DurationIntervals = Hours * Gbl.TimeTable.Config.IntervalsPerHour +
+ Minutes / Gbl.TimeTable.Config.Range.MinutesPerInterval;
/***** Get group code *****/
- Gbl.TimeTable.GrpCod = Par_GetParToLong ("ModTTGrpCod");
+ Gbl.TimeTable.GrpCod = Par_GetParToLong ("TTGrp");
/***** Get place *****/
- Par_GetParToText ("ModTTPlace",Gbl.TimeTable.Place,TT_MAX_BYTES_PLACE);
+ Par_GetParToText ("TTPlc",Gbl.TimeTable.Place,TT_MAX_BYTES_PLACE);
}
/*****************************************************************************/
@@ -507,8 +502,32 @@ static void TT_PutIconToViewMyTT (void)
void TT_ShowTimeTable (long UsrCod)
{
- /***** Create internal timetable in memory *****/
- TT_TimeTableConstructor ();
+ extern const char *Txt_The_timetable_is_empty;
+
+ /***** Editing or viewing? *****/
+ switch (Gbl.Action.Act)
+ {
+ case ActSeeCrsTT: case ActPrnCrsTT: case ActChgCrsTT1stDay:
+ case ActSeeMyTT: case ActPrnMyTT: case ActChgMyTT1stDay:
+ case ActSeeRecOneTch: case ActSeeRecSevTch:
+ Gbl.TimeTable.Editing = false;
+ break;
+ case ActEdiCrsTT: case ActChgCrsTT:
+ case ActEdiTut: case ActChgTut:
+ Gbl.TimeTable.Editing = true;
+ break;
+ }
+
+ /***** If editing ==> configure and allocate timetable *****/
+ if (Gbl.TimeTable.Editing)
+ {
+ Gbl.TimeTable.Config.Range.Hours.Start = TT_START_HOUR; // Day starts at this hour
+ Gbl.TimeTable.Config.Range.Hours.End = TT_END_HOUR; // Day ends at this hour
+ Gbl.TimeTable.Config.Range.MinutesPerInterval = TT_MinutesPerInterval[0]; // The smallest interval
+ TT_TimeTableConfigureIntervalsAndAllocateTimeTable ();
+ }
+ /* If viewing (not editing) ==>
+ configure and allocate memory when table is read from database */
/***** Fill internal timetable with the timetable from database *****/
TT_FillTimeTableFromDB (UsrCod);
@@ -541,10 +560,13 @@ void TT_ShowTimeTable (long UsrCod)
}
/***** Draw timetable *****/
- TT_DrawTimeTable ();
+ if (Gbl.TimeTable.Config.HoursPerDay)
+ TT_DrawTimeTable ();
+ else
+ Lay_ShowAlert (Lay_INFO,Txt_The_timetable_is_empty);
/***** Free internal timetable in memory *****/
- TT_TimeTableDestructor ();
+ TT_FreeTimeTable ();
}
/*****************************************************************************/
@@ -571,16 +593,16 @@ static void TT_WriteCrsTimeTableIntoDB (long CrsCod)
for (Weekday = 0;
Weekday < TT_DAYS_PER_WEEK;
Weekday++)
- for (Interval = 0, Hour = Gbl.TimeTable.Config.StartHour, Min = 0;
+ for (Interval = 0, Hour = Gbl.TimeTable.Config.Range.Hours.Start, Min = 0;
Interval < Gbl.TimeTable.Config.IntervalsPerDay;
Interval++,
- Hour += (Min + Gbl.TimeTable.Config.MinutesPerInterval) / TT_SECONDS_PER_MINUTE,
- Min = (Min + Gbl.TimeTable.Config.MinutesPerInterval) % TT_SECONDS_PER_MINUTE)
+ Hour += (Min + Gbl.TimeTable.Config.Range.MinutesPerInterval) / TT_SECONDS_PER_MINUTE,
+ Min = (Min + Gbl.TimeTable.Config.Range.MinutesPerInterval) % TT_SECONDS_PER_MINUTE)
for (Column = 0;
Column < TT_MAX_COLUMNS_PER_CELL;
Column++)
if (TT_TimeTable[Weekday][Interval].Columns[Column].IntervalType == TT_FIRST_INTERVAL &&
- TT_TimeTable[Weekday][Interval].Columns[Column].DurationNumIntervals)
+ TT_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals)
{
sprintf (Query,"INSERT INTO timetable_crs"
" (CrsCod,GrpCod,Weekday,StartTime,Duration,"
@@ -592,7 +614,7 @@ static void TT_WriteCrsTimeTableIntoDB (long CrsCod)
TT_TimeTable[Weekday][Interval].Columns[Column].GrpCod,
Weekday,
Hour,Min,
- TT_TimeTable[Weekday][Interval].Columns[Column].DurationNumIntervals *
+ TT_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals *
Gbl.TimeTable.Config.SecondsPerInterval,
TT_ClassTypeDB[TT_TimeTable[Weekday][Interval].Columns[Column].ClassType],
TT_TimeTable[Weekday][Interval].Columns[Column].Place,
@@ -624,16 +646,16 @@ static void TT_WriteTutTimeTableIntoDB (long UsrCod)
for (Weekday = 0;
Weekday < TT_DAYS_PER_WEEK;
Weekday++)
- for (Interval = 0, Hour = Gbl.TimeTable.Config.StartHour, Min = 0;
+ for (Interval = 0, Hour = Gbl.TimeTable.Config.Range.Hours.Start, Min = 0;
Interval < Gbl.TimeTable.Config.IntervalsPerDay;
Interval++,
- Hour += (Min + Gbl.TimeTable.Config.MinutesPerInterval) / TT_SECONDS_PER_MINUTE,
- Min = (Min + Gbl.TimeTable.Config.MinutesPerInterval) % TT_SECONDS_PER_MINUTE)
+ Hour += (Min + Gbl.TimeTable.Config.Range.MinutesPerInterval) / TT_SECONDS_PER_MINUTE,
+ Min = (Min + Gbl.TimeTable.Config.Range.MinutesPerInterval) % TT_SECONDS_PER_MINUTE)
for (Column = 0;
Column < TT_MAX_COLUMNS_PER_CELL;
Column++)
if (TT_TimeTable[Weekday][Interval].Columns[Column].IntervalType == TT_FIRST_INTERVAL &&
- TT_TimeTable[Weekday][Interval].Columns[Column].DurationNumIntervals)
+ TT_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals)
{
sprintf (Query,"INSERT INTO timetable_tut"
" (UsrCod,Weekday,StartTime,Duration,Place)"
@@ -642,7 +664,7 @@ static void TT_WriteTutTimeTableIntoDB (long UsrCod)
UsrCod,
Weekday,
Hour,Min,
- TT_TimeTable[Weekday][Interval].Columns[Column].DurationNumIntervals *
+ TT_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals *
Gbl.TimeTable.Config.SecondsPerInterval,
TT_TimeTable[Weekday][Interval].Columns[Column].Place);
DB_QueryINSERT (Query,"can not create office timetable");
@@ -663,14 +685,13 @@ static void TT_FillTimeTableFromDB (long UsrCod)
unsigned long NumRows;
unsigned Weekday;
unsigned Interval;
- unsigned I;
+ unsigned i; // To iterate through intervals
unsigned DurationNumIntervals;
unsigned Column;
unsigned StartTimeSeconds;
unsigned DurationSeconds;
unsigned EndTimeSeconds;
- unsigned ResolutionTable;
- unsigned ResolutionThisClass;
+ struct TT_Range RangeCell;
unsigned FirstFreeColumn;
long GrpCod;
TT_ClassType_t ClassType = TT_FREE; // Initialized to avoid warning
@@ -678,29 +699,6 @@ static void TT_FillTimeTableFromDB (long UsrCod)
bool TimeTableHasSpaceForThisClass;
bool Found;
- /***** Initialize timetable to all free *****/
- for (Weekday = 0;
- Weekday < TT_DAYS_PER_WEEK;
- Weekday++)
- for (Interval = 0;
- Interval < Gbl.TimeTable.Config.IntervalsPerDay;
- Interval++)
- {
- TT_TimeTable[Weekday][Interval].NumColumns = 0;
- for (Column = 0;
- Column < TT_MAX_COLUMNS_PER_CELL;
- Column++)
- {
- TT_TimeTable[Weekday][Interval].Columns[Column].CrsCod = -1L;
- TT_TimeTable[Weekday][Interval].Columns[Column].GrpCod = -1L;
- TT_TimeTable[Weekday][Interval].Columns[Column].IntervalType = TT_FREE_INTERVAL;
- TT_TimeTable[Weekday][Interval].Columns[Column].ClassType = TT_FREE;
- TT_TimeTable[Weekday][Interval].Columns[Column].DurationNumIntervals = 0;
- TT_TimeTable[Weekday][Interval].Columns[Column].Group[0] = '\0';
- TT_TimeTable[Weekday][Interval].Columns[Column].Place[0] = '\0';
- }
- }
-
/***** Get timetable from database *****/
switch (Gbl.TimeTable.Type)
{
@@ -842,11 +840,14 @@ static void TT_FillTimeTableFromDB (long UsrCod)
}
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get timetable");
+ /***** If viewing (not editing) ==>
+ calculate range of hours and resolution *****/
if (!Gbl.TimeTable.Editing)
{
- /***** Calculate the resolution *****/
- /* Initialize resolution for timetable */
- ResolutionTable = TT_Resolutions[TT_NUM_RESOLUTIONS - 1]; // The longest interval
+ /* Initialize hours and resolution for timetable */
+ Gbl.TimeTable.Config.Range.Hours.Start = TT_END_HOUR; // Initialized to maximum hour
+ Gbl.TimeTable.Config.Range.Hours.End = TT_START_HOUR; // Initialized to minimum hour
+ Gbl.TimeTable.Config.Range.MinutesPerInterval = TT_MinutesPerInterval[TT_NUM_RESOLUTIONS - 1]; // The longest interval
for (NumRow = 0;
NumRow < NumRows;
@@ -858,157 +859,184 @@ static void TT_FillTimeTableFromDB (long UsrCod)
if (sscanf (row[1],"%u",&StartTimeSeconds) != 1)
Lay_ShowErrorAndExit ("Wrong start time in timetable.");
- /* Compute resolution for start time */
- ResolutionThisClass = TT_GetResolution (StartTimeSeconds);
- if (ResolutionThisClass < ResolutionTable)
- ResolutionTable = ResolutionThisClass;
-
/* Duration formatted as seconds (row[2]) */
if (sscanf (row[2],"%u",&DurationSeconds) != 1)
Lay_ShowErrorAndExit ("Wrong duration in timetable.");
EndTimeSeconds = StartTimeSeconds + DurationSeconds;
- /* Compute resolution for end time */
- ResolutionThisClass = TT_GetResolution (EndTimeSeconds);
- if (ResolutionThisClass < ResolutionTable)
- ResolutionTable = ResolutionThisClass;
+ /* Compute hours and resolution */
+ TT_CalculateRangeCell (StartTimeSeconds,EndTimeSeconds,&RangeCell);
+ if (RangeCell.Hours.Start < Gbl.TimeTable.Config.Range.Hours.Start)
+ Gbl.TimeTable.Config.Range.Hours.Start = RangeCell.Hours.Start;
+ if (RangeCell.Hours.End > Gbl.TimeTable.Config.Range.Hours.End)
+ Gbl.TimeTable.Config.Range.Hours.End = RangeCell.Hours.End;
+ if (RangeCell.MinutesPerInterval < Gbl.TimeTable.Config.Range.MinutesPerInterval)
+ Gbl.TimeTable.Config.Range.MinutesPerInterval = RangeCell.MinutesPerInterval;
+
}
mysql_data_seek (mysql_res,0);
- /***** End configuration and allocation of timetable *****/
- Gbl.TimeTable.Config.MinutesPerInterval = ResolutionTable;
-
+ /***** Configure and allocate timetable *****/
TT_TimeTableConfigureIntervalsAndAllocateTimeTable ();
}
- /***** Build the table depending on the number of rows of the timetable *****/
- for (NumRow = 0;
- NumRow < NumRows;
- NumRow++)
+ /***** Build the table by filling it from database *****/
+ if (Gbl.TimeTable.Config.HoursPerDay)
{
- row = mysql_fetch_row (mysql_res);
+ /***** Initialize timetable to all free *****/
+ for (Weekday = 0;
+ Weekday < TT_DAYS_PER_WEEK;
+ Weekday++)
+ for (Interval = 0;
+ Interval < Gbl.TimeTable.Config.IntervalsPerDay;
+ Interval++)
+ {
+ TT_TimeTable[Weekday][Interval].NumColumns = 0;
+ for (Column = 0;
+ Column < TT_MAX_COLUMNS_PER_CELL;
+ Column++)
+ {
+ TT_TimeTable[Weekday][Interval].Columns[Column].CrsCod = -1L;
+ TT_TimeTable[Weekday][Interval].Columns[Column].GrpCod = -1L;
+ TT_TimeTable[Weekday][Interval].Columns[Column].IntervalType = TT_FREE_INTERVAL;
+ TT_TimeTable[Weekday][Interval].Columns[Column].ClassType = TT_FREE;
+ TT_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals = 0;
+ TT_TimeTable[Weekday][Interval].Columns[Column].Group[0] = '\0';
+ TT_TimeTable[Weekday][Interval].Columns[Column].Place[0] = '\0';
+ }
+ }
- if (Gbl.TimeTable.Type == TT_MY_TIMETABLE ||
- Gbl.TimeTable.Type == TT_COURSE_TIMETABLE)
- /* Group code */
- if (sscanf (row[6],"%ld",&GrpCod) != 1)
- GrpCod = -1;
+ /***** Fill data from database *****/
+ for (NumRow = 0;
+ NumRow < NumRows;
+ NumRow++)
+ {
+ row = mysql_fetch_row (mysql_res);
- /* Day of week (row[0]) */
- if (sscanf (row[0],"%u",&Weekday) != 1)
- Lay_ShowErrorAndExit ("Wrong day of week in timetable.");
- if (Weekday >= TT_DAYS_PER_WEEK)
- Lay_ShowErrorAndExit ("Wrong day of week in timetable.");
+ if (Gbl.TimeTable.Type == TT_MY_TIMETABLE ||
+ Gbl.TimeTable.Type == TT_COURSE_TIMETABLE)
+ /* Group code */
+ if (sscanf (row[6],"%ld",&GrpCod) != 1)
+ GrpCod = -1;
- /* StartTime formatted as seconds (row[1])
- --> StartTime in number of intervals */
- if (sscanf (row[1],"%u",&StartTimeSeconds) != 1)
- Lay_ShowErrorAndExit ("Wrong start time in timetable.");
- Interval = StartTimeSeconds / Gbl.TimeTable.Config.SecondsPerInterval;
- if (Interval < Gbl.TimeTable.Config.IntervalsBeforeStartHour)
- Lay_ShowErrorAndExit ("Wrong start time in timetable.");
- Interval -= Gbl.TimeTable.Config.IntervalsBeforeStartHour;
+ /* Day of week (row[0]) */
+ if (sscanf (row[0],"%u",&Weekday) != 1)
+ Lay_ShowErrorAndExit ("Wrong day of week in timetable.");
+ if (Weekday >= TT_DAYS_PER_WEEK)
+ Lay_ShowErrorAndExit ("Wrong day of week in timetable.");
- /* Duration formatted as seconds (row[2])
- --> Duration in number of intervals */
- if (sscanf (row[2],"%u",&DurationSeconds) != 1)
- Lay_ShowErrorAndExit ("Wrong duration in timetable.");
- DurationNumIntervals = DurationSeconds / Gbl.TimeTable.Config.SecondsPerInterval;
+ /* StartTime formatted as seconds (row[1])
+ --> StartTime in number of intervals */
+ if (sscanf (row[1],"%u",&StartTimeSeconds) != 1)
+ Lay_ShowErrorAndExit ("Wrong start time in timetable.");
+ Interval = StartTimeSeconds /
+ Gbl.TimeTable.Config.SecondsPerInterval;
+ if (Interval < Gbl.TimeTable.Config.IntervalsBeforeStartHour)
+ Lay_ShowErrorAndExit ("Wrong start time in timetable.");
+ Interval -= Gbl.TimeTable.Config.IntervalsBeforeStartHour;
- /* Type of class (row[4]) */
- switch (Gbl.TimeTable.Type)
- {
- case TT_COURSE_TIMETABLE:
- case TT_MY_TIMETABLE:
- for (ClassType = TT_LECTURE, Found = false;
- ClassType <= TT_TUTORING;
- ClassType++)
- if (!strcmp (row[4],TT_ClassTypeDB[ClassType]))
- {
- Found = true;
- break;
- }
- if (!Found)
- Lay_ShowErrorAndExit ("Wrong type of class in timetable.");
- break;
- case TT_TUTORING_TIMETABLE:
- ClassType = TT_TUTORING;
- break;
- }
+ /* Duration formatted as seconds (row[2])
+ --> Duration in number of intervals */
+ if (sscanf (row[2],"%u",&DurationSeconds) != 1)
+ Lay_ShowErrorAndExit ("Wrong duration in timetable.");
+ DurationNumIntervals = DurationSeconds /
+ Gbl.TimeTable.Config.SecondsPerInterval;
- /* Cell has been read without errors */
- if (TT_TimeTable[Weekday][Interval].NumColumns < TT_MAX_COLUMNS_PER_CELL)
- // If there's place for another column in this cell...
- {
- /* Find the first free column for this day-hour */
- FirstFreeColumn = TT_MAX_COLUMNS_PER_CELL;
- for (Column = 0;
- Column < TT_MAX_COLUMNS_PER_CELL;
- Column++)
- if (TT_TimeTable[Weekday][Interval].Columns[Column].IntervalType == TT_FREE_INTERVAL)
- {
- FirstFreeColumn = Column;
- break;
- }
+ /* Type of class (row[4]) */
+ switch (Gbl.TimeTable.Type)
+ {
+ case TT_COURSE_TIMETABLE:
+ case TT_MY_TIMETABLE:
+ for (ClassType = TT_LECTURE, Found = false;
+ ClassType <= TT_TUTORING;
+ ClassType++)
+ if (!strcmp (row[4],TT_ClassTypeDB[ClassType]))
+ {
+ Found = true;
+ break;
+ }
+ if (!Found)
+ Lay_ShowErrorAndExit ("Wrong type of class in timetable.");
+ break;
+ case TT_TUTORING_TIMETABLE:
+ ClassType = TT_TUTORING;
+ break;
+ }
- if (FirstFreeColumn < TT_MAX_COLUMNS_PER_CELL)
- // If there's place for another column in this cell
- {
- /* Check if there's place for all the rows of this class */
- TimeTableHasSpaceForThisClass = true;
- for (I = Interval + 1;
- I < Interval + DurationNumIntervals &&
- I < Gbl.TimeTable.Config.IntervalsPerDay;
- I++)
- if (TT_TimeTable[Weekday][I].Columns[FirstFreeColumn].IntervalType != TT_FREE_INTERVAL)
- {
- TimeTableIsIncomplete = true;
- TimeTableHasSpaceForThisClass = false;
- break;
- }
- if (TimeTableHasSpaceForThisClass)
- {
- TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].ClassType = ClassType;
- TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].DurationNumIntervals = DurationNumIntervals;
- TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].IntervalType = TT_FIRST_INTERVAL;
- for (I = Interval + 1;
- I < Interval + DurationNumIntervals &&
- I < Gbl.TimeTable.Config.IntervalsPerDay;
- I++)
- {
- TT_TimeTable[Weekday][I].Columns[FirstFreeColumn].IntervalType = TT_NEXT_INTERVAL;
- TT_TimeTable[Weekday][I].NumColumns++;
- }
+ /* Cell has been read without errors */
+ if (TT_TimeTable[Weekday][Interval].NumColumns < TT_MAX_COLUMNS_PER_CELL)
+ // If there's place for another column in this cell...
+ {
+ /* Find the first free column for this day-hour */
+ FirstFreeColumn = TT_MAX_COLUMNS_PER_CELL;
+ for (Column = 0;
+ Column < TT_MAX_COLUMNS_PER_CELL;
+ Column++)
+ if (TT_TimeTable[Weekday][Interval].Columns[Column].IntervalType == TT_FREE_INTERVAL)
+ {
+ FirstFreeColumn = Column;
+ break;
+ }
- /* Course (row[7]), group (row[5]) and place (row[3])*/
- switch (Gbl.TimeTable.Type)
- {
- case TT_MY_TIMETABLE:
- case TT_COURSE_TIMETABLE:
- TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].CrsCod =
- (Gbl.TimeTable.Type == TT_MY_TIMETABLE ? Str_ConvertStrCodToLongCod (row[7]) :
- Gbl.CurrentCrs.Crs.CrsCod);
- Str_Copy (TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].Group,
- row[5],
- Grp_MAX_BYTES_GROUP_NAME);
- TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].GrpCod = GrpCod;
- // no break;
- case TT_TUTORING_TIMETABLE:
- Str_Copy (TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].Place,
- row[3],
- TT_MAX_BYTES_PLACE);
- break;
- }
+ if (FirstFreeColumn < TT_MAX_COLUMNS_PER_CELL)
+ // If there's place for another column in this cell
+ {
+ /* Check if there's place for all the rows of this class */
+ TimeTableHasSpaceForThisClass = true;
+ for (i = Interval + 1;
+ i < Interval + DurationNumIntervals &&
+ i < Gbl.TimeTable.Config.IntervalsPerDay;
+ i++)
+ if (TT_TimeTable[Weekday][i].Columns[FirstFreeColumn].IntervalType != TT_FREE_INTERVAL)
+ {
+ TimeTableIsIncomplete = true;
+ TimeTableHasSpaceForThisClass = false;
+ break;
+ }
+ if (TimeTableHasSpaceForThisClass)
+ {
+ TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].ClassType = ClassType;
+ TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].DurationIntervals = DurationNumIntervals;
+ TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].IntervalType = TT_FIRST_INTERVAL;
+ for (i = Interval + 1;
+ i < Interval + DurationNumIntervals &&
+ i < Gbl.TimeTable.Config.IntervalsPerDay;
+ i++)
+ {
+ TT_TimeTable[Weekday][i].Columns[FirstFreeColumn].IntervalType = TT_NEXT_INTERVAL;
+ TT_TimeTable[Weekday][i].NumColumns++;
+ }
- /* Increment number of items in this cell */
- TT_TimeTable[Weekday][Interval].NumColumns++;
- }
- }
- else
- TimeTableIsIncomplete = true;
- }
- else
- TimeTableIsIncomplete = true;
+ /* Course (row[7]), group (row[5]) and place (row[3])*/
+ switch (Gbl.TimeTable.Type)
+ {
+ case TT_MY_TIMETABLE:
+ case TT_COURSE_TIMETABLE:
+ TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].CrsCod =
+ (Gbl.TimeTable.Type == TT_MY_TIMETABLE ? Str_ConvertStrCodToLongCod (row[7]) :
+ Gbl.CurrentCrs.Crs.CrsCod);
+ Str_Copy (TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].Group,
+ row[5],
+ Grp_MAX_BYTES_GROUP_NAME);
+ TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].GrpCod = GrpCod;
+ // no break;
+ case TT_TUTORING_TIMETABLE:
+ Str_Copy (TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].Place,
+ row[3],
+ TT_MAX_BYTES_PLACE);
+ break;
+ }
+
+ /* Increment number of items in this cell */
+ TT_TimeTable[Weekday][Interval].NumColumns++;
+ }
+ }
+ else
+ TimeTableIsIncomplete = true;
+ }
+ else
+ TimeTableIsIncomplete = true;
+ }
}
/***** Free structure that stores the query result *****/
@@ -1021,29 +1049,64 @@ static void TT_FillTimeTableFromDB (long UsrCod)
/*****************************************************************************/
/****************** Get resolution given a time in seconds *******************/
/*****************************************************************************/
+
+static void TT_CalculateRangeCell (unsigned StartTimeSeconds,
+ unsigned EndTimeSeconds,
+ struct TT_Range *Range)
+ {
+ unsigned TimeMinutes;
+ unsigned MinutesPerIntervalForEndTime;
+
+ /***** Compute minimum hour *****/
+ // Example: if Seconds == 42300 (time == 11:45:00) =>
+ // TimeMinutes = 42300/60 = 705 =>
+ // Hour = 705/60 = 11
+ TimeMinutes = StartTimeSeconds / TT_SECONDS_PER_MINUTE;
+ Range->Hours.Start = TimeMinutes / TT_MINUTES_PER_HOUR;
+
+ /***** Compute maximum hour *****/
+ // Example: if Seconds == 42300 (time == 11:45:00) =>
+ // TimeMinutes = 42300/60 = 705 =>
+ // Hour = 705/60 = 11
+ // 705 % 60 = 45 ==> Hour = Hour+1 = 12
+ TimeMinutes = EndTimeSeconds / TT_SECONDS_PER_MINUTE;
+ Range->Hours.End = TimeMinutes / TT_MINUTES_PER_HOUR;
+ if (TimeMinutes % TT_MINUTES_PER_HOUR)
+ Range->Hours.End++;
+
+ /***** Compute resolution (longest interval necessary for this cell) *****/
+ Range->MinutesPerInterval = TT_CalculateMinutesPerInterval (StartTimeSeconds);
+ if (Range->MinutesPerInterval > TT_MinutesPerInterval[0]) // If not already the shortest
+ {
+ MinutesPerIntervalForEndTime = TT_CalculateMinutesPerInterval (EndTimeSeconds);
+ if (MinutesPerIntervalForEndTime < Range->MinutesPerInterval)
+ Range->MinutesPerInterval = MinutesPerIntervalForEndTime;
+ }
+ }
+
// Example: if Seconds == 42300 (time == 11:45:00) => Minutes = 45 => Resolution = 15
-static unsigned TT_GetResolution (unsigned Seconds)
+static unsigned TT_CalculateMinutesPerInterval (unsigned Seconds)
{
unsigned Minutes;
- unsigned ResolutionThisClass;
- unsigned Resol;
+ unsigned MinutesPerInterval;
+ unsigned Resolution;
- /***** Compute minutes part (45) of a time (11;45:00) from seconds (42300) *****/
+ /***** Compute minutes part (45) of a time (11:45:00) from seconds (42300) *****/
Minutes = (Seconds / TT_SECONDS_PER_MINUTE) % TT_MINUTES_PER_HOUR;
- /***** Compute resolution using minutes part *****/
- ResolutionThisClass = TT_Resolutions[0]; // Default: the shortest interval
- for (Resol = TT_NUM_RESOLUTIONS - 1; // From the longest interval...
- Resol > 0;
- Resol--) // ...to shorter intervals
- if (Minutes % TT_Resolutions[Resol] == 0)
+ /***** Compute minutes per interval *****/
+ MinutesPerInterval = TT_MinutesPerInterval[0]; // Default: the shortest interval
+ for (Resolution = TT_NUM_RESOLUTIONS - 1; // From the longest interval...
+ Resolution > 0;
+ Resolution--) // ...to shorter intervals
+ if (Minutes % TT_MinutesPerInterval[Resolution] == 0)
{
- ResolutionThisClass = TT_Resolutions[Resol];
+ MinutesPerInterval = TT_MinutesPerInterval[Resolution];
break;
}
- return ResolutionThisClass;
+ return MinutesPerInterval;
}
/*****************************************************************************/
@@ -1055,25 +1118,25 @@ static void TT_ModifTimeTable (void)
if (TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].IntervalType == TT_FIRST_INTERVAL)
{
/***** Free this cell *****/
- TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].GrpCod = -1;
- TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].IntervalType = TT_FREE_INTERVAL;
- TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].ClassType = TT_FREE;
- TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].DurationNumIntervals = 0;
- TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].Group[0] = '\0';
- TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].Place[0] = '\0';
+ TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].GrpCod = -1L;
+ TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].IntervalType = TT_FREE_INTERVAL;
+ TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].ClassType = TT_FREE;
+ TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].DurationIntervals = 0;
+ TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].Group[0] = '\0';
+ TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].Place[0] = '\0';
TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].NumColumns--;
}
if (Gbl.TimeTable.ClassType != TT_FREE &&
- Gbl.TimeTable.DurationNumIntervals > 0 &&
+ Gbl.TimeTable.DurationIntervals > 0 &&
TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].NumColumns < TT_MAX_COLUMNS_PER_CELL)
{
/***** Change this cell *****/
TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].NumColumns++;
- TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].GrpCod = Gbl.TimeTable.GrpCod;
- TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].IntervalType = TT_FIRST_INTERVAL;
- TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].ClassType = Gbl.TimeTable.ClassType;
- TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].DurationNumIntervals = Gbl.TimeTable.DurationNumIntervals;
+ TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].GrpCod = Gbl.TimeTable.GrpCod;
+ TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].IntervalType = TT_FIRST_INTERVAL;
+ TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].ClassType = Gbl.TimeTable.ClassType;
+ TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].DurationIntervals = Gbl.TimeTable.DurationIntervals;
Str_Copy (TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].Group,
Gbl.TimeTable.Group,
Grp_MAX_BYTES_GROUP_NAME);
@@ -1111,7 +1174,7 @@ static void TT_DrawTimeTable (void)
"%02u:00"
"",
TT_PERCENT_WIDTH_OF_AN_HOUR_COLUMN,
- Gbl.TimeTable.Config.StartHour);
+ Gbl.TimeTable.Config.Range.Hours.Start);
TT_DrawCellAlignTimeTable ();
TT_TimeTableDrawDaysCells ();
TT_DrawCellAlignTimeTable ();
@@ -1121,7 +1184,7 @@ static void TT_DrawTimeTable (void)
""
"",
TT_PERCENT_WIDTH_OF_AN_HOUR_COLUMN,
- Gbl.TimeTable.Config.StartHour);
+ Gbl.TimeTable.Config.Range.Hours.Start);
/***** Get list of groups types and groups in this course *****/
if (Gbl.Action.Act == ActEdiCrsTT ||
@@ -1129,17 +1192,17 @@ static void TT_DrawTimeTable (void)
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
/***** Write the table row by row *****/
- for (Interval = 0, Min = Gbl.TimeTable.Config.MinutesPerInterval;
+ for (Interval = 0, Min = Gbl.TimeTable.Config.Range.MinutesPerInterval;
Interval < Gbl.TimeTable.Config.IntervalsPerDay;
Interval++,
- Min = (Min + Gbl.TimeTable.Config.MinutesPerInterval) %
+ Min = (Min + Gbl.TimeTable.Config.Range.MinutesPerInterval) %
TT_SECONDS_PER_MINUTE)
{
fprintf (Gbl.F.Out,"
");
/* Left hour:minutes cell */
if (Interval % 2)
- TT_TimeTableDrawHourCell (Gbl.TimeTable.Config.StartHour +
+ TT_TimeTableDrawHourCell (Gbl.TimeTable.Config.Range.Hours.Start +
(Interval + 2) / Gbl.TimeTable.Config.IntervalsPerHour,
Min,
"RIGHT_MIDDLE");
@@ -1191,7 +1254,7 @@ static void TT_DrawTimeTable (void)
TT_TimeTable[Weekday][Interval].Columns[Column].CrsCod,
TT_TimeTable[Weekday][Interval].Columns[Column].IntervalType,
TT_TimeTable[Weekday][Interval].Columns[Column].ClassType,
- TT_TimeTable[Weekday][Interval].Columns[Column].DurationNumIntervals,
+ TT_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals,
TT_TimeTable[Weekday][Interval].Columns[Column].Group,
TT_TimeTable[Weekday][Interval].Columns[Column].GrpCod,
TT_TimeTable[Weekday][Interval].Columns[Column].Place);
@@ -1206,7 +1269,7 @@ static void TT_DrawTimeTable (void)
/* Right hour:minutes cell */
if (Interval % 2)
- TT_TimeTableDrawHourCell (Gbl.TimeTable.Config.StartHour +
+ TT_TimeTableDrawHourCell (Gbl.TimeTable.Config.Range.Hours.Start +
(Interval + 2) / Gbl.TimeTable.Config.IntervalsPerHour,
Min,
"LEFT_MIDDLE");
@@ -1243,10 +1306,7 @@ static void TT_TimeTableDrawAdjustRow (void)
unsigned Minicolumn;
fprintf (Gbl.F.Out,"
"
- ""
- " "
- " | ",
- TT_PERCENT_WIDTH_OF_AN_HOUR_COLUMN);
+ " | ");
TT_DrawCellAlignTimeTable ();
for (Weekday = 0;
Weekday < TT_DAYS_PER_WEEK;
@@ -1254,17 +1314,10 @@ static void TT_TimeTableDrawAdjustRow (void)
for (Minicolumn = 0;
Minicolumn < TT_NUM_MINICOLUMNS_PER_DAY;
Minicolumn++)
- fprintf (Gbl.F.Out,""
- " "
- " | ",
- TT_PERCENT_WIDTH_OF_A_MINICOLUMN);
+ fprintf (Gbl.F.Out," | ");
TT_DrawCellAlignTimeTable ();
- fprintf (Gbl.F.Out,""
- " "
- " | "
- "
",
- TT_PERCENT_WIDTH_OF_AN_HOUR_COLUMN);
+ fprintf (Gbl.F.Out," | "
+ "");
}
/*****************************************************************************/
@@ -1301,15 +1354,12 @@ static void TT_TimeTableDrawDaysCells (void)
static void TT_TimeTableDrawHourCell (unsigned Hour,unsigned Min,const char *Align)
{
- fprintf (Gbl.F.Out,""
+ fprintf (Gbl.F.Out," | "
"%02u:%02u"
" | ",
Min ? "TT_HOUR_SMALL" :
"TT_HOUR_BIG",
Align,
- TT_PERCENT_WIDTH_OF_AN_HOUR_COLUMN,
Hour,Min);
}
@@ -1322,7 +1372,7 @@ static unsigned TT_CalculateColsToDrawInCell (bool TopCall,
{
unsigned ColumnsToDraw;
unsigned Column;
- unsigned I;
+ unsigned i;
unsigned FirstHour;
unsigned Cols;
static bool *TT_IntervalsChecked;
@@ -1351,13 +1401,13 @@ static unsigned TT_CalculateColsToDrawInCell (bool TopCall,
break;
case TT_FIRST_INTERVAL:
/* Check from first hour (this one) to last hour searching maximum number of columns */
- for (I = Interval + 1;
- I < Interval + TT_TimeTable[Weekday][Interval].Columns[Column].DurationNumIntervals;
- I++)
- if (!TT_IntervalsChecked[I])
+ for (i = Interval + 1;
+ i < Interval + TT_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals;
+ i++)
+ if (!TT_IntervalsChecked[i])
{
Cols = TT_CalculateColsToDrawInCell (false, // Recursive call
- Weekday,I);
+ Weekday,i);
if (Cols > ColumnsToDraw)
ColumnsToDraw = Cols;
}
@@ -1369,13 +1419,13 @@ static unsigned TT_CalculateColsToDrawInCell (bool TopCall,
FirstHour--);
/* Check from first hour to last hour searching maximum number of columns */
- for (I = FirstHour;
- I < FirstHour + TT_TimeTable[Weekday][FirstHour].Columns[Column].DurationNumIntervals;
- I++)
- if (!TT_IntervalsChecked[I])
+ for (i = FirstHour;
+ i < FirstHour + TT_TimeTable[Weekday][FirstHour].Columns[Column].DurationIntervals;
+ i++)
+ if (!TT_IntervalsChecked[i])
{
Cols = TT_CalculateColsToDrawInCell (false, // Recursive call
- Weekday,I);
+ Weekday,i);
if (Cols > ColumnsToDraw)
ColumnsToDraw = Cols;
}
@@ -1397,10 +1447,7 @@ static unsigned TT_CalculateColsToDrawInCell (bool TopCall,
static void TT_DrawCellAlignTimeTable (void)
{
- fprintf (Gbl.F.Out,""
- " | ",
- TT_PERCENT_WIDTH_OF_A_SEPARATION_COLUMN);
+ fprintf (Gbl.F.Out," | ");
}
/*****************************************************************************/
@@ -1420,7 +1467,7 @@ static void TT_TimeTableDrawCell (unsigned Weekday,unsigned Interval,unsigned Co
static const char *TimeTableClasses[TT_NUM_CLASS_TYPES] =
{
"TT_FREE", // Free hour
- "TT_THEO", // Theoretical class
+ "TT_LECT", // Theoretical class
"TT_PRAC", // Practical class
"TT_TUTO" // Tutorials
};
@@ -1434,7 +1481,7 @@ static void TT_TimeTableDrawCell (unsigned Weekday,unsigned Interval,unsigned Co
struct GroupData GrpDat;
unsigned NumGrpTyp;
unsigned NumGrp;
- unsigned I;
+ unsigned i;
unsigned Dur;
unsigned MaxDuration;
unsigned RowSpan = 0;
@@ -1488,11 +1535,17 @@ static void TT_TimeTableDrawCell (unsigned Weekday,unsigned Interval,unsigned Co
}
/***** Cell start *****/
- fprintf (Gbl.F.Out," 1)
+ fprintf (Gbl.F.Out," rowspan=\"%u\"",RowSpan);
+ if (ColSpan > 1)
+ fprintf (Gbl.F.Out," colspan=\"%u\"",ColSpan);
+ fprintf (Gbl.F.Out," class=\"%s",TimeTableClasses[ClassType]);
if (ClassType == TT_FREE)
fprintf (Gbl.F.Out,"%u",Interval % 4);
- fprintf (Gbl.F.Out," CENTER_MIDDLE DAT_SMALL\">");
+ else
+ fprintf (Gbl.F.Out," CENTER_MIDDLE DAT_SMALL");
+ fprintf (Gbl.F.Out,"\">");
/***** Form to modify this cell *****/
if (TimeTableView == TT_CRS_EDIT)
@@ -1527,7 +1580,7 @@ static void TT_TimeTableDrawCell (unsigned Weekday,unsigned Interval,unsigned Co
Txt_TIMETABLE_CLASS_TYPES[ClassType],
(DurationNumIntervals / Gbl.TimeTable.Config.IntervalsPerHour), // Hours
(DurationNumIntervals % Gbl.TimeTable.Config.IntervalsPerHour) *
- Gbl.TimeTable.Config.MinutesPerInterval); // Minutes
+ Gbl.TimeTable.Config.Range.MinutesPerInterval); // Minutes
/***** Group *****/
if (TimeTableView == TT_CRS_SHOW)
@@ -1552,12 +1605,12 @@ static void TT_TimeTableDrawCell (unsigned Weekday,unsigned Interval,unsigned Co
break;
case TT_CRS_EDIT:
case TT_TUT_EDIT:
- Par_PutHiddenParamUnsigned ("ModTTDay",Weekday);
- Par_PutHiddenParamUnsigned ("ModTTHour",Interval);
- Par_PutHiddenParamUnsigned ("ModTTCol",Column);
+ Par_PutHiddenParamUnsigned ("TTDay",Weekday);
+ Par_PutHiddenParamUnsigned ("TTInt",Interval);
+ Par_PutHiddenParamUnsigned ("TTCol",Column);
/***** Class type *****/
- fprintf (Gbl.F.Out," |