Merge branch 'w24_MDL-33635_m23_sort' of git://github.com/skodak/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 13 Jun 2012 14:40:07 +0000 (16:40 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 13 Jun 2012 14:40:07 +0000 (16:40 +0200)
125 files changed:
admin/registration/index.php
admin/settings/development.php
admin/settings/subsystems.php
backup/backup.php
backup/moodle2/restore_stepslib.php
backup/util/factories/backup_factory.class.php
backup/util/ui/backup_ui_setting.class.php
config-dist.php
course/dnduploadlib.php
course/externallib.php
course/format/topics/lib.php
course/format/weeks/lib.php
course/publish/backup.php
course/renderer.php
course/view.php
enrol/externallib.php
enrol/mnet/addinstance_form.php
enrol/yui/notification/notification.js
files/externallib.php
grade/grading/form/guide/edit_form.php
lib/filelib.php
lib/form/editor.php
lib/outputrequirementslib.php
lib/yui/chooserdialogue/chooserdialogue.js
lib/yui/dragdrop/dragdrop.js
mod/assign/db/messages.php
mod/assign/gradingtable.php
mod/assign/lang/en/assign.php
mod/assign/lib.php
mod/assign/locallib.php
mod/assign/submission/onlinetext/locallib.php
mod/assign/version.php
mod/assignment/lib.php
mod/assignment/type/online/assignment.class.php
mod/book/locallib.php
mod/chat/lang/en/chat.php
mod/choice/lang/en/choice.php
mod/data/field/file/mod.html
mod/data/field/picture/mod.html
mod/data/lang/en/data.php
mod/data/lib.php
mod/data/locallib.php
mod/folder/lang/en/folder.php
mod/folder/lib.php
mod/forum/lang/en/forum.php
mod/forum/post_form.php
mod/glossary/lang/en/glossary.php
mod/glossary/lib.php
mod/label/lang/en/label.php
mod/lesson/lang/en/lesson.php
mod/page/lang/en/page.php
mod/page/lib.php
mod/quiz/edit.php
mod/quiz/lang/en/quiz.php
mod/quiz/lib.php
mod/quiz/mod_form.php
mod/resource/lib.php
mod/resource/mod_form.php
mod/scorm/lang/en/scorm.php
mod/scorm/lib.php
mod/survey/lang/en/survey.php
mod/url/lang/en/url.php
mod/url/lib.php
mod/wiki/lang/en/wiki.php
mod/workshop/submission.php
pix/f/archive.png [new file with mode: 0644]
pix/f/audio.png
pix/f/avi.png
pix/f/base.png [new file with mode: 0644]
pix/f/bmp.png
pix/f/calc.png [new file with mode: 0644]
pix/f/chart.png [new file with mode: 0644]
pix/f/database.png
pix/f/document.png
pix/f/draw.png [new file with mode: 0644]
pix/f/eps.png
pix/f/flash.png
pix/f/gif.png
pix/f/image-128.png
pix/f/image-24.png
pix/f/image-256.png
pix/f/image-32.png
pix/f/image-48.png
pix/f/image-64.png
pix/f/image-72.png
pix/f/image-80.png
pix/f/image-96.png
pix/f/image.png
pix/f/impress.png [new file with mode: 0644]
pix/f/isf.gif [deleted file]
pix/f/isf.png [new file with mode: 0644]
pix/f/jpeg.png
pix/f/markup.png [new file with mode: 0644]
pix/f/math.png [new file with mode: 0644]
pix/f/moodle.png
pix/f/mp3.png
pix/f/mpeg.png
pix/f/oth.png
pix/f/pdf.png
pix/f/png.png
pix/f/powerpoint.png
pix/f/psd.png
pix/f/quicktime.png [new file with mode: 0644]
pix/f/sourcecode.png [new file with mode: 0644]
pix/f/spreadsheet.png
pix/f/text.png
pix/f/tiff.png
pix/f/video.png
pix/f/wav.png
pix/f/wmv.png
pix/f/writer.png [new file with mode: 0644]
question/type/essay/renderer.php
repository/alfresco/lib.php
repository/equella/lib.php
repository/filesystem/lib.php
repository/flickr_public/lib.php
repository/lib.php
repository/repository_ajax.php
repository/webdav/lib.php
theme/base/pix/fp/dnd_arrow.gif [new file with mode: 0644]
theme/base/pix/fp/dnd_arrow.png [deleted file]
theme/base/style/core.css
theme/base/style/course.css
theme/base/style/filemanager.css
theme/yui_combo.php

