From f978ef892c9f02d4005e66f691e03166592566f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Tue, 25 Apr 2017 21:20:19 +0200 Subject: [PATCH] Version 16.192 --- css/swad16.189.css | 3266 -------------------------------------------- swad_changelog.h | 7 +- swad_global.h | 6 +- swad_text.c | 21 + swad_timetable.c | 717 +++++----- swad_timetable.h | 10 + 6 files changed, 422 insertions(+), 3605 deletions(-) delete mode 100644 css/swad16.189.css 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,"= Gbl.TimeTable.Config.IntervalsPerHour) ? Gbl.TimeTable.Config.IntervalsPerHour : // MaxDuration >= 1h ==> Dur = 1h - MaxDuration; // MaxDuration < 1h ==> Dur = MaxDuration + MaxDuration; // MaxDuration < 1h ==> Dur = MaxDuration fprintf (Gbl.F.Out,"%u:%02u\" />", (Dur / Gbl.TimeTable.Config.IntervalsPerHour), // Hours (Dur % Gbl.TimeTable.Config.IntervalsPerHour) * - Gbl.TimeTable.Config.MinutesPerInterval); // Minutes + Gbl.TimeTable.Config.Range.MinutesPerInterval); // Minutes } else { /***** Class duration *****/ - fprintf (Gbl.F.Out,""); @@ -1626,7 +1679,7 @@ static void TT_TimeTableDrawCell (unsigned Weekday,unsigned Interval,unsigned Co fprintf (Gbl.F.Out,"
" "", @@ -1668,7 +1721,7 @@ static void TT_TimeTableDrawCell (unsigned Weekday,unsigned Interval,unsigned Co fprintf (Gbl.F.Out,"
" "", diff --git a/swad_timetable.h b/swad_timetable.h index f893449d..70d5a173 100644 --- a/swad_timetable.h +++ b/swad_timetable.h @@ -60,6 +60,16 @@ typedef enum TT_TUTORING = 3, } TT_ClassType_t; +struct TT_Range + { + struct + { + unsigned Start; // Class or table starts at this hour + unsigned End; // Class or table ends at this hour + } Hours; + unsigned MinutesPerInterval; // 5, 15 or 30 minutes + }; + /*****************************************************************************/ /****************************** Public prototypes ****************************/ /*****************************************************************************/