/**
 * 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) . "&nbsp;(" . $firstname . "&nbsp;" . $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 .= "&nbsp;(" . $lang->def('_NUM_SUBSCRIBED') . ":&nbsp;" . $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') . ':&nbsp;<b>' . $date_period . '</b>;</p>';
    //$selector .= $lang->def('_FOR_COMPETENCE').':&nbsp;';
    $selector .= $form->getDropDown($lang->def('_FOR_COMPETENCE') . ':&nbsp;', 'competence_selector', 'sel_competence', $comps_names, $sel_competence, '');
    $selector .= $form->getDropDown($lang->def('_FOR_COURSE') . ':&nbsp;', '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');
}
 public function man_competences_properties()
 {
     $base_url = 'index.php?r=adm/functionalroles/show';
     //read inputs
     $id_fncrole = Get::req('id_fncrole', DOTY_INT, -1);
     if ($id_fncrole <= 0) {
         $this->render('invalid', array('message' => $this->_getErrorMessage('invalid fncrole'), 'back_url' => $base_url));
         return;
     }
     //navigation urls
     $back_url = 'index.php?r=adm/functionalroles/man_competences&id=' . (int) $id_fncrole;
     $list = $this->model->getCompetences($id_fncrole);
     if (count($list) <= 0) {
         Util::jump_to($back_url);
     }
     //no competences to edit
     $cmodel = new CompetencesAdm();
     $cinfo = $cmodel->getCompetencesInfo($list);
     require_once _base_ . '/lib/lib.table.php';
     $table = new Table();
     $head_label = array(Lang::t('_NAME', 'standard'), Lang::t('_DESCRIPTION', 'standard'), Lang::t('_TYPOLOGY', 'competences'), Lang::t('_TYPE', 'competences'), Lang::t('_MIN_SCORE', 'comeptences'), Lang::t('_EXPIRATION_DAYS', 'competences'));
     $head_style = array('', '', 'img-cell', 'img-cell', 'img-cell', 'img-cell');
     $table->addHead($head_label, $head_style);
     $count_score = 0;
     $_std_score = 0;
     $_std_expiration = 0;
     $lang_code = getLanguage();
     $properties = $this->model->getCompetencesProperties($list);
     while (list($key, $value) = each($cinfo)) {
         $line = array();
         $line[] = $value->langs[$lang_code]['name'];
         $line[] = $value->langs[$lang_code]['description'];
         $line[] = $value->typology;
         $line[] = $value->type;
         $line[] = $value->type == 'score' ? Form::getInputTextfield('textfield', 'score_assigned_' . $key, 'properties[' . $key . '][score]', $properties[$key]->score, '', 255) : '-' . Form::getHidden('score_flag_' . $key, 'properties[' . $key . '][score]', 1);
         $line[] = Form::getInputTextfield('textfield', 'expiration_' . $key, 'properties[' . $key . '][expiration]', $properties[$key]->expiration, '', 255);
         $table->addBody($line);
         if ($value->type == 'score') {
             $count_score++;
         }
     }
     $foot = array(array('colspan' => $count_score > 0 ? 4 : 5));
     if ($count_score > 0) {
         //set score to all competences
         $foot[] = Form::getInputTextfield('textfield', 'score_value', false, $_std_score, '', 255) . '<br />' . Form::getButton('set_score', 'set_score', Lang::t('_SET', 'standard'), false, '', true, false) . Form::getButton('reset_score', 'reset_score', Lang::t('_RESET', 'standard'), false, '', true, false);
     }
     //set expiration days to all competences
     $foot[] = Form::getInputTextfield('textfield', 'expiration_value', false, $_std_expiration, '', 255) . '<br />' . Form::getButton('set_expiration', 'set_expiration', Lang::t('_SET', 'standard'), false, '', true, false) . Form::getButton('reset_expiration', 'reset_expiration', Lang::t('_RESET', 'standard'), false, '', true, false);
     $table->addFoot($foot);
     $title_arr = array($base_url => Lang::t('_FUNCTIONAL_ROLE', 'fncroles'), $back_url => Lang::t('_COMPETENCES', 'fncroles') . ': ' . $this->model->getFunctionalRoleName($id_fncrole), Lang::t('_PROPERTIES', 'fncroles'));
     $this->render('man_competences_properties', array('id_fncrole' => $id_fncrole, 'title_arr' => $title_arr, 'table' => $table));
 }
 public function mod_course_competencesTask()
 {
     $id_course = Get::req('id_course', DOTY_INT, 0);
     if ($id_course <= 0) {
         $this->render('invalid', array('message' => $this->_getErrorMessage("invalid course"), 'back_url' => 'index.php?r=' . $this->base_link_competence . '/show'));
         return;
     }
     $back_url = 'index.php?r=' . $this->base_link_competence . '/man_course&id_course=' . (int) $id_course;
     $arr_competences = $this->model->getCourseCompetences($id_course);
     require_once _base_ . '/lib/lib.table.php';
     $table = new Table();
     $label_h = array(Lang::t('_NAME', 'standard'), Lang::t('_DESCRIPTION', 'standard'), Lang::t('_TYPOLOGY', 'competences'), Lang::t('_SCORE', 'competences'));
     $style_h = array('', '', 'img-cell', 'img-cell');
     $table->addHead($label_h, $style_h);
     $counter = 0;
     //how many score type competences
     $info = $this->model->getCompetencesInfo($arr_competences);
     $lang_code = getLanguage();
     $std_value = 0;
     foreach ($info as $id => $competence) {
         if ($competence->type == 'score') {
             $counter++;
             $line = array();
             $line[] = $competence->langs[$lang_code]['name'];
             $line[] = $competence->langs[$lang_code]['description'];
             $line[] = $competence->typology;
             $line[] = Form::getInputTextfield('textfield', 'score_assigned_' . $id, 'score_assigned[' . $id . ']', $std_value, '', 255, '');
             $table->addBody($line);
         }
     }
     if ($counter > 0) {
         $foot = array(array('colspan' => 3, 'label' => ''), Form::getInputTextfield('textfield', 'score_assigned', false, $std_value, '', 255, '') . '<br />' . Form::getButton('set_score', 'set_score', Lang::t('_SET', 'standard'), false, '', true, false) . Form::getButton('reset_score', 'reset_score', Lang::t('_RESET', 'standard'), false, '', true, false));
         $table->addFoot($foot);
         $title_arr = array('index.php?r=' . $this->base_link_course . '/show' => Lang::t('_COURSES', 'course'), $back_url => Lang::t('_COMPETENCES', 'competences'), Lang::t('_SCORE'));
         $this->render('mod_course_assign_score', array('id_course' => $id_course, 'title_arr' => $title_arr, 'table' => $table));
     } else {
         //go back to main page, no score to assign
         Util::jump_to($back_url);
     }
 }