Merge branch 'MDL-41125-master' of git://github.com/FMCorz/moodle
authorDan Poltawski <dan@moodle.com>
Thu, 22 Aug 2013 02:32:54 +0000 (10:32 +0800)
committerDan Poltawski <dan@moodle.com>
Thu, 22 Aug 2013 02:32:54 +0000 (10:32 +0800)
238 files changed:
admin/roles/assign.php
admin/roles/check.php
admin/roles/override.php
admin/roles/permissions.php
admin/roles/usersroles.php
backup/backup.php
backup/import.php
backup/moodle2/backup_section_task.class.php
backup/moodle2/restore_stepslib.php
backup/util/checks/backup_check.class.php
blocks/community/communitycourse.php
blocks/completionstatus/details.php
blocks/rss_client/editfeed.php
blocks/rss_client/managefeeds.php
blocks/rss_client/viewfeed.php
calendar/event.php
calendar/lib.php
calendar/preferences.php
course/changenumsections.php
course/dnduploadlib.php
course/editsection.php
course/externallib.php
course/lib.php
course/loginas.php
course/manage.php
course/mod.php
course/modduplicate.php
course/modedit.php
course/publish/backup.php
course/publish/hubselector.php
course/publish/index.php
course/publish/metadata.php
course/report.php
course/resources.php
course/rest.php
course/togglecompletion.php
course/user.php
enrol/ajax.php
enrol/bulkchange.php
enrol/cohort/ajax.php
enrol/cohort/edit.php
enrol/editenrolment.php
enrol/externallib.php
enrol/guest/addinstance.php
enrol/index.php
enrol/instances.php
enrol/manual/ajax.php
enrol/manual/edit.php
enrol/manual/locallib.php
enrol/manual/manage.php
enrol/manual/unenrolself.php
enrol/meta/addinstance.php
enrol/mnet/addinstance.php
enrol/otherusers.php
enrol/paypal/edit.php
enrol/paypal/unenrolself.php
enrol/self/edit.php
enrol/self/lib.php
enrol/self/unenrolself.php
enrol/unenroluser.php
enrol/users.php
file.php
grade/edit/outcome/course.php
grade/edit/outcome/edit.php
grade/edit/outcome/index.php
group/import.php
group/index.php
group/lib.php
group/members.php
lib/accesslib.php
lib/adminlib.php
lib/classes/event/assessable_submitted.php
lib/classes/event/assessable_uploaded.php
lib/classes/event/base.php
lib/classes/event/blog_entry_created.php
lib/classes/event/blog_entry_deleted.php
lib/classes/event/cohort_created.php
lib/classes/event/cohort_deleted.php
lib/classes/event/cohort_member_added.php
lib/classes/event/cohort_member_removed.php
lib/classes/event/cohort_updated.php
lib/classes/event/course_category_deleted.php
lib/classes/event/course_completed.php
lib/classes/event/course_completion_updated.php
lib/classes/event/course_content_deleted.php
lib/classes/event/course_created.php
lib/classes/event/course_deleted.php
lib/classes/event/course_module_completion_updated.php
lib/classes/event/course_restored.php
lib/classes/event/course_section_updated.php
lib/classes/event/course_updated.php
lib/classes/event/role_allow_assign_updated.php
lib/classes/event/role_allow_override_updated.php
lib/classes/event/role_allow_switch_updated.php
lib/classes/event/role_assigned.php
lib/classes/event/role_capabilities_updated.php
lib/classes/event/role_deleted.php
lib/classes/event/role_unassigned.php
lib/classes/event/user_loggedin.php
lib/classes/event/user_loggedinas.php
lib/csslib.php
lib/datalib.php
lib/db/install.php
lib/formslib.php
lib/modinfolib.php
lib/moodlelib.php
lib/navigationlib.php
lib/pagelib.php
lib/tests/accesslib_test.php
lib/tests/csslib_test.php
lib/tests/event_test.php
lib/tests/fixtures/event_fixtures.php
mod/assign/index.php
mod/assign/lib.php
mod/assign/locallib.php
mod/assign/mod_form.php
mod/assign/view.php
mod/book/delete.php
mod/book/edit.php
mod/book/index.php
mod/book/move.php
mod/book/show.php
mod/book/tool/exportimscp/index.php
mod/book/tool/importhtml/index.php
mod/book/tool/print/index.php
mod/book/view.php
mod/chat/gui_ajax/index.php
mod/data/import.php
mod/data/lib.php
mod/data/preset.php
mod/feedback/ajax.php
mod/folder/edit.php
mod/folder/index.php
mod/folder/view.php
mod/forum/discuss.php
mod/forum/lib.php
mod/forum/subscribe.php
mod/forum/subscribers.php
mod/forum/tests/lib_test.php
mod/forum/user.php
mod/glossary/approve.php
mod/glossary/rsslib.php
mod/glossary/showentry.php
mod/glossary/showentry_ajax.php
mod/imscp/index.php
mod/imscp/view.php
mod/lesson/continue.php
mod/lesson/edit.php
mod/lesson/editpage.php
mod/lesson/essay.php
mod/lesson/grade.php
mod/lesson/highscores.php
mod/lesson/import.php
mod/lesson/lesson.php
mod/lesson/mediafile.php
mod/lesson/report.php
mod/lesson/view.php
mod/lti/grade.php
mod/lti/index.php
mod/lti/launch.php
mod/lti/view.php
mod/page/index.php
mod/page/view.php
mod/quiz/attemptlib.php
mod/quiz/cronlib.php
mod/quiz/grade.php
mod/quiz/overridedelete.php
mod/quiz/overrideedit.php
mod/quiz/overrides.php
mod/resource/index.php
mod/resource/view.php
mod/scorm/datamodels/sequencinghandler.php
mod/scorm/lang/en/scorm.php
mod/scorm/lib.php
mod/scorm/loaddatamodel.php
mod/scorm/locallib.php
mod/scorm/mod_form.php
mod/scorm/report.php
mod/scorm/report/graphs/graph.php
mod/scorm/tests/packages/badscorm.zip [new file with mode: 0644]
mod/scorm/tests/packages/invalid.zip [new file with mode: 0644]
mod/scorm/tests/packages/validaicc.zip [new file with mode: 0644]
mod/scorm/tests/packages/validscorm.zip [new file with mode: 0644]
mod/scorm/tests/validatepackage_test.php [new file with mode: 0644]
mod/scorm/userreport.php
mod/url/index.php
mod/url/lib.php
mod/url/view.php
mod/wiki/admin.php
mod/wiki/comments.php
mod/wiki/create.php
mod/wiki/diff.php
mod/wiki/edit.php
mod/wiki/editcomments.php
mod/wiki/files.php
mod/wiki/filesedit.php
mod/wiki/history.php
mod/wiki/instancecomments.php
mod/wiki/lock.php
mod/wiki/map.php
mod/wiki/overridelocks.php
mod/wiki/prettyview.php
mod/wiki/restoreversion.php
mod/wiki/view.php
mod/wiki/viewversion.php
mod/workshop/aggregate.php
mod/workshop/allocation.php
mod/workshop/allocation/scheduled/lib.php
mod/workshop/assessment.php
mod/workshop/editform.php
mod/workshop/editformpreview.php
mod/workshop/exassessment.php
mod/workshop/excompare.php
mod/workshop/exsubmission.php
mod/workshop/index.php
mod/workshop/lib.php
mod/workshop/submission.php
mod/workshop/switchphase.php
mod/workshop/toolbox.php
mod/workshop/view.php
notes/index.php
question/engine/datalib.php
question/type/essay/tests/walkthrough_test.php
report/completion/index.php
report/completion/user.php
report/log/graph.php
report/log/index.php
report/log/user.php
report/loglive/index.php
report/outline/index.php
report/outline/user.php
report/stats/graph.php
report/stats/user.php
user/editadvanced.php
user/index.php
user/repository.php
user/view.php
version.php

index 6549125..cce2334 100644 (file)
@@ -39,7 +39,7 @@ if ($course) {
 } else {
     $isfrontpage = false;
     if ($context->contextlevel == CONTEXT_USER) {
-        $course = get_course(optional_param('courseid', SITEID, PARAM_INT));
+        $course = $DB->get_record('course', array('id'=>optional_param('courseid', SITEID, PARAM_INT)), '*', MUST_EXIST);
         $user = $DB->get_record('user', array('id'=>$context->instanceid), '*', MUST_EXIST);
         $url->param('courseid', $course->id);
         $url->param('userid', $user->id);
index b1da3f5..0590165 100644 (file)
@@ -35,7 +35,7 @@ if ($course) {
 } else {
     $isfrontpage = false;
     if ($context->contextlevel == CONTEXT_USER) {
-        $course = get_course(optional_param('courseid', SITEID, PARAM_INT));
+        $course = $DB->get_record('course', array('id'=>optional_param('courseid', SITEID, PARAM_INT)), '*', MUST_EXIST);
         $user = $DB->get_record('user', array('id'=>$context->instanceid), '*', MUST_EXIST);
         $url->param('courseid', $course->id);
         $url->param('userid', $user->id);
index 35d8164..bc506f1 100644 (file)
@@ -36,7 +36,7 @@ if ($course) {
 } else {
     $isfrontpage = false;
     if ($context->contextlevel == CONTEXT_USER) {
-        $course = get_course(optional_param('courseid', SITEID, PARAM_INT));
+        $course = $DB->get_record('course', array('id'=>optional_param('courseid', SITEID, PARAM_INT)), '*', MUST_EXIST);
         $user = $DB->get_record('user', array('id'=>$context->instanceid), '*', MUST_EXIST);
         $url->param('courseid', $course->id);
         $url->param('userid', $user->id);
index cacc654..cfff956 100644 (file)
@@ -43,7 +43,7 @@ if ($course) {
 } else {
     $isfrontpage = false;
     if ($context->contextlevel == CONTEXT_USER) {
-        $course = get_course(optional_param('courseid', SITEID, PARAM_INT));
+        $course = $DB->get_record('course', array('id'=>optional_param('courseid', SITEID, PARAM_INT)), '*', MUST_EXIST);
         $user = $DB->get_record('user', array('id'=>$context->instanceid), '*', MUST_EXIST);
         $url->param('courseid', $course->id);
         $url->param('userid', $user->id);
index 1845765..c62c979 100644 (file)
@@ -32,7 +32,7 @@ $courseid = required_param('courseid', PARAM_INT);
 
 // Validate them and get the corresponding objects.
 $user = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST);
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 
 $usercontext = context_user::instance($user->id);
 $coursecontext = context_course::instance($course->id);
index b8a52b9..cfe16ef 100644 (file)
@@ -40,7 +40,7 @@ $PAGE->set_pagelayout('admin');
 
 $id = $courseid;
 $cm = null;
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
 $type = backup::TYPE_1COURSE;
 if (!is_null($sectionid)) {
     $section = $DB->get_record('course_sections', array('course'=>$course->id, 'id'=>$sectionid), '*', MUST_EXIST);
index 527d103..fbd919a 100644 (file)
@@ -17,7 +17,7 @@ $searchcourses = optional_param('searchcourses', false, PARAM_BOOL);
 $restoretarget = optional_param('target', backup::TARGET_CURRENT_ADDING, PARAM_INT);
 
 // Load the course and context
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
 $context = context_course::instance($courseid);
 
 // Must pass login
@@ -51,7 +51,7 @@ if ($importcourseid === false || $searchcourses) {
 }
 
 // Load the course +context to import from
-$importcourse = get_course($importcourseid);
+$importcourse = $DB->get_record('course', array('id'=>$importcourseid), '*', MUST_EXIST);
 $importcontext = context_course::instance($importcourseid);
 
 // Make sure the user can backup from that course
index 0144cff..b84d338 100644 (file)
@@ -148,7 +148,7 @@ class backup_section_task extends backup_task {
         // All these are common settings to be shared by all sections
 
         $section = $DB->get_record('course_sections', array('id' => $this->sectionid), '*', MUST_EXIST);
-        $course = get_course($section->course);
+        $course = $DB->get_record('course', array('id' => $section->course), '*', MUST_EXIST);
 
         // Define section_included (to decide if the whole task must be really executed)
         $settingname = $settingprefix . 'included';
index eba8870..2b6cdab 100644 (file)
@@ -1422,7 +1422,7 @@ class restore_course_structure_step extends restore_structure_step {
         }
 
         // Course record ready, update it
-        update_course_record($data);
+        $DB->update_record('course', $data);
 
         course_get_format($data)->update_course_format_options($data);
 
@@ -1632,7 +1632,7 @@ class restore_default_enrolments_step extends restore_execution_step {
     public function define_execution() {
         global $DB;
 
-        $course = get_course($this->get_courseid());
+        $course = $DB->get_record('course', array('id'=>$this->get_courseid()), '*', MUST_EXIST);
 
         if ($DB->record_exists('enrol', array('courseid'=>$this->get_courseid(), 'enrol'=>'manual'))) {
             // Something already added instances, do not add default instances.
@@ -1849,7 +1849,7 @@ class restore_fix_restorer_access_step extends restore_execution_step {
             return;
         }
         if (!$DB->record_exists('enrol', array('enrol'=>'manual', 'courseid'=>$courseid))) {
-            $course = get_course($courseid);
+            $course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
             $fields = array('status'=>ENROL_INSTANCE_ENABLED, 'enrolperiod'=>$enrol->get_config('enrolperiod', 0), 'roleid'=>$enrol->get_config('roleid', 0));
             $enrol->add_instance($course, $fields);
         }
index dc510ac..164da0b 100644 (file)
@@ -109,7 +109,7 @@ abstract class backup_check {
         $typecapstocheck = array();
         switch ($type) {
             case backup::TYPE_1COURSE :
-                get_course($id); // course exists
+                $DB->get_record('course', array('id' => $id), '*', MUST_EXIST); // course exists
                 $typecapstocheck['moodle/backup:backupcourse'] = $coursectx;
                 break;
             case backup::TYPE_1SECTION :
index 62d1893..fe21d76 100644 (file)
@@ -34,7 +34,7 @@ require_once($CFG->dirroot . '/' . $CFG->admin . '/registration/lib.php');
 
 require_login();
 $courseid = required_param('courseid', PARAM_INT); //if no courseid is given
-$parentcourse = get_course($courseid);
+$parentcourse = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 
 $context = context_course::instance($courseid);
 $PAGE->set_course($parentcourse);
index bcb1739..be4cd2f 100644 (file)
@@ -32,7 +32,7 @@ $id = required_param('course', PARAM_INT);
 $userid = optional_param('user', 0, PARAM_INT);
 
 // Load course.
-$course = get_course($id);
+$course = $DB->get_record('course', array('id' => $id), '*', MUST_EXIST);
 
 // Load user.
 if ($userid) {
index 2bafefe..110c4d2 100644 (file)
@@ -154,7 +154,7 @@ if ($courseid == SITEID) {
     $courseid = 0;
 }
 if ($courseid) {
-    $course = get_course($courseid);
+    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
     $PAGE->set_course($course);
     $context = $PAGE->context;
 } else {
index 1212605..2252bc9 100644 (file)
@@ -36,7 +36,7 @@ if ($courseid == SITEID) {
     $courseid = 0;
 }
 if ($courseid) {
-    $course = get_course($courseid);
+    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
     $PAGE->set_course($course);
     $context = $PAGE->context;
 } else {
index f269496..1c287d7 100644 (file)
@@ -39,7 +39,7 @@ if ($courseid = SITEID) {
     $courseid = 0;
 }
 if ($courseid) {
-    $course = get_course($courseid);
+    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
     $PAGE->set_course($course);
     $context = $PAGE->context;
 } else {
index f0b1bd9..027527b 100644 (file)
@@ -81,7 +81,7 @@ $PAGE->set_url($url);
 $PAGE->set_pagelayout('standard');
 
 if ($courseid != SITEID && !empty($courseid)) {
-    $course = get_course($courseid);
+    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
     $courses = array($course->id => $course);
     $issite = false;
 } else {
index 00e3174..7fed0c0 100644 (file)
@@ -1811,7 +1811,7 @@ function calendar_get_allowed_types(&$allowed, $course = null) {
 
     if (!empty($course)) {
         if (!is_object($course)) {
-            $course = get_course($course);
+            $course = $DB->get_record('course', array('id' => $course), '*', MUST_EXIST);
         }
         if ($course->id != SITEID) {
             $coursecontext = context_course::instance($course->id);
index 7114d71..165466d 100644 (file)
@@ -7,7 +7,7 @@ require_once($CFG->dirroot.'/calendar/lib.php');
 require_once($CFG->dirroot.'/calendar/preferences_form.php');
 
 $courseid = required_param('course', PARAM_INT);
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 
 $PAGE->set_url(new moodle_url('/calendar/preferences.php', array('course' => $courseid)));
 $PAGE->set_pagelayout('standard');
index f11728b..deed367 100644 (file)
@@ -30,7 +30,7 @@ require_once($CFG->dirroot.'/course/lib.php');
 
 $courseid = required_param('courseid', PARAM_INT);
 $increase = optional_param('increase', true, PARAM_BOOL);
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 $courseformatoptions = course_get_format($course)->get_format_options();
 
 $PAGE->set_url('/course/changenumsections.php', array('courseid' => $courseid));
index 506a778..917d670 100644 (file)
@@ -460,7 +460,7 @@ class dndupload_ajax_processor {
             throw new coding_exception('dndupload_ajax_processor should only be used within AJAX requests');
         }
 
-        $this->course = get_course($courseid);
+        $this->course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 
         require_login($this->course, false);
         $this->context = context_course::instance($this->course->id);
index 2385987..54db939 100644 (file)
@@ -25,6 +25,7 @@
 
 require_once("../config.php");
 require_once("lib.php");
+require_once($CFG->libdir . '/formslib.php');
 require_once($CFG->libdir . '/conditionlib.php');
 
 $id = required_param('id', PARAM_INT);    // course_sections.id
@@ -33,7 +34,7 @@ $sectionreturn = optional_param('sr', 0, PARAM_INT);
 $PAGE->set_url('/course/editsection.php', array('id'=>$id, 'sr'=> $sectionreturn));
 
 $section = $DB->get_record('course_sections', array('id' => $id), '*', MUST_EXIST);
-$course = get_course($section->course);
+$course = $DB->get_record('course', array('id' => $section->course), '*', MUST_EXIST);
 $sectionnum = $section->section;
 
 require_login($course);
index 31d7f73..61232fd 100644 (file)
@@ -67,7 +67,7 @@ class core_course_external extends external_api {
      * @since Moodle 2.2
      */
     public static function get_course_contents($courseid, $options = array()) {
-        global $CFG;
+        global $CFG, $DB;
         require_once($CFG->dirroot . "/course/lib.php");
 
         //validate parameter
@@ -75,7 +75,7 @@ class core_course_external extends external_api {
                         array('courseid' => $courseid, 'options' => $options));
 
         //retrieve the course
-        $course = get_course($params['courseid']);
+        $course = $DB->get_record('course', array('id' => $params['courseid']), '*', MUST_EXIST);
 
         //check course format exist
         if (!file_exists($CFG->dirroot . '/course/format/' . $course->format . '/lib.php')) {
@@ -848,7 +848,7 @@ class core_course_external extends external_api {
         $transaction = $DB->start_delegated_transaction();
 
         foreach ($params['courseids'] as $courseid) {
-            $course = get_course($courseid);
+            $course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
 
             // Check if the context is valid.
             $coursecontext = context_course::instance($course->id);
@@ -1077,13 +1077,13 @@ class core_course_external extends external_api {
         $rc->execute_plan();
         $rc->destroy();
 
-        $course = get_course($newcourseid);
+        $course = $DB->get_record('course', array('id' => $newcourseid), '*', MUST_EXIST);
         $course->fullname = $params['fullname'];
         $course->shortname = $params['shortname'];
         $course->visible = $params['visible'];
 
         // Set shortname and fullname back.
-        update_course_record($course);
+        $DB->update_record('course', $course);
 
         if (empty($CFG->keeptempdirectoriesonbackup)) {
             fulldelete($backupbasepath);
index 2c77775..e1e1240 100644 (file)
@@ -958,7 +958,9 @@ function get_array_of_activities($courseid) {
                                    $mod[$seq]->extraclasses = $info->extraclasses;
                                }
                                if (!empty($info->iconurl)) {
-                                   $mod[$seq]->iconurl = $info->iconurl;
+                                   // Convert URL to string as it's easier to store. Also serialized object contains \0 byte and can not be written to Postgres DB.
+                                   $url = new moodle_url($info->iconurl);
+                                   $mod[$seq]->iconurl = $url->out(false);
                                }
                                if (!empty($info->onclick)) {
                                    $mod[$seq]->onclick = $info->onclick;
@@ -2052,7 +2054,7 @@ function move_courses($courseids, $categoryid) {
                 $course->visible = 0;
             }
 
-            update_course_record($course);
+            $DB->update_record('course', $course);
 
             // Store the context.
             $context = context_course::instance($course->id);
@@ -2383,7 +2385,7 @@ function update_course($data, $editoroptions = NULL) {
     }
 
     // Update with the new data
-    update_course_record($data);
+    $DB->update_record('course', $data);
     // make sure the modinfo cache is reset
     rebuild_course_cache($data->id);
 
@@ -3083,7 +3085,7 @@ function course_get_url($courseorid, $section = null, $options = array()) {
  * @return object the created module info
  */
 function create_module($moduleinfo) {
-    global $CFG;
+    global $DB, $CFG;
 
     require_once($CFG->dirroot . '/course/modlib.php');
 
@@ -3099,7 +3101,7 @@ function create_module($moduleinfo) {
     }
 
     // Some additional checks (capability / existing instances).
-    $course = get_course($moduleinfo->course);
+    $course = $DB->get_record('course', array('id'=>$moduleinfo->course), '*', MUST_EXIST);
     list($module, $context, $cw) = can_add_moduleinfo($course, $moduleinfo->modulename, $moduleinfo->section);
 
     // Load module library.
@@ -3123,7 +3125,7 @@ function create_module($moduleinfo) {
  * @return object the updated module info
  */
 function update_module($moduleinfo) {
-    global $CFG;
+    global $DB, $CFG;
 
     require_once($CFG->dirroot . '/course/modlib.php');
 
@@ -3131,7 +3133,7 @@ function update_module($moduleinfo) {
     $cm = get_coursemodule_from_id('', $moduleinfo->coursemodule, 0, false, MUST_EXIST);
 
     // Check the course exists.
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 
     // Some checks (capaibility / existing instances).
     list($cm, $context, $module, $data, $cw) = can_update_moduleinfo($cm);
index a608a72..97f7d2a 100644 (file)
@@ -33,7 +33,7 @@ if ($redirect) {
 $userid = required_param('user', PARAM_INT);
 
 require_sesskey();
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 
 // User must be logged in.
 
index 1a66a73..4888c0a 100644 (file)
@@ -237,17 +237,17 @@ if (!empty($moveto) && ($data = data_submitted()) && confirm_sesskey()) {
 if ((!empty($hide) or !empty($show)) && confirm_sesskey()) {
     // Hide or show a course.
     if (!empty($hide)) {
-        $course = get_course($hide);
+        $course = $DB->get_record('course', array('id' => $hide), '*', MUST_EXIST);
         $visible = 0;
     } else {
-        $course = get_course($show);
+        $course = $DB->get_record('course', array('id' => $show), '*', MUST_EXIST);
         $visible = 1;
     }
     $coursecontext = context_course::instance($course->id);
     require_capability('moodle/course:visibility', $coursecontext);
     // Set the visibility of the course. we set the old flag when user manually changes visibility of course.
     $params = array('id' => $course->id, 'visible' => $visible, 'visibleold' => $visible, 'timemodified' => time());
-    update_course_record((object)$params);
+    $DB->update_record('course', $params);
     cache_helper::purge_by_event('changesincourse');
 
     // Update the course object we pass to the event class.
index 12f2dfc..1ea8b78 100644 (file)
@@ -80,7 +80,7 @@ if (!empty($add)) {
 
 } else if (!empty($duplicate)) {
     $cm     = get_coursemodule_from_id('', $duplicate, 0, true, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
 
     require_login($course, false, $cm);
     $coursecontext = context_course::instance($course->id);
@@ -117,7 +117,7 @@ if (!empty($add)) {
 
 } else if (!empty($delete)) {
     $cm     = get_coursemodule_from_id('', $delete, 0, true, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
 
     require_login($course, false, $cm);
     $modcontext = context_module::instance($cm->id);
@@ -158,7 +158,7 @@ if (!empty($add)) {
 
 if ((!empty($movetosection) or !empty($moveto)) and confirm_sesskey()) {
     $cm     = get_coursemodule_from_id('', $USER->activitycopy, 0, true, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
 
     require_login($course, false, $cm);
     $coursecontext = context_course::instance($course->id);
@@ -198,7 +198,7 @@ if ((!empty($movetosection) or !empty($moveto)) and confirm_sesskey()) {
     $id = required_param('id', PARAM_INT);
 
     $cm     = get_coursemodule_from_id('', $id, 0, true, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
 
     require_login($course, false, $cm);
     $coursecontext = context_course::instance($course->id);
@@ -219,7 +219,7 @@ if ((!empty($movetosection) or !empty($moveto)) and confirm_sesskey()) {
 
 } else if (!empty($hide) and confirm_sesskey()) {
     $cm     = get_coursemodule_from_id('', $hide, 0, true, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
 
     require_login($course, false, $cm);
     $coursecontext = context_course::instance($course->id);
@@ -232,7 +232,7 @@ if ((!empty($movetosection) or !empty($moveto)) and confirm_sesskey()) {
 
 } else if (!empty($show) and confirm_sesskey()) {
     $cm     = get_coursemodule_from_id('', $show, 0, true, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
 
     require_login($course, false, $cm);
     $coursecontext = context_course::instance($course->id);
@@ -253,7 +253,7 @@ if ((!empty($movetosection) or !empty($moveto)) and confirm_sesskey()) {
     $id = required_param('id', PARAM_INT);
 
     $cm     = get_coursemodule_from_id('', $id, 0, true, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
 
     require_login($course, false, $cm);
     $coursecontext = context_course::instance($course->id);
@@ -266,7 +266,7 @@ if ((!empty($movetosection) or !empty($moveto)) and confirm_sesskey()) {
 
 } else if (!empty($copy) and confirm_sesskey()) { // value = course module
     $cm     = get_coursemodule_from_id('', $copy, 0, true, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
 
     require_login($course, false, $cm);
     $coursecontext = context_course::instance($course->id);
@@ -285,7 +285,7 @@ if ((!empty($movetosection) or !empty($moveto)) and confirm_sesskey()) {
 } else if (!empty($cancelcopy) and confirm_sesskey()) { // value = course module
 
     $courseid = $USER->activitycopycourse;
-    $course = get_course($courseid);
+    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 
     $cm     = get_coursemodule_from_id('', $USER->activitycopy, 0, true, IGNORE_MISSING);
     $sectionreturn = $USER->activitycopysectionreturn;
index 6432b20..7247671 100644 (file)
@@ -36,7 +36,7 @@ $cmid           = required_param('cmid', PARAM_INT);
 $courseid       = required_param('course', PARAM_INT);
 $sectionreturn  = optional_param('sr', null, PARAM_INT);
 
-$course     = get_course($courseid);
+$course     = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 $cm         = get_coursemodule_from_id('', $cmid, $course->id, true, MUST_EXIST);
 $cmcontext  = context_module::instance($cm->id);
 $context    = context_course::instance($courseid);
index 5918614..8cfe0a0 100644 (file)
@@ -53,7 +53,7 @@ if (!empty($add)) {
     $url->param('course', $course);
     $PAGE->set_url($url);
 
-    $course = get_course($course);
+    $course = $DB->get_record('course', array('id'=>$course), '*', MUST_EXIST);
     require_login($course);
 
     list($module, $context, $cw) = can_add_moduleinfo($course, $add, $section);
@@ -124,7 +124,7 @@ if (!empty($add)) {
     $cm = get_coursemodule_from_id('', $update, 0, false, MUST_EXIST);
 
     // Check the course exists.
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 
     // require_login
     require_login($course, false, $cm); // needed to setup proper $COURSE
index d5cc313..15e091a 100644 (file)
@@ -45,7 +45,7 @@ $huburl = required_param('huburl', PARAM_URL);
 $hubname = optional_param('hubname', '', PARAM_TEXT);
 
 //some permissions and parameters checking
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 require_login($course);
 if (!has_capability('moodle/course:publish', context_course::instance($id))
         or !confirm_sesskey()) {
index 74181c2..095e33b 100644 (file)
@@ -30,7 +30,7 @@ require_once($CFG->dirroot.'/' . $CFG->admin . '/registration/lib.php');
 require_once($CFG->dirroot.'/course/publish/forms.php');
 
 $id = required_param('id', PARAM_INT);
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 require_login($course);
 
 $PAGE->set_url('/course/publish/hubselector.php', array('id' => $course->id));
index b100fbe..2e11f5b 100644 (file)
@@ -34,7 +34,7 @@ $id = required_param('id', PARAM_INT);
 $hubname = optional_param('hubname', 0, PARAM_TEXT);
 $huburl = optional_param('huburl', 0, PARAM_URL);
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 
 require_login($course);
 $context = context_course::instance($course->id);
index 4e5e1fc..298e5f3 100644 (file)
@@ -40,7 +40,7 @@ require_once($CFG->libdir . '/filelib.php');
 //check user access capability to this page
 $id = required_param('id', PARAM_INT);
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id' => $id), '*', MUST_EXIST);
 require_login($course);
 
 //page settings
index d604d66..90b51b8 100644 (file)
@@ -4,7 +4,7 @@
     require_once('../config.php');
 
     $id = required_param('id', PARAM_INT);   // course id to import TO
-    $course = get_course($id);
+    $course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 
     $PAGE->set_pagelayout('standard');
     require_login($course);
index 45e94a9..d0235f5 100644 (file)
@@ -28,7 +28,7 @@ require_once("$CFG->libdir/resourcelib.php");
 
 $id = required_param('id', PARAM_INT); // course id
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $PAGE->set_pagelayout('course');
 require_course_login($course, true);
 
index a926511..4bae0b0 100644 (file)
@@ -49,7 +49,7 @@ $PAGE->set_url('/course/rest.php', array('courseId'=>$courseid,'class'=>$class))
 
 //NOTE: when making any changes here please make sure it is using the same access control as course/mod.php !!
 
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 // Check user is logged in and set contexts if we are dealing with resource
 if (in_array($class, array('resource'))) {
     $cm = get_coursemodule_from_id(null, $id, $course->id, false, MUST_EXIST);
index 6c58d7b..53992db 100644 (file)
@@ -40,7 +40,7 @@ if ($courseid) {
     $PAGE->set_url(new moodle_url('/course/togglecompletion.php', array('course'=>$courseid)));
 
     // Check user is logged in
-    $course = get_course($courseid);
+    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
     $context = context_course::instance($course->id);
     require_login($course);
 
@@ -129,7 +129,7 @@ switch($targetstate) {
 
 // Get course-modules entry
 $cm = get_coursemodule_from_id(null, $cmid, null, true, MUST_EXIST);
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 
 // Check user is logged in
 require_login($course, false, $cm);
index 49c5859..73839e1 100644 (file)
@@ -31,7 +31,7 @@ $mode    = optional_param('mode', "todaylogs", PARAM_ALPHA);
 
 $url = new moodle_url('/course/user.php', array('id'=>$id,'user'=>$user, 'mode'=>$mode));
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $user = $DB->get_record("user", array("id"=>$user, 'deleted'=>0), '*', MUST_EXIST);
 
 if ($mode === 'outline' or $mode === 'complete') {
index 21c86c9..2d41a98 100644 (file)
@@ -38,7 +38,7 @@ $action  = required_param('action', PARAM_ALPHANUMEXT);
 
 $PAGE->set_url(new moodle_url('/enrol/ajax.php', array('id'=>$id, 'action'=>$action)));
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 if ($course->id == SITEID) {
index c5f1ea9..1d451ae 100644 (file)
@@ -34,7 +34,7 @@ $userids    = required_param_array('bulkuser', PARAM_INT);
 $action     = optional_param('action', '', PARAM_ALPHANUMEXT);
 $filter     = optional_param('ifilter', 0, PARAM_INT);
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 if ($course->id == SITEID) {
index ec58e65..e987f87 100644 (file)
@@ -38,7 +38,7 @@ $action  = required_param('action', PARAM_ALPHANUMEXT);
 
 $PAGE->set_url(new moodle_url('/enrol/cohort/ajax.php', array('id'=>$id, 'action'=>$action)));
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 if ($course->id == SITEID) {
index 99c90b8..050bdff 100644 (file)
@@ -30,7 +30,7 @@ require_once("$CFG->dirroot/group/lib.php");
 $courseid = required_param('courseid', PARAM_INT);
 $instanceid = optional_param('id', 0, PARAM_INT);
 
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 require_login($course);
index 6fa1016..8b6f54e 100644 (file)
@@ -38,7 +38,7 @@ $filter = optional_param('ifilter', 0, PARAM_INT); // Table filter for return ur
 $ue = $DB->get_record('user_enrolments', array('id' => $ueid), '*', MUST_EXIST);
 $user = $DB->get_record('user', array('id'=>$ue->userid), '*', MUST_EXIST);
 $instance = $DB->get_record('enrol', array('id'=>$ue->enrolid), '*', MUST_EXIST);
-$course = get_course($instance->courseid);
+$course = $DB->get_record('course', array('id'=>$instance->courseid), '*', MUST_EXIST);
 
 // The URL of the enrolled users page for the course.
 $usersurl = new moodle_url('/enrol/users.php', array('id' => $course->id));
index 980e3d5..ddfb976 100644 (file)
@@ -124,7 +124,7 @@ class core_enrol_external extends external_api {
 
         foreach ($params['coursecapabilities'] as $coursecapability) {
             $courseid = $coursecapability['courseid'];
-            $course = get_course($courseid);
+            $course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
             $coursecontext = context_course::instance($courseid);
             if (!$coursecontext) {
                 throw new moodle_exception('cannotfindcourse', 'error', '', null,
@@ -423,7 +423,7 @@ class core_enrol_external extends external_api {
             }
         }
 
-        $course = get_course($courseid);
+        $course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
         $coursecontext = context_course::instance($courseid, IGNORE_MISSING);
         if ($courseid == SITEID) {
             $context = context_system::instance();
index 51770dc..faa0531 100644 (file)
@@ -26,7 +26,7 @@ require('../../config.php');
 
 $id = required_param('id', PARAM_INT); // course id
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 require_login($course);
index 6bf65c3..d0e91b5 100644 (file)
@@ -33,7 +33,7 @@ if (!isloggedin()) {
     redirect(get_login_url());
 }
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 // Everybody is enrolled on the frontpage
index bdc2338..0ad5d2c 100644 (file)
@@ -29,7 +29,7 @@ $action     = optional_param('action', '', PARAM_ALPHANUMEXT);
 $instanceid = optional_param('instance', 0, PARAM_INT);
 $confirm    = optional_param('confirm', 0, PARAM_BOOL);
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 if ($course->id == SITEID) {
index 18f4a25..c1a6f80 100644 (file)
@@ -36,7 +36,7 @@ $action  = required_param('action', PARAM_ALPHANUMEXT);
 
 $PAGE->set_url(new moodle_url('/enrol/ajax.php', array('id'=>$id, 'action'=>$action)));
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 if ($course->id == SITEID) {
index 12c8aee..d6d01e2 100644 (file)
@@ -28,7 +28,7 @@ require_once('edit_form.php');
 
 $courseid = required_param('courseid', PARAM_INT);
 
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 require_login($course);
index 067131f..5c3e345 100644 (file)
@@ -389,7 +389,7 @@ function enrol_manual_migrate_plugin_enrolments($enrol) {
         $minstance = false;
         if (!$e->mid) {
             // Manual instance does not exist yet, add a new one.
-            $course = get_course($e->courseid);
+            $course = $DB->get_record('course', array('id'=>$e->courseid), '*', MUST_EXIST);
             if ($minstance = $DB->get_record('enrol', array('courseid'=>$course->id, 'enrol'=>'manual'))) {
                 // Already created by previous iteration.
                 $e->mid = $minstance->id;
index 76892cd..7d91e4b 100644 (file)
@@ -31,7 +31,7 @@ $extendperiod = optional_param('extendperiod', 0, PARAM_INT);
 $extendbase   = optional_param('extendbase', 3, PARAM_INT);
 
 $instance = $DB->get_record('enrol', array('id'=>$enrolid, 'enrol'=>'manual'), '*', MUST_EXIST);
-$course = get_course($instance->courseid);
+$course = $DB->get_record('course', array('id'=>$instance->courseid), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 require_login($course);
index 472fcf0..c7304fb 100644 (file)
@@ -28,7 +28,7 @@ $enrolid = required_param('enrolid', PARAM_INT);
 $confirm = optional_param('confirm', 0, PARAM_BOOL);
 
 $instance = $DB->get_record('enrol', array('id'=>$enrolid, 'enrol'=>'manual'), '*', MUST_EXIST);
-$course = get_course($instance->courseid);
+$course = $DB->get_record('course', array('id'=>$instance->courseid), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 require_login();
index cfcb20b..ac2f2ff 100644 (file)
@@ -28,7 +28,7 @@ require_once("$CFG->dirroot/enrol/meta/locallib.php");
 
 $id = required_param('id', PARAM_INT); // course id
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 $PAGE->set_url('/enrol/meta/addinstance.php', array('id'=>$course->id));
index 2dbf0a9..9678b40 100644 (file)
@@ -28,7 +28,7 @@ require_once($CFG->dirroot.'/mnet/service/enrol/locallib.php');
 
 $id = required_param('id', PARAM_INT); // course id
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 require_login($course);
index 7052bcd..063d5b4 100644 (file)
@@ -31,7 +31,7 @@ $id      = required_param('id', PARAM_INT); // course id
 $action  = optional_param('action', '', PARAM_ALPHANUMEXT);
 $filter  = optional_param('ifilter', 0, PARAM_INT);
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 require_login($course);
index 52a111a..6175b3b 100644 (file)
@@ -29,7 +29,7 @@ require_once('edit_form.php');
 $courseid   = required_param('courseid', PARAM_INT);
 $instanceid = optional_param('id', 0, PARAM_INT); // instanceid
 
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 require_login($course);
index a305004..8fd16d2 100644 (file)
@@ -28,7 +28,7 @@ $enrolid = required_param('enrolid', PARAM_INT);
 $confirm = optional_param('confirm', 0, PARAM_BOOL);
 
 $instance = $DB->get_record('enrol', array('id'=>$enrolid, 'enrol'=>'paypal'), '*', MUST_EXIST);
-$course = get_course($instance->courseid);
+$course = $DB->get_record('course', array('id'=>$instance->courseid), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 require_login();
index c88553e..a339b8e 100644 (file)
@@ -29,7 +29,7 @@ require_once('edit_form.php');
 $courseid   = required_param('courseid', PARAM_INT);
 $instanceid = optional_param('id', 0, PARAM_INT);
 
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 require_login($course);
index c823595..9b0fa48 100644 (file)
@@ -397,7 +397,7 @@ class enrol_self_plugin extends enrol_plugin {
     protected function email_welcome_message($instance, $user) {
         global $CFG, $DB;
 
-        $course = get_course($instance->courseid);
+        $course = $DB->get_record('course', array('id'=>$instance->courseid), '*', MUST_EXIST);
         $context = context_course::instance($course->id);
 
         $a = new stdClass();
index 906d072..7e7d269 100644 (file)
@@ -28,7 +28,7 @@ $enrolid = required_param('enrolid', PARAM_INT);
 $confirm = optional_param('confirm', 0, PARAM_BOOL);
 
 $instance = $DB->get_record('enrol', array('id'=>$enrolid, 'enrol'=>'self'), '*', MUST_EXIST);
-$course = get_course($instance->courseid);
+$course = $DB->get_record('course', array('id'=>$instance->courseid), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 require_login();
index 8428dcb..9903391 100644 (file)
@@ -36,7 +36,7 @@ $filter  = optional_param('ifilter', 0, PARAM_INT);
 $ue = $DB->get_record('user_enrolments', array('id' => $ueid), '*', MUST_EXIST);
 $user = $DB->get_record('user', array('id'=>$ue->userid), '*', MUST_EXIST);
 $instance = $DB->get_record('enrol', array('id'=>$ue->enrolid), '*', MUST_EXIST);
-$course = get_course($instance->courseid);
+$course = $DB->get_record('course', array('id'=>$instance->courseid), '*', MUST_EXIST);
 
 $context = context_course::instance($course->id);
 
index 78d0d53..c01e361 100644 (file)
@@ -41,7 +41,7 @@ if (optional_param('resetbutton', '', PARAM_RAW) !== '') {
     redirect('users.php?id=' . $id);
 }
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 $context = context_course::instance($course->id, MUST_EXIST);
 
 if ($course->id == SITEID) {
index 410a835..fce3f78 100644 (file)
--- a/file.php
+++ b/file.php
@@ -63,7 +63,7 @@ $courseid = (int)array_shift($args);
 $relativepath = implode('/', $args);
 
 // security: limit access to existing course subdirectories
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
 
 if ($course->legacyfiles != 2) {
     // course files disabled
index 0bdcf88..b23dc99 100644 (file)
@@ -30,7 +30,7 @@ $courseid = required_param('id', PARAM_INT);
 
 $PAGE->set_url('/grade/edit/outcome/course.php', array('id'=>$courseid));
 
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 
 /// Make sure they can even access this course
 require_login($course);
index f5aa234..2d2c670 100644 (file)
@@ -75,7 +75,7 @@ if ($id) {
 } else if ($courseid){
     $heading = get_string('addoutcome', 'grades');
     /// adding new outcome from course
-    $course = get_course($courseid);
+    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
     require_login($course);
     $context = context_course::instance($course->id);
     require_capability('moodle/grade:manage', $context);
index 81bbe3f..658d5ce 100644 (file)
@@ -34,7 +34,7 @@ $PAGE->set_pagelayout('admin');
 
 /// Make sure they can even access this course
 if ($courseid) {
-    $course = get_course($courseid);
+    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
     require_login($course);
     $context = context_course::instance($course->id);
     require_capability('moodle/grade:manageoutcomes', $context);
index 756533f..a4d351b 100644 (file)
@@ -30,7 +30,7 @@ include_once('import_form.php');
 
 $id = required_param('id', PARAM_INT);    // Course id
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 
 $PAGE->set_url('/group/import.php', array('id'=>$id));
 
index e5fe042..1511619 100644 (file)
@@ -42,7 +42,7 @@ $returnurl = $CFG->wwwroot.'/group/index.php?id='.$courseid;
 // Get the course information so we can print the header and
 // check the course id is valid
 
-$course = get_course($courseid);
+$course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
 
 $url = new moodle_url('/group/index.php', array('id'=>$courseid));
 if ($userid) {
index 4477cff..f3f2f7e 100644 (file)
@@ -218,7 +218,7 @@ function groups_create_group($data, $editform = false, $editoroptions = false) {
     global $CFG, $DB;
 
     //check that courseid exists
-    $course = get_course($data->courseid);
+    $course = $DB->get_record('course', array('id' => $data->courseid), '*', MUST_EXIST);
     $context = context_course::instance($course->id);
 
     $data->timecreated  = time();
index 91a786f..9a013bd 100644 (file)
@@ -32,7 +32,7 @@ $groupid = required_param('group', PARAM_INT);
 $cancel  = optional_param('cancel', false, PARAM_BOOL);
 
 $group = $DB->get_record('groups', array('id'=>$groupid), '*', MUST_EXIST);
-$course = get_course($group->courseid);
+$course = $DB->get_record('course', array('id'=>$group->courseid), '*', MUST_EXIST);
 
 $PAGE->set_url('/group/members.php', array('group'=>$groupid));
 $PAGE->set_pagelayout('admin');
index 677e2ac..386588a 100644 (file)
@@ -1428,25 +1428,27 @@ function get_local_override($roleid, $contextid, $capability) {
  * @return array of ($context, $course, $cm)
  */
 function get_context_info_array($contextid) {
+    global $DB;
+
     $context = context::instance_by_id($contextid, MUST_EXIST);
     $course  = null;
     $cm      = null;
 
     if ($context->contextlevel == CONTEXT_COURSE) {
-        $course = get_course($context->instanceid);
+        $course = $DB->get_record('course', array('id'=>$context->instanceid), '*', MUST_EXIST);
 
     } else if ($context->contextlevel == CONTEXT_MODULE) {
         $cm = get_coursemodule_from_id('', $context->instanceid, 0, false, MUST_EXIST);
-        $course = get_course($cm->course);
+        $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 
     } else if ($context->contextlevel == CONTEXT_BLOCK) {
         $parent = $context->get_parent_context();
 
         if ($parent->contextlevel == CONTEXT_COURSE) {
-            $course = get_course($parent->instanceid);
+            $course = $DB->get_record('course', array('id'=>$parent->instanceid), '*', MUST_EXIST);
         } else if ($parent->contextlevel == CONTEXT_MODULE) {
             $cm = get_coursemodule_from_id('', $parent->instanceid, 0, false, MUST_EXIST);
-            $course = get_course($cm->course);
+            $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
         }
     }
 
index dc3035b..5d209bd 100644 (file)
@@ -3578,7 +3578,7 @@ class admin_setting_sitesetselect extends admin_setting_configselect {
      * @return string empty or error message
      */
     public function write_setting($data) {
-        global $SITE, $COURSE;
+        global $DB, $SITE, $COURSE;
         if (!in_array($data, array_keys($this->choices))) {
             return get_string('errorsetting', 'admin');
         }
@@ -3589,16 +3589,17 @@ class admin_setting_sitesetselect extends admin_setting_configselect {
         $record->timemodified = time();
 
         course_get_format($SITE)->update_course_format_options($record);
-        update_course_record($record);
+        $DB->update_record('course', $record);
 
         // Reset caches.
-        $SITE = get_course($SITE->id);
+        $SITE = $DB->get_record('course', array('id'=>$SITE->id), '*', MUST_EXIST);
         if ($SITE->id == $COURSE->id) {
             $COURSE = $SITE;
         }
         format_base::reset_course_cache($SITE->id);
 
         return '';
+
     }
 }
 
@@ -3780,21 +3781,22 @@ class admin_setting_sitesetcheckbox extends admin_setting_configcheckbox {
      * @return string empty string or error message
      */
     public function write_setting($data) {
-        global $SITE, $COURSE;
+        global $DB, $SITE, $COURSE;
         $record = new stdClass();
         $record->id            = $SITE->id;
         $record->{$this->name} = ($data == '1' ? 1 : 0);
         $record->timemodified  = time();
 
         course_get_format($SITE)->update_course_format_options($record);
-        update_course_record($record);
+        $DB->update_record('course', $record);
 
         // Reset caches.
-        $SITE = get_course($SITE->id);
+        $SITE = $DB->get_record('course', array('id'=>$SITE->id), '*', MUST_EXIST);
         if ($SITE->id == $COURSE->id) {
             $COURSE = $SITE;
         }
         format_base::reset_course_cache($SITE->id);
+
         return '';
     }
 }
@@ -3841,7 +3843,7 @@ class admin_setting_sitesettext extends admin_setting_configtext {
      * @return string empty or error message
      */
     public function write_setting($data) {
-        global $SITE, $COURSE;
+        global $DB, $SITE, $COURSE;
         $data = trim($data);
         $validated = $this->validate($data);
         if ($validated !== true) {
@@ -3854,14 +3856,15 @@ class admin_setting_sitesettext extends admin_setting_configtext {
         $record->timemodified  = time();
 
         course_get_format($SITE)->update_course_format_options($record);
-        update_course_record($record);
+        $DB->update_record('course', $record);
 
         // Reset caches.
-        $SITE = get_course($SITE->id);
+        $SITE = $DB->get_record('course', array('id'=>$SITE->id), '*', MUST_EXIST);
         if ($SITE->id == $COURSE->id) {
             $COURSE = $SITE;
         }
         format_base::reset_course_cache($SITE->id);
+
         return '';
     }
 }
@@ -3904,7 +3907,7 @@ class admin_setting_special_frontpagedesc extends admin_setting {
         $record->timemodified  = time();
 
         course_get_format($SITE)->update_course_format_options($record);
-        update_course_record($record);
+        $DB->update_record('course', $record);
 
         // Reset caches.
         $SITE = $DB->get_record('course', array('id'=>$SITE->id), '*', MUST_EXIST);
index e206117..a889e3e 100644 (file)
@@ -49,7 +49,7 @@ abstract class assessable_submitted extends \core\event\base {
      */
     protected function init() {
         $this->data['crud'] = 'u';
-        $this->data['level'] = 50;          // TODO MDL-37658.
+        $this->data['level'] = self::LEVEL_PARTICIPATING;
     }
 
     /**
index bfd6a5e..4e4ed8d 100644 (file)
@@ -49,7 +49,7 @@ abstract class assessable_uploaded extends \core\event\base {
      */
     protected function init() {
         $this->data['crud'] = 'c';
-        $this->data['level'] = 50;          // TODO MDL-37658.
+        $this->data['level'] = self::LEVEL_PARTICIPATING;
     }
 
     /**
index f520fdd..0660cf2 100644 (file)
@@ -50,6 +50,27 @@ namespace core\event;
  * @property-read int $timecreated
  */
 abstract class base implements \IteratorAggregate {
+
+    /**
+     * Other level.
+     */
+    const LEVEL_OTHER = 0;
+
+    /**
+     * Teaching level.
+     *
+     * Any event that is performed by someone (typically a teacher) and has a teaching value,
+     * anything that is affecting the learning experience/environment of the students.
+     */
+    const LEVEL_TEACHING = 1;
+
+    /**
+     * Participating level.
+     *
+     * Any event that is performed by a user, and is related (or could be related) to his learning experience.
+     */
+    const LEVEL_PARTICIPATING = 2;
+
     /** @var array event data */
     protected $data;
 
@@ -208,8 +229,8 @@ abstract class base implements \IteratorAggregate {
      * Override in subclass.
      *
      * Set all required data properties:
-     *  1/ crud - letter [crud]     TODO: MDL-37658
-     *  2/ level - number 1...100   TODO: MDL-37658
+     *  1/ crud - letter [crud]
+     *  2/ level - using a constant self::LEVEL_*.
      *  3/ objecttable - name of database table if objectid specified
      *
      * Optionally it can set:
@@ -346,7 +367,7 @@ abstract class base implements \IteratorAggregate {
     /**
      * Return auxiliary data that was stored in logs.
      *
-     * TODO: MDL-37658
+     * TODO MDL-41331: Properly define this method once logging is finalised.
      *
      * @return array the format is standardised by logging API
      */
@@ -400,7 +421,7 @@ abstract class base implements \IteratorAggregate {
         if (empty($this->data['crud'])) {
             throw new \coding_exception('crud must be specified in init() method of each method');
         }
-        if (empty($this->data['level'])) {
+        if (!isset($this->data['level'])) {
             throw new \coding_exception('level must be specified in init() method of each method');
         }
         if (!empty($this->data['objectid']) and empty($this->data['objecttable'])) {
@@ -414,8 +435,9 @@ abstract class base implements \IteratorAggregate {
             if (!in_array($this->data['crud'], array('c', 'r', 'u', 'd'), true)) {
                 debugging("Invalid event crud value specified.", DEBUG_DEVELOPER);
             }
-            if (!is_number($this->data['level'])) {
-                debugging('Event property level must be a number', DEBUG_DEVELOPER);
+            if (!in_array($this->data['level'], array(self::LEVEL_OTHER, self::LEVEL_TEACHING, self::LEVEL_PARTICIPATING))) {
+                // Bitwise combination of levels is not allowed at this stage.
+                debugging('Event property level must a constant value, see event_base::LEVEL_*', DEBUG_DEVELOPER);
             }
             if (self::$fields !== array_keys($this->data)) {
                 debugging('Number of event data fields must not be changed in event classes', DEBUG_DEVELOPER);
index 9c2718b..8f68647 100644 (file)
@@ -45,8 +45,7 @@ class blog_entry_created extends \core\event\base {
         $this->context = \context_system::instance();
         $this->data['objecttable'] = 'post';
         $this->data['crud'] = 'c';
-        // TODO: MDL-37658 set level.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_PARTICIPATING;
     }
 
     /**
index 9de612d..9d02aab 100644 (file)
@@ -44,8 +44,7 @@ class blog_entry_deleted extends \core\event\base {
         $this->context = \context_system::instance();
         $this->data['objecttable'] = 'post';
         $this->data['crud'] = 'd';
-        // TODO: MDL-37658 set level.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_PARTICIPATING;
     }
 
     /**
index 2ea7ad2..0db4d7b 100644 (file)
@@ -41,8 +41,7 @@ class cohort_created extends base {
      */
     protected function init() {
         $this->data['crud'] = 'c';
-        // TODO MDL-41040.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->data['objecttable'] = 'cohort';
     }
 
index f2d1f32..b43b110 100644 (file)
@@ -41,8 +41,7 @@ class cohort_deleted extends base {
      */
     protected function init() {
         $this->data['crud'] = 'd';
-        // TODO MDL-41040.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->data['objecttable'] = 'cohort';
     }
 
index 95efb88..a7e52eb 100644 (file)
@@ -41,8 +41,7 @@ class cohort_member_added extends base {
      */
     protected function init() {
         $this->data['crud'] = 'c';
-        // TODO MDL-41040.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->data['objecttable'] = 'cohort';
     }
 
index e452715..b3f47bd 100644 (file)
@@ -42,8 +42,7 @@ class cohort_member_removed extends base {
      */
     protected function init() {
         $this->data['crud'] = 'd';
-        // TODO MDL-41040.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->data['objecttable'] = 'cohort';
     }
 
index b36bc45..f9b6a07 100644 (file)
@@ -41,8 +41,7 @@ class cohort_updated extends base {
      */
     protected function init() {
         $this->data['crud'] = 'u';
-        // TODO MDL-41040.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->data['objecttable'] = 'cohort';
     }
 
index 1f8fde9..8f0b4d3 100644 (file)
@@ -36,7 +36,7 @@ class course_category_deleted extends base {
     protected function init() {
         $this->data['objecttable'] = 'course_categories';
         $this->data['crud'] = 'd';
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
     }
 
     /**
index e57ddae..3c7389a 100644 (file)
@@ -31,8 +31,7 @@ class course_completed extends base {
     protected function init() {
         $this->data['objecttable'] = 'course_completions';
         $this->data['crud'] = 'u';
-        // TODO: MDL-37658 set level.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_PARTICIPATING;
     }
 
     /**
index 3da8eda..bd1dcbd 100644 (file)
@@ -40,8 +40,7 @@ class course_completion_updated extends base {
      */
     protected function init() {
         $this->data['crud'] = 'u';
-        // TODO: MDL-37658 set level.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_PARTICIPATING;
     }
 
     /**
index 4587583..9cb3309 100644 (file)
@@ -31,7 +31,7 @@ class course_content_deleted extends base {
     protected function init() {
         $this->data['objecttable'] = 'course';
         $this->data['crud'] = 'd';
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_TEACHING;
     }
 
     /**
index 73c4599..040f830 100644 (file)
@@ -31,7 +31,7 @@ class course_created extends base {
     protected function init() {
         $this->data['objecttable'] = 'course';
         $this->data['crud'] = 'c';
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_TEACHING;
     }
 
     /**
index 7bdc477..2cf551f 100644 (file)
@@ -31,7 +31,7 @@ class course_deleted extends base {
     protected function init() {
         $this->data['objecttable'] = 'course';
         $this->data['crud'] = 'd';
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_TEACHING;
     }
 
     /**
index c57f0c7..fbc8c7b 100644 (file)
@@ -31,8 +31,7 @@ class course_module_completion_updated extends base {
     protected function init() {
         $this->data['objecttable'] = 'course_modules_completion';
         $this->data['crud'] = 'u';
-        // TODO: MDL-37658 set level.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_PARTICIPATING;
     }
 
     /**
index 083ff89..f684463 100644 (file)
@@ -31,7 +31,7 @@ class course_restored extends base {
     protected function init() {
         $this->data['objecttable'] = 'course';
         $this->data['crud'] = 'c';
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_TEACHING;
     }
 
     /**
index 832c960..5a7d9e0 100644 (file)
@@ -43,8 +43,7 @@ class course_section_updated extends base {
     protected function init() {
         $this->data['objecttable'] = 'course_sections';
         $this->data['crud'] = 'u';
-        // TODO MDL-41040 set level.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_TEACHING;
     }
 
     /**
index 3020cc4..b76dd65 100644 (file)
@@ -34,7 +34,7 @@ class course_updated extends base {
     protected function init() {
         $this->data['objecttable'] = 'course';
         $this->data['crud'] = 'u';
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_TEACHING;
     }
 
     /**
index 538e56c..ad4ac9a 100644 (file)
@@ -30,8 +30,7 @@ class role_allow_assign_updated extends base {
      */
     protected function init() {
         $this->data['crud'] = 'u';
-        // TODO: MDL-41040 set level.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
     }
 
     /**
index 2edee4b..fc7c5ce 100644 (file)
@@ -30,8 +30,7 @@ class role_allow_override_updated extends base {
      */
     protected function init() {
         $this->data['crud'] = 'u';
-        // TODO: MDL-41040 set level.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
     }
 
     /**
index 04606e7..20e45eb 100644 (file)
@@ -30,8 +30,7 @@ class role_allow_switch_updated extends base {
      */
     protected function init() {
         $this->data['crud'] = 'u';
-        // TODO: MDL-41040 set level.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
     }
 
     /**
index 9e74839..1f763ab 100644 (file)
@@ -28,8 +28,7 @@ class role_assigned extends base {
     protected function init() {
         $this->data['objecttable'] = 'role';
         $this->data['crud'] = 'c';
-        // TODO: MDL-37658 set level
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
     }
 
     /**
index 6f836dc..5d1f89c 100644 (file)
@@ -34,8 +34,7 @@ class role_capabilities_updated extends base {
     protected function init() {
         $this->data['objecttable'] = 'role';
         $this->data['crud'] = 'u';
-        // TODO: MDL-41040 set level.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
     }
 
     /**
index 11e15b9..969ebbb 100644 (file)
@@ -31,8 +31,7 @@ class role_deleted extends base {
     protected function init() {
         $this->data['objecttable'] = 'role';
         $this->data['crud'] = 'd';
-        // TODO: MDL-41040 set level.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
     }
 
     /**
index 3bb4a10..4735797 100644 (file)
@@ -28,8 +28,7 @@ class role_unassigned extends base {
     protected function init() {
         $this->data['objecttable'] = 'role';
         $this->data['crud'] = 'd';
-        // TODO: MDL-37658 set level
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
     }
 
     /**
index 7cfc3f8..2f842fa 100644 (file)
@@ -89,7 +89,7 @@ class user_loggedin extends \core\event\base {
     protected function init() {
         $this->context = \context_system::instance();
         $this->data['crud'] = 'r';
-        $this->data['level'] = 50;          // TODO MDL-37658.
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->data['objecttable'] = 'user';
     }
 
index 017a6ae..50012d8 100644 (file)
@@ -42,8 +42,7 @@ class user_loggedinas extends base {
      */
     protected function init() {
         $this->data['crud'] = 'r';
-        // TODO MDL-41040 set level.
-        $this->data['level'] = 50;
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->data['objecttable'] = 'user';
     }
 
index 585ce63..2f9eeb7 100644 (file)
@@ -20,7 +20,7 @@
  * Please see the {@link css_optimiser} class for greater detail.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -60,7 +60,7 @@ function css_store_css(theme_config $theme, $csspath, array $cssfiles, $chunk =
         $css = $optimiser->process($css);
 
         // If cssoptimisestats is set then stats from the optimisation are collected
-        // and output at the beginning of the CSS
+        // and output at the beginning of the CSS.
         if (!empty($CFG->cssoptimiserstats)) {
             $css = $optimiser->output_stats_css().$css;
         }
@@ -127,7 +127,7 @@ function css_write_file($filename, $content) {
         fclose($fp);
         rename($filename.'.tmp', $filename);
         @chmod($filename, $CFG->filepermissions);
-        @unlink($filename.'.tmp'); // just in case anything fails
+        @unlink($filename.'.tmp'); // Just in case anything fails.
     }
 }
 
@@ -221,7 +221,8 @@ function css_chunk_by_selector_count($css, $importurl, $maxselectors = 4095, $bu
  * @param string $etag The revision to make sure we utilise any caches.
  */
 function css_send_cached_css($csspath, $etag) {
-    $lifetime = 60*60*24*60; // 60 days only - the revision may get incremented quite often
+    // 60 days only - the revision may get incremented quite often.
+    $lifetime = 60*60*24*60;
 
     header('Etag: "'.$etag.'"');
     header('Content-Disposition: inline; filename="styles.php"');
@@ -251,9 +252,7 @@ function css_send_cached_css($csspath, $etag) {
  *
  * @param string $css
  */
-function css_send_uncached_css($css, $themesupportsoptimisation = true) {
-    global $CFG;
-
+function css_send_uncached_css($css) {
     header('Content-Disposition: inline; filename="styles_debug.php"');
     header('Last-Modified: '. gmdate('D, d M Y H:i:s', time()) .' GMT');
     header('Expires: '. gmdate('D, d M Y H:i:s', time() + THEME_DESIGNER_CACHE_LIFETIME) .' GMT');
@@ -264,19 +263,19 @@ function css_send_uncached_css($css, $themesupportsoptimisation = true) {
     if (is_array($css)) {
         $css = implode("\n\n", $css);
     }
-
     echo $css;
-
     die;
 }
 
 /**
  * Send file not modified headers
+ *
  * @param int $lastmodified
  * @param string $etag
  */
 function css_send_unmodified($lastmodified, $etag) {
-    $lifetime = 60*60*24*60; // 60 days only - the revision may get incremented quite often
+    // 60 days only - the revision may get incremented quite often.
+    $lifetime = 60*60*24*60;
     header('HTTP/1.1 304 Not Modified');
     header('Expires: '. gmdate('D, d M Y H:i:s', time() + $lifetime) .' GMT');
     header('Cache-Control: public, max-age='.$lifetime);
@@ -327,16 +326,16 @@ function css_is_colour($value) {
     } else if (in_array(strtolower($value), array_keys(css_optimiser::$htmlcolours))) {
         return true;
     } else if (preg_match($rgb, $value, $m) && $m[1] < 256 && $m[2] < 256 && $m[3] < 256) {
-        // It is an RGB colour
+        // It is an RGB colour.
         return true;
     } else if (preg_match($rgba, $value, $m) && $m[1] < 256 && $m[2] < 256 && $m[3] < 256) {
-        // It is an RGBA colour
+        // It is an RGBA colour.
         return true;
     } else if (preg_match($hsl, $value, $m) && $m[1] <= 360 && $m[2] <= 100 && $m[3] <= 100) {
-        // It is an HSL colour
+        // It is an HSL colour.
         return true;
     } else if (preg_match($hsla, $value, $m) && $m[1] <= 360 && $m[2] <= 100 && $m[3] <= 100) {
-        // It is an HSLA colour
+        // It is an HSLA colour.
         return true;
     }
     // Doesn't look like a colour.
@@ -379,8 +378,7 @@ function css_sort_by_count(array $a, array $b) {
 }
 
 /**
- * A basic CSS optimiser that strips out unwanted things and then processing the
- * CSS organising styles and moving duplicates and useless CSS.
+ * A basic CSS optimiser that strips out unwanted things and then processes CSS organising and cleaning styles.
  *
  * This CSS optimiser works by reading through a CSS string one character at a
  * time and building an object structure of the CSS.
@@ -389,7 +387,7 @@ function css_sort_by_count(array $a, array $b) {
  * then combined into an optimised form to keep them as short as possible.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -503,9 +501,7 @@ class css_optimiser {
      * @return string The optimised CSS
      */
     public function process($css) {
-        global $CFG;
-
-        // Easiest win there is
+        // Easiest win there is.
         $css = trim($css);
 
         $this->reset_stats();
@@ -526,7 +522,7 @@ class css_optimiser {
         $css = preg_replace('#\r?\n#', ' ', $css);
 
         // Next remove the comments... no need to them in an optimised world and
-        // knowing they're all gone allows us to REALLY make our processing simpler
+        // knowing they're all gone allows us to REALLY make our processing simpler.
         $css = preg_replace('#/\*(.*?)\*/#m', '', $css, -1, $this->commentsincss);
 
         $medias = array(
@@ -544,6 +540,7 @@ class css_optimiser {
         $inbraces = false;      // {
         $inbrackets = false;    // [
         $inparenthesis = false; // (
+        /* @var css_media $currentmedia */
         $currentmedia = $medias['all'];
         $currentatrule = null;
         $suspectatrule = false;
@@ -560,7 +557,7 @@ class css_optimiser {
                 $suspectatrule = true;
             }
             switch ($currentprocess) {
-                // Start processing an @ rule e.g. @media, @page, @keyframes
+                // Start processing an @ rule e.g. @media, @page, @keyframes.
                 case self::PROCESSING_ATRULE:
                     switch ($char) {
                         case ';':
@@ -578,13 +575,17 @@ class css_optimiser {
                                 $buffer = '';
                                 $currentatrule = false;
                             }
-                            // continue 1: The switch processing chars
-                            // continue 2: The switch processing the state
-                            // continue 3: The for loop
+                            // Continue 1: The switch processing chars
+                            // Continue 2: The switch processing the state
+                            // Continue 3: The for loop.
                             continue 3;
                         case '{':
-                            if ($currentatrule == 'media' && preg_match('#\s*@media\s*([a-zA-Z0-9]+(\s*,\s*[a-zA-Z0-9]+)*)\s*{#', $buffer, $matches)) {
-                                // Basic media declaration
+                            $regexmediabasic = '#\s*@media\s*([a-zA-Z0-9]+(\s*,\s*[a-zA-Z0-9]+)*)\s*{#';
+                            $regexadvmedia = '#\s*@media\s*([^{]+)#';
+                            $regexkeyframes = '#@((\-moz\-|\-webkit\-|\-ms\-|\-o\-)?keyframes)\s*([^\s]+)#';
+
+                            if ($currentatrule == 'media' && preg_match($regexmediabasic, $buffer, $matches)) {
+                                // Basic media declaration.
                                 $mediatypes = str_replace(' ', '', $matches[1]);
                                 if (!array_key_exists($mediatypes, $medias)) {
                                     $medias[$mediatypes] = new css_media($mediatypes);
@@ -592,17 +593,17 @@ class css_optimiser {
                                 $currentmedia = $medias[$mediatypes];
                                 $currentprocess = self::PROCESSING_SELECTORS;
                                 $buffer = '';
-                            } else if ($currentatrule == 'media' && preg_match('#\s*@media\s*([^{]+)#', $buffer, $matches)) {
-                                // Advanced media query declaration http://www.w3.org/TR/css3-mediaqueries/
+                            } else if ($currentatrule == 'media' && preg_match($regexadvmedia, $buffer, $matches)) {
+                                // Advanced media query declaration http://www.w3.org/TR/css3-mediaqueries/.
                                 $mediatypes = $matches[1];
                                 $hash = md5($mediatypes);
                                 $medias[$hash] = new css_media($mediatypes);
                                 $currentmedia = $medias[$hash];
                                 $currentprocess = self::PROCESSING_SELECTORS;
                                 $buffer = '';
-                            } else if ($currentatrule == 'keyframes' && preg_match('#@((\-moz\-|\-webkit\-)?keyframes)\s*([^\s]+)#', $buffer, $matches)) {
+                            } else if ($currentatrule == 'keyframes' && preg_match($regexkeyframes, $buffer, $matches)) {
                                 // Keyframes declaration, we treat it exactly like a @media declaration except we don't allow
-                                // them to be overridden to ensure we don't mess anything up. (means we keep everything in order)
+                                // them to be overridden to ensure we don't mess anything up. (means we keep everything in order).
                                 $keyframefor = $matches[1];
                                 $keyframename = $matches[3];
                                 $keyframe = new css_keyframe($keyframefor, $keyframename);
@@ -611,40 +612,41 @@ class css_optimiser {
                                 $currentprocess = self::PROCESSING_SELECTORS;
                                 $buffer = '';
                             }
-                            // continue 1: The switch processing chars
-                            // continue 2: The switch processing the state
-                            // continue 3: The for loop
+                            // Continue 1: The switch processing chars
+                            // Continue 2: The switch processing the state
+                            // Continue 3: The for loop.
                             continue 3;
                     }
                     break;
-                // Start processing selectors
+                // Start processing selectors.
                 case self::PROCESSING_START:
                 case self::PROCESSING_SELECTORS:
+                    $regexatrule = '#@(media|import|charset|(\-moz\-|\-webkit\-|\-ms\-|\-o\-)?(keyframes))\s*#';
                     switch ($char) {
                         case '[':
                             $inbrackets ++;
                             $buffer .= $char;
-                            // continue 1: The switch processing chars
-                            // continue 2: The switch processing the state
-                            // continue 3: The for loop
+                            // Continue 1: The switch processing chars
+                            // Continue 2: The switch processing the state
+                            // Continue 3: The for loop.
                             continue 3;
                         case ']':
                             $inbrackets --;
                             $buffer .= $char;
-                            // continue 1: The switch processing chars
-                            // continue 2: The switch processing the state
-                            // continue 3: The for loop
+                            // Continue 1: The switch processing chars
+                            // Continue 2: The switch processing the state
+                            // Continue 3: The for loop.
                             continue 3;
                         case ' ':
                             if ($inbrackets) {
-                                // continue 1: The switch processing chars
-                                // continue 2: The switch processing the state
-                                // continue 3: The for loop
+                                // Continue 1: The switch processing chars
+                                // Continue 2: The switch processing the state
+                                // Continue 3: The for loop.
                                 continue 3;
                             }
                             if (!empty($buffer)) {
-                                // Check for known @ rules
-                                if ($suspectatrule && preg_match('#@(media|import|charset|(\-moz\-|\-webkit\-)?(keyframes))\s*#', $buffer, $matches)) {
+                                // Check for known @ rules.
+                                if ($suspectatrule && preg_match($regexatrule, $buffer, $matches)) {
                                     $currentatrule = (!empty($matches[3]))?$matches[3]:$matches[1];
                                     $currentprocess = self::PROCESSING_ATRULE;
                                     $buffer .= $char;
@@ -654,15 +656,27 @@ class css_optimiser {
                                 }
                             }
                             $suspectatrule = false;
-                            // continue 1: The switch processing chars
-                            // continue 2: The switch processing the state
-                            // continue 3: The for loop
+                            // Continue 1: The switch processing chars
+                            // Continue 2: The switch processing the state
+                            // Continue 3: The for loop.
                             continue 3;
                         case '{':
                             if ($inbrackets) {
-                                // continue 1: The switch processing chars
-                                // continue 2: The switch processing the state
-                                // continue 3: The for loop
+                                // Continue 1: The switch processing chars
+                                // Continue 2: The switch processing the state
+                                // Continue 3: The for loop.
+                                continue 3;
+                            }
+                            // Check for known @ rules.
+                            if ($suspectatrule && preg_match($regexatrule, $buffer, $matches)) {
+                                // Ahh we've been in an @rule, lets rewind one and have the @rule case process this.
+                                $currentatrule = (!empty($matches[3]))?$matches[3]:$matches[1];
+                                $currentprocess = self::PROCESSING_ATRULE;
+                                $i--;
+                                $suspectatrule = false;
+                                // Continue 1: The switch processing chars
+                                // Continue 2: The switch processing the state
+                                // Continue 3: The for loop.
                                 continue 3;
                             }
                             if ($buffer !== '') {
@@ -673,15 +687,15 @@ class css_optimiser {
                             $currentprocess = self::PROCESSING_STYLES;
 
                             $buffer = '';
-                            // continue 1: The switch processing chars
-                            // continue 2: The switch processing the state
-                            // continue 3: The for loop
+                            // Continue 1: The switch processing chars
+                            // Continue 2: The switch processing the state
+                            // Continue 3: The for loop.
                             continue 3;
                         case '}':
                             if ($inbrackets) {
-                                // continue 1: The switch processing chars
-                                // continue 2: The switch processing the state
-                                // continue 3: The for loop
+                                // Continue 1: The switch processing chars
+                                // Continue 2: The switch processing the state
+                                // Continue 3: The for loop.
                                 continue 3;
                             }
                             if ($currentatrule == 'media') {
@@ -693,28 +707,28 @@ class css_optimiser {
                                 $currentatrule = false;
                                 $buffer = '';
                             }
-                            // continue 1: The switch processing chars
-                            // continue 2: The switch processing the state
-                            // continue 3: The for loop
+                            // Continue 1: The switch processing chars
+                            // Continue 2: The switch processing the state
+                            // Continue 3: The for loop.
                             continue 3;
                         case ',':
                             if ($inbrackets) {
-                                // continue 1: The switch processing chars
-                                // continue 2: The switch processing the state
-                                // continue 3: The for loop
+                                // Continue 1: The switch processing chars
+                                // Continue 2: The switch processing the state
+                                // Continue 3: The for loop.
                                 continue 3;
                             }
                             $currentselector->add($buffer);
                             $currentrule->add_selector($currentselector);
                             $currentselector = css_selector::init();
                             $buffer = '';
-                            // continue 1: The switch processing chars
-                            // continue 2: The switch processing the state
-                            // continue 3: The for loop
+                            // Continue 1: The switch processing chars
+                            // Continue 2: The switch processing the state
+                            // Continue 3: The for loop.
                             continue 3;
                     }
                     break;
-                // Start processing styles
+                // Start processing styles.
                 case self::PROCESSING_STYLES:
                     if ($char == '"' || $char == "'") {
                         if ($inquotes === false) {
@@ -732,17 +746,17 @@ class css_optimiser {
                         case ';':
                             if ($inparenthesis) {
                                 $buffer .= $char;
-                                // continue 1: The switch processing chars
-                                // continue 2: The switch processing the state
-                                // continue 3: The for loop
+                                // Continue 1: The switch processing chars
+                                // Continue 2: The switch processing the state
+                                // Continue 3: The for loop.
                                 continue 3;
                             }
                             $currentrule->add_style($buffer);
                             $buffer = '';
                             $inquotes = false;
-                            // continue 1: The switch processing chars
-                            // continue 2: The switch processing the state
-                            // continue 3: The for loop
+                            // Continue 1: The switch processing chars
+                            // Continue 2: The switch processing the state
+                            // Continue 3: The for loop.
                             continue 3;
                         case '}':
                             $currentrule->add_style($buffer);
@@ -756,23 +770,23 @@ class css_optimiser {
                             $buffer = '';
                             $inquotes = false;
                             $inparenthesis = false;
-                            // continue 1: The switch processing chars
-                            // continue 2: The switch processing the state
-                            // continue 3: The for loop
+                            // Continue 1: The switch processing chars
+                            // Continue 2: The switch processing the state
+                            // Continue 3: The for loop.
                             continue 3;
                         case '(':
                             $inparenthesis = true;
                             $buffer .= $char;
-                            // continue 1: The switch processing chars
-                            // continue 2: The switch processing the state
-                            // continue 3: The for loop
+                            // Continue 1: The switch processing chars
+                            // Continue 2: The switch processing the state
+                            // Continue 3: The for loop.
                             continue 3;
                         case ')':
                             $inparenthesis = false;
                             $buffer .= $char;
-                            // continue 1: The switch processing chars
-                            // continue 2: The switch processing the state
-                            // continue 3: The for loop
+                            // Continue 1: The switch processing chars
+                            // Continue 2: The switch processing the state
+                            // Continue 3: The for loop.
                             continue 3;
                     }
                     break;
@@ -793,8 +807,8 @@ class css_optimiser {
      * Produces CSS for the given charset, imports, media, and keyframes
      * @param string $charset
      * @param array $imports
-     * @param array $medias
-     * @param array $keyframes
+     * @param css_media[] $medias
+     * @param css_keyframe[] $keyframes
      * @return string
      */
     protected function produce_css($charset, array $imports, array $medias, array $keyframes) {
@@ -811,9 +825,9 @@ class css_optimiser {
         $cssstandard = array();
         $csskeyframes = array();
 
-        // Process each media declaration individually
+        // Process each media declaration individually.
         foreach ($medias as $media) {
-            // If this declaration applies to all media types
+            // If this declaration applies to all media types.
             if (in_array('all', $media->get_types())) {
                 // Collect all rules that represet reset rules and remove them from the media object at the same time.
                 // We do this because we prioritise reset rules to the top of a CSS output. This ensures that they
@@ -823,7 +837,7 @@ class css_optimiser {
                     $cssreset[] = css_writer::media('all', $resetrules);
                 }
             }
-            // Get the standard cSS
+            // Get the standard cSS.
             $cssstandard[] = $media->out();
         }
 
@@ -839,7 +853,7 @@ class css_optimiser {
             }
         }
 
-        // Join it all together
+        // Join it all together.
         $css .= join('', $cssreset);
         $css .= join('', $cssstandard);
         $css .= join('', $csskeyframes);
@@ -847,7 +861,7 @@ class css_optimiser {
         // Record the strlenght of the now optimised CSS.
         $this->optimisedstrlen = strlen($css);
 
-        // Return the now produced CSS
+        // Return the now produced CSS.
         return $css;
     }
 
@@ -886,7 +900,7 @@ class css_optimiser {
             'improvementrules'     => '-',
             'improvementselectors'     => '-',
         );
-        // Avoid division by 0 errors by checking we have valid raw values
+        // Avoid division by 0 errors by checking we have valid raw values.
         if ($this->rawstrlen > 0) {
             $stats['improvementstrlen'] = round(100 - ($this->optimisedstrlen / $this->rawstrlen) * 100, 1).'%';
         }
@@ -917,7 +931,7 @@ class css_optimiser {
     public function get_errors($clear = false) {
         $errors = $this->errors;
         if ($clear) {
-            // Reset the error array
+            // Reset the error array.
             $this->errors = array();
         }
         return $errors;
@@ -1001,8 +1015,7 @@ class css_optimiser {
      * This reference table is used to allow us to unify colours, and will aid
      * us in identifying buggy CSS using unsupported colours.
      *
-     * @staticvar array
-     * @var array
+     * @var string[]
      */
     public static $htmlcolours = array(
         'aliceblue' => '#F0F8FF',
@@ -1160,7 +1173,7 @@ class css_optimiser {
  * Used to prepare CSS strings
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -1218,7 +1231,7 @@ abstract class css_writer {
      * Returns CSS for media
      *
      * @param string $typestring
-     * @param array $rules An array of css_rule objects
+     * @param css_rule[] $rules An array of css_rule objects
      * @return string
      */
     public static function media($typestring, array &$rules) {
@@ -1244,12 +1257,10 @@ abstract class css_writer {
      *
      * @param string $for The desired declaration. e.g. keyframes, -moz-keyframes, -webkit-keyframes
      * @param string $name The name for the keyframe
-     * @param array $rules An array of rules belonging to the keyframe
+     * @param css_rule[] $rules An array of rules belonging to the keyframe
      * @return string
      */
     public static function keyframe($for, $name, array &$rules) {
-        $nl = self::get_separator();
-
         $output = "\n@{$for} {$name} {";
         foreach ($rules as $rule) {
             $output .= $rule->out();
@@ -1273,7 +1284,7 @@ abstract class css_writer {
     /**
      * Returns CSS for the selectors of a rule
      *
-     * @param array $selectors Array of css_selector objects
+     * @param css_selector[] $selectors Array of css_selector objects
      * @return string
      */
     public static function selectors(array $selectors) {
@@ -1298,7 +1309,7 @@ abstract class css_writer {
     /**
      * Returns a CSS string for the provided styles
      *
-     * @param array $styles Array of css_style objects
+     * @param css_style[] $styles Array of css_style objects
      * @return string
      */
     public static function styles(array $styles) {
@@ -1308,6 +1319,7 @@ abstract class css_writer {
             // An advanced style is a style with one or more values, and can occur in situations like background-image
             // where browse specific values are being used.
             if (is_array($style)) {
+                /* @var css_style[] $style */
                 foreach ($style as $advstyle) {
                     $bits[] = $advstyle->out();
                 }
@@ -1335,6 +1347,25 @@ abstract class css_writer {
     }
 }
 
+/**
+ * A consolidatable style interface.
+ *
+ * Class that implement this have a short-hand notation for specifying multiple styles.
+ *
+ * @package core
+ * @subpackage cssoptimiser
+ * @copyright 2012 Sam Hemelryk
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+interface core_css_consolidatable_style {
+    /**
+     * Used to consolidate several styles into a single "short-hand" style.
+     * @param array $styles
+     * @return mixed
+     */
+    public static function consolidate(array $styles);
+}
+
 /**
  * A structure to represent a CSS selector.
  *
@@ -1342,7 +1373,7 @@ abstract class css_writer {
  * rule.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -1378,7 +1409,9 @@ class css_selector {
     /**
      * CSS selectors can only be created through the init method above.
      */
-    protected function __construct() {}
+    protected function __construct() {
+        // Nothing to do here by default.
+    }
 
     /**
      * Adds a selector to the end of the current selector
@@ -1391,13 +1424,13 @@ class css_selector {
         if (strpos($selector, '.') !== 0 && strpos($selector, '#') !== 0) {
             $count ++;
         }
-        // If its already false then no need to continue, its not basic
+        // If its already false then no need to continue, its not basic.
         if ($this->isbasic !== false) {
-            // If theres more than one part making up this selector its not basic
+            // If theres more than one part making up this selector its not basic.
             if ($count > 1) {
                 $this->isbasic = false;
             } else {
-                // Check whether it is a basic element (a-z+) with possible psuedo selector
+                // Check whether it is a basic element (a-z+) with possible psuedo selector.
                 $this->isbasic = (bool)preg_match('#^[a-z]+(:[a-zA-Z]+)?$#', $selector);
             }
         }
@@ -1433,7 +1466,7 @@ class css_selector {
  * A structure to represent a CSS rule.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -1441,13 +1474,13 @@ class css_rule {
 
     /**
      * An array of CSS selectors {@link css_selector}
-     * @var array
+     * @var css_selector[]
      */
     protected $selectors = array();
 
     /**
      * An array of CSS styles {@link css_style}
-     * @var array
+     * @var css_style[]
      */
     protected $styles = array();
 
@@ -1463,7 +1496,7 @@ class css_rule {
      * Constructs a new css rule.
      *
      * @param string $selector The selector or array of selectors that make up this rule.
-     * @param array $styles An array of styles that belong to this rule.
+     * @param css_style[] $styles An array of styles that belong to this rule.
      */
     protected function __construct($selector = null, array $styles = array()) {
         if ($selector != null) {
@@ -1508,7 +1541,7 @@ class css_rule {
         } else if ($style instanceof css_style) {
             // Clone the style as it may be coming from another rule and we don't
             // want references as it will likely be overwritten by proceeding
-            // rules
+            // rules.
             $style = clone($style);
         }
         if ($style instanceof css_style) {
@@ -1544,7 +1577,7 @@ class css_rule {
      * This method simply iterates over the array and calls {@link css_rule::add_style()}
      * with each.
      *
-     * @param array $styles Adds an array of styles
+     * @param css_style[] $styles Adds an array of styles
      */
     public function add_styles(array $styles) {
         foreach ($styles as $style) {
@@ -1555,7 +1588,7 @@ class css_rule {
     /**
      * Returns the array of selectors
      *
-     * @return array
+     * @return css_selector[]
      */
     public function get_selectors() {
         return $this->selectors;
@@ -1564,7 +1597,7 @@ class css_rule {
     /**
      * Returns the array of styles
      *
-     * @return array
+     * @return css_style[]
      */
     public function get_styles() {
         return $this->styles;
@@ -1584,12 +1617,16 @@ class css_rule {
     /**
      * Consolidates all styles associated with this rule
      *
-     * @return array An array of consolidated styles
+     * @return css_style[] An array of consolidated styles
      */
     public function get_consolidated_styles() {
+        /* @var css_style[] $organisedstyles */
         $organisedstyles = array();
+        /* @var css_style[] $finalstyles */
         $finalstyles = array();
+        /* @var core_css_consolidatable_style[] $consolidate */
         $consolidate = array();
+        /* @var css_style[] $advancedstyles */
         $advancedstyles = array();
         foreach ($this->styles as $style) {
             // If the style is an array then we are processing an advanced style. An advanced style is a style that can have
@@ -1598,6 +1635,7 @@ class css_rule {
                 $single = null;
                 $count = 0;
                 foreach ($style as $advstyle) {
+                    /* @var css_style $advstyle */
                     $key = $count++;
                     $advancedstyles[$key] = $advstyle;
                     if (!$advstyle->allows_multiple_values()) {
@@ -1611,7 +1649,8 @@ class css_rule {
                     $style = $advancedstyles[$single];
 
                     $consolidatetoclass = $style->consolidate_to();
-                    if (($style->is_valid() || $style->is_special_empty_value()) && !empty($consolidatetoclass) && class_exists('css_style_'.$consolidatetoclass)) {
+                    if (($style->is_valid() || $style->is_special_empty_value()) && !empty($consolidatetoclass) &&
+                            class_exists('css_style_'.$consolidatetoclass)) {
                         $class = 'css_style_'.$consolidatetoclass;
                         if (!array_key_exists($class, $consolidate)) {
                             $consolidate[$class] = array();
@@ -1625,7 +1664,8 @@ class css_rule {
                 continue;
             }
             $consolidatetoclass = $style->consolidate_to();
-            if (($style->is_valid() || $style->is_special_empty_value()) && !empty($consolidatetoclass) && class_exists('css_style_'.$consolidatetoclass)) {
+            if (($style->is_valid() || $style->is_special_empty_value()) && !empty($consolidatetoclass) &&
+                    class_exists('css_style_'.$consolidatetoclass)) {
                 $class = 'css_style_'.$consolidatetoclass;
                 if (!array_key_exists($class, $consolidate)) {
                     $consolidate[$class] = array();
@@ -1638,7 +1678,7 @@ class css_rule {
         }
 
         foreach ($consolidate as $class => $styles) {
-            $organisedstyles[$class] = $class::consolidate($styles);
+            $organisedstyles[$class] = call_user_func(array($class, 'consolidate'), $styles);
         }
 
         foreach ($organisedstyles as $style) {
@@ -1658,7 +1698,7 @@ class css_rule {
      * Splits this rules into an array of CSS rules. One for each of the selectors
      * that make up this rule.
      *
-     * @return array(css_rule)
+     * @return css_rule[]
      */
     public function split_by_selector() {
         $return = array();
@@ -1672,7 +1712,7 @@ class css_rule {
      * Splits this rule into an array of rules. One for each of the styles that
      * make up this rule
      *
-     * @return array Array of css_rule objects
+     * @return css_rule[] Array of css_rule objects
      */
     public function split_by_style() {
         $return = array();
@@ -1725,6 +1765,7 @@ class css_rule {
     public function has_errors() {
         foreach ($this->styles as $style) {
             if (is_array($style)) {
+                /* @var css_style[] $style */
                 foreach ($style as $advstyle) {
                     if ($advstyle->has_error()) {
                         return true;
@@ -1752,9 +1793,10 @@ class css_rule {
         $errors = array();
         foreach ($this->styles as $style) {
             if (is_array($style)) {
-                foreach ($style as $s) {
-                    if ($style instanceof css_style && $style->has_error()) {
-                        $errors[] = "  * ".$style->get_last_error();
+                /* @var css_style[] $style */
+                foreach ($style as $advstyle) {
+                    if ($advstyle instanceof css_style && $advstyle->has_error()) {
+                        $errors[] = "  * ".$advstyle->get_last_error();
                     }
                 }
             } else if ($style instanceof css_style && $style->has_error()) {
@@ -1789,14 +1831,14 @@ class css_rule {
  * When no declaration is specified rules accumulate into @media all.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 abstract class css_rule_collection {
     /**
      * An array of rules within this collection instance
-     * @var array
+     * @var css_rule[]
      */
     protected $rules = array();
 
@@ -1824,7 +1866,7 @@ abstract class css_rule_collection {
     /**
      * Returns the rules used by this collection
      *
-     * @return array
+     * @return css_rule[]
      */
     public function get_rules() {
         return $this->rules;
@@ -1837,9 +1879,11 @@ abstract class css_rule_collection {
      * @return bool True if the CSS was optimised by this method
      */
     public function organise_rules_by_selectors() {
-        $optimised = array();
+        /* @var css_rule[] $optimisedrules */
+        $optimisedrules = array();
         $beforecount = count($this->rules);
         $lasthash = null;
+        /* @var css_rule $lastrule */
         $lastrule = null;
         foreach ($this->rules as $rule) {
             $hash = $rule->get_style_hash();
@@ -1851,10 +1895,10 @@ abstract class css_rule_collection {
             }
             $lastrule = clone($rule);
             $lasthash = $hash;
-            $optimised[] = $lastrule;
+            $optimisedrules[] = $lastrule;
         }
         $this->rules = array();
-        foreach ($optimised as $optimised) {
+        foreach ($optimisedrules as $optimised) {
             $this->rules[$optimised->get_selector_hash()] = $optimised;
         }
         $aftercount = count($this->rules);
@@ -1900,7 +1944,7 @@ abstract class css_rule_collection {
     /**
      * Returns any errors that have happened within rules in this collection.
      *
-     * @return string
+     * @return string[]
      */
     public function get_errors() {
         $errors = array();
@@ -1917,7 +1961,7 @@ abstract class css_rule_collection {
  * A media class to organise rules by the media they apply to.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -1980,16 +2024,22 @@ class css_media extends css_rule_collection {
  * A media class to organise rules by the media they apply to.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 class css_keyframe extends css_rule_collection {
 
-    /** @var string $for The directive e.g. keyframes, -moz-keyframes, -webkit-keyframes  */
+    /**
+     * The directive e.g. keyframes, -moz-keyframes, -webkit-keyframes
+     * @var string
+     */
     protected $for;
 
-    /** @var string $name The name for the keyframes */
+    /**
+     * The name for the keyframes
+     * @var string
+     */
     protected $name;
     /**
      * Constructs a new keyframe
@@ -2031,7 +2081,7 @@ class css_keyframe extends css_rule_collection {
  * An absract class to represent CSS styles
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -2085,9 +2135,14 @@ abstract class css_style {
      * @return css_style_generic
      */
     public static function init_automatic($name, $value) {
-        $specificclass = 'css_style_'.preg_replace('#[^a-zA-Z0-9]+#', '', $name);
+        $cleanedname = preg_replace('#[^a-zA-Z0-9]+#', '', $name);
+        $specificclass = 'css_style_'.$cleanedname;
         if (class_exists($specificclass)) {
-            return $specificclass::init($value);
+            $style = call_user_func(array($specificclass, 'init'), $value);
+            if ($cleanedname !== $name && !is_array($style)) {
+                $style->set_actual_name($name);
+            }
+            return $style;
         }
         return new css_style_generic($name, $value);
     }
@@ -2263,13 +2318,24 @@ abstract class css_style {
     public function set_important($important = true) {
         $this->important = (bool) $important;
     }
+
+    /**
+     * Sets the actual name used within the style.
+     *
+     * This method allows us to support browser hacks like *width:0;
+     *
+     * @param string $name
+     */
+    public function set_actual_name($name) {
+        $this->name = $name;
+    }
 }
 
 /**
  * A generic CSS style class to use when a more specific class does not exist.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -2295,7 +2361,7 @@ class css_style_generic extends css_style {
  * A colour CSS style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -2380,7 +2446,7 @@ class css_style_color extends css_style {
  * A width style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -2426,11 +2492,11 @@ class css_style_width extends css_style {
  * A margin style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
-class css_style_margin extends css_style_width {
+class css_style_margin extends css_style_width implements core_css_consolidatable_style {
 
     /**
      * Initialises a margin style.
@@ -2476,8 +2542,8 @@ class css_style_margin extends css_style_width {
     /**
      * Consolidates individual margin styles into a single margin style
      *
-     * @param array $styles
-     * @return array An array of consolidated styles
+     * @param css_style[] $styles
+     * @return css_style[] An array of consolidated styles
      */
     public static function consolidate(array $styles) {
         if (count($styles) != 4) {
@@ -2565,7 +2631,7 @@ class css_style_margin extends css_style_width {
  * A margin top style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -2595,7 +2661,7 @@ class css_style_margintop extends css_style_margin {
  * A margin right style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -2625,7 +2691,7 @@ class css_style_marginright extends css_style_margin {
  * A margin bottom style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -2655,7 +2721,7 @@ class css_style_marginbottom extends css_style_margin {
  * A margin left style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -2685,11 +2751,11 @@ class css_style_marginleft extends css_style_margin {
  * A border style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
-class css_style_border extends css_style {
+class css_style_border extends css_style implements core_css_consolidatable_style {
 
     /**
      * Initalises the border style into an array of individual style compontents
@@ -2707,24 +2773,24 @@ class css_style_border extends css_style {
             if (!css_style_borderwidth::is_border_width($width)) {
                 $width = '0';
             }
-            $return[] = new css_style_borderwidth('border-top-width', $width);
-            $return[] = new css_style_borderwidth('border-right-width', $width);
-            $return[] = new css_style_borderwidth('border-bottom-width', $width);
-            $return[] = new css_style_borderwidth('border-left-width', $width);
+            $return[] = css_style_bordertopwidth::init($width);
+            $return[] = css_style_borderrightwidth::init($width);
+            $return[] = css_style_borderbottomwidth::init($width);
+            $return[] = css_style_borderleftwidth::init($width);
         }
         if (count($bits) > 0) {
             $style = array_shift($bits);
-            $return[] = new css_style_borderstyle('border-top-style', $style);
-            $return[] = new css_style_borderstyle('border-right-style', $style);
-            $return[] = new css_style_borderstyle('border-bottom-style', $style);
-            $return[] = new css_style_borderstyle('border-left-style', $style);
+            $return[] = css_style_bordertopstyle::init($style);
+            $return[] = css_style_borderrightstyle::init($style);
+            $return[] = css_style_borderbottomstyle::init($style);
+            $return[] = css_style_borderleftstyle::init($style);
         }
         if (count($bits) > 0) {
             $colour = array_shift($bits);
-            $return[] = new css_style_bordercolor('border-top-color', $colour);
-            $return[] = new css_style_bordercolor('border-right-color', $colour);
-            $return[] = new css_style_bordercolor('border-bottom-color', $colour);
-            $return[] = new css_style_bordercolor('border-left-color', $colour);
+            $return[] = css_style_bordertopcolor::init($colour);
+            $return[] = css_style_borderrightcolor::init($colour);
+            $return[] = css_style_borderbottomcolor::init($colour);
+            $return[] = css_style_borderleftcolor::init($colour);
         }
         return $return;
     }
@@ -2732,8 +2798,8 @@ class css_style_border extends css_style {
     /**
      * Consolidates all border styles into a single style
      *
-     * @param array $styles An array of border styles
-     * @return array An optimised array of border styles
+     * @param css_style[] $styles An array of border styles
+     * @return css_style[] An optimised array of border styles
      */
     public static function consolidate(array $styles) {
 
@@ -2800,9 +2866,10 @@ class css_style_border extends css_style {
         $allstylesnull = $allstylesthesame && $nullstyles;
         $allcolorsnull = $allcolorsthesame && $nullcolors;
 
+        /* @var css_style[] $return */
         $return = array();
         if ($allwidthsnull && $allstylesnull && $allcolorsnull) {
-            // Everything is null still... boo
+            // Everything is null still... boo.
             return array(new css_style_border('border', ''));
 
         } else if ($allwidthsnull && $allstylesnull) {
@@ -2849,7 +2916,11 @@ class css_style_border extends css_style {
                 self::consolidate_styles_by_direction($return, 'css_style_bordercolor', 'border-color', $bordercolors);
             }
 
-        } else if (!$nullwidths && !$nullcolors && !$nullstyles && max(array_count_values($borderwidths)) == 3 && max(array_count_values($borderstyles)) == 3 && max(array_count_values($bordercolors)) == 3) {
+        } else if (!$nullwidths && !$nullcolors && !$nullstyles &&
+            max(array_count_values($borderwidths)) == 3 &&
+            max(array_count_values($borderstyles)) == 3 &&
+            max(array_count_values($bordercolors)) == 3) {
+
             $widthkeys = array();
             $stylekeys = array();
             $colorkeys = array();
@@ -2883,20 +2954,30 @@ class css_style_border extends css_style {
 
             if ($widthkeys == $stylekeys && $stylekeys == $colorkeys) {
                 $key = $widthkeys[0][0];
-                self::build_style_string($return, 'css_style_border', 'border',  $borderwidths[$key], $borderstyles[$key], $bordercolors[$key]);
+                self::build_style_string($return, 'css_style_border', 'border',
+                    $borderwidths[$key], $borderstyles[$key], $bordercolors[$key]);
                 $key = $widthkeys[1][0];
-                self::build_style_string($return, 'css_style_border'.$key, 'border-'.$key,  $borderwidths[$key], $borderstyles[$key], $bordercolors[$key]);
+                self::build_style_string($return, 'css_style_border'.$key, 'border-'.$key,
+                    $borderwidths[$key], $borderstyles[$key], $bordercolors[$key]);
             } else {
-                self::build_style_string($return, 'css_style_bordertop', 'border-top', $borderwidths['top'], $borderstyles['top'], $bordercolors['top']);
-                self::build_style_string($return, 'css_style_borderright', 'border-right', $borderwidths['right'], $borderstyles['right'], $bordercolors['right']);
-                self::build_style_string($return, 'css_style_borderbottom', 'border-bottom', $borderwidths['bottom'], $borderstyles['bottom'], $bordercolors['bottom']);
-                self::build_style_string($return, 'css_style_borderleft', 'border-left', $borderwidths['left'], $borderstyles['left'], $bordercolors['left']);
+                self::build_style_string($return, 'css_style_bordertop', 'border-top',
+                    $borderwidths['top'], $borderstyles['top'], $bordercolors['top']);
+                self::build_style_string($return, 'css_style_borderright', 'border-right',
+                    $borderwidths['right'], $borderstyles['right'], $bordercolors['right']);
+                self::build_style_string($return, 'css_style_borderbottom', 'border-bottom',
+                    $borderwidths['bottom'], $borderstyles['bottom'], $bordercolors['bottom']);
+                self::build_style_string($return, 'css_style_borderleft', 'border-left',
+                    $borderwidths['left'], $borderstyles['left'], $bordercolors['left']);
             }
         } else {
-            self::build_style_string($return, 'css_style_bordertop', 'border-top', $borderwidths['top'], $borderstyles['top'], $bordercolors['top']);
-            self::build_style_string($return, 'css_style_borderright', 'border-right', $borderwidths['right'], $borderstyles['right'], $bordercolors['right']);
-            self::build_style_string($return, 'css_style_borderbottom', 'border-bottom', $borderwidths['bottom'], $borderstyles['bottom'], $bordercolors['bottom']);
-            self::build_style_string($return, 'css_style_borderleft', 'border-left', $borderwidths['left'], $borderstyles['left'], $bordercolors['left']);
+            self::build_style_string($return, 'css_style_bordertop', 'border-top',
+                $borderwidths['top'], $borderstyles['top'], $bordercolors['top']);
+            self::build_style_string($return, 'css_style_borderright', 'border-right',
+                $borderwidths['right'], $borderstyles['right'], $bordercolors['right']);
+            self::build_style_string($return, 'css_style_borderbottom', 'border-bottom',
+                $borderwidths['bottom'], $borderstyles['bottom'], $bordercolors['bottom']);
+            self::build_style_string($return, 'css_style_borderleft', 'border-left',
+                $borderwidths['left'], $borderstyles['left'], $bordercolors['left']);
         }
         foreach ($return as $key => $style) {
             if ($style->get_value() == '') {
@@ -2929,7 +3010,8 @@ class css_style_border extends css_style {
      * @param string $left The left value
      * @return bool
      */
-    public static function consolidate_styles_by_direction(&$array, $class, $style, $top, $right = null, $bottom = null, $left = null) {
+    public static function consolidate_styles_by_direction(&$array, $class, $style,
+                                                           $top, $right = null, $bottom = null, $left = null) {
         if (is_array($top)) {
             $right = $top['right'];
             $bottom = $top['bottom'];
@@ -3003,7 +3085,7 @@ class css_style_border extends css_style {
  * A border colour style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3083,7 +3165,7 @@ class css_style_bordercolor extends css_style_color {
  * A border left style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3126,7 +3208,7 @@ class css_style_borderleft extends css_style_generic {
  * A border right style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3169,7 +3251,7 @@ class css_style_borderright extends css_style_generic {
  * A border top style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3212,7 +3294,7 @@ class css_style_bordertop extends css_style_generic {
  * A border bottom style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3255,7 +3337,7 @@ class css_style_borderbottom extends css_style_generic {
  * A border width style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3342,7 +3424,7 @@ class css_style_borderwidth extends css_style_width {
  * A border style style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3395,7 +3477,7 @@ class css_style_borderstyle extends css_style_generic {
  * A border top colour style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3425,7 +3507,7 @@ class css_style_bordertopcolor extends css_style_bordercolor {
  * A border left colour style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3455,7 +3537,7 @@ class css_style_borderleftcolor extends css_style_bordercolor {
  * A border right colour style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3485,7 +3567,7 @@ class css_style_borderrightcolor extends css_style_bordercolor {
  * A border bottom colour style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3515,7 +3597,7 @@ class css_style_borderbottomcolor extends css_style_bordercolor {
  * A border width top style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3545,7 +3627,7 @@ class css_style_bordertopwidth extends css_style_borderwidth {
  * A border width left style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3575,7 +3657,7 @@ class css_style_borderleftwidth extends css_style_borderwidth {
  * A border width right style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3605,7 +3687,7 @@ class css_style_borderrightwidth extends css_style_borderwidth {
  * A border width bottom style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3635,7 +3717,7 @@ class css_style_borderbottomwidth extends css_style_borderwidth {
  * A border top style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3665,7 +3747,7 @@ class css_style_bordertopstyle extends css_style_borderstyle {
  * A border left style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3695,7 +3777,7 @@ class css_style_borderleftstyle extends css_style_borderstyle {
  * A border right style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3725,7 +3807,7 @@ class css_style_borderrightstyle extends css_style_borderstyle {
  * A border bottom style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -3755,11 +3837,11 @@ class css_style_borderbottomstyle extends css_style_borderstyle {
  * A background style
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
-class css_style_background extends css_style {
+class css_style_background extends css_style implements core_css_consolidatable_style {
 
     /**
      * Initialises a background style
@@ -3768,15 +3850,14 @@ class css_style_background extends css_style {
      * @return array An array of background component.
      */
     public static function init($value) {
-        // colour - image - repeat - attachment - position
-
+        // Colour - image - repeat - attachment - position.
         $imageurl = null;
         if (preg_match('#url\(([^\)]+)\)#', $value, $matches)) {
             $imageurl = trim($matches[1]);
             $value = str_replace($matches[1], '', $value);
         }
 
-        // Switch out the brackets so that they don't get messed up when we explode
+        // Switch out the brackets so that they don't get messed up when we explode.
         $brackets = array();
         $bracketcount = 0;
         while (preg_match('#\([^\)\(]+\)#', $value, $matches)) {
@@ -3788,7 +3869,7 @@ class css_style_background extends css_style {
 
         $important = (stripos($value, '!important') !== false);
         if ($important) {
-            // Great some genius put !important in the background shorthand property
+            // Great some genius put !important in the background shorthand property.
             $value = str_replace('!important', '', $value);
         }
 
@@ -3805,6 +3886,7 @@ class css_style_background extends css_style {
         $attachments = array('scroll' , 'fixed', 'inherit');
         $positions = array('top', 'left', 'bottom', 'right', 'center');
 
+        /* @var css_style_background[] $return */
         $return = array();
         $unknownbits = array();
 
@@ -3828,7 +3910,7 @@ class css_style_background extends css_style {
 
         $attachment = self::NULL_VALUE;
         if (count($bits) > 0 && in_array(reset($bits), $attachments)) {
-            // scroll , fixed, inherit
+            // Scroll , fixed, inherit.
             $attachment = array_shift($bits);
         }
 
@@ -3866,16 +3948,19 @@ class css_style_background extends css_style {
             }
         }
 
-        if ($color === self::NULL_VALUE && $image === self::NULL_VALUE && $repeat === self::NULL_VALUE && $attachment === self::NULL_VALUE && $position === self::NULL_VALUE) {
+        if ($color === self::NULL_VALUE &&
+            $image === self::NULL_VALUE &&
+            $repeat === self::NULL_VALUE && $attachment === self::NULL_VALUE &&
+            $position === self::NULL_VALUE) {
             // All primaries are null, return without doing anything else. There may be advanced madness there.
             return $return;
         }
 
-        $return[] = new css_style_backgroundcolor('background-color', $color);
-        $return[] = new css_style_backgroundimage('background-image', $image);
-        $return[] = new css_style_backgroundrepeat('background-repeat', $repeat);
-        $return[] = new css_style_backgroundattachment('background-attachment', $attachment);
-        $return[] = new css_style_backgroundposition('background-position', $position);
+        $return[] = css_style_backgroundcolor::init($color);
+        $return[] = css_style_backgroundimage::init($image);
+        $return[] = css_style_backgroundrepeat::init($repeat);
+        $return[] = css_style_backgroundattachment::init($attachment);
+        $return[] = css_style_backgroundposition::init($position);
 
         if ($important) {
             foreach ($return as $style) {
@@ -3903,8 +3988,8 @@ class css_style_background extends css_style {
     /**
      * Consolidates background styles into a single background style
      *
-     * @param array $styles Consolidates the provided array of background styles
-     * @return array Consolidated optimised background styles
+     * @param css_style_background[] $styles Consolidates the provided array of background styles
+     * @return css_style[] Consolidated optimised background styles
      */
     public static function consolidate(array $styles) {
 
@@ -3937,8 +4022,11 @@ class css_style_background extends css_style {
             }
         }
 
+        /* @var css_style[] $organisedstyles */
         $organisedstyles = array();
+        /* @var css_style[] $advancedstyles */
         $advancedstyles = array();
+        /* @var css_style[] $importantstyles */
         $importantstyles = array();
         foreach ($styles as $style) {
             if ($style instanceof css_style_backgroundimage_advanced) {
@@ -3978,6 +4066,7 @@ class css_style_background extends css_style {
             }
         }
 
+        /* @var css_style[] $consolidatetosingle */
         $consolidatetosingle = array();
         if (!is_null($color) && !is_null($image) && !is_null($repeat) && !is_null($attachment) && !is_null($position)) {
             // We can use the shorthand background-style!
@@ -4005,7 +4094,7 @@ class css_style_background extends css_style {
         }
 
         $return = array();
-        // Single background style needs to come first;
+        // Single background style needs to come first.
         if (count($consolidatetosingle) > 0) {
             $returnstyle = new css_style_background('background', join(' ', $consolidatetosingle));
             if ($allimportant) {
@@ -4016,14 +4105,30 @@ class css_style_background extends css_style {
         foreach ($styles as $style) {
             $value = null;
             switch ($style->get_name()) {
-                case 'background-color'      : $value = $color;      break;
-                case 'background-image'      : $value = $image;      break;
-                case 'background-repeat'     : $value = $repeat;     break;
-                case 'background-attachment' : $value = $attachment; break;
-                case 'background-position'   : $value = $position;   break;
-                case 'background-clip'       : $value = $clip;       break;
-                case 'background-origin'     : $value = $origin;     break;
-                case 'background-size'       : $value = $size;       break;
+                case 'background-color' :
+                    $value = $color;
+                    break;
+                case 'background-image' :
+                    $value = $image;
+                    break;
+                case 'background-repeat' :
+                    $value = $repeat;
+                    break;
+                case 'background-attachment' :
+                    $value = $attachment;
+                    break;
+                case 'background-position' :
+                    $value = $position;
+                    break;
+                case 'background-clip' :
+                    $value = $clip;
+                    break;
+                case 'background-origin':
+                    $value = $origin;
+                    break;
+                case 'background-size':
+                    $value = $size;
+                    break;
             }
             if (!is_null($value)) {
                 $return[] = $style;
@@ -4038,7 +4143,7 @@ class css_style_background extends css_style {
  * A advanced background style that allows multiple values to preserve unknown entities
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4071,7 +4176,7 @@ class css_style_background_advanced extends css_style_generic {
  * Based upon the colour style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4122,7 +4227,7 @@ class css_style_backgroundcolor extends css_style_color {
  * A background image style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4135,7 +4240,7 @@ class css_style_backgroundimage extends css_style_generic {
      * @return css_style_backgroundimage
      */
     public static function init($value) {
-        if (!preg_match('#^\s*(none|inherit|url\()#i', $value)) {
+        if ($value !== self::NULL_VALUE && !preg_match('#^\s*(none|inherit|url\()#i', $value)) {
             return css_style_backgroundimage_advanced::init($value);
         }
         return new css_style_backgroundimage('background-image', $value);
@@ -4173,10 +4278,10 @@ class css_style_backgroundimage extends css_style_generic {
 }
 
 /**
- * A background image style that supports mulitple values and masquerades as a background-image
+ * A background image style that supports multiple values and masquerades as a background-image
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4207,7 +4312,7 @@ class css_style_backgroundimage_advanced extends css_style_generic {
  * A background repeat style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4258,7 +4363,7 @@ class css_style_backgroundrepeat extends css_style_generic {
  * A background attachment style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4309,7 +4414,7 @@ class css_style_backgroundattachment extends css_style_generic {
  * A background position style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4360,7 +4465,7 @@ class css_style_backgroundposition extends css_style_generic {
  * A background size style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4390,7 +4495,7 @@ class css_style_backgroundsize extends css_style_generic {
  * A background clip style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4420,7 +4525,7 @@ class css_style_backgroundclip extends css_style_generic {
  * A background origin style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4450,11 +4555,11 @@ class css_style_backgroundorigin extends css_style_generic {
  * A padding style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
-class css_style_padding extends css_style_width {
+class css_style_padding extends css_style_width implements core_css_consolidatable_style {
 
     /**
      * Initialises this padding style into several individual padding styles
@@ -4496,8 +4601,8 @@ class css_style_padding extends css_style_width {
     /**
      * Consolidates several padding styles into a single style.
      *
-     * @param array $styles Array of padding styles
-     * @return array Optimised+consolidated array of padding styles
+     * @param css_style_padding[] $styles Array of padding styles
+     * @return css_style[] Optimised+consolidated array of padding styles
      */
     public static function consolidate(array $styles) {
         if (count($styles) != 4) {
@@ -4548,10 +4653,18 @@ class css_style_padding extends css_style_width {
             $left = null;
             foreach ($styles as $style) {
                 switch ($style->get_name()) {
-                    case 'padding-top' : $top = $style->get_value(false);break;
-                    case 'padding-right' : $right = $style->get_value(false);break;
-                    case 'padding-bottom' : $bottom = $style->get_value(false);break;
-                    case 'padding-left' : $left = $style->get_value(false);break;
+                    case 'padding-top' :
+                        $top = $style->get_value(false);
+                        break;
+                    case 'padding-right' :
+                        $right = $style->get_value(false);
+                        break;
+                    case 'padding-bottom' :
+                        $bottom = $style->get_value(false);
+                        break;
+                    case 'padding-left' :
+                        $left = $style->get_value(false);
+                        break;
                 }
             }
             if ($top == $bottom && $left == $right) {
@@ -4577,7 +4690,7 @@ class css_style_padding extends css_style_width {
  * A padding top style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4607,7 +4720,7 @@ class css_style_paddingtop extends css_style_padding {
  * A padding right style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4637,7 +4750,7 @@ class css_style_paddingright extends css_style_padding {
  * A padding bottom style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4667,7 +4780,7 @@ class css_style_paddingbottom extends css_style_padding {
  * A padding left style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4697,7 +4810,7 @@ class css_style_paddingleft extends css_style_padding {
  * A cursor style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4717,10 +4830,10 @@ class css_style_cursor extends css_style_generic {
      * @return string
      */
     protected function clean_value($value) {
-        // Allowed values for the cursor style
+        // Allowed values for the cursor style.
         $allowed = array('auto', 'crosshair', 'default', 'e-resize', 'help', 'move', 'n-resize', 'ne-resize', 'nw-resize',
                          'pointer', 'progress', 's-resize', 'se-resize', 'sw-resize', 'text', 'w-resize', 'wait', 'inherit');
-        // Has to be one of the allowed values of an image to use. Loosely match the image... doesn't need to be thorough
+        // Has to be one of the allowed values of an image to use. Loosely match the image... doesn't need to be thorough.
         if (!in_array($value, $allowed) && !preg_match('#\.[a-zA-Z0-9_\-]{1,5}$#', $value)) {
             $this->set_error('Invalid or unexpected cursor value specified: '.$value);
         }
@@ -4732,7 +4845,7 @@ class css_style_cursor extends css_style_generic {
  * A vertical alignment style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -4764,7 +4877,7 @@ class css_style_verticalalign extends css_style_generic {
  * A float style.
  *
  * @package core
- * @category css
+ * @subpackage cssoptimiser
  * @copyright 2012 Sam Hemelryk
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 20fab6f..c7ef03c 100644 (file)
@@ -584,27 +584,6 @@ function get_course($courseid, $clone = true) {
     }
 }
 
-/**
- * Updates a course record in database. If the update affects the global $COURSE
- * or $SITE, then these variables are also changed.
- *
- * @param stdClass $courserec Course record
- * @throws dml_exception If error updating database
- */
-function update_course_record($courserec) {
-    global $DB, $COURSE, $SITE;
-    $DB->update_record('course', $courserec);
-    if (!empty($COURSE->id) && $COURSE->id == $courserec->id) {
-        foreach ((array)$courserec as $name => $value) {
-            $COURSE->{$name} = $value;
-        }
-    } else if (!empty($SITE->id) && $SITE->id == $courserec->id) {
-        foreach ((array)$courserec as $name => $value) {
-            $SITE->{$name} = $value;
-        }
-    }
-}
-
 /**
  * Returns list of courses, for whole site, or category
  *
index 36bee1f..c5e4150 100644 (file)
@@ -96,7 +96,7 @@ function xmldb_main_install() {
     }
     // Make sure site course context exists
     context_course::instance($SITE->id);
-    // Update the global frontpage cache from database.
+    // Update the global frontpage cache
     $SITE = $DB->get_record('course', array('id'=>$newsite->id), '*', MUST_EXIST);
 
 
index abeb09d..a32fa30 100644 (file)
@@ -2159,6 +2159,8 @@ function qf_errorHandler(element, _qfMsg) {
       && div.className != "error") {
         div.className += " error";
         linebreak = document.createElement("br");
+        linebreak.className = "error";
+        linebreak.id = \'id_error_break_\'+element.name;
         errorSpan.parentNode.insertBefore(linebreak, errorSpan.nextSibling);
     }
 
@@ -2168,6 +2170,10 @@ function qf_errorHandler(element, _qfMsg) {
     if (errorSpan) {
       errorSpan.parentNode.removeChild(errorSpan);
     }
+    var linebreak = document.getElementById(\'id_error_break_\'+element.name);
+    if (linebreak) {
+      linebreak.parentNode.removeChild(linebreak);
+    }
 
     if (div.className.substr(div.className.length - 6, 6) == " error") {
       div.className = div.className.substr(0, div.className.length - 6);
@@ -2215,7 +2221,7 @@ function validate_' . $this->_formName . '_' . $escapedElementName . '(element)
   ret = validate_' . $this->_formName . '_' . $escapedElementName.'(frm.elements[\''.$elementName.'\']) && ret;
   if (!ret && !first_focus) {
     first_focus = true;
-    frm.elements[\''.$elementName.'\'].focus();
+    frm.elements[\'id_error_'.$elementName.'\'].focus();
   }
 ';
 
index 21fbfe6..235e3bf 100644 (file)
@@ -247,7 +247,7 @@ class course_modinfo extends stdClass {
         // Check modinfo field is set. If not, build and load it.
         if (empty($course->modinfo) || empty($course->sectioncache)) {
             rebuild_course_cache($course->id);
-            $course = get_course($course->id);
+            $course = $DB->get_record('course', array('id'=>$course->id), '*', MUST_EXIST);
         }
 
         // Set initial values
@@ -1099,7 +1099,8 @@ class cm_info extends stdClass {
         $this->indent           = isset($mod->indent) ? $mod->indent : 0;
         $this->extra            = isset($mod->extra) ? $mod->extra : '';
         $this->extraclasses     = isset($mod->extraclasses) ? $mod->extraclasses : '';
-        $this->iconurl          = isset($mod->iconurl) ? $mod->iconurl : '';
+        // iconurl may be stored as either string or instance of moodle_url.
+        $this->iconurl          = isset($mod->iconurl) ? new moodle_url($mod->iconurl) : '';
         $this->onclick          = isset($mod->onclick) ? $mod->onclick : '';
         $this->content          = isset($mod->content) ? $mod->content : '';
         $this->icon             = isset($mod->icon) ? $mod->icon : '';
@@ -1468,16 +1469,19 @@ function rebuild_course_cache($courseid=0, $clearonly=false) {
     if ($clearonly) {
         if (empty($courseid)) {
             $DB->execute('UPDATE {course} set modinfo = ?, sectioncache = ?', array(null, null));
-            // Clear the cached globals too.
+        } else {
+            // Clear both fields in one update
+            $resetobj = (object)array('id' => $courseid, 'modinfo' => null, 'sectioncache' => null);
+            $DB->update_record('course', $resetobj);
+        }
+        // update cached global COURSE too ;-)
+        if ($courseid == $COURSE->id or empty($courseid)) {
             $COURSE->modinfo = null;
             $COURSE->sectioncache = null;
+        }
+        if ($courseid == $SITE->id) {
             $SITE->modinfo = null;
             $SITE->sectioncache = null;
-        } else {
-            // Clear both fields in one update
-            $resetobj = (object)array('id' => $courseid, 'modinfo' => null, 'sectioncache' => null);
-            // Update course object including cached globals.
-            update_course_record($resetobj);
         }
         // reset the fast modinfo cache
         get_fast_modinfo($courseid, 0, true);
@@ -1499,9 +1503,16 @@ function rebuild_course_cache($courseid=0, $clearonly=false) {
         $sectioncache = serialize(course_modinfo::build_section_cache($course->id));
         $updateobj = (object)array('id' => $course->id,
                 'modinfo' => $modinfo, 'sectioncache' => $sectioncache);
-
-        // Update course object including cached globals.
-        update_course_record($updateobj);
+        $DB->update_record("course", $updateobj);
+        // update cached global COURSE too ;-)
+        if ($course->id == $COURSE->id) {
+            $COURSE->modinfo = $modinfo;
+            $COURSE->sectioncache = $sectioncache;
+        }
+        if ($course->id == $SITE->id) {
+            $SITE->modinfo = $modinfo;
+            $SITE->sectioncache = $sectioncache;
+        }
     }
     $rs->close();
     // reset the fast modinfo cache
index 59666bc..ad04ace 100644 (file)
@@ -2887,7 +2887,7 @@ function require_login($courseorid = null, $autologinguest = true, $cm = null, $
         } else if ($courseorid == SITEID) {
             $course = clone($SITE);
         } else {
-            $course = get_course($courseorid);
+            $course = $DB->get_record('course', array('id' => $courseorid), '*', MUST_EXIST);
         }
         if ($cm) {
             if ($cm->course != $course->id) {
@@ -4912,7 +4912,7 @@ function remove_course_contents($courseid, $showfeedback = true, array $options
     // Some crazy wishlist of stuff we should skip during purging of course content.
     $options = (array)$options;
 
-    $course = get_course($courseid);
+    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
     $coursecontext = context_course::instance($courseid);
     $fs = get_file_storage();
 
@@ -5105,7 +5105,7 @@ function remove_course_contents($courseid, $showfeedback = true, array $options
     if (!empty($options['keep_groups_and_groupings'])) {
         $oldcourse->defaultgroupingid = 0;
     }
-    update_course_record($oldcourse);
+    $DB->update_record('course', $oldcourse);
 
     // Delete course sections and availability options.
     $DB->delete_records_select('course_sections_availability',
index 4fdff85..3a897d7 100644 (file)
@@ -2744,7 +2744,7 @@ class global_navigation_for_ajax extends global_navigation {
                 $this->load_category($this->instanceid, self::TYPE_MY_CATEGORY);
                 break;
             case self::TYPE_COURSE :
-                $course = get_course($this->instanceid);
+                $course = $DB->get_record('course', array('id' => $this->instanceid), '*', MUST_EXIST);
                 require_course_login($course, true, null, false, true);
                 $this->page->set_context(context_course::instance($course->id));
                 $coursenode = $this->add_course($course);
@@ -3742,7 +3742,7 @@ class settings_navigation extends navigation_node {
             require_once($file);
         }
 
-        $modulenode = $this->add(get_string('pluginadministration', $this->page->activityname));
+        $modulenode = $this->add(get_string('pluginadministration', $this->page->activityname), null, self::TYPE_SETTING, null, 'modulesettings');
         $modulenode->force_open();
 
         // Settings for the module
@@ -4149,7 +4149,7 @@ class settings_navigation extends navigation_node {
     protected function load_block_settings() {
         global $CFG;
 
-        $blocknode = $this->add($this->context->get_context_name());
+        $blocknode = $this->add($this->context->get_context_name(), null, self::TYPE_SETTING, null, 'blocksettings');
         $blocknode->force_open();
 
         // Assign local roles
index 89bbd85..9c7db77 100644 (file)
@@ -950,7 +950,7 @@ class moodle_page {
 
         if (!$this->_course || $this->_course->id != $cm->course) {
             if (!$course) {
-                $course = get_course($cm->course);
+                $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
             }
             if ($course->id != $cm->course) {
                 throw new coding_exception('The course you passed to $PAGE->set_cm does not correspond to the $cm.');
index 84db468..d3c3c1e 100644 (file)
@@ -2120,8 +2120,8 @@ class core_accesslib_testcase extends advanced_testcase {
         $guestid = $CFG->siteguest;
 
         // Enrol some users into some courses.
-        $course1 = get_course($testcourses[22]);
-        $course2 = get_course($testcourses[7]);
+        $course1 = $DB->get_record('course', array('id'=>$testcourses[22]), '*', MUST_EXIST);
+        $course2 = $DB->get_record('course', array('id'=>$testcourses[7]), '*', MUST_EXIST);
         $cms = $DB->get_records('course_modules', array('course'=>$course1->id), 'id');
         $cm1 = reset($cms);
         $blocks = $DB->get_records('block_instances', array('parentcontextid'=>context_module::instance($cm1->id)->id), 'id');
@@ -2433,7 +2433,7 @@ class core_accesslib_testcase extends advanced_testcase {
         $miscid = $DB->get_field_sql("SELECT MIN(id) FROM {course_categories}");
         $categorycontext = context_coursecat::instance($miscid);
         $course->category = $miscid;
-        update_course_record($course);
+        $DB->update_record('course', $course);
         $context->update_moved($categorycontext);
 
         $context = context_course::instance($course->id);
@@ -2672,7 +2672,7 @@ class core_accesslib_testcase extends advanced_testcase {
         $miscid = $DB->get_field_sql("SELECT MIN(id) FROM {course_categories}");
         $categorycontext = context_coursecat::instance($miscid);
         $course->category = $miscid;
-        update_course_record($course);
+        $DB->update_record('course', $course);
         context_moved($context, $categorycontext);
         $this->assertDebuggingCalled('context_moved() is deprecated, please use context::update_moved() instead.', DEBUG_DEVELOPER);
         $context = context_course::instance($course->id);
index b56a390..a798e20 100644 (file)
@@ -39,6 +39,11 @@ require_once($CFG->libdir . '/csslib.php');
  */
 class core_csslib_testcase extends advanced_testcase {
 
+    /**
+     * Returns a CSS optimiser
+     *
+     * @return css_optimiser
+     */
     protected function get_optimiser() {
         return new css_optimiser();
     }
@@ -377,6 +382,9 @@ class core_csslib_testcase extends advanced_testcase {
         $this->assertSame($css, $optimiser->process($css));
     }
 
+    /**
+     * Test widths.
+     */
     public function test_widths() {
         $optimiser = new css_optimiser();
 
@@ -503,6 +511,9 @@ class core_csslib_testcase extends advanced_testcase {
         $this->assertSame($cssout, $optimiser->process($cssin));
     }
 
+    /**
+     * Test cursor optimisations
+     */
     public function test_cursor() {
         $optimiser = new css_optimiser();
 
@@ -527,6 +538,9 @@ class core_csslib_testcase extends advanced_testcase {
         $this->assertSame($cssout, $optimiser->process($cssin));
     }
 
+    /**
+     * Test vertical align optimisations
+     */
     public function test_vertical_align() {
         $optimiser = new css_optimiser();
 
@@ -550,6 +564,9 @@ class core_csslib_testcase extends advanced_testcase {
         $this->assertSame($cssout, $optimiser->process($cssin));
     }
 
+    /**
+     * Test float optimisations
+     */
     public function test_float() {
         $optimiser = new css_optimiser();
 
@@ -697,7 +714,7 @@ class core_csslib_testcase extends advanced_testcase {
 
         // Test some complex IE css... I couldn't even think of a more complext solution
         // than the CSS they came up with.
-        $cssin  = 'a { opacity: 0.5; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; filter: alpha(opacity=50); }';
+        $cssin  = 'a { opacity: 0.5;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; filter: alpha(opacity=50); }';
         $cssout = 'a{opacity:0.5;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";filter:alpha(opacity=50);}';
         $this->assertSame($cssout, $optimiser->process($cssin));
     }
@@ -1027,9 +1044,27 @@ CSS;
         $cssin = "@media screen and (min-width:30px) {\n  #region-main-box{background-color:#000;}\n}\n@media screen and (min-width:31px) {\n  #region-main-box{background-color:#FFF;}\n}";
         $cssout = "@media screen and (min-width:30px) { #region-main-box{background-color:#000;} }\n@media screen and (min-width:31px) { #region-main-box{background-color:#FFF;} }";
         $this->assertSame($cssout, $optimiser->process($cssin));
-    }
 
+        $cssin = "@media (min-width: 768px) and (max-width: 979px) {\n*{*zoom:1;}}";
+        $cssout = "@media (min-width: 768px) and (max-width: 979px) { *{*zoom:1;} }";
+        $this->assertSame($cssout, $optimiser->process($cssin));
 
+        $cssin = "#test {min-width:1200px;}@media (min-width: 768px) {#test {min-width: 1024px;}}";
+        $cssout = "#test{min-width:1200px;} \n@media (min-width: 768px) { #test{min-width:1024px;} }";
+        $this->assertSame($cssout, $optimiser->process($cssin));
+
+        $cssin = "@media(min-width:768px){#page-calender-view .container fluid{min-width:1024px}}.section_add_menus{text-align:right}";
+        $cssout = ".section_add_menus{text-align:right;} \n@media (min-width:768px) { #page-calender-view .container fluid{min-width:1024px;} }";
+        $this->assertSame($cssout, $optimiser->process($cssin));
+
+        $cssin = "@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}";
+        $cssout = "@-ms-keyframes progress-bar-stripes {from{background-position:40px 0;}to{background-position:0 0;}}";
+        $this->assertSame($cssout, $optimiser->process($cssin));
+    }
+
+    /**
+     * Test the ordering of CSS optimisationss
+     */
     public function test_css_optimisation_ordering() {
         $optimiser = $this->get_optimiser();
 
@@ -1041,6 +1076,9 @@ CSS;
         $this->assertSame($cssout, $optimiser->process($cssin));
     }
 
+    /**
+     * Test CSS chunking
+     */
     public function test_css_chunking() {
         // Test with an even number of styles.
         $css = 'a{}b{}c{}d{}e{}f{}';
@@ -1143,4 +1181,72 @@ CSS;
         $this->assertInternalType('array', $chunks);
         // I don't care what the outcome is, I just want to make sure it doesn't die.
     }
-}
+
+    /**
+     * Test CSS3.
+     */
+    public function test_css3() {
+        $optimiser = $this->get_optimiser();
+
+        $css = '.test > .test{display:inline-block;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '*{display:inline-block;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = 'div > *{display:inline-block;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = 'div:nth-child(3){display:inline-block;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '.test:nth-child(3){display:inline-block;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '*:nth-child(3){display:inline-block;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '*[id]{display:inline-block;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '*[id=blah]{display:inline-block;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '*[*id=blah]{display:inline-block;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '*[*id=blah_]{display:inline-block;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '*[id^=blah*d]{display:inline-block;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '.test{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '#test{box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);}';
+        $this->assertSame($css, $optimiser->process($css));
+    }
+
+    /**
+     * Test browser hacks here.
+     */
+    public function test_browser_hacks() {
+        $optimiser = $this->get_optimiser();
+
+        $css = '#test{*zoom:1;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '.test{width:75%;*width:76%;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '#test{*zoom:1;*display:inline;}';
+        $this->assertSame($css, $optimiser->process($css));
+
+        $css = '.test{width:75%;*width:76%;width:76%}';
+        $this->assertSame('.test{width:76%;*width:76%;}', $optimiser->process($css));
+
+        $css = '.test{width:75%;*width:76%;*width:75%}';
+        $this->assertSame('.test{width:75%;*width:75%;}', $optimiser->process($css));
+    }
+}
\ No newline at end of file
index 2c06a43..5b0d931 100644 (file)
@@ -52,7 +52,7 @@ class core_event_testcase extends advanced_testcase {
         $this->assertSame('unittest', $event->target);
         $this->assertSame(5, $event->objectid);
         $this->assertSame('u', $event->crud);
-        $this->assertSame(10, $event->level);
+        $this->assertSame(\core\event\base::LEVEL_PARTICIPATING, $event->level);
 
         $this->assertEquals($system, $event->get_context());
         $this->assertSame($system->id, $event->contextid);
@@ -602,6 +602,10 @@ class core_event_testcase extends advanced_testcase {
             $this->assertInstanceOf('\coding_exception', $e);
         }
 
+        $event = \core_tests\event\bad_event2b::create(array('context'=>\context_system::instance()));
+        @$event->trigger();
+        $this->assertDebuggingCalled();
+
         $event = \core_tests\event\bad_event3::create(array('context'=>\context_system::instance()));
         @$event->trigger();
         $this->assertDebuggingCalled();
index a37e2f3..1d775d9 100644 (file)
@@ -41,7 +41,7 @@ class unittest_executed extends \core\event\base {
 
     protected function init() {
         $this->data['crud'] = 'u';
-        $this->data['level'] = 10;
+        $this->data['level'] = self::LEVEL_PARTICIPATING;
     }
 
     public function get_url() {
@@ -116,7 +116,7 @@ class unittest_observer {
 class bad_event1 extends \core\event\base {
     protected function init() {
         //$this->data['crud'] = 'u';
-        $this->data['level'] = 10;
+        $this->data['level'] = self::LEVEL_OTHER;
     }
 }
 
@@ -127,10 +127,18 @@ class bad_event2 extends \core\event\base {
     }
 }
 
+class bad_event2b extends \core\event\base {
+    protected function init() {
+        $this->data['crud'] = 'u';
+        // Invalid level value.
+        $this->data['level'] = -1;
+    }
+}
+
 class bad_event3 extends \core\event\base {
     protected function init() {
         $this->data['crud'] = 'u';
-        $this->data['level'] = 10;
+        $this->data['level'] = self::LEVEL_OTHER;
         unset($this->data['courseid']);
     }
 }
@@ -138,7 +146,7 @@ class bad_event3 extends \core\event\base {
 class bad_event4 extends \core\event\base {
     protected function init() {
         $this->data['crud'] = 'u';
-        $this->data['level'] = 10;
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->data['xxx'] = 1;
     }
 }
@@ -146,14 +154,14 @@ class bad_event4 extends \core\event\base {
 class bad_event5 extends \core\event\base {
     protected function init() {
         $this->data['crud'] = 'x';
-        $this->data['level'] = 10;
+        $this->data['level'] = self::LEVEL_OTHER;
     }
 }
 
 class bad_event6 extends \core\event\base {
     protected function init() {
         $this->data['crud'] = 'c';
-        $this->data['level'] = 10;
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->data['objecttable'] = 'xxx_xxx_xx';
     }
 }
@@ -161,7 +169,7 @@ class bad_event6 extends \core\event\base {
 class bad_event7 extends \core\event\base {
     protected function init() {
         $this->data['crud'] = 'c';
-        $this->data['level'] = 10;
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->data['objecttable'] = null;
     }
 }
@@ -169,14 +177,14 @@ class bad_event7 extends \core\event\base {
 class problematic_event1 extends \core\event\base {
     protected function init() {
         $this->data['crud'] = 'u';
-        $this->data['level'] = 10;
+        $this->data['level'] = self::LEVEL_OTHER;
     }
 }
 
 class problematic_event2 extends \core\event\base {
     protected function init() {
         $this->data['crud'] = 'c';
-        $this->data['level'] = 10;
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->context = \context_system::instance();
     }
 }
@@ -184,7 +192,7 @@ class problematic_event2 extends \core\event\base {
 class problematic_event3 extends \core\event\base {
     protected function init() {
         $this->data['crud'] = 'c';
-        $this->data['level'] = 10;
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->context = \context_system::instance();
     }
 
@@ -199,7 +207,7 @@ class noname_event extends \core\event\base {
 
     protected function init() {
         $this->data['crud'] = 'c';
-        $this->data['level'] = 10;
+        $this->data['level'] = self::LEVEL_OTHER;
         $this->context = \context_system::instance();
     }
 }
index 4e7c1c8..f072009 100644 (file)
@@ -27,7 +27,7 @@ require_once($CFG->dirroot.'/mod/assign/locallib.php');
 // For this type of page this is the course id.
 $id = required_param('id', PARAM_INT);
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id' => $id), '*', MUST_EXIST);
 require_login($course);
 $PAGE->set_url('/mod/assign/index.php', array('id' => $id));
 $PAGE->set_pagelayout('incourse');
index d8cd9ff..49a13f1 100644 (file)
@@ -69,7 +69,7 @@ function assign_reset_userdata($data) {
     $status = array();
     $params = array('courseid'=>$data->courseid);
     $sql = "SELECT a.id FROM {assign} a WHERE a.course=:courseid";
-    $course = get_course($data->courseid);
+    $course = $DB->get_record('course', array('id'=>$data->courseid), '*', MUST_EXIST);
     if ($assigns = $DB->get_records_sql($sql, $params)) {
         foreach ($assigns as $assign) {
             $cm = get_coursemodule_from_instance('assign',
index 9ac7a36..be7eedb 100644 (file)
@@ -575,7 +575,7 @@ class assign {
         $returnid = $DB->insert_record('assign', $update);
         $this->instance = $DB->get_record('assign', array('id'=>$returnid), '*', MUST_EXIST);
         // Cache the course record.
-        $this->course = get_course($formdata->course);
+        $this->course = $DB->get_record('course', array('id'=>$formdata->course), '*', MUST_EXIST);
 
         if ($callplugins) {
             // Call save_settings hook for submission plugins.
index e49ae53..edfe6eb 100644 (file)
@@ -68,7 +68,7 @@ class mod_assign_mod_form extends moodleform_mod {
             if (!$ctx) {
                 $ctx = context_course::instance($this->current->course);
             }
-            $course = get_course($this->current->course);
+            $course = $DB->get_record('course', array('id'=>$this->current->course), '*', MUST_EXIST);
             $assignment->set_course($course);
         }
 
@@ -259,7 +259,7 @@ class mod_assign_mod_form extends moodleform_mod {
             if (!$ctx) {
                 $ctx = context_course::instance($this->current->course);
             }
-            $course = get_course($this->current->course);
+            $course = $DB->get_record('course', array('id'=>$this->current->course), '*', MUST_EXIST);
             $assignment->set_course($course);
         }
         $assignment->plugin_data_preprocessing($defaultvalues);
index 03dadc9..9fa7e24 100644 (file)
@@ -34,7 +34,7 @@ $urlparams = array('id' => $id,
 
 $url = new moodle_url('/mod/assign/view.php', $urlparams);
 $cm = get_coursemodule_from_id('assign', $id, 0, false, MUST_EXIST);
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
 
 require_login($course, true, $cm);
 $PAGE->set_url($url);
index 4ea5a83..63c9507 100644 (file)
@@ -30,7 +30,7 @@ $chapterid = required_param('chapterid', PARAM_INT); // Chapter ID
 $confirm   = optional_param('confirm', 0, PARAM_BOOL);
 
 $cm = get_coursemodule_from_id('book', $id, 0, false, MUST_EXIST);
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 $book = $DB->get_record('book', array('id'=>$cm->instance), '*', MUST_EXIST);
 
 require_login($course, false, $cm);
index f68936e..547a9d1 100644 (file)
@@ -32,7 +32,7 @@ $pagenum    = optional_param('pagenum', 0, PARAM_INT);
 $subchapter = optional_param('subchapter', 0, PARAM_BOOL);
 
 $cm = get_coursemodule_from_id('book', $cmid, 0, false, MUST_EXIST);
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 $book = $DB->get_record('book', array('id'=>$cm->instance), '*', MUST_EXIST);
 
 require_login($course, false, $cm);
index 53a5166..7546188 100644 (file)
@@ -27,7 +27,7 @@ require_once(dirname(__FILE__).'/locallib.php');
 
 $id = required_param('id', PARAM_INT); // Course ID.
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 
 unset($id);
 
index 1d86c93..7ae229b 100644 (file)
@@ -30,7 +30,7 @@ $chapterid = required_param('chapterid', PARAM_INT); // Chapter ID
 $up        = optional_param('up', 0, PARAM_BOOL);
 
 $cm = get_coursemodule_from_id('book', $id, 0, false, MUST_EXIST);
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 $book = $DB->get_record('book', array('id'=>$cm->instance), '*', MUST_EXIST);
 
 require_login($course, false, $cm);
index 6918d4b..7af7de2 100644 (file)
@@ -29,7 +29,7 @@ $id        = required_param('id', PARAM_INT);        // Course Module ID
 $chapterid = required_param('chapterid', PARAM_INT); // Chapter ID
 
 $cm = get_coursemodule_from_id('book', $id, 0, false, MUST_EXIST);
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 $book = $DB->get_record('book', array('id'=>$cm->instance), '*', MUST_EXIST);
 
 require_login($course, false, $cm);
index d49ad62..29418ed 100644 (file)
@@ -32,7 +32,7 @@ require_once($CFG->libdir.'/filelib.php');
 $id = required_param('id', PARAM_INT);           // Course Module ID
 
 $cm = get_coursemodule_from_id('book', $id, 0, false, MUST_EXIST);
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 $book = $DB->get_record('book', array('id'=>$cm->instance), '*', MUST_EXIST);
 
 $PAGE->set_url('/mod/book/tool/exportimscp/index.php', array('id'=>$id));
index 3f1085e..25ee6f7 100644 (file)
@@ -30,7 +30,7 @@ $id        = required_param('id', PARAM_INT);           // Course Module ID
 $chapterid = optional_param('chapterid', 0, PARAM_INT); // Chapter ID
 
 $cm = get_coursemodule_from_id('book', $id, 0, false, MUST_EXIST);
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 $book = $DB->get_record('book', array('id'=>$cm->instance), '*', MUST_EXIST);
 
 require_login($course, false, $cm);
index 3a7308f..cb258b0 100644 (file)
@@ -33,7 +33,7 @@ $chapterid = optional_param('chapterid', 0, PARAM_INT); // Chapter ID
 // =========================================================================
 
 $cm = get_coursemodule_from_id('book', $id, 0, false, MUST_EXIST);
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 $book = $DB->get_record('book', array('id'=>$cm->instance), '*', MUST_EXIST);
 
 require_course_login($course, true, $cm);
index a712101..cf9ed55 100644 (file)
@@ -36,12 +36,12 @@ $edit      = optional_param('edit', -1, PARAM_BOOL);    // Edit mode
 // =========================================================================
 if ($id) {
     $cm = get_coursemodule_from_id('book', $id, 0, false, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
     $book = $DB->get_record('book', array('id'=>$cm->instance), '*', MUST_EXIST);
 } else {
     $book = $DB->get_record('book', array('id'=>$bid), '*', MUST_EXIST);
     $cm = get_coursemodule_from_instance('book', $book->id, 0, false, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
     $id = $cm->id;
 }
 
index 659aa62..edd8e5a 100644 (file)
@@ -14,7 +14,7 @@ $PAGE->set_url($url);
 $PAGE->set_popup_notification_allowed(false); // No popup notifications in the chat window
 
 $chat = $DB->get_record('chat', array('id'=>$id), '*', MUST_EXIST);
-$course = get_course($chat->course);
+$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);
index f1dbd41..9b7425b 100644 (file)
@@ -49,14 +49,14 @@ if ($id) {
     $url->param('id', $id);
     $PAGE->set_url($url);
     $cm     = get_coursemodule_from_id('data', $id, 0, false, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
     $data   = $DB->get_record('data', array('id'=>$cm->instance), '*', MUST_EXIST);
 
 } else {
     $url->param('d', $d);
     $PAGE->set_url($url);
     $data   = $DB->get_record('data', array('id'=>$d), '*', MUST_EXIST);
-    $course = get_course($data->course);
+    $course = $DB->get_record('course', array('id'=>$data->course), '*', MUST_EXIST);
     $cm     = get_coursemodule_from_instance('data', $data->id, $course->id, false, MUST_EXIST);
 }
 
index 02c8301..8e108b9 100644 (file)
@@ -1439,7 +1439,7 @@ function data_rating_validate($params) {
         }
     }
 
-    $course = get_course($info->course);
+    $course = $DB->get_record('course', array('id'=>$info->course), '*', MUST_EXIST);
     $cm = get_coursemodule_from_instance('data', $info->dataid, $course->id, false, MUST_EXIST);
     $context = context_module::instance($cm->id);
 
index ac13d22..673d43a 100644 (file)
@@ -36,12 +36,12 @@ require_once($CFG->libdir.'/xmlize.php');
 $id     = optional_param('id', 0, PARAM_INT);           // course module id
 if ($id) {
     $cm = get_coursemodule_from_id('data', $id, null, null, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
     $data = $DB->get_record('data', array('id'=>$cm->instance), '*', MUST_EXIST);
 } else {
     $d = required_param('d', PARAM_INT);     // database activity id
     $data = $DB->get_record('data', array('id'=>$d), '*', MUST_EXIST);
-    $course = get_course($data->course);
+    $course = $DB->get_record('course', array('id'=>$data->course), '*', MUST_EXIST);
     $cm = get_coursemodule_from_instance('data', $data->id, $course->id, null, MUST_EXIST);
 }
 
index 14d9c2f..a562690 100644 (file)
@@ -35,7 +35,7 @@ $sesskey = optional_param('sesskey', false, PARAM_TEXT);
 $itemorder = optional_param('itemorder', false, PARAM_SEQUENCE);
 
 $cm = get_coursemodule_from_id('feedback', $id, 0, false, MUST_EXIST);
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 $feedback = $DB->get_record('feedback', array('id'=>$cm->instance), '*', MUST_EXIST);
 
 require_sesskey();
index 55e1cac..473f8b8 100644 (file)
@@ -34,7 +34,7 @@ $id = required_param('id', PARAM_INT);  // Course module ID
 $cm = get_coursemodule_from_id('folder', $id, 0, true, MUST_EXIST);
 $context = context_module::instance($cm->id, MUST_EXIST);
 $folder = $DB->get_record('folder', array('id'=>$cm->instance), '*', MUST_EXIST);
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 
 require_login($course, false, $cm);
 require_capability('mod/folder:managefiles', $context);
index a95d1a3..9cbe696 100644 (file)
@@ -28,7 +28,7 @@ require('../../config.php');
 
 $id = required_param('id', PARAM_INT); // course id
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 
 require_course_login($course, true);
 $PAGE->set_pagelayout('incourse');
index 8672d3b..19c16a7 100644 (file)
@@ -41,7 +41,7 @@ if ($f) {  // Two ways to specify the module
     $folder = $DB->get_record('folder', array('id'=>$cm->instance), '*', MUST_EXIST);
 }
 
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 
 require_course_login($course, true, $cm);
 $context = context_module::instance($cm->id);
index 14bc28b..c387790 100644 (file)
@@ -40,7 +40,7 @@
     $PAGE->set_url($url);
 
     $discussion = $DB->get_record('forum_discussions', array('id' => $d), '*', MUST_EXIST);
-    $course = get_course($discussion->course);
+    $course = $DB->get_record('course', array('id' => $discussion->course), '*', MUST_EXIST);
     $forum = $DB->get_record('forum', array('id' => $discussion->forum), '*', MUST_EXIST);
     $cm = get_coursemodule_from_instance('forum', $forum->id, $course->id, false, MUST_EXIST);
 
index 6a7ab62..917bb8a 100644 (file)
@@ -3628,7 +3628,7 @@ function forum_rating_validate($params) {
     $post = $DB->get_record('forum_posts', array('id' => $params['itemid'], 'userid' => $params['rateduserid']), '*', MUST_EXIST);
     $discussion = $DB->get_record('forum_discussions', array('id' => $post->discussion), '*', MUST_EXIST);
     $forum = $DB->get_record('forum', array('id' => $discussion->forum), '*', MUST_EXIST);
-    $course = get_course($forum->course);
+    $course = $DB->get_record('course', array('id' => $forum->course), '*', MUST_EXIST);
     $cm = get_coursemodule_from_instance('forum', $forum->id, $course->id , false, MUST_EXIST);
     $context = context_module::instance($cm->id);
 
@@ -8104,16 +8104,18 @@ function forum_get_courses_user_posted_in($user, $discussionsonly = false, $incl
     // table and join to the userid there. If we are looking for posts then we need
     // to join to the forum_posts table.
     if (!$discussionsonly) {
-        $joinsql = 'JOIN {forum_discussions} fd ON fd.course = c.id
-                    JOIN {forum_posts} fp ON fp.discussion = fd.id';
-        $wheresql = 'fp.userid = :userid';
-        $params = array('userid' => $user->id);
+        $subquery = "(SELECT DISTINCT fd.course
+                         FROM {forum_discussions} fd
+                         JOIN {forum_posts} fp ON fp.discussion = fd.id
+                        WHERE fp.userid = :userid )";
     } else {
-        $joinsql = 'JOIN {forum_discussions} fd ON fd.course = c.id';
-        $wheresql = 'fd.userid = :userid';
-        $params = array('userid' => $user->id);
+        $subquery= "(SELECT DISTINCT fd.course
+                         FROM {forum_discussions} fd
+                        WHERE fd.userid = :userid )";
     }
 
+    $params = array('userid' => $user->id);
+
     // Join to the context table so that we can preload contexts if required.
     if ($includecontexts) {
         $ctxselect = ', ' . context_helper::get_preload_record_columns_sql('ctx');
@@ -8126,11 +8128,10 @@ function forum_get_courses_user_posted_in($user, $discussionsonly = false, $incl
 
     // Now we need to get all of the courses to search.
     // All courses where the user has posted within a forum will be returned.
-    $sql = "SELECT DISTINCT c.* $ctxselect
+    $sql = "SELECT c.* $ctxselect
             FROM {course} c
-            $joinsql
             $ctxjoin
-            WHERE $wheresql";
+            WHERE c.id IN ($subquery)";
     $courses = $DB->get_records_sql($sql, $params, $limitfrom, $limitnum);
     if ($includecontexts) {
         array_map('context_helper::preload_from_record', $courses);
index c246257..1bd5277 100644 (file)
@@ -53,7 +53,7 @@ if (!is_null($sesskey)) {
 $PAGE->set_url($url);
 
 $forum   = $DB->get_record('forum', array('id' => $id), '*', MUST_EXIST);
-$course  = get_course($forum->course);
+$course  = $DB->get_record('course', array('id' => $forum->course), '*', MUST_EXIST);
 $cm      = get_coursemodule_from_instance('forum', $forum->id, $course->id, false, MUST_EXIST);
 $context = context_module::instance($cm->id);
 
index 1dbfe66..87c3b54 100644 (file)
@@ -40,7 +40,7 @@ if ($edit !== 0) {
 $PAGE->set_url($url);
 
 $forum = $DB->get_record('forum', array('id'=>$id), '*', MUST_EXIST);
-$course = get_course($forum->course);
+$course = $DB->get_record('course', array('id'=>$forum->course), '*', MUST_EXIST);
 if (! $cm = get_coursemodule_from_instance('forum', $forum->id, $course->id)) {
     $cm->id = 0;
 }
index e2c7098..90de875 100644 (file)
@@ -99,13 +99,25 @@ class mod_forum_lib_testcase extends advanced_testcase {
         $record->course = $course3->id;
         $forum3 = $this->getDataGenerator()->create_module('forum', $record);
 
-        // Add discussions to course 1 and 2 started by user1.
+        // Add a second forum in course 1.
+        $record = new stdClass();
+        $record->course = $course1->id;
+        $forum4 = $this->getDataGenerator()->create_module('forum', $record);
+
+        // Add discussions to course 1 started by user1.
         $record = new stdClass();
         $record->course = $course1->id;
         $record->userid = $user1->id;
         $record->forum = $forum1->id;
         $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
 
+        $record = new stdClass();
+        $record->course = $course1->id;
+        $record->userid = $user1->id;
+        $record->forum = $forum4->id;
+        $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
+
+        // Add discussions to course2 started by user1.
         $record = new stdClass();
         $record->course = $course2->id;
         $record->userid = $user1->id;
index 5dfebeb..0059ae8 100644 (file)
@@ -90,7 +90,7 @@ $hasparentaccess = $isparent && has_all_capabilities(array('moodle/user:viewdeta
 // Check whether a specific course has been requested
 if ($isspecificcourse) {
     // Get the requested course and its context
-    $course = get_course($courseid);
+    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
     $coursecontext = context_course::instance($courseid, MUST_EXIST);
     // We have a specific course to search, which we will also assume we are within.
     if ($hasparentaccess) {
index 1a7685b..4069376 100644 (file)
@@ -14,7 +14,7 @@ $PAGE->set_url($url);
 $entry = $DB->get_record('glossary_entries', array('id'=> $eid), '*', MUST_EXIST);
 $glossary = $DB->get_record('glossary', array('id'=> $entry->glossaryid), '*', MUST_EXIST);
 $cm = get_coursemodule_from_instance('glossary', $glossary->id, 0, false, MUST_EXIST);
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=> $cm->course), '*', MUST_EXIST);
 
 require_login($course, false, $cm);
 
index 4c22cb7..6a51b2f 100644 (file)
@@ -49,7 +49,7 @@
         if ($COURSE->id == $cm->course) {
             $course = $COURSE;
         } else {
-            $course = get_course($cm->course);
+            $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
         }
         //context id from db should match the submitted one
         if ($context->id != $modcontext->id || !has_capability('mod/glossary:view', $modcontext)) {
index 2623f49..3c927a2 100644 (file)
@@ -23,7 +23,7 @@ if ($eid) {
     $entry = $DB->get_record('glossary_entries', array('id'=>$eid), '*', MUST_EXIST);
     $glossary = $DB->get_record('glossary', array('id'=>$entry->glossaryid), '*', MUST_EXIST);
     $cm = get_coursemodule_from_instance('glossary', $glossary->id, 0, false, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
     require_course_login($course, true, $cm);
     $entry->glossaryname = $glossary->name;
     $entry->cmid = $cm->id;
@@ -31,7 +31,7 @@ if ($eid) {
     $entries = array($entry);
 
 } else if ($concept) {
-    $course = get_course($courseid);
+    $course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
     require_course_login($course);
     $entries = glossary_get_entries_search($concept, $courseid);
 
@@ -45,7 +45,7 @@ if ($entries) {
     foreach ($entries as $key => $entry) {
         // Need to get the course where the entry is,
         // in order to check for visibility/approve permissions there
-        $entrycourse = get_course($entry->courseid);
+        $entrycourse = $DB->get_record('course', array('id' => $entry->courseid), '*', MUST_EXIST);
         $modinfo = get_fast_modinfo($entrycourse);
         // make sure the entry is visible
         if (empty($modinfo->cms[$entry->cmid]->uservisible)) {
index e07ad21..4e986d4 100644 (file)
@@ -25,7 +25,7 @@ if ($eid) {
     $entry = $DB->get_record('glossary_entries', array('id'=>$eid), '*', MUST_EXIST);
     $glossary = $DB->get_record('glossary', array('id'=>$entry->glossaryid), '*', MUST_EXIST);
     $cm = get_coursemodule_from_instance('glossary', $glossary->id, 0, false, MUST_EXIST);
-    $course = get_course($cm->course);
+    $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
     require_course_login($course, true, $cm);
     $entry->glossaryname = $glossary->name;
     $entry->cmid = $cm->id;
@@ -33,7 +33,7 @@ if ($eid) {
     $entries = array($entry);
 
 } else if ($concept) {
-    $course = get_course($courseid);
+    $course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
     require_course_login($course);
     $entries = glossary_get_entries_search($concept, $courseid);
 
@@ -45,7 +45,7 @@ if ($entries) {
     foreach ($entries as $key => $entry) {
         // Need to get the course where the entry is,
         // in order to check for visibility/approve permissions there
-        $entrycourse = get_course($entry->courseid);
+        $entrycourse = $DB->get_record('course', array('id' => $entry->courseid), '*', MUST_EXIST);
         $modinfo = get_fast_modinfo($entrycourse);
         // make sure the entry is visible
         if (empty($modinfo->cms[$entry->cmid]->uservisible)) {
index 10d4550..53505da 100644 (file)
@@ -28,7 +28,7 @@ require('../../config.php');
 
 $id = required_param('id', PARAM_INT); // course id
 
-$course = get_course($id);
+$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 
 require_course_login($course, true);
 $PAGE->set_pagelayout('incourse');
index 975e102..7b59b0b 100644 (file)
@@ -40,7 +40,7 @@ if ($i) {  // Two ways to specify the module
     $imscp = $DB->get_record('imscp', array('id'=>$cm->instance), '*', MUST_EXIST);
 }
 
-$course = get_course($cm->course);
+$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
 
 require_course_login($course, true, $cm);
 $context = context_module::instance($cm->id);