Merge branch 'MDL-46591-master' of git://github.com/danpoltawski/moodle
authorDan Poltawski <dan@moodle.com>
Tue, 29 Jul 2014 15:32:52 +0000 (16:32 +0100)
committerDan Poltawski <dan@moodle.com>
Tue, 29 Jul 2014 15:32:52 +0000 (16:32 +0100)
123 files changed:
admin/tool/behat/tests/behat/data_generators.feature
blocks/course_summary/tests/behat/block_course_summary_frontpage.feature
blocks/login/block_login.php
blog/lib.php
cohort/assign.php
cohort/edit.php
cohort/edit_form.php
cohort/index.php
cohort/lib.php
cohort/tests/behat/add_cohort.feature
cohort/tests/behat/view_cohorts.feature [new file with mode: 0644]
cohort/tests/cohortlib_test.php
enrol/cohort/yui/quickenrolment/quickenrolment.js
enrol/self/lib.php
filter/tex/latex.php
filter/tex/lib.php
filter/tex/settings.php
filter/tex/texdebug.php
lang/en/cohort.php
lib/accesslib.php
lib/classes/grades_external.php
lib/classes/task/manager.php
lib/classes/task/scheduled_task.php
lib/csvlib.class.php
lib/db/install.xml
lib/db/upgrade.php
lib/editor/atto/plugins/accessibilitychecker/lang/en/atto_accessibilitychecker.php
lib/editor/atto/plugins/accessibilitychecker/lib.php
lib/editor/atto/plugins/accessibilitychecker/tests/behat/accessibilitychecker.feature
lib/editor/atto/plugins/accessibilitychecker/yui/build/moodle-atto_accessibilitychecker-button/moodle-atto_accessibilitychecker-button-debug.js
lib/editor/atto/plugins/accessibilitychecker/yui/build/moodle-atto_accessibilitychecker-button/moodle-atto_accessibilitychecker-button-min.js
lib/editor/atto/plugins/accessibilitychecker/yui/build/moodle-atto_accessibilitychecker-button/moodle-atto_accessibilitychecker-button.js
lib/editor/atto/plugins/accessibilitychecker/yui/src/button/js/button.js
lib/filestorage/file_storage.php
lib/outputrenderers.php
lib/tests/behat/behat_data_generators.php
lib/yui/build/moodle-core-notification-ajaxexception/moodle-core-notification-ajaxexception-debug.js
lib/yui/build/moodle-core-notification-ajaxexception/moodle-core-notification-ajaxexception-min.js
lib/yui/build/moodle-core-notification-ajaxexception/moodle-core-notification-ajaxexception.js
lib/yui/build/moodle-core-notification-alert/moodle-core-notification-alert-debug.js
lib/yui/build/moodle-core-notification-alert/moodle-core-notification-alert-min.js
lib/yui/build/moodle-core-notification-alert/moodle-core-notification-alert.js
lib/yui/build/moodle-core-notification-confirm/moodle-core-notification-confirm-debug.js
lib/yui/build/moodle-core-notification-confirm/moodle-core-notification-confirm-min.js
lib/yui/build/moodle-core-notification-confirm/moodle-core-notification-confirm.js
lib/yui/build/moodle-core-notification-exception/moodle-core-notification-exception-debug.js
lib/yui/build/moodle-core-notification-exception/moodle-core-notification-exception-min.js
lib/yui/build/moodle-core-notification-exception/moodle-core-notification-exception.js
lib/yui/src/notification/js/ajaxexception.js
lib/yui/src/notification/js/alert.js
lib/yui/src/notification/js/confirm.js
lib/yui/src/notification/js/exception.js
message/lib.php
message/tests/messagelib_test.php
mod/assign/gradingtable.php
mod/assign/locallib.php
mod/assign/tests/locallib_test.php
mod/chat/backup/moodle1/lib.php
mod/chat/backup/moodle2/backup_chat_activity_task.class.php
mod/chat/backup/moodle2/backup_chat_stepslib.php
mod/chat/backup/moodle2/restore_chat_activity_task.class.php
mod/chat/backup/moodle2/restore_chat_stepslib.php
mod/chat/chat_ajax.php
mod/chat/chatd.php
mod/chat/db/access.php
mod/chat/db/log.php
mod/chat/db/upgrade.php
mod/chat/gui_ajax/index.php
mod/chat/gui_ajax/module.js
mod/chat/gui_ajax/theme/bubble/config.php
mod/chat/gui_ajax/theme/compact/config.php
mod/chat/gui_ajax/theme/course_theme/config.php
mod/chat/gui_basic/index.php
mod/chat/gui_header_js/chatinput.php
mod/chat/gui_header_js/index.php
mod/chat/gui_header_js/insert.php
mod/chat/gui_header_js/jsupdate.php
mod/chat/gui_header_js/jsupdated.php
mod/chat/gui_header_js/module.js
mod/chat/gui_header_js/users.php
mod/chat/gui_sockets/chat_gui_sockets.js
mod/chat/gui_sockets/chatinput.php
mod/chat/gui_sockets/index.php
mod/chat/index.php
mod/chat/lang/en/chat.php
mod/chat/lib.php
mod/chat/locallib.php
mod/chat/mod_form.php
mod/chat/renderer.php
mod/chat/report.php
mod/chat/settings.php
mod/chat/version.php
mod/chat/view.php
mod/forum/discuss.php
mod/forum/lang/en/forum.php
mod/forum/lib.php
mod/forum/renderer.php
mod/forum/styles.css
mod/forum/tests/behat/discussion_navigation.feature [new file with mode: 0644]
mod/forum/tests/lib_test.php
mod/lti/mod_form.js
mod/scorm/datamodels/aicc.js
mod/scorm/datamodels/aicc.php
mod/scorm/datamodels/debug.js.php
mod/scorm/datamodels/scorm_12.js
mod/scorm/datamodels/scorm_12.php
mod/scorm/datamodels/scorm_13.js
mod/scorm/datamodels/scorm_13.php
mod/scorm/locallib.php
mod/scorm/module.js
mod/scorm/view.js
rating/index.php
rating/lib.php
rating/module.js
rating/rate.php
rating/rate_ajax.php
rating/tests/rating_test.php
rss/file.php
rss/index.html [deleted file]
rss/renderer.php
user/externallib.php
user/filters/lib.php
version.php

index 3561419..2b9dfdf 100644 (file)
@@ -252,3 +252,25 @@ Feature: Set up contextual data for tests
     And the "members" select box should contain "Student 1"
     And I set the field "groups" to "Group 2 (1)"
     And the "members" select box should contain "Student 2"
+
+  Scenario: Add cohorts with data generator
+    Given the following "categories" exist:
+      | name  | category | idnumber |
+      | Cat 1 | 0        | CAT1     |
+    And the following "cohorts" exist:
+      | name            | idnumber |
+      | System cohort 1 | CH01     |
+    And the following "cohorts" exist:
+      | name                 | idnumber | contextlevel | reference |
+      | System cohort 2      | CH02     | System       |           |
+      | Cohort in category 1 | CH1      | Category     | CAT1      |
+    When I log in as "admin"
+    And I navigate to "Cohorts" node in "Site administration > Users > Accounts"
+    Then I should see "System cohort 1"
+    And I should see "System cohort 2"
+    And I should not see "Cohort in category"
+    And I follow "Courses"
+    And I follow "Cat 1"
+    And I follow "Cohorts"
+    And I should see "Cohort in category 1"
+    And I should not see "System cohort"
index 7c6373d..5d9330b 100644 (file)
@@ -27,7 +27,7 @@ Feature: Course summary block used on the frontpage
     Then I should see "Front page settings" in the "h2" "css_element"
 
   Scenario: Admin can not see edit icon when edit mode is off
-    When I log in as "teacher1"
+    When I log in as "admin"
     And I am on homepage
     Then I should see "Proved the summary block works!" in the "Course/site summary" "block"
     And "Edit" "link" should not exist in the "Course/site summary" "block"
index be63064..2c4eda4 100644 (file)
@@ -70,10 +70,15 @@ class block_login extends block_base {
         $this->content->text = '';
 
         if (!isloggedin() or isguestuser()) {   // Show the block
+            if (empty($CFG->authloginviaemail)) {
+                $strusername = get_string('username');
+            } else {
+                $strusername = get_string('usernameemail');
+            }
 
             $this->content->text .= "\n".'<form class="loginform" id="login" method="post" action="'.get_login_url().'" '.$autocomplete.'>';
 
-            $this->content->text .= '<div class="c1 fld username"><label for="login_username">'.get_string('username').'</label>';
+            $this->content->text .= '<div class="c1 fld username"><label for="login_username">'.$strusername.'</label>';
             $this->content->text .= '<input type="text" name="username" id="login_username" value="'.s($username).'" /></div>';
 
             $this->content->text .= '<div class="c1 fld password"><label for="login_password">'.get_string('password').'</label>';
index 5b26916..b9cbae5 100644 (file)
@@ -180,9 +180,11 @@ function blog_sync_external_entries($externalblog) {
             $filtertags = array_map('trim', $filtertags);
             $filtertags = array_map('strtolower', $filtertags);
 
-            foreach ($categories as $category) {
-                if (in_array(trim(strtolower($category->term)), $filtertags)) {
-                    $containsfiltertag = true;
+            if (!empty($categories)) {
+                foreach ($categories as $category) {
+                    if (in_array(trim(strtolower($category->term)), $filtertags)) {
+                        $containsfiltertag = true;
+                    }
                 }
             }
 
index c50e3a0..8873117 100644 (file)
@@ -26,6 +26,7 @@ require('../config.php');
 require_once($CFG->dirroot.'/cohort/locallib.php');
 
 $id = required_param('id', PARAM_INT);
+$returnurl = optional_param('returnurl', '', PARAM_LOCALURL);
 
 require_login();
 
@@ -38,7 +39,11 @@ $PAGE->set_context($context);
 $PAGE->set_url('/cohort/assign.php', array('id'=>$id));
 $PAGE->set_pagelayout('admin');
 
-$returnurl = new moodle_url('/cohort/index.php', array('contextid'=>$cohort->contextid));
+if ($returnurl) {
+    $returnurl = new moodle_url($returnurl);
+} else {
+    $returnurl = new moodle_url('/cohort/index.php', array('contextid' => $cohort->contextid));
+}
 
 if (!empty($cohort->component)) {
     // We can not manually edit cohorts that were created by external systems, sorry.
@@ -100,6 +105,7 @@ if (optional_param('remove', false, PARAM_BOOL) && confirm_sesskey()) {
 ?>
 <form id="assignform" method="post" action="<?php echo $PAGE->url ?>"><div>
   <input type="hidden" name="sesskey" value="<?php echo sesskey() ?>" />
+  <input type="hidden" name="returnurl" value="<?php echo $returnurl->out_as_local_url() ?>" />
 
   <table summary="" class="generaltable generalbox boxaligncenter" cellspacing="0">
     <tr>
index a585f35..dbee96f 100644 (file)
@@ -31,6 +31,7 @@ $id        = optional_param('id', 0, PARAM_INT);
 $contextid = optional_param('contextid', 0, PARAM_INT);
 $delete    = optional_param('delete', 0, PARAM_BOOL);
 $confirm   = optional_param('confirm', 0, PARAM_BOOL);
+$returnurl = optional_param('returnurl', '', PARAM_LOCALURL);
 
 require_login();
 
@@ -52,7 +53,11 @@ if ($id) {
 
 require_capability('moodle/cohort:manage', $context);
 
-$returnurl = new moodle_url('/cohort/index.php', array('contextid'=>$context->id));
+if ($returnurl) {
+    $returnurl = new moodle_url($returnurl);
+} else {
+    $returnurl = new moodle_url('/cohort/index.php', array('contextid'=>$context->id));
+}
 
 if (!empty($cohort->component)) {
     // We can not manually edit cohorts that were created by external systems, sorry.
@@ -60,7 +65,8 @@ if (!empty($cohort->component)) {
 }
 
 $PAGE->set_context($context);
-$PAGE->set_url('/cohort/edit.php', array('contextid'=>$context->id, 'id'=>$cohort->id));
+$baseurl = new moodle_url('/cohort/edit.php', array('contextid' => $context->id, 'id' => $cohort->id));
+$PAGE->set_url($baseurl);
 $PAGE->set_context($context);
 $PAGE->set_pagelayout('admin');
 
@@ -84,7 +90,8 @@ if ($delete and $cohort->id) {
     $PAGE->set_heading($COURSE->fullname);
     echo $OUTPUT->header();
     echo $OUTPUT->heading($strheading);
-    $yesurl = new moodle_url('/cohort/edit.php', array('id'=>$cohort->id, 'delete'=>1, 'confirm'=>1,'sesskey'=>sesskey()));
+    $yesurl = new moodle_url('/cohort/edit.php', array('id' => $cohort->id, 'delete' => 1,
+        'confirm' => 1, 'sesskey' => sesskey(), 'returnurl' => $returnurl->out_as_local_url()));
     $message = get_string('delconfirm', 'cohort', format_string($cohort->name));
     echo $OUTPUT->confirm($message, $yesurl, $returnurl);
     echo $OUTPUT->footer();
@@ -107,7 +114,7 @@ $PAGE->set_title($strheading);
 $PAGE->set_heading($COURSE->fullname);
 $PAGE->navbar->add($strheading);
 
-$editform = new cohort_edit_form(null, array('editoroptions'=>$editoroptions, 'data'=>$cohort));
+$editform = new cohort_edit_form(null, array('editoroptions'=>$editoroptions, 'data'=>$cohort, 'returnurl'=>$returnurl));
 
 if ($editform->is_cancelled()) {
     redirect($returnurl);
@@ -121,12 +128,22 @@ if ($editform->is_cancelled()) {
         cohort_add_cohort($data);
     }
 
-    // Use new context id, it could have been changed.
-    redirect(new moodle_url('/cohort/index.php', array('contextid'=>$data->contextid)));
+    if ($returnurl->get_param('showall') || $returnurl->get_param('contextid') == $data->contextid) {
+        // Redirect to where we were before.
+        redirect($returnurl);
+    } else {
+        // Use new context id, it has been changed.
+        redirect(new moodle_url('/cohort/index.php', array('contextid' => $data->contextid)));
+    }
 }
 
 echo $OUTPUT->header();
 echo $OUTPUT->heading($strheading);
+
+if (!$id && ($editcontrols = cohort_edit_controls($context, $baseurl))) {
+    echo $OUTPUT->render($editcontrols);
+}
+
 echo $editform->display();
 echo $OUTPUT->footer();
 
index fb7409e..72a5db7 100644 (file)
@@ -53,6 +53,11 @@ class cohort_edit_form extends moodleform {
         $mform->addElement('hidden', 'id');
         $mform->setType('id', PARAM_INT);
 
+        if (isset($this->_customdata['returnurl'])) {
+            $mform->addElement('hidden', 'returnurl', $this->_customdata['returnurl']->out_as_local_url());
+            $mform->setType('returnurl', PARAM_LOCALURL);
+        }
+
         $this->add_action_buttons();
 
         $this->set_data($cohort);
index b0c30bd..796dd03 100644 (file)
 require('../config.php');
 require($CFG->dirroot.'/cohort/lib.php');
 require_once($CFG->libdir.'/adminlib.php');
+require_once($CFG->libdir.'/coursecatlib.php');
 
 $contextid = optional_param('contextid', 0, PARAM_INT);
 $page = optional_param('page', 0, PARAM_INT);
 $searchquery  = optional_param('search', '', PARAM_RAW);
+$showall = optional_param('showall', false, PARAM_BOOL);
 
 require_login();
 
@@ -61,13 +63,18 @@ if ($category) {
     $PAGE->set_url('/cohort/index.php', array('contextid'=>$context->id));
     $PAGE->set_title($strcohorts);
     $PAGE->set_heading($COURSE->fullname);
+    $showall = false;
 } else {
     admin_externalpage_setup('cohorts', '', null, '', array('pagelayout'=>'report'));
 }
 
 echo $OUTPUT->header();
 
-$cohorts = cohort_get_cohorts($context->id, $page, 25, $searchquery);
+if ($showall) {
+    $cohorts = cohort_get_all_cohorts($page, 25, $searchquery);
+} else {
+    $cohorts = cohort_get_cohorts($context->id, $page, 25, $searchquery);
+}
 
 $count = '';
 if ($cohorts['allcohorts'] > 0) {
@@ -80,6 +87,22 @@ if ($cohorts['allcohorts'] > 0) {
 
 echo $OUTPUT->heading(get_string('cohortsin', 'cohort', $context->get_context_name()).$count);
 
+$params = array('page' => $page);
+if ($contextid) {
+    $params['contextid'] = $contextid;
+}
+if ($searchquery) {
+    $params['search'] = $searchquery;
+}
+if ($showall) {
+    $params['showall'] = true;
+}
+$baseurl = new moodle_url('/cohort/index.php', $params);
+
+if ($editcontrols = cohort_edit_controls($context, $baseurl)) {
+    echo $OUTPUT->render($editcontrols);
+}
+
 // Add search form.
 $search  = html_writer::start_tag('form', array('id'=>'searchcohortquery', 'method'=>'get'));
 $search .= html_writer::start_tag('div');
@@ -87,25 +110,26 @@ $search .= html_writer::label(get_string('searchcohort', 'cohort'), 'cohort_sear
 $search .= html_writer::empty_tag('input', array('id'=>'cohort_search_q', 'type'=>'text', 'name'=>'search', 'value'=>$searchquery));
 $search .= html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('search', 'cohort')));
 $search .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'contextid', 'value'=>$contextid));
+$search .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'showall', 'value'=>$showall));
 $search .= html_writer::end_tag('div');
 $search .= html_writer::end_tag('form');
 echo $search;
 
-
 // Output pagination bar.
-$params = array('page' => $page);
-if ($contextid) {
-    $params['contextid'] = $contextid;
-}
-if ($search) {
-    $params['search'] = $searchquery;
-}
-$baseurl = new moodle_url('/cohort/index.php', $params);
 echo $OUTPUT->paging_bar($cohorts['totalcohorts'], $page, 25, $baseurl);
 
 $data = array();
 foreach($cohorts['cohorts'] as $cohort) {
     $line = array();
+    $cohortcontext = context::instance_by_id($cohort->contextid);
+    if ($showall) {
+        if ($cohortcontext->contextlevel == CONTEXT_COURSECAT) {
+            $cat = coursecat::get($cohortcontext->instanceid);
+            $line[] = html_writer::link(new moodle_url('/cohort/index.php' , array('contextid' => $cohort->contextid)), $cat->get_formatted_name());
+        } else {
+            $line[] = get_string('coresystem');
+        }
+    }
     $line[] = format_string($cohort->name);
     $line[] = s($cohort->idnumber); // All idnumbers are plain text.
     $line[] = format_text($cohort->description, $cohort->descriptionformat);
@@ -120,12 +144,19 @@ foreach($cohorts['cohorts'] as $cohort) {
 
     $buttons = array();
     if (empty($cohort->component)) {
-        if ($manager) {
-            $buttons[] = html_writer::link(new moodle_url('/cohort/edit.php', array('id'=>$cohort->id, 'delete'=>1)), html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('t/delete'), 'alt'=>get_string('delete'), 'class'=>'iconsmall')));
-            $buttons[] =  html_writer::link(new moodle_url('/cohort/edit.php', array('id'=>$cohort->id)), html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('t/edit'), 'alt'=>get_string('edit'), 'class'=>'iconsmall')));
+        $cohortmanager = has_capability('moodle/cohort:manage', $cohortcontext);
+        $cohortcanassign = has_capability('moodle/cohort:assign', $cohortcontext);
+
+        $urlparams = array('id' => $cohort->id, 'returnurl' => $baseurl->out_as_local_url());
+        if ($cohortmanager) {
+            $buttons[] = html_writer::link(new moodle_url('/cohort/edit.php', $urlparams + array('delete' => 1)),
+                html_writer::empty_tag('img', array('src' => $OUTPUT->pix_url('t/delete'), 'alt' => get_string('delete'), 'class' => 'iconsmall')));
+            $buttons[] = html_writer::link(new moodle_url('/cohort/edit.php', $urlparams),
+                html_writer::empty_tag('img', array('src' => $OUTPUT->pix_url('t/edit'), 'alt' => get_string('edit'), 'class' => 'iconsmall')));
         }
-        if ($manager or $canassign) {
-            $buttons[] = html_writer::link(new moodle_url('/cohort/assign.php', array('id'=>$cohort->id)), html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('i/users'), 'alt'=>get_string('assign', 'core_cohort'), 'class'=>'iconsmall')));
+        if ($cohortcanassign) {
+            $buttons[] = html_writer::link(new moodle_url('/cohort/assign.php', $urlparams),
+                html_writer::empty_tag('img', array('src' => $OUTPUT->pix_url('i/users'), 'alt' => get_string('assign', 'core_cohort'), 'class' => 'iconsmall')));
         }
     }
     $line[] = implode(' ', $buttons);
@@ -136,14 +167,13 @@ $table = new html_table();
 $table->head  = array(get_string('name', 'cohort'), get_string('idnumber', 'cohort'), get_string('description', 'cohort'),
                       get_string('memberscount', 'cohort'), get_string('component', 'cohort'), get_string('edit'));
 $table->colclasses = array('leftalign name', 'leftalign id', 'leftalign description', 'leftalign size','centeralign source', 'centeralign action');
+if ($showall) {
+    array_unshift($table->head, get_string('category'));
+    array_unshift($table->colclasses, 'leftalign category');
+}
 $table->id = 'cohorts';
 $table->attributes['class'] = 'admintable generaltable';
 $table->data  = $data;
 echo html_writer::table($table);
 echo $OUTPUT->paging_bar($cohorts['totalcohorts'], $page, 25, $baseurl);
-
-if ($manager) {
-    echo $OUTPUT->single_button(new moodle_url('/cohort/edit.php', array('contextid'=>$context->id)), get_string('add'));
-}
-
 echo $OUTPUT->footer();
index 6639639..0110e9a 100644 (file)
@@ -247,9 +247,40 @@ function cohort_get_visible_list($course, $onlyenrolled=true) {
     return $cohorts;
 }
 
+/**
+ * Produces a part of SQL query to filter cohorts by the search string
+ *
+ * Called from {@link cohort_get_cohorts()} and {@link cohort_get_all_cohorts()}
+ *
+ * @access private
+ *
+ * @param string $search
+ * @return array of two elements - SQL condition and array of unnamed parameters
+ */
+function cohort_get_search_query($search) {
+    global $DB;
+    $params = array();
+    if (empty($search)) {
+        // This function should not be called if there is no search string, just in case return dummy query.
+        return array('1=1', $params);
+    }
+    $searchparam = '%' . $DB->sql_like_escape($search) . '%';
+    $conditions = array();
+    $fields = array('name', 'idnumber', 'description');
+    foreach ($fields as $field) {
+        $conditions[] = $DB->sql_like($field, "?", false);
+        $params[] = $searchparam;
+    }
+    $sql = '(' . implode(' OR ', $conditions) . ')';
+    return array($sql, $params);
+}
+
 /**
  * Get all the cohorts defined in given context.
  *
+ * The function does not check user capability to view/manage cohorts in the given context
+ * assuming that it has been already verified.
+ *
  * @param int $contextid
  * @param int $page number of the current page
  * @param int $perpage items per page
@@ -259,29 +290,137 @@ function cohort_get_visible_list($course, $onlyenrolled=true) {
 function cohort_get_cohorts($contextid, $page = 0, $perpage = 25, $search = '') {
     global $DB;
 
-    // Add some additional sensible conditions
-    $tests = array('contextid = ?');
+    $fields = "SELECT *";
+    $countfields = "SELECT COUNT(1)";
+    $sql = " FROM {cohort}
+             WHERE contextid = ?";
     $params = array($contextid);
+    $order = " ORDER BY name ASC, idnumber ASC";
 
     if (!empty($search)) {
-        $conditions = array('name', 'idnumber', 'description');
-        $searchparam = '%' . $DB->sql_like_escape($search) . '%';
-        foreach ($conditions as $key=>$condition) {
-            $conditions[$key] = $DB->sql_like($condition, "?", false);
-            $params[] = $searchparam;
-        }
-        $tests[] = '(' . implode(' OR ', $conditions) . ')';
+        list($searchcondition, $searchparams) = cohort_get_search_query($search);
+        $sql .= ' AND ' . $searchcondition;
+        $params = array_merge($params, $searchparams);
     }
-    $wherecondition = implode(' AND ', $tests);
 
-    $fields = "SELECT *";
-    $countfields = "SELECT COUNT(1)";
-    $sql = " FROM {cohort}
-             WHERE $wherecondition";
-    $order = " ORDER BY name ASC, idnumber ASC";
-    $allcohorts = $DB->count_records('cohort', array('contextid'=>$contextid));
-    $totalcohorts = $DB->count_records_sql($countfields . $sql, $params);
+    $totalcohorts = $allcohorts = $DB->count_records('cohort', array('contextid' => $contextid));
+    if (!empty($search)) {
+        $totalcohorts = $DB->count_records_sql($countfields . $sql, $params);
+    }
     $cohorts = $DB->get_records_sql($fields . $sql . $order, $params, $page*$perpage, $perpage);
 
-    return array('totalcohorts' => $totalcohorts, 'cohorts' => $cohorts, 'allcohorts'=>$allcohorts);
+    return array('totalcohorts' => $totalcohorts, 'cohorts' => $cohorts, 'allcohorts' => $allcohorts);
 }
+
+/**
+ * Get all the cohorts defined anywhere in system.
+ *
+ * The function assumes that user capability to view/manage cohorts on system level
+ * has already been verified. This function only checks if such capabilities have been
+ * revoked in child (categories) contexts.
+ *
+ * @param int $page number of the current page
+ * @param int $perpage items per page
+ * @param string $search search string
+ * @return array    Array(totalcohorts => int, cohorts => array, allcohorts => int)
+ */
+function cohort_get_all_cohorts($page = 0, $perpage = 25, $search = '') {
+    global $DB;
+
+    $fields = "SELECT c.*, ".context_helper::get_preload_record_columns_sql('ctx');
+    $countfields = "SELECT COUNT(*)";
+    $sql = " FROM {cohort} c
+             JOIN {context} ctx ON ctx.id = c.contextid ";
+    $params = array();
+    $wheresql = '';
+
+    if ($excludedcontexts = cohort_get_invisible_contexts()) {
+        list($excludedsql, $excludedparams) = $DB->get_in_or_equal($excludedcontexts, SQL_PARAMS_QM, null, false);
+        $wheresql = ' WHERE c.contextid '.$excludedsql;
+        $params = array_merge($params, $excludedparams);
+    }
+
+    $totalcohorts = $allcohorts = $DB->count_records_sql($countfields . $sql . $wheresql, $params);
+
+    if (!empty($search)) {
+        list($searchcondition, $searchparams) = cohort_get_search_query($search);
+        $wheresql .= ($wheresql ? ' AND ' : ' WHERE ') . $searchcondition;
+        $params = array_merge($params, $searchparams);
+        $totalcohorts = $DB->count_records_sql($countfields . $sql . $wheresql, $params);
+    }
+
+    $order = " ORDER BY c.name ASC, c.idnumber ASC";
+    $cohorts = $DB->get_records_sql($fields . $sql . $wheresql . $order, $params, $page*$perpage, $perpage);
+
+    // Preload used contexts, they will be used to check view/manage/assign capabilities and display categories names.
+    foreach (array_keys($cohorts) as $key) {
+        context_helper::preload_from_record($cohorts[$key]);
+    }
+
+    return array('totalcohorts' => $totalcohorts, 'cohorts' => $cohorts, 'allcohorts' => $allcohorts);
+}
+
+/**
+ * Returns list of contexts where cohorts are present but current user does not have capability to view/manage them.
+ *
+ * This function is called from {@link cohort_get_all_cohorts()} to ensure correct pagination in rare cases when user
+ * is revoked capability in child contexts. It assumes that user's capability to view/manage cohorts on system
+ * level has already been verified.
+ *
+ * @access private
+ *
+ * @return array array of context ids
+ */
+function cohort_get_invisible_contexts() {
+    global $DB;
+    if (is_siteadmin()) {
+        // Shortcut, admin can do anything and can not be prohibited from any context.
+        return array();
+    }
+    $records = $DB->get_recordset_sql("SELECT DISTINCT ctx.id, ".context_helper::get_preload_record_columns_sql('ctx')." ".
+        "FROM {context} ctx JOIN {cohort} c ON ctx.id = c.contextid ");
+    $excludedcontexts = array();
+    foreach ($records as $ctx) {
+        context_helper::preload_from_record($ctx);
+        if (!has_any_capability(array('moodle/cohort:manage', 'moodle/cohort:view'), context::instance_by_id($ctx->id))) {
+            $excludedcontexts[] = $ctx->id;
+        }
+    }
+    return $excludedcontexts;
+}
+
+/**
+ * Returns navigation controls (tabtree) to be displayed on cohort management pages
+ *
+ * @param context $context system or category context where cohorts controls are about to be displayed
+ * @param moodle_url $currenturl
+ * @return null|renderable
+ */
+function cohort_edit_controls(context $context, moodle_url $currenturl) {
+    $tabs = array();
+    $currenttab = 'view';
+    $viewurl = new moodle_url('/cohort/index.php', array('contextid' => $context->id));
+    if (($searchquery = $currenturl->get_param('search'))) {
+        $viewurl->param('search', $searchquery);
+    }
+    if ($context->contextlevel == CONTEXT_SYSTEM) {
+        $tabs[] = new tabobject('view', new moodle_url($viewurl, array('showall' => 0)), get_string('systemcohorts', 'cohort'));
+        $tabs[] = new tabobject('viewall', new moodle_url($viewurl, array('showall' => 1)), get_string('allcohorts', 'cohort'));
+        if ($currenturl->get_param('showall')) {
+            $currenttab = 'viewall';
+        }
+    } else {
+        $tabs[] = new tabobject('view', $viewurl, get_string('cohorts', 'cohort'));
+    }
+    if (has_capability('moodle/cohort:manage', $context)) {
+        $addurl = new moodle_url('/cohort/edit.php', array('contextid' => $context->id));
+        $tabs[] = new tabobject('addcohort', $addurl, get_string('addcohort', 'cohort'));
+        if ($currenturl->get_path() === $addurl->get_path() && !$currenturl->param('id')) {
+            $currenttab = 'addcohort';
+        }
+    }
+    if (count($tabs) > 1) {
+        return new tabtree($tabs, $currenttab);
+    }
+    return null;
+}
\ No newline at end of file
index bb6db42..faac511 100644 (file)
@@ -13,7 +13,7 @@ Feature: Add cohorts of users
       | user4 | Forth | User | forth@user.com |
     And I log in as "admin"
     And I navigate to "Cohorts" node in "Site administration > Users > Accounts"
-    And I press "Add"
+    And I follow "Add new cohort"
     And I set the following fields to these values:
       | Name | Test cohort name |
       | Context | System |
diff --git a/cohort/tests/behat/view_cohorts.feature b/cohort/tests/behat/view_cohorts.feature
new file mode 100644 (file)
index 0000000..be8e088
--- /dev/null
@@ -0,0 +1,67 @@
+@core @core_cohort
+Feature: View cohort list
+  In order to operate with cohorts
+  As an admin or manager
+  I need to be able to view the list of cohorts in the system
+
+  Background:
+    Given the following "categories" exist:
+      | name  | category | idnumber |
+      | Cat 1 | 0        | CAT1     |
+      | Cat 2 | 0        | CAT2     |
+      | Cat 3 | CAT1     | CAT3     |
+    And the following "cohorts" exist:
+      | name          | idnumber |
+      | System cohort | CH0      |
+    And the following "cohorts" exist:
+      | name                 | idnumber | contextlevel | reference |
+      | Cohort in category 1 | CH1      | Category     | CAT1      |
+      | Cohort in category 2 | CH2      | Category     | CAT2      |
+      | Cohort in category 3 | CH3      | Category     | CAT3      |
+    Given the following "users" exist:
+      | username | firstname | lastname | email           |
+      | user1    | First     | User     | first@user.com  |
+      | user2    | Second    | User     | second@user.com |
+    And the following "role assigns" exist:
+      | user  | role    | contextlevel | reference |
+      | user1 | manager | System       |           |
+      | user2 | manager | Category     | CAT1      |
+
+  @javascript
+  Scenario: Admin can see system cohorts and all cohorts
+    When I log in as "admin"
+    And I navigate to "Cohorts" node in "Site administration > Users > Accounts"
+    Then I should see "System cohort"
+    And I should not see "Cohort in category"
+    And I follow "All cohorts"
+    And I should see "System cohort"
+    And I should see "Cohort in category 1"
+    And I should see "Cohort in category 2"
+    And I should see "Cohort in category 3"
+    And I log out
+
+  @javascript
+  Scenario: Manager can see system cohorts and all cohorts
+    When I log in as "user1"
+    And I navigate to "Cohorts" node in "Site administration > Users > Accounts"
+    Then I should see "System cohort"
+    And I should not see "Cohort in category"
+    And I follow "All cohorts"
+    And I should see "System cohort"
+    And I should see "Cohort in category 1"
+    And I should see "Cohort in category 2"
+    And I should see "Cohort in category 3"
+    And I log out
+
+  @javascript
+  Scenario: Manager in category can see cohorts in the category
+    When I log in as "user2"
+    And I follow "Courses"
+    And I follow "Cat 1"
+    And I follow "Cohorts"
+    And I should not see "All cohorts"
+    And I should not see "System cohort"
+    And I should see "Cohort in category 1"
+    And I should not see "Cohort in category 2"
+    And I should not see "Cohort in category 3"
+    And I log out
index eadcc56..ee44107 100644 (file)
@@ -473,5 +473,74 @@ class core_cohort_cohortlib_testcase extends advanced_testcase {
         $this->assertEquals(0, $result['totalcohorts']);
         $this->assertEquals(array(), $result['cohorts']);
         $this->assertEquals(3, $result['allcohorts']);
+
+        $result = cohort_get_cohorts(context_system::instance()->id);
+        $this->assertEquals(1, $result['totalcohorts']);
+        $this->assertEquals(array($cohort4->id=>$cohort4), $result['cohorts']);
+        $this->assertEquals(1, $result['allcohorts']);
+    }
+
+    public function test_cohort_get_all_cohorts() {
+        global $DB;
+
+        $this->resetAfterTest();
+
+        $category1 = $this->getDataGenerator()->create_category();
+        $category2 = $this->getDataGenerator()->create_category();
+
+        $cohort1 = $this->getDataGenerator()->create_cohort(array('contextid'=>context_coursecat::instance($category1->id)->id, 'name'=>'aaagrrryyy', 'idnumber'=>'','description'=>''));
+        $cohort2 = $this->getDataGenerator()->create_cohort(array('contextid'=>context_coursecat::instance($category1->id)->id, 'name'=>'bbb', 'idnumber'=>'', 'description'=>'yyybrrr'));
+        $cohort3 = $this->getDataGenerator()->create_cohort(array('contextid'=>context_coursecat::instance($category2->id)->id, 'name'=>'ccc', 'idnumber'=>'xxarrrghyyy', 'description'=>'po_us'));
+        $cohort4 = $this->getDataGenerator()->create_cohort(array('contextid'=>context_system::instance()->id));
+
+        // Get list of all cohorts as admin.
+        $this->setAdminUser();
+
+        $result = cohort_get_all_cohorts(0, 100, '');
+        $this->assertEquals(4, $result['totalcohorts']);
+        $this->assertEquals(array($cohort1->id=>$cohort1, $cohort2->id=>$cohort2, $cohort3->id=>$cohort3, $cohort4->id=>$cohort4), $result['cohorts']);
+        $this->assertEquals(4, $result['allcohorts']);
+
+        $result = cohort_get_all_cohorts(0, 100, 'grrr');
+        $this->assertEquals(1, $result['totalcohorts']);
+        $this->assertEquals(array($cohort1->id=>$cohort1), $result['cohorts']);
+        $this->assertEquals(4, $result['allcohorts']);
+
+        // Get list of all cohorts as manager who has capability everywhere.
+        $user = $this->getDataGenerator()->create_user();
+        $managerrole = $DB->get_record('role', array('shortname' => 'manager'));
+        role_assign($managerrole->id, $user->id, context_system::instance()->id);
+        $this->setUser($user);
+
+        $result = cohort_get_all_cohorts(0, 100, '');
+        $this->assertEquals(4, $result['totalcohorts']);
+        $this->assertEquals(array($cohort1->id=>$cohort1, $cohort2->id=>$cohort2, $cohort3->id=>$cohort3, $cohort4->id=>$cohort4), $result['cohorts']);
+        $this->assertEquals(4, $result['allcohorts']);
+
+        $result = cohort_get_all_cohorts(0, 100, 'grrr');
+        $this->assertEquals(1, $result['totalcohorts']);
+        $this->assertEquals(array($cohort1->id=>$cohort1), $result['cohorts']);
+        $this->assertEquals(4, $result['allcohorts']);
+
+        // Get list of all cohorts as manager who has capability everywhere except category2.
+        $context2 = context_coursecat::instance($category2->id);
+        role_change_permission($managerrole->id, $context2, 'moodle/cohort:view', CAP_PROHIBIT);
+        role_change_permission($managerrole->id, $context2, 'moodle/cohort:manage', CAP_PROHIBIT);
+        $this->assertFalse(has_any_capability(array('moodle/cohort:view', 'moodle/cohort:manage'), $context2));
+
+        $result = cohort_get_all_cohorts(0, 100, '');
+        $this->assertEquals(3, $result['totalcohorts']);
+        $this->assertEquals(array($cohort1->id=>$cohort1, $cohort2->id=>$cohort2, $cohort4->id=>$cohort4), $result['cohorts']);
+        $this->assertEquals(3, $result['allcohorts']);
+
+        $result = cohort_get_all_cohorts(0, 100, 'grrr');
+        $this->assertEquals(1, $result['totalcohorts']);
+        $this->assertEquals(array($cohort1->id=>$cohort1), $result['cohorts']);
+        $this->assertEquals(3, $result['allcohorts']);
+
+        $result = cohort_get_cohorts(context_coursecat::instance($category1->id)->id, 1, 1, 'yyy');
+        $this->assertEquals(2, $result['totalcohorts']);
+        $this->assertEquals(array($cohort2->id=>$cohort2), $result['cohorts']);
+        $this->assertEquals(2, $result['allcohorts']);
     }
 }
index 7dc8ffd..661af04 100644 (file)
@@ -292,7 +292,7 @@ YUI.add('moodle-enrol_cohort-quickenrolment', function(Y) {
                             } else {
                                 if (result.response && result.response.message) {
                                     var alertpanel = new M.core.alert(result.response);
-                                    Y.Node.one('#id_yuialertconfirm-' + alertpanel.COUNT).focus();
+                                    Y.Node.one('#id_yuialertconfirm-' + alertpanel.get('COUNT')).focus();
                                 }
                                 var enrolled = Y.Node.create('<div class="'+CSS.COHORTBUTTON+' alreadyenrolled">'+M.str.enrol.synced+'</div>');
                                 node.one('.'+CSS.COHORT+' #cohortid_'+cohort.get(COHORTID)).replace(enrolled);
index e2ad583..37901e2 100644 (file)
@@ -48,8 +48,11 @@ class enrol_self_plugin extends enrol_plugin {
         $key = false;
         $nokey = false;
         foreach ($instances as $instance) {
-            if (!$instance->customint6) {
-                // New enrols not allowed.
+            if ($this->can_self_enrol($instance, false) !== true) {
+                // User can not enrol himself.
+                // Note that we do not check here if user is already enrolled for performance reasons -
+                // such check would execute extra queries for each course in the list of courses and
+                // would hide self-enrolment icons from guests.
                 continue;
             }
             if ($instance->password or $instance->customint1) {
index d626a9f..a1966da 100644 (file)
@@ -94,6 +94,7 @@
             if (empty($pathlatex)) {
                 return false;
             }
+            $pathlatex = escapeshellarg(trim($pathlatex, " '\""));
 
             $doc = $this->construct_latex_document( $formula, $fontsize );
 
             fclose( $fh );
 
             // run latex on document
-            $command = "{$pathlatex} --interaction=nonstopmode --halt-on-error $tex";
+            $command = "$pathlatex --interaction=nonstopmode --halt-on-error $tex";
             chdir( $this->temp_dir );
             if ($this->execute($command, $log)) { // It allways False on Windows
 //                return false;
             }
 
             // run dvips (.dvi to .ps)
-            $pathdvips = get_config('filter_tex', 'pathdvips');
-            $command = "{$pathdvips} -E $dvi -o $ps";
+            $pathdvips = escapeshellarg(trim(get_config('filter_tex', 'pathdvips'), " '\""));
+            $command = "$pathdvips -E $dvi -o $ps";
             if ($this->execute($command, $log )) {
                 return false;
             }
                 $bg_opt = "";
             }
             if ($convertformat == 'svg') {
-                $pathdvisvgm = get_config('filter_tex', 'pathdvisvgm');
-                $command = "{$pathdvisvgm} -E $ps -o $img";
+                $pathdvisvgm = escapeshellarg(trim(get_config('filter_tex', 'pathdvisvgm'), " '\""));
+                $command = "$pathdvisvgm -E $ps -o $img";
             } else {
-                $pathconvert = get_config('filter_tex', 'pathconvert');
-                $command = "{$pathconvert} -density $density -trim $bg_opt $ps $img";
+                $pathconvert = escapeshellarg(trim(get_config('filter_tex', 'pathconvert'), " '\""));
+                $command = "$pathconvert -density $density -trim $bg_opt $ps $img";
             }
             if ($this->execute($command, $log )) {
                 return false;
index f48bca8..4aad3ec 100644 (file)
@@ -125,9 +125,10 @@ function filter_tex_updatedcallback($name) {
         return;
     }
 
-    $pathdvips = get_config('filter_tex', 'pathdvips');
-    $pathconvert = get_config('filter_tex', 'pathconvert');
-    $pathdvisvgm = get_config('filter_tex', 'pathdvisvgm');
+    $pathlatex = trim($pathlatex, " '\"");
+    $pathdvips = trim(get_config('filter_tex', 'pathdvips'), " '\"");
+    $pathconvert = trim(get_config('filter_tex', 'pathconvert'), " '\"");
+    $pathdvisvgm = trim(get_config('filter_tex', 'pathdvisvgm'), " '\"");
 
     $supportedformats = array('gif');
     if ((is_file($pathlatex) && is_executable($pathlatex)) &&
index fb0fcdf..e0d5ddc 100644 (file)
@@ -55,9 +55,22 @@ if ($ADMIN->fulltree) {
     } else if (PHP_OS=='WINNT' or PHP_OS=='WIN32' or PHP_OS=='Windows') {
         // note: you need Ghostscript installed (standard), miktex (standard)
         // and ImageMagick (install at c:\ImageMagick)
-        $default_filter_tex_pathlatex   = "\"c:\\texmf\\miktex\\bin\\latex.exe\" ";
-        $default_filter_tex_pathdvips   = "\"c:\\texmf\\miktex\\bin\\dvips.exe\" ";
-        $default_filter_tex_pathconvert = "\"c:\\imagemagick\\convert.exe\" ";
+        $default_filter_tex_pathlatex   = "c:\\texmf\\miktex\\bin\\latex.exe";
+        $default_filter_tex_pathdvips   = "c:\\texmf\\miktex\\bin\\dvips.exe";
+        $default_filter_tex_pathdvisvgm   = "c:\\texmf\\miktex\\bin\\dvisvgm.exe";
+        $default_filter_tex_pathconvert = "c:\\imagemagick\\convert.exe";
+    }
+
+    $pathlatex = get_config('filter_tex', 'pathlatex');
+    $pathdvips = get_config('filter_tex', 'pathdvips');
+    $pathconvert = get_config('filter_tex', 'pathconvert');
+    $pathdvisvgm = get_config('filter_tex', 'pathdvisvgm');
+    if (strrpos($pathlatex . $pathdvips . $pathconvert . $pathdvisvgm, '"') or
+            strrpos($pathlatex . $pathdvips . $pathconvert . $pathdvisvgm, "'")) {
+        set_config('pathlatex', trim($pathlatex, " '\""), 'filter_tex');
+        set_config('pathdvips', trim($pathdvips, " '\""), 'filter_tex');
+        set_config('pathconvert', trim($pathconvert, " '\""), 'filter_tex');
+        set_config('pathdvisvgm', trim($pathdvisvgm, " '\""), 'filter_tex');
     }
 
     $items[] = new admin_setting_configexecutable('filter_tex/pathlatex', get_string('pathlatex', 'filter_tex'), '', $default_filter_tex_pathlatex);
index b82e97c..ad28cbc 100644 (file)
         // first check if it is likely to work at all
         $output .= "<h3>Checking executables</h3>\n";
         $executablesexist = true;
-        $pathlatex = get_config('filter_tex', 'pathlatex');
+        $pathlatex = trim(get_config('filter_tex', 'pathlatex'), " '\"");
         if (is_file($pathlatex)) {
             $output .= "latex executable ($pathlatex) is readable<br />\n";
         } else {
             $executablesexist = false;
             $output .= "<b>Error:</b> latex executable ($pathlatex) is not readable<br />\n";
         }
-        $pathdvips = get_config('filter_tex', 'pathdvips');
+        $pathdvips = trim(get_config('filter_tex', 'pathdvips'), " '\"");
         if (is_file($pathdvips)) {
             $output .= "dvips executable ($pathdvips) is readable<br />\n";
         } else {
             $executablesexist = false;
             $output .= "<b>Error:</b> dvips executable ($pathdvips) is not readable<br />\n";
         }
-        $pathconvert = get_config('filter_tex', 'pathconvert');
+        $pathconvert = trim(get_config('filter_tex', 'pathconvert'), " '\"");
         if (is_file($pathconvert)) {
             $output .= "convert executable ($pathconvert) is readable<br />\n";
         } else {
             $executablesexist = false;
             $output .= "<b>Error:</b> convert executable ($pathconvert) is not readable<br />\n";
         }
-        $pathdvisvgm = get_config('filter_tex', 'pathdvisvgm');
+        $pathdvisvgm = trim(get_config('filter_tex', 'pathdvisvgm'), " '\"");
         if (is_file($pathdvisvgm)) {
             $output .= "dvisvgm executable ($pathdvisvgm) is readable<br />\n";
         } else {
         chdir($latex->temp_dir);
 
         // step 1: latex command
+        $pathlatex = escapeshellarg($pathlatex);
         $cmd = "$pathlatex --interaction=nonstopmode --halt-on-error $tex";
         $output .= execute($cmd);
 
         // step 2: dvips command
+        $pathdvips = escapeshellarg($pathdvips);
         $cmd = "$pathdvips -E $dvi -o $ps";
         $output .= execute($cmd);
 
         // Step 3: Set convert or dvisvgm command.
         if ($convertformat == 'svg') {
+            $pathdvisvgm = escapeshellarg($pathdvisvgm);
             $cmd = "$pathdvisvgm -E $ps -o $img";
         } else {
+            $pathconvert = escapeshellarg($pathconvert);
             $cmd = "$pathconvert -density 240 -trim $ps $img ";
         }
         $output .= execute($cmd);
index b7d94e6..e76b528 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 $string['addcohort'] = 'Add new cohort';
+$string['allcohorts'] = 'All cohorts';
 $string['anycohort'] = 'Any';
 $string['assign'] = 'Assign';
 $string['assignto'] = 'Cohort \'{$a}\' members';
@@ -59,6 +60,7 @@ $string['potusers'] = 'Potential users';
 $string['potusersmatching'] = 'Potential matching users';
 $string['removeuserwarning'] = 'Removing users from a cohort may result in unenrolling of users from multiple courses which includes deleting of user settings, grades, group membership and other user information from affected courses.';
 $string['selectfromcohort'] = 'Select members from cohort';
+$string['systemcohorts'] = 'System cohorts';
 $string['unknowncohort'] = 'Unknown cohort ({$a})!';
 $string['useradded'] = 'User added to cohort "{$a}"';
 $string['search'] = 'Search';
index bd58f9a..b3ed02a 100644 (file)
@@ -5156,7 +5156,7 @@ abstract class context extends stdClass implements IteratorAggregate {
      * @return void (modifies $rec)
      */
      protected static function preload_from_record(stdClass $rec) {
-         if (empty($rec->ctxid) or empty($rec->ctxlevel) or empty($rec->ctxinstance) or empty($rec->ctxpath) or empty($rec->ctxdepth)) {
+         if (empty($rec->ctxid) or empty($rec->ctxlevel) or !isset($rec->ctxinstance) or empty($rec->ctxpath) or empty($rec->ctxdepth)) {
              // $rec does not have enough data, passed here repeatedly or context does not exist yet
              return;
          }
index 96488db..a7c4fb5 100644 (file)
@@ -169,14 +169,18 @@ class core_grades_external extends external_api {
 
             if (!empty($gradeitem->grades)) {
                 foreach ($gradeitem->grades as $studentid => $studentgrade) {
-                    $gradegradeinstance = grade_grade::fetch(
-                        array(
-                            'userid' => $studentid,
-                            'itemid' => $gradeiteminstance->id
-                        )
-                    );
-                    if (!$canviewhidden && $gradegradeinstance->is_hidden()) {
-                        continue;
+                    if (!$canviewhidden) {
+                        // Need to load the grade_grade object to check visibility.
+                        $gradegradeinstance = grade_grade::fetch(
+                            array(
+                                'userid' => $studentid,
+                                'itemid' => $gradeiteminstance->id
+                            )
+                        );
+                        // The grade grade may be legitimately missing if the student has no grade.
+                        if (!empty($gradegradeinstance) && $gradegradeinstance->is_hidden()) {
+                            continue;
+                        }
                     }
                     $gradeitemarray['grades'][$studentid] = (array)$studentgrade;
                     // Add the student ID as some WS clients can't access the array key.
@@ -308,7 +312,7 @@ class core_grades_external extends external_api {
                                         'str_long_grade' => new external_value(
                                             PARAM_RAW, 'A nicely formatted string representation of the grade'),
                                         'str_feedback' => new external_value(
-                                            PARAM_TEXT, 'A string representation of the feedback from the grader'),
+                                            PARAM_RAW, 'A formatted string representation of the feedback from the grader'),
                                     )
                                 )
                             ),
@@ -345,7 +349,7 @@ class core_grades_external extends external_api {
                                         'str_grade' => new external_value(
                                             PARAM_RAW, 'A string representation of the grade'),
                                         'str_feedback' => new external_value(
-                                            PARAM_TEXT, 'A string representation of the feedback from the grader'),
+                                            PARAM_RAW, 'A formatted string representation of the feedback from the grader'),
                                     )
                                 )
                             ),
index e2ec497..d4e09f9 100644 (file)
@@ -456,6 +456,8 @@ class manager {
         $params = array('timestart1' => $timestart, 'timestart2' => $timestart);
         $records = $DB->get_records_select('task_scheduled', $where, $params);
 
+        $pluginmanager = \core_plugin_manager::instance();
+
         foreach ($records as $record) {
 
             if ($lock = $cronlockfactory->get_lock(($record->classname), 10)) {
@@ -463,6 +465,17 @@ class manager {
                 $task = self::scheduled_task_from_record($record);
 
                 $task->set_lock($lock);
+
+                // See if the component is disabled.
+                $plugininfo = $pluginmanager->get_plugin_info($task->get_component());
+
+                if ($plugininfo) {
+                    if (!$task->get_run_if_component_disabled() && !$plugininfo->is_enabled()) {
+                        $lock->release();
+                        continue;
+                    }
+                }
+
                 if (!$task->is_blocking()) {
                     $cronlock->release();
                 } else {
index 47e93c7..ed2fc03 100644 (file)
@@ -183,6 +183,15 @@ abstract class scheduled_task extends task_base {
         return $this->disabled;
     }
 
+    /**
+     * Override this function if you want this scheduled task to run, even if the component is disabled.
+     *
+     * @return bool
+     */
+    public function get_run_if_component_disabled() {
+        return false;
+    }
+
     /**
      * Take a cron field definition and return an array of valid numbers with the range min-max.
      *
index 1df60c4..b03f48a 100644 (file)
@@ -104,7 +104,7 @@ class csv_import_reader {
         // Create a temporary file and store the csv file there,
         // do not try using fgetcsv() because there is nothing
         // to split rows properly - fgetcsv() itself can not do it.
-        $tempfile = tempnam(make_temp_directory('/cvsimport'), 'tmp');
+        $tempfile = tempnam(make_temp_directory('/csvimport'), 'tmp');
         if (!$fp = fopen($tempfile, 'w+b')) {
             $this->_error = get_string('cannotsavedata', 'error');
             @unlink($tempfile);
index 7fcd96e..ac9693e 100644 (file)
       <KEYS>
         <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
         <KEY NAME="pushid-userid" TYPE="unique" FIELDS="pushid, userid"/>
-        <KEY NAME="pushid-platform" TYPE="unique" FIELDS="pushid, platform"/>
         <KEY NAME="userid" TYPE="foreign" FIELDS="userid" REFTABLE="user" REFFIELDS="id"/>
       </KEYS>
     </TABLE>
index fc405f7..5d88ee4 100644 (file)
@@ -3709,5 +3709,15 @@ function xmldb_main_upgrade($oldversion) {
         upgrade_main_savepoint(true, 2014070101.00);
     }
 
+    if ($oldversion < 2014072400.01) {
+        $table = new xmldb_table('user_devices');
+        $oldindex = new xmldb_index('pushid-platform', XMLDB_KEY_UNIQUE, array('pushid', 'platform'));
+        if ($dbman->index_exists($table, $oldindex)) {
+            $key = new xmldb_key('pushid-platform', XMLDB_KEY_UNIQUE, array('pushid', 'platform'));
+            $dbman->drop_key($table, $key);
+        }
+        upgrade_main_savepoint(true, 2014072400.01);
+    }
+
     return true;
 }
index 28a90bb..fdd3df1 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
-$string['pluginname'] = 'Accessibility checker';
-$string['nowarnings'] = 'Congratulations, no accessibility problems found!';
-$string['report'] = 'Accessibility report:';
+$string['emptytext'] = 'Empty text';
 $string['imagesmissingalt'] = 'Images require alternative text. To fix this warning, add an alt attribute to your img tags. An empty alt attribute may be used, but only when the image is purely decorative and carries no information.';
 $string['needsmorecontrast'] = 'The colours of the foreground and background text do not have enough contrast. To fix this warning, change either foreground or background colour of the text so that it is easier to read.';
+$string['needsmoreheadings'] = 'There is a lot of text with no headings. Headings will allow screen reader users to navigate through the page easily and will make the page more usable for everyone.';
+$string['nowarnings'] = 'Congratulations, no accessibility problems found!';
+$string['pluginname'] = 'Accessibility checker';
+$string['report'] = 'Accessibility report:';
+$string['tablesmissingcaption'] = 'Tables should have captions. While it is not necessary for each table to have a caption, a caption is generally very helpful.';
+$string['tablesmissingheaders'] = 'Tables should use row and/or column headers.';
+$string['tableswithmergedcells'] = 'Tables should not contain merged cells. Despite being standard markup for tables for many years, some screen readers still do not fully support complex tables. When possible, try to "flatten" the table and avoid merged cells.';
index dd829f4..6bc3645 100644 (file)
@@ -34,7 +34,12 @@ function atto_accessibilitychecker_strings_for_js() {
     $PAGE->requires->strings_for_js(array('nowarnings',
                                     'report',
                                     'imagesmissingalt',
-                                    'needsmorecontrast'),
+                                    'needsmorecontrast',
+                                    'needsmoreheadings',
+                                    'tableswithmergedcells',
+                                    'tablesmissingcaption',
+                                    'emptytext',
+                                    'tablesmissingheaders'),
                                     'atto_accessibilitychecker');
 }
 
index a861bd8..9378dfe 100644 (file)
@@ -34,3 +34,39 @@ Feature: Atto accessibility checker
     When I click on "Show more buttons" "button"
     And I click on "Accessibility checker" "button"
     Then I should see "The colours of the foreground and background text do not have enough contrast."
+
+  @javascript
+  Scenario: No headings
+    Given I log in as "admin"
+    And I navigate to "Edit profile" node in "My profile settings"
+    And I set the field "Description" to "<p>Sweet roll oat cake jelly-o macaroon donut oat cake. Caramels macaroon cookie sweet roll croissant cheesecake candy jelly-o. Gummies sugar plum sugar plum gingerbread dessert. Tiramisu bonbon jujubes danish marshmallow cookie chocolate cake cupcake tiramisu. Bear claw oat cake chocolate bar croissant. Lollipop cookie topping liquorice croissant. Brownie cookie cupcake lollipop cupcake cupcake. Fruitcake dessert sweet biscuit dragée caramels marzipan brownie. Chupa chups gingerbread apple pie cookie liquorice caramels carrot cake cookie gingerbread. Croissant candy jelly beans. Tiramisu apple pie dessert apple pie macaroon soufflé. Brownie powder carrot cake chocolate. Tart applicake croissant dragée macaroon chocolate donut.</p><p>Jelly beans gingerbread tootsie roll. Sugar plum tiramisu cotton candy toffee pie cotton candy tiramisu. Carrot cake chocolate bar sesame snaps cupcake cake dessert sweet fruitcake wafer. Marshmallow cupcake gingerbread pie sweet candy canes powder gummi bears. Jujubes cake muffin marshmallow candy jelly beans tootsie roll pie. Gummi bears applicake chocolate cake sweet jelly sesame snaps lollipop lollipop carrot cake. Marshmallow cake jelly beans. Jelly beans sesame snaps muffin halvah cookie ice cream candy canes carrot cake. Halvah donut marshmallow tiramisu. Cookie dessert gummi bears. Sugar plum apple pie jelly beans gummi bears tart chupa chups. Liquorice macaroon gummi bears gummies macaroon marshmallow sweet roll cake topping. Lemon drops caramels pie icing danish. Chocolate cake oat cake dessert halvah danish carrot cake apple pie.</p>"
+    When I click on "Show more buttons" "button"
+    And I click on "Accessibility checker" "button"
+    Then I should see "There is a lot of text with no headings."
+
+  @javascript
+  Scenario: Merged cells
+    Given I log in as "admin"
+    And I navigate to "Edit profile" node in "My profile settings"
+    And I set the field "Description" to "<table><caption>Dogs that look good in pants</caption><tr><th>Breed</th><th>Coolness</th></tr><tr><td>Poodle</td><td rowspan='2'>NOT COOL</td></tr><tr><td>Doberman</td></tr></table>"
+    When I click on "Show more buttons" "button"
+    And I click on "Accessibility checker" "button"
+    Then I should see "Tables should not contain merged cells."
+
+  @javascript
+  Scenario: Table missing row/column headers
+    Given I log in as "admin"
+    And I navigate to "Edit profile" node in "My profile settings"
+    And I set the field "Description" to "<table><caption>Dogs that look good in pants</caption><tr><th>Breed</th><td>Coolness</td></tr><tr><td>Poodle</td><td>NOT COOL</td></tr><tr><td>Doberman</td><td>COOL</td></tr></table>"
+    When I click on "Show more buttons" "button"
+    And I click on "Accessibility checker" "button"
+    Then I should see "Tables should use row and/or column headers."
+
+  @javascript
+  Scenario: Table missing caption
+    Given I log in as "admin"
+    And I navigate to "Edit profile" node in "My profile settings"
+    And I set the field "Description" to "<table><tr><th>Breed</th><th>Coolness</th></tr><tr><td>Poodle</td><td>NOT COOL</td></tr><tr><td>Doberman</td><td>COOL</td></tr></table>"
+    When I click on "Show more buttons" "button"
+    And I click on "Accessibility checker" "button"
+    Then I should see "Tables should have captions."
index cbdb87b..6547435 100644 (file)
Binary files a/lib/editor/atto/plugins/accessibilitychecker/yui/build/moodle-atto_accessibilitychecker-button/moodle-atto_accessibilitychecker-button-debug.js and b/lib/editor/atto/plugins/accessibilitychecker/yui/build/moodle-atto_accessibilitychecker-button/moodle-atto_accessibilitychecker-button-debug.js differ
index 026e26b..2418607 100644 (file)
Binary files a/lib/editor/atto/plugins/accessibilitychecker/yui/build/moodle-atto_accessibilitychecker-button/moodle-atto_accessibilitychecker-button-min.js and b/lib/editor/atto/plugins/accessibilitychecker/yui/build/moodle-atto_accessibilitychecker-button/moodle-atto_accessibilitychecker-button-min.js differ
index 9a4c177..7fd2b0b 100644 (file)
Binary files a/lib/editor/atto/plugins/accessibilitychecker/yui/build/moodle-atto_accessibilitychecker-button/moodle-atto_accessibilitychecker-button.js and b/lib/editor/atto/plugins/accessibilitychecker/yui/build/moodle-atto_accessibilitychecker-button/moodle-atto_accessibilitychecker-button.js differ
index 5797448..3aa5e5b 100644 (file)
@@ -168,10 +168,57 @@ Y.namespace('M.atto_accessibilitychecker').Button = Y.Base.create('button', Y.M.
         }, this);
         this._addWarnings(list, M.util.get_string('needsmorecontrast', COMPONENT), problemNodes, false);
 
+        // Check for lots of text with no headings.
+        if (this.editor.get('text').length > 1000 && !this.editor.one('h3, h4, h5')) {
+            this._addWarnings(list, M.util.get_string('needsmoreheadings', COMPONENT), [this.editor], false);
+        }
+
+        // Check for tables with no captions.
+        problemNodes = [];
+        this.editor.all('table').each(function (table) {
+            caption = table.one('caption');
+            if (caption === null) {
+                problemNodes.push(table);
+            }
+        }, this);
+        this._addWarnings(list, M.util.get_string('tablesmissingcaption', COMPONENT), problemNodes, false);
+
+        // Check for tables with merged cells.
+        problemNodes = [];
+        this.editor.all('table').each(function (table) {
+            caption = table.one('[colspan],[rowspan]');
+            if (caption !== null) {
+                problemNodes.push(table);
+            }
+        }, this);
+        this._addWarnings(list, M.util.get_string('tableswithmergedcells', COMPONENT), problemNodes, false);
+
+        // Check for tables with no row/col headers
+        problemNodes = [];
+        this.editor.all('table').each(function (table) {
+            if (table.one('tr').one('td')) {
+                // First row has a non-header cell, so all rows must have at least one header.
+                table.all('tr').some(function (row) {
+                    if (!row.one('th')) {
+                        problemNodes.push(table);
+                        return true;
+                    }
+                    return false;
+                }, this);
+            } else {
+                // First row must have at least one header then.
+                if (!table.one('tr').one('th')) {
+                    problemNodes.push(table);
+                }
+            }
+        }, this);
+        this._addWarnings(list, M.util.get_string('tablesmissingheaders', COMPONENT), problemNodes, false);
+
         if (!list.hasChildNodes()) {
             list.append('<p>' + M.util.get_string('nowarnings', COMPONENT) + '</p>');
         }
-        // Append the list of current styles.
+
+        // Return the list of current warnings.
         return list;
     },
 
@@ -185,7 +232,7 @@ Y.namespace('M.atto_accessibilitychecker').Button = Y.Base.create('button', Y.M.
      * @param {boolean} imagewarnings true if the warnings are related to images, false if text.
      */
     _addWarnings: function(list, description, nodes, imagewarnings) {
-        var warning, fails, i, src, textfield, li, link;
+        var warning, fails, i, src, textfield, li, link, text;
 
         if (nodes.length > 0) {
             warning = Y.Node.create('<p>' + description + '</p>');
@@ -198,7 +245,11 @@ Y.namespace('M.atto_accessibilitychecker').Button = Y.Base.create('button', Y.M.
                     link = Y.Node.create('<a href="#"><img src="' + src + '" /> ' + src + '</a>');
                 } else {
                     textfield = ('innerText' in nodes[i]) ? 'innerText' : 'textContent';
-                    link = Y.Node.create('<a href="#">' + nodes[i].get(textfield) + '</a>');
+                    text = nodes[i].get(textfield).trim();
+                    if (text === '') {
+                        text = M.util.get_string('emptytext', COMPONENT);
+                    }
+                    link = Y.Node.create('<a href="#">' + text + '</a>');
                 }
                 link.setData('sourceNode', nodes[i]);
                 li.append(link);
index 32fec85..0e92edf 100644 (file)
@@ -1721,6 +1721,8 @@ class file_storage {
      * @return array (contenthash, filesize, newfile)
      */
     public function add_string_to_pool($content) {
+        global $CFG;
+
         $contenthash = sha1($content);
         $filesize = strlen($content); // binary length
 
@@ -1755,7 +1757,13 @@ class file_storage {
         // Hopefully this works around most potential race conditions.
 
         $prev = ignore_user_abort(true);
-        $newsize = file_put_contents($hashfile.'.tmp', $content, LOCK_EX);
+
+        if (!empty($CFG->preventfilelocking)) {
+            $newsize = file_put_contents($hashfile.'.tmp', $content);
+        } else {
+            $newsize = file_put_contents($hashfile.'.tmp', $content, LOCK_EX);
+        }
+
         if ($newsize === false) {
             // Borked permissions most likely.
             ignore_user_abort($prev);
index 82938bc..91afb0c 100644 (file)
@@ -827,6 +827,10 @@ class core_renderer extends renderer_base {
             $this->page->add_body_class('userloggedinas');
         }
 
+        if (is_role_switched($this->page->course->id)) {
+            $this->page->add_body_class('userswitchedrole');
+        }
+
         // Give themes a chance to init/alter the page object.
         $this->page->theme->init_page($this->page);
 
@@ -1952,7 +1956,7 @@ class core_renderer extends renderer_base {
     public function doc_link($path, $text = '', $forcepopup = false) {
         global $CFG;
 
-        $icon = $this->pix_icon('docs', $text, 'moodle', array('class'=>'iconhelp icon-pre'));
+        $icon = $this->pix_icon('docs', '', 'moodle', array('class'=>'iconhelp icon-pre', 'role'=>'presentation'));
 
         $url = new moodle_url(get_docs_url($path));
 
index 0a18e4b..aba7b66 100644 (file)
@@ -217,6 +217,25 @@ class behat_data_generators extends behat_base {
         return $data;
     }
 
+    /**
+     * If contextlevel and reference are specified for cohort, transform them to the contextid.
+     *
+     * @param array $data
+     * @return array
+     */
+    protected function preprocess_cohort($data) {
+        if (isset($data['contextlevel'])) {
+            if (!isset($data['reference'])) {
+                throw new Exception('If field contextlevel is specified, field reference must also be present');
+            }
+            $context = $this->get_context($data['contextlevel'], $data['reference']);
+            unset($data['contextlevel']);
+            unset($data['reference']);
+            $data['contextid'] = $context->id;
+        }
+        return $data;
+    }
+
     /**
      * Adapter to modules generator
      * @throws Exception Custom exception for test writers
index 9c79b77..774540e 100644 (file)
Binary files a/lib/yui/build/moodle-core-notification-ajaxexception/moodle-core-notification-ajaxexception-debug.js and b/lib/yui/build/moodle-core-notification-ajaxexception/moodle-core-notification-ajaxexception-debug.js differ
index 22a7bcc..176b086 100644 (file)
Binary files a/lib/yui/build/moodle-core-notification-ajaxexception/moodle-core-notification-ajaxexception-min.js and b/lib/yui/build/moodle-core-notification-ajaxexception/moodle-core-notification-ajaxexception-min.js differ
index 9c79b77..774540e 100644 (file)
Binary files a/lib/yui/build/moodle-core-notification-ajaxexception/moodle-core-notification-ajaxexception.js and b/lib/yui/build/moodle-core-notification-ajaxexception/moodle-core-notification-ajaxexception.js differ
index 083319b..47a76b6 100644 (file)
Binary files a/lib/yui/build/moodle-core-notification-alert/moodle-core-notification-alert-debug.js and b/lib/yui/build/moodle-core-notification-alert/moodle-core-notification-alert-debug.js differ
index da82280..818facf 100644 (file)
Binary files a/lib/yui/build/moodle-core-notification-alert/moodle-core-notification-alert-min.js and b/lib/yui/build/moodle-core-notification-alert/moodle-core-notification-alert-min.js differ
index 083319b..47a76b6 100644 (file)
Binary files a/lib/yui/build/moodle-core-notification-alert/moodle-core-notification-alert.js and b/lib/yui/build/moodle-core-notification-alert/moodle-core-notification-alert.js differ
index 6348d4d..51f1198 100644 (file)
Binary files a/lib/yui/build/moodle-core-notification-confirm/moodle-core-notification-confirm-debug.js and b/lib/yui/build/moodle-core-notification-confirm/moodle-core-notification-confirm-debug.js differ
index 3d45e82..3365c89 100644 (file)
Binary files a/lib/yui/build/moodle-core-notification-confirm/moodle-core-notification-confirm-min.js and b/lib/yui/build/moodle-core-notification-confirm/moodle-core-notification-confirm-min.js differ
index 6348d4d..51f1198 100644 (file)
Binary files a/lib/yui/build/moodle-core-notification-confirm/moodle-core-notification-confirm.js and b/lib/yui/build/moodle-core-notification-confirm/moodle-core-notification-confirm.js differ
index 3f813af..96a8aa7 100644 (file)
Binary files a/lib/yui/build/moodle-core-notification-exception/moodle-core-notification-exception-debug.js and b/lib/yui/build/moodle-core-notification-exception/moodle-core-notification-exception-debug.js differ
index 4fb70e3..e1a038f 100644 (file)
Binary files a/lib/yui/build/moodle-core-notification-exception/moodle-core-notification-exception-min.js and b/lib/yui/build/moodle-core-notification-exception/moodle-core-notification-exception-min.js differ
index 3f813af..96a8aa7 100644 (file)
Binary files a/lib/yui/build/moodle-core-notification-exception/moodle-core-notification-exception.js and b/lib/yui/build/moodle-core-notification-exception/moodle-core-notification-exception.js differ
index a28774a..65eeb34 100644 (file)
@@ -30,7 +30,7 @@ Y.extend(AJAXEXCEPTION, M.core.notification.info, {
             delay = this.get('hideTimeoutDelay');
         this.get(BASE).addClass('moodle-dialogue-exception');
         this.setStdModContent(Y.WidgetStdMod.HEADER,
-                '<h1 id="moodle-dialogue-'+this.get('COUNT')+'-header-text">' + Y.Escape.html(config.name) + '</h1>',
+                '<h3 id="moodle-dialogue-'+this.get('COUNT')+'-header-text">' + Y.Escape.html(config.name) + '</h3>',
                 Y.WidgetStdMod.REPLACE);
         content = Y.Node.create('<div class="moodle-ajaxexception"></div>')
                 .append(Y.Node.create('<div class="moodle-exception-message">'+Y.Escape.html(this.get('error'))+'</div>'))
index 29c1aaa..4347232 100644 (file)
@@ -40,7 +40,7 @@ Y.extend(ALERT, M.core.notification.info, {
         this.get(BASE).addClass('moodle-dialogue-confirm');
         this.setStdModContent(Y.WidgetStdMod.BODY, content, Y.WidgetStdMod.REPLACE);
         this.setStdModContent(Y.WidgetStdMod.HEADER,
-                '<h1 id="moodle-dialogue-'+this.get('COUNT')+'-header-text">' + this.get(TITLE) + '</h1>', Y.WidgetStdMod.REPLACE);
+                '<h3 id="moodle-dialogue-'+this.get('COUNT')+'-header-text">' + this.get(TITLE) + '</h3>', Y.WidgetStdMod.REPLACE);
 
         this._closeEvents.push(
             Y.on('key', this.submit, window, 'down:13', this),
index d2e640b..6880ed3 100644 (file)
@@ -43,7 +43,7 @@ Y.extend(CONFIRM, M.core.notification.info, {
         this.get(BASE).addClass('moodle-dialogue-confirm');
         this.setStdModContent(Y.WidgetStdMod.BODY, content, Y.WidgetStdMod.REPLACE);
         this.setStdModContent(Y.WidgetStdMod.HEADER,
-                '<h1 id="moodle-dialogue-'+this.get('COUNT')+'-header-text">' + this.get(TITLE) + '</h1>', Y.WidgetStdMod.REPLACE);
+                '<h3 id="moodle-dialogue-'+this.get('COUNT')+'-header-text">' + this.get(TITLE) + '</h3>', Y.WidgetStdMod.REPLACE);
 
         this._closeEvents.push(
             Y.on('key', this.submit, window, 'down:27', this, false),
index 72f71e2..c6096f3 100644 (file)
@@ -46,7 +46,7 @@ Y.extend(EXCEPTION, M.core.notification.info, {
             delay = this.get('hideTimeoutDelay');
         this.get(BASE).addClass('moodle-dialogue-exception');
         this.setStdModContent(Y.WidgetStdMod.HEADER,
-                '<h1 id="moodle-dialogue-'+config.COUNT+'-header-text">' + Y.Escape.html(config.name) + '</h1>',
+                '<h3 id="moodle-dialogue-'+config.COUNT+'-header-text">' + Y.Escape.html(config.name) + '</h3>',
                 Y.WidgetStdMod.REPLACE);
         content = Y.Node.create('<div class="moodle-exception"></div>')
                 .append(Y.Node.create('<div class="moodle-exception-message">'+Y.Escape.html(this.get('message'))+'</div>'))
index 85e4a9e..9408c07 100644 (file)
@@ -704,70 +704,56 @@ function message_print_search($advancedsearch = false, $user1=null) {
 function message_get_recent_conversations($user, $limitfrom=0, $limitto=100) {
     global $DB;
 
-    $userfields = user_picture::fields('u', array('lastaccess'));
-    //This query retrieves the last message received from and sent to each user
-    //It unions that data then, within that set, it finds the most recent message you've exchanged with each user over all
-    //It then joins with some other tables to get some additional data we need
-
-    //message ID is used instead of timecreated as it should sort the same and will be much faster
-
-    //There is a separate query for read and unread queries as they are stored in different tables
-    //They were originally retrieved in one query but it was so large that it was difficult to be confident in its correctness
-    $sql = "SELECT $userfields, mr.id as mid, mr.notification, mr.smallmessage, mr.fullmessage, mr.fullmessagehtml, mr.fullmessageformat, mr.timecreated, mc.id as contactlistid, mc.blocked
-              FROM {message_read} mr
-              JOIN (
-                    SELECT messages.userid AS userid, MAX(messages.mid) AS mid
-                      FROM (
-                           SELECT mr1.useridto AS userid, MAX(mr1.id) AS mid
-                             FROM {message_read} mr1
-                            WHERE mr1.useridfrom = :userid1
-                                  AND mr1.notification = 0
-                         GROUP BY mr1.useridto
-                                  UNION
-                           SELECT mr2.useridfrom AS userid, MAX(mr2.id) AS mid
-                             FROM {message_read} mr2
-                            WHERE mr2.useridto = :userid2
-                                  AND mr2.notification = 0
-                         GROUP BY mr2.useridfrom
-                           ) messages
-                  GROUP BY messages.userid
-                   ) messages2 ON mr.id = messages2.mid AND (mr.useridto = messages2.userid OR mr.useridfrom = messages2.userid)
-              JOIN {user} u ON u.id = messages2.userid
-         LEFT JOIN {message_contacts} mc ON mc.userid = :userid3 AND mc.contactid = u.id
-             WHERE u.deleted = '0'
-          ORDER BY mr.id DESC";
-    $params = array('userid1' => $user->id, 'userid2' => $user->id, 'userid3' => $user->id);
-    $read =  $DB->get_records_sql($sql, $params, $limitfrom, $limitto);
-
-    $sql = "SELECT $userfields, m.id as mid, m.notification, m.smallmessage, m.fullmessage, m.fullmessagehtml, m.fullmessageformat, m.timecreated, mc.id as contactlistid, mc.blocked
-              FROM {message} m
-              JOIN (
-                    SELECT messages.userid AS userid, MAX(messages.mid) AS mid
-                      FROM (
-                           SELECT m1.useridto AS userid, MAX(m1.id) AS mid
-                             FROM {message} m1
-                            WHERE m1.useridfrom = :userid1
-                                  AND m1.notification = 0
-                         GROUP BY m1.useridto
-                                  UNION
-                           SELECT m2.useridfrom AS userid, MAX(m2.id) AS mid
-                             FROM {message} m2
-                            WHERE m2.useridto = :userid2
-                                  AND m2.notification = 0
-                         GROUP BY m2.useridfrom
-                           ) messages
-                  GROUP BY messages.userid
-                   ) messages2 ON m.id = messages2.mid AND (m.useridto = messages2.userid OR m.useridfrom = messages2.userid)
-              JOIN {user} u ON u.id = messages2.userid
-         LEFT JOIN {message_contacts} mc ON mc.userid = :userid3 AND mc.contactid = u.id
-             WHERE u.deleted = '0'
-             ORDER BY m.id DESC";
-    $unread =  $DB->get_records_sql($sql, $params, $limitfrom, $limitto);
+    $userfields = user_picture::fields('otheruser', array('lastaccess'));
+
+    // This query retrieves the most recent message received from or sent to
+    // seach other user.
+    //
+    // If two messages have the same timecreated, we take the one with the
+    // larger id.
+    //
+    // There is a separate query for read and unread messages as they are stored
+    // in different tables. They were originally retrieved in one query but it
+    // was so large that it was difficult to be confident in its correctness.
+    $sql = "SELECT $userfields,
+                   message.id as mid, message.notification, message.smallmessage, message.fullmessage,
+                   message.fullmessagehtml, message.fullmessageformat, message.timecreated,
+                   contact.id as contactlistid, contact.blocked
+
+              FROM {message_read} message
+              JOIN {user} otheruser ON otheruser.id = CASE
+                                WHEN message.useridto = :userid1 THEN message.useridfrom
+                                                                 ELSE message.useridto END
+         LEFT JOIN {message_contacts} contact ON contact.userid = :userid2 AND contact.contactid = otheruser.id
+
+             WHERE otheruser.deleted = 0
+               AND (message.useridto = :userid3 OR message.useridfrom = :userid4)
+               AND message.notification = 0
+               AND NOT EXISTS (
+                        SELECT 1
+                          FROM {message_read} othermessage
+                         WHERE ((othermessage.useridto = :userid5 AND othermessage.useridfrom = otheruser.id) OR
+                                (othermessage.useridfrom = :userid6 AND othermessage.useridto = otheruser.id))
+                           AND (othermessage.timecreated > message.timecreated OR (
+                                othermessage.timecreated = message.timecreated AND othermessage.id > message.id))
+                   )
+
+          ORDER BY message.timecreated DESC";
+    $params = array('userid1' => $user->id, 'userid2' => $user->id, 'userid3' => $user->id,
+            'userid4' => $user->id, 'userid5' => $user->id, 'userid6' => $user->id);
+    $read = $DB->get_records_sql($sql, $params, $limitfrom, $limitto);
+
+    // We want to get the messages that have not been read. These are stored in the 'message' table. It is the
+    // exact same query as the one above, except for the table we are querying. So, simply replace references to
+    // the 'message_read' table with the 'message' table.
+    $sql = str_replace('{message_read}', '{message}', $sql);
+    $unread = $DB->get_records_sql($sql, $params, $limitfrom, $limitto);
 
     $conversations = array();
 
-    //Union the 2 result sets together looking for the message with the most recent timecreated for each other user
-    //$conversation->id (the array key) is the other user's ID
+    // Union the 2 result sets together looking for the message with the most
+    // recent timecreated for each other user.
+    // $conversation->id (the array key) is the other user's ID.
     $conversation_arrays = array($unread, $read);
     foreach ($conversation_arrays as $conversation_array) {
         foreach ($conversation_array as $conversation) {
@@ -802,7 +788,7 @@ function message_get_recent_notifications($user, $limitfrom=0, $limitto=100) {
               FROM {message_read} mr
                    JOIN {user} u ON u.id=mr.useridfrom
              WHERE mr.useridto = :userid1 AND u.deleted = '0' AND mr.notification = :notification
-             ORDER BY mr.id DESC";//ordering by id should give the same result as ordering by timecreated but will be faster
+             ORDER BY mr.timecreated DESC";
     $params = array('userid1' => $user->id, 'notification' => 1);
 
     $notifications =  $DB->get_records_sql($sql, $params, $limitfrom, $limitto);
index 126e6af..57006d0 100644 (file)
@@ -62,6 +62,7 @@ class core_message_messagelib_testcase extends advanced_testcase {
      * @param stdClass $userfrom user object of the one sending the message.
      * @param stdClass $userto user object of the one receiving the message.
      * @param string $message message to send.
+     * @return int the id of the message
      */
     protected function send_fake_message($userfrom, $userto, $message = 'Hello world!') {
         global $DB;
@@ -72,7 +73,8 @@ class core_message_messagelib_testcase extends advanced_testcase {
         $record->subject = 'No subject';
         $record->fullmessage = $message;
         $record->timecreated = time();
-        $insert = $DB->insert_record('message', $record);
+
+        return $DB->insert_record('message', $record);
     }
 
     /**
@@ -358,4 +360,108 @@ class core_message_messagelib_testcase extends advanced_testcase {
         $this->assertEquals(false, message_search(array('Message'), true, true, 2));
         $this->assertCount(5, message_search(array('Message'), true, true, SITEID));
     }
+
+    /**
+     * Test message_get_recent_conversations.
+     */
+    public function test_message_get_recent_conversations() {
+        global $DB, $USER;
+
+        // Set this user as the admin.
+        $this->setAdminUser();
+
+        // Create user's to send messages to/from.
+        $user1 = $this->getDataGenerator()->create_user(array('firstname' => 'Test1', 'lastname' => 'user1'));
+        $user2 = $this->getDataGenerator()->create_user(array('firstname' => 'Test2', 'lastname' => 'user2'));
+
+        // Add a few messages that have been read and some that are unread.
+        $m1 = $this->send_fake_message($USER, $user1, 'Message 1'); // An unread message.
+        $m2 = $this->send_fake_message($user1, $USER, 'Message 2'); // An unread message.
+        $m3 = $this->send_fake_message($USER, $user1, 'Message 3'); // An unread message.
+        $m4 = message_post_message($USER, $user2, 'Message 4', FORMAT_PLAIN);
+        $m5 = message_post_message($user2, $USER, 'Message 5', FORMAT_PLAIN);
+        $m6 = message_post_message($USER, $user2, 'Message 6', FORMAT_PLAIN);
+
+        // We want to alter the timecreated values so we can ensure message_get_recent_conversations orders
+        // by timecreated, not the max id, to begin with. However, we also want more than one message to have
+        // the same timecreated value to ensure that when this happens we retrieve the one with the maximum id.
+
+        // Store the current time.
+        $time = time();
+
+        // Set the first and second unread messages to have the same timecreated value.
+        $updatemessage = new stdClass();
+        $updatemessage->id = $m1;
+        $updatemessage->timecreated = $time;
+        $DB->update_record('message', $updatemessage);
+
+        $updatemessage->id = $m2;
+        $updatemessage->timecreated = $time;
+        $DB->update_record('message', $updatemessage);
+
+        // Set the third unread message to have a timecreated value of 0.
+        $updatemessage->id = $m3;
+        $updatemessage->timecreated = 0;
+        $DB->update_record('message', $updatemessage);
+
+        // Set the first and second read messages to have the same timecreated value.
+        $updatemessage->id = $m4;
+        $updatemessage->timecreated = $time + 1;
+        $DB->update_record('message', $updatemessage);
+
+        $updatemessage->id = $m5;
+        $updatemessage->timecreated = $time + 1;
+        $DB->update_record('message', $updatemessage);
+
+        // Set the third read message to have a timecreated value of 0.
+        $updatemessage->id = $m6;
+        $updatemessage->timecreated = 0;
+        $DB->update_record('message_read', $updatemessage);
+
+        // Get the recent conversations for the current user.
+        $conversations = message_get_recent_conversations($USER);
+
+        // Confirm that we have received the messages with the maximum timecreated, rather than the max id.
+        $this->assertEquals('Message 2', $conversations[0]->fullmessage);
+        $this->assertEquals('Message 5', $conversations[1]->smallmessage);
+    }
+
+    /**
+     * Test message_get_recent_notifications.
+     */
+    public function test_message_get_recent_notifications() {
+        global $DB, $USER;
+
+        // Set this user as the admin.
+        $this->setAdminUser();
+
+        // Create a user to send messages from.
+        $user1 = $this->getDataGenerator()->create_user(array('firstname' => 'Test1', 'lastname' => 'user1'));
+
+        // Add two messages - will mark them as notifications later.
+        $m1 = message_post_message($user1, $USER, 'Message 1', FORMAT_PLAIN);
+        $m2 = message_post_message($user1, $USER, 'Message 2', FORMAT_PLAIN);
+
+        // Mark the second message as a notification.
+        $updatemessage = new stdClass();
+        $updatemessage->id = $m2;
+        $updatemessage->notification = 1;
+        $DB->update_record('message_read', $updatemessage);
+
+        // Mark the first message as a notification and change the timecreated to 0.
+        $updatemessage->id = $m1;
+        $updatemessage->notification = 1;
+        $updatemessage->timecreated = 0;
+        $DB->update_record('message_read', $updatemessage);
+
+        $notifications = message_get_recent_notifications($USER);
+
+        // Get the messages.
+        $firstmessage = array_shift($notifications);
+        $secondmessage = array_shift($notifications);
+
+        // Confirm that we have received the notifications with the maximum timecreated, rather than the max id.
+        $this->assertEquals('Message 2', $firstmessage->smallmessage);
+        $this->assertEquals('Message 1', $secondmessage->smallmessage);
+    }
 }
index 115a04e..44a1f70 100644 (file)
@@ -202,7 +202,8 @@ class assign_grading_table extends table_sql implements renderable {
             }
         }
 
-        if ($this->assignment->get_instance()->markingallocation) {
+        if ($this->assignment->get_instance()->markingworkflow &&
+            $this->assignment->get_instance()->markingallocation) {
             if (has_capability('mod/assign:manageallocations', $this->assignment->get_context())) {
                 // Check to see if marker filter is set.
                 $markerfilter = (int)get_user_preferences('assign_markerfilter', '');
@@ -296,7 +297,8 @@ class assign_grading_table extends table_sql implements renderable {
             $headers[] = get_string('submissionteam', 'assign');
         }
         // Allocated marker.
-        if ($this->assignment->get_instance()->markingallocation &&
+        if ($this->assignment->get_instance()->markingworkflow &&
+            $this->assignment->get_instance()->markingallocation &&
             has_capability('mod/assign:manageallocations', $this->assignment->get_context())) {
             // Add a column for the allocated marker.
             $columns[] = 'allocatedmarker';
@@ -504,7 +506,8 @@ class assign_grading_table extends table_sql implements renderable {
             $name = 'quickgrade_' . $row->id . '_workflowstate';
             $o .= html_writer::select($workflowstates, $name, $workflowstate, array('' => $notmarked));
             // Check if this user is a marker that can't manage allocations and doesn't have the marker column added.
-            if ($this->assignment->get_instance()->markingallocation &&
+            if ($this->assignment->get_instance()->markingworkflow &&
+                $this->assignment->get_instance()->markingallocation &&
                 !has_capability('mod/assign:manageallocations', $this->assignment->get_context())) {
 
                 $name = 'quickgrade_' . $row->id . '_allocatedmarker';
index 24a1959..54ae1bb 100644 (file)
@@ -595,6 +595,9 @@ class assign {
         }
         $update->markingworkflow = $formdata->markingworkflow;
         $update->markingallocation = $formdata->markingallocation;
+        if (empty($update->markingworkflow)) { // If marking workflow is disabled, make sure allocation is disabled.
+            $update->markingallocation = 0;
+        }
 
         $returnid = $DB->insert_record('assign', $update);
         $this->instance = $DB->get_record('assign', array('id'=>$returnid), '*', MUST_EXIST);
@@ -945,6 +948,9 @@ class assign {
         }
         $update->markingworkflow = $formdata->markingworkflow;
         $update->markingallocation = $formdata->markingallocation;
+        if (empty($update->markingworkflow)) { // If marking workflow is disabled, make sure allocation is disabled.
+            $update->markingallocation = 0;
+        }
 
         $result = $DB->update_record('assign', $update);
         $this->instance = $DB->get_record('assign', array('id'=>$update->id), '*', MUST_EXIST);
@@ -1599,17 +1605,18 @@ class assign {
 
         // Collect all submissions from the past 24 hours that require mailing.
         // Submissions are excluded if the assignment is hidden in the gradebook.
-        $sql = 'SELECT g.id as gradeid, a.course, a.name, a.blindmarking, a.revealidentities,
-                       g.*, g.timemodified as lastmodified
+        $sql = "SELECT g.id as gradeid, a.course, a.name, a.blindmarking, a.revealidentities,
+                       g.*, g.timemodified as lastmodified, cm.id as cmid
                  FROM {assign} a
                  JOIN {assign_grades} g ON g.assignment = a.id
             LEFT JOIN {assign_user_flags} uf ON uf.assignment = a.id AND uf.userid = g.userid
-                 JOIN {course_modules} cm ON cm.course = a.course
-                 JOIN {modules} md ON md.id = cm.module
+                 JOIN {course_modules} cm ON cm.course = a.course AND cm.instance = a.id
+                 JOIN {modules} md ON md.id = cm.module AND md.name = 'assign'
                  JOIN {grade_items} gri ON gri.iteminstance = a.id AND gri.courseid = a.course AND gri.itemmodule = md.name
                  WHERE g.timemodified >= :yesterday AND
                        g.timemodified <= :today AND
-                       uf.mailed = 0 AND gri.hidden = 0';
+                       uf.mailed = 0 AND gri.hidden = 0
+              ORDER BY a.course, cm.id";
 
         $params = array('yesterday' => $yesterday, 'today' => $timenow);
         $submissions = $DB->get_records_sql($sql, $params);
@@ -1642,9 +1649,6 @@ class assign {
             unset($courseidsql);
             unset($params);
 
-            // Simple array we'll use for caching modules.
-            $modcache = array();
-
             // Message students about new feedback.
             foreach ($submissions as $submission) {
 
@@ -1686,21 +1690,13 @@ class assign {
                     continue;
                 }
 
-                if (!array_key_exists($submission->assignment, $modcache)) {
-                    $mod = get_coursemodule_from_instance('assign', $submission->assignment, $course->id);
-                    if (empty($mod)) {
-                        mtrace('Could not find course module for assignment id ' . $submission->assignment);
-                        continue;
-                    }
-                    $modcache[$submission->assignment] = $mod;
-                } else {
-                    $mod = $modcache[$submission->assignment];
-                }
+                $modinfo = get_fast_modinfo($course, $user->id);
+                $cm = $modinfo->get_cm($submission->cmid);
                 // Context lookups are already cached.
-                $contextmodule = context_module::instance($mod->id);
+                $contextmodule = context_module::instance($cm->id);
 
-                if (!$mod->visible) {
-                    // Hold mail notification for hidden assignments until later.
+                if (!$cm->uservisible) {
+                    // Hold mail notification for assignments the user cannot access until later.
                     continue;
                 }
 
@@ -1720,7 +1716,7 @@ class assign {
                                                    $messagetype,
                                                    $eventtype,
                                                    $updatetime,
-                                                   $mod,
+                                                   $cm,
                                                    $contextmodule,
                                                    $course,
                                                    $modulename,
@@ -1748,7 +1744,6 @@ class assign {
 
             // Free up memory just to be sure.
             unset($courses);
-            unset($modcache);
         }
 
         // Update calendar events to provide a description.
@@ -1888,12 +1883,12 @@ class assign {
         if (!$batchusers) {
             $userid = required_param('userid', PARAM_INT);
 
-            $grade = $this->get_user_grade($userid, false);
+            $flags = $this->get_user_flags($userid, false);
 
             $user = $DB->get_record('user', array('id'=>$userid), '*', MUST_EXIST);
 
-            if ($grade) {
-                $data->extensionduedate = $grade->extensionduedate;
+            if ($flags) {
+                $data->extensionduedate = $flags->extensionduedate;
             }
             $data->userid = $userid;
         } else {
@@ -3067,7 +3062,8 @@ class assign {
         $quickgrading = get_user_preferences('assign_quickgrading', false);
         $showonlyactiveenrolopt = has_capability('moodle/course:viewsuspendedusers', $this->context);
 
-        $markingallocation = $this->get_instance()->markingallocation &&
+        $markingallocation = $this->get_instance()->markingworkflow &&
+            $this->get_instance()->markingallocation &&
             has_capability('mod/assign:manageallocations', $this->context);
         // Get markers to use in drop lists.
         $markingallocationoptions = array();
@@ -3437,7 +3433,8 @@ class assign {
         require_once($CFG->dirroot . '/mod/assign/gradingbatchoperationsform.php');
         require_sesskey();
 
-        $markingallocation = $this->get_instance()->markingallocation &&
+        $markingallocation = $this->get_instance()->markingworkflow &&
+            $this->get_instance()->markingallocation &&
             has_capability('mod/assign:manageallocations', $this->context);
 
         $batchformparams = array('cm'=>$this->get_course_module()->id,
@@ -5136,7 +5133,8 @@ class assign {
                 $current->grade = floatval($current->grade);
             }
             $gradechanged = $gradecolpresent && $current->grade !== $modified->grade;
-            $markingallocationchanged = $this->get_instance()->markingallocation &&
+            $markingallocationchanged = $this->get_instance()->markingworkflow &&
+                                        $this->get_instance()->markingallocation &&
                                             ($modified->allocatedmarker !== false) &&
                                             ($current->allocatedmarker != $modified->allocatedmarker);
             $workflowstatechanged = $this->get_instance()->markingworkflow &&
@@ -5319,7 +5317,8 @@ class assign {
             $showonlyactiveenrolopt = false;
         }
 
-        $markingallocation = $this->get_instance()->markingallocation &&
+        $markingallocation = $this->get_instance()->markingworkflow &&
+            $this->get_instance()->markingallocation &&
             has_capability('mod/assign:manageallocations', $this->context);
         // Get markers to use in drop lists.
         $markingallocationoptions = array();
@@ -5417,8 +5416,12 @@ class assign {
             $user = $DB->get_record('user', array('id' => $submission->userid), '*', MUST_EXIST);
             $name = fullname($user);
         } else {
-            $group = $DB->get_record('groups', array('id' => $submission->groupid), '*', MUST_EXIST);
-            $name = $group->name;
+            $group = $this->get_submission_group($submission->userid);
+            if ($group) {
+                $name = $group->name;
+            } else {
+                $name = get_string('defaultteam', 'assign');
+            }
         }
         $status = get_string('submissionstatus_' . $submission->status, 'assign');
         $params = array('id'=>$submission->userid, 'fullname'=>$name, 'status'=>$status);
@@ -5895,7 +5898,10 @@ class assign {
             $mform->addHelpButton('workflowstate', 'markingworkflowstate', 'assign');
         }
 
-        if ($this->get_instance()->markingallocation && has_capability('mod/assign:manageallocations', $this->context)) {
+        if ($this->get_instance()->markingworkflow &&
+            $this->get_instance()->markingallocation &&
+            has_capability('mod/assign:manageallocations', $this->context)) {
+
             $markers = get_users_by_capability($this->context, 'mod/assign:grade');
             $markerlist = array('' =>  get_string('choosemarker', 'assign'));
             foreach ($markers as $marker) {
@@ -5967,7 +5973,16 @@ class assign {
             }
         }
         $mform->addElement('selectyesno', 'sendstudentnotifications', get_string('sendstudentnotifications', 'assign'));
-        $mform->setDefault('sendstudentnotifications', $this->get_instance()->sendstudentnotifications);
+        // Get assignment visibility information for student.
+        $modinfo = get_fast_modinfo($settings->course, $userid);
+        $cm = $modinfo->get_cm($this->get_course_module()->id);
+        // Don't allow notification to be sent if student can't access assignment.
+        if (!$cm->uservisible) {
+            $mform->setDefault('sendstudentnotifications', 0);
+            $mform->freeze('sendstudentnotifications');
+        } else {
+            $mform->setDefault('sendstudentnotifications', $this->get_instance()->sendstudentnotifications);
+        }
 
         $mform->addElement('hidden', 'action', 'submitgrade');
         $mform->setType('action', PARAM_ALPHA);
index d168afb..1a203d2 100644 (file)
@@ -606,6 +606,38 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase {
         $this->assertEquals(self::GROUP_COUNT + 1, $assign->count_teams());
     }
 
+    public function test_submit_to_default_group() {
+        global $DB;
+
+        $this->preventResetByRollback();
+        $sink = $this->redirectMessages();
+
+        $this->setUser($this->editingteachers[0]);
+        $params = array('teamsubmission' => 1,
+                        'assignsubmission_onlinetext_enabled' => 1,
+                        'submissiondrafts'=>0);
+        $assign = $this->create_instance($params);
+
+        $newstudent = $this->getDataGenerator()->create_user();
+        $studentrole = $DB->get_record('role', array('shortname'=>'student'));
+        $this->getDataGenerator()->enrol_user($newstudent->id,
+                                              $this->course->id,
+                                              $studentrole->id);
+        $this->setUser($newstudent);
+        $data = new stdClass();
+        $data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(),
+                                         'text'=>'Submission text',
+                                         'format'=>FORMAT_MOODLE);
+        $notices = array();
+
+        $group = $assign->get_submission_group($newstudent->id);
+        $this->assertFalse($group, 'New student is in default group');
+        $assign->save_submission($data, $notices);
+        $this->assertEmpty($notices, 'No errors on save submission');
+
+        $sink->close();
+    }
+
     public function test_count_submissions() {
         $this->create_extra_users();
         $this->setUser($this->editingteachers[0]);
index 86881b1..1e7d2a7 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
@@ -70,27 +69,27 @@ class moodle1_mod_chat_handler extends moodle1_mod_handler {
     public function process_chat($data) {
         global $CFG;
 
-        // get the course module id and context id
+        // Get the course module id and context id.
         $instanceid     = $data['id'];
         $cminfo         = $this->get_cminfo($instanceid);
         $this->moduleid = $cminfo['id'];
         $contextid      = $this->converter->get_contextid(CONTEXT_MODULE, $this->moduleid);
 
-        // replay the upgrade step 2010050101
+        // Replay the upgrade step 2010050101.
         if ($CFG->texteditors !== 'textarea') {
             $data['intro']       = text_to_html($data['intro'], false, false, true);
             $data['introformat'] = FORMAT_HTML;
         }
 
-        // get a fresh new file manager for this instance
+        // Get a fresh new file manager for this instance.
         $this->fileman = $this->converter->get_file_manager($contextid, 'mod_chat');
 
-        // convert course files embedded into the intro
+        // Convert course files embedded into the intro.
         $this->fileman->filearea = 'intro';
         $this->fileman->itemid   = 0;
         $data['intro'] = moodle1_converter::migrate_referenced_files($data['intro'], $this->fileman);
 
-        // start writing chat.xml
+        // Start writing chat.xml.
         $this->open_xml_writer("activities/chat_{$this->moduleid}/chat.xml");
         $this->xmlwriter->begin_tag('activity', array('id' => $instanceid, 'moduleid' => $this->moduleid,
             'modulename' => 'chat', 'contextid' => $contextid));
@@ -112,21 +111,20 @@ class moodle1_mod_chat_handler extends moodle1_mod_handler {
      * data available
      */
     public function process_chat_message($data) {
-        //@todo process user data
-        //$this->write_xml('message', $data, array('/message/id'));
+        // MDL-46466 - Should this be empty?
     }
 
     /**
      * This is executed when we reach the closing </MOD> tag of our 'chat' path
      */
     public function on_chat_end() {
-        // close chat.xml
+        // Close chat.xml.
         $this->xmlwriter->end_tag('messages');
         $this->xmlwriter->end_tag('chat');
         $this->xmlwriter->end_tag('activity');
         $this->close_xml_writer();
 
-        // write inforef.xml
+        // Write inforef.xml.
         $this->open_xml_writer("activities/chat_{$this->moduleid}/inforef.xml");
         $this->xmlwriter->begin_tag('inforef');
         $this->xmlwriter->begin_tag('fileref');
index ca28c63..39ec9c8 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
@@ -55,13 +54,13 @@ class backup_chat_activity_task extends backup_activity_task {
     static public function encode_content_links($content) {
         global $CFG;
 
-        $base = preg_quote($CFG->wwwroot.'/mod/chat','#');
+        $base = preg_quote($CFG->wwwroot . '/mod/chat', '#');
 
-        //Link to the list of chats
+        // Link to the list of chats.
         $pattern = "#(".$base."\/index.php\?id\=)([0-9]+)#";
         $content = preg_replace($pattern, '$@CHATINDEX*$2@$', $content);
 
-        //Link to chat view by moduleid
+        // Link to chat view by moduleid.
         $pattern = "#(".$base."\/view.php\?id\=)([0-9]+)#";
         $content = preg_replace($pattern, '$@CHATVIEWBYID*$2@$', $content);
 
index eb2fdb3..a637221 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
@@ -29,7 +28,7 @@ class backup_chat_activity_structure_step extends backup_activity_structure_step
     protected function define_structure() {
         $userinfo = $this->get_setting_value('userinfo');
 
-        // Define each element separated
+        // Define each element separated.
         $chat = new backup_nested_element('chat', array('id'), array(
             'name', 'intro', 'introformat', 'keepdays', 'studentlogs',
             'chattime', 'schedule', 'timemodified'));
@@ -38,29 +37,29 @@ class backup_chat_activity_structure_step extends backup_activity_structure_step
         $message = new backup_nested_element('message', array('id'), array(
             'userid', 'groupid', 'system', 'message_text', 'timestamp'));
 
-        // it is not cool to have two tags with same name, so we need to rename message field to message_text
+        // It is not cool to have two tags with same name, so we need to rename message field to message_text.
         $message->set_source_alias('message', 'message_text');
 
-        // Build the tree
+        // Build the tree.
         $chat->add_child($messages);
             $messages->add_child($message);
 
-        // Define sources
+        // Define sources.
         $chat->set_source_table('chat', array('id' => backup::VAR_ACTIVITYID));
 
-        // User related messages only happen if we are including user info
+        // User related messages only happen if we are including user info.
         if ($userinfo) {
-            $message->set_source_table('chat_messages', array('chatid'=>backup::VAR_PARENTID));
+            $message->set_source_table('chat_messages', array('chatid' => backup::VAR_PARENTID));
         }
 
-        // Define id annotations
+        // Define id annotations.
         $message->annotate_ids('user', 'userid');
         $message->annotate_ids('group', 'groupid');
 
-        // Annotate the file areas in chat module
-        $chat->annotate_files('mod_chat', 'intro', null); // chat_intro area don't use itemid
+        // Annotate the file areas in chat module.
+        $chat->annotate_files('mod_chat', 'intro', null); // The chat_intro area doesn't use itemid.
 
-        // Return the root element (chat), wrapped into standard activity structure
+        // Return the root element (chat), wrapped into standard activity structure.
         return $this->prepare_activity_structure($chat);
     }
 }
index 0e57830..d4f5af7 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
@@ -24,7 +23,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-require_once($CFG->dirroot . '/mod/chat/backup/moodle2/restore_chat_stepslib.php'); // Because it exists (must)
+require_once($CFG->dirroot . '/mod/chat/backup/moodle2/restore_chat_stepslib.php');
 
 /**
  * chat restore task that provides all the settings and steps to perform one
@@ -36,14 +35,14 @@ class restore_chat_activity_task extends restore_activity_task {
      * Define (add) particular settings this activity can have
      */
     protected function define_my_settings() {
-        // No particular settings for this activity
+        // No particular settings for this activity.
     }
 
     /**
      * Define (add) particular steps this activity can have
      */
     protected function define_my_steps() {
-        // chat only has one structure step
+        // Chat only has one structure step.
         $this->add_step(new restore_chat_activity_structure_step('chat_structure', 'chat.xml'));
     }
 
index 4b4e62a..582227f 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
@@ -41,7 +40,7 @@ class restore_chat_activity_structure_step extends restore_activity_structure_st
             $paths[] = new restore_path_element('chat_message', '/activity/chat/messages/message');
         }
 
-        // Return the paths wrapped into standard activity structure
+        // Return the paths wrapped into standard activity structure.
         return $this->prepare_activity_structure($paths);
     }
 
@@ -55,9 +54,9 @@ class restore_chat_activity_structure_step extends restore_activity_structure_st
         $data->chattime = $this->apply_date_offset($data->chattime);
         $data->timemodified = $this->apply_date_offset($data->timemodified);
 
-        // insert the chat record
+        // Insert the chat record.
         $newitemid = $DB->insert_record('chat', $data);
-        // immediately after inserting "activity" record, call this
+        // Immediately after inserting "activity" record, call this.
         $this->apply_activity_instance($newitemid);
     }
 
@@ -73,11 +72,11 @@ class restore_chat_activity_structure_step extends restore_activity_structure_st
         $data->timestamp = $this->apply_date_offset($data->timestamp);
 
         $newitemid = $DB->insert_record('chat_messages', $data);
-        $this->set_mapping('chat_message', $oldid, $newitemid); // because of decode
+        $this->set_mapping('chat_message', $oldid, $newitemid); // Because of decode.
     }
 
     protected function after_execute() {
-        // Add chat related files, no need to match by itemname (just internally handled context)
+        // Add chat related files, no need to match by itemname (just internally handled context).
         $this->add_related_files('mod_chat', 'intro', null);
     }
 }
index 378fd0c..076371a 100644 (file)
@@ -20,24 +20,24 @@ require_once(dirname(dirname(dirname(__FILE__))) . '/config.php');
 require_once(dirname(__FILE__) . '/lib.php');
 
 $action       = optional_param('action', '', PARAM_ALPHANUM);
-$beep_id      = optional_param('beep', '', PARAM_RAW);
-$chat_sid     = required_param('chat_sid', PARAM_ALPHANUM);
+$beepid       = optional_param('beep', '', PARAM_RAW);
+$chatsid      = required_param('chat_sid', PARAM_ALPHANUM);
 $theme        = required_param('theme', PARAM_ALPHANUMEXT);
-$chat_message = optional_param('chat_message', '', PARAM_RAW);
-$chat_lasttime = optional_param('chat_lasttime', 0, PARAM_INT);
-$chat_lastrow  = optional_param('chat_lastrow', 1, PARAM_INT);
+$chatmessage  = optional_param('chat_message', '', PARAM_RAW);
+$chatlasttime = optional_param('chat_lasttime', 0, PARAM_INT);
+$chatlastrow  = optional_param('chat_lastrow', 1, PARAM_INT);
 
 if (!confirm_sesskey()) {
     throw new moodle_exception('invalidsesskey', 'error');
 }
 
-if (!$chatuser = $DB->get_record('chat_users', array('sid'=>$chat_sid))) {
+if (!$chatuser = $DB->get_record('chat_users', array('sid' => $chatsid))) {
     throw new moodle_exception('notlogged', 'chat');
 }
-if (!$chat = $DB->get_record('chat', array('id'=>$chatuser->chatid))) {
+if (!$chat = $DB->get_record('chat', array('id' => $chatuser->chatid))) {
     throw new moodle_exception('invaliduserid', 'error');
 }
-if (!$course = $DB->get_record('course', array('id'=>$chat->course))) {
+if (!$course = $DB->get_record('course', array('id' => $chat->course))) {
     throw new moodle_exception('invalidcourseid', 'error');
 }
 if (!$cm = get_coursemodule_from_instance('chat', $chat->id, $course->id)) {
@@ -48,9 +48,9 @@ if (!isloggedin()) {
     throw new moodle_exception('notlogged', 'chat');
 }
 
-// setup $PAGE so that format_text will work properly
+// Set up $PAGE so that format_text will work properly.
 $PAGE->set_cm($cm, $course, $chat);
-$PAGE->set_url('/mod/chat/chat_ajax.php', array('chat_sid'=>$chat_sid));
+$PAGE->set_url('/mod/chat/chat_ajax.php', array('chat_sid' => $chatsid));
 
 require_login($course, false, $cm);
 
@@ -65,104 +65,104 @@ header('Pragma: no-cache');
 header('Content-Type: text/html; charset=utf-8');
 
 switch ($action) {
-case 'init':
-    $users = chat_get_users($chatuser->chatid, $chatuser->groupid, $cm->groupingid);
-    $users = chat_format_userlist($users, $course);
-    $response['users'] = $users;
-    echo json_encode($response);
-    break;
+    case 'init':
+        $users = chat_get_users($chatuser->chatid, $chatuser->groupid, $cm->groupingid);
+        $users = chat_format_userlist($users, $course);
+        $response['users'] = $users;
+        echo json_encode($response);
+        break;
 
-case 'chat':
-    \core\session\manager::write_close();
-    chat_delete_old_users();
-    $chat_message = clean_text($chat_message, FORMAT_MOODLE);
+    case 'chat':
+        \core\session\manager::write_close();
+        chat_delete_old_users();
+        $chatmessage = clean_text($chatmessage, FORMAT_MOODLE);
 
-    if (!empty($beep_id)) {
-        $chat_message = 'beep '.$beep_id;
-    }
+        if (!empty($beepid)) {
+            $chatmessage = 'beep '.$beepid;
+        }
 
-    if (!empty($chat_message)) {
+        if (!empty($chatmessage)) {
 
-        chat_send_chatmessage($chatuser, $chat_message, 0, $cm);
+            chat_send_chatmessage($chatuser, $chatmessage, 0, $cm);
 
-        $chatuser->lastmessageping = time() - 2;
-        $DB->update_record('chat_users', $chatuser);
+            $chatuser->lastmessageping = time() - 2;
+            $DB->update_record('chat_users', $chatuser);
 
-        // Response OK message.
-        echo json_encode(true);
-        ob_end_flush();
-    }
-    break;
+            // Response OK message.
+            echo json_encode(true);
+            ob_end_flush();
+        }
+        break;
 
-case 'update':
-    if ((time() - $chat_lasttime) > $CFG->chat_old_ping) {
-        chat_delete_old_users();
-    }
-
-    if ($latest_message = chat_get_latest_message($chatuser->chatid, $chatuser->groupid)) {
-        $chat_newlasttime = $latest_message->timestamp;
-    } else {
-        $chat_newlasttime = 0;
-    }
-
-    if ($chat_lasttime == 0) {
-        $chat_lasttime = time() - $CFG->chat_old_ping;
-    }
-
-    $params = array('groupid'=>$chatuser->groupid, 'chatid'=>$chatuser->chatid, 'lasttime'=>$chat_lasttime);
-
-    $groupselect = $chatuser->groupid ? " AND (groupid=".$chatuser->groupid." OR groupid=0) " : "";
-
-    $messages = $DB->get_records_select('chat_messages_current',
-        'chatid = :chatid AND timestamp > :lasttime '.$groupselect, $params,
-        'timestamp ASC');
-
-    if (!empty($messages)) {
-        $num = count($messages);
-    } else {
-        $num = 0;
-    }
-    $chat_newrow = ($chat_lastrow + $num) % 2;
-    $send_user_list = false;
-    if ($messages && ($chat_lasttime != $chat_newlasttime)) {
-        foreach ($messages as $n => &$message) {
-            $tmp = new stdClass();
-            // when somebody enter room, user list will be updated
-            if (!empty($message->system)){
-                $send_user_list = true;
-            }
-            if ($html = chat_format_message_theme($message, $chatuser, $USER, $cm->groupingid, $theme)) {
-                $message->mymessage = ($USER->id == $message->userid);
-                $message->message  = $html->html;
-                if (!empty($html->type)) {
-                    $message->type = $html->type;
+    case 'update':
+        if ((time() - $chatlasttime) > $CFG->chat_old_ping) {
+            chat_delete_old_users();
+        }
+
+        if ($latestmessage = chat_get_latest_message($chatuser->chatid, $chatuser->groupid)) {
+            $chatnewlasttime = $latestmessage->timestamp;
+        } else {
+            $chatnewlasttime = 0;
+        }
+
+        if ($chatlasttime == 0) {
+            $chatlasttime = time() - $CFG->chat_old_ping;
+        }
+
+        $params = array('groupid' => $chatuser->groupid, 'chatid' => $chatuser->chatid, 'lasttime' => $chatlasttime);
+
+        $groupselect = $chatuser->groupid ? " AND (groupid=".$chatuser->groupid." OR groupid=0) " : "";
+
+        $messages = $DB->get_records_select('chat_messages_current',
+            'chatid = :chatid AND timestamp > :lasttime '.$groupselect, $params,
+            'timestamp ASC');
+
+        if (!empty($messages)) {
+            $num = count($messages);
+        } else {
+            $num = 0;
+        }
+        $chatnewrow = ($chatlastrow + $num) % 2;
+        $senduserlist = false;
+        if ($messages && ($chatlasttime != $chatnewlasttime)) {
+            foreach ($messages as $n => &$message) {
+                $tmp = new stdClass();
+                // When somebody enter room, user list will be updated.
+                if (!empty($message->system)) {
+                    $senduserlist = true;
+                }
+                if ($html = chat_format_message_theme($message, $chatuser, $USER, $cm->groupingid, $theme)) {
+                    $message->mymessage = ($USER->id == $message->userid);
+                    $message->message  = $html->html;
+                    if (!empty($html->type)) {
+                        $message->type = $html->type;
+                    }
+                } else {
+                    unset($messages[$n]);
                 }
-            } else {
-                unset($messages[$n]);
             }
         }
-    }
 
-    if($send_user_list){
-        // return users when system message coming
-        $users = chat_format_userlist(chat_get_users($chatuser->chatid, $chatuser->groupid, $cm->groupingid), $course);
-        $response['users'] = $users;
-    }
+        if ($senduserlist) {
+            // Return users when system message arrives.
+            $users = chat_format_userlist(chat_get_users($chatuser->chatid, $chatuser->groupid, $cm->groupingid), $course);
+            $response['users'] = $users;
+        }
 
-    $DB->set_field('chat_users', 'lastping', time(), array('id'=>$chatuser->id));
+        $DB->set_field('chat_users', 'lastping', time(), array('id' => $chatuser->id));
 
-    $response['lasttime'] = $chat_newlasttime;
-    $response['lastrow']  = $chat_newrow;
-    if($messages){
-        $response['msgs'] = $messages;
-    }
+        $response['lasttime'] = $chatnewlasttime;
+        $response['lastrow']  = $chatnewrow;
+        if ($messages) {
+            $response['msgs'] = $messages;
+        }
 
-    echo json_encode($response);
-    header('Content-Length: ' . ob_get_length() );
+        echo json_encode($response);
+        header('Content-Length: ' . ob_get_length());
 
-    ob_end_flush();
-    break;
+        ob_end_flush();
+        break;
 
-default:
-    break;
+    default:
+        break;
 }
index f7e0c1e..69b6a68 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
@@ -28,17 +27,17 @@ define('CLI_SCRIPT', true);
 require(dirname(dirname(dirname(__FILE__))).'/config.php');
 require_once($CFG->dirroot . '/mod/chat/lib.php');
 
-// Browser quirks
+// Browser quirks.
 define('QUIRK_CHUNK_UPDATE', 0x0001);
 
-// Connection telltale
+// Connection telltale.
 define('CHAT_CONNECTION',           0x10);
-// Connections: Incrementing sequence, 0x10 to 0x1f
+// Connections: Incrementing sequence, 0x10 to 0x1f.
 define('CHAT_CONNECTION_CHANNEL',   0x11);
 
-// Sidekick telltale
+// Sidekick telltale.
 define('CHAT_SIDEKICK',             0x20);
-// Sidekicks: Incrementing sequence, 0x21 to 0x2f
+// Sidekicks: Incrementing sequence, 0x21 to 0x2f.
 define('CHAT_SIDEKICK_USERS',       0x21);
 define('CHAT_SIDEKICK_MESSAGE',     0x22);
 define('CHAT_SIDEKICK_BEEP',        0x23);
@@ -46,9 +45,9 @@ define('CHAT_SIDEKICK_BEEP',        0x23);
 $phpversion = phpversion();
 echo 'Moodle chat daemon v1.0 on PHP '.$phpversion."\n\n";
 
-/// Set up all the variables we need   /////////////////////////////////////
+// Set up all the variables we need.
 
-/// $CFG variables are now defined in database by chat/lib.php
+// The $CFG variables are now defined in database by chat/lib.php.
 
 $_SERVER['PHP_SELF']        = 'dummy';
 $_SERVER['SERVER_NAME']     = 'dummy';
@@ -61,48 +60,47 @@ core_php_time_limit::raise(0);
 error_reporting(E_ALL);
 
 function chat_empty_connection() {
-    return array('sid' => NULL, 'handle' => NULL, 'ip' => NULL, 'port' => NULL, 'groupid' => NULL);
+    return array('sid' => null, 'handle' => null, 'ip' => null, 'port' => null, 'groupid' => null);
 }
 
 class ChatConnection {
-    // Chat-related info
-    var $sid    = NULL;
-    var $type   = NULL;
-    //var $groupid        = NULL;
+    // Chat-related info.
+    public $sid  = null;
+    public $type = null;
 
-    // PHP-level info
-    var $handle = NULL;
+    // PHP-level info.
+    public $handle = null;
 
-    // TCP/IP
-    var $ip     = NULL;
-    var $port   = NULL;
+    // TCP/IP.
+    public $ip     = null;
+    public $port   = null;
 
-    function ChatConnection($resource) {
+    public function __construct($resource) {
         $this->handle = $resource;
         @socket_getpeername($this->handle, $this->ip, $this->port);
     }
 }
 
 class ChatDaemon {
-    var $_resetsocket       = false;
-    var $_readytogo         = false;
-    var $_logfile           = false;
-    var $_trace_to_console  = true;
-    var $_trace_to_stdout   = true;
-    var $_logfile_name      = 'chatd.log';
-    var $_last_idle_poll    = 0;
-
-    var $conn_ufo  = array();    // Connections not identified yet
-    var $conn_side = array();    // Sessions with sidekicks waiting for the main connection to be processed
-    var $conn_half = array();    // Sessions that have valid connections but not all of them
-    var $conn_sets = array();    // Sessions with complete connection sets sets
-    var $sets_info = array();    // Keyed by sessionid exactly like conn_sets, one of these for each of those
-    var $chatrooms = array();    // Keyed by chatid, holding arrays of data
-
-    // IMPORTANT: $conn_sets, $sets_info and $chatrooms must remain synchronized!
+    public $_resetsocket       = false;
+    public $_readytogo         = false;
+    public $_logfile           = false;
+    public $_trace_to_console  = true;
+    public $_trace_to_stdout   = true;
+    public $_logfile_name      = 'chatd.log';
+    public $_last_idle_poll    = 0;
+
+    public $connectionsunidentified  = array(); // Connections not identified yet.
+    public $connectionsside = array(); // Sessions with sidekicks waiting for the main connection to be processed.
+    public $connectionshalf = array(); // Sessions that have valid connections but not all of them.
+    public $connectionssets = array(); // Sessions with complete connection sets.
+    public $setsinfo = array(); // Keyed by sessionid exactly like conn_sets, one of these for each of those.
+    public $chatrooms = array(); // Keyed by chatid, holding arrays of data.
+
+    // IMPORTANT: $connectionssets, $setsinfo and $chatrooms must remain synchronized!
     //            Pay extra attention when you write code that affects any of them!
 
-    function ChatDaemon() {
+    public function __construct() {
         $this->_trace_level         = E_ALL ^ E_USER_NOTICE;
         $this->_pcntl_exists        = function_exists('pcntl_fork');
         $this->_time_rest_socket    = 20;
@@ -110,33 +108,34 @@ class ChatDaemon {
         $this->_freq_update_records = 20;
         $this->_freq_poll_idle_chat = $GLOBALS['CFG']->chat_old_ping;
         $this->_stdout = fopen('php://stdout', 'w');
-        if($this->_stdout) {
-            // Avoid double traces for everything
+        if ($this->_stdout) {
+            // Avoid double traces for everything.
             $this->_trace_to_console = false;
         }
     }
 
-    function error_handler ($errno, $errmsg, $filename, $linenum, $vars) {
-        // Checks if an error needs to be suppressed due to @
-        if(error_reporting() != 0) {
+    public function error_handler ($errno, $errmsg, $filename, $linenum, $vars) {
+        // Checks if an error needs to be suppressed due to @.
+        if (error_reporting() != 0) {
             $this->trace($errmsg.' on line '.$linenum, $errno);
         }
         return true;
     }
 
-    function poll_idle_chats($now) {
+    public function poll_idle_chats($now) {
         $this->trace('Polling chats to detect disconnected users');
-        if(!empty($this->chatrooms)) {
-            foreach($this->chatrooms as $chatid => $chatroom) {
-                if(!empty($chatroom['users'])) {
-                    foreach($chatroom['users'] as $sessionid => $userid) {
-                        // We will be polling each user as required
+        if (!empty($this->chatrooms)) {
+            foreach ($this->chatrooms as $chatid => $chatroom) {
+                if (!empty($chatroom['users'])) {
+                    foreach ($chatroom['users'] as $sessionid => $userid) {
+                        // We will be polling each user as required.
                         $this->trace('...shall we poll '.$sessionid.'?');
-                        if($this->sets_info[$sessionid]['chatuser']->lastmessageping < $this->_last_idle_poll) {
+                        if ($this->sets_info[$sessionid]['chatuser']->lastmessageping < $this->_last_idle_poll) {
                             $this->trace('YES!');
-                            // This user hasn't been polled since his last message
-                            if($this->write_data($this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL], '<!-- poll -->') === false) {
-                                // User appears to have disconnected
+                            // This user hasn't been polled since his last message.
+                            $result = $this->write_data($this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL], '<!-- poll -->');
+                            if ($result === false) {
+                                // User appears to have disconnected.
                                 $this->disconnect_session($sessionid);
                             }
                         }
@@ -147,76 +146,65 @@ class ChatDaemon {
         $this->_last_idle_poll = $now;
     }
 
-    function query_start() {
+    public function query_start() {
         return $this->_readytogo;
     }
 
-    function trace($message, $level = E_USER_NOTICE) {
+    public function trace($message, $level = E_USER_NOTICE) {
         $severity = '';
 
         switch($level) {
-            case E_USER_WARNING: $severity = '*IMPORTANT* '; break;
-            case E_USER_ERROR:   $severity = ' *CRITICAL* '; break;
+            case E_USER_WARNING:
+                $severity = '*IMPORTANT* ';
+                break;
+            case E_USER_ERROR:
+                $severity = ' *CRITICAL* ';
+                break;
             case E_NOTICE:
-            case E_WARNING:      $severity = ' *CRITICAL* [php] '; break;
+            case E_WARNING:
+                $severity = ' *CRITICAL* [php] ';
+                break;
         }
 
         $date = date('[Y-m-d H:i:s] ');
         $message = $date.$severity.$message."\n";
 
         if ($this->_trace_level & $level) {
-            // It is accepted for output
+            // It is accepted for output.
 
-            // Error-class traces go to STDERR too
-            if($level & E_USER_ERROR) {
+            // Error-class traces go to STDERR too.
+            if ($level & E_USER_ERROR) {
                 fwrite(STDERR, $message);
             }
 
-            // Emit the message to wherever we should
-            if($this->_trace_to_stdout) {
+            // Emit the message to wherever we should.
+            if ($this->_trace_to_stdout) {
                 fwrite($this->_stdout, $message);
                 fflush($this->_stdout);
             }
-            if($this->_trace_to_console) {
+            if ($this->_trace_to_console) {
                 echo $message;
                 flush();
             }
-            if($this->_logfile) {
+            if ($this->_logfile) {
                 fwrite($this->_logfile, $message);
                 fflush($this->_logfile);
             }
         }
     }
 
-    function write_data($connection, $text) {
+    public function write_data($connection, $text) {
         $written = @socket_write($connection, $text, strlen($text));
-        if($written === false) {
-            // $this->trace("socket_write() failed: reason: " . socket_strerror(socket_last_error($connection)));
+        if ($written === false) {
             return false;
         }
         return true;
-
-        // Enclosing the above code inside this blocks makes sure that
-        // "a socket write operation will not block". I 'm not so sure
-        // if this is needed, as we have a nonblocking socket anyway.
-        // If trouble starts to creep up, we 'll restore this.
-//        $check_socket = array($connection);
-//        $read = null;
-//        $except = null;
-//        $socket_changed = socket_select($read, $check_socket, $except, 0, 0);
-//        if($socket_changed > 0) {
-//
-//            // ABOVE CODE GOES HERE
-//
-//        }
-//        return false;
     }
 
-    function user_lazy_update($sessionid) {
+    public function user_lazy_update($sessionid) {
         global $DB;
 
-        // TODO: this can and should be written as a single UPDATE query
-        if(empty($this->sets_info[$sessionid])) {
+        if (empty($this->sets_info[$sessionid])) {
             $this->trace('user_lazy_update() called for an invalid SID: '.$sessionid, E_USER_WARNING);
             return false;
         }
@@ -224,16 +212,16 @@ class ChatDaemon {
         $now = time();
 
         // We 'll be cheating a little, and NOT updating the record data as
-        // often as we can, so that we save on DB queries (imagine MANY users)
-        if($now - $this->sets_info[$sessionid]['lastinfocommit'] > $this->_freq_update_records) {
-            // commit to permanent storage
+        // often as we can, so that we save on DB queries (imagine MANY users).
+        if ($now - $this->sets_info[$sessionid]['lastinfocommit'] > $this->_freq_update_records) {
+            // Commit to permanent storage.
             $this->sets_info[$sessionid]['lastinfocommit'] = $now;
             $DB->update_record('chat_users', $this->sets_info[$sessionid]['chatuser']);
         }
         return true;
     }
 
-    function get_user_window($sessionid) {
+    public function get_user_window($sessionid) {
         global $CFG, $OUTPUT;
 
         static $str;
@@ -257,10 +245,10 @@ class ChatDaemon {
         }
 
         ob_start();
-        $refresh_inval = $CFG->chat_refresh_userlist * 1000;
+        $refreshinval = $CFG->chat_refresh_userlist * 1000;
         echo <<<EOD
         <html><head>
-        <meta http-equiv="refresh" content="$refresh_inval">
+        <meta http-equiv="refresh" content="$refreshinval">
         <style type="text/css"> img{border:0} </style>
         <script type="text/javascript">
         //<![CDATA[
@@ -278,11 +266,11 @@ class ChatDaemon {
         </script></head><body><table><tbody>
 EOD;
 
-        // Get the users from that chatroom
+        // Get the users from that chatroom.
         $users = $this->chatrooms[$info['chatid']]['users'];
 
         foreach ($users as $usersessionid => $userid) {
-            // Fetch each user's sessionid and then the rest of his data from $this->sets_info
+            // Fetch each user's sessionid and then the rest of his data from $this->sets_info.
             $userinfo = $this->sets_info[$usersessionid];
 
             $lastping = $timenow - $userinfo['chatuser']->lastmessageping;
@@ -290,7 +278,7 @@ EOD;
             echo '<tr><td width="35">';
 
             $link = '/user/view.php?id='.$userinfo['user']->id.'&course='.$userinfo['courseid'];
-            $anchortagcontents = $OUTPUT->user_picture($userinfo['user'], array('courseid'=>$userinfo['courseid']));
+            $anchortagcontents = $OUTPUT->user_picture($userinfo['user'], array('courseid' => $userinfo['courseid']));
 
             $action = new popup_action('click', $link, 'user'.$userinfo['chatuser']->id);
             $anchortag = $OUTPUT->action_link($link, $anchortagcontents, $action);
@@ -300,36 +288,33 @@ EOD;
             echo "<p><font size=\"1\">";
             echo fullname($userinfo['user'])."<br />";
             echo "<font color=\"#888888\">$str->idle: ".format_time($lastping, $str)."</font> ";
-            echo '<a target="empty" href="http://'.$CFG->chat_serverhost.':'.$CFG->chat_serverport.'/?win=beep&amp;beep='.$userinfo['user']->id.
+            echo '<a target="empty" href="http://'.$CFG->chat_serverhost.':'.$CFG->chat_serverport.
+                 '/?win=beep&amp;beep='.$userinfo['user']->id.
                  '&chat_sid='.$sessionid.'">'.$str->beep."</a>\n";
             echo "</font></p>";
             echo "<td></tr>";
         }
 
         echo '</tbody></table>';
-
-        // About 2K of HTML comments to force browsers to render the HTML
-        // echo $GLOBALS['CHAT_DUMMY_DATA'];
-
         echo "</body>\n</html>\n";
 
         return ob_get_clean();
 
     }
 
-    function new_ufo_id() {
+    public function new_ufo_id() {
         static $id = 0;
-        if($id++ === 0x1000000) { // Cycling very very slowly to prevent overflow
+        if ($id++ === 0x1000000) { // Cycling very very slowly to prevent overflow.
             $id = 0;
         }
         return $id;
     }
 
-    function process_sidekicks($sessionid) {
-        if(empty($this->conn_side[$sessionid])) {
+    public function process_sidekicks($sessionid) {
+        if (empty($this->conn_side[$sessionid])) {
             return true;
         }
-        foreach($this->conn_side[$sessionid] as $sideid => $sidekick) {
+        foreach ($this->conn_side[$sessionid] as $sideid => $sidekick) {
             // TODO: is this late-dispatch working correctly?
             $this->dispatch_sidekick($sidekick['handle'], $sidekick['type'], $sessionid, $sidekick['customdata']);
             unset($this->conn_side[$sessionid][$sideid]);
@@ -337,14 +322,14 @@ EOD;
         return true;
     }
 
-    function dispatch_sidekick($handle, $type, $sessionid, $customdata) {
+    public function dispatch_sidekick($handle, $type, $sessionid, $customdata) {
         global $CFG, $DB;
 
         switch($type) {
             case CHAT_SIDEKICK_BEEP:
 
-                // Incoming beep
-                $msg = New stdClass;
+                // Incoming beep.
+                $msg = new stdClass;
                 $msg->chatid    = $this->sets_info[$sessionid]['chatid'];
                 $msg->userid    = $this->sets_info[$sessionid]['userid'];
                 $msg->groupid   = $this->sets_info[$sessionid]['groupid'];
@@ -352,14 +337,14 @@ EOD;
                 $msg->message   = 'beep '.$customdata['beep'];
                 $msg->timestamp = time();
 
-                // Commit to DB
+                // Commit to DB.
                 chat_send_chatmessage($this->sets_info[$sessionid]['chatuser'], $msg->message, false,
                     $this->sets_info[$sessionid]['cm']);
 
-                // OK, now push it out to all users
+                // OK, now push it out to all users.
                 $this->message_broadcast($msg, $this->sets_info[$sessionid]['user']);
 
-                // Update that user's lastmessageping
+                // Update that user's lastmessageping.
                 $this->sets_info[$sessionid]['chatuser']->lastping        = $msg->timestamp;
                 $this->sets_info[$sessionid]['chatuser']->lastmessageping = $msg->timestamp;
                 $this->user_lazy_update($sessionid);
@@ -378,13 +363,13 @@ EOD;
                 $header .= "Expires: Wed, 4 Oct 1978 09:32:45 GMT\n";
                 $header .= "\n";
 
-                // That's enough headers for one lousy dummy response
+                // That's enough headers for one lousy dummy response.
                 $this->write_data($handle, $header);
-                // All done
+                // All done.
             break;
 
             case CHAT_SIDEKICK_USERS:
-                // A request to paint a user window
+                // A request to paint a user window.
 
                 $content = $this->get_user_window($sessionid);
 
@@ -398,66 +383,66 @@ EOD;
                 $header .= "Expires: Wed, 4 Oct 1978 09:32:45 GMT\n";
                 $header .= "Content-Length: ".strlen($content)."\n";
 
-                // The refresh value is 2 seconds higher than the configuration variable because we are doing JS refreshes all the time.
+                // The refresh value is 2 seconds higher than the configuration variable.
+                // This is because we are doing JS refreshes all the time.
                 // However, if the JS doesn't work for some reason, we still want to refresh once in a while.
-                $header .= "Refresh: ".(intval($CFG->chat_refresh_userlist) + 2)."; url=http://$CFG->chat_serverhost:$CFG->chat_serverport/?win=users&".
+                $header .= "Refresh: ".(intval($CFG->chat_refresh_userlist) + 2).
+                           "; url=http://$CFG->chat_serverhost:$CFG->chat_serverport/?win=users&".
                            "chat_sid=".$sessionid."\n";
                 $header .= "\n";
 
-                // That's enough headers for one lousy dummy response
+                // That's enough headers for one lousy dummy response.
                 $this->trace('writing users http response to handle '.$handle);
                 $this->write_data($handle, $header . $content);
 
-                // Update that user's lastping
+                // Update that user's lastping.
                 $this->sets_info[$sessionid]['chatuser']->lastping = time();
                 $this->user_lazy_update($sessionid);
 
             break;
 
             case CHAT_SIDEKICK_MESSAGE:
-                // Incoming message
+                // Incoming message.
 
-                // Browser stupidity protection from duplicate messages:
+                // Browser stupidity protection from duplicate messages.
                 $messageindex = intval($customdata['index']);
 
-                if($this->sets_info[$sessionid]['lastmessageindex'] >= $messageindex) {
+                if ($this->sets_info[$sessionid]['lastmessageindex'] >= $messageindex) {
                     // We have already broadcasted that!
-                    // $this->trace('discarding message with stale index');
                     break;
-                }
-                else {
-                    // Update our info
+                } else {
+                    // Update our info.
                     $this->sets_info[$sessionid]['lastmessageindex'] = $messageindex;
                 }
 
-                $msg = New stdClass;
+                $msg = new stdClass;
                 $msg->chatid    = $this->sets_info[$sessionid]['chatid'];
                 $msg->userid    = $this->sets_info[$sessionid]['userid'];
                 $msg->groupid   = $this->sets_info[$sessionid]['groupid'];
                 $msg->system    = 0;
-                $msg->message   = urldecode($customdata['message']); // have to undo the browser's encoding
+                $msg->message   = urldecode($customdata['message']); // Have to undo the browser's encoding.
                 $msg->timestamp = time();
 
-                if(empty($msg->message)) {
-                    // Someone just hit ENTER, send them on their way
+                if (empty($msg->message)) {
+                    // Someone just hit ENTER, send them on their way.
                     break;
                 }
 
-                // A slight hack to prevent malformed SQL inserts
+                // A slight hack to prevent malformed SQL inserts.
                 $origmsg = $msg->message;
                 $msg->message = $msg->message;
 
-                // Commit to DB
+                // Commit to DB.
                 chat_send_chatmessage($this->sets_info[$sessionid]['chatuser'], $msg->message, false,
                     $this->sets_info[$sessionid]['cm']);
 
-                // Undo the hack
+                // Undo the hack.
                 $msg->message = $origmsg;
 
-                // OK, now push it out to all users
+                // OK, now push it out to all users.
                 $this->message_broadcast($msg, $this->sets_info[$sessionid]['user']);
 
-                // Update that user's lastmessageping
+                // Update that user's lastmessageping.
                 $this->sets_info[$sessionid]['chatuser']->lastping        = $msg->timestamp;
                 $this->sets_info[$sessionid]['chatuser']->lastmessageping = $msg->timestamp;
                 $this->user_lazy_update($sessionid);
@@ -476,10 +461,10 @@ EOD;
                 $header .= "Expires: Wed, 4 Oct 1978 09:32:45 GMT\n";
                 $header .= "\n";
 
-                // That's enough headers for one lousy dummy response
+                // That's enough headers for one lousy dummy response.
                 $this->write_data($handle, $header);
 
-                // All done
+                // All done.
             break;
         }
 
@@ -487,31 +472,31 @@ EOD;
         socket_close($handle);
     }
 
-    function promote_final($sessionid, $customdata) {
+    public function promote_final($sessionid, $customdata) {
         global $DB;
 
-        if(isset($this->conn_sets[$sessionid])) {
+        if (isset($this->conn_sets[$sessionid])) {
             $this->trace('Set cannot be finalized: Session '.$sessionid.' is already active');
             return false;
         }
 
-        $chatuser = $DB->get_record('chat_users', array('sid'=>$sessionid));
-        if($chatuser === false) {
+        $chatuser = $DB->get_record('chat_users', array('sid' => $sessionid));
+        if ($chatuser === false) {
             $this->dismiss_half($sessionid);
             return false;
         }
-        $chat = $DB->get_record('chat', array('id'=>$chatuser->chatid));
-        if($chat === false) {
+        $chat = $DB->get_record('chat', array('id' => $chatuser->chatid));
+        if ($chat === false) {
             $this->dismiss_half($sessionid);
             return false;
         }
-        $user = $DB->get_record('user', array('id'=>$chatuser->userid));
-        if($user === false) {
+        $user = $DB->get_record('user', array('id' => $chatuser->userid));
+        if ($user === false) {
             $this->dismiss_half($sessionid);
             return false;
         }
-        $course = $DB->get_record('course', array('id'=>$chat->course));
-        if($course === false) {
+        $course = $DB->get_record('course', array('id' => $chat->course));
+        if ($course === false) {
             $this->dismiss_half($sessionid);
             return false;
         }
@@ -520,7 +505,7 @@ EOD;
             return false;
         }
 
-        global $CHAT_HTMLHEAD_JS, $CFG;
+        global $CHAT_HTMLHEAD_JS;
 
         $this->conn_sets[$sessionid] = $this->conn_half[$sessionid];
 
@@ -541,17 +526,14 @@ EOD;
             'quirks'    => $customdata['quirks']
         );
 
-        // If we know nothing about this chatroom, initialize it and add the user
-        if(!isset($this->chatrooms[$chat->id]['users'])) {
+        // If we know nothing about this chatroom, initialize it and add the user.
+        if (!isset($this->chatrooms[$chat->id]['users'])) {
             $this->chatrooms[$chat->id]['users'] = array($sessionid => $user->id);
-        }
-        else {
-            // Otherwise just add the user
+        } else {
+            // Otherwise just add the user.
             $this->chatrooms[$chat->id]['users'][$sessionid] = $user->id;
         }
 
-        // $this->trace('QUIRKS value for this connection is '.$customdata['quirks']);
-
         $header  = "HTTP/1.1 200 OK\n";
         $header .= "Connection: close\n";
         $header .= "Date: ".date('r')."\n";
@@ -564,9 +546,16 @@ EOD;
 
         $this->dismiss_half($sessionid, false);
         $this->write_data($this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL], $header . $CHAT_HTMLHEAD_JS);
-        $this->trace('Connection accepted: '.$this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL].', SID: '.$sessionid.' UID: '.$chatuser->userid.' GID: '.$chatuser->groupid, E_USER_WARNING);
+        $this->trace('Connection accepted: '
+                     .$this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL]
+                     .', SID: '
+                     .$sessionid
+                     .' UID: '
+                     .$chatuser->userid
+                     .' GID: '
+                     .$chatuser->groupid, E_USER_WARNING);
 
-        // Finally, broadcast the "entered the chat" message
+        // Finally, broadcast the "entered the chat" message.
 
         $msg = new stdClass;
         $msg->chatid = $chatuser->chatid;
@@ -582,54 +571,52 @@ EOD;
         return true;
     }
 
-    function promote_ufo($handle, $type, $sessionid, $customdata) {
-        if(empty($this->conn_ufo)) {
+    public function promote_ufo($handle, $type, $sessionid, $customdata) {
+        if (empty($this->conn_ufo)) {
             return false;
         }
-        foreach($this->conn_ufo as $id => $ufo) {
-            if($ufo->handle == $handle) {
+        foreach ($this->conn_ufo as $id => $ufo) {
+            if ($ufo->handle == $handle) {
                 // OK, got the id of the UFO, but what is it?
 
-                if($type & CHAT_SIDEKICK) {
+                if ($type & CHAT_SIDEKICK) {
                     // Is the main connection ready?
-                    if(isset($this->conn_sets[$sessionid])) {
-                        // Yes, so dispatch this sidekick now and be done with it
-                        //$this->trace('Dispatching sidekick immediately');
+                    if (isset($this->conn_sets[$sessionid])) {
+                        // Yes, so dispatch this sidekick now and be done with it.
                         $this->dispatch_sidekick($handle, $type, $sessionid, $customdata);
                         $this->dismiss_ufo($handle, false);
-                    }
-                    else {
-                        // No, so put it in the waiting list
+                    } else {
+                        // No, so put it in the waiting list.
                         $this->trace('sidekick waiting');
                         $this->conn_side[$sessionid][] = array('type' => $type, 'handle' => $handle, 'customdata' => $customdata);
                     }
                     return true;
                 }
 
-                // If it's not a sidekick, at this point it can only be da man
+                // If it's not a sidekick, at this point it can only be da man.
 
-                if($type & CHAT_CONNECTION) {
-                    // This forces a new connection right now...
+                if ($type & CHAT_CONNECTION) {
+                    // This forces a new connection right now.
                     $this->trace('Incoming connection from '.$ufo->ip.':'.$ufo->port);
 
                     // Do we have such a connection active?
-                    if(isset($this->conn_sets[$sessionid])) {
-                        // Yes, so regrettably we cannot promote you
+                    if (isset($this->conn_sets[$sessionid])) {
+                        // Yes, so regrettably we cannot promote you.
                         $this->trace('Connection rejected: session '.$sessionid.' is already final');
                         $this->dismiss_ufo($handle, true, 'Your SID was rejected.');
                         return false;
                     }
 
-                    // Join this with what we may have already
+                    // Join this with what we may have already.
                     $this->conn_half[$sessionid][$type] = $handle;
 
-                    // Do the bookkeeping
+                    // Do the bookkeeping.
                     $this->promote_final($sessionid, $customdata);
 
-                    // It's not an UFO anymore
+                    // It's not a UFO anymore.
                     $this->dismiss_ufo($handle, false);
 
-                    // Dispatch waiting sidekicks
+                    // Dispatch waiting sidekicks.
                     $this->process_sidekicks($sessionid);
 
                     return true;
@@ -639,12 +626,12 @@ EOD;
         return false;
     }
 
-    function dismiss_half($sessionid, $disconnect = true) {
-        if(!isset($this->conn_half[$sessionid])) {
+    public function dismiss_half($sessionid, $disconnect = true) {
+        if (!isset($this->conn_half[$sessionid])) {
             return false;
         }
-        if($disconnect) {
-            foreach($this->conn_half[$sessionid] as $handle) {
+        if ($disconnect) {
+            foreach ($this->conn_half[$sessionid] as $handle) {
                 @socket_shutdown($handle);
                 @socket_close($handle);
             }
@@ -653,10 +640,10 @@ EOD;
         return true;
     }
 
-    function dismiss_set($sessionid) {
-        if(!empty($this->conn_sets[$sessionid])) {
-            foreach($this->conn_sets[$sessionid] as $handle) {
-                // Since we want to dismiss this, don't generate any errors if it's dead already
+    public function dismiss_set($sessionid) {
+        if (!empty($this->conn_sets[$sessionid])) {
+            foreach ($this->conn_sets[$sessionid] as $handle) {
+                // Since we want to dismiss this, don't generate any errors if it's dead already.
                 @socket_shutdown($handle);
                 @socket_close($handle);
             }
@@ -670,16 +657,15 @@ EOD;
         return true;
     }
 
-
-    function dismiss_ufo($handle, $disconnect = true, $message = NULL) {
-        if(empty($this->conn_ufo)) {
+    public function dismiss_ufo($handle, $disconnect = true, $message = null) {
+        if (empty($this->conn_ufo)) {
             return false;
         }
-        foreach($this->conn_ufo as $id => $ufo) {
-            if($ufo->handle == $handle) {
+        foreach ($this->conn_ufo as $id => $ufo) {
+            if ($ufo->handle == $handle) {
                 unset($this->conn_ufo[$id]);
-                if($disconnect) {
-                    if(!empty($message)) {
+                if ($disconnect) {
+                    if (!empty($message)) {
                         $this->write_data($handle, $message."\n\n");
                     }
                     socket_shutdown($handle);
@@ -691,36 +677,34 @@ EOD;
         return false;
     }
 
-    function conn_accept() {
-        $read_socket = array($this->listen_socket);
+    public function conn_accept() {
+        $readsocket = array($this->listen_socket);
         $write = null;
         $except = null;
-        $changed = socket_select($read_socket, $write, $except, 0, 0);
+        $changed = socket_select($readsocket, $write, $except, 0, 0);
 
-        if(!$changed) {
+        if (!$changed) {
             return false;
         }
         $handle = socket_accept($this->listen_socket);
-        if(!$handle) {
+        if (!$handle) {
             return false;
         }
 
-        $newconn = New ChatConnection($handle);
+        $newconn = new ChatConnection($handle);
         $id = $this->new_ufo_id();
         $this->conn_ufo[$id] = $newconn;
-
-        //$this->trace('UFO #'.$id.': connection from '.$newconn->ip.' on port '.$newconn->port.', '.$newconn->handle);
     }
 
-    function conn_activity_ufo (&$handles) {
+    public function conn_activity_ufo(&$handles) {
         $monitor = array();
-        if(!empty($this->conn_ufo)) {
-            foreach($this->conn_ufo as $ufoid => $ufo) {
+        if (!empty($this->conn_ufo)) {
+            foreach ($this->conn_ufo as $ufoid => $ufo) {
                 $monitor[$ufoid] = $ufo->handle;
             }
         }
 
-        if(empty($monitor)) {
+        if (empty($monitor)) {
             $handles = array();
             return 0;
         }
@@ -733,52 +717,51 @@ EOD;
         return $retval;
     }
 
-    function message_broadcast($message, $sender) {
+    public function message_broadcast($message, $sender) {
 
-        if(empty($this->conn_sets)) {
+        if (empty($this->conn_sets)) {
             return true;
         }
 
         $now = time();
 
-        // First of all, mark this chatroom as having had activity now
+        // First of all, mark this chatroom as having had activity now.
         $this->chatrooms[$message->chatid]['lastactivity'] = $now;
 
-        foreach($this->sets_info as $sessionid => $info) {
-            // We need to get handles from users that are in the same chatroom, same group
-            if($info['chatid'] == $message->chatid &&
-              ($info['groupid'] == $message->groupid || $message->groupid == 0))
-            {
+        foreach ($this->sets_info as $sessionid => $info) {
+            // We need to get handles from users that are in the same chatroom, same group.
+            if ($info['chatid'] == $message->chatid &&
+              ($info['groupid'] == $message->groupid || $message->groupid == 0)) {
 
-                // Simply give them the message
+                // Simply give them the message.
                 $output = chat_format_message_manually($message, $info['courseid'], $sender, $info['user']);
                 $this->trace('Delivering message "'.$output->text.'" to '.$this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL]);
 
-                if($output->beep) {
-                    $this->write_data($this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL], '<embed src="'.$this->_beepsoundsrc.'" autostart="true" hidden="true" />');
+                if ($output->beep) {
+                    $this->write_data($this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL],
+                                      '<embed src="'.$this->_beepsoundsrc.'" autostart="true" hidden="true" />');
                 }
 
-                if($info['quirks'] & QUIRK_CHUNK_UPDATE) {
+                if ($info['quirks'] & QUIRK_CHUNK_UPDATE) {
                     $output->html .= $GLOBALS['CHAT_DUMMY_DATA'];
                     $output->html .= $GLOBALS['CHAT_DUMMY_DATA'];
                     $output->html .= $GLOBALS['CHAT_DUMMY_DATA'];
                 }
 
-                if(!$this->write_data($this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL], $output->html)) {
+                if (!$this->write_data($this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL], $output->html)) {
                     $this->disconnect_session($sessionid);
                 }
-                //$this->trace('Sent to UID '.$this->sets_info[$sessionid]['userid'].': '.$message->text_);
             }
         }
     }
 
-    function disconnect_session($sessionid) {
+    public function disconnect_session($sessionid) {
         global $DB;
 
         $info = $this->sets_info[$sessionid];
 
-        $DB->delete_records('chat_users', array('sid'=>$sessionid));
-        $msg = New stdClass;
+        $DB->delete_records('chat_users', array('sid' => $sessionid));
+        $msg = new stdClass;
         $msg->chatid = $info['chatid'];
         $msg->userid = $info['userid'];
         $msg->groupid = $info['groupid'];
@@ -789,88 +772,80 @@ EOD;
         $this->trace('User has disconnected, destroying uid '.$info['userid'].' with SID '.$sessionid, E_USER_WARNING);
         chat_send_chatmessage($info['chatuser'], $msg->message, true);
 
-        // *************************** IMPORTANT
-        //
-        // Kill him BEFORE broadcasting, otherwise we 'll get infinite recursion!
-        //
-        // **********************************************************************
+        // IMPORTANT, kill him BEFORE broadcasting, otherwise we 'll get infinite recursion!
         $latesender = $info['user'];
         $this->dismiss_set($sessionid);
         $this->message_broadcast($msg, $latesender);
     }
 
-    function fatal($message) {
+    public function fatal($message) {
         $message .= "\n";
-        if($this->_logfile) {
+        if ($this->_logfile) {
             $this->trace($message, E_USER_ERROR);
         }
         echo "FATAL ERROR:: $message\n";
         die();
     }
 
-    function init_sockets() {
+    public function init_sockets() {
         global $CFG;
 
         $this->trace('Setting up sockets');
 
-        if(false === ($this->listen_socket = socket_create(AF_INET, SOCK_STREAM, 0))) {
-            // Failed to create socket
+        if (false === ($this->listen_socket = socket_create(AF_INET, SOCK_STREAM, 0))) {
+            // Failed to create socket.
             $lasterr = socket_last_error();
             $this->fatal('socket_create() failed: '. socket_strerror($lasterr).' ['.$lasterr.']');
         }
 
-        //socket_close($DAEMON->listen_socket);
-        //die();
-
-        if(!socket_bind($this->listen_socket, $CFG->chat_serverip, $CFG->chat_serverport)) {
-            // Failed to bind socket
+        if (!socket_bind($this->listen_socket, $CFG->chat_serverip, $CFG->chat_serverport)) {
+            // Failed to bind socket.
             $lasterr = socket_last_error();
             $this->fatal('socket_bind() failed: '. socket_strerror($lasterr).' ['.$lasterr.']');
         }
 
-        if(!socket_listen($this->listen_socket, $CFG->chat_servermax)) {
-            // Failed to get socket to listen
+        if (!socket_listen($this->listen_socket, $CFG->chat_servermax)) {
+            // Failed to get socket to listen.
             $lasterr = socket_last_error();
             $this->fatal('socket_listen() failed: '. socket_strerror($lasterr).' ['.$lasterr.']');
         }
 
-        // Socket has been initialized and is ready
+        // Socket has been initialized and is ready.
         $this->trace('Socket opened on port '.$CFG->chat_serverport);
 
-        // [pj]: I really must have a good read on sockets. What exactly does this do?
-        // http://www.unixguide.net/network/socketfaq/4.5.shtml is still not enlightening enough for me.
+        // What exactly does this do? http://www.unixguide.net/network/socketfaq/4.5.shtml is still not enlightening enough for me.
         socket_set_option($this->listen_socket, SOL_SOCKET, SO_REUSEADDR, 1);
         socket_set_nonblock($this->listen_socket);
     }
 
-    function cli_switch($switch, $param = NULL) {
-        switch($switch) { //LOL
+    public function cli_switch($switch, $param = null) {
+        switch($switch) { // LOL!
             case 'reset':
-                // Reset sockets
+                // Reset sockets.
                 $this->_resetsocket = true;
                 return false;
             case 'start':
-                // Start the daemon
+                // Start the daemon.
                 $this->_readytogo = true;
                 return false;
             break;
             case 'v':
-                // Verbose mode
+                // Verbose mode.
                 $this->_trace_level = E_ALL;
                 return false;
             break;
             case 'l':
-                // Use logfile
-                if(!empty($param)) {
+                // Use logfile.
+                if (!empty($param)) {
                     $this->_logfile_name = $param;
                 }
                 $this->_logfile = @fopen($this->_logfile_name, 'a+');
-                if($this->_logfile == false) {
+                if ($this->_logfile == false) {
                     $this->fatal('Failed to open '.$this->_logfile_name.' for writing');
                 }
                 return false;
             default:
-                // Unrecognized
+                // Unrecognized.
                 $this->fatal('Unrecognized command line switch: '.$switch);
             break;
         }
@@ -879,54 +854,52 @@ EOD;
 
 }
 
-$DAEMON = New ChatDaemon;
-set_error_handler(array($DAEMON, 'error_handler'));
+$daemon = new ChatDaemon;
+set_error_handler(array($daemon, 'error_handler'));
 
-/// Check the parameters //////////////////////////////////////////////////////
+// Check the parameters.
 
 unset($argv[0]);
 $commandline = implode(' ', $argv);
-if(strpos($commandline, '-') === false) {
-    if(!empty($commandline)) {
-        // We cannot have received any meaningful parameters
-        $DAEMON->fatal('Garbage in command line');
+if (strpos($commandline, '-') === false) {
+    if (!empty($commandline)) {
+        // We cannot have received any meaningful parameters.
+        $daemon->fatal('Garbage in command line');
     }
-}
-else {
-    // Parse command line
+} else {
+    // Parse command line.
     $switches = preg_split('/(-{1,2}[a-zA-Z]+) */', $commandline, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
 
-    // Taking advantage of the fact that $switches is indexed with incrementing numeric keys
-    // We will be using that to pass additional information to those switches who need it
+    // Taking advantage of the fact that $switches is indexed with incrementing numeric keys.
+    // We will be using that to pass additional information to those switches who need it.
     $numswitches = count($switches);
 
-    // Fancy way to give a "hyphen" boolean flag to each "switch"
+    // Fancy way to give a "hyphen" boolean flag to each "switch".
     $switches = array_map(create_function('$x', 'return array("str" => $x, "hyphen" => (substr($x, 0, 1) == "-"));'), $switches);
 
-    for($i = 0; $i < $numswitches; ++$i) {
+    for ($i = 0; $i < $numswitches; ++$i) {
 
         $switch = $switches[$i]['str'];
-        $params = ($i == $numswitches - 1 ? NULL :
-                                            ($switches[$i + 1]['hyphen'] ? NULL : trim($switches[$i + 1]['str']))
+        $params = ($i == $numswitches - 1 ? null :
+                                            ($switches[$i + 1]['hyphen'] ? null : trim($switches[$i + 1]['str']))
                   );
 
-        if(substr($switch, 0, 2) == '--') {
-            // Double-hyphen switch
-            $DAEMON->cli_switch(strtolower(substr($switch, 2)), $params);
-        }
-        else if(substr($switch, 0, 1) == '-') {
-            // Single-hyphen switch(es), may be more than one run together
-            $switch = substr($switch, 1); // Get rid of the -
+        if (substr($switch, 0, 2) == '--') {
+            // Double-hyphen switch.
+            $daemon->cli_switch(strtolower(substr($switch, 2)), $params);
+        } else if (substr($switch, 0, 1) == '-') {
+            // Single-hyphen switch(es), may be more than one run together.
+            $switch = substr($switch, 1); // Get rid of the "-".
             $len = strlen($switch);
-            for($j = 0; $j < $len; ++$j) {
-                $DAEMON->cli_switch(strtolower(substr($switch, $j, 1)), $params);
+            for ($j = 0; $j < $len; ++$j) {
+                $daemon->cli_switch(strtolower(substr($switch, $j, 1)), $params);
             }
         }
     }
 }
 
-if(!$DAEMON->query_start()) {
-    // For some reason we didn't start, so print out some info
+if (!$daemon->query_start()) {
+    // For some reason we didn't start, so print out some info.
     echo 'Starts the Moodle chat socket server on port '.$CFG->chat_serverport;
     echo "\n\n";
     echo "Usage: chatd.php [parameters]\n\n";
@@ -945,92 +918,42 @@ if (!function_exists('socket_set_option')) {
     die();
 }
 
-$DAEMON->init_sockets();
-
-/*
-declare(ticks=1);
-
-$pid = pcntl_fork();
-if ($pid == -1) {
-     die("could not fork");
-} else if ($pid) {
-     exit(); // we are the parent
-} else {
-     // we are the child
-}
-
-// detatch from the controlling terminal
-if (!posix_setsid()) {
-   die("could not detach from terminal");
-}
-
-// setup signal handlers
-pcntl_signal(SIGTERM, "sig_handler");
-pcntl_signal(SIGHUP, "sig_handler");
+$daemon->init_sockets();
 
-if($DAEMON->_pcntl_exists && false) {
-    $DAEMON->trace('Unholy spirit possession: daemonizing');
-    $DAEMON->pid = pcntl_fork();
-    if($pid == -1) {
-        $DAEMON->trace('Process fork failed, terminating');
-        die();
-    }
-    else if($pid) {
-        // We are the parent
-        $DAEMON->trace('Successfully forked the daemon with PID '.$pid);
-        die();
-    }
-    else {
-        // We are the daemon! :P
-    }
+$daemon->trace('Started Moodle chatd on port '.$CFG->chat_serverport.', listening socket '.$daemon->listen_socket, E_USER_WARNING);
 
-    // FROM NOW ON, IT'S THE DAEMON THAT'S RUNNING!
+// Clear the decks of old stuff.
+$DB->delete_records('chat_users', array('version' => 'sockets'));
 
-    // Detach from controlling terminal
-    if(!posix_setsid()) {
-        $DAEMON->trace('Could not detach daemon process from terminal!');
-    }
-}
-else {
-    // Cannot go demonic
-    $DAEMON->trace('Unholy spirit possession failed: PHP is not compiled with --enable-pcntl');
-}
-*/
-
-$DAEMON->trace('Started Moodle chatd on port '.$CFG->chat_serverport.', listening socket '.$DAEMON->listen_socket, E_USER_WARNING);
-
-/// Clear the decks of old stuff
-$DB->delete_records('chat_users', array('version'=>'sockets'));
-
-while(true) {
+while (true) {
     $active = array();
 
-    // First of all, let's see if any of our UFOs has identified itself
-    if($DAEMON->conn_activity_ufo($active)) {
-        foreach($active as $handle) {
-            $read_socket = array($handle);
+    // First of all, let's see if any of our UFOs have identified itself.
+    if ($daemon->conn_activity_ufo($active)) {
+        foreach ($active as $handle) {
+            $readsocket = array($handle);
             $write = null;
             $except = null;
-            $changed = socket_select($read_socket, $write, $except, 0, 0);
+            $changed = socket_select($readsocket, $write, $except, 0, 0);
 
-            if($changed > 0) {
-                // Let's see what it has to say
+            if ($changed > 0) {
+                // Let's see what it has to say.
 
-                $data = socket_read($handle, 2048); // should be more than 512 to prevent empty pages and repeated messages!!
-                if(empty($data)) {
+                $data = socket_read($handle, 2048); // Should be more than 512 to prevent empty pages and repeated messages!
+                if (empty($data)) {
                     continue;
                 }
 
-                if (strlen($data) == 2048) { // socket_read has more data, ignore all data
-                    $DAEMON->trace('UFO with '.$handle.': Data too long; connection closed', E_USER_WARNING);
-                    $DAEMON->dismiss_ufo($handle, true, 'Data too long; connection closed');
+                if (strlen($data) == 2048) { // If socket_read has more data, ignore all data.
+                    $daemon->trace('UFO with '.$handle.': Data too long; connection closed', E_USER_WARNING);
+                    $daemon->dismiss_ufo($handle, true, 'Data too long; connection closed');
                     continue;
                 }
 
-                if(!preg_match('/win=(chat|users|message|beep).*&chat_sid=([a-zA-Z0-9]*) HTTP/', $data, $info)) {
-                    // Malformed data
-                    $DAEMON->trace('UFO with '.$handle.': Request with malformed data; connection closed', E_USER_WARNING);
-                    $DAEMON->dismiss_ufo($handle, true, 'Request with malformed data; connection closed');
+                if (!preg_match('/win=(chat|users|message|beep).*&chat_sid=([a-zA-Z0-9]*) HTTP/', $data, $info)) {
+                    // Malformed data.
+                    $daemon->trace('UFO with '.$handle.': Request with malformed data; connection closed', E_USER_WARNING);
+                    $daemon->dismiss_ufo($handle, true, 'Request with malformed data; connection closed');
                     continue;
                 }
 
@@ -1041,10 +964,10 @@ while(true) {
 
                 switch($type) {
                     case 'chat':
-                       $type = CHAT_CONNECTION_CHANNEL;
+                        $type = CHAT_CONNECTION_CHANNEL;
                         $customdata['quirks'] = 0;
-                        if(strpos($data, 'Safari')) {
-                            $DAEMON->trace('Safari identified...', E_USER_WARNING);
+                        if (strpos($data, 'Safari')) {
+                            $daemon->trace('Safari identified...', E_USER_WARNING);
                             $customdata['quirks'] += QUIRK_CHUNK_UPDATE;
                         }
                     break;
@@ -1053,35 +976,33 @@ while(true) {
                     break;
                     case 'beep':
                         $type = CHAT_SIDEKICK_BEEP;
-                        if(!preg_match('/beep=([^&]*)[& ]/', $data, $info)) {
-                            $DAEMON->trace('Beep sidekick did not contain a valid userid', E_USER_WARNING);
-                            $DAEMON->dismiss_ufo($handle, true, 'Request with malformed data; connection closed');
+                        if (!preg_match('/beep=([^&]*)[& ]/', $data, $info)) {
+                            $daemon->trace('Beep sidekick did not contain a valid userid', E_USER_WARNING);
+                            $daemon->dismiss_ufo($handle, true, 'Request with malformed data; connection closed');
                             continue;
-                        }
-                        else {
+                        } else {
                             $customdata = array('beep' => intval($info[1]));
                         }
                     break;
                     case 'message':
                         $type = CHAT_SIDEKICK_MESSAGE;
-                        if(!preg_match('/chat_message=([^&]*)[& ]chat_msgidnr=([^&]*)[& ]/', $data, $info)) {
-                            $DAEMON->trace('Message sidekick did not contain a valid message', E_USER_WARNING);
-                            $DAEMON->dismiss_ufo($handle, true, 'Request with malformed data; connection closed');
+                        if (!preg_match('/chat_message=([^&]*)[& ]chat_msgidnr=([^&]*)[& ]/', $data, $info)) {
+                            $daemon->trace('Message sidekick did not contain a valid message', E_USER_WARNING);
+                            $daemon->dismiss_ufo($handle, true, 'Request with malformed data; connection closed');
                             continue;
-                        }
-                        else {
+                        } else {
                             $customdata = array('message' => $info[1], 'index' => $info[2]);
                         }
                     break;
                     default:
-                        $DAEMON->trace('UFO with '.$handle.': Request with unknown type; connection closed', E_USER_WARNING);
-                        $DAEMON->dismiss_ufo($handle, true, 'Request with unknown type; connection closed');
+                        $daemon->trace('UFO with '.$handle.': Request with unknown type; connection closed', E_USER_WARNING);
+                        $daemon->dismiss_ufo($handle, true, 'Request with unknown type; connection closed');
                         continue;
                     break;
                 }
 
-                // OK, now we know it's something good... promote it and pass it all the data it needs
-                $DAEMON->promote_ufo($handle, $type, $sessionid, $customdata);
+                // OK, now we know it's something good. Promote it and pass it all the data it needs.
+                $daemon->promote_ufo($handle, $type, $sessionid, $customdata);
                 continue;
             }
         }
@@ -1089,18 +1010,17 @@ while(true) {
 
     $now = time();
 
-    // Clean up chatrooms with no activity as required
-    if($now - $DAEMON->_last_idle_poll >= $DAEMON->_freq_poll_idle_chat) {
-        $DAEMON->poll_idle_chats($now);
+    // Clean up chatrooms with no activity as required.
+    if ($now - $daemon->_last_idle_poll >= $daemon->_freq_poll_idle_chat) {
+        $daemon->poll_idle_chats($now);
     }
 
-    // Finally, accept new connections
-    $DAEMON->conn_accept();
+    // Finally, accept new connections.
+    $daemon->conn_accept();
 
-    usleep($DAEMON->_time_rest_socket);
+    usleep($daemon->_time_rest_socket);
 }
 
-@socket_shutdown($DAEMON->listen_socket, 0);
+@socket_shutdown($daemon->listen_socket, 0);
 die("\n\n-- terminated --\n");
 
-
index 90e4e01..89af1a6 100644 (file)
@@ -85,7 +85,7 @@ $capabilities = array(
             'teacher' => CAP_ALLOW,
             'editingteacher' => CAP_ALLOW,
             'manager' => CAP_ALLOW,
-            // not student - nervous about allowing this by default
+            // Not student - nervous about allowing this by default.
         ),
 
     ),
index 275f5f7..5cde13b 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
@@ -27,9 +26,9 @@
 defined('MOODLE_INTERNAL') || die();
 
 $logs = array(
-    array('module'=>'chat', 'action'=>'view', 'mtable'=>'chat', 'field'=>'name'),
-    array('module'=>'chat', 'action'=>'add', 'mtable'=>'chat', 'field'=>'name'),
-    array('module'=>'chat', 'action'=>'update', 'mtable'=>'chat', 'field'=>'name'),
-    array('module'=>'chat', 'action'=>'report', 'mtable'=>'chat', 'field'=>'name'),
-    array('module'=>'chat', 'action'=>'talk', 'mtable'=>'chat', 'field'=>'name'),
-);
\ No newline at end of file
+    array('module' => 'chat', 'action' => 'view', 'mtable' => 'chat', 'field' => 'name'),
+    array('module' => 'chat', 'action' => 'add', 'mtable' => 'chat', 'field' => 'name'),
+    array('module' => 'chat', 'action' => 'update', 'mtable' => 'chat', 'field' => 'name'),
+    array('module' => 'chat', 'action' => 'report', 'mtable' => 'chat', 'field' => 'name'),
+    array('module' => 'chat', 'action' => 'talk', 'mtable' => 'chat', 'field' => 'name'),
+);
index fde34d6..f336743 100644 (file)
@@ -1,46 +1,44 @@
 <?php
-
-// This file keeps track of upgrades to
-// the chat module
-//
-// Sometimes, changes between versions involve
-// alterations to database structures and other
-// major things that may break installations.
-//
-// The upgrade function in this file will attempt
-// to perform all the necessary actions to upgrade
-// your older installation to the current version.
+// This file is part of Moodle - http://moodle.org/
 //
-// If there's something it cannot do itself, it
-// will tell you what you need to do.
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
 //
-// The commands in here will all be database-neutral,
-// using the methods of database_manager class
+// Moodle 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 General Public License for more details.
 //
-// Please do not forget to use upgrade_set_timeout()
-// before any action that may take longer time to finish.
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Upgrade code for the chat activity
+ *
+ * @package   mod_chat
+ * @copyright 2006 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
 
 function xmldb_chat_upgrade($oldversion) {
     global $CFG, $DB;
 
     $dbman = $DB->get_manager();
 
+    // Moodle v2.2.0 release upgrade line.
+    // Put any upgrade step following this.
 
-    // Moodle v2.2.0 release upgrade line
-    // Put any upgrade step following this
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
+    // Moodle v2.3.0 release upgrade line.
+    // Put any upgrade step following this.
 
+    // Moodle v2.4.0 release upgrade line.
+    // Put any upgrade step following this.
 
     // Moodle v2.5.0 release upgrade line.
     // Put any upgrade step following this.
 
-
     // Moodle v2.6.0 release upgrade line.
     // Put any upgrade step following this.
 
index ceee155..36b9d67 100644 (file)
@@ -1,29 +1,44 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
 require_once('../../../config.php');
 require_once('../lib.php');
 
 $id      = required_param('id', PARAM_INT);
-$groupid = optional_param('groupid', 0, PARAM_INT); //only for teachers
-$theme   = optional_param('theme', 'course_theme', PARAM_SAFEDIR); //course_theme to use the current theme.
+$groupid = optional_param('groupid', 0, PARAM_INT); // Only for teachers.
+$theme   = optional_param('theme', 'course_theme', PARAM_SAFEDIR); // The value course_theme == the current theme.
 
-$url = new moodle_url('/mod/chat/gui_ajax/index.php', array('id'=>$id));
+$url = new moodle_url('/mod/chat/gui_ajax/index.php', array('id' => $id));
 if ($groupid !== 0) {
     $url->param('groupid', $groupid);
 }
 $PAGE->set_url($url);
-$PAGE->set_popup_notification_allowed(false); // No popup notifications in the chat window
+$PAGE->set_popup_notification_allowed(false); // No popup notifications in the chat window.
 $PAGE->requires->strings_for_js(array('coursetheme', 'bubble', 'compact'), 'mod_chat');
 
-$chat = $DB->get_record('chat', array('id'=>$id), '*', MUST_EXIST);
-$course = $DB->get_record('course', array('id'=>$chat->course), '*', MUST_EXIST);
+$chat = $DB->get_record('chat', array('id' => $id), '*', MUST_EXIST);
+$course = $DB->get_record('course', array('id' => $chat->course), '*', MUST_EXIST);
 $cm = get_coursemodule_from_instance('chat', $chat->id, $course->id, false, MUST_EXIST);
 
 $context = context_module::instance($cm->id);
 require_login($course, false, $cm);
 require_capability('mod/chat:chat', $context);
 
-/// Check to see if groups are being used here
- if ($groupmode = groups_get_activity_groupmode($cm)) {   // Groups are being used
+// Check to see if groups are being used here.
+if ($groupmode = groups_get_activity_groupmode($cm)) {   // Groups are being used.
     if ($groupid = groups_get_activity_group($cm)) {
         if (!$group = groups_get_group($groupid)) {
             print_error('invalidgroupid');
@@ -37,42 +52,43 @@ require_capability('mod/chat:chat', $context);
     $groupname = '';
 }
 $showcoursetheme = in_array('bootstrapbase', $PAGE->theme->parents);
-if (!$showcoursetheme && $theme === 'course_theme') { //set compact as default for non bootstrapbase based themes
+if (!$showcoursetheme && $theme === 'course_theme') { // Set compact as default for non bootstrapbase based themes.
     $theme = 'compact';
 }
 
-// if requested theme doesn't exist, use default 'bubble' theme
+// If requested theme doesn't exist, use default 'bubble' theme.
 if ($theme != 'course_theme' and !file_exists(dirname(__FILE__) . '/theme/'.$theme.'/chat.css')) {
     $theme = 'compact';
 }
 
-// login chat room
-if (!$chat_sid = chat_login_user($chat->id, 'ajax', $groupid, $course)) {
+// Log into the chat room.
+if (!$chatsid = chat_login_user($chat->id, 'ajax', $groupid, $course)) {
     print_error('cantlogin', 'chat');
 }
 $courseshortname = format_string($course->shortname, true, array('context' => context_course::instance($course->id)));
 $module = array(
-    'name'      => 'mod_chat_ajax', // chat gui's are not real plugins, we have to break the naming standards for JS modules here :-(
+    'name'      => 'mod_chat_ajax', // Chat gui's are not real plugins, we have to break the naming standards for JS modules here.
     'fullpath'  => '/mod/chat/gui_ajax/module.js',
-    'requires'  => array('base', 'dom', 'event', 'event-mouseenter', 'event-key', 'json-parse', 'io', 'overlay', 'yui2-resize', 'yui2-layout', 'yui2-menu'),
+    'requires'  => array('base', 'dom', 'event', 'event-mouseenter', 'event-key', 'json-parse', 'io', 'overlay', 'yui2-resize',
+                         'yui2-layout', 'yui2-menu'),
     'strings'   => array(array('send', 'chat'), array('sending', 'chat'), array('inputarea', 'chat'), array('userlist', 'chat'),
                          array('modulename', 'chat'), array('beep', 'chat'), array('talk', 'chat'))
 );
 $modulecfg = array(
-    'home'=>$CFG->httpswwwroot.'/mod/chat/view.php?id='.$cm->id,
-    'chaturl'=>$CFG->httpswwwroot.'/mod/chat/gui_ajax/index.php?id='.$id,
-    'theme'=>$theme,
-    'showcoursetheme'=>$showcoursetheme?1:0,
-    'userid'=>$USER->id,
-    'sid'=>$chat_sid,
-    'timer'=>3000,
-    'chat_lasttime'=>0,
-    'chat_lastrow'=>null,
+    'home' => $CFG->httpswwwroot.'/mod/chat/view.php?id='.$cm->id,
+    'chaturl' => $CFG->httpswwwroot.'/mod/chat/gui_ajax/index.php?id='.$id,
+    'theme' => $theme,
+    'showcoursetheme' => $showcoursetheme ? 1 : 0,
+    'userid' => $USER->id,
+    'sid' => $chatsid,
+    'timer' => 3000,
+    'chat_lasttime' => 0,
+    'chat_lastrow' => null,
     'chatroom_name' => $courseshortname . ": " . format_string($chat->name, true) . $groupname
 );
 $PAGE->requires->js_init_call('M.mod_chat_ajax.init', array($modulecfg), false, $module);
 
-$PAGE->set_title(get_string('modulename', 'chat').": $courseshortname: ".format_string($chat->name,true)."$groupname");
+$PAGE->set_title(get_string('modulename', 'chat').": $courseshortname: ".format_string($chat->name, true)."$groupname");
 $PAGE->add_body_class('yui-skin-sam');
 $PAGE->set_pagelayout('embedded');
 if ( $theme != 'course_theme') {
@@ -87,7 +103,11 @@ echo $OUTPUT->box(html_writer::tag('h2',  get_string('messages', 'chat'), array(
         '<ul id="messages-list"></ul>', '', 'chat-messages');
 $table = new html_table();
 $table->data = array(
-    array('<label class="accesshide" for="input-message">' . get_string('entermessage', 'chat') . ' </label><input type="text" disabled="true" id="input-message" value="Loading..." /> <input type="button" id="button-send" value="'.get_string('send', 'chat').'" /> <a id="choosetheme" href="###">'.get_string('themes').' &raquo; </a>')
+    array('<label class="accesshide" for="input-message">'.get_string('entermessage', 'chat').' </label>'.
+          '<input type="text" disabled="true" id="input-message" value="Loading..." /> '.
+          '<input type="button" id="button-send" value="'.get_string('send', 'chat').'" /> <a id="choosetheme" href="###">'.
+          get_string('themes').
+          ' &raquo; </a>')
 );
 echo $OUTPUT->box(html_writer::tag('h2',  get_string('composemessage', 'chat'), array('class' => 'accesshide')) .
         html_writer::table($table), '', 'chat-input-area');
index fe87283..711c1ed 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * NOTE: the /mod/chat/gui_header_js/ is not a real plugin,
  * ideally this code should be in /mod/chat/module.js
@@ -20,14 +19,14 @@ M.mod_chat_ajax.init = function(Y, cfg) {
 
     var gui_ajax = {
 
-        // Properties
-        api : M.cfg.wwwroot+'/mod/chat/chat_ajax.php?sesskey='+M.cfg.sesskey,  // The path to the ajax callback script
-        cfg : {},                                       // A configuration variable
-        interval : null,                                // The interval object for refreshes
-        layout : null,                                  // A reference to the layout used in this module
-        messages : [],                                  // An array of messages
-        scrollable : true,                              // True is scrolling should occur
-        thememenu : null,                               // A reference to the menu for changing themes
+        // Properties.
+        api : M.cfg.wwwroot + '/mod/chat/chat_ajax.php?sesskey=' + M.cfg.sesskey,  // The path to the ajax callback script.
+        cfg : {},                                       // A configuration variable.
+        interval : null,                                // The interval object for refreshes.
+        layout : null,                                  // A reference to the layout used in this module.
+        messages : [],                                  // An array of messages.
+        scrollable : true,                              // True is scrolling should occur.
+        thememenu : null,                               // A reference to the menu for changing themes.
 
         // Elements
         messageinput : null,
@@ -59,19 +58,19 @@ M.mod_chat_ajax.init = function(Y, cfg) {
             }, this.layout);
             this.layout.render();
 
-            // Gather the general elements
+            // Gather the general elements.
             this.messageinput = Y.one('#input-message');
             this.sendbutton = Y.one('#button-send');
             this.messagebox = Y.one('#chat-messages');
 
-            // Set aria attributes to messagebox and chat-userlist
+            // Set aria attributes to messagebox and chat-userlist.
             this.messagebox.set('role', 'log');
             this.messagebox.set('aria-live', 'polite');
             var userlist = Y.one('#chat-userlist');
             userlist.set('aria-live', 'polite');
             userlist.set('aria-relevant', 'all');
 
-            // Attach the default events for this module
+            // Attach the default events for this module.
             this.sendbutton.on('click', this.send, this);
             this.messagebox.on('mouseenter', function() {
                 this.scrollable = false;
@@ -80,12 +79,12 @@ M.mod_chat_ajax.init = function(Y, cfg) {
                 this.scrollable = true;
             }, this);
 
-            // Send the message when the enter key is pressed
+            // Send the message when the enter key is pressed.
             Y.on('key', this.send, this.messageinput,  'press:13', this);
 
             document.title = this.cfg.chatroom_name;
 
-            // Prepare and execute the first AJAX request of information
+            // Prepare and execute the first AJAX request of information.
             Y.io(this.api,{
                 method : 'POST',
                 data :  build_querystring({
@@ -115,25 +114,25 @@ M.mod_chat_ajax.init = function(Y, cfg) {
                 scope.update_messages();
             }, this.cfg.timer, this);
 
-            // Create and initalise theme changing menu
+            // Create and initalise theme changing menu.
             this.thememenu = new Y.YUI2.widget.Menu('basicmenu', {xy:[0,0]});
             this.thememenu.addItems([
-                {text: M.util.get_string('bubble', 'mod_chat'), url: this.cfg.chaturl+'&theme=bubble'},
-                {text: M.util.get_string('compact', 'mod_chat'), url: this.cfg.chaturl+'&theme=compact'}
+                {text: M.util.get_string('bubble', 'mod_chat'), url: this.cfg.chaturl + '&theme=bubble'},
+                {text: M.util.get_string('compact', 'mod_chat'), url: this.cfg.chaturl + '&theme=compact'}
             ]);
             if (this.cfg.showcoursetheme == 1) {
-                this.thememenu.addItem({text: M.util.get_string('coursetheme', 'mod_chat'), url: this.cfg.chaturl+'&theme=course_theme'});
+                this.thememenu.addItem({text: M.util.get_string('coursetheme', 'mod_chat'), url: this.cfg.chaturl + '&theme=course_theme'});
             }
             this.thememenu.render(document.body);
-            Y.one('#choosetheme').on('click', function(e){
-                this.moveTo((e.pageX-20), (e.pageY-20));
+            Y.one('#choosetheme').on('click', function(e) {
+                this.moveTo((e.pageX - 20), (e.pageY - 20));
                 this.show();
             }, this.thememenu);
         },
 
         append_message : function(key, message, row) {
-            var item = Y.Node.create('<li id="mdl-chat-entry-'+key+'">'+message.message+'</li>');
-            item.addClass((message.mymessage)?'mdl-chat-my-entry':'mdl-chat-entry');
+            var item = Y.Node.create('<li id="mdl-chat-entry-' + key + '">' + message.message + '</li>');
+            item.addClass((message.mymessage) ? 'mdl-chat-my-entry' : 'mdl-chat-entry');
             Y.one('#messages-list').append(item);
             if (message.type && message.type == 'beep') {
                 Y.one('#chat-notify').setContent('<embed src="../beep.wav" autostart="true" hidden="true" name="beep" />');
@@ -143,7 +142,7 @@ M.mod_chat_ajax.init = function(Y, cfg) {
         send : function(e, beep) {
             this.sendbutton.set('value', M.str.chat.sending);
             var data = {
-                chat_message : (!beep)?this.messageinput.get('value'):'',
+                chat_message : (!beep) ? this.messageinput.get('value') : '',
                 chat_sid : this.cfg.sid,
                 theme : this.cfg.theme
             };
@@ -179,7 +178,7 @@ M.mod_chat_ajax.init = function(Y, cfg) {
         },
 
         talkto: function (e, name) {
-            this.messageinput.set('value', "To "+name+": ");
+            this.messageinput.set('value', "To " + name + ": ");
             this.messageinput.focus();
         },
 
@@ -214,18 +213,18 @@ M.mod_chat_ajax.init = function(Y, cfg) {
             }
             this.cfg.chat_lasttime = data.lasttime;
             this.cfg.chat_lastrow  = data.lastrow;
-            // Update messages
+            // Update messages.
             for (var key in data.msgs){
                 if (!M.util.in_array(key, this.messages)) {
                     this.messages.push(key);
                     this.append_message(key, data.msgs[key], data.lastrow);
                 }
             }
-            // Update users
+            // Update users.
             this.update_users(data.users);
             // Scroll to the bottom of the message list
             if (this.scrollable) {
-                Y.Node.getDOMNode(this.messagebox).parentNode.scrollTop+=500;
+                Y.Node.getDOMNode(this.messagebox).parentNode.scrollTop += 500;
             }
             this.messageinput.focus();
         },
@@ -237,14 +236,14 @@ M.mod_chat_ajax.init = function(Y, cfg) {
             var list = Y.one('#users-list');
             list.get('children').remove();
             for (var i in users) {
-                var li = Y.Node.create('<li><table><tr><td>'+users[i].picture+'</td><td></td></tr></table></li>');
+                var li = Y.Node.create('<li><table><tr><td>' + users[i].picture + '</td><td></td></tr></table></li>');
                 if (users[i].id == this.cfg.userid) {
-                    li.all('td').item(1).append(Y.Node.create('<strong><a target="_blank" href="'+users[i].url+'">'+ users[i].name+'</a></strong>'));
+                    li.all('td').item(1).append(Y.Node.create('<strong><a target="_blank" href="' + users[i].url + '">' + users[i].name + '</a></strong>'));
                 } else {
-                    li.all('td').item(1).append(Y.Node.create('<div><a target="_blank" href="'+users[i].url+'">'+users[i].name+'</a></div>'));
-                    var talk = Y.Node.create('<a href="###">'+M.str.chat.talk+'</a>');
+                    li.all('td').item(1).append(Y.Node.create('<div><a target="_blank" href="' + users[i].url + '">' + users[i].name + '</a></div>'));
+                    var talk = Y.Node.create('<a href="###">' + M.str.chat.talk + '</a>');
                     talk.on('click', this.talkto, this, users[i].name);
-                    var beep = Y.Node.create('<a href="###">'+M.str.chat.beep+'</a>');
+                    var beep = Y.Node.create('<a href="###">' + M.str.chat.beep + '</a>');
                     beep.on('click', this.send, this, users[i].id);
                     li.all('td').item(1).append(Y.Node.create('<div></div>').append(talk).append('&nbsp;').append(beep));
                 }
index 5f6649d..b1eb941 100644 (file)
@@ -1,4 +1,19 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
 $chattheme_cfg = new stdClass();
 $chattheme_cfg->avatar = true;
 $chattheme_cfg->align  = true;
index 3103704..eb13f88 100644 (file)
@@ -1,4 +1,19 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
 $chattheme_cfg = new stdClass();
 $chattheme_cfg->avatar = false;
 $chattheme_cfg->align  = false;
index 19f5168..130d1b2 100644 (file)
@@ -1,4 +1,19 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
 $chattheme_cfg = new stdClass();
 $chattheme_cfg->avatar = false;
 $chattheme_cfg->align  = false;
index 33d11ad..588d7c8 100644 (file)
@@ -1,16 +1,30 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 require_once('../../../config.php');
 require_once('../lib.php');
 
 $id      = required_param('id', PARAM_INT);
-$groupid = optional_param('groupid', 0, PARAM_INT);  // only for teachers
+$groupid = optional_param('groupid', 0, PARAM_INT);  // Only for teachers.
 $message = optional_param('message', '', PARAM_CLEANHTML);
-$refresh = optional_param('refresh', '', PARAM_RAW); // force refresh
-$last    = optional_param('last', 0, PARAM_INT);     // last time refresh or sending
-$newonly = optional_param('newonly', 0, PARAM_BOOL); // show only new messages
+$refresh = optional_param('refresh', '', PARAM_RAW); // Force refresh.
+$last    = optional_param('last', 0, PARAM_INT);     // Last time refresh or sending.
+$newonly = optional_param('newonly', 0, PARAM_BOOL); // Show only new messages.
 
-$url = new moodle_url('/mod/chat/gui_basic/index.php', array('id'=>$id));
+$url = new moodle_url('/mod/chat/gui_basic/index.php', array('id' => $id));
 if ($groupid !== 0) {
     $url->param('groupid', $groupid);
 }
@@ -28,11 +42,11 @@ if ($newonly !== 0) {
 }
 $PAGE->set_url($url);
 
-if (!$chat = $DB->get_record('chat', array('id'=>$id))) {
+if (!$chat = $DB->get_record('chat', array('id' => $id))) {
     print_error('invalidid', 'chat');
 }
 
-if (!$course = $DB->get_record('course', array('id'=>$chat->course))) {
+if (!$course = $DB->get_record('course', array('id' => $chat->course))) {
     print_error('invalidcourseid');
 }
 
@@ -47,7 +61,7 @@ $PAGE->set_pagelayout('popup');
 $PAGE->set_popup_notification_allowed(false);
 
 // Check to see if groups are being used here.
- if ($groupmode = groups_get_activity_groupmode($cm)) { // Groups are being used.
+if ($groupmode = groups_get_activity_groupmode($cm)) { // Groups are being used.
     if ($groupid = groups_get_activity_group($cm)) {
         if (!$group = groups_get_group($groupid)) {
             print_error('invalidgroupid');
@@ -61,10 +75,10 @@ $PAGE->set_popup_notification_allowed(false);
     $groupname = '';
 }
 
-$strchat  = get_string('modulename', 'chat'); // must be before current_language() in chat_login_user() to force course language!!!
+$strchat  = get_string('modulename', 'chat'); // Must be before current_language() in chat_login_user() to force course language!
 $strchats = get_string('modulenameplural', 'chat');
-$stridle  = get_String('idle', 'chat');
-if (!$chat_sid = chat_login_user($chat->id, 'basic', $groupid, $course)) {
+$stridle  = get_string('idle', 'chat');
+if (!$chatsid = chat_login_user($chat->id, 'basic', $groupid, $course)) {
     print_error('cantlogin', 'chat');
 }
 
@@ -72,7 +86,7 @@ if (!$chatusers = chat_get_users($chat->id, $groupid, $cm->groupingid)) {
     print_error('errornousers', 'chat');
 }
 
-$DB->set_field('chat_users', 'lastping', time(), array('sid'=>$chat_sid));
+$DB->set_field('chat_users', 'lastping', time(), array('sid' => $chatsid));
 
 if (!isset($SESSION->chatprefs)) {
     $SESSION->chatprefs = array();
@@ -92,21 +106,21 @@ if (!empty($refresh) and data_submitted()) {
 
 } else if (empty($refresh) and data_submitted() and confirm_sesskey()) {
 
-    if ($message!='') {
+    if ($message != '') {
 
-        $chatuser = $DB->get_record('chat_users', array('sid' => $chat_sid));
+        $chatuser = $DB->get_record('chat_users', array('sid' => $chatsid));
         chat_send_chatmessage($chatuser, $message, 0, $cm);
 
-        $DB->set_field('chat_users', 'lastmessageping', time(), array('sid'=>$chat_sid));
+        $DB->set_field('chat_users', 'lastmessageping', time(), array('sid' => $chatsid));
     }
 
     chat_delete_old_users();
 
-    $url = new moodle_url('/mod/chat/gui_basic/index.php', array('id'=>$id, 'newonly'=>$newonly, 'last'=>$last));
+    $url = new moodle_url('/mod/chat/gui_basic/index.php', array('id' => $id, 'newonly' => $newonly, 'last' => $last));
     redirect($url);
 }
 
-$PAGE->set_title("$strchat: $course->shortname: ".format_string($chat->name,true)."$groupname");
+$PAGE->set_title("$strchat: $course->shortname: ".format_string($chat->name, true)."$groupname");
 echo $OUTPUT->header();
 echo $OUTPUT->container_start(null, 'page-mod-chat-gui_basic');
 
@@ -117,9 +131,9 @@ echo $OUTPUT->heading(get_string('participants'), 3);
 
 echo $OUTPUT->box_start('generalbox', 'participants');
 echo '<ul>';
-foreach($chatusers as $chu) {
+foreach ($chatusers as $chu) {
     echo '<li class="clearfix">';
-    echo $OUTPUT->user_picture($chu, array('size'=>24, 'courseid'=>$course->id));
+    echo $OUTPUT->user_picture($chu, array('size' => 24, 'courseid' => $course->id));
     echo '<div class="userinfo">';
     echo fullname($chu).' ';
     if ($idle = time() - $chu->lastmessageping) {
@@ -145,7 +159,8 @@ echo '<input type="hidden" name="last" value="'.time().'" />';
 echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
 echo '<input type="submit" value="'.get_string('submit').'" />&nbsp;';
 echo '<input type="submit" name="refresh" value="'.get_string('refresh').'" />';
-echo '<input type="checkbox" name="newonly" id="newonly" '.($newonly?'checked="checked" ':'').'/><label for="newonly">'.get_string('newonlymsg', 'message').'</label>';
+echo '<input type="checkbox" name="newonly" id="newonly" '.($newonly ? 'checked="checked" ' : '').'/>';
+echo '<label for="newonly">'.get_string('newonlymsg', 'message').'</label>';
 echo '</div>';
 echo '</form>';
 echo '</div>';
@@ -158,7 +173,7 @@ $options = new stdClass();
 $options->para = false;
 $options->newlines = true;
 
-$params = array('last'=>$last, 'groupid'=>$groupid, 'chatid'=>$chat->id, 'chatentered'=>$chatentered);
+$params = array('last' => $last, 'groupid' => $groupid, 'chatid' => $chat->id, 'chatentered' => $chatentered);
 
 if ($newonly) {
     $lastsql = "AND timestamp > :last";
index ce2dedb..445d704 100644 (file)
@@ -1,21 +1,35 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
-define('NO_MOODLE_COOKIES', true); // session not used here
+define('NO_MOODLE_COOKIES', true); // Session not used here.
 
 require_once('../../../config.php');
 require_once($CFG->dirroot.'/mod/chat/lib.php');
 
-$chat_sid = required_param('chat_sid', PARAM_ALPHANUM);
+$chatsid = required_param('chat_sid', PARAM_ALPHANUM);
 $chatid   = required_param('chat_id', PARAM_INT);
 
-if (!$chatuser = $DB->get_record('chat_users', array('sid'=>$chat_sid))) {
+if (!$chatuser = $DB->get_record('chat_users', array('sid' => $chatsid))) {
     print_error('notlogged', 'chat');
 }
-if (!$chat = $DB->get_record('chat', array('id'=>$chatid))) {
+if (!$chat = $DB->get_record('chat', array('id' => $chatid))) {
     print_error('invalidid', 'chat');
 }
 
-if (!$course = $DB->get_record('course', array('id'=>$chat->course))) {
+if (!$course = $DB->get_record('course', array('id' => $chat->course))) {
     print_error('invalidcourseid');
 }
 
@@ -23,12 +37,11 @@ if (!$cm = get_coursemodule_from_instance('chat', $chat->id, $course->id)) {
     print_error('invalidcoursemodule');
 }
 
-$PAGE->set_url('/mod/chat/gui_header_js/chatinput.php', array('chat_sid'=>$chat_sid, 'chat_id'=>$chatid));
+$PAGE->set_url('/mod/chat/gui_header_js/chatinput.php', array('chat_sid' => $chatsid, 'chat_id' => $chatid));
 $PAGE->set_popup_notification_allowed(false);
 
-//Get the user theme
-$USER = $DB->get_record('user', array('id'=>$chatuser->userid));
-
+// Get the user theme.
+$USER = $DB->get_record('user', array('id' => $chatuser->userid));
 
 $module = array(
     'name'      => 'mod_chat_header',
@@ -37,23 +50,31 @@ $module = array(
 );
 $PAGE->requires->js_init_call('M.mod_chat_header.init_input', array(false), false, $module);
 
-//Setup course, lang and theme
+// Setup course, lang and theme.
 $PAGE->set_course($course);
 $PAGE->set_pagelayout('embedded');
 $PAGE->set_focuscontrol('input_chat_message');
 $PAGE->set_cacheable(false);
 echo $OUTPUT->header();
 
-echo html_writer::start_tag('form', array('action'=>'../empty.php', 'method'=>'post', 'target'=>'empty', 'id'=>'inputForm', 'style'=>'margin:0'));
+echo html_writer::start_tag('form', array('action' => '../empty.php',
+                                          'method' => 'post',
+                                          'target' => 'empty',
+                                          'id' => 'inputForm',
+                                          'style' => 'margin:0'));
 echo html_writer::label(get_string('entermessage', 'chat'), 'input_chat_message', false, array('class' => 'accesshide'));
-echo html_writer::empty_tag('input', array('type'=>'text', 'id'=>'input_chat_message', 'name'=>'chat_message', 'size'=>'50', 'value'=>''));
-echo html_writer::empty_tag('input', array('type'=>'checkbox', 'id'=>'auto', 'checked'=>'checked', 'value'=>''));
-echo html_writer::tag('label', get_string('autoscroll', 'chat'), array('for'=>'auto'));
+echo html_writer::empty_tag('input', array('type' => 'text',
+                                           'id' => 'input_chat_message',
+                                           'name' => 'chat_message',
+                                           'size' => '50',
+                                           'value' => ''));
+echo html_writer::empty_tag('input', array('type' => 'checkbox', 'id' => 'auto', 'checked' => 'checked', 'value' => ''));
+echo html_writer::tag('label', get_string('autoscroll', 'chat'), array('for' => 'auto'));
 echo html_writer::end_tag('form');
 
-echo html_writer::start_tag('form', array('action'=>'insert.php', 'method'=>'post', 'target'=>'empty', 'id'=>'sendForm'));
-echo html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'chat_sid', 'value'=>$chat_sid));
-echo html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'chat_message', 'id'=>'insert_chat_message'));
+echo html_writer::start_tag('form', array('action' => 'insert.php', 'method' => 'post', 'target' => 'empty', 'id' => 'sendForm'));
+echo html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'chat_sid', 'value' => $chatsid));
+echo html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'chat_message', 'id' => 'insert_chat_message'));
 echo html_writer::end_tag('form');
 
 echo $OUTPUT->footer();
index 741f132..6fba74e 100644 (file)
@@ -1,22 +1,36 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 require_once('../../../config.php');
 require_once('../lib.php');
 
 $id      = required_param('id', PARAM_INT);
-$groupid = optional_param('groupid', 0, PARAM_INT); //only for teachers
+$groupid = optional_param('groupid', 0, PARAM_INT); // Only for teachers.
 
-$url = new moodle_url('/mod/chat/gui_header_js/index.php', array('id'=>$id));
+$url = new moodle_url('/mod/chat/gui_header_js/index.php', array('id' => $id));
 if ($groupid !== 0) {
     $url->param('groupid', $groupid);
 }
 $PAGE->set_url($url);
 
-if (!$chat = $DB->get_record('chat', array('id'=>$id))) {
+if (!$chat = $DB->get_record('chat', array('id' => $id))) {
     print_error('invalidid', 'chat');
 }
 
-if (!$course = $DB->get_record('course', array('id'=>$chat->course))) {
+if (!$course = $DB->get_record('course', array('id' => $chat->course))) {
     print_error('invalidcourseid');
 }
 
@@ -30,8 +44,8 @@ require_login($course, false, $cm);
 
 require_capability('mod/chat:chat', $context);
 
-/// Check to see if groups are being used here
- if ($groupmode = groups_get_activity_groupmode($cm)) {   // Groups are being used
+// Check to see if groups are being used here.
+if ($groupmode = groups_get_activity_groupmode($cm)) {   // Groups are being used.
     if ($groupid = groups_get_activity_group($cm)) {
         if (!$group = groups_get_group($groupid)) {
             print_error('invalidgroupid');
@@ -45,15 +59,15 @@ require_capability('mod/chat:chat', $context);
     $groupname = '';
 }
 
-$strchat = get_string('modulename', 'chat'); // must be before current_language() in chat_login_user() to force course language!!!
+$strchat = get_string('modulename', 'chat'); // Must be before current_language() in chat_login_user() to force course language!
 
-if (!$chat_sid = chat_login_user($chat->id, 'header_js', $groupid, $course)) {
+if (!$chatsid = chat_login_user($chat->id, 'header_js', $groupid, $course)) {
     print_error('cantlogin', 'chat');
 }
 
-$params = "chat_id=$id&chat_sid={$chat_sid}";
+$params = "chat_id=$id&chat_sid={$chatsid}";
 
-// fallback to the old jsupdate, but allow other update modes
+// Fallback to the old jsupdate, but allow other update modes.
 $updatemode = 'jsupdate';
 if (!empty($CFG->chat_normal_updatemode)) {
     $updatemode = $CFG->chat_normal_updatemode;
@@ -67,7 +81,8 @@ $courseshortname = format_string($course->shortname, true, array('context' => co
  <head>
   <meta http-equiv="content-type" content="text/html; charset=utf-8" />
   <title>
-   <?php echo "$strchat: " . $courseshortname . ": " . format_string($chat->name, true, array('context' => $context)) . "$groupname" ?>
+   <?php echo "$strchat: " . $courseshortname . ": ".
+              format_string($chat->name, true, array('context' => $context)) . "$groupname" ?>
   </title>
  </head>
  <frameset cols="*,200" border="5" framespacing="no" frameborder="yes" marginwidth="2" marginheight="1">
index a8d24ac..e86690a 100644 (file)
@@ -1,22 +1,36 @@
 <?php
-
-include('../../../config.php');
-include('../lib.php');
-
-$chat_sid     = required_param('chat_sid', PARAM_ALPHANUM);
-$chat_message = required_param('chat_message', PARAM_RAW);
-
-$PAGE->set_url('/mod/chat/gui_header_js/insert.php', array('chat_sid'=>$chat_sid,'chat_message'=>$chat_message));
-
-if (!$chatuser = $DB->get_record('chat_users', array('sid'=>$chat_sid))) {
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+require_once('../../../config.php');
+require_once('../lib.php');
+
+$chatsid     = required_param('chat_sid', PARAM_ALPHANUM);
+$chatmessage = required_param('chat_message', PARAM_RAW);
+
+$PAGE->set_url('/mod/chat/gui_header_js/insert.php', array('chat_sid' => $chatsid, 'chat_message' => $chatmessage));
+
+if (!$chatuser = $DB->get_record('chat_users', array('sid' => $chatsid))) {
     print_error('notlogged', 'chat');
 }
 
-if (!$chat = $DB->get_record('chat', array('id'=>$chatuser->chatid))) {
+if (!$chat = $DB->get_record('chat', array('id' => $chatuser->chatid))) {
     print_error('nochat', 'chat');
 }
 
-if (!$course = $DB->get_record('course', array('id'=>$chat->course))) {
+if (!$course = $DB->get_record('course', array('id' => $chat->course))) {
     print_error('invalidcourseid');
 }
 
@@ -32,19 +46,19 @@ if (isguestuser()) {
 
 \core\session\manager::write_close();
 
-/// Delete old users now
+// Delete old users now.
 
 chat_delete_old_users();
 
-/// Clean up the message
+// Clean up the message.
 
-$chat_message = clean_text($chat_message, FORMAT_MOODLE);  // Strip bad tags
+$chatmessage = clean_text($chatmessage, FORMAT_MOODLE);  // Strip bad tags.
 
-/// Add the message to the database
+// Add the message to the database.
 
-if (!empty($chat_message)) {
+if (!empty($chatmessage)) {
 
-    chat_send_chatmessage($chatuser, $chat_message, 0, $cm);
+    chat_send_chatmessage($chatuser, $chatmessage, 0, $cm);
 
     $chatuser->lastmessageping = time() - 2;
     $DB->update_record('chat_users', $chatuser);
@@ -52,7 +66,7 @@ if (!empty($chat_message)) {
 
 if ($chatuser->version == 'header_js') {
 
-    $forcerefreshasap = ($CFG->chat_normal_updatemode != 'jsupdated'); // See bug MDL-6791
+    $forcerefreshasap = ($CFG->chat_normal_updatemode != 'jsupdated'); // See bug MDL-6791.
 
     $module = array(
         'name'      => 'mod_chat_header',
@@ -61,4 +75,4 @@ if ($chatuser->version == 'header_js') {
     $PAGE->requires->js_init_call('M.mod_chat_header.init_insert_nojsupdated', array($forcerefreshasap), true, $module);
 }
 
-redirect('../empty.php');
\ No newline at end of file
+redirect('../empty.php');
index a278120..0d5ff63 100644 (file)
@@ -1,61 +1,76 @@
 <?php
-
-define('NO_MOODLE_COOKIES', true); // session not used here
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+define('NO_MOODLE_COOKIES', true); // Session not used here.
 
 require('../../../config.php');
 require('../lib.php');
 
-$chat_sid      = required_param('chat_sid', PARAM_ALPHANUM);
-$chat_lasttime = optional_param('chat_lasttime', 0, PARAM_INT);
-$chat_lastrow  = optional_param('chat_lastrow', 1, PARAM_INT);
+$chatsid      = required_param('chat_sid', PARAM_ALPHANUM);
+$chatlasttime = optional_param('chat_lasttime', 0, PARAM_INT);
+$chatlastrow  = optional_param('chat_lastrow', 1, PARAM_INT);
 
-$url = new moodle_url('/mod/chat/gui_header_js/jsupdate.php', array('chat_sid'=>$chat_sid));
-if ($chat_lasttime !== 0) {
-    $url->param('chat_lasttime', $chat_lasttime);
+$url = new moodle_url('/mod/chat/gui_header_js/jsupdate.php', array('chat_sid' => $chatsid));
+if ($chatlasttime !== 0) {
+    $url->param('chat_lasttime', $chatlasttime);
 }
-if ($chat_lastrow !== 1) {
-    $url->param('chat_lastrow', $chat_lastrow);
+if ($chatlastrow !== 1) {
+    $url->param('chat_lastrow', $chatlastrow);
 }
 $PAGE->set_url($url);
 
 
-if (!$chatuser = $DB->get_record('chat_users', array('sid'=>$chat_sid))) {
+if (!$chatuser = $DB->get_record('chat_users', array('sid' => $chatsid))) {
     print_error('notlogged', 'chat');
 }
 
-//Get the minimal course
-if (!$course = $DB->get_record('course', array('id'=>$chatuser->course))) {
+// Get the minimal course.
+if (!$course = $DB->get_record('course', array('id' => $chatuser->course))) {
     print_error('invalidcourseid');
 }
 
-//Get the user theme and enough info to be used in chat_format_message() which passes it along to
-if (!$user = $DB->get_record('user', array('id'=>$chatuser->userid, 'deleted'=>0, 'suspended'=>0))) { // no optimisation here, it would break again in future!
+// Get the user theme and enough info to be used in chat_format_message() which passes it along to.
+// No optimisation here, it would break again in future!
+if (!$user = $DB->get_record('user', array('id' => $chatuser->userid, 'deleted' => 0, 'suspended' => 0))) {
     print_error('invaliduser');
 }
 \core\session\manager::set_user($user);
 
-//Setup course, lang and theme
+// Setup course, lang and theme.
 $PAGE->set_course($course);
 
-// force deleting of timed out users if there is a silence in room or just entering
-if ((time() - $chat_lasttime) > $CFG->chat_old_ping) {
-    // must be done before chat_get_latest_message!!!
+// Force deleting of timed out users if there is a silence in room or just entering.
+if ((time() - $chatlasttime) > $CFG->chat_old_ping) {
+    // Must be done before chat_get_latest_message!
     chat_delete_old_users();
 }
 
 if ($message = chat_get_latest_message($chatuser->chatid, $chatuser->groupid)) {
-    $chat_newlasttime = $message->timestamp;
+    $chatnewlasttime = $message->timestamp;
 } else {
-    $chat_newlasttime = 0;
+    $chatnewlasttime = 0;
 }
 
-if ($chat_lasttime == 0) { //display some previous messages
-    $chat_lasttime = time() - $CFG->chat_old_ping; //TO DO - any better value??
+if ($chatlasttime == 0) { // Display some previous messages.
+    $chatlasttime = time() - $CFG->chat_old_ping; // TO DO - any better value?
 }
 
 $timenow    = time();
 
-$params = array('groupid'=>$chatuser->groupid, 'chatid'=>$chatuser->chatid, 'lasttime'=>$chat_lasttime);
+$params = array('groupid' => $chatuser->groupid, 'chatid' => $chatuser->chatid, 'lasttime' => $chatlasttime);
 
 $groupselect = $chatuser->groupid ? " AND (groupid=:groupid OR groupid=0) " : "";
 
@@ -69,11 +84,12 @@ if ($messages) {
     $num = 0;
 }
 
-$chat_newrow = ($chat_lastrow + $num) % 2;
+$chatnewrow = ($chatlastrow + $num) % 2;
 
-// no &amp; in url, does not work in header!
-$refreshurl = "{$CFG->wwwroot}/mod/chat/gui_header_js/jsupdate.php?chat_sid=$chat_sid&chat_lasttime=$chat_newlasttime&chat_lastrow=$chat_newrow";
-$refreshurlamp = "{$CFG->wwwroot}/mod/chat/gui_header_js/jsupdate.php?chat_sid=$chat_sid&amp;chat_lasttime=$chat_newlasttime&amp;chat_lastrow=$chat_newrow";
+// No &amp; in url, does not work in header!
+$baseurl = "{$CFG->wwwroot}/mod/chat/gui_header_js/jsupdate.php?";
+$refreshurl = $baseurl . "chat_sid=$chatsid&chat_lasttime=$chatnewlasttime&chat_lastrow=$chatnewrow";
+$refreshurlamp = $baseurl . "chat_sid=$chatsid&amp;chat_lasttime=$chatnewlasttime&amp;chat_lastrow=$chatnewrow";
 
 header('Expires: Sun, 28 Dec 1997 09:32:45 GMT');
 header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
@@ -82,15 +98,15 @@ header('Pragma: no-cache');
 header('Content-Type: text/html; charset=utf-8');
 header("Refresh: $CFG->chat_refresh_room; url=$refreshurl");
 
-/// required stylesheets
+// Required stylesheets.
 $stylesheetshtml = '';
 /*foreach ($CFG->stylesheets as $stylesheet) {
     //TODO: MDL-21120
     $stylesheetshtml .= '<link rel="stylesheet" type="text/css" href="'.$stylesheet.'" />';
 }*/
 
-// use ob to be able to send Content-Length headers
-// needed for Keep-Alive to work
+// Use ob to be able to send Content-Length headers.
+// Needed for Keep-Alive to work.
 ob_start();
 
 ?>
@@ -104,9 +120,9 @@ ob_start();
             self.location.href= '<?php echo $refreshurl;?>';
         }
         var issafari = false;
-        if(window.devicePixelRatio){
+        if (window.devicePixelRatio) {
             issafari = true;
-            setTimeout('safari_refresh()', <?php echo $CFG->chat_refresh_room*1000;?>);
+            setTimeout('safari_refresh()', <?php echo $CFG->chat_refresh_room * 1000;?>);
         }
         if (parent.msg && parent.msg.document.getElementById("msgStarted") == null) {
             parent.msg.document.close();
@@ -118,52 +134,52 @@ ob_start();
             parent.msg.document.write("<?php echo addslashes_js($stylesheetshtml) ?>");
             parent.msg.document.write("<\/head><body class=\"mod-chat-gui_header_js course-<?php echo $chatuser->course ?>\" id=\"mod-chat-gui_header_js-jsupdate\"><div style=\"display: none\" id=\"msgStarted\">&nbsp;<\/div>");
         }
-        <?php
-        $beep = false;
-        $refreshusers = false;
-        $us = array ();
-        if (($chat_lasttime != $chat_newlasttime) and $messages) {
-
-            foreach ($messages as $message) {
-                $chat_lastrow = ($chat_lastrow + 1) % 2;
-                $formatmessage = chat_format_message($message, $chatuser->course, $USER, $chat_lastrow);
-                if ($formatmessage->beep) {
-                     $beep = true;
-                }
-                if ($formatmessage->refreshusers) {
-                     $refreshusers = true;
-                }
-                $us[$message->userid] = $timenow - $message->timestamp;
-                echo "if(parent.msg)";
-                echo "parent.msg.document.write('".addslashes_js($formatmessage->html)."\\n');\n";
-             }
+<?php
+$beep = false;
+$refreshusers = false;
+$us = array ();
+if (($chatlasttime != $chatnewlasttime) and $messages) {
+
+    foreach ($messages as $message) {
+        $chatlastrow = ($chatlastrow + 1) % 2;
+        $formatmessage = chat_format_message($message, $chatuser->course, $USER, $chatlastrow);
+        if ($formatmessage->beep) {
+             $beep = true;
+        }
+        if ($formatmessage->refreshusers) {
+             $refreshusers = true;
         }
+        $us[$message->userid] = $timenow - $message->timestamp;
+        echo "if(parent.msg)";
+        echo "parent.msg.document.write('".addslashes_js($formatmessage->html)."\\n');\n";
+    }
+}
 
-        $chatuser->lastping = time();
-        $DB->set_field('chat_users', 'lastping', $chatuser->lastping, array('id'=>$chatuser->id));
+$chatuser->lastping = time();
+$DB->set_field('chat_users', 'lastping', $chatuser->lastping, array('id' => $chatuser->id));
 
-        if ($refreshusers) {
-        ?>
+if ($refreshusers) {
+?>
         var link = parent.users.document.getElementById('refreshLink');
         if (link != null) {
             parent.users.location.href = link.href;
         }
-        <?php
-        } else {
-            foreach($us as $uid=>$lastping) {
-                $min = (int) ($lastping/60);
-                $sec = $lastping - ($min*60);
-                $min = $min < 10 ? '0'.$min : $min;
-                $sec = $sec < 10 ? '0'.$sec : $sec;
-                $idle = $min.':'.$sec;
-                echo "if (parent.users && parent.users.document.getElementById('uidle{$uid}') != null) {".
-                        "parent.users.document.getElementById('uidle{$uid}').innerHTML = '$idle';}\n";
-            }
-        }
-        ?>
-        if(parent.input){
+<?php
+} else {
+    foreach ($us as $uid => $lastping) {
+        $min = (int) ($lastping / 60);
+        $sec = $lastping - ($min * 60);
+        $min = $min < 10 ? '0'.$min : $min;
+        $sec = $sec < 10 ? '0'.$sec : $sec;
+        $idle = $min.':'.$sec;
+        echo "if (parent.users && parent.users.document.getElementById('uidle{$uid}') != null) {".
+                "parent.users.document.getElementById('uidle{$uid}').innerHTML = '$idle';}\n";
+    }
+}
+?>
+        if (parent.input) {
             var autoscroll = parent.input.document.getElementById('auto');
-            if(parent.msg && autoscroll && autoscroll.checked){
+            if (parent.msg && autoscroll && autoscroll.checked) {
                 parent.msg.scroll(1,5000000);
             }
         }
@@ -171,20 +187,18 @@ ob_start();
         </script>
     </head>
     <body>
-       <?php
-            if ($beep) {
-                echo '<embed src="../beep.wav" autostart="true" hidden="true" name="beep" />';
-            }
-        ?>
+<?php
+if ($beep) {
+    echo '<embed src="../beep.wav" autostart="true" hidden="true" name="beep" />';
+}
+?>
        <a href="<?php echo $refreshurlamp ?>" name="refreshLink">Refresh link</a>
     </body>
 </html>
 <?php
 
-// support HTTP Keep-Alive
+// Support HTTP Keep-Alive.
 header("Content-Length: " . ob_get_length() );
 ob_end_flush();
 exit;
 
-
-?>
index 9048004..1ff6d76 100644 (file)
@@ -1,4 +1,18 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /** jsupdated.php - notes by Martin Langhoff <martin@catalyst.net.nz>
  **
  **
  **/
 
-
 define('CHAT_MAX_CLIENT_UPDATES', 1000);
-define('NO_MOODLE_COOKIES', true); // session not used here
+define('NO_MOODLE_COOKIES', true); // Session not used here.
 define('NO_OUTPUT_BUFFERING', true);
 
 require('../../../config.php');
 require('../lib.php');
 
-// we are going to run for a long time
-// avoid being terminated by php
+// We are going to run for a long time.
+// Avoid being terminated by php.
 core_php_time_limit::raise();
 
-$chat_sid      = required_param('chat_sid',          PARAM_ALPHANUM);
-$chat_lasttime = optional_param('chat_lasttime',  0, PARAM_INT);
-$chat_lastrow  = optional_param('chat_lastrow',   1, PARAM_INT);
-$chat_lastid   = optional_param('chat_lastid',    0, PARAM_INT);
+$chatsid      = required_param('chat_sid',          PARAM_ALPHANUM);
+$chatlasttime = optional_param('chat_lasttime',  0, PARAM_INT);
+$chatlastrow  = optional_param('chat_lastrow',   1, PARAM_INT);
+$chatlastid   = optional_param('chat_lastid',    0, PARAM_INT);
 
-$url = new moodle_url('/mod/chat/gui_header_js/jsupdated.php', array('chat_sid'=>$chat_sid));
-if ($chat_lasttime !== 0) {
-    $url->param('chat_lasttime', $chat_lasttime);
+$url = new moodle_url('/mod/chat/gui_header_js/jsupdated.php', array('chat_sid' => $chatsid));
+if ($chatlasttime !== 0) {
+    $url->param('chat_lasttime', $chatlasttime);
 }
-if ($chat_lastrow !== 1) {
-    $url->param('chat_lastrow', $chat_lastrow);
+if ($chatlastrow !== 1) {
+    $url->param('chat_lastrow', $chatlastrow);
 }
-if ($chat_lastid !== 1) {
-    $url->param('chat_lastid', $chat_lastid);
+if ($chatlastid !== 1) {
+    $url->param('chat_lastid', $chatlastid);
 }
 $PAGE->set_url($url);
 
-if (!$chatuser = $DB->get_record('chat_users', array('sid'=>$chat_sid))) {
+if (!$chatuser = $DB->get_record('chat_users', array('sid' => $chatsid))) {
     print_error('notlogged', 'chat');
 }
 
-//Get the minimal course
-if (!$course = $DB->get_record('course', array('id'=>$chatuser->course))) {
+// Get the minimal course.
+if (!$course = $DB->get_record('course', array('id' => $chatuser->course))) {
     print_error('invalidcourseid');
 }
 
-//Get the user theme and enough info to be used in chat_format_message() which passes it along to
+// Get the user theme and enough info to be used in chat_format_message() which passes it along to
 // chat_format_message_manually() -- and only id and timezone are used.
-if (!$user = $DB->get_record('user', array('id'=>$chatuser->userid, 'deleted'=>0, 'suspended'=>0))) { // no optimisation here, it would break again in future!
+// No optimisation here, it would break again in future!
+if (!$user = $DB->get_record('user', array('id' => $chatuser->userid, 'deleted' => 0, 'suspended' => 0))) {
     print_error('invaliduser');
 }
 \core\session\manager::set_user($user);
 
-//Setup course, lang and theme
+// Setup course, lang and theme.
 $PAGE->set_course($course);
 
-// force deleting of timed out users if there is a silence in room or just entering
-if ((time() - $chat_lasttime) > $CFG->chat_old_ping) {
-    // must be done before chat_get_latest_message!!!
+// Force deleting of timed out users if there is a silence in room or just entering.
+if ((time() - $chatlasttime) > $CFG->chat_old_ping) {
+    // Must be done before chat_get_latest_message!
     chat_delete_old_users();
 }
 
-//
-// Time to send headers, and lay out the basic JS updater page
-//
+// Time to send headers, and lay out the basic JS updater page.
 header('Expires: Sun, 28 Dec 1997 09:32:45 GMT');
 header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
 header('Cache-Control: no-cache, must-revalidate');
 header('Pragma: no-cache');
 header('Content-Type: text/html; charset=utf-8');
 
-/// required stylesheets
+// Required stylesheets.
 $stylesheetshtml = '';
 /*foreach ($CFG->stylesheets as $stylesheet) {
     //TODO: MDL-21120
     $stylesheetshtml .= '<link rel="stylesheet" type="text/css" href="'.$stylesheet.'" />';
 }*/
 
-$refreshurl = "{$CFG->wwwroot}/mod/chat/gui_header_js/jsupdated.php?chat_sid=$chat_sid&chat_lasttime=$chat_lasttime&chat_lastrow=$chat_newrow&chat_lastid=$chat_lastid";
+$refreshurl = "{$CFG->wwwroot}/mod/chat/gui_header_js/jsupdated.php?".
+              "chat_sid=$chatsid&chat_lasttime=$chatlasttime&chat_lastrow=$chatnewrow&chat_lastid=$chatlastid";
 ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html>
@@ -99,7 +112,7 @@ $refreshurl = "{$CFG->wwwroot}/mod/chat/gui_header_js/jsupdated.php?chat_sid=$ch
         var issafari = false;
         if(window.devicePixelRatio){
             issafari = true;
-            setTimeout('safari_refresh()', <?php echo $CFG->chat_refresh_room*1000;?>);
+            setTimeout('safari_refresh()', <?php echo $CFG->chat_refresh_room * 1000;?>);
         }
         if (parent.msg.document.getElementById("msgStarted") == null) {
             parent.msg.document.close();
@@ -118,126 +131,129 @@ $refreshurl = "{$CFG->wwwroot}/mod/chat/gui_header_js/jsupdated.php?chat_sid=$ch
 
 <?php
 
-    // Ensure the HTML head makes it out there
-    echo $CHAT_DUMMY_DATA;
-
-    for ($n=0; $n <= CHAT_MAX_CLIENT_UPDATES; $n++) {
-
-        // ping first so we can later shortcut as needed.
-        $chatuser->lastping = time();
-        $DB->set_field('chat_users', 'lastping', $chatuser->lastping, array('id'=>$chatuser->id));
-
-        if ($message = chat_get_latest_message($chatuser->chatid, $chatuser->groupid)) {
-            $chat_newlasttime = $message->timestamp;
-            $chat_newlastid   = $message->id;
-        } else {
-            $chat_newlasttime = 0;
-            $chat_newlastid   = 0;
-            print " \n";
-            print $CHAT_DUMMY_DATA;
-            sleep($CFG->chat_refresh_room);
-            continue;
-        }
+// Ensure the HTML head makes it out there.
+echo $CHAT_DUMMY_DATA;
 
-        $timenow    = time();
+for ($n = 0; $n <= CHAT_MAX_CLIENT_UPDATES; $n++) {
 
-        $params = array('groupid'=>$chatuser->groupid, 'lastid'=>$chat_lastid, 'lasttime'=>$chat_lasttime, 'chatid'=>$chatuser->chatid);
-        $groupselect = $chatuser->groupid ? " AND (groupid=:groupid OR groupid=0) " : "";
+    // Ping first so we can later shortcut as needed.
+    $chatuser->lastping = time();
+    $DB->set_field('chat_users', 'lastping', $chatuser->lastping, array('id' => $chatuser->id));
 
-        $newcriteria = '';
-        if ($chat_lastid > 0) {
-            $newcriteria = "id > :lastid";
-        } else {
-            if ($chat_lasttime == 0) { //display some previous messages
-                $chat_lasttime = $timenow - $CFG->chat_old_ping; //TO DO - any better value??
-            }
-            $newcriteria = "timestamp > :lasttime";
+    if ($message = chat_get_latest_message($chatuser->chatid, $chatuser->groupid)) {
+        $chatnewlasttime = $message->timestamp;
+        $chatnewlastid   = $message->id;
+    } else {
+        $chatnewlasttime = 0;
+        $chatnewlastid   = 0;
+        print " \n";
+        print $CHAT_DUMMY_DATA;
+        sleep($CFG->chat_refresh_room);
+        continue;
+    }
+
+    $timenow    = time();
+
+    $params = array('groupid' => $chatuser->groupid,
+                    'lastid' => $chatlastid,
+                    'lasttime' => $chatlasttime,
+                    'chatid' => $chatuser->chatid);
+    $groupselect = $chatuser->groupid ? " AND (groupid=:groupid OR groupid=0) " : "";
+
+    $newcriteria = '';
+    if ($chatlastid > 0) {
+        $newcriteria = "id > :lastid";
+    } else {
+        if ($chatlasttime == 0) { // Display some previous messages.
+            $chatlasttime = $timenow - $CFG->chat_old_ping; // TO DO - any better value?
         }
+        $newcriteria = "timestamp > :lasttime";
+    }
 
-        $messages = $DB->get_records_select("chat_messages_current",
-                                       "chatid = :chatid AND $newcriteria $groupselect", $params,
-                                       "timestamp ASC");
-
-        if ($messages) {
-            $num = count($messages);
-        } else {
-            print " \n";
-            print $CHAT_DUMMY_DATA;
-            sleep($CFG->chat_refresh_room);
-            continue;
-            $num = 0;
-        }
+    $messages = $DB->get_records_select("chat_messages_current",
+                                   "chatid = :chatid AND $newcriteria $groupselect", $params,
+                                   "timestamp ASC");
+
+    if ($messages) {
+        $num = count($messages);
+    } else {
+        print " \n";
+        print $CHAT_DUMMY_DATA;
+        sleep($CFG->chat_refresh_room);
+        continue;
+    }
 
-        print '<script type="text/javascript">' . "\n";
-        print "//<![CDATA[\n\n";
+    print '<script type="text/javascript">' . "\n";
+    print "//<![CDATA[\n\n";
 
-        $chat_newrow = ($chat_lastrow + $num) % 2;
+    $chatnewrow = ($chatlastrow + $num) % 2;
 
-        $refreshusers = false;
-        $us = array ();
-        if (($chat_lasttime != $chat_newlasttime) and $messages) {
-
-            $beep         = false;
-            $refreshusers = false;
-            foreach ($messages as $message) {
-                $chat_lastrow = ($chat_lastrow + 1) % 2;
-                $formatmessage = chat_format_message($message, $chatuser->course, $USER, $chat_lastrow);
-                if ($formatmessage->beep) {
-                    $beep = true;
-                }
-                if ($formatmessage->refreshusers) {
-                    $refreshusers = true;
-                }
-                $us[$message->userid] = $timenow - $message->timestamp;
-                echo "parent.msg.document.write('".addslashes_js($formatmessage->html )."\\n');\n";
+    $refreshusers = false;
+    $us = array ();
+    if (($chatlasttime != $chatnewlasttime) and $messages) {
 
+        $beep         = false;
+        $refreshusers = false;
+        foreach ($messages as $message) {
+            $chatlastrow = ($chatlastrow + 1) % 2;
+            $formatmessage = chat_format_message($message, $chatuser->course, $USER, $chatlastrow);
+            if ($formatmessage->beep) {
+                $beep = true;
             }
-            // from the last message printed...
-            // a strange case where lack of closures is useful!
-            $chat_lasttime = $message->timestamp;
-            $chat_lastid   = $message->id;
-        }
-
-        if ($refreshusers) {
-            echo "if (parent.users.document.anchors[0] != null) {" .
-                "parent.users.location.href = parent.users.document.anchors[0].href;}\n";
-        } else {
-            foreach($us as $uid=>$lastping) {
-                $min = (int) ($lastping/60);
-                $sec = $lastping - ($min*60);
-                $min = $min < 10 ? '0'.$min : $min;
-                $sec = $sec < 10 ? '0'.$sec : $sec;
-                $idle = $min.':'.$sec;
-                echo "if (parent.users.document.getElementById('uidle{$uid}') != null) {".
-                        "parent.users.document.getElementById('uidle{$uid}').innerHTML = '$idle';}\n";
+            if ($formatmessage->refreshusers) {
+                $refreshusers = true;
             }
-        }
+            $us[$message->userid] = $timenow - $message->timestamp;
+            echo "parent.msg.document.write('".addslashes_js($formatmessage->html )."\\n');\n";
 
-        print <<<EOD
-        if(parent.input){
-            var autoscroll = parent.input.document.getElementById('auto');
-            if(parent.msg && autoscroll && autoscroll.checked){
-                parent.msg.scroll(1,5000000);
-            }
         }
-EOD;
-        print "//]]>\n";
-        print '</script>' . "\n\n";
-        if ($beep) {
-            print '<embed src="../beep.wav" autostart="true" hidden="true" name="beep" />';
+        // From the last message printed.
+        // A strange case where lack of closures is useful!
+        $chatlasttime = $message->timestamp;
+        $chatlastid   = $message->id;
+    }
+
+    if ($refreshusers) {
+        echo "if (parent.users.document.anchors[0] != null) {" .
+            "parent.users.location.href = parent.users.document.anchors[0].href;}\n";
+    } else {
+        foreach ($us as $uid => $lastping) {
+            $min = (int) ($lastping / 60);
+            $sec = $lastping - ($min * 60);
+            $min = $min < 10 ? '0'.$min : $min;
+            $sec = $sec < 10 ? '0'.$sec : $sec;
+            $idle = $min.':'.$sec;
+            echo "if (parent.users.document.getElementById('uidle{$uid}') != null) {".
+                    "parent.users.document.getElementById('uidle{$uid}').innerHTML = '$idle';}\n";
         }
-        print $CHAT_DUMMY_DATA;
-        sleep($CFG->chat_refresh_room);
-    } // here ends the for() loop
+    }
 
-    // here & should be written & :-D
-    $refreshurl = "{$CFG->wwwroot}/mod/chat/gui_header_js/jsupdated.php?chat_sid=$chat_sid&chat_lasttime=$chat_lasttime&chat_lastrow=$chat_newrow&chat_lastid=$chat_lastid";
-    print '<script type="text/javascript">' . "\n";
-    print "//<![CDATA[ \n\n";
-    print "location.href = '$refreshurl';\n";
+    print <<<EOD
+    if(parent.input){
+        var autoscroll = parent.input.document.getElementById('auto');
+        if(parent.msg && autoscroll && autoscroll.checked){
+            parent.msg.scroll(1,5000000);
+        }
+    }
+EOD;
     print "//]]>\n";
     print '</script>' . "\n\n";
-
+    if ($beep) {
+        print '<embed src="../beep.wav" autostart="true" hidden="true" name="beep" />';
+    }
+    print $CHAT_DUMMY_DATA;
+    sleep($CFG->chat_refresh_room);
+} // Here ends the for() loop.
+
+// Here & should be written & :-D.
+$refreshurl = "{$CFG->wwwroot}/mod/chat/gui_header_js/jsupdated.php?";
+$refreshurl .= "chat_sid=$chatsid&chat_lasttime=$chatlasttime&chat_lastrow=$chatnewrow&chat_lastid=$chatlastid";
+
+print '<script type="text/javascript">' . "\n";
+print "//<![CDATA[ \n\n";
+print "location.href = '$refreshurl';\n";
+print "//]]>\n";
+print '</script>' . "\n\n";
 ?>
 
     </body>
index 93cfdae..0b934f2 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * NOTE: the /mod/chat/gui_header_js/ is not a real plugin,
  * ideally this code should be in /mod/chat/module.js
@@ -116,7 +115,7 @@ M.mod_chat_header.init_users = function(Y, users) {
         start : function() {
             this.timer = setTimeout(function(self) {
                 self.update();
-            }, this.timeout*1000, this);
+            }, this.timeout * 1000, this);
         },
         /**
          * Stops the update timeout
@@ -134,11 +133,11 @@ M.mod_chat_header.init_users = function(Y, users) {
          */
         update : function() {
             for (var i in this.users) {
-                var el  = Y.one('#uidle'+this.users[i]);
+                var el  = Y.one('#uidle' + this.users[i]);
                 if (el) {
                     var parts = el.get('innerHTML').split(':');
-                    var time = this.timeout + (parseInt(parts[0], 10)*60) + parseInt(parts[1], 10);
-                    var min = Math.floor(time/60);
+                    var time = this.timeout + (parseInt(parts[0], 10) * 60) + parseInt(parts[1], 10);
+                    var min = Math.floor(time / 60);
                     var sec = time % 60;
                     el.set('innerHTML', ((min < 10) ? "0" : "") + min + ":" + ((sec < 10) ? "0" : "") + sec);
                 }
index e523de8..cddab2d 100644 (file)
@@ -1,34 +1,49 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
-define('NO_MOODLE_COOKIES', true); // session not used here
+define('NO_MOODLE_COOKIES', true); // Session not used here.
 
 require_once('../../../config.php');
 require_once($CFG->dirroot.'/mod/chat/lib.php');
 
-$chat_sid   = required_param('chat_sid', PARAM_ALPHANUM);
-$beep       = optional_param('beep', 0, PARAM_INT);  // beep target
+$chatsid   = required_param('chat_sid', PARAM_ALPHANUM);
+$beep       = optional_param('beep', 0, PARAM_INT);  // Beep target.
 
-$PAGE->set_url('/mod/chat/gui_header_js/users.php', array('chat_sid'=>$chat_sid));
+$PAGE->set_url('/mod/chat/gui_header_js/users.php', array('chat_sid' => $chatsid));
 $PAGE->set_popup_notification_allowed(false);
 
-if (!$chatuser = $DB->get_record('chat_users', array('sid'=>$chat_sid))) {
+if (!$chatuser = $DB->get_record('chat_users', array('sid' => $chatsid))) {
     print_error('notlogged', 'chat');
 }
 
-//Get the minimal course
-if (!$course = $DB->get_record('course', array('id'=>$chatuser->course))) {
+// Get the minimal course.
+if (!$course = $DB->get_record('course', array('id' => $chatuser->course))) {
     print_error('invalidcourseid');
 }
 
-//Get the user theme and enough info to be used in chat_format_message() which passes it along to
-if (!$user = $DB->get_record('user', array('id'=>$chatuser->userid, 'deleted'=>0, 'suspended'=>0))) { // no optimisation here, it would break again in future!
+// Get the user theme and enough info to be used in chat_format_message() which passes it along to.
+// No optimisation here, it would break again in future!
+if (!$user = $DB->get_record('user', array('id' => $chatuser->userid, 'deleted' => 0, 'suspended' => 0))) {
     print_error('invaliduser');
 }
 \core\session\manager::set_user($user);
 
 $PAGE->set_pagelayout('embedded');
 
-//Setup course, lang and theme
+// Setup course, lang and theme.
 $PAGE->set_course($course);
 
 $courseid = $chatuser->course;
@@ -39,15 +54,15 @@ if (!$cm = get_coursemodule_from_instance('chat', $chatuser->chatid, $courseid))
 
 if ($beep) {
     chat_send_chatmessage($chatuser, "beep $beep", 0, $cm);
-    $chatuser->lastmessageping = time();          // A beep is a ping  ;-)
+    $chatuser->lastmessageping = time(); // A beep is a ping.
 }
 
 $chatuser->lastping = time();
-$DB->set_field('chat_users', 'lastping', $chatuser->lastping, array('id'=>$chatuser->id));
+$DB->set_field('chat_users', 'lastping', $chatuser->lastping, array('id' => $chatuser->id));
 
-$refreshurl = "users.php?chat_sid=$chat_sid";
+$refreshurl = "users.php?chat_sid=$chatsid";
 
-/// Get list of users
+// Get list of users.
 
 if (!$chatusers = chat_get_users($chatuser->chatid, $chatuser->groupid, $cm->groupingid)) {
     print_error('errornousers', 'chat');
@@ -65,7 +80,7 @@ $module = array(
 );
 $PAGE->requires->js_init_call('M.mod_chat_header.init_users', array($uidles), false, $module);
 
-/// Print user panel body
+// Print user panel body.
 $timenow    = time();
 $stridle    = get_string('idle', 'chat');
 $strbeep    = get_string('beep', 'chat');
@@ -75,19 +90,24 @@ $table->width = '100%';
 $table->data = array();
 foreach ($chatusers as $chatuser) {
     $lastping = $timenow - $chatuser->lastmessageping;
-    $min = (int) ($lastping/60);
-    $sec = $lastping - ($min*60);
+    $min = (int) ($lastping / 60);
+    $sec = $lastping - ($min * 60);
     $min = $min < 10 ? '0'.$min : $min;
     $sec = $sec < 10 ? '0'.$sec : $sec;
     $idle = $min.':'.$sec;
 
     $row = array();
-    $row[0] = $OUTPUT->user_picture($chatuser, array('courseid'=>$courseid, 'popup'=>true));
+    $row[0] = $OUTPUT->user_picture($chatuser, array('courseid' => $courseid, 'popup' => true));
     $row[1]  = html_writer::start_tag('p');
-    $row[1] .= html_writer::start_tag('font', array('size'=>'1'));
+    $row[1] .= html_writer::start_tag('font', array('size' => '1'));
     $row[1] .= fullname($chatuser).'<br />';
-    $row[1] .= html_writer::tag('span', $stridle . html_writer::tag('span', $idle, array('name'=>'uidles', 'id'=>'uidle'.$chatuser->id)), array('class'=>'dimmed_text')).' ';
-    $row[1] .= html_writer::tag('a', $strbeep, array('href'=>new moodle_url('/mod/chat/gui_header_js/users.php', array('chat_sid'=>$chat_sid, 'beep'=>$chatuser->id))));
+    $row[1] .= html_writer::tag('span', $stridle . html_writer::tag('span',
+                                                                    $idle,
+                                                                    array('name' => 'uidles', 'id' => 'uidle'.$chatuser->id)),
+                                array('class' => 'dimmed_text')) . ' ';
+    $row[1] .= html_writer::tag('a', $strbeep, array('href' => new moodle_url('/mod/chat/gui_header_js/users.php',
+                                                                              array('chat_sid' => $chatsid,
+                                                                              'beep' => $chatuser->id))));
     $row[1] .= html_writer::end_tag('font');
     $row[1] .= html_writer::end_tag('p');
     $table->data[] = $row;
@@ -95,11 +115,12 @@ foreach ($chatusers as $chatuser) {
 
 ob_start();
 echo $OUTPUT->header();
-echo html_writer::tag('div', html_writer::tag('a', 'Refresh link', array('href'=>$refreshurl, 'id'=>'refreshLink')), array('style'=>'display:none')); //TODO: localize
+// TODO MDL-46477 localize the following string.
+echo html_writer::tag('div', html_writer::tag('a', 'Refresh link', array('href' => $refreshurl, 'id' => 'refreshLink')),
+                      array('style' => 'display:none'));
 echo html_writer::table($table);
 echo $OUTPUT->footer();
 
-//
 // Support HTTP Keep-Alive by printing Content-Length
 //
 // If the user pane is refreshing often, using keepalives
@@ -117,5 +138,5 @@ if ($CFG->chat_refresh_userlist < 15) {
     ob_end_flush();
 }
 
-exit; // no further output
+exit; // No further output.
 
index 68a8d1b..09a5840 100644 (file)
@@ -4,11 +4,11 @@ function empty_field_and_submit() {
     var inpf = document.getElementById('inputform');
     cf.chat_msgidnr.value = parseInt(cf.chat_msgidnr.value) + 1;
     cf.chat_message.value = inpf.chat_message.value;
-    inpf.chat_message.value='';
+    inpf.chat_message.value = '';
     cf.submit();
     inpf.chat_message.focus();
     return false;
 }
 function setfocus() {
     document.getElementsByName("chat_message")[0].focus();
-}
\ No newline at end of file
+}
index af5afb5..0bfd9c0 100644 (file)
@@ -1,23 +1,37 @@
 <?php
-
-define('NO_MOODLE_COOKIES', true); // session not used here
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+define('NO_MOODLE_COOKIES', true); // Session not used here.
 
 require('../../../config.php');
 require('../lib.php');
 
-$chat_sid = required_param('chat_sid', PARAM_ALPHANUM);
+$chatsid = required_param('chat_sid', PARAM_ALPHANUM);
 
-$PAGE->set_url('/mod/chat/gui_sockets/chatinput.php', array('chat_sid'=>$chat_sid));
+$PAGE->set_url('/mod/chat/gui_sockets/chatinput.php', array('chat_sid' => $chatsid));
 $PAGE->set_popup_notification_allowed(false);
 
-if (!$chatuser = $DB->get_record('chat_users', array('sid'=>$chat_sid))) {
+if (!$chatuser = $DB->get_record('chat_users', array('sid' => $chatsid))) {
     print_error('notlogged', 'chat');
 }
 
-//Get the user theme
-$USER = $DB->get_record('user', array('id'=>$chatuser->userid));
+// Get the user theme.
+$USER = $DB->get_record('user', array('id' => $chatuser->userid));
 
-//Setup course, lang and theme
+// Setup course, lang and theme.
 $PAGE->set_pagelayout('embedded');
 $PAGE->set_course($DB->get_record('course', array('id' => $chatuser->course)));
 $PAGE->requires->js('/mod/chat/gui_sockets/chat_gui_sockets.js', true);
@@ -38,8 +52,8 @@ echo $OUTPUT->header();
         <input type="hidden" name="win" value="message" />
         <input type="hidden" name="chat_message" value="" />
         <input type="hidden" name="chat_msgidnr" value="0" />
-        <input type="hidden" name="chat_sid" value="<?php echo $chat_sid ?>" />
+        <input type="hidden" name="chat_sid" value="<?php echo $chatsid ?>" />
     </form>
 <?php
-    echo $OUTPUT->footer();
-?>
+echo $OUTPUT->footer();
+
index 079bc66..ace009d 100644 (file)
@@ -1,22 +1,36 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 require_once('../../../config.php');
 require_once('../lib.php');
 
 $id      = required_param('id', PARAM_INT);
-$groupid = optional_param('groupid', 0, PARAM_INT); //only for teachers
+$groupid = optional_param('groupid', 0, PARAM_INT); // Only for teachers.
 
-$url = new moodle_url('/mod/chat/gui_sockets/index.php', array('id'=>$id));
+$url = new moodle_url('/mod/chat/gui_sockets/index.php', array('id' => $id));
 if ($groupid !== 0) {
     $url->param('groupid', $groupid);
 }
 $PAGE->set_url($url);
 
-if (!$chat = $DB->get_record('chat', array('id'=>$id))) {
+if (!$chat = $DB->get_record('chat', array('id' => $id))) {
     print_error('invalidid', 'chat');
 }
 
-if (!$course = $DB->get_record('course', array('id'=>$chat->course))) {
+if (!$course = $DB->get_record('course', array('id' => $chat->course))) {
     print_error('invalidcourseid');
 }
 
@@ -28,8 +42,8 @@ require_login($course, false, $cm);
 $context = context_module::instance($cm->id);
 require_capability('mod/chat:chat', $context);
 
-/// Check to see if groups are being used here
- if ($groupmode = groups_get_activity_groupmode($cm)) {   // Groups are being used
+// Check to see if groups are being used here
+if ($groupmode = groups_get_activity_groupmode($cm)) {   // Groups are being used.
     if ($groupid = groups_get_activity_group($cm)) {
         if (!$group = groups_get_group($groupid)) {
             print_error('invalidgroupid');
@@ -43,30 +57,34 @@ require_capability('mod/chat:chat', $context);
     $groupname = '';
 }
 
-$strchat = get_string('modulename', 'chat'); // must be before current_language() in chat_login_user() to force course language!!!
+$strchat = get_string('modulename', 'chat'); // Must be before current_language() in chat_login_user() to force course language!
 
-if (!$chat_sid = chat_login_user($chat->id, 'sockets', $groupid, $course)) {
+if (!$chatsid = chat_login_user($chat->id, 'sockets', $groupid, $course)) {
     print_error('cantlogin');
 }
 
-$params = "chat_sid=$chat_sid";
+$params = "chat_sid=$chatsid";
 $courseshortname = format_string($course->shortname, true, array('context' => context_course::instance($course->id)));
 
+$chatname = format_string($chat->name, true, array('context' => $context));
+$winchaturl = "http://$CFG->chat_serverhost:$CFG->chat_serverport?win=chat&amp;$params";
+$winusersurl = "http://$CFG->chat_serverhost:$CFG->chat_serverport?win=users&amp;$params"
+
 ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
 <html>
  <head>
   <meta http-equiv="content-type" content="text/html; charset=utf-8" />
   <title>
-   <?php echo "$strchat: " . $courseshortname . ": " . format_string($chat->name, true, array('context' => $context)) . "$groupname" ?>
+   <?php echo "$strchat: " . $courseshortname . ": " . $chatname . "$groupname" ?>
   </title>
  </head>
  <frameset cols="*,200" border="5" framespacing="no" frameborder="yes" marginwidth="2" marginheight="1">
   <frameset rows="0,*,70" border="0" framespacing="no" frameborder="no" marginwidth="2" marginheight="1">
    <frame src="../empty.php" name="empty" scrolling="auto" noresize marginwidth="2" marginheight="0">
-   <frame src="<?php echo "http://$CFG->chat_serverhost:$CFG->chat_serverport?win=chat&amp;$params"; ?>" scrolling="auto" name="msg" noresize marginwidth="2" marginheight="0">
+   <frame src="<?php echo $winchaturl; ?>" scrolling="auto" name="msg" noresize marginwidth="2" marginheight="0">
    <frame src="chatinput.php?<?php echo $params ?>" name="input" scrolling="no" marginwidth="2" marginheight="1">
   </frameset>
-  <frame src="<?php echo "http://$CFG->chat_serverhost:$CFG->chat_serverport?win=users&amp;$params"; ?>" name="users" scrolling="auto" marginwidth="5" marginheight="5">
+  <frame src="<?php echo $winusersurl; ?>" name="users" scrolling="auto" marginwidth="5" marginheight="5">
  </frameset>
  <noframes>
   Sorry, this version of Moodle Chat needs a browser that handles frames.
index 2e743aa..41e2514 100644 (file)
@@ -1,13 +1,27 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 require_once('../../config.php');
 require_once('lib.php');
 
-$id = required_param('id', PARAM_INT);   // course
+$id = required_param('id', PARAM_INT);   // Course.
 
-$PAGE->set_url('/mod/chat/index.php', array('id'=>$id));
+$PAGE->set_url('/mod/chat/index.php', array('id' => $id));
 
-if (! $course = $DB->get_record('course', array('id'=>$id))) {
+if (! $course = $DB->get_record('course', array('id' => $id))) {
     print_error('invalidcourseid');
 }
 
@@ -21,21 +35,18 @@ $event = \mod_chat\event\course_module_instance_list_viewed::create($params);
 $event->add_record_snapshot('course', $course);
 $event->trigger();
 
-/// Get all required strings
-
+// Get all required strings.
 $strchats = get_string('modulenameplural', 'chat');
 $strchat  = get_string('modulename', 'chat');
 
-
-/// Print the header
+// Print the header.
 $PAGE->navbar->add($strchats);
 $PAGE->set_title($strchats);
 $PAGE->set_heading($course->fullname);
 echo $OUTPUT->header();
 echo $OUTPUT->heading($strchats, 2);