if ($id) {
    $cm = get_coursemodule_from_id('oublog', $id, 0, false, MUST_EXIST);
    $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
    $oublog = $DB->get_record('oublog', array('id' => $cm->instance), '*', MUST_EXIST);
    $PAGE->set_cm($cm);
}
$context = context_module::instance($cm->id);
require_course_login($course, true, $cm);
require_sesskey();
// participation capability check
$canview = oublog_can_view_participation($course, $oublog, $cm, $groupid);
if ($canview != OUBLOG_USER_PARTICIPATION) {
    print_error('nopermissiontoshow');
}
// grading capability check
if (!oublog_can_grade($course, $oublog, $cm, $groupid)) {
    print_error('nopermissiontoshow');
}
$mode = '';
if (!empty($_POST['menu'])) {
    $gradeinfo = $_POST['menu'];
    $oldgrades = oublog_get_participation($oublog, $context, $groupid, $cm, $course);
} else {
    if ($userid && !empty($_POST['grade'])) {
        $gradeinfo[$userid] = $_POST['grade'];
        $user = oublog_get_user_participation($oublog, $context, $userid, $groupid, $cm, $course);
        $oldgrades = array($userid => $user);
    }
}
// update grades
if (!empty($gradeinfo)) {
/**
 * Returns user participation to view in userparticipation.php
 *
 * @param object $oublog current oublog object
 * @param object $context current context
 * @param int $userid required userid term for participation being viewed
 * @param int $groupid optional group id term
 * @param object $cm course-module object
 * @param object $course current course object
 * @param int $start optional start date
 * @param int $end optional end date
 * @param bool $getposts Return post data
 * @param bool $getcomments Return comment data
 * @param int $limitfrom limit posts/comments from
 * @param int $limitnum number of posts/comments (data only) to limit to
 * @param bool $getgrades return grade info
 * @return array user participation
 */
function oublog_get_user_participation($oublog, $context, $userid, $groupid = 0, $cm, $course, $start = null, $end = null, $getposts = true, $getcomments = true, $limitfrom = null, $limitnum = null, $getgrades = false)
{
    global $DB;
    $testgroupid = $groupid;
    if ($oublog->individual > 0) {
        $testgroupid = 0;
    }
    $groupcheck = $testgroupid ? 'AND groupid = :groupid' : '';
    $period = $cperiod = '';
    if ($start) {
        $period = 'AND timeposted > :timestart ';
    }
    if ($end) {
        $period .= 'AND timeposted < :timeend ';
    }
    $postssql = 'SELECT id, title, message, timeposted
        FROM {oublog_posts}
        WHERE oubloginstancesid = (
            SELECT id
            FROM {oublog_instances}
            WHERE oublogid = :oublogid AND userid = :userid
        )
        AND timedeleted IS NULL ' . $groupcheck . $period . '
        ORDER BY timeposted DESC';
    if ($start) {
        $cperiod = 'AND c.timeposted > :timestart ';
    }
    if ($end) {
        $cperiod .= 'AND c.timeposted < :timeend ';
    }
    $authornamefields = get_all_user_name_fields(true, 'a');
    $postauthornamefields = get_all_user_name_fields(true, 'pa', '', 'poster');
    $commentssql = 'SELECT c.id, c.postid, c.title, c.message, c.timeposted,
        a.id AS authorid, ' . $authornamefields . ',' . $postauthornamefields . ',
        p.title AS posttitle, p.timeposted AS postdate
        FROM {user} a, {oublog_comments} c
            INNER JOIN {oublog_posts} p ON (c.postid = p.id)
            INNER JOIN {oublog_instances} bi ON (bi.id = p.oubloginstancesid)
            INNER JOIN {user} pa on bi.userid = pa.id
        WHERE bi.oublogid = :oublogid AND a.id = bi.userid
        AND p.timedeleted IS NULL ' . $groupcheck . $cperiod . '
        AND c.userid = :userid AND c.timedeleted IS NULL
            ORDER BY c.timeposted DESC';
    $params = array('oublogid' => $oublog->id, 'userid' => $userid, 'groupid' => $testgroupid, 'timestart' => $start, 'timeend' => $end);
    $fields = user_picture::fields();
    $fields .= ',username,idnumber';
    $user = $DB->get_record('user', array('id' => $userid), $fields, MUST_EXIST);
    $participation = new stdClass();
    $participation->user = $user;
    $participation->numposts = $DB->get_field_sql("SELECT COUNT(1) FROM ({$postssql}) as p", $params);
    if ($getposts) {
        $participation->posts = $DB->get_records_sql($postssql, $params, $limitfrom, $limitnum);
    } else {
        $participation->posts = array();
    }
    $participation->numcomments = $DB->get_field_sql("SELECT COUNT(1) FROM ({$commentssql}) as p", $params);
    if ($getcomments) {
        $participation->comments = $DB->get_records_sql($commentssql, $params, $limitfrom, $limitnum);
    } else {
        $participation->comments = array();
    }
    if ($getgrades && oublog_can_grade($course, $oublog, $cm, $groupid)) {
        $gradinginfo = grade_get_grades($course->id, 'mod', 'oublog', $oublog->id, array($userid));
        $participation->gradeobj = $gradinginfo->items[0]->grades[$userid];
    }
    return $participation;
}