/** * COURSE PANEL * * This module is a facilitator for the users re-training maded by the public administrators. * The public administrator will be informed of the users that are approching the expiration date for theirs * competences and allow the administrator to re-enroll them to courses that refresh those competences in order to keep * the final users up to date. */ function coursePanel() { //check permissions checkPerm('view'); $can_mod = checkPerm('mod', true); //required libraries require_once _base_ . '/lib/lib.form.php'; require_once _base_ . '/lib/lib.table.php'; require_once _adm_ . '/lib/lib.publicadminmanager.php'; require_once _lms_ . '/lib/lib.course.php'; require_once _lms_ . '/lib/lib.date.php'; require_once _lms_ . '/lib/lib.competences.php'; //back page link $lang =& DoceboLanguage::CreateInstance('public_coursepanel', 'lms'); $back_ui = getBackUi('index.php', $lang->def('_BACK')); $db = DbConn::getInstance(); $man_competences = new Competences_Manager(); //check the admin level of the current user, if it's not an admin or the idst is invalid, return an error $id_pa = getLogUserId(); if (!$id_pa) { //error: the user is invalid cout($back_ui . $lang->def('_INVALID_ADMIN') . $back_ui, 'content'); return; } /* //months considered $this_month = (int)date("m"); $month_1 = ((int)$this_month-1+1) % 12; $month_1++; $month_2 = ((int)$this_month-1+2) % 12; $month_2++; $months = array( $lang->def('MONTH_'.((int)$this_month<10 ? '0' : '').(int)$this_month), $lang->def('MONTH_'.((int)$month_1<10 ? '0' : '').(int)$month_1), $lang->def('MONTH_'.((int)$month_2<10 ? '0' : '').(int)$month_2) ); */ $acl_man = Docebo::user()->getAclManager(); $admin_manager = new PublicAdminManager(); $array_users = array(); $idst_associated = $admin_manager->getAdminTree($id_pa); $array_users =& $acl_man->getAllUsersFromIdst($idst_associated); $array_users = array_unique($array_users); if (empty($array_users)) { //error: no users to deal with cout($back_ui . $lang->def('_NO_USERS') . $back_ui, 'content'); return; } //already selected competence and course, if exist $sel_competence = Get::req('sel_competence', DOTY_INT, false); $sel_course = Get::req('sel_course', DOTY_INT, false); //$lang_code = Get::req('language', DOTY_ALPHANUM, getLanguage()); $comps_1 = array(); $comps_2 = array(); //retrieve competences list for dropdown menu -- two steps filter //retrieve competences by users $query_competences_1 = "SELECT c.id_competence, cu.id_user FROM " . " %lms_competence as c JOIN " . " %lms_competence_user as cu ON " . " (c.id_competence=cu.id_competence AND cu.id_user IN (" . implode(",", $array_users) . "))"; $res_competences_1 = $db->query($query_competences_1); while (list($id_comp, $id_user) = $db->fetch_row($res_competences_1)) { $comps_1[$id_comp] = $id_user; } if (empty($comps_1)) { //error, no competences cout($back_ui . $lang->def('_NO_COMPETENCES') . $back_ui, 'content'); return; } //get number of days in which check if a course or a edition is starting $course_check_time = Docebo::user()->preference->getAdminPreference('admin_rules.course_check_time'); //days from today //retrieve competences by courses $courses_dropdown = array(); $query_competences_2 = "(SELECT c.id_competence, t.idCourse, t.name, t.course_type, cc.retraining FROM " . " %lms_competence as c JOIN " . " %lms_competence_course as cc JOIN " . " %lms_course as t ON " . "(c.id_competence=cc.id_competence AND cc.id_course=t.idCourse) " . "WHERE t.course_type IN ('classroom', 'elearning') AND c.id_competence IN (" . implode(",", array_keys($comps_1)) . ")" . ")"; /*." UNION (SELECT c.id_competence, t.idCourse, t.name, t.course_type, cc.retraining FROM ". $GLOBALS['prefix_lms']."_competence as c JOIN ". $GLOBALS['prefix_lms']."_competence_course as cc JOIN ". $GLOBALS['prefix_lms']."_course as t ON ". "(c.id_competence=cc.id_competence AND cc.id_course=t.idCourse) ". "WHERE t.course_type IN ('classroom', 'elearning') AND c.id_competence IN (".implode(",", array_keys($comps_1)).")". ")";*/ $res_competences_2 = $db->query($query_competences_2); while (list($id_comp, $id_course, $course_name, $c_type, $retraining) = $db->fetch_row($res_competences_2)) { $comps_2[$id_comp] = $id_course; if (!isset($courses_dropdown[$id_comp])) { $courses_dropdown[$id_comp] = array(); } $courses_dropdown[$id_comp][$id_course] = $course_name . ' (' . $c_type . ')' . ($retraining > 0 ? ' [' . $lang->def('_RETRAINING') . ']' : ''); } if (empty($comps_2)) { //error, no competences cout($back_ui . $lang->def('_NO_COMPETENCES') . $back_ui, 'content'); return; } $comps = array_keys($comps_2); unset($comps_1); unset($comps_2); $comps_names = $man_competences->getCompetencesName($comps); //---------------------------------------------------------------------------- //retrieve courses for competences //$courses_dropdown = array(); //check if selection for competence and course is valid if (!$sel_competence || !array_key_exists($sel_competence, $comps)) { $arr = array_keys($courses_dropdown); $sel_competence = $arr[0]; //$comps[0]; } if (!$sel_course || !isset($courses_dropdown[$sel_competence][$sel_course])) { foreach ($courses_dropdown as $key => $val) { if (count($val) > 0) { $sel_competence = $key; $arr = array_keys($val); $sel_course = $arr[0]; break; } } } //check the course type (base or retraining) $is_retraining = $man_competences->isRetrainingCourse($sel_course, $sel_competence); //make script for courses dropdown auto-updating require_once _base_ . '/lib/lib.json.php'; $json = new Services_JSON(); $var = array(); foreach ($courses_dropdown as $id_comp => $courses_list) { $content = "{id_competence: " . (int) $id_comp . ", courses: ["; $clist = array(); foreach ($courses_list as $id_course => $name) { $clist[] = '{id_course: ' . (int) $id_course . ', name: ' . $json->encode($name) . '}'; } $content .= implode(',', $clist) . "]}"; $var[] = $content; } //addYahooJs(array('dom'=>'dom-min.js', 'event'=>'event-min.js', 'selector'=>'selector-beta-min.js')); YuiLib::load('selector'); cout('<script type="text/javascript"> var sel_options = [' . implode(',', $var) . ']; YAHOO.util.Event.onDOMReady(function() { var s1 = YAHOO.util.Dom.get("competence_selector"); var s2 = YAHOO.util.Dom.get("course_selector"); YAHOO.util.Event.addListener(s1, "change", function(e) { var opt, id_comp = this.value; for (var i=0; i<sel_options.length; i++) { if (sel_options[i].id_competence == id_comp) { s2.innerHTML = ""; for (var j=0; j<sel_options[i].courses.length; j++) { opt = new Option(sel_options[i].courses[j].name, sel_options[i].courses[j].id_course); s2.add(opt, null); } break; } } }); }); </script>', 'page_head'); //---------------------------------------------------------------------------- $table_head_style = array('', 'image', 'align_center'); $table_head_content = array($lang->def('_USERNAME'), $lang->def('_MANDATORY'), $lang->def('_DATE_EXPIRE')); $man_course = new Man_Course(); $date_man = new DateManager(); $course_info = $man_course->getCourseInfo($sel_course); //echo '<pre>'.print_r($course_info, true).'</pre>'; if ($course_info['course_type'] == 'elearning') { $editions[] = (int) $sel_course; $subscribed[$sel_course] = getSubscribed($sel_course); $table_head_content[] = $course_info['name']; $table_head_style[] = 'align_center'; } elseif ($course_info['course_type'] == 'classroom') { //retrieve editions for table columns and subscribed users $subscribed = array(); $editions = array(); if ($course_check_time > 0) { $id_list = array(); $query_begindates = "SELECT dy.id_date, MIN(dy.date_begin) as date_begin " . " FROM %lms_course_date as dt " . " JOIN %lms_course_date_day as dy ON (dy.id_date = dt.id_date) " . " WHERE dt.id_course='" . (int) $sel_course . "' GROUP BY dy.id_date ORDER BY dy.date_begin"; $res = $db->query($query_begindates); while (list($id_date, $date_begin) = $db->fetch_row($res)) { if ($date_begin >= date("Y-m-d") && $date_begin <= date("Y-m-d", strtotime("+" . $course_check_time . " days"))) { $id_list[] = $id_date; } } /* $query_editions = "SELECT dt.id_date, dt.id_course, dt.code, dt.name, MIN(dy.date_begin) as min " ." FROM %lms_course_date as dt " ." JOIN %lms_course_date_day as dy ON (dy.id_date = dt.id_date) " ." WHERE dt.id_course='".(int)$sel_course."' AND dy.date_begin BETWEEN NOW() AND '" .date("Y-m-d", strtotime("+".$course_check_time." days"))."' GROUP BY dt.id_date ORDER BY dy.date_begin"; */ $query_editions = "SELECT id_date, id_course, code, name FROM %lms_course_date WHERE " . (count($id_list) > 0 ? "id_date IN (" . implode(",", $id_list) . ") " : "0"); } else { $query_editions = "SELECT id_date, id_course, code, name FROM %lms_course_date WHERE id_course='" . (int) $sel_course . "' "; } $res_editions = $db->query($query_editions); if (sql_num_rows($res_editions) > 0) { while (list($id_edition, $id_course, $code, $name) = $db->fetch_row($res_editions)) { $table_head_style[] = 'align_center'; $date_info = $date_man->getDateInfo($id_edition); $table_head_content[] = $name . '<br />' . $lang->def('_DATE_BEGIN') . ': ' . Format::date($date_info['date_begin'], 'date') . '<br />' . $lang->def('_DATE_END') . ': ' . Format::date($date_info['date_end'], 'date') . '<br />' . $lang->def('_AVAIL_PLACES') . ': <span id="available_places_count_' . $id_edition . '">' . (int) ($date_info['max_par'] - $date_info['user_subscribed']) . '</span> (' . $date_info['max_par'] . ')'; $editions[] = $id_edition; $subscribed[$id_edition] = $date_man->getDateSubscribed($id_edition); } } else { } } //retrieve expiration time for every user $expiries = array(); $query_check = "SELECT id_user, date_expire " . " FROM %lms_competence_user " . " WHERE id_user IN (" . implode(",", $array_users) . ") AND id_competence='" . (int) $sel_competence . "'"; $res_check = $db->query($query_check); while (list($id_user, $date_expire) = $db->fetch_row($res_check)) { $expiries[$id_user] = $date_expire; } //filter array of user ids by competence $filtered_users = array(); //------------------------------------------------------------------------------ $required_filter = Get::req('required_filter', DOTY_INT, 0); $expire_duration = $man_competences->getCompetenceExpirationCheckTime($id_comp); if ($is_retraining || $required_filter > 0) { $query_filter_time = ""; if ($expire_duration > 0) { //if a time for checking expiration has been set, then filter on a time period $date_begin = date("Y-m-d", strtotime("-" . $expire_duration . " days")); $date_end = date("Y-m-d", strtotime("+" . $expire_duration . " days")); $query_filter_time = " AND date_expire>'" . $date_begin . "' AND date_expire<'" . $date_end . "'"; } $query_filter = "SELECT id_user FROM %lms_competence_user WHERE id_user IN (" . implode(",", $array_users) . ") AND id_competence='" . (int) $sel_competence . "' " . $query_filter_time; $res_filter = $db->query($query_filter); while (list($idst) = $db->fetch_row($res_filter)) { $filtered_users[] = $idst; } } if (!$is_retraining || $required_filter > 0) { //get user with required competence which is not yet obtained $required_users = array(); $req_data = $man_competences->GetCompetence($sel_competence); $already = array(); $query = "SELECT id_user, score_init, score_got FROM %lms_competence_user WHERE id_competence='" . (int) $sel_competence . "'"; $res = $db->query($query); while (list($id_user, $score_init, $score_got) = $db->fetch_row($res)) { if ($req_data['type'] == 'score') { //if the competence assignment exists in DB, but the total score is 0, then it's considered as non-assigned if ((int) $score_init + (int) $score_got > 0) { $already[] = $id_user; } } else { $already[] = $id_user; } } $already = array_unique($already); $req_users = array_diff($array_users, $already); //get required competences not got from users $query = ""; if ($req_data['type'] == 'score') { $query = "SELECT u.idst FROM %lms_competence_required as cr " . " JOIN %adm_user as u ON (cr.idst = u.idst)" . " WHERE cr.idst IN (" . implode(",", $req_users) . ") AND cr.id_competence=" . (int) $sel_competence . ""; } else { $query = "SELECT u.idst FROM %lms_competence_required as cr " . " JOIN %adm_user as u ON (cr.idst = u.idst) " . " WHERE cr.idst IN (" . implode(",", $req_users) . ") AND cr.id_competence=" . (int) $sel_competence . ""; } $res = $db->query($query); if (sql_num_rows($res) > 0) { while (list($idst) = $db->fetch_row($res)) { $required_users[] = $idst; } } //get users expired from too long time if ($expire_duration > 0) { $query = "SELECT id_user FROM %lms_competence_user " . " WHERE date_expire<'" . date("Y-m-d", strtotime("-" . $expire_duration . " days")) . "' AND date_expire<>'0000-00-00 00:00:00' " . " AND id_competence=" . (int) $sel_competence; $res = $db->query($query); while (list($idst) = $db->fetch_row($res)) { $required_users[] = $idst; } } //merge results if (count($required_users) > 0) { if (count($filtered_users) > 0) { $filtered_users = array_merge($filtered_users, $required_users); } else { $filtered_users = $required_users; } } } //------------------------------------------------------------------------------ $filtered_users = array_unique($filtered_users); //draw table $table = new Table(0); $form = new Form(); $table->addHead($table_head_content, $table_head_style); $totals = array(); for ($i = 0; $i < count($editions); $i++) { $totals[$i] = 0; } //check the expiration time of the current competence list($expiry_time) = $db->fetch_row($db->query("SELECT expiration FROM %lms_competence WHERE id_competence='" . (int) $sel_competence . "'")); if ($expiry_time === false) { //error, we need a number (it should never enter this branch though) //error, no competences cout($back_ui . $lang->def('_NO_EXPIRATION_TIME') . $back_ui, 'content'); return; } $checkbox_list_script = array(); foreach ($editions as $id_edition) { $checkbox_list_script[$id_edition] = array(); } $expiring_users_count = 0; $req_count = 0; //filtered data to consider in saving operation $to_consider = array('users' => array(), 'editions' => array()); for ($i = 0; $i < count($editions); $i++) { $to_consider['editions'][] = $editions[$i]; } //retrieve users' data for table rows (little fast query) if (count($filtered_users) > 0) { $query_users = "SELECT idst, userid, lastname, firstname FROM %adm_user WHERE idst IN (" . implode(",", $filtered_users) . ") ORDER BY userid, lastname, firstname"; $res_users = $db->query($query_users); //retrieve users with required competence $just_required = array(); $query_req = "SELECT idst FROM %lms_competence_required " . " WHERE id_competence=" . (int) $sel_competence . " AND idst IN (" . implode(",", $filtered_users) . ")"; $res_req = $db->query($query_req); while (list($idst) = $db->fetch_row($res_req)) { $just_required[] = $idst; } while (list($idst, $userid, $firstname, $lastname) = $db->fetch_row($res_users)) { $line = array(); //filtered users to consider in saving operations $to_consider['users'][] = $idst; //check if the expiring date of the competence is less than 30 days from now or it's already expired (change bg color then) $user_expiring = false; $background = ""; if ($expiry_time > 0) { if (isset($expiries[$idst])) { //$time1 = fromDateTimeToTimestamp($expiries[$idst]) + $expiry_time * 24 * 3600; //$time2 = time(); //if (($time2-$time1) < 2592000) $user_expiring = true; if ($expiries[$idst] < date("Y-m-d H:i:s")) { $user_expiring = true; } } } if ($user_expiring) { $background .= 'bg_highlight'; $expiring_users_count++; } $line[] = $acl_man->relativeId($userid) . " (" . $firstname . " " . $lastname . ")"; //swap these $is_req = in_array($idst, $just_required); if ($is_req) { $req_count++; } $line[] = $is_req ? '<image src="' . getPathImage('framework') . 'standard/flag.gif" />' : ''; $line[] = '<div class="' . $background . '">' . (isset($expiries[$idst]) ? Format::date($expiries[$idst], "date") : '-') . '</div>'; for ($i = 0; $i < count($editions); $i++) { //check if the actual considered user is subscribed to this class' edition (then flag the checkbox) $is_subscribed = false; if (isset($subscribed[$editions[$i]][$idst])) { $is_subscribed = true; $totals[$i]++; //update total subscriptions } if ($course_info['course_type'] == 'elearning') { $line[] = '<div class="align_center">' . $form->getInputCheckbox('subscriptions_' . $idst, 'subscriptions[' . $idst . '][' . $editions[$i] . ']', 1, $is_subscribed, false) . '</div>'; $checkbox_list_script[$editions[$i]][] = '"subscriptions_' . $idst . '"'; } elseif ($course_info['course_type'] == 'classroom') { $line[] = '<div class="align_center">' . $form->getInputCheckbox('subscriptions_' . $idst . '_' . $editions[$i], 'subscriptions[' . $idst . '][' . $editions[$i] . ']', 1, $is_subscribed, false) . '</div>'; $checkbox_list_script[$editions[$i]][] = '"subscriptions_' . $idst . '_' . $editions[$i] . '"'; } } $table->addBody($line); } } //totals line $line = array(); $line[] = $lang->def('_TOTAL'); $line[] = '<div class="align_center">' . (int) $req_count . '</div>'; $line[] = '<div class="align_center">' . (int) $expiring_users_count . '</div>'; for ($i = 0; $i < count($editions); $i++) { $line[] = '<div class="align_center">' . (int) $totals[$i] . '</div>'; } $table->addFoot($line); //echo '<pre class="align_left">'.print_r($checkbox_list_script, true).'</pre>'; //script to check available places in real-time $avail_script = '<script type="text/javascript"> function setupAvailablePlaces() {'; foreach ($editions as $id_edition) { $date_info = $date_man->getDateInfo($id_edition); $avail_script .= ' YAHOO.util.Event.addListener([' . implode(',', $checkbox_list_script[$id_edition]) . '], "click", function(e, o) { max_avail_places_' . $id_edition . ' = ' . (int) ($date_info['max_par'] - $date_info['user_subscribed']) . '; var i, edition_boxes = YAHOO.util.Dom.get([' . implode(',', $checkbox_list_script[$id_edition]) . ']); var edition_count = 0, edition_max = ' . (int) $date_info['max_par'] . '; for (i=0; i<edition_boxes.length; i++) { if (edition_boxes[i].checked) edition_count++; } YAHOO.util.Dom.get("available_places_count_' . $id_edition . '").innerHTML = ""+(edition_max - edition_count); if (edition_count >= edition_max) { for (i=0; i<edition_boxes.length; i++) { if (!edition_boxes[i].checked) edition_boxes[i].disabled = true; } } else { for (i=0; i<edition_boxes.length; i++) { if (edition_boxes[i].disabled) edition_boxes[i].disabled = false; } } });'; } $avail_script .= '} setupAvailablePlaces(); </script>'; cout($avail_script, 'page_head'); //any error message from previous operations? $message = ""; $err = Get::req('err', DOTY_MIXED, false); switch ($err) { case 'invalid': $message .= getErrorUi($lang->def('_ERROR_WHILE_SUBSCRIBING') . '.'); break; case 'ok': $content = $lang->def('_SUBSCRIBE_SUCCESSFULL'); $count = Get::req('count', DOTY_MIXED, false); if ($count !== false && is_numeric($count)) { $content .= " (" . $lang->def('_NUM_SUBSCRIBED') . ": " . $count . ")"; } $message .= getResultUi($content); break; } //print page cout(getTitleArea($lang->def('_COURSEPANEL'), 'coursepanel') . '<div class="std_block">' . $message . $back_ui, 'content'); cout('<link rel="stylesheet" type="text/css" href="' . Get::rel_path('base') . '/addons/yui/grids/grids-min.css">', 'page_head'); $comps_list = $man_competences->GetCompetencesList(); //write period of checking for expiration, from beginning date to ending date $date_1 = $expire_duration > 0 ? date("Y-m-d H:i:s", strtotime("-" . $expire_duration . " days")) : ""; $date_2 = $expire_duration > 0 ? date("Y-m-d H:i:s", strtotime("+" . $expire_duration . " days")) : ""; if ($date_1 != "" && $date_2 != "") { $date_period = Format::date($date_1, "date") . ' - ' . Format::date($date_2, "date"); } else { $date_period = '(' . $lang->def('_ALL') . ')'; } $selector = ""; //$selector .= $form->openElementSpace(); $selector .= '<div class="yui-g"><div id="select_1" class="yui-u first align_left">'; $selector .= $form->openForm('action_panel', "index.php?modname=public_coursepanel&op=coursepanel"); $selector .= $form->openElementSpace(); $selector .= '<p class="align_left">' . $lang->def('_EXPIRING_USERS_FOR_PERIOD') . ': <b>' . $date_period . '</b>;</p>'; //$selector .= $lang->def('_FOR_COMPETENCE').': '; $selector .= $form->getDropDown($lang->def('_FOR_COMPETENCE') . ': ', 'competence_selector', 'sel_competence', $comps_names, $sel_competence, ''); $selector .= $form->getDropDown($lang->def('_FOR_COURSE') . ': ', 'course_selector', 'sel_course', $courses_dropdown[$sel_competence], $sel_course, ''); $selector .= $form->openButtonSpace(); $selector .= $form->getButton('update', 'update', $lang->def('_UPDATE')); $selector .= $form->closeButtonSpace(); $selector .= $form->closeElementSpace(); $selector .= $form->closeForm(); $selector .= '</div><div id="select_2" class="yui-u align_left">'; //if (count($comps_list)>0) { ... $selector .= $form->openElementSpace(); $selector .= $form->openForm('action_panel', "index.php?modname=public_coursepanel&op=expired"); $selector .= $form->getHidden('expire_sel_competence', 'sel_competence', $sel_competence); $selector .= $form->getHidden('expire_sel_course', 'sel_course', $sel_course); $selector .= $form->getDropdown($lang->def('_CHOOSE_COMPETENCE_TO_SEE_EXPIRED'), 'expired_selector', 'expired_selector', $comps_list); $selector .= $form->openButtonSpace(); $selector .= $form->getButton('update_expired', 'update_expired', $lang->def('_UPDATE')); $selector .= $form->closeButtonSpace(); $selector .= $form->closeForm(); $selector .= $form->getBreakRow(); $selector .= $form->openForm('action_panel', "index.php?modname=public_coursepanel&op=required"); $selector .= $form->getHidden('expire_sel_competence_req', 'sel_competence_req', $sel_competence); $selector .= $form->getHidden('expire_sel_course_req', 'sel_course_req', $sel_course); $selector .= $form->getDropDown($lang->def('_CHOOSE_REQUIRED_COMPETENCES'), 'required_selector', 'required_selector', $comps_list); $selector .= $form->openButtonSpace(); $selector .= $form->getButton('update_required', 'update_required', $lang->def('_UPDATE')); $selector .= $form->closeButtonSpace(); $selector .= $form->closeForm(); $selector .= $form->closeElementSpace(); $selector .= '</div></div><div class="no_float"></div>'; //$selector .= $form->closeElementSpace(); //legend which explains what highlighted users mean $legend = '<div class="align_left"><div style="display:inline-block;width:12px;height:12px;" class="bg_highlight"></div> = ' . $lang->def('_EXPIRED_COMPETENCE') . '</div>'; cout('<div class="align_center">' . $selector . '</div>', 'content'); cout($form->openForm('comp_panel', "index.php?modname=public_coursepanel&op=savepanel"), 'content'); cout($form->getHidden('sel_competence', 'sel_competence', $sel_competence), 'content'); cout($form->getHidden('sel_course', 'sel_course', $sel_course), 'content'); cout($form->openElementSpace(), 'content'); cout('<div class="align_left">', 'content'); if ($is_retraining) { cout($form->getCheckbox($lang->def('_SHOW_REQUIRED'), 'required_filter', 'required_filter', 1, $required_filter), 'content'); } else { cout($form->getCheckbox($lang->def('_SHOW_EXPIRED'), 'required_filter', 'required_filter', 1, $required_filter), 'content'); } cout('</div>', 'content'); cout($form->closeElementSpace(), 'content'); cout('<div class="align_left">', 'content'); cout('<p>' . ($is_retraining ? $lang->def('_IS_RETRAINING_COURSE') : $lang->def('_IS_TRAINING_COURSE')) . '</p>', 'content'); if ($course_info['course_type'] == 'classroom' && $course_check_time > 0) { $check_date_1 = Format::date(date("Y-m-d"), "date"); $check_date_2 = Format::date(date("Y-m-d H:i:s", strtotime("+" . $course_check_time . " days")), "date"); cout('<p>' . $lang->def('_COURSE_CHECKING_PERIOD') . ': ' . $check_date_1 . ' - ' . $check_date_2 . '</p>', 'content'); } cout('</div>', 'content'); if (empty($editions)) { //no editions to display (it should have been pre-selected only courses with available editions) cout('<p>' . $lang->def('_NO_CONTENT') . '</p>', 'content'); } else { cout($table->getTable(), 'content'); } cout($legend, 'content'); cout($form->getHidden('to_consider', 'to_consider', base64_encode($json->encode($to_consider))), 'content'); cout($form->openButtonSpace() . $form->getButton('save', 'save', $lang->def('_SAVE')) . $form->getButton('undo', 'undo', $lang->def('_UNDO')) . $form->closeButtonSpace(), 'content'); cout($form->closeForm() . $back_ui . '</div>', 'content'); cout('<script type="text/javascript"> YAHOO.util.Event.addListener("required_filter", "click", function(e) { var show_required = this.checked, comp_form = YAHOO.util.Dom.get("comp_panel"); comp_form.action = comp_form.action.replace("&op=savepanel", "&op=coursepanel"); comp_form.submit(); }); </script>', 'page_head'); }