index 4c841ae..42f1c07 100644 (file)
@@ -160,19 +160,19 @@ if (empty($cancel) and $unregistration and !$confirm) {
     $selectedhuburl = optional_param('publichub', false, PARAM_URL);
     $unlistedhuburl = optional_param('unlistedurl', false, PARAM_TEXT);
     $password = optional_param('password', '', PARAM_RAW);
-
+    $registeringhuburl = null;
     if (!empty($unlistedhuburl)) {
         if (clean_param($unlistedhuburl, PARAM_URL) !== '') {
-            $huburl = $unlistedhuburl;
+            $registeringhuburl = $unlistedhuburl;
         }
     } else if (!empty($selectedhuburl)) {
-        $huburl = $selectedhuburl;
+        $registeringhuburl = $selectedhuburl;
     }
 
     // a hub has been selected, redirect to the hub registration page
-    if (empty($cancel) and !empty($huburl) and confirm_sesskey()) {
-        $hubname = optional_param(clean_param($huburl, PARAM_ALPHANUMEXT), '', PARAM_TEXT);
-        $params = array('sesskey' => sesskey(), 'huburl' => $huburl,
+    if (empty($cancel) and !empty($registeringhuburl) and confirm_sesskey()) {
+        $hubname = optional_param(clean_param($registeringhuburl, PARAM_ALPHANUMEXT), '', PARAM_TEXT);
+        $params = array('sesskey' => sesskey(), 'huburl' => $registeringhuburl,
             'password' => $password, 'hubname' => $hubname);
         redirect(new moodle_url($CFG->wwwroot . "/" . $CFG->admin . "/registration/register.php",
                         $params));
index e55e1f2..5c41b86 100644 (file)
@@ -14,6 +14,7 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
     $temp->add(new admin_setting_configcheckbox('enablegroupmembersonly', new lang_string('enablegroupmembersonly', 'admin'), new lang_string('configenablegroupmembersonly', 'admin'), 0));
 
     $temp->add(new admin_setting_configcheckbox('dndallowtextandlinks', new lang_string('dndallowtextandlinks', 'admin'), new lang_string('configdndallowtextandlinks', 'admin'), 0));
+    $temp->add(new admin_setting_configcheckbox('enablecssoptimiser', new lang_string('enablecssoptimiser','admin'), new lang_string('enablecssoptimiser_desc','admin'), 0));
 
     $ADMIN->add('experimental', $temp);
 
index 7c70af3..0e629b8 100644 (file)
@@ -45,6 +45,4 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
     $checkbox->set_affects_modinfo(true);
 
     $optionalsubsystems->add(new admin_setting_configcheckbox('enableplagiarism', new lang_string('enableplagiarism','plagiarism'), new lang_string('configenableplagiarism','plagiarism'), 0));
-
-    $optionalsubsystems->add(new admin_setting_configcheckbox('enablecssoptimiser', new lang_string('enablecssoptimiser','admin'), new lang_string('enablecssoptimiser_desc','admin'), 0));
 }
index d088cad..ef0a897 100644 (file)
@@ -62,7 +62,7 @@ switch ($type) {
     case backup::TYPE_1SECTION :
         $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
         require_capability('moodle/backup:backupsection', $coursecontext);
-        if (!empty($section->name)) {
+        if ((string)$section->name !== '') {
             $sectionname = format_string($section->name, true, array('context' => $coursecontext));
             $heading = get_string('backupsection', 'backup', $sectionname);
             $PAGE->navbar->add($sectionname);
index 9ee8f5a..60a4086 100644 (file)
@@ -1083,7 +1083,7 @@ class restore_section_structure_step extends restore_structure_step {
         // Section exists, update non-empty information
         } else {
             $section->id = $secrec->id;
-            if (empty($secrec->name)) {
+            if ((string)$secrec->name === '') {
                 $section->name = $data->name;
             }
             if (empty($secrec->summary)) {
index a24905c..e2143cd 100644 (file)
@@ -139,7 +139,7 @@ abstract class backup_factory {
             throw new backup_task_exception('section_task_section_not_found', $sectionid);
         }
 
-        return new backup_section_task(empty($section->name) ? $section->section : $section->name, $sectionid);
+        return new backup_section_task((string)$section->name === '' ? $section->section : $section->name, $sectionid);
     }
 
     /**
index 3db20a1..c18d463 100644 (file)
@@ -129,7 +129,7 @@ class base_setting_ui {
      * @param string $label
      */
     public function set_label($label) {
-        if (empty($label) || $label !== clean_param($label, PARAM_TEXT)) {
+        if ((string)$label === '' || $label !== clean_param($label, PARAM_TEXT)) {
             throw new base_setting_ui_exception('setting_invalid_ui_label');
         }
         $this->label = $label;
index e82d7bd..eb0ab29 100644 (file)
@@ -234,6 +234,10 @@ $CFG->admin = 'admin';
 //         '/filedir'   => '/var/www/moodle/filedir',  // for custom $CFG->filedir locations
 //     );
 //
+// YUI caching may be sometimes improved by slasharguments:
+//     $CFG->yuislasharguments = 1;
+// Some servers may need a special rewrite rule to work around internal path length limitations:
+// RewriteRule (^.*/theme/yui_combo\.php)(/.*) $1?file=$2
 //
 //
 // This setting will prevent the 'My Courses' page being displayed when a student
index 1b07746..816924b 100644 (file)
@@ -39,7 +39,7 @@ require_once($CFG->dirroot.'/course/lib.php');
 function dndupload_add_to_course($course, $modnames) {
     global $CFG, $PAGE;
 
-    $showstatus = optional_param('editingenabled', false, PARAM_BOOL);
+    $showstatus = optional_param('notifyeditingon', false, PARAM_BOOL);
 
     // Get all handlers.
     $handler = new dndupload_handler($course, $modnames);
@@ -671,4 +671,4 @@ class dndupload_ajax_processor {
         echo json_encode($resp);
         die();
     }
-}
\ No newline at end of file
+}
index 71c77c6..b3619c0 100644 (file)
@@ -66,7 +66,7 @@ class core_course_external extends external_api {
      * @return array
      * @since Moodle 2.2
      */
-    public static function get_course_contents($courseid, $options) {
+    public static function get_course_contents($courseid, $options = array()) {
         global $CFG, $DB;
         require_once($CFG->dirroot . "/course/lib.php");
 
@@ -276,7 +276,7 @@ class core_course_external extends external_api {
      * @return array
      * @since Moodle 2.2
      */
-    public static function get_courses($options) {
+    public static function get_courses($options = array()) {
         global $CFG, $DB;
         require_once($CFG->dirroot . "/course/lib.php");
 
@@ -701,7 +701,7 @@ class core_course_external extends external_api {
      * @return array New course info
      * @since Moodle 2.3
      */
-    public static function duplicate_course($courseid, $fullname, $shortname, $categoryid, $visible, $options) {
+    public static function duplicate_course($courseid, $fullname, $shortname, $categoryid, $visible = 1, $options = array()) {
         global $CFG, $USER, $DB;
         require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');
         require_once($CFG->dirroot . '/backup/util/includes/restore_includes.php');
index e8632fc..3728ab2 100644 (file)
@@ -59,7 +59,7 @@ function callback_topics_definition() {
 
 function callback_topics_get_section_name($course, $section) {
     // We can't add a node without any text
-    if (!empty($section->name)) {
+    if ((string)$section->name !== '') {
         return format_string($section->name, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
     } else if ($section->section == 0) {
         return get_string('section0name', 'format_topics');
index a1e1ea9..fe6fd6b 100644 (file)
@@ -66,7 +66,7 @@ function callback_weeks_definition() {
  */
 function callback_weeks_get_section_name($course, $section) {
     // We can't add a node without text
-    if (!empty($section->name)) {
+    if ((string)$section->name !== '') {
         // Return the name the user set.
         return format_string($section->name, true, array('context' => context_course::instance($course->id)));
     } else if ($section->section == 0) {
index 61ab633..ef59eb8 100644 (file)
@@ -81,7 +81,7 @@ if ($backup->get_stage() !== backup_ui::STAGE_COMPLETE) {
         echo $renderer->dependency_notification(get_string('dependenciesenforced', 'backup'));
     }
     echo $renderer->progress_bar($backup->get_progress_bar());
-    echo $backup->display();
+    echo $backup->display($renderer);
     echo $OUTPUT->footer();
     die();
 }
index 22e5e2c..d43d15c 100644 (file)
@@ -188,15 +188,7 @@ class core_course_renderer extends plugin_renderer_base {
         // Put all options into one tag 'alloptions' to allow us to handle scrolling
         $formcontent .= html_writer::start_tag('div', array('class' => 'alloptions'));
 
-        // First display Resources
-        $resources = array_filter($modules,
-                create_function('$mod', 'return ($mod->archetype === MOD_CLASS_RESOURCE);'));
-        if (count($resources)) {
-            $formcontent .= $this->course_modchooser_title('resources');
-            $formcontent .= $this->course_modchooser_module_types($resources);
-        }
-
-        // Then activities
+        // Activities
         $activities = array_filter($modules,
                 create_function('$mod', 'return ($mod->archetype !== MOD_CLASS_RESOURCE);'));
         if (count($activities)) {
@@ -204,6 +196,14 @@ class core_course_renderer extends plugin_renderer_base {
             $formcontent .= $this->course_modchooser_module_types($activities);
         }
 
+        // Resources
+        $resources = array_filter($modules,
+                create_function('$mod', 'return ($mod->archetype === MOD_CLASS_RESOURCE);'));
+        if (count($resources)) {
+            $formcontent .= $this->course_modchooser_title('resources');
+            $formcontent .= $this->course_modchooser_module_types($resources);
+        }
+
         $formcontent .= html_writer::end_tag('div'); // modoptions
         $formcontent .= html_writer::end_tag('div'); // types
 
index 9667832..e0f295b 100644 (file)
             if ($course->id == SITEID) {
                 redirect($CFG->wwwroot .'/?redirect=0');
             } else {
-                $url = new moodle_url($PAGE->url, array('editingenabled' => 1));
+                $url = new moodle_url($PAGE->url, array('notifyeditingon' => 1));
                 redirect($url);
             }
         } else if (($edit == 0) and confirm_sesskey()) {
index 0b10031..147383c 100644 (file)
@@ -152,7 +152,7 @@ class core_enrol_external extends external_api {
      *                               }
      * @return array An array of users
      */
-    public static function get_enrolled_users($courseid, $options) {
+    public static function get_enrolled_users($courseid, $options = array()) {
         global $CFG, $USER, $DB;
         require_once($CFG->dirroot . "/user/lib.php");
 
index f002f54..9e30ce1 100644 (file)
@@ -72,9 +72,10 @@ class enrol_mnet_addinstance_form extends moodleform {
      * Do not allow multiple instances for single remote host
      *
      * @param array $data raw form data
-     * @return array
+     * @param array $files
+     * @return array of errors
      */
-    function validation($data) {
+    function validation($data, $files) {
         global $DB;
 
         $errors = array();
index 1c7e6da..352dd6e 100644 (file)
@@ -73,6 +73,11 @@ Y.extend(DIALOGUE, Y.Overlay, {
                 if (this.get('center') && !e.prevVal && e.newVal) {
                     this.centerDialogue();
                 }
+                if (this.get('draggable')) {
+                    var titlebar = '#' + this.get('id') + ' .' + CSS.HEADER;
+                    this.plug(Y.Plugin.Drag, {handles : [titlebar]});
+                    Y.one(titlebar).setStyle('cursor', 'move');
+                }
                 break;
         }
     },
@@ -110,6 +115,10 @@ Y.extend(DIALOGUE, Y.Overlay, {
         center : {
             validator : Y.Lang.isBoolean,
             value : true
+        },
+        draggable : {
+            validator : Y.Lang.isBoolean,
+            value : false
         }
     }
 });
@@ -372,4 +381,4 @@ M.core.confirm = CONFIRM;
 M.core.exception = EXCEPTION;
 M.core.ajaxException = AJAXEXCEPTION;
 
-}, '@VERSION@', {requires:['base','node','overlay','event-key', 'moodle-enrol-notification-skin']});
\ No newline at end of file
+}, '@VERSION@', {requires:['base','node','overlay','event-key', 'moodle-enrol-notification-skin', 'dd-plugin']});
index ec16724..f6001d2 100644 (file)
@@ -52,7 +52,8 @@ class core_files_external extends external_api {
                 'filearea'  => new external_value(PARAM_TEXT, 'file area'),
                 'itemid'    => new external_value(PARAM_INT, 'associated id'),
                 'filepath'  => new external_value(PARAM_PATH, 'file path'),
-                'filename'  => new external_value(PARAM_FILE, 'file name')
+                'filename'  => new external_value(PARAM_FILE, 'file name'),
+                'modified' => new external_value(PARAM_INT, 'timestamp to return files changed after this time.', VALUE_DEFAULT, null)
             )
         );
     }
@@ -66,12 +67,15 @@ class core_files_external extends external_api {
      * @param int $itemid item id
      * @param string $filepath file path
      * @param string $filename file name
+     * @param int $modified timestamp to return files changed after this time.
      * @return array
      * @since Moodle 2.2
      */
-    public static function get_files($contextid, $component, $filearea, $itemid, $filepath, $filename) {
+    public static function get_files($contextid, $component, $filearea, $itemid, $filepath, $filename, $modified = null) {
         global $CFG, $USER, $OUTPUT;
-        $fileinfo = self::validate_parameters(self::get_files_parameters(), array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid, 'filepath'=>$filepath, 'filename'=>$filename));
+        $fileinfo = self::validate_parameters(self::get_files_parameters(), array(
+                    'contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea,
+                    'itemid'=>$itemid, 'filepath'=>$filepath, 'filename'=>$filename, 'modified'=>$modified));
 
         $browser = get_file_browser();
 
@@ -99,7 +103,10 @@ class core_files_external extends external_api {
         $return = array();
         $return['parents'] = array();
         $return['files'] = array();
-        if ($file = $browser->get_file_info($context, $fileinfo['component'], $fileinfo['filearea'], $fileinfo['itemid'], $fileinfo['filepath'], $fileinfo['filename'])) {
+        $list = array();
+        if ($file = $browser->get_file_info(
+            $context, $fileinfo['component'], $fileinfo['filearea'], $fileinfo['itemid'],
+                $fileinfo['filepath'], $fileinfo['filename'])) {
             $level = $file->get_parent();
             while ($level) {
                 $params = $level->get_params();
@@ -107,36 +114,42 @@ class core_files_external extends external_api {
                 array_unshift($return['parents'], $params);
                 $level = $level->get_parent();
             }
-            $list = array();
             $children = $file->get_children();
             foreach ($children as $child) {
 
                 $params = $child->get_params();
+                $timemodified = $child->get_timemodified();
 
                 if ($child->is_directory()) {
-                    $node = array(
-                        'contextid' => $params['contextid'],
-                        'component' => $params['component'],
-                        'filearea'  => $params['filearea'],
-                        'itemid'    => $params['itemid'],
-                        'filepath'  => $params['filepath'],
-                        'filename'  => $child->get_visible_name(),
-                        'url'       => null,
-                        'isdir'     => true
-                    );
-                    $list[] = $node;
+                    if ((is_null($modified)) or ($modified < $timemodified)) {
+                        $node = array(
+                            'contextid' => $params['contextid'],
+                            'component' => $params['component'],
+                            'filearea'  => $params['filearea'],
+                            'itemid'    => $params['itemid'],
+                            'filepath'  => $params['filepath'],
+                            'filename'  => $child->get_visible_name(),
+                            'url'       => null,
+                            'isdir'     => true,
+                            'timemodified' => $timemodified
+                           );
+                           $list[] = $node;
+                    }
                 } else {
-                    $node = array(
-                        'contextid' => $params['contextid'],
-                        'component' => $params['component'],
-                        'filearea'  => $params['filearea'],
-                        'itemid'    => $params['itemid'],
-                        'filepath'  => $params['filepath'],
-                        'filename'  => $child->get_visible_name(),
-                        'url'       => $child->get_url(),
-                        'isdir'     => false
-                    );
-                    $list[] = $node;
+                    if ((is_null($modified)) or ($modified < $timemodified)) {
+                        $node = array(
+                            'contextid' => $params['contextid'],
+                            'component' => $params['component'],
+                            'filearea'  => $params['filearea'],
+                            'itemid'    => $params['itemid'],
+                            'filepath'  => $params['filepath'],
+                            'filename'  => $child->get_visible_name(),
+                            'url'       => $child->get_url(),
+                            'isdir'     => false,
+                            'timemodified' => $timemodified
+                        );
+                           $list[] = $node;
+                    }
                 }
             }
         }
@@ -176,6 +189,7 @@ class core_files_external extends external_api {
                             'filename' => new external_value(PARAM_FILE, ''),
                             'isdir'    => new external_value(PARAM_BOOL, ''),
                             'url'      => new external_value(PARAM_TEXT, ''),
+                            'timemodified' => new external_value(PARAM_INT, ''),
                         )
                     )
                 )
@@ -219,12 +233,14 @@ class core_files_external extends external_api {
     public static function upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent) {
         global $USER, $CFG;
 
-        $fileinfo = self::validate_parameters(self::upload_parameters(), array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid, 'filepath'=>$filepath, 'filename'=>$filename, 'filecontent'=>$filecontent));
+        $fileinfo = self::validate_parameters(self::upload_parameters(), array(
+            'contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid,
+            'filepath'=>$filepath, 'filename'=>$filename, 'filecontent'=>$filecontent));
 
         if (!isset($fileinfo['filecontent'])) {
             throw new moodle_exception('nofile');
         }
-        // saving file
+        // Saving file.
         $dir = make_temp_directory('wsupload');
 
         if (empty($fileinfo['filename'])) {
@@ -239,7 +255,6 @@ class core_files_external extends external_api {
             $savedfilepath = $dir.$filename;
         }
 
-
         file_put_contents($savedfilepath, base64_decode($fileinfo['filecontent']));
         unset($fileinfo['filecontent']);
 
@@ -250,7 +265,7 @@ class core_files_external extends external_api {
         }
 
         if (isset($fileinfo['itemid'])) {
-            // TODO MDL-31116 in user private area, itemid is always 0
+            // TODO MDL-31116 in user private area, itemid is always 0.
             $itemid = 0;
         } else {
             throw new coding_exception('itemid cannot be empty');
@@ -265,19 +280,19 @@ class core_files_external extends external_api {
         if (!($fileinfo['component'] == 'user' and $fileinfo['filearea'] == 'private')) {
             throw new coding_exception('File can be uploaded to user private area only');
         } else {
-            // TODO MDL-31116 hard-coded to use user_private area
+            // TODO MDL-31116 hard-coded to use user_private area.
             $component = 'user';
             $filearea = 'private';
         }
 
         $browser = get_file_browser();
 
-        // check existing file
+        // Check existing file.
         if ($file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename)) {
             throw new moodle_exception('fileexist');
         }
 
-        // move file to filepool
+        // Move file to filepool.
         if ($dir = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, '.')) {
             $info = $dir->create_file_from_pathname($filename, $savedfilepath);
             $params = $info->get_params();
index a133b4b..ff2e86d 100644 (file)
@@ -56,7 +56,7 @@ class gradingform_guide_editguide extends moodleform {
 
         // Description.
         $options = gradingform_guide_controller::description_form_field_options($this->_customdata['context']);
-        $form->addElement('editor', 'description_editor', get_string('descriptionstudents', 'gradingform_guide'), null, $options);
+        $form->addElement('editor', 'description_editor', get_string('description'), null, $options);
         $form->setType('description_editor', PARAM_RAW);
 
         // Guide completion status.
index ef1abdb..62a21df 100644 (file)
@@ -613,7 +613,7 @@ function file_get_drafarea_files($draftitemid, $filepath = '/') {
             } else {
                 // do NOT use file browser here!
                 $item->mimetype = get_mimetype_description($file);
-                if (file_mimetype_in_typegroup($item->mimetype, 'archive')) {
+                if (file_extension_in_typegroup($file->get_filename(), 'archive')) {
                     $item->type = 'zip';
                 } else {
                     $item->type = 'file';
index f36580b..0f054a5 100644 (file)
@@ -52,7 +52,8 @@ class MoodleQuickForm_editor extends HTML_QuickForm_element {
 
     /** @var array options provided to initalize filepicker */
     protected $_options    = array('subdirs'=>0, 'maxbytes'=>0, 'maxfiles'=>0, 'changeformat'=>0,
-                                   'context'=>null, 'noclean'=>0, 'trusttext'=>0);
+                                   'context'=>null, 'noclean'=>0, 'trusttext'=>0, 'return_types'=>7);
+    // $_options['return_types'] = FILE_INTERNAL | FILE_EXTERNAL | FILE_REFERENCE
 
     /** @var array values for editor */
     protected $_values     = array('text'=>null, 'format'=>null, 'itemid'=>null);
@@ -303,7 +304,7 @@ class MoodleQuickForm_editor extends HTML_QuickForm_element {
             $args = new stdClass();
             // need these three to filter repositories list
             $args->accepted_types = array('web_image');
-            $args->return_types = (FILE_INTERNAL | FILE_EXTERNAL | FILE_REFERENCE);
+            $args->return_types = $this->_options['return_types'];
             $args->context = $ctx;
             $args->env = 'filepicker';
             // advimage plugin
index aa8755e..c4fdd8f 100644 (file)
@@ -152,7 +152,8 @@ class page_requirements_manager {
     public function __construct() {
         global $CFG;
 
-        $sep = empty($CFG->slasharguments) ? '?' : '/';
+        // You may need to set up URL rewrite rule because oversized URLs might not be allowed by web server.
+        $sep = empty($CFG->yuislasharguments) ? '?' : '/';
 
         require_once("$CFG->libdir/yui/phploader/phploader/loader.php");
 
index 7f720d2..ebc37e1 100644 (file)
@@ -22,6 +22,7 @@ YUI.add('moodle-core-chooserdialogue', function(Y) {
             var params = {
                 bodyContent : bodycontent.get('innerHTML'),
                 headerContent : headercontent.get('innerHTML'),
+                draggable : true,
                 visible : false, // Hide by default
                 zindex : 100, // Display in front of other items
                 lightbox : true, // This dialogue should be modal
index 27d0f1d..6669f37 100644 (file)
@@ -135,7 +135,7 @@ YUI.add('moodle-core-dragdrop', function(Y) {
 
         global_drop_over : function(e) {
             // Check that drop object belong to correct group
-            if (!e.drop.inGroup(this.groups)) {
+            if (!e.drop || !e.drop.inGroup(this.groups)) {
                 return;
             }
             //Get a reference to our drag and drop nodes
@@ -168,7 +168,7 @@ YUI.add('moodle-core-dragdrop', function(Y) {
             // this.lastdroptarget (ghost node we use for indicating where to drop)
             e.drag = e.target;
             // Check that drop object belong to correct group
-            if (!e.drag.target.inGroup(this.groups)) {
+            if (!e.drop || !e.drop.inGroup(this.groups)) {
                 return;
             }
             e.drop = this.lastdroptarget;
@@ -177,7 +177,7 @@ YUI.add('moodle-core-dragdrop', function(Y) {
 
         global_drop_hit : function(e) {
             // Check that drop object belong to correct group
-            if (!e.drop.inGroup(this.groups)) {
+            if (!e.drop || !e.drop.inGroup(this.groups)) {
                 return;
             }
             this.drop_hit(e);
index 77581d7..d4c71fd 100644 (file)
 $messageproviders = array (
 
     // Ordinary assignment submissions
-    'assign_student_notification' => array (
-        'capability' => 'mod/assign:submit'
+    'assign_student_notification' => array(
     ),
-    'assign_grader_notification' => array (
+    'assign_grader_notification' => array(
         'capability' => 'mod/assign:grade'
     )
 
index db4432d..5161eeb 100644 (file)
@@ -414,7 +414,7 @@ class assign_grading_table extends table_sql implements renderable {
             if ($row->locked) {
                 $o .= $this->output->container(get_string('submissionslockedshort', 'assign'), 'lockedsubmission');
             }
-            if ($row->grade) {
+            if ($row->grade !== NULL && $row->grade >= 0) {
                 $o .= $this->output->container(get_string('graded', 'assign'), 'submissiongraded');
             }
         }
index 0daa8ca..085ec42 100644 (file)
@@ -153,9 +153,9 @@ $string['manageassignsubmissionplugins'] = 'Manage assignment submission plugins
 $string['messageprovider:assign_student_notification'] = 'Assignment student notifications';
 $string['messageprovider:assign_grader_notification'] = 'Assignment grader notifications';
 $string['modulename'] = 'Assignment';
-$string['modulename_help'] = 'The assignment activity module enables a teacher to assess students’ learning by setting work and then reviewing it and providing feedback and grades.
+$string['modulename_help'] = 'The assignment activity module enables a teacher to communicate tasks, collect work and provide grades and feedback.
 
-Students can submit any digital content (files), such as word-processed documents, spreadsheets, images, audio and video clips. Alternatively, or in addition, the assignment may require students to type text directly into a field using the text editor. An assignment can also be used to remind students of \'real-world\' assignments they need to complete, such as art work, and thus not require any digital content.
+Students can submit any digital content (files), such as word-processed documents, spreadsheets, images, or audio and video clips. Alternatively, or in addition, the assignment may require students to type text directly into the text editor. An assignment can also be used to remind students of \'real-world\' assignments they need to complete offline, such as art work, and thus not require any digital content.
 
 When reviewing assignments, teachers can leave feedback comments and upload files, such as marked-up student submissions, documents with comments or spoken audio feedback. Assignments can be graded using a numerical or custom scale or an advanced grading method such as a rubric. Final grades are recorded in the gradebook.';
 $string['modulename_link'] = 'mod/assignment/view';
@@ -261,4 +261,4 @@ $string['viewownsubmissionform'] = 'View own submit assignment page.';
 $string['viewownsubmissionstatus'] = 'View own submission status page.';
 $string['viewsubmissionforuser'] = 'View submission for user: {$a}';
 $string['viewsubmission'] = 'View submission';
-$string['viewsubmissiongradingtable'] = 'View submission grading table.';
\ No newline at end of file
+$string['viewsubmissiongradingtable'] = 'View submission grading table.';
index b9e71a1..caccf10 100644 (file)
@@ -795,7 +795,7 @@ function assign_update_grades($assign, $userid=0, $nullifnone=true) {
  * @param stdClass $context
  * @return array
  */
-function mod_assign_get_file_areas($course, $cm, $context) {
+function assign_get_file_areas($course, $cm, $context) {
     global $CFG;
     require_once($CFG->dirroot . '/mod/assign/locallib.php');
     $areas = array();
@@ -837,7 +837,7 @@ function mod_assign_get_file_areas($course, $cm, $context) {
  * @param string $filename
  * @return object file_info instance or null if not found
  */
-function mod_assign_get_file_info($browser, $areas, $course, $cm, $context, $filearea, $itemid, $filepath, $filename) {
+function assign_get_file_info($browser, $areas, $course, $cm, $context, $filearea, $itemid, $filepath, $filename) {
     global $CFG;
     require_once($CFG->dirroot . '/mod/assign/locallib.php');
 
index aa53202..0778a89 100644 (file)
@@ -894,8 +894,13 @@ class assign {
 
         if ($this->get_instance()->grade >= 0) {
             // Normal number
-            if ($editing) {
-                $o = '<input type="text" name="quickgrade_' . $userid . '" value="' . format_float($grade) . '" size="6" maxlength="10" class="quickgrade"/>';
+            if ($editing && $this->get_instance()->grade > 0) {
+                if ($grade < 0) {
+                    $displaygrade = '';
+                } else {
+                    $displaygrade = format_float($grade);
+                }
+                $o = '<input type="text" name="quickgrade_' . $userid . '" value="' . $displaygrade . '" size="6" maxlength="10" class="quickgrade"/>';
                 $o .= '&nbsp;/&nbsp;' . format_float($this->get_instance()->grade,2);
                 $o .= '<input type="hidden" name="grademodified_' . $userid . '" value="' . $modified . '"/>';
                 return $o;
@@ -1636,7 +1641,7 @@ class assign {
         }
         if ($grade) {
             $data = new stdClass();
-            if ($grade->grade >= 0) {
+            if ($grade->grade !== NULL && $grade->grade >= 0) {
                 $data->grade = format_float($grade->grade,2);
             }
         } else {
@@ -1897,7 +1902,7 @@ class assign {
     private function is_graded($userid) {
         $grade = $this->get_user_grade($userid, false);
         if ($grade) {
-            return ($grade->grade != '');
+            return ($grade->grade !== NULL && $grade->grade >= 0);
         }
         return false;
     }
index 0ab3777..cfb95ad 100644 (file)
@@ -106,7 +106,8 @@ class assign_submission_onlinetext extends assign_submission_plugin {
            'noclean' => false,
            'maxfiles' => EDITOR_UNLIMITED_FILES,
            'maxbytes' => $this->assignment->get_course()->maxbytes,
-           'context' => $this->assignment->get_context()
+           'context' => $this->assignment->get_context(),
+           'return_types' => FILE_INTERNAL | FILE_EXTERNAL
         );
         return $editoroptions;
     }
index b2b2bfa..af599d0 100644 (file)
@@ -25,7 +25,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $module->component = 'mod_assign'; // Full name of the plugin (used for diagnostics)
-$module->version  = 2012051700;    // The current module version (Date: YYYYMMDDXX)
+$module->version  = 2012061100;    // The current module version (Date: YYYYMMDDXX)
 $module->requires = 2012050300;    // Requires this Moodle version
 $module->cron     = 60;
 
index f82005d..8f8dcf3 100644 (file)
@@ -1113,7 +1113,7 @@ class assignment_base {
             }
         }
 
-        $submitform = new mod_assignment_grading_form( null, $mformdata );
+        $submitform = new assignment_grading_form( null, $mformdata );
 
          if (!$display) {
             $ret_data = new stdClass();
@@ -2422,7 +2422,7 @@ class assignment_base {
 } ////// End of the assignment_base class
 
 
-class mod_assignment_grading_form extends moodleform {
+class assignment_grading_form extends moodleform {
     /** @var stores the advaned grading instance (if used in grading) */
     private $advancegradinginstance;
 
@@ -3994,7 +3994,7 @@ function assignment_get_file_areas($course, $cm, $context) {
  * @param string $filename
  * @return file_info_stored file_info_stored instance or null if not found
  */
-function mod_assignment_get_file_info($browser, $areas, $course, $cm, $context, $filearea, $itemid, $filepath, $filename) {
+function assignment_get_file_info($browser, $areas, $course, $cm, $context, $filearea, $itemid, $filepath, $filename) {
     global $CFG, $DB, $USER;
 
     if ($context->contextlevel != CONTEXT_MODULE || $filearea != 'submission') {
index 163bdab..48819c7 100644 (file)
@@ -42,7 +42,8 @@ class assignment_online extends assignment_base {
                 'noclean'  => false,
                 'maxfiles' => EDITOR_UNLIMITED_FILES,
                 'maxbytes' => $this->course->maxbytes,
-                'context'  => $this->context
+                'context'  => $this->context,
+                'return_types' => FILE_INTERNAL | FILE_EXTERNAL
             );
 
             $data = new stdClass();
index 238913d..b0a23af 100644 (file)
@@ -268,7 +268,11 @@ function book_get_toc($chapters, $chapter, $book, $cm, $edit) {
                     }
                 } else {
                     if ($book->numbering == BOOK_NUM_NUMBERS) {
-                        $title = "x.x $title";
+                        if (empty($chapters[$ch->parent]->hidden)) {
+                            $title = "$nch.x $title";
+                        } else {
+                            $title = "x.x $title";
+                        }
                     }
                     $title = '<span class="dimmed_text">'.$title.'</span>';
                 }
index 3cf196f..25b7b6b 100644 (file)
@@ -75,17 +75,18 @@ $string['methoddaemon'] = 'Chat server daemon';
 $string['methodnormal'] = 'Normal method';
 $string['methodajax'] = 'Ajax method';
 $string['modulename'] = 'Chat';
-$string['modulename_help'] = 'The chat activity module enables participants to have real-time synchronous discussions.
+$string['modulename_help'] = 'The chat activity module enables participants to have text-based, real-time synchronous discussions.
 
-The chat may be a one-off activity or it may be repeated at the same time each day or each week. Chat sessions are saved and can be made available for everyone to view or restricted to users with the capability to view chat session logs.
+The chat may be a one-time activity or it may be repeated at the same time each day or each week. Chat sessions are saved and can be made available for everyone to view or restricted to users with the capability to view chat session logs.
 
 Chats are especially useful when the group chatting is not able to meet face-to-face, such as
 
-* Regular meetings of students doing online courses to enable them to share experiences with others on the same course but in a different city (or country)
+* Regular meetings of students participating in online courses to enable them to share experiences with others in the same course but in a different location
 * A student temporarily unable to attend in person chatting with their teacher to catch up with work
 * Students out on work experience getting together to discuss their experiences with each other and their teacher
 * Younger children using chat at home in the evenings as a controlled (monitored) introduction to the world of social networking
-* A question and answer session with an invited speaker in a different location';
+* A question and answer session with an invited speaker in a different location
+* Sessions to help students prepare for tests where the teacher, or other students, would pose sample questions';
 $string['modulename_link'] = 'mod/chat/view';
 $string['modulenameplural'] = 'Chats';
 $string['neverdeletemessages'] = 'Never delete messages';
index 8e18c00..d1c89c7 100644 (file)
@@ -57,14 +57,14 @@ $string['chooseaction'] = 'Choose an action ...';
 $string['limit'] = 'Limit';
 $string['limitanswers'] = 'Limit the number of responses allowed';
 $string['modulename'] = 'Choice';
-$string['modulename_help'] = 'The choice activity module enables a teacher to ask a question and specify a choice of responses.
+$string['modulename_help'] = 'The choice activity module enables a teacher to ask a single question and offer a selection of possible responses.
 
-Choice results may be published after students have answered, or after a certain date, or not at all. Results may be published together with student names or anonymously.
+Choice results may be published after students have answered, after a certain date, or not at all. Results may be published with student names or anonymously.
 
 A choice activity may be used
 
 * As a quick poll to stimulate thinking about a topic
-To quickly test students\' understanding
+To quickly test students\' understanding
 * To facilitate student decision-making, for example allowing students to vote on a direction for the course';
 $string['modulename_link'] = 'mod/choice/view';
 $string['modulenameplural'] = 'Choices';
index 73815b5..7a67a16 100644 (file)
@@ -12,7 +12,7 @@
             <?php echo get_string('maxsize', 'data'); ?></label></td>
         <td class="c1">
             <?php
-                $course->maxbytes = $DB->get_field('course', 'maxbytes', array('id'=>$this->data->course));
+                $course = $DB->get_record('course', array('id'=>$this->data->course));
                 $choices = get_max_upload_sizes($CFG->maxbytes, $course->maxbytes);
                 echo html_writer::select($choices, 'param3', $this->field->param3, false, array('id' => 'param3'));
             ?>
index 9dd1583..4b32474 100644 (file)
@@ -44,7 +44,7 @@
             <?php echo get_string('maxsize', 'data'); ?></label></td>
         <td class="c1">
             <?php
-                $course->maxbytes = $DB->get_field('course', 'maxbytes', array('id'=>$this->data->course));
+                $course = $DB->get_record('course', array('id'=>$this->data->course));
                 $choices = get_max_upload_sizes($CFG->maxbytes, $course->maxbytes);
                 echo html_writer::select($choices, 'param3', $this->field->param3, false, array('id'=>'param3'));
             ?>
index d676fc1..ed005e6 100644 (file)
@@ -208,18 +208,18 @@ $string['menuchoose'] = 'Choose...';
 $string['missingdata'] = 'Data id or object must be provided to field class';
 $string['missingfield'] = 'Programmer error: You must specify field and/or data when defining field class.';
 $string['modulename'] = 'Database';
-$string['modulename_help'] = 'The database activity module enables participants to create, maintain and search a collection of entries (i.e. records).  The structure of the entries is defined by the teacher as a number of fields. Field types include checkbox, radio buttons, dropdown menu, text area, URL, picture and uploaded file.
+$string['modulename_help'] = 'The database activity module enables participants to create, maintain and search a collection of entries (i.e. records).  The structure of the entries is defined by the teacher as a number of fields. Field types include checkbox, radio buttons, dropdown menu, text area, URL, picture and uploaded file.
 
 The visual layout of information when listing, viewing or editing database entries may be controlled by database templates. Database activities may be shared between courses as presets and a teacher may also import and export database entries.
 
-If the database auto-linking filter is enabled, any entries in a database will be automatically linked to where the words or phrases appear within the course.
+If the database auto-linking filter is enabled, any entries in a database will be automatically linked where the words or phrases appear within the course.
 
-A teacher can allow comments on entries. Entries can also be rated by teachers or students (peer evaluation). Ratings are aggregated to form a final grade which is recorded in the gradebook.
+A teacher can allow comments on entries. Entries can also be rated by teachers or students (peer evaluation). Ratings can be aggregated to form a final grade which is recorded in the gradebook.
 
 Database activities have many uses, such as
 
-* A collaborative collection of web links/books/journal references
-* For displaying student-created photos/posters/websites/poems for peer comment and review';
+* A collaborative collection of web links, books, book reviews, journal references etc
+* For displaying student-created photos, posters, websites or poems for peer comment and review';
 $string['modulename_link'] = 'mod/data/view';
 $string['modulenameplural'] = 'Databases';
 $string['more'] = 'More';
index d21aff3..c23094b 100644 (file)
@@ -2832,7 +2832,7 @@ function data_get_file_areas($course, $cm, $context) {
  * @param string $filename
  * @return file_info_stored file_info_stored instance or null if not found
  */
-function mod_data_get_file_info($browser, $areas, $course, $cm, $context, $filearea, $itemid, $filepath, $filename) {
+function data_get_file_info($browser, $areas, $course, $cm, $context, $filearea, $itemid, $filepath, $filename) {
     global $CFG, $DB;
 
     if ($context->contextlevel != CONTEXT_MODULE) {
index 68a14e4..e06430a 100644 (file)
@@ -150,7 +150,8 @@ class data_portfolio_caller extends portfolio_module_caller_base {
         foreach ($this->records as $record) {
             foreach ($record as $data) {
                 if (is_array($data) || is_object($data)) {
-                    $testkey = array_pop(array_keys($data));
+                    $keys = array_keys($data);
+                    $testkey = array_pop($keys);
                     if (is_array($data[$testkey]) || is_object($data[$testkey])) {
                         foreach ($data as $d) {
                             $str .= implode(',', (array)$d);
index 2cd8381..9197ba0 100644 (file)
@@ -35,7 +35,7 @@ $string['modulename_help'] = 'The folder module enables a teacher to display a n
 
 A folder may be used
 
-* For a series of files on one topic, for example a set of past examination papers in pdf format
+* For a series of files on one topic, for example a set of past examination papers in pdf format or a collection of image files for use in student projects
 * To provide a shared uploading space for teachers on the course page (keeping the folder hidden so that only teachers can see it)';
 $string['modulename_link'] = 'mod/folder/view';
 $string['modulenameplural'] = 'Folders';
index 607e78f..fde1587 100644 (file)
@@ -363,7 +363,7 @@ function folder_export_contents($cm, $baseurl) {
  * Register the ability to handle drag and drop file uploads
  * @return array containing details of the files / types the mod can handle
  */
-function mod_folder_dndupload_register() {
+function folder_dndupload_register() {
     return array('files' => array(
                      array('extension' => 'zip', 'message' => get_string('dnduploadmakefolder', 'mod_folder'))
                  ));
@@ -374,7 +374,7 @@ function mod_folder_dndupload_register() {
  * @param object $uploadinfo details of the file / content that has been uploaded
  * @return int instance id of the newly created mod
  */
-function mod_folder_dndupload_handle($uploadinfo) {
+function folder_dndupload_handle($uploadinfo) {
     global $DB, $USER;
 
     // Gather the required info.
index 745ed34..df64fc9 100644 (file)
@@ -234,24 +234,24 @@ $string['modeflatoldestfirst'] = 'Display replies flat, with oldest first';
 $string['modenested'] = 'Display replies in nested form';
 $string['modethreaded'] = 'Display replies in threaded form';
 $string['modulename'] = 'Forum';
-$string['modulename_help'] = 'The forum activity module enables participants to have asynchronous discussions.
+$string['modulename_help'] = 'The forum activity module enables participants to have asynchronous discussions i.e. discussions that take place over an extended period of time.
 
-There are several forum types to choose from, such as a standard forum where anyone can start a new discussion at any time, a forum where each student can post exactly one discussion, or a question and answer forum where students must first post before being able to view other students\' posts. A teacher can allow files to be attached to forum posts. Attached images are displayed in the forum post.
+There are several forum types to choose from, such as a standard forum where anyone can start a new discussion at any time; a forum where each student can post exactly one discussion; or a question and answer forum where students must first post before being able to view other students\' posts. A teacher can allow files to be attached to forum posts. Attached images are displayed in the forum post.
 
-Participants can subscribe to a forum to receive notifications of new forum posts. A teacher can set the subscription mode to optional, forced or auto, or prevent subscription completely. If required, students can be blocked from posting more than a given number of posts in a given time period to prevent individuals from dominating discussions.
+Participants can subscribe to a forum to receive notifications of new forum posts. A teacher can set the subscription mode to optional, forced or auto, or prevent subscription completely. If required, students can be blocked from posting more than a given number of posts in a given time period; this can prevent individuals from dominating discussions.
 
-Forum posts can be rated by teachers or students (peer evaluation). Ratings are aggregated to form a final grade which is recorded in the gradebook.
+Forum posts can be rated by teachers or students (peer evaluation). Ratings can be aggregated to form a final grade which is recorded in the gradebook.
 
 Forums have many uses, such as
 
-* An introductory space for students on the course to get to know each other
-* A place for course announcements (using a news forum with forced subscription)
-* A help centre where tutors and students can give advice
-* An informal method of sharing (and potentially peer assessing) documents between students
+* A social space for students to get to know each other
+* For course announcements (using a news forum with forced subscription)
+* For discussing course content or reading materials
 * For continuing online an issue raised previously in a face-to-face session
-* A place for teacher-only discussions (using a hidden forum)
-* For extension activities, for example ‘brain teasers’ for students to ponder and suggest solutions to
-* A social space for off-topic discussions';
+* For teacher-only discussions (using a hidden forum)
+* A help centre where tutors and students can give advice
+* A one-on-one support area for private student-teacher communications (using a forum with separate groups and with one student per group)
+* For extension activities, for example ‘brain teasers’ for students to ponder and suggest solutions to';
 $string['modulename_link'] = 'mod/forum/view';
 $string['modulenameplural'] = 'Forums';
 $string['more'] = 'more';
index e3caa53..b475684 100644 (file)
@@ -45,7 +45,8 @@ class mod_forum_post_form extends moodleform {
             $forum->maxbytes = $course->maxbytes;
         }
         // TODO: add max files and max size support
-        $editoroptions = array('maxfiles' => EDITOR_UNLIMITED_FILES, 'trusttext'=>true, 'context'=>$modcontext);
+        $editoroptions = array('maxfiles' => EDITOR_UNLIMITED_FILES, 'trusttext'=>true,
+            'context'=>$modcontext, 'return_types'=>FILE_INTERNAL | FILE_EXTERNAL);
 
         $mform->addElement('header', 'general', '');//fill in the data depending on page params later using set_data
         $mform->addElement('text', 'subject', get_string('subject', 'forum'), 'size="48"');
index c094dfe..631ba06 100644 (file)
@@ -209,13 +209,13 @@ $string['linking'] = 'Auto-linking';
 $string['mainglossary'] = 'Main glossary';
 $string['maxtimehaspassed'] = 'Sorry, but the maximum time for editing this comment ({$a}) has passed!';
 $string['modulename'] = 'Glossary';
-$string['modulename_help'] = 'The glossary activity module enables participants to create and maintain a list of definitions, like a dictionary.
+$string['modulename_help'] = 'The glossary activity module enables participants to create and maintain a list of definitions, like a dictionary, or to collect and organise resources or information.
 
-A teacher can allow files to be attached to glossary entries. Attached images are displayed in the entry. Entries can be searched or browsed alphabetically or by category, date or author. Entries can be approved by default or require approving by a teacher before they are viewable by everyone.
+A teacher can allow files to be attached to glossary entries. Attached images are displayed in the entry. Entries can be searched or browsed alphabetically or by category, date or author. Entries can be approved by default or require approval by a teacher before they are viewable by everyone.
 
-If the glossary auto-linking filter is enabled, entries will be automatically linked to where the concept words and/or phrases appear within the course.
+If the glossary auto-linking filter is enabled, entries will be automatically linked where the concept words and/or phrases appear within the course.
 
-A teacher can allow comments on entries. Entries can also be rated by teachers or students (peer evaluation). Ratings are aggregated to form a final grade which is recorded in the gradebook.
+A teacher can allow comments on entries. Entries can also be rated by teachers or students (peer evaluation). Ratings can be aggregated to form a final grade which is recorded in the gradebook.
 
 Glossaries have many uses, such as
 
index 4c68fb4..0a05ec7 100644 (file)
@@ -1620,7 +1620,7 @@ function glossary_get_file_areas($course, $cm, $context) {
  * @param string $filename
  * @return file_info_stored file_info_stored instance or null if not found
  */
-function mod_glossary_get_file_info($browser, $areas, $course, $cm, $context, $filearea, $itemid, $filepath, $filename) {
+function glossary_get_file_info($browser, $areas, $course, $cm, $context, $filearea, $itemid, $filepath, $filename) {
     global $CFG, $DB;
 
     if ($context->contextlevel != CONTEXT_MODULE) {
index e6c3237..508e43b 100644 (file)
@@ -34,7 +34,7 @@ Labels may be used
 * To split up a long list of activities with a subheading or an image
 * To display an embedded sound file or video directly on the course page
 * To add a short description to a course section';
-$string['modulename_link'] = 'mod/label/link';
+$string['modulename_link'] = 'mod/label/view';
 $string['modulenameplural'] = 'Labels';
 $string['pluginadministration'] = 'Label administration';
 $string['pluginname'] = 'Label';
index 90c7f09..f52affa 100644 (file)
@@ -257,18 +257,15 @@ $string['modattempts'] = 'Allow student review';
 $string['modattempts_help'] = 'If enabled, students can navigate through the lesson again from the start.';
 $string['modattemptsnoteacher'] = 'Student review only works for students.';
 $string['modulename'] = 'Lesson';
-$string['modulename_help'] = 'The lesson activity module enables a teacher to deliver content in an interesting and flexible way.
+$string['modulename_help'] = 'The lesson activity module enables a teacher to deliver content and/or practice activities in  interesting and flexible ways. A teacher can use the lesson to create a linear set of content pages or instructional activities that offer a variety of paths or options for the learner. In either case, teachers can choose to increase engagement and ensure understanding by including a variety of questions, such as multiple choice, matching and short answer. Depending on the student\'s choice of answer and how the teacher develops the lesson, students may progress to the next page, be taken back to a previous page or redirected down a different path entirely.
 
-A lesson consists of a number of pages. Each page normally ends with a question and a number of possible answers. Question types include multiple choice, matching and short answer. Depending on the student\'s choice of answer they either progress to the next page or are taken back to a previous page.
-
-A lesson may be graded if desired, with the grade recorded in the gradebook.
+A lesson may be graded, with the grade recorded in the gradebook.
 
 Lessons may be used
 
 * For self-directed learning of a new topic
-* For role-play simulations / decision-making exercises
-* As a means of catering for different learning styles, for example students can opt for a video page, or a podcast page or a page of text according to their preference
-* For differentiated revision guides, with different sets of revision questions depending upon answers given to initial questions';
+* For  scenarios or simulations/decision-making exercises
+* For differentiated revision, with different sets of revision questions depending upon answers given to initial questions';
 $string['modulename_link'] = 'mod/lesson/view';
 $string['modulenameplural'] = 'Lessons';
 $string['move'] = 'Move page';
index a4d9e02..420aa3c 100644 (file)
@@ -38,9 +38,11 @@ $string['modulename_help'] = 'The page module enables a teacher to create a web
 
 Advantages of using the page module rather than the file module include the resource being more accessible (for example to users of mobile devices) and easier to update.
 
+For large amounts of content, it\'s recommended that a book is used rather than a page.
+
 A page may be used
 
-* To present the terms and conditions of a course or the course syllabus
+* To present the terms and conditions of a course or a summary of the course syllabus
 * To embed several videos or sound files together with some explanatory text';
 $string['modulename_link'] = 'mod/page/view';
 $string['modulenameplural'] = 'Pages';
index 68b813c..3242bd6 100644 (file)
@@ -477,7 +477,7 @@ function page_export_contents($cm, $baseurl) {
  * Register the ability to handle drag and drop file uploads
  * @return array containing details of the files / types the mod can handle
  */
-function mod_page_dndupload_register() {
+function page_dndupload_register() {
     return array('types' => array(
                      array('identifier' => 'text/html', 'message' => get_string('createpage', 'page')),
                      array('identifier' => 'text', 'message' => get_string('createpage', 'page'))
@@ -489,7 +489,7 @@ function mod_page_dndupload_register() {
  * @param object $uploadinfo details of the file / content that has been uploaded
  * @return int instance id of the newly created mod
  */
-function mod_page_dndupload_handle($uploadinfo) {
+function page_dndupload_handle($uploadinfo) {
     // Gather the required info.
     $data = new stdClass();
     $data->course = $uploadinfo->course->id;
index e2f24d2..1f108bf 100644 (file)
@@ -145,10 +145,6 @@ $quizhasattempts = quiz_has_attempts($quiz->id);
 
 $PAGE->set_url($thispageurl);
 
-$pagetitle = get_string('editingquiz', 'quiz');
-if ($quiz_reordertool) {
-    $pagetitle = get_string('orderingquiz', 'quiz');
-}
 // Get the course object and related bits.
 $course = $DB->get_record('course', array('id' => $quiz->course));
 if (!$course) {
@@ -412,7 +408,7 @@ $PAGE->requires->skip_link_to('questionbank',
         get_string('skipto', 'access', get_string('questionbank', 'question')));
 $PAGE->requires->skip_link_to('quizcontentsblock',
         get_string('skipto', 'access', get_string('questionsinthisquiz', 'quiz')));
-$PAGE->set_title($pagetitle);
+$PAGE->set_title(get_string('editingquizx', 'quiz', format_string($quiz->name)));
 $PAGE->set_heading($course->fullname);
 $node = $PAGE->settingsnav->find('mod_quiz_edit', navigation_node::TYPE_SETTING);
 if ($node) {
@@ -498,10 +494,10 @@ if ($quiz_reordertool) {
 }
 
 if ($quiz_reordertool) {
-    echo $OUTPUT->heading_with_help(get_string('orderingquiz', 'quiz') . ': ' . $quiz->name,
+    echo $OUTPUT->heading_with_help(get_string('orderingquizx', 'quiz', format_string($quiz->name)),
             'orderandpaging', 'quiz');
 } else {
-    echo $OUTPUT->heading(get_string('editingquiz', 'quiz') . ': ' . $quiz->name, 2);
+    echo $OUTPUT->heading(get_string('editingquizx', 'quiz', format_string($quiz->name)), 2);
     echo $OUTPUT->help_icon('editingquiz', 'quiz', get_string('basicideasofquiz', 'quiz'));
 }
 quiz_print_status_bar($quiz);
index af3f104..629e2db 100644 (file)
@@ -246,6 +246,7 @@ $string['editingquiz_help'] = 'When creating a quiz, the main concepts are:
 * The question bank, which stores copies of all questions organised into categories
 * Random questions -  A student gets different questions each time they attempt the quiz and different students can get different questions';
 $string['editingquiz_link'] = 'mod/quiz/edit';
+$string['editingquizx'] = 'Editing quiz: {$a}';
 $string['editoverride'] = 'Edit override';
 $string['editqcats'] = 'Edit questions categories';
 $string['editquestions'] = 'Edit questions';
@@ -426,19 +427,20 @@ $string['missingcorrectanswer'] = 'Correct answer must be specified';
 $string['missingitemtypename'] = 'Missing name';
 $string['missingquestion'] = 'This question no longer seems to exist';
 $string['modulename'] = 'Quiz';
-$string['modulename_help'] = 'The quiz activity module enables a teacher to design and set quizzes consisting of a variety of question types, including multiple choice, true-false, matching, short-answer and calculated.
+$string['modulename_help'] = 'The quiz activity enables a teacher to create quizzes comprising questions of various types, including multiple choice, matching, short-answer and numerical.
 
-A teacher can allow the quiz to be attempted multiple times with the order of questions randomly shuffled. A time limit for the quiz may be set if desired.
+The teacher can allow the quiz to be attempted multiple times, with the questions shuffled or randomly selected from the question bank. A time limit may be set.
 
-Each attempt is automatically marked, with the grade recorded in the gradebook. The teacher can choose whether to give feedback and/or show correct answers to the student during the attempt, immediately after the attempt or after the quiz is closed.
+Each attempt is marked automatically, with the exception of essay questions, and the grade is recorded in the gradebook.
 
-A teacher can choose from a variety of question behaviours, including adaptive mode (providing hints before allowing the student to try again) and immediate feedback with certainty-based marking (where the student must indicate how sure they are of the answer).
+The teacher can choose when and if hints, feedback and correct answers are shown to students.
 
 Quizzes may be used
 
+* As course exams
 * As mini tests for reading assignments or at the end of a topic
-* As exam practice using questions from previous years’ exams
-* To provide feedback about performance
+* As exam practice using questions from past exams
+* To deliver immediate feedback about performance
 * For self-assessment';
 $string['modulename_link'] = 'mod/quiz/view';
 $string['modulenameplural'] = 'Quizzes';
@@ -514,6 +516,7 @@ To add page breaks after particular questions, tick the checkboxes next to the q
 
 To arrange the questions over a number of pages, click the Repaginate button and select the desired number of questions per page.';
 $string['orderingquiz'] = 'Order and paging';
+$string['orderingquizx'] = 'Order and paging: {$a}';
 $string['outof'] = '{$a->grade} out of a maximum of {$a->maxgrade}';
 $string['outofpercent'] = '{$a->grade} out of a maximum of {$a->maxgrade} ({$a->percent}%)';
 $string['outofshort'] = '{$a->grade}/{$a->maxgrade}';
@@ -522,9 +525,11 @@ $string['overallfeedback_help'] = 'Overall feedback is text that is shown after
 $string['overdue'] = 'Overdue';
 $string['overduehandling'] = 'When time expires';
 $string['overduehandling_desc'] = 'What should happen by default if a student does not submit the quiz before time expires.';
-$string['overduehandlingautosubmit'] = 'the attempt is submitted automatically';
-$string['overduehandlinggraceperiod'] = 'there is a grace period in which to submit the attempt, but not answer more questions';
-$string['overduehandlingautoabandon'] = 'that is it. The attempt must be submitted before time expires, or it is not counted';
+$string['overduehandling_help'] = 'This setting controls what happens if the Student fails to submit their quiz attempt before time expires. If the student is actively working on the quiz at the time, then the countdown timer will always automatically submit the attempt for them, but if they have logged out, then this setting controls what happens.';
+$string['overduehandling_link'] = 'mod/quiz/timing';
+$string['overduehandlingautosubmit'] = 'Open attempts are submitted automatically';
+$string['overduehandlinggraceperiod'] = 'There is a grace period when open attempts can be submitted, but no more questions answered';
+$string['overduehandlingautoabandon'] = 'Attempts must be submitted before time expires, or they are not counted';
 $string['overduemustbesubmittedby'] = 'This attempt is now overdue. It should already have been submitted. If you would like this quiz to be graded, you must submit it by {$a}. If you do not submit it by then, no marks from this attempt will be counted.';
 $string['override'] = 'Override';
 $string['overridedeletegroupsure'] = 'Are you sure you want to delete the override for group {$a}?';
@@ -609,6 +614,7 @@ $string['quiznavigation'] = 'Quiz navigation';
 $string['quizopen'] = 'Open the quiz';
 $string['quizopenclose'] = 'Open and close dates';
 $string['quizopenclose_help'] = 'Students can only start their attempt(s) after the open time and they must complete their attempts before the close time.';
+$string['quizopenclose_link'] = 'mod/quiz/timing';
 $string['quizopened'] = 'This quiz is open.';
 $string['quizopenedon'] = 'This quiz opened at {$a}';
 $string['quizopens'] = 'Quiz opens';
@@ -810,6 +816,7 @@ $string['timedelay'] = 'You are not allowed to do the quiz since you have not pa
 $string['timeleft'] = 'Time left';
 $string['timelimit'] = 'Time limit';
 $string['timelimit_help'] = 'If enabled, the time limit is stated on the initial quiz page and a countdown timer is displayed in the quiz navigation block.';
+$string['timelimit_link'] = 'mod/quiz/timing';
 $string['timelimitexeeded'] = 'Sorry! Quiz time limit exceeded!';
 $string['timelimitmin'] = 'Time limit (minutes)';
 $string['timelimitsec'] = 'Time limit (seconds)';
index 31cb991..97bd198 100644 (file)
@@ -1741,7 +1741,7 @@ function quiz_pluginfile($course, $cm, $context, $filearea, $args, $forcedownloa
  * @param array $options additional options affecting the file serving
  * @return bool false if file not found, does not return if found - justsend the file
  */
-function mod_quiz_question_pluginfile($course, $context, $component,
+function quiz_question_pluginfile($course, $context, $component,
         $filearea, $qubaid, $slot, $args, $forcedownload, array $options=array()) {
     global $CFG;
     require_once($CFG->dirroot . '/mod/quiz/locallib.php');
index 0b101ec..a074514 100644 (file)
@@ -94,6 +94,7 @@ class mod_quiz_mod_form extends moodleform_mod {
         // What to do with overdue attempts.
         $mform->addElement('select', 'overduehandling', get_string('overduehandling', 'quiz'),
                 quiz_get_overdue_handling_options());
+        $mform->addHelpButton('overduehandling', 'overduehandling', 'quiz');
         $mform->setAdvanced('overduehandling', $quizconfig->overduehandling_adv);
         $mform->setDefault('overduehandling', $quizconfig->overduehandling);
         // TODO Formslib does OR logic on disableif, and we need AND logic here.
index d5f2081..8243c5b 100644 (file)
@@ -484,7 +484,7 @@ function resource_export_contents($cm, $baseurl) {
  * Register the ability to handle drag and drop file uploads
  * @return array containing details of the files / types the mod can handle
  */
-function mod_resource_dndupload_register() {
+function resource_dndupload_register() {
     return array('files' => array(
                      array('extension' => '*', 'message' => get_string('dnduploadresource', 'mod_resource'))
                  ));
@@ -495,7 +495,7 @@ function mod_resource_dndupload_register() {
  * @param object $uploadinfo details of the file / content that has been uploaded
  * @return int instance id of the newly created mod
  */
-function mod_resource_dndupload_handle($uploadinfo) {
+function resource_dndupload_handle($uploadinfo) {
     // Gather the required info.
     $data = new stdClass();
     $data->course = $uploadinfo->course->id;
index 01560dd..7b9d645 100644 (file)
@@ -61,9 +61,6 @@ class mod_resource_mod_form extends moodleform_mod {
         $mform->addElement('header', 'contentsection', get_string('contentheader', 'resource'));
 
         $filemanager_options = array();
-        // 3 == FILE_EXTERNAL | FILE_INTERNAL | FILE_REFERENCE
-        // These two constant names are defined in repository/lib.php
-        $filemanager_options['return_types'] = 7;
         $filemanager_options['accepted_types'] = '*';
         $filemanager_options['maxbytes'] = 0;
         $filemanager_options['maxfiles'] = -1;
index 7b92eda..4f25b70 100644 (file)
@@ -92,6 +92,7 @@ $string['displaycoursestructure_help'] = 'If enabled, the table of contents is d
 $string['displaycoursestructuredesc'] = 'This preference sets the default value for the display course structure on entry page setting';
 $string['displaydesc'] = 'This preference sets the default of whether to display the package or not for an activity';
 $string['displaysettings'] = 'Display Settings';
+$string['dnduploadscorm'] = 'Add a SCORM package';
 $string['domxml'] = 'DOMXML external library';
 $string['duedate'] = 'Due date';
 $string['element'] = 'Element';
@@ -180,7 +181,7 @@ $string['invalidhacpsession'] = 'Invalid HACP Session';
 $string['invalidmanifestresource'] = 'WARNING: The following resources were referenced in your manifest but couldn\'t be found:';
 $string['last'] = 'Last accessed on';
 $string['lastaccess'] = 'Last access';
-$string['lastattempt'] = 'Last attempt';
+$string['lastattempt'] = 'Last completed attempt';
 $string['lastattemptlock'] = 'Lock after final attempt';
 $string['lastattemptlock_help'] = 'If enabled, a student is prevented from launching the SCORM player after using up all their allocated attempts.';
 $string['lastattemptlockdesc'] = 'This preference sets the default value for the lock after final attempt setting';
@@ -334,7 +335,7 @@ $string['versionwarning'] = 'The manifest version is older than 1.3, warning at
 $string['viewallreports'] = 'View reports for {$a} attempts';
 $string['viewalluserreports'] = 'View reports for {$a} users';
 $string['whatgrade'] = 'Attempts grading';
-$string['whatgrade_help'] = 'If multiple attempts are allowed, this setting specifies whether the highest, average (mean), first or last attempt is recorded in the gradebook.
+$string['whatgrade_help'] = 'If multiple attempts are allowed, this setting specifies whether the highest, average (mean), first or last completed attempt is recorded in the gradebook.
 
 Handling of Multiple Attempts
 
index 9849031..7b395f5 100644 (file)
@@ -1258,3 +1258,68 @@ function scorm_get_completion_state($course, $cm, $userid, $type) {
 
     return $result;
 }
+
+/**
+ * Register the ability to handle drag and drop file uploads
+ * @return array containing details of the files / types the mod can handle
+ */
+function scorm_dndupload_register() {
+    return array('files' => array(
+        array('extension' => 'zip', 'message' => get_string('dnduploadscorm', 'scorm'))
+    ));
+}
+
+/**
+ * Handle a file that has been uploaded
+ * @param object $uploadinfo details of the file / content that has been uploaded
+ * @return int instance id of the newly created mod
+ */
+function scorm_dndupload_handle($uploadinfo) {
+
+    $context = context_module::instance($uploadinfo->coursemodule);
+    file_save_draft_area_files($uploadinfo->draftitemid, $context->id, 'mod_scorm', 'package', 0);
+    $fs = get_file_storage();
+    $files = $fs->get_area_files($context->id, 'mod_scorm', 'package', 0, 'sortorder, itemid, filepath, filename', false);
+    $file = reset($files);
+
+    // Validate the file, make sure it's a valid SCORM package!
+    $packer = get_file_packer('application/zip');
+    $filelist = $file->list_files($packer);
+
+    if (!is_array($filelist)) {
+        return false;
+    } else {
+        $manifestpresent = false;
+        $aiccfound = false;
+
+        foreach ($filelist as $info) {
+            if ($info->pathname == 'imsmanifest.xml') {
+                $manifestpresent = true;
+                break;
+            }
+
+            if (preg_match('/\.cst$/', $info->pathname)) {
+                $aiccfound = true;
+                break;
+            }
+        }
+
+        if (!$manifestpresent && !$aiccfound) {
+            return false;
+        }
+    }
+
+    // Create a default scorm object to pass to scorm_add_instance()!
+    $scorm = get_config('scorm');
+    $scorm->course = $uploadinfo->course->id;
+    $scorm->coursemodule = $uploadinfo->coursemodule;
+    $scorm->cmidnumber = '';
+    $scorm->name = $uploadinfo->displayname;
+    $scorm->scormtype = SCORM_TYPE_LOCAL;
+    $scorm->reference = $file->get_filename();
+    $scorm->intro = '';
+    $scorm->width = $scorm->framewidth;
+    $scorm->height = $scorm->frameheight;
+
+    return scorm_add_instance($scorm, null);
+}
index 99aacfe..ea1fbb6 100644 (file)
@@ -206,7 +206,9 @@ $string['invalidsurveyid'] = 'Survey ID was incorrect';
 $string['invalidtmptid'] = 'Invalid template id';
 $string['ipreferthat'] = 'I prefer that';
 $string['modulename'] = 'Survey';
-$string['modulename_help'] = 'The survey activity module provides a number of verified survey instruments that have been found useful in assessing and stimulating learning in online environments. A teacher can use these to gather data from their students that will help them learn about their class and reflect on their own teaching.';
+$string['modulename_help'] = 'The survey activity module provides a number of verified survey instruments that have been found useful in assessing and stimulating learning in online environments. A teacher can use these to gather data from their students that will help them learn about their class and reflect on their own teaching.
+
+Note that these survey tools are pre-populated with questions. Teachers who wish to create their own survey should use the feedback activity module.';
 $string['modulename_link'] = 'mod/survey/view';
 $string['modulenameplural'] = 'Surveys';
 $string['name'] = 'Name';
index 4e41007..cb1b380 100644 (file)
@@ -51,7 +51,9 @@ $string['invalidurl'] = 'Entered URL is invalid';
 $string['modulename'] = 'URL';
 $string['modulename_help'] = 'The URL module enables a teacher to provide a web link as a course resource. Anything that is freely available online, such as documents or images, can be linked to; the URL doesn’t have to be the home page of a website. The URL of a particular web page may be copied and pasted or a teacher can use the file picker and choose a link from a repository such as Flickr, YouTube or Wikimedia (depending upon which repositories are enabled for the site).
 
-There are a number of display options for the URL, such as embedded or opening in a new window and advanced options for passing information, such as a student\'s name, to the URL if required.';
+There are a number of display options for the URL, such as embedded or opening in a new window and advanced options for passing information, such as a student\'s name, to the URL if required.
+
+Note that URLs can also be added to any other resource or activity type through the text editor.';
 $string['modulename_link'] = 'mod/url/view';
 $string['modulenameplural'] = 'URLs';
 $string['neverseen'] = 'Never seen';
index 65c21cf..8fdfee1 100644 (file)
@@ -336,7 +336,7 @@ function url_export_contents($cm, $baseurl) {
  * Register the ability to handle drag and drop file uploads
  * @return array containing details of the files / types the mod can handle
  */
-function mod_url_dndupload_register() {
+function url_dndupload_register() {
     return array('types' => array(
                      array('identifier' => 'url', 'message' => get_string('createurl', 'url'))
                  ));
@@ -347,7 +347,7 @@ function mod_url_dndupload_register() {
  * @param object $uploadinfo details of the file / content that has been uploaded
  * @return int instance id of the newly created mod
  */
-function mod_url_dndupload_handle($uploadinfo) {
+function url_dndupload_handle($uploadinfo) {
     // Gather all the required data.
     $data = new stdClass();
     $data->course = $uploadinfo->course->id;
index f1b9831..4815ba3 100644 (file)
@@ -115,11 +115,11 @@ A history of previous versions of each page in the wiki is kept, listing the edi
 
 Wikis have many uses, such as
 
-* For group lecture notes
+* For group lecture notes or study guides
 * For members of a faculty to plan a scheme of work or meeting agenda together
 * For students to collaboratively author an online book, creating content on a topic set by their tutor
 * For collaborative storytelling or poetry creation, where each participant writes a line or verse
-* As a personal journal for examination notes or revision (individual wiki)';
+* As a personal journal for examination notes or revision (using an individual wiki)';
 $string['modulename_link'] = 'mod/wiki/view';
 $string['modulenameplural'] = 'Wikis';
 $string['navigation'] = 'Navigation';
index efcff41..e17f13b 100644 (file)
@@ -144,7 +144,8 @@ if ($edit) {
                         'subdirs'   => false,
                         'maxfiles'  => $maxfiles,
                         'maxbytes'  => $maxbytes,
-                        'context'   => $workshop->context
+                        'context'   => $workshop->context,
+                        'return_types' => FILE_INTERNAL | FILE_EXTERNAL
                       );
 
     $attachmentopts = array('subdirs' => true, 'maxfiles' => $maxfiles, 'maxbytes' => $maxbytes, 'return_types' => FILE_INTERNAL);
diff --git a/pix/f/archive.png b/pix/f/archive.png
new file mode 100644 (file)
index 0000000..6b20595
Binary files /dev/null and b/pix/f/archive.png differ
index 6882b6f..88bf08d 100644 (file)
Binary files a/pix/f/audio.png and b/pix/f/audio.png differ
index 4491e22..593ffd5 100644 (file)
Binary files a/pix/f/avi.png and b/pix/f/avi.png differ
diff --git a/pix/f/base.png b/pix/f/base.png
new file mode 100644 (file)
index 0000000..9248c8b
Binary files /dev/null and b/pix/f/base.png differ
index a53c85f..b00e6a2 100644 (file)
Binary files a/pix/f/bmp.png and b/pix/f/bmp.png differ
diff --git a/pix/f/calc.png b/pix/f/calc.png
new file mode 100644 (file)
index 0000000..66e9833
Binary files /dev/null and b/pix/f/calc.png differ
diff --git a/pix/f/chart.png b/pix/f/chart.png
new file mode 100644 (file)
index 0000000..ef0b6ee
Binary files /dev/null and b/pix/f/chart.png differ
index 74a2d13..bd55b8b 100644 (file)
Binary files a/pix/f/database.png and b/pix/f/database.png differ
index 1dfb712..253a84c 100644 (file)
Binary files a/pix/f/document.png and b/pix/f/document.png differ
diff --git a/pix/f/draw.png b/pix/f/draw.png
new file mode 100644 (file)
index 0000000..3067ddc
Binary files /dev/null and b/pix/f/draw.png differ
index 8075e23..2c10d87 100644 (file)
Binary files a/pix/f/eps.png and b/pix/f/eps.png differ
index 2cff187..1cd9e63 100644 (file)
Binary files a/pix/f/flash.png and b/pix/f/flash.png differ
index 2e6d160..8f887fa 100644 (file)
Binary files a/pix/f/gif.png and b/pix/f/gif.png differ
index f70d02f..b40a733 100644 (file)
Binary files a/pix/f/image-128.png and b/pix/f/image-128.png differ
index 779415d..42820c9 100644 (file)
Binary files a/pix/f/image-24.png and b/pix/f/image-24.png differ
index ad1c5e7..b081d00 100644 (file)
Binary files a/pix/f/image-256.png and b/pix/f/image-256.png differ
index bfdf341..066ef6c 100644 (file)
Binary files a/pix/f/image-32.png and b/pix/f/image-32.png differ
index 4e46413..1f14a57 100644 (file)
Binary files a/pix/f/image-48.png and b/pix/f/image-48.png differ
index cbed5fb..c181eaa 100644 (file)
Binary files a/pix/f/image-64.png and b/pix/f/image-64.png differ
index 14b9623..72d3390 100644 (file)
Binary files a/pix/f/image-72.png and b/pix/f/image-72.png differ
index 5e23b6c..a20c56b 100644 (file)
Binary files a/pix/f/image-80.png and b/pix/f/image-80.png differ
index 270814b..cbf244f 100644 (file)
Binary files a/pix/f/image-96.png and b/pix/f/image-96.png differ
index a5cd485..dbdbe7f 100644 (file)
Binary files a/pix/f/image.png and b/pix/f/image.png differ
diff --git a/pix/f/impress.png b/pix/f/impress.png
new file mode 100644 (file)
index 0000000..fe4d72f
Binary files /dev/null and b/pix/f/impress.png differ
diff --git a/pix/f/isf.gif b/pix/f/isf.gif
deleted file mode 100644 (file)
index 003ac11..0000000
Binary files a/pix/f/isf.gif and /dev/null differ
diff --git a/pix/f/isf.png b/pix/f/isf.png
new file mode 100644 (file)
index 0000000..762a8a9
Binary files /dev/null and b/pix/f/isf.png differ
index c1fd299..98c868b 100644 (file)
Binary files a/pix/f/jpeg.png and b/pix/f/jpeg.png differ
diff --git a/pix/f/markup.png b/pix/f/markup.png
new file mode 100644 (file)
index 0000000..a067c73
Binary files /dev/null and b/pix/f/markup.png differ
diff --git a/pix/f/math.png b/pix/f/math.png
new file mode 100644 (file)
index 0000000..2d1adc0
Binary files /dev/null and b/pix/f/math.png differ
index 70e3f1b..cc40b7b 100644 (file)
Binary files a/pix/f/moodle.png and b/pix/f/moodle.png differ
index 36db610..3e3b58c 100644 (file)
Binary files a/pix/f/mp3.png and b/pix/f/mp3.png differ
index 3225907..35a7a1d 100644 (file)
Binary files a/pix/f/mpeg.png and b/pix/f/mpeg.png differ
index 57cbf55..24ffc97 100644 (file)
Binary files a/pix/f/oth.png and b/pix/f/oth.png differ
index 92bd3a6..b35e4a1 100644 (file)
Binary files a/pix/f/pdf.png and b/pix/f/pdf.png differ
index 41d52c6..bcc7eed 100644 (file)
Binary files a/pix/f/png.png and b/pix/f/png.png differ
index c127b1d..29b0b3c 100644 (file)
Binary files a/pix/f/powerpoint.png and b/pix/f/powerpoint.png differ
index a6657b2..86690db 100644 (file)
Binary files a/pix/f/psd.png and b/pix/f/psd.png differ
diff --git a/pix/f/quicktime.png b/pix/f/quicktime.png
new file mode 100644 (file)
index 0000000..97b96fb
Binary files /dev/null and b/pix/f/quicktime.png differ
diff --git a/pix/f/sourcecode.png b/pix/f/sourcecode.png
new file mode 100644 (file)
index 0000000..767dfde
Binary files /dev/null and b/pix/f/sourcecode.png differ
index 2fa2c9e..1f35f32 100644 (file)
Binary files a/pix/f/spreadsheet.png and b/pix/f/spreadsheet.png differ
index 91bd190..e9ec05b 100644 (file)
Binary files a/pix/f/text.png and b/pix/f/text.png differ
index 567679a..2c51c32 100644 (file)
Binary files a/pix/f/tiff.png and b/pix/f/tiff.png differ
index 726d1ba..bcefa46 100644 (file)
Binary files a/pix/f/video.png and b/pix/f/video.png differ
index c479357..8927684 100644 (file)
Binary files a/pix/f/wav.png and b/pix/f/wav.png differ
index 67fc572..bcefa46 100644 (file)
Binary files a/pix/f/wmv.png and b/pix/f/wmv.png differ
diff --git a/pix/f/writer.png b/pix/f/writer.png
new file mode 100644 (file)
index 0000000..94d30fe
Binary files /dev/null and b/pix/f/writer.png differ
index 288954f..ac2bac9 100644 (file)
@@ -109,6 +109,7 @@ class qtype_essay_renderer extends qtype_renderer {
         $pickeroptions->itemid = $qa->prepare_response_files_draft_itemid(
                 'attachments', $options->context->id);
         $pickeroptions->context = $options->context;
+        $pickeroptions->return_types = FILE_INTERNAL;
 
         $pickeroptions->itemid = $qa->prepare_response_files_draft_itemid(
                 'attachments', $options->context->id);
@@ -280,7 +281,7 @@ class qtype_essay_format_editor_renderer extends plugin_renderer_base {
      * @return array filepicker options for the editor.
      */
     protected function get_filepicker_options($context, $draftitemid) {
-        return array();
+        return array('return_types'  => FILE_INTERNAL | FILE_EXTERNAL);
     }
 
     /**
index 62d9f75..705e6e9 100644 (file)
@@ -270,7 +270,7 @@ class repository_alfresco extends repository {
      *
      * @return bool
      */
-    public function instance_config_form($mform) {
+    public static function instance_config_form($mform) {
         if (!class_exists('SoapClient')) {
             $mform->addElement('static', null, get_string('notice'), get_string('soapmustbeenabled', 'repository_alfresco'));
             return false;
index 25a544f..b83dbe4 100644 (file)
@@ -195,7 +195,7 @@ class repository_equella extends repository {
      *
      * @param moodleform $mform
      */
-    public function instance_config_form($mform) {
+    public static function instance_config_form($mform) {
         $mform->addElement('text', 'equella_url', get_string('equellaurl', 'repository_equella'));
         $mform->setType('equella_url', PARAM_URL);
 
index 99b9dad..58eddbe 100644 (file)
@@ -166,7 +166,7 @@ class repository_filesystem extends repository {
         return $ret;
     }
 
-    public function instance_config_form($mform) {
+    public static function instance_config_form($mform) {
         global $CFG, $PAGE;
         if (has_capability('moodle/site:config', get_system_context())) {
             $path = $CFG->dataroot . '/repository/';
index 3b34b98..d422483 100644 (file)
@@ -459,7 +459,7 @@ class repository_flickr_public extends repository {
      * Add Instance settings input to Moodle form
      * @param object $mform
      */
-    public function instance_config_form($mform) {
+    public static function instance_config_form($mform) {
         $mform->addElement('text', 'email_address', get_string('emailaddress', 'repository_flickr_public'));
         $mform->addElement('checkbox', 'usewatermarks', get_string('watermark', 'repository_flickr_public'));
         $mform->setDefault('usewatermarks', 0);
index 5f72baf..9142d36 100644 (file)
@@ -644,6 +644,32 @@ abstract class repository {
         }
     }
 
+    /**
+     * Parses the 'source' returned by moodle repositories and returns an instance of stored_file
+     *
+     * @param string $source
+     * @return stored_file|null
+     */
+    public static function get_moodle_file($source) {
+        $params = unserialize(base64_decode($source));
+        if (empty($params) || !is_array($params)) {
+            return null;
+        }
+        foreach (array('contextid', 'itemid', 'filename', 'filepath', 'component') as $key) {
+            if (!array_key_exists($key, $params)) {
+                return null;
+            }
+        }
+        $contextid  = clean_param($params['contextid'], PARAM_INT);
+        $component  = clean_param($params['component'], PARAM_COMPONENT);
+        $filearea   = clean_param($params['filearea'],  PARAM_AREA);
+        $itemid     = clean_param($params['itemid'],    PARAM_INT);
+        $filepath   = clean_param($params['filepath'],  PARAM_PATH);
+        $filename   = clean_param($params['filename'],  PARAM_FILE);
+        $fs = get_file_storage();
+        return $fs->get_file($contextid, $component, $filearea, $itemid, $filepath, $filename);
+    }
+
     /**
      * This function is used to copy a moodle file to draft area
      *
@@ -2002,7 +2028,7 @@ abstract class repository {
      *
      * @param moodleform $mform Moodle form (passed by reference)
      */
-    public function instance_config_form($mform) {
+    public static function instance_config_form($mform) {
     }
 
     /**
@@ -2257,20 +2283,17 @@ final class repository_instance_form extends moodleform {
         $mform =& $this->_form;
 
         $this->add_defaults();
-        //add fields
-        if (!$this->instance) {
-            $result = repository::static_function($this->plugin, 'instance_config_form', $mform);
-            if ($result === false) {
-                $mform->removeElement('name');
-            }
-        } else {
+
+        // Add instance config options.
+        $result = repository::static_function($this->plugin, 'instance_config_form', $mform);
+        if ($result === false) {
+            // Remove the name element if no other config options.
+            $mform->removeElement('name');
+        }
+        if ($this->instance) {
             $data = array();
             $data['name'] = $this->instance->name;
             if (!$this->instance->readonly) {
-                $result = $this->instance->instance_config_form($mform);
-                if ($result === false) {
-                    $mform->removeElement('name');
-                }
                 // and set the data if we have some.
                 foreach ($this->instance->get_instance_option_names() as $config) {
                     if (!empty($this->instance->options[$config])) {
index 240faf3..f39e121 100644 (file)
@@ -231,6 +231,16 @@ switch ($action) {
             $record->timemodified = $now;
             $record->userid = $USER->id;
 
+            // If file is already a reference, set $source = file source, $repo = file repository
+            if ($repo->has_moodle_files()) {
+                $file = repository::get_moodle_file($source);
+                if ($file && $file->is_external_file()) {
+                    $source = $file->get_reference();
+                    $repo_id = $file->get_repository_id();
+                    $repo = repository::get_repository_by_id($repo_id, $contextid, $repooptions);
+                }
+            }
+
             if ($usefilereference) {
                 $reference = $repo->get_file_reference($source);
                 // get reference life time from repo
index a8d4bb9..07c66b1 100644 (file)
@@ -152,7 +152,7 @@ class repository_webdav extends repository {
         return array('webdav_type', 'webdav_server', 'webdav_port', 'webdav_path', 'webdav_user', 'webdav_password', 'webdav_auth');
     }
 
-    public function instance_config_form($mform) {
+    public static function instance_config_form($mform) {
         $choices = array(0 => get_string('http', 'repository_webdav'), 1 => get_string('https', 'repository_webdav'));
         $mform->addElement('select', 'webdav_type', get_string('webdav_type', 'repository_webdav'), $choices);
         $mform->addRule('webdav_type', get_string('required'), 'required', null, 'client');
diff --git a/theme/base/pix/fp/dnd_arrow.gif b/theme/base/pix/fp/dnd_arrow.gif
new file mode 100644 (file)
index 0000000..62d1a5b
Binary files /dev/null and b/theme/base/pix/fp/dnd_arrow.gif differ
diff --git a/theme/base/pix/fp/dnd_arrow.png b/theme/base/pix/fp/dnd_arrow.png
deleted file mode 100644 (file)
index 771f95a..0000000
Binary files a/theme/base/pix/fp/dnd_arrow.png and /dev/null differ
index 7e349d0..67922dd 100644 (file)
@@ -819,7 +819,7 @@ sup {vertical-align: super;}
 }
 
 .moodle-dialogue-base .moodle-dialogue {
-    background-color: transparent;
+    background-color: transparent!important;
     border: 0px solid transparent!important;
 }
 
@@ -843,9 +843,9 @@ sup {vertical-align: super;}
     padding:5px 5px 5px 5px;
     border-radius: 10px 10px 0px 0px;
     border-bottom: 1px solid #BBBBBB!important;
-    background: #CCCCCC;
-    background: -webkit-gradient(linear, left top, left bottom, from(#FFFFFF), to(#CCCCCC));
-    background: -moz-linear-gradient(top,  #FFFFFF,  #CCCCCC);
+    background: #CCCCCC!important;
+    background: -webkit-gradient(linear, left top, left bottom, from(#FFFFFF), to(#CCCCCC))!important;
+    background: -moz-linear-gradient(top,  #FFFFFF,  #CCCCCC)!important;
     filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#CCCCCC')!important;
     filter: dropshadow(color=#FFFFFF, offx=1, offy=1);
 }
@@ -935,7 +935,7 @@ sup {vertical-align: super;}
     left: 18.5em;
     margin: 0;
     padding: 2em 2em 2em 2.4em;
-    background-color: white;
+    background-color: #FFFFFF;
     overflow-x: hidden;
     overflow-y: auto;
     max-height: 550px;
index 5a5fc1a..815efa0 100644 (file)
@@ -8,6 +8,7 @@
 
 .course-content .section .activity img.activityicon {vertical-align:middle;height:16px;width:16px;}
 .course-content .section .activity .commands img.iconsmall {vertical-align: baseline;}
+.course-content .section .activity .commands img {padding: 0 2px;}
 .course-content .section-summary { border: 1px solid #DDD; margin-top: 5px; list-style: none; }
 .course-content .section-summary .section-title  { margin: 2px 5px 2px 5px; }
 .course-content .section-summary .summarytext { margin: 2px 5px 2px 5px; }
index b6ed919..09f98df 100644 (file)
@@ -274,8 +274,7 @@ a.ygtvspacer:hover {color: transparent;text-decoration: none;}
 .dndsupported .dndupload-ready .dndupload-target {display:block;}
 .dndupload-uploadinprogress {display:none;text-align:center;}
 .dndupload-uploading .dndupload-uploadinprogress {display:block;}
-.dndupload-arrow {background:url('[[pix:theme|fp/dnd_arrow]]') center no-repeat;width:56px;height:47px;position:absolute;margin-left: -28px;/*right:46%;left:46%;*/animation:mymove 5s infinite;-moz-animation:mymove 5s infinite;-webkit-animation:mymove 5s infinite;}
-@keyframes mymove {0%{top:10px;} 12%{top:40px;} 30%{top:20px} 65%{top:35px;} 100%{top:9px;}}@-moz-keyframes mymove{0%{top:10px;} 12%{top:40px;} 30%{top:20px} 65%{top:35px;} 100%{top:9px;}}@-webkit-keyframes mymove {0%{top:10px;} 12%{top:40px;} 30%{top:20px} 65%{top:35px;} 100%{top:9px;}}
+.dndupload-arrow {background:url([[pix:theme|fp/dnd_arrow]]) center no-repeat;width:60px;height:80px;position:absolute;margin-left: -28px;top: 5px;}
 
 /*
  * Select Dialogue (File Manager only)
index bafcc1e..2a77538 100644 (file)
@@ -166,7 +166,7 @@ function combo_send_cached($content, $mimetype, $etag, $lastmodified) {
     header('Last-Modified: '. gmdate('D, d M Y H:i:s', $lastmodified) .' GMT');
     header('Expires: '. gmdate('D, d M Y H:i:s', time() + $lifetime) .' GMT');
     header('Pragma: ');
-    header('Cache-Control: max-age='.$lifetime);
+    header('Cache-Control: public, max-age='.$lifetime);
     header('Accept-Ranges: none');
     header('Content-Type: '.$mimetype);
     header('Etag: '.$etag);