Merge branch 'MDL-32908' of git://github.com/danpoltawski/moodle
authorSam Hemelryk <sam@moodle.com>
Tue, 19 Jun 2012 22:31:52 +0000 (10:31 +1200)
committerSam Hemelryk <sam@moodle.com>
Tue, 19 Jun 2012 22:31:52 +0000 (10:31 +1200)
90 files changed:
backup/cc/cc2moodle.php
backup/cc/entities.class.php
backup/cc/entities11.class.php
backup/cc/entity.label.class.php
blocks/blog_recent/block_blog_recent.php
blocks/blog_tags/block_blog_tags.php
course/lib.php
course/tests/courselib_test.php
files/renderer.php
lang/en/moodle.php
lang/en/repository.php
lib/boxlib.php
lib/form/dndupload.js
lib/form/filemanager.js
lib/outputrequirementslib.php
lib/portfolio/forms.php
lib/portfolio/plugin.php
mod/assign/gradingoptionsform.php
mod/assign/gradingtable.php
mod/assign/module.js
mod/book/README.md
mod/book/backup/moodle1/lib.php
mod/book/backup/moodle2/restore_book_stepslib.php
mod/book/db/access.php
mod/book/db/log.php
mod/book/db/upgrade.php
mod/book/delete.php
mod/book/edit.php
mod/book/edit_form.php
mod/book/index.php
mod/book/lang/en/book.php
mod/book/lib.php
mod/book/locallib.php
mod/book/mod_form.php
mod/book/move.php
mod/book/settings.php
mod/book/show.php
mod/book/styles.css
mod/book/tool/exportimscp/db/access.php
mod/book/tool/exportimscp/db/log.php
mod/book/tool/exportimscp/index.php
mod/book/tool/exportimscp/lang/en/booktool_exportimscp.php
mod/book/tool/exportimscp/lib.php
mod/book/tool/exportimscp/locallib.php
mod/book/tool/exportimscp/version.php
mod/book/tool/importhtml/db/access.php
mod/book/tool/importhtml/import_form.php
mod/book/tool/importhtml/index.php
mod/book/tool/importhtml/lang/en/booktool_importhtml.php
mod/book/tool/importhtml/lib.php
mod/book/tool/importhtml/locallib.php
mod/book/tool/importhtml/version.php
mod/book/tool/print/db/access.php
mod/book/tool/print/db/log.php
mod/book/tool/print/index.php
mod/book/tool/print/lang/en/booktool_print.php
mod/book/tool/print/lib.php
mod/book/tool/print/locallib.php
mod/book/tool/print/version.php
mod/book/version.php
mod/book/view.php
mod/glossary/lib.php
mod/quiz/backup/moodle2/restore_quiz_stepslib.php
mod/quiz/report/statistics/db/install.xml
mod/quiz/report/statistics/db/upgrade.php
mod/quiz/report/statistics/version.php
portfolio/boxnet/lib.php
portfolio/flickr/lib.php
portfolio/googledocs/db/upgrade.php
portfolio/googledocs/lang/en/portfolio_googledocs.php
portfolio/googledocs/lib.php
portfolio/mahara/lib.php
portfolio/picasa/db/upgrade.php
portfolio/picasa/lang/en/portfolio_picasa.php
portfolio/picasa/lib.php
portfolio/upgrade.txt [new file with mode: 0644]
repository/boxnet/lib.php
repository/equella/lang/en/repository_equella.php
repository/filepicker.js
repository/googledocs/db/upgrade.php
repository/googledocs/lang/en/repository_googledocs.php
repository/googledocs/lib.php
repository/picasa/db/upgrade.php
repository/picasa/lang/en/repository_picasa.php
repository/picasa/lib.php
repository/upload/lib.php
theme/base/style/core.css
theme/base/style/filemanager.css
theme/base/style/question.css
theme/standard/style/question.css

index 013d891..05e8239 100644 (file)
@@ -620,15 +620,23 @@ class cc2moodle {
                 $array_index++;
 
                 if ($item->nodeName == "item")  {
+                    $identifierref = '';
+                    if ($item->hasAttribute('identifierref')) {
+                      $identifierref = $item->getAttribute('identifierref');
+                    }
 
-                    $identifierref = $xpath->query('@identifierref', $item);
-                    $identifierref = !empty($identifierref->item(0)->nodeValue) ? $identifierref->item(0)->nodeValue : '';
-
-                    $title = $xpath->query('imscc:title', $item);
-                    $title = !empty($title->item(0)->nodeValue) ? $title->item(0)->nodeValue : '';
+                    $title = '';
+                    $titles = $xpath->query('imscc:title', $item);
+                    if ($titles->length > 0) {
+                        $title = $titles->item(0)->nodeValue;
+                    }
 
                     $cc_type = $this->get_item_cc_type($identifierref);
                     $moodle_type = $this->convert_to_moodle_type($cc_type);
+                    //Fix the label issue - MDL-33523
+                    if (empty($identifierref) && empty($title)) {
+                      $moodle_type = TYPE_UNKNOWN;
+                    }
                 }
                 elseif ($item->nodeName == "resource")  {
 
index 625d390..e0737fd 100644 (file)
@@ -262,14 +262,14 @@ class entities {
         if (!empty($labels) && ($labels->length > 0)) {
             $tname = 'course_files';
             $dpath = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $tname;
-            $rfpath = 'folder.gif';
+            $rfpath = 'files.gif';
             $fpath = $dpath . DIRECTORY_SEPARATOR . $rfpath;
 
             if (!file_exists($dpath)) {
                 mkdir($dpath);
             }
             //copy the folder.gif file
-            $folder_gif = "{$CFG->dirroot}/pix/f/folder.gif";
+            $folder_gif = "{$CFG->dirroot}/pix/i/files.gif";
             copy($folder_gif, $fpath);
             $all_files[] = $rfpath;
         }
index 9af9f3c..e9873da 100644 (file)
@@ -62,13 +62,13 @@ class entities11 extends entities {
         if (!empty($labels) && ($labels->length > 0)) {
             $tname = 'course_files';
             $dpath = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $tname;
-            $rfpath = 'folder.gif';
-            $fpath = $dpath . DIRECTORY_SEPARATOR . 'folder.gif';
+            $rfpath = 'files.gif';
+            $fpath = $dpath . DIRECTORY_SEPARATOR . 'files.gif';
             if (!file_exists($dpath)) {
                 mkdir($dpath);
             }
             //copy the folder.gif file
-            $folder_gif = "{$CFG->dirroot}/pix/f/folder.gif";
+            $folder_gif = "{$CFG->dirroot}/pix/i/files.gif";
             copy($folder_gif, $fpath);
             $all_files[] = $rfpath;
         }
index 6c27bf2..e8dfe82 100644 (file)
@@ -52,7 +52,7 @@ class cc_label extends entities {
                            '[#date_now#]');
 
         $title = isset($instance['title']) && !empty($instance['title']) ? $instance['title'] : 'Untitled';
-        $content = "<img src=\"$@FILEPHP@$$@SLASH@$"."folder.gif\" alt=\"Folder\" title=\"{$title}\" /> {$title}";
+        $content = "<img src=\"$@FILEPHP@$$@SLASH@$"."files.gif\" alt=\"Folder\" title=\"{$title}\" /> {$title}";
         $replace_values = array($instance['instance'],
                                 self::safexml($title),
                                 self::safexml($content),
index 20313b6..b3d564f 100644 (file)
@@ -69,6 +69,10 @@ class block_blog_recent extends block_base {
         require_once($CFG->dirroot .'/blog/lib.php');
         require_once($CFG->dirroot .'/blog/locallib.php');
 
+        if (empty($this->config)) {
+            $this->config = new stdClass();
+        }
+
         if (empty($this->config->recentbloginterval)) {
             $this->config->recentbloginterval = 8400;
         }
index c3fa8d8..c84f9d2 100644 (file)
@@ -93,6 +93,10 @@ class block_blog_tags extends block_base {
         // require the libs and do the work
         require_once($CFG->dirroot .'/blog/lib.php');
 
+        if (empty($this->config)) {
+            $this->config = new stdClass();
+        }
+
         if (empty($this->config->timewithin)) {
             $this->config->timewithin = BLOCK_BLOG_TAGS_DEFAULTTIMEWITHIN;
         }
index 1f47a83..82f2b8c 100644 (file)
@@ -3031,20 +3031,13 @@ function move_section_to($course, $section, $destination) {
         }
     }
 
-    // Adjust destination to reflect the actual section
-    $moveup = false;
-    if ($section > $destination) {
-        $destination++;
-        $moveup = true;
-    }
-
     // If we move the highlighted section itself, then just highlight the destination.
     // Adjust the higlighted section location if we move something over it either direction.
     if ($section == $course->marker) {
         course_set_marker($course->id, $destination);
-    } elseif ($moveup && $section > $course->marker && $course->marker >= $destination) {
+    } elseif ($section > $course->marker && $course->marker >= $destination) {
         course_set_marker($course->id, $course->marker+1);
-    } elseif (!$moveup && $section < $course->marker && $course->marker <= $destination) {
+    } elseif ($section < $course->marker && $course->marker <= $destination) {
         course_set_marker($course->id, $course->marker-1);
     }
 
index 2274e6d..42b8057 100644 (file)
@@ -66,7 +66,7 @@ class courselib_testcase extends advanced_testcase {
         $this->assertFalse($neworder);
     }
 
-    public function test_move_section() {
+    public function test_move_section_down() {
         global $DB;
         $this->resetAfterTest(true);
 
@@ -78,6 +78,7 @@ class courselib_testcase extends advanced_testcase {
         }
         ksort($oldsections);
 
+        // Test move section down..
         move_section_to($course, 2, 4);
         $sections = array();
         foreach ($DB->get_records('course_sections', array('course'=>$course->id)) as $section) {
@@ -94,6 +95,77 @@ class courselib_testcase extends advanced_testcase {
         $this->assertEquals($oldsections[6], $sections[6]);
     }
 
+    public function test_move_section_up() {
+        global $DB;
+        $this->resetAfterTest(true);
+
+        $this->getDataGenerator()->create_course(array('numsections'=>5), array('createsections'=>true));
+        $course = $this->getDataGenerator()->create_course(array('numsections'=>10), array('createsections'=>true));
+        $oldsections = array();
+        foreach ($DB->get_records('course_sections', array('course'=>$course->id)) as $section) {
+            $oldsections[$section->section] = $section->id;
+        }
+        ksort($oldsections);
+
+        // Test move section up..
+        move_section_to($course, 6, 4);
+        $sections = array();
+        foreach ($DB->get_records('course_sections', array('course'=>$course->id)) as $section) {
+            $sections[$section->section] = $section->id;
+        }
+        ksort($sections);
+
+        $this->assertEquals($oldsections[0], $sections[0]);
+        $this->assertEquals($oldsections[1], $sections[1]);
+        $this->assertEquals($oldsections[2], $sections[2]);
+        $this->assertEquals($oldsections[3], $sections[3]);
+        $this->assertEquals($oldsections[4], $sections[5]);
+        $this->assertEquals($oldsections[5], $sections[6]);
+        $this->assertEquals($oldsections[6], $sections[4]);
+    }
+
+    public function test_move_section_marker() {
+        global $DB;
+        $this->resetAfterTest(true);
+
+        $this->getDataGenerator()->create_course(array('numsections'=>5), array('createsections'=>true));
+        $course = $this->getDataGenerator()->create_course(array('numsections'=>10), array('createsections'=>true));
+
+        // Set course marker to the section we are going to move..
+        course_set_marker($course->id, 2);
+        // Verify that the course marker is set correctly.
+        $course = $DB->get_record('course', array('id' => $course->id));
+        $this->assertEquals(2, $course->marker);
+
+        // Test move the marked section down..
+        move_section_to($course, 2, 4);
+
+        // Verify that the coruse marker has been moved along with the section..
+        $course = $DB->get_record('course', array('id' => $course->id));
+        $this->assertEquals(4, $course->marker);
+
+        // Test move the marked section up..
+        move_section_to($course, 4, 3);
+
+        // Verify that the course marker has been moved along with the section..
+        $course = $DB->get_record('course', array('id' => $course->id));
+        $this->assertEquals(3, $course->marker);
+
+        // Test moving a non-marked section above the marked section..
+        move_section_to($course, 4, 2);
+
+        // Verify that the course marker has been moved down to accomodate..
+        $course = $DB->get_record('course', array('id' => $course->id));
+        $this->assertEquals(4, $course->marker);
+
+        // Test moving a non-marked section below the marked section..
+        move_section_to($course, 3, 6);
+
+        // Verify that the course marker has been up to accomodate..
+        $course = $DB->get_record('course', array('id' => $course->id));
+        $this->assertEquals(3, $course->marker);
+    }
+
     public function test_get_course_display_name_for_list() {
         global $CFG;
         $this->resetAfterTest(true);
index 2f5f5d4..ee97254 100644 (file)
@@ -303,8 +303,8 @@ class core_files_renderer extends plugin_renderer_base {
         $rv = '
 <div class="filemanager fp-mkdir-dlg">
     <div class="fp-mkdir-dlg-text">'.get_string('newfoldername','repository').'<br/><input type="text" /></div>
-    <a class="{!}fp-dlg-butcreate fp-panel-button" href="#">'.get_string('makeafolder').'</a>
-    <a class="{!}fp-dlg-butcancel fp-panel-button" href="#">'.get_string('cancel').'</a>
+    <button class="{!}fp-dlg-butcreate">'.get_string('makeafolder').'</button>
+    <button class="{!}fp-dlg-butcancel">'.get_string('cancel').'</button>
 </div>';
         return preg_replace('/\{\!\}/', '', $rv);
     }
@@ -370,12 +370,11 @@ class core_files_renderer extends plugin_renderer_base {
         <p>'.get_string('loading', 'repository').'</p>
     </div>
     <form>
-        <div><a class="{!}fp-file-download fp-panel-button" href="#">'.get_string('download').'</a>
-            <a class="{!}fp-file-delete fp-panel-button" href="#">'.get_string('delete').'</a>
-            <a class="{!}fp-file-setmain fp-panel-button" href="#">'.get_string('setmainfile', 'repository').'</a>
-            <a class="{!}fp-file-zip fp-panel-button" href="#">'.get_string('zip', 'editor').'</a>
-            <a class="{!}fp-file-unzip fp-panel-button" href="#">'.get_string('unzip').'</a>
-        </div>
+        <button class="{!}fp-file-download">'.get_string('download').'</button>
+        <button class="{!}fp-file-delete">'.get_string('delete').'</button>
+        <button class="{!}fp-file-setmain">'.get_string('setmainfile', 'repository').'</button>
+        <button class="{!}fp-file-zip">'.get_string('zip', 'editor').'</button>
+        <button class="{!}fp-file-unzip">'.get_string('unzip').'</button>
         <div class="fp-hr"></div>
         <table>
             <tr class="{!}fp-saveas"><td class="mdl-right"><label>'.get_string('name', 'moodle').'</label>:</td>
@@ -391,19 +390,20 @@ class core_files_renderer extends plugin_renderer_base {
             <tr class="{!}fp-reflist"><td class="mdl-right"><label>'.get_string('referenceslist', 'repository').'</label>:</td>
             <td class="mdl-left"><p class="{!}fp-refcount"></p><span class="fp-reflistloading">'.$icon_progress.' '.$strloading.'</span><ul class="fp-value"></ul></td></tr>
         </table>
+        <div class="fp-select-buttons">
+            <button class="{!}fp-file-update">'.get_string('update', 'moodle').'</button>
+            <button class="{!}fp-file-cancel">'.get_string('cancel').'</button>
+        </div>
     </form>
-    <p class="{!}fp-thumbnail"></p>
-    <form>
-        <p class="fp-select-update">
-            <a class="{!}fp-file-update" href="#"><span>'.get_string('update', 'moodle').'</span></a>
-            <a class="{!}fp-file-cancel" href="#"><span>'.get_string('cancel').'</span></a>
-        </p>
-    </form>
-    <div class="fp-fileinfo">
-        <div class="{!}fp-datemodified">'.get_string('lastmodified', 'moodle').': <span class="fp-value"></span></div>
-        <div class="{!}fp-datecreated">'.get_string('datecreated', 'repository').': <span class="fp-value"></span></div>
-        <div class="{!}fp-size">'.get_string('size', 'repository').': <span class="fp-value"></span></div>
-        <div class="{!}fp-dimensions">'.get_string('dimensions', 'repository').': <span class="fp-value"></span></div>
+    <div class="fp-info">
+        <div class="fp-hr"></div>
+        <p class="{!}fp-thumbnail"></p>
+        <div class="fp-fileinfo">
+            <div class="{!}fp-datemodified">'.get_string('lastmodified', 'moodle').': <span class="fp-value"></span></div>
+            <div class="{!}fp-datecreated">'.get_string('datecreated', 'repository').': <span class="fp-value"></span></div>
+            <div class="{!}fp-size">'.get_string('size', 'repository').': <span class="fp-value"></span></div>
+            <div class="{!}fp-dimensions">'.get_string('dimensions', 'repository').': <span class="fp-value"></span></div>
+        </div>
     </div>
 </div>';
         return preg_replace('/\{\!\}/', '', $rv);
@@ -424,8 +424,8 @@ class core_files_renderer extends plugin_renderer_base {
         $rv = '
 <div class="filemanager fp-dlg">
     <div class="{!}fp-dlg-text"></div>
-    <a class="{!}fp-dlg-butconfirm fp-panel-button" href="#">'.get_string('ok').'</a>
-    <a class="{!}fp-dlg-butcancel fp-panel-button" href="#">'.get_string('cancel').'</a>
+    <button class="{!}fp-dlg-butconfirm">'.get_string('delete').'</button>
+    <button class="{!}fp-dlg-butcancel">'.get_string('cancel').'</button>
 </div>';
         return preg_replace('/\{\!\}/', '', $rv);
     }
@@ -661,11 +661,6 @@ class core_files_renderer extends plugin_renderer_base {
         <p>'.get_string('loading', 'repository').'</p>
     </div>
     <form>
-        <div>
-            <a class="{!}fp-select-confirm fp-panel-button" href="#">'.get_string('getfile', 'repository').'</a>
-            <a class="{!}fp-select-cancel fp-panel-button" href="#">'.get_string('cancel').'</a>
-        </div>
-        <div class="fp-hr"></div>
         <table>
             <tr class="{!}fp-linktype-2">
                 <td></td>
@@ -686,16 +681,23 @@ class core_files_renderer extends plugin_renderer_base {
                 <td class="mdl-right"><label>'.get_string('chooselicense', 'repository').'</label>:</td>
                 <td class="mdl-left"><select></select></td></tr>
         </table>
+        <div class="fp-select-buttons">
+            <button class="{!}fp-select-confirm">'.get_string('getfile', 'repository').'</button>
+            <button class="{!}fp-select-cancel">'.get_string('cancel').'</button>
+        </div>
     </form>
-    <p class="{!}fp-thumbnail"></p>
-    <div class="fp-fileinfo">
-        <div class="{!}fp-datemodified">'.get_string('lastmodified', 'moodle').': <span class="fp-value"></span></div>
-        <div class="{!}fp-datecreated">'.get_string('datecreated', 'repository').': <span class="fp-value"></span></div>
-        <div class="{!}fp-size">'.get_string('size', 'repository').': <span class="fp-value"></span></div>
-        <div class="{!}fp-license">'.get_string('license', 'moodle').': <span class="fp-value"></span></div>
-        <div class="{!}fp-author">'.get_string('author', 'repository').': <span class="fp-value"></span></div>
-        <div class="{!}fp-dimensions">'.get_string('dimensions', 'repository').': <span class="fp-value"></span></div>
-    </div>
+    <div class="fp-info">
+        <div class="fp-hr"></div>
+        <p class="{!}fp-thumbnail"></p>
+        <div class="fp-fileinfo">
+            <div class="{!}fp-datemodified">'.get_string('lastmodified', 'moodle').': <span class="fp-value"></span></div>
+            <div class="{!}fp-datecreated">'.get_string('datecreated', 'repository').': <span class="fp-value"></span></div>
+            <div class="{!}fp-size">'.get_string('size', 'repository').': <span class="fp-value"></span></div>
+            <div class="{!}fp-license">'.get_string('license', 'moodle').': <span class="fp-value"></span></div>
+            <div class="{!}fp-author">'.get_string('author', 'repository').': <span class="fp-value"></span></div>
+            <div class="{!}fp-dimensions">'.get_string('dimensions', 'repository').': <span class="fp-value"></span></div>
+        </div>
+    <div>
 </div>';
         return preg_replace('/\{\!\}/', '', $rv);
     }
@@ -791,7 +793,7 @@ class core_files_renderer extends plugin_renderer_base {
         $rv = '
 <div class="file-picker fp-msg">
     <p class="{!}fp-msg-text"></p>
-    <a class="{!}fp-msg-butok fp-panel-button" href="#">'.get_string('ok').'</a>
+    <button class="{!}fp-msg-butok">'.get_string('ok').'</button>
 </div>';
         return preg_replace('/\{\!\}/', '', $rv);
     }
@@ -802,7 +804,8 @@ class core_files_renderer extends plugin_renderer_base {
      * Must have one top element, CSS for this element must define width and height of the window;
      *
      * content of element with class 'fp-dlg-text' will be replaced with dialog text;
-     * elements with classes 'fp-dlg-butoverwrite', 'fp-dlg-butrename' and 'fp-dlg-butcancel' will
+     * elements with classes 'fp-dlg-butoverwrite', 'fp-dlg-butrename',
+     * 'fp-dlg-butoverwriteall', 'fp-dlg-butrenameall' and 'fp-dlg-butcancel' will
      * hold onclick events;
      *
      * content of element with class 'fp-dlg-butrename' will be substituted with appropriate string
@@ -812,11 +815,41 @@ class core_files_renderer extends plugin_renderer_base {
      */
     private function fp_js_template_processexistingfile() {
         $rv = '
+<div class="file-picker fp-dlg">
+    <p class="{!}fp-dlg-text"></p>
+    <div class="fp-dlg-buttons">
+        <button class="{!}fp-dlg-butoverwrite">'.get_string('overwrite', 'repository').'</button>
+        <button class="{!}fp-dlg-butrename"></button>
+        <button class="{!}fp-dlg-butcancel">'.get_string('cancel').'</button>
+    </div>
+</div>';
+        return preg_replace('/\{\!\}/', '', $rv);
+    }
+
+    /**
+     * FilePicker JS template for popup dialogue window asking for action when file with the same name already exists (multiple-file version).
+     *
+     * Must have one top element, CSS for this element must define width and height of the window;
+     *
+     * content of element with class 'fp-dlg-text' will be replaced with dialog text;
+     * elements with classes 'fp-dlg-butoverwrite', 'fp-dlg-butrename' and 'fp-dlg-butcancel' will
+     * hold onclick events;
+     *
+     * content of element with class 'fp-dlg-butrename' will be substituted with appropriate string
+     * (Note that it may have long text)
+     *
+     * @return string
+     */
+    private function fp_js_template_processexistingfilemultiple() {
+        $rv = '
 <div class="file-picker fp-dlg">
     <p class="{!}fp-dlg-text"></p>
     <a class="{!}fp-dlg-butoverwrite fp-panel-button" href="#">'.get_string('overwrite', 'repository').'</a>
     <a class="{!}fp-dlg-butcancel fp-panel-button" href="#">'.get_string('cancel').'</a>
     <a class="{!}fp-dlg-butrename fp-panel-button" href="#"></a>
+    <br/>
+    <a class="{!}fp-dlg-butoverwriteall fp-panel-button" href="#">'.get_string('overwriteall', 'repository').'</a>
+    <a class="{!}fp-dlg-butrenameall fp-panel-button" href="#">'.get_string('renameall', 'repository').'</a>
 </div>';
         return preg_replace('/\{\!\}/', '', $rv);
     }
index 44d2900..4b2b34d 100644 (file)
@@ -682,6 +682,7 @@ $string['failedloginattempts'] = '{$a->attempts} failed logins since your last l
 $string['failedloginattemptsall'] = '{$a->attempts} failed logins for {$a->accounts} accounts';
 $string['feedback'] = 'Feedback';
 $string['file'] = 'File';
+$string['fileexists'] = 'There is already a file called {$a}';
 $string['filemissing'] = '{$a} is missing';
 $string['filetoolarge'] = 'is too large to upload';
 $string['files'] = 'Files';
@@ -1712,7 +1713,7 @@ $string['uploadedfiletoobig'] = 'Sorry, but that file is too big (limit is {$a}
 $string['uploadextension'] = 'File upload stopped by extension';
 $string['uploadfailednotrecovering'] = 'Your file upload has failed because there was a problem with one of the files, {$a->name}.<br /> Here is a log of the problems:<br />{$a->problem}<br />Not recovering.';
 $string['uploadfilelog'] = 'Upload log for file {$a}';
-$string['uploadformlimit'] = 'Uploaded file exceeded the maximum size limit set by the form';
+$string['uploadformlimit'] = 'Uploaded file {$a} exceeded the maximum size limit set by the form';
 $string['uploadlabel'] = 'Title:';
 $string['uploadnewfile'] = 'Upload new file';
 $string['uploadnofilefound'] = 'No file was found - are you sure you selected one to upload?';
index d8d90f0..1245426 100644 (file)
@@ -163,6 +163,7 @@ $string['openpicker'] = 'Choose a file...';
 $string['operation'] = 'Operation';
 $string['on'] = 'Enabled and visible';
 $string['overwrite'] = 'Overwrite';
+$string['overwriteall'] = 'Overwrite all';
 $string['personalrepositories'] = 'Available repository instances';
 $string['plugin'] = 'Repository plug-ins';
 $string['pluginerror'] = 'Errors in repository plugin.';
@@ -176,6 +177,7 @@ $string['referenceslist'] = 'Aliases/Shortcuts';
 $string['refresh'] = 'Refresh';
 $string['refreshnonjsfilepicker'] = 'Please close this window and refresh non-javascript file picker';
 $string['removed'] = 'Repository removed';
+$string['renameall'] = 'Rename all';
 $string['renameto'] = 'Rename to "{$a}"';
 $string['repositories'] = 'Repositories';
 $string['repository'] = 'Repository';
index e1e8387..264b2c5 100644 (file)
@@ -36,8 +36,10 @@ class boxclient {
     /** @var string */
     public $auth_token = '';
     /** @var string */
-    private $_box_api_url = 'http://box.net/api/1.0/rest';
-    private $_box_api_upload_url = 'http://upload.box.net/api/1.0/upload';
+    private $_box_api_url = 'https://www.box.com/api/1.0/rest';
+    private $_box_api_upload_url = 'http://upload.box.com/api/1.0/upload';
+    private $_box_api_download_url = 'http://www.box.com/api/1.0/download';
+    private $_box_api_auth_url = 'http://www.box.com/api/1.0/auth';
     private $_error_code = '';
     private $_error_msg = '';
     /** @var bool */
@@ -67,6 +69,7 @@ class boxclient {
     function makeRequest($method, $params = array()) {
         $this->_clearErrors();
         $c = new curl(array('debug'=>$this->debug, 'cache'=>true, 'module_cache'=>'repository'));
+        $c->setopt(array('CURLOPT_FOLLOWLOCATION'=>1));
         try {
             if ($method == 'upload'){
                 $request = $this->_box_api_upload_url.'/'.
@@ -141,7 +144,7 @@ class boxclient {
             '__login'=>1
             );
         try {
-            $ret = $c->post('http://www.box.net/api/1.0/auth/'.$ticket, $param);
+            $ret = $c->post($this->_box_api_auth_url.$ticket, $param);
         } catch (moodle_exception $e) {
             $this->setError(0, 'connection time-out or invalid url');
             return false;
@@ -174,6 +177,7 @@ class boxclient {
         $params['onelevel']   = 1;
         $params['params[]']   = 'nozip';
         $c = new curl(array('debug'=>$this->debug, 'cache'=>true, 'module_cache'=>'repository'));
+        $c->setopt(array('CURLOPT_FOLLOWLOCATION'=>1));
         try {
             $args = array();
             $xml = $c->get($this->_box_api_url, $params);
@@ -224,7 +228,7 @@ class boxclient {
                 foreach($o->folder as $z){
                     $tmp = array('title'=>(string)$z->attributes()->name,
                         'size'=>0, 'date'=>userdate(time()),
-                        'thumbnail'=>'http://www.box.net/img/small_folder_icon.gif',
+                        'thumbnail'=>'https://www.box.com/img/small_folder_icon.gif',
                         'path'=>array('name'=>(string)$z->attributes()->name, 'path'=>(int)$z->attributes()->id));
                     $tmp['children'] = array();
                     $this->buildtree($z, $tmp['children']);
@@ -235,13 +239,13 @@ class boxclient {
                 foreach($val as $file){
                     $thumbnail = (string)$file->attributes()->thumbnail;
                     if (!preg_match('#^(?:http://)?([^/]+)#i', $thumbnail)) {
-                        $thumbnail =  'http://www.box.net'.$thumbnail;
+                        $thumbnail =  'http://www.box.com'.$thumbnail;
                     }
                     $tmp = array('title'=>(string)$file->attributes()->file_name,
                         'size'=>display_size((int)$file->attributes()->size),
                         'thumbnail'=>$thumbnail,
                         'date'=>userdate((int)$file->attributes()->updated),
-                        'source'=>'http://box.net/api/1.0/download/'
+                        'source'=> $this->_box_api_download_url
                             .$this->auth_token.'/'.(string)$file->attributes()->id,
                         'url'=>(string)$file->attributes()->shared_link);
                     $tree[] = $tmp;
@@ -290,7 +294,7 @@ class boxclient {
                     if (preg_match('#^(?:http://)?([^/]+)#i', $a['attributes']['THUMBNAIL'])) {
                         @$ret_array['thumbnail'][$i] =  $a['attributes']['THUMBNAIL'];
                     } else {
-                        @$ret_array['thumbnail'][$i] =  'http://www.box.net'.$a['attributes']['THUMBNAIL'];
+                        @$ret_array['thumbnail'][$i] =  'http://www.box.com'.$a['attributes']['THUMBNAIL'];
                     }
                     $entry_count++;
                 }
index 2e1514c..53018b9 100644 (file)
@@ -30,12 +30,12 @@ M.form_dndupload.init = function(Y, options) {
         Y: null,
         // URL for upload requests
         url: M.cfg.wwwroot + '/repository/repository_ajax.php?action=upload',
+        // options may include: itemid, acceptedtypes, maxfiles, maxbytes, clientid, repositoryid, author
+        options: {},
         // itemid used for repository upload
         itemid: null,
         // accepted filetypes accepted by this form passed to repository
         acceptedtypes: [],
-        // maximum number of files this form allows
-        maxfiles: 0,
         // maximum size of files allowed in this form
         maxbytes: 0,
         // unqiue id of this form field used for html elements
@@ -86,9 +86,9 @@ M.form_dndupload.init = function(Y, options) {
                 return; // no upload repository is enabled to upload to
             }
 
+            this.options = options;
             this.acceptedtypes = options.acceptedtypes;
             this.clientid = options.clientid;
-            this.maxfiles = options.maxfiles;
             this.maxbytes = options.maxbytes;
             this.itemid = options.itemid;
             this.author = options.author;
@@ -170,7 +170,7 @@ M.form_dndupload.init = function(Y, options) {
          * onto the page
          */
         drag_enter_page: function(e) {
-            if (!this.has_files(e) || this.reached_maxfiles()) {
+            if (!this.has_files(e)) {
                 return false;
             }
 
@@ -209,7 +209,7 @@ M.form_dndupload.init = function(Y, options) {
          * @param e event object
          * @return boolean true if a valid file drag event
          */
-        check_drag: function(e, maxfilesalert) {
+        check_drag: function(e) {
             if (!this.has_files(e)) {
                 return false;
             }
@@ -217,13 +217,6 @@ M.form_dndupload.init = function(Y, options) {
             e.preventDefault();
             e.stopPropagation();
 
-            if (this.reached_maxfiles()) {
-                if (typeof(maxfilesalert) != 'undefined' && maxfilesalert) {
-                    alert(M.util.get_string('maxfilesreached', 'moodle', this.maxfiles));
-                }
-                return false;
-            }
-
             return true;
         },
 
@@ -299,21 +292,28 @@ M.form_dndupload.init = function(Y, options) {
 
             var files = e._event.dataTransfer.files;
             if (this.filemanager) {
-                var currentfilecount = this.filemanager.filecount;
-                if (((currentfilecount + files.length) > this.maxfiles) && (this.maxfiles != -1)) {
-                    alert(M.util.get_string('maxfilesreached', 'moodle', this.maxfiles));
-                    return false;
-                }
-                this.show_progress_spinner();
-                for (var i=0, f; f=files[i]; i++) {
-                    if (this.upload_file(f)) {
-                        currentfilecount++;
-                    }
-                }
+                var options = {
+                    files: files,
+                    options: this.options,
+                    repositoryid: this.repositoryid,
+                    currentfilecount: this.filemanager.filecount, // All files uploaded.
+                    currentfiles: this.filemanager.options.list, // Only the current folder.
+                    callback: Y.bind('update_filemanager', this)
+                };
+                var uploader = new dnduploader(options);
+                uploader.start_upload();
             } else {
-                this.show_progress_spinner();
                 if (files.length >= 1) {
-                    this.upload_file(files[0]);
+                    options = {
+                        files:[files[0]],
+                        options: this.options,
+                        repositoryid: this.repositoryid,
+                        currentfilecount: 0,
+                        currentfiles: [],
+                        callback: Y.bind('callback', this)
+                    };
+                    uploader = new dnduploader(options);
+                    uploader.start_upload();
                 }
             }
 
@@ -336,20 +336,6 @@ M.form_dndupload.init = function(Y, options) {
             return false;
         },
 
-        /**
-         * Check if reached the maximumum number of allowed files
-         *
-         * @return boolean true if reached maximum number of files
-         */
-        reached_maxfiles: function() {
-            if (this.filemanager) {
-                if (this.filemanager.filecount >= this.maxfiles && this.maxfiles != -1) {
-                    return true;
-                }
-            }
-            return false;
-        },
-
         /**
          * Highlight the area where files could be dropped
          */
@@ -376,40 +362,369 @@ M.form_dndupload.init = function(Y, options) {
         },
 
         /**
-         * Display a progress spinner in the destination node
+         * Tell the attached filemanager element (if any) to refresh on file
+         * upload
+         */
+        update_filemanager: function() {
+            if (this.filemanager) {
+                // update the filemanager that we've uploaded the files
+                this.filemanager.filepicker_callback();
+            }
+        }
+    };
+
+    var dnduploader = function(options) {
+        dnduploader.superclass.constructor.apply(this, arguments);
+    };
+
+    Y.extend(dnduploader, Y.Base, {
+        // The URL to send the upload data to.
+        api: M.cfg.wwwroot+'/repository/repository_ajax.php',
+        // Options passed into the filemanager/filepicker element.
+        options: {},
+        // The function to call when all uploads complete.
+        callback: null,
+        // The list of files dropped onto the element.
+        files: null,
+        // The ID of the 'upload' repository.
+        repositoryid: 0,
+        // Array of files already in the current folder (to check for name clashes).
+        currentfiles: null,
+        // Total number of files already uploaded (to check for exceeding limits).
+        currentfilecount: 0,
+        // The list of files to upload.
+        uploadqueue: [],
+        // This list of files with name clashes.
+        renamequeue: [],
+        // Set to true if the user has clicked on 'overwrite all'.
+        overwriteall: false,
+        // Set to true if the user has clicked on 'rename all'.
+        renameall: false,
+
+        /**
+         * Initialise the settings for the dnduploader
+         * @param object params - includes:
+         *                     options (copied from the filepicker / filemanager)
+         *                     repositoryid - ID of the upload repository
+         *                     callback - the function to call when uploads are complete
+         *                     currentfiles - the list of files already in the current folder in the filemanager
+         *                     currentfilecount - the total files already in the filemanager
+         *                     files - the list of files to upload
+         * @return void
+         */
+        initializer: function(params) {
+            this.options = params.options;
+            this.repositoryid = params.repositoryid;
+            this.callback = params.callback;
+            this.currentfiles = params.currentfiles;
+            this.currentfilecount = params.currentfilecount;
+
+            this.initialise_queue(params.files);
+        },
+
+        /**
+         * Entry point for starting the upload process (starts by processing any
+         * renames needed)
          */
-        show_progress_spinner: function() {
-            this.container.addClass('dndupload-uploading');
+        start_upload: function() {
+            this.process_renames(); // Automatically calls 'do_upload' once renames complete.
         },
 
         /**
-         * Remove progress spinner in the destination node
+         * Display a message in a popup
+         * @param string msg - the message to display
+         * @param string type - 'error' or 'info'
          */
-        hide_progress_spinner: function() {
-            this.container.removeClass('dndupload-uploading');
+        print_msg: function(msg, type) {
+            var header = M.str.moodle.error;
+            if (type != 'error') {
+                type = 'info'; // one of only two types excepted
+                header = M.str.moodle.info;
+            }
+            if (!this.msg_dlg) {
+                this.msg_dlg_node = Y.Node.createWithFilesSkin(M.core_filepicker.templates.message);
+                this.msg_dlg_node.generateID();
+
+                this.msg_dlg = new Y.Panel({
+                    srcNode      : this.msg_dlg_node,
+                    zIndex       : 800000,
+                    centered     : true,
+                    modal        : true,
+                    visible      : false,
+                    render       : true
+                });
+                this.msg_dlg.plug(Y.Plugin.Drag,{handles:['#'+this.msg_dlg_node.get('id')+' .yui3-widget-hd']});
+                this.msg_dlg_node.one('.fp-msg-butok').on('click', function(e) {
+                    e.preventDefault();
+                    this.msg_dlg.hide();
+                }, this);
+            }
+
+            this.msg_dlg.set('headerContent', header);
+            this.msg_dlg_node.removeClass('fp-msg-info').removeClass('fp-msg-error').addClass('fp-msg-'+type)
+            this.msg_dlg_node.one('.fp-msg-text').setContent(msg);
+            this.msg_dlg.show();
         },
 
         /**
-         * Tell the attached filemanager element (if any) to refresh on file
-         * upload
+         * Check the size of each file and add to either the uploadqueue or, if there
+         * is a name clash, the renamequeue
+         * @param FileList files - the files to upload
+         * @return void
          */
-        update_filemanager: function() {
-            if (this.filemanager) {
-                // update the filemanager that we've uploaded the files
-                this.filemanager.filepicker_callback();
+        initialise_queue: function(files) {
+            this.uploadqueue = [];
+            this.renamequeue = [];
+
+            // Loop through the files and find any name clashes with existing files
+            var i;
+            for (i=0; i<files.length; i++) {
+                if (this.options.maxbytes > 0 && files[i].size > this.options.maxbytes) {
+                    // Check filesize before attempting to upload
+                    this.print_msg(M.util.get_string('uploadformlimit', 'moodle', files[i].name), 'error');
+                    this.uploadqueue = []; // No uploads if one file is too big.
+                    return;
+                }
+
+                if (this.has_name_clash(files[i].name)) {
+                    this.renamequeue.push(files[i]);
+                } else {
+                    if (!this.add_to_upload_queue(files[i], files[i].name, false)) {
+                        return;
+                    }
+                }
             }
         },
 
         /**
-         * Upload a single file via an AJAX call to the 'upload' repository
+         * Add a single file to the uploadqueue, whilst checking the maxfiles limit
+         * @param File file - the file to add
+         * @param string filename - the name to give the file on upload
+         * @param bool overwrite - true to overwrite the existing file
+         * @return bool true if added successfully
          */
-        upload_file: function(file) {
-            if (file.size > this.maxbytes && this.maxbytes > 0) {
-                // Check filesize before attempting to upload
-                this.hide_progress_spinner();
-                alert(M.util.get_string('uploadformlimit', 'moodle')+"\n'"+file.name+"'");
+        add_to_upload_queue: function(file, filename, overwrite) {
+            if (!overwrite) {
+                this.currentfilecount++;
+            }
+            if (this.options.maxfiles > 0 && this.currentfilecount > this.options.maxfiles) {
+                // Too many files - abort entire upload.
+                this.uploadqueue = [];
+                this.renamequeue = [];
+                this.print_msg(M.util.get_string('maxfilesreached', 'moodle', this.options.maxfiles), 'error');
                 return false;
             }
+            this.uploadqueue.push({file:file, filename:filename, overwrite:overwrite});
+            return true;
+        },
+
+        /**
+         * Take the next file from the renamequeue and ask the user what to do with
+         * it. Called recursively until the queue is empty, then calls do_upload.
+         * @return void
+         */
+        process_renames: function() {
+            if (this.renamequeue.length == 0) {
+                // All rename processing complete - start the actual upload.
+                this.do_upload();
+                return;
+            }
+            var multiplefiles = (this.renamequeue.length > 1);
+
+            // Get the next file from the rename queue.
+            var file = this.renamequeue.shift();
+            // Generate a non-conflicting name for it.
+            var newname = this.generate_unique_name(file.name);
+
+            // If the user has clicked on overwrite/rename ALL then process
+            // this file, as appropriate, then process the rest of the queue.
+            if (this.overwriteall) {
+                this.add_to_upload_queue(file, file.name, true);
+                this.process_renames();
+                return;
+            }
+            if (this.renameall) {
+                this.add_to_upload_queue(file, newname, false);
+                this.process_renames();
+                return;
+            }
+
+            // Ask the user what to do with this file.
+            var self = this;
+
+            var process_dlg_node;
+            if (multiplefiles) {
+                process_dlg_node = Y.Node.createWithFilesSkin(M.core_filepicker.templates.processexistingfilemultiple);
+            } else {
+                process_dlg_node = Y.Node.createWithFilesSkin(M.core_filepicker.templates.processexistingfile);
+            }
+            var node = process_dlg_node;
+            node.generateID();
+            var process_dlg = new Y.Panel({
+                srcNode      : node,
+                headerContent: M.str.repository.fileexistsdialogheader,
+                zIndex       : 800000,
+                centered     : true,
+                modal        : true,
+                visible      : false,
+                render       : true,
+                buttons      : {}
+            });
+            process_dlg.plug(Y.Plugin.Drag,{handles:['#'+node.get('id')+' .yui3-widget-hd']});
+
+            // Overwrite original.
+            node.one('.fp-dlg-butoverwrite').on('click', function(e) {
+                e.preventDefault();
+                process_dlg.hide();
+                self.add_to_upload_queue(file, file.name, true);
+                self.process_renames();
+            }, this);
+
+            // Rename uploaded file.
+            node.one('.fp-dlg-butrename').on('click', function(e) {
+                e.preventDefault();
+                process_dlg.hide();
+                self.add_to_upload_queue(file, newname, false);
+                self.process_renames();
+            }, this);
+
+            // Cancel all uploads.
+            node.one('.fp-dlg-butcancel').on('click', function(e) {
+                e.preventDefault();
+                process_dlg.hide();
+            }, this);
+
+            // When we are at the file limit, only allow 'overwrite', not rename.
+            if (this.currentfilecount == this.options.maxfiles) {
+                node.one('.fp-dlg-butrename').setStyle('display', 'none');
+                if (multiplefiles) {
+                    node.one('.fp-dlg-butrenameall').setStyle('display', 'none');
+                }
+            }
+
+            // If there are more files still to go, offer the 'overwrite/rename all' options.
+            if (multiplefiles) {
+                // Overwrite all original files.
+                node.one('.fp-dlg-butoverwriteall').on('click', function(e) {
+                    e.preventDefault();
+                    process_dlg.hide();
+                    this.overwriteall = true;
+                    self.add_to_upload_queue(file, file.name, true);
+                    self.process_renames();
+                }, this);
+
+                // Rename all new files.
+                node.one('.fp-dlg-butrenameall').on('click', function(e) {
+                    e.preventDefault();
+                    process_dlg.hide();
+                    this.renameall = true;
+                    self.add_to_upload_queue(file, newname, false);
+                    self.process_renames();
+                }, this);
+            }
+            node.one('.fp-dlg-text').setContent(M.util.get_string('fileexists', 'moodle', file.name));
+            process_dlg_node.one('.fp-dlg-butrename').setContent(M.util.get_string('renameto', 'repository', newname));
+
+            // Destroy the dialog once it has been hidden.
+            process_dlg.after('visibleChange', function(e) {
+                if (!process_dlg.get('visible')) {
+                    process_dlg.destroy(true);
+                }
+            });
+
+            process_dlg.show();
+        },
+
+        /**
+         * Checks if there is already a file with the given name in the current folder
+         * or in the list of already uploading files
+         * @param string filename - the name to test
+         * @return bool true if the name already exists
+         */
+        has_name_clash: function(filename) {
+            // Check against the already uploaded files
+            var i;
+            for (i=0; i<this.currentfiles.length; i++) {
+                if (filename == this.currentfiles[i].filename) {
+                    return true;
+                }
+            }
+            // Check against the uploading files that have already been processed
+            for (i=0; i<this.uploadqueue.length; i++) {
+                if (filename == this.uploadqueue[i].filename) {
+                    return true;
+                }
+            }
+            return false;
+        },
+
+        /**
+         * Adds _NUMBER to the end of the filename and increments this number until
+         * a unique name is found
+         * @param string filename
+         * @return string the unique filename generated
+         */
+        generate_unique_name: function(filename) {
+            // Split the filename into the basename + extension.
+            var extension;
+            var basename;
+            var dotpos = filename.lastIndexOf('.');
+            if (dotpos == -1) {
+                basename = filename;
+                extension = '';
+            } else {
+                basename = filename.substr(0, dotpos);
+                extension = filename.substr(dotpos, filename.length);
+            }
+
+            // Look to see if the name already has _NN at the end of it.
+            var number = 0;
+            var hasnumber = basename.match(/^(.*)_(\d+)$/);
+            if (hasnumber != null) {
+                // Note the current number & remove it from the basename.
+                number = parseInt(hasnumber[2]);
+                basename = hasnumber[1];
+            }
+
+            // Loop through increating numbers until a unique name is found.
+            var newname;
+            do {
+                number++;
+                newname = basename + '_' + number + extension;
+            } while (this.has_name_clash(newname));
+
+            return newname;
+        },
+
+        /**
+         * Upload the next file from the uploadqueue - called recursively after each
+         * upload is complete, then handles the callback to the filemanager/filepicker
+         * @param lastresult - the last result from the server
+         */
+        do_upload: function(lastresult) {
+            if (this.uploadqueue.length > 0) {
+                var filedetails = this.uploadqueue.shift();
+                this.upload_file(filedetails.file, filedetails.filename, filedetails.overwrite);
+            } else {
+                this.uploadfinished(lastresult);
+            }
+        },
+
+        /**
+         * Run the callback to the filemanager/filepicker
+         */
+        uploadfinished: function(lastresult) {
+            this.callback(lastresult);
+        },
+
+        /**
+         * Upload a single file via an AJAX call to the 'upload' repository. Automatically
+         * calls do_upload as each upload completes.
+         * @param File file - the file to upload
+         * @param string filename - the name to give the file
+         * @param bool overwrite - true if the existing file should be overwritten
+         */
+        upload_file: function(file, filename, overwrite) {
 
             // This would be an ideal place to use the Y.io function
             // however, this does not support data encoded using the
@@ -421,13 +736,13 @@ M.form_dndupload.init = function(Y, options) {
             var self = this;
             xhr.onreadystatechange = function() { // Process the server response
                 if (xhr.readyState == 4) {
-                    self.hide_progress_spinner();
                     if (xhr.status == 200) {
                         var result = JSON.parse(xhr.responseText);
                         if (result) {
                             if (result.error) {
-                                alert(result.error);
-                            } else if (self.callback) {
+                                self.print_msg(result.error, 'error'); // TODO add filename?
+                                self.uploadfinished();
+                            } else {
                                 // Only update the filepicker if there were no errors
                                 if (result.event == 'fileexists') {
                                     // Do not worry about this, as we only care about the last
@@ -435,45 +750,51 @@ M.form_dndupload.init = function(Y, options) {
                                     result.file = result.newfile.filename;
                                     result.url = result.newfile.url;
                                 }
-                                result.client_id = self.clientid;
-                                self.callback(result);
-                            } else {
-                                self.update_filemanager();
+                                result.client_id = self.options.clientid;
                             }
                         }
+                        self.do_upload(result); // continue uploading
                     } else {
-                        alert(M.util.get_string('serverconnection', 'error'));
+                        self.print_msg(M.util.get_string('serverconnection', 'error'), 'error');
+                        self.uploadfinished();
                     }
                 }
             };
 
             // Prepare the data to send
             var formdata = new FormData();
+            formdata.append('action', 'upload');
             formdata.append('repo_upload_file', file); // The FormData class allows us to attach a file
             formdata.append('sesskey', M.cfg.sesskey);
             formdata.append('repo_id', this.repositoryid);
-            formdata.append('itemid', this.itemid);
-            if (this.author) {
-                formdata.append('author', this.author);
+            formdata.append('itemid', this.options.itemid);
+            if (this.options.author) {
+                formdata.append('author', this.options.author);
+            }
+            if (this.options.filemanager) { // Filepickers do not have folders
+                formdata.append('savepath', this.options.filemanager.currentpath);
             }
-            if (this.filemanager) { // Filepickers do not have folders
-                formdata.append('savepath', this.filemanager.currentpath);
+            formdata.append('title', filename);
+            if (overwrite) {
+                formdata.append('overwrite', 1);
             }
 
-            if (this.acceptedtypes.constructor == Array) {
-                for (var i=0; i<this.acceptedtypes.length; i++) {
-                    formdata.append('accepted_types[]', this.acceptedtypes[i]);
+            // Accepted types can be either a string or an array, but an array is
+            // expected in the processing script, so make sure we are sending an array
+            if (this.options.acceptedtypes.constructor == Array) {
+                for (var i=0; i<this.options.acceptedtypes.length; i++) {
+                    formdata.append('accepted_types[]', this.options.acceptedtypes[i]);
                 }
             } else {
-                formdata.append('accepted_types[]', this.acceptedtypes);
+                formdata.append('accepted_types[]', this.options.acceptedtypes);
             }
 
             // Send the file & required details
-            xhr.open("POST", this.url, true);
+            xhr.open("POST", this.api, true);
             xhr.send(formdata);
             return true;
         }
-    };
+    });
 
     dnduploadhelper.init(Y, options);
 };
index e433d35..3918bb2 100644 (file)
@@ -262,16 +262,12 @@ M.form_filemanager.init = function(Y, options) {
             var button_addfile  = this.filemanager.one('.fp-btn-add');
 
             // setup 'add file' button
-            // if maxfiles == -1, the no limit
-            button_addfile.on('click', function(e) {
-                e.preventDefault();
-                var options = this.filepicker_options;
-                options.formcallback = this.filepicker_callback;
-                // XXX: magic here, to let filepicker use filemanager scope
-                options.magicscope = this;
-                options.savepath = this.currentpath;
-                M.core_filepicker.show(Y, options);
-            }, this);
+            button_addfile.on('click', this.show_filepicker, this);
+
+            var dndarrow = this.filemanager.one('.dndupload-arrow');
+            if (dndarrow) {
+                dndarrow.on('click', this.show_filepicker, this);
+            }
 
             // setup 'make a folder' button
             if (this.options.subdirs) {
@@ -370,6 +366,18 @@ M.form_filemanager.init = function(Y, options) {
                     }
                 }, this);
         },
+
+        show_filepicker: function (e) {
+            // if maxfiles == -1, the no limit
+            e.preventDefault();
+            var options = this.filepicker_options;
+            options.formcallback = this.filepicker_callback;
+            // XXX: magic here, to let filepicker use filemanager scope
+            options.magicscope = this;
+            options.savepath = this.currentpath;
+            M.core_filepicker.show(Y, options);
+        },
+
         print_path: function() {
             var p = this.options.path;
             this.pathbar.setContent('').addClass('empty');
@@ -825,8 +833,8 @@ M.form_filemanager.init = function(Y, options) {
                 e.preventDefault();
                 var params = {};
                 var fileinfo = this.selectui.fileinfo;
-                if (fileinfo.type == 'folder') {
-                    // this button should not even be shown for folders
+                if (!this.enablemainfile || fileinfo.type == 'folder') {
+                    // this button should not even be shown for folders or when mainfile is disabled
                     return;
                 }
                 params['filepath'] = fileinfo.filepath;
index c4fdd8f..8f95fe5 100644 (file)
@@ -500,8 +500,8 @@ class page_requirements_manager {
                 case 'core_dndupload':
                     $module = array('name'     => 'core_dndupload',
                                     'fullpath' => '/lib/form/dndupload.js',
-                                    'requires' => array('node', 'event', 'json'),
-                                    'strings'  => array(array('uploadformlimit', 'moodle'), array('droptoupload', 'moodle'), array('maxfilesreached', 'moodle'), array('dndenabled_inbox', 'moodle')));
+                                    'requires' => array('node', 'event', 'json', 'core_filepicker'),
+                                    'strings'  => array(array('uploadformlimit', 'moodle'), array('droptoupload', 'moodle'), array('maxfilesreached', 'moodle'), array('dndenabled_inbox', 'moodle'), array('fileexists', 'moodle')));
                     break;
             }
 
index 7b7c669..2e95777 100644 (file)
@@ -199,13 +199,9 @@ final class portfolio_admin_form extends moodleform {
 
         // let the plugin add the fields they want (either statically or not)
         if (portfolio_static_function($this->plugin, 'has_admin_config')) {
-            if (!$this->instance) {
-                require_once($CFG->libdir . '/portfolio/plugin.php');
-                require_once($CFG->dirroot . '/portfolio/' . $this->plugin .  '/lib.php');
-                call_user_func(array('portfolio_plugin_' . $this->plugin, 'admin_config_form'), $mform);
-            } else {
-                $this->instance->admin_config_form($mform);
-            }
+            require_once($CFG->libdir . '/portfolio/plugin.php');
+            require_once($CFG->dirroot . '/portfolio/' . $this->plugin .  '/lib.php');
+            call_user_func(array('portfolio_plugin_' . $this->plugin, 'admin_config_form'), $mform);
         }
 
         // and set the data if we have some.
@@ -237,12 +233,7 @@ final class portfolio_admin_form extends moodleform {
         }
 
         $pluginerrors = array();
-        if ($this->instance) {
-            $pluginerrors = $this->instance->admin_config_validation($data);
-        }
-        else {
-            $pluginerrors = portfolio_static_function($this->plugin, 'admin_config_validation', $data);
-        }
+        $pluginerrors = portfolio_static_function($this->plugin, 'admin_config_validation', $data);
         if (is_array($pluginerrors)) {
             $errors = array_merge($errors, $pluginerrors);
         }
index 6c32ffc..34c40c8 100644 (file)
@@ -347,7 +347,7 @@ abstract class portfolio_plugin_base {
      *
      * @param moodleform $mform passed by reference, add elements to it.
      */
-    public function admin_config_form(&$mform) {}
+    public static function admin_config_form(&$mform) {}
 
     /**
      * Just like the moodle form validation function,
@@ -356,7 +356,7 @@ abstract class portfolio_plugin_base {
      *
      * @param array $data data from form.
      */
-    public function admin_config_validation($data) {}
+    public static function admin_config_validation($data) {}
 
     /**
      * mform to display to the user exporting data using this plugin.
index d9abe0f..6420136 100644 (file)
@@ -48,13 +48,15 @@ class mod_assign_grading_options_form extends moodleform {
         $mform->addElement('header', 'general', get_string('gradingoptions', 'assign'));
         // visible elements
         $options = array(-1=>'All',10=>'10', 20=>'20', 50=>'50', 100=>'100');
-        $mform->addElement('select', 'perpage', get_string('assignmentsperpage', 'assign'), $options, array('class'=>'ignoredirty'));
-        $options = array(''=>get_string('filternone', 'assign'), ASSIGN_FILTER_SUBMITTED=>get_string('filtersubmitted', 'assign'), ASSIGN_FILTER_REQUIRE_GRADING=>get_string('filterrequiregrading', 'assign'));
-        $mform->addElement('select', 'filter', get_string('filter', 'assign'), $options, array('class'=>'ignoredirty'));
+        $mform->addElement('select', 'perpage', get_string('assignmentsperpage', 'assign'), $options);
+        $options = array('' => get_string('filternone', 'assign'),
+                         ASSIGN_FILTER_SUBMITTED => get_string('filtersubmitted', 'assign'),
+                         ASSIGN_FILTER_REQUIRE_GRADING => get_string('filterrequiregrading', 'assign'));
+        $mform->addElement('select', 'filter', get_string('filter', 'assign'), $options);
 
         // quickgrading
         if ($instance['showquickgrading']) {
-            $mform->addElement('checkbox', 'quickgrading', get_string('quickgrading', 'assign'), '', array('class'=>'ignoredirty'));
+            $mform->addElement('checkbox', 'quickgrading', get_string('quickgrading', 'assign'), '');
             $mform->addHelpButton('quickgrading', 'quickgrading', 'assign');
             $mform->setDefault('quickgrading', $instance['quickgrading']);
         }
index ad00b80..9e1c9ce 100644 (file)
@@ -119,7 +119,7 @@ class assign_grading_table extends table_sql implements renderable {
 
         // Select
         $columns[] = 'select';
-        $headers[] = get_string('select') . '<div class="selectall"><input type="checkbox" class="ignoredirty" name="selectall" title="' . get_string('selectall') . '"/></div>';
+        $headers[] = get_string('select') . '<div class="selectall"><input type="checkbox" name="selectall" title="' . get_string('selectall') . '"/></div>';
 
         // Edit links
         if (!$this->is_downloading()) {
@@ -303,7 +303,7 @@ class assign_grading_table extends table_sql implements renderable {
      * @return string
      */
     function col_select(stdClass $row) {
-        return '<input type="checkbox" name="selectedusers" value="' . $row->userid . '" class="ignoredirty"/>';
+        return '<input type="checkbox" name="selectedusers" value="' . $row->userid . '"/>';
     }
 
     /**
index 5786e1e..d01c9b3 100644 (file)
@@ -110,27 +110,8 @@ M.mod_assign.init_grading_table = function(Y) {
     });
 };
 
-M.mod_assign.check_dirty_quickgrading_form = function(e) {
-    if (!M.core_formchangechecker.get_form_dirty_state()) {
-        // the form is not dirty, so don't display any message
-        return;
-    }
-
-    // This is the error message that we'll show to browsers which support it
-    var warningmessage = 'There are unsaved quickgrading changes. Do you really wanto to leave this page?';
-
-    // Most browsers are happy with the returnValue being set on the event
-    // But some browsers do not consistently pass the event
-    if (e) {
-        e.returnValue = warningmessage;
-    }
-
-    // But some require it to be returned instead
-    return warningmessage;
-}
 M.mod_assign.init_grading_options = function(Y) {
     Y.use('node', function(Y) {
-
         var paginationelement = Y.one('#id_perpage');
         paginationelement.on('change', function(e) {
             Y.one('form.gradingoptionsform').submit();
@@ -145,28 +126,5 @@ M.mod_assign.init_grading_options = function(Y) {
                 Y.one('form.gradingoptionsform').submit();
             });
         }
-
     });
-
-
-};
-// override the default dirty form behaviour to ignore any input with the class "ignoredirty"
-M.mod_assign.set_form_changed = M.core_formchangechecker.set_form_changed;
-M.core_formchangechecker.set_form_changed = function(e) {
-    var target = e.currentTarget;
-    if (!target.hasClass('ignoredirty')) {
-        M.mod_assign.set_form_changed(e);
-    }
-}
-
-M.mod_assign.get_form_dirty_state = M.core_formchangechecker.get_form_dirty_state;
-M.core_formchangechecker.get_form_dirty_state = function() {
-    var state = M.core_formchangechecker.stateinformation;
-    if (state.focused_element) {
-        if (state.focused_element.element.hasClass('ignoredirty')) {
-            state.focused_element.initial_value = state.focused_element.element.get('value')
-        }
-    }
-    return M.mod_assign.get_form_dirty_state();
-}
-
+};
\ No newline at end of file
index c4161c1..4aa8933 100644 (file)
@@ -19,24 +19,6 @@ Created by:
 * Petr Skoda (skodak) - most of the coding & design
 * Mojmir Volf, Eloy Lafuente, Antonio Vicent and others
 
-
-
-Project page:
-
-* https://github.com/skodak/moodle-mod_book
-* http://moodle.org/plugins/view.php?plugin=mod_book
-
-
-Installation:
-
-* http://docs.moodle.org/20/en/Installing_contributed_modules_or_plugins
-
-
-Issue tracker:
-
-* https://github.com/skodak/moodle-mod_book/issues?milestone=&labels=
-
-
 Intentionally omitted features:
 
 * more chapter levels - it would encourage teachers to write too much complex and long books, better use standard standalone HTML editor and import it as Resource. DocBook format is another suitable solution.
@@ -44,8 +26,3 @@ Intentionally omitted features:
 * PDF export - there is no elegant way AFAIK to convert HTML to PDF, use virtual PDF printer or better use DocBook format for authoring
 * detailed student tracking (postponed till officially supported)
 * export as zipped set of HTML pages - instead use browser command Save page as... in print view
-
-
-Future:
-
-* No more development planned
index 5a58526..00805bf 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -130,14 +130,14 @@ class moodle1_mod_book_handler extends moodle1_mod_handler {
     }
 
     /**
-     * This is executed when the parser reaches the <OPTIONS> opening element
+     * This is executed when the parser reaches the <CHAPTERS> opening element
      */
     public function on_book_chapters_start() {
         $this->xmlwriter->begin_tag('chapters');
     }
 
     /**
-     * This is executed when the parser reaches the closing </OPTIONS> element
+     * This is executed when the parser reaches the closing </CHAPTERS> element
      */
     public function on_book_chapters_end() {
         $this->xmlwriter->end_tag('chapters');
index 09ee5a0..93d826e 100644 (file)
@@ -18,7 +18,6 @@
  * Define all the restore steps that will be used by the restore_book_activity_task
  *
  * @package    mod_book
- * @subpackage book
  * @copyright  2010 Petr Skoda {@link http://skodak.org}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index d831e3b..850894d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index cec6003..d0292b6 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index 77a1ba9..735116c 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -13,7 +13,6 @@
 //
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
-
 /**
  * Book module upgrade code
  *
index 02203bb..63c9507 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -45,9 +45,8 @@ $chapter = $DB->get_record('book_chapters', array('id'=>$chapterid, 'bookid'=>$b
 
 
 // Header and strings.
-$PAGE->set_title(format_string($book->name));
-$PAGE->add_body_class('mod_book');
-$PAGE->set_heading(format_string($course->fullname));
+$PAGE->set_title($book->name);
+$PAGE->set_heading($course->fullname);
 
 // Form processing.
 if ($confirm) {  // the operation was confirmed.
index 50088ad..541233d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -108,9 +108,8 @@ if ($mform->is_cancelled()) {
 }
 
 // Otherwise fill and print the form.
-$PAGE->set_title(format_string($book->name));
-$PAGE->add_body_class('mod_book');
-$PAGE->set_heading(format_string($course->fullname));
+$PAGE->set_title($book->name);
+$PAGE->set_heading($course->fullname);
 
 echo $OUTPUT->header();
 echo $OUTPUT->heading(get_string('editingchapter', 'mod_book'));
index ca1e54f..8384104 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -34,6 +34,12 @@ class book_chapter_edit_form extends moodleform {
         $chapter = $this->_customdata['chapter'];
         $options = $this->_customdata['options'];
 
+        // Disabled subchapter option when editing first node.
+        $disabledmsg = null;
+        if ($chapter->pagenum == 1) {
+            $disabledmsg = get_string('subchapternotice', 'book');
+        }
+
         $mform = $this->_form;
 
         $mform->addElement('header', 'general', get_string('edit'));
@@ -42,7 +48,7 @@ class book_chapter_edit_form extends moodleform {
         $mform->setType('title', PARAM_RAW);
         $mform->addRule('title', null, 'required', null, 'client');
 
-        $mform->addElement('advcheckbox', 'subchapter', get_string('subchapter', 'mod_book'));
+        $mform->addElement('advcheckbox', 'subchapter', get_string('subchapter', 'mod_book'), $disabledmsg);
 
         $mform->addElement('editor', 'content_editor', get_string('content', 'mod_book'), null, $options);
         $mform->setType('content_editor', PARAM_RAW);
@@ -62,4 +68,12 @@ class book_chapter_edit_form extends moodleform {
         // set the defaults
         $this->set_data($chapter);
     }
+
+    function definition_after_data(){
+        $mform = $this->_form;
+        $pagenum = $mform->getElement('pagenum');
+        if ($pagenum->getValue() == 1) {
+            $mform->hardFreeze('subchapter');
+        }
+    }
 }
index 02ed62d..b413ba3 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -88,14 +88,14 @@ foreach ($books as $book) {
             $currentsection = $book->section;
         }
     } else {
-        $printsection = '<span class="smallinfo">'.userdate($book->timemodified)."</span>";
+        $printsection = html_writer::tag('span', userdate($book->timemodified), array('class' => 'smallinfo'));
     }
 
-    $class = $book->visible ? '' : 'class="dimmed"'; // hidden modules are dimmed
+    $class = $book->visible ? null : array('class' => 'dimmed'); // hidden modules are dimmed
 
     $table->data[] = array (
         $printsection,
-        "<a $class href=\"view.php?id=$cm->id\">".format_string($book->name)."</a>",
+        html_writer::link(new moodle_url('view.php', array('id' => $cm->id)), format_string($book->name), $class),
         format_module_intro('book', $book, $cm->id));
 }
 
index 5d29b71..470e18e 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -58,7 +58,6 @@ $string['numbering2'] = 'Bullets';
 $string['numbering3'] = 'Indented';
 $string['numberingoptions'] = 'Available options for chapter formatting';
 $string['numberingoptions_desc'] = 'Options for displaying chapters and subchapters in the table of contents';
-$string['chapterscount'] = 'Chapters';
 $string['addafter'] = 'Add new chapter';
 $string['confchapterdelete'] = 'Do you really want to delete this chapter?';
 $string['confchapterdeleteall'] = 'Do you really want to delete this chapter and all its subchapters?';
@@ -73,6 +72,6 @@ $string['book:viewhiddenchapters'] = 'View hidden book chapters';
 $string['errorchapter'] = 'Error reading chapter of book.';
 
 $string['page-mod-book-x'] = 'Any book module page';
-
+$string['subchapternotice'] = '(Only available once the first chapter has been created)';
 $string['subplugintype_booktool'] = 'Book tool';
 $string['subplugintype_booktool_plural'] = 'Book tools';
index 80d2116..4c3cde3 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die;
  */
 function book_get_numbering_types() {
     global $CFG; // required for the include
+
     require_once(dirname(__FILE__).'/locallib.php');
 
     return array (
@@ -291,11 +292,7 @@ function book_supports($feature) {
  * @return void
  */
 function book_extend_settings_navigation(settings_navigation $settingsnav, navigation_node $booknode) {
-    global $USER, $PAGE, $CFG, $DB, $OUTPUT;
-
-    if ($PAGE->cm->modname !== 'book') {
-        return;
-    }
+    global $USER, $PAGE;
 
     $plugins = get_plugin_list('booktool');
     foreach ($plugins as $plugin => $dir) {
index b0a23af..26d0e40 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -75,11 +75,6 @@ function book_preload_chapters($book) {
             $first = false;
         }
         if (!$ch->subchapter) {
-            $ch->prev = $prev;
-            $ch->next = null;
-            if ($prev) {
-                $chapters[$prev]->next = $ch->id;
-            }
             if ($ch->hidden) {
                 if ($book->numbering == BOOK_NUM_NUMBERS) {
                     $ch->number = 'x';
@@ -97,11 +92,6 @@ function book_preload_chapters($book) {
             $ch->parent = null;
             $ch->subchapters = array();
         } else {
-            $ch->prev = $prevsub;
-            $ch->next = null;
-            if ($prevsub) {
-                $chapters[$prevsub]->next = $ch->id;
-            }
             $ch->parent = $parent;
             $ch->subchapters = null;
             $chapters[$parent]->subchapters[$ch->id] = $ch->id;
@@ -120,6 +110,7 @@ function book_preload_chapters($book) {
                 $ch->number = $j;
             }
         }
+
         if ($oldch->subchapter != $ch->subchapter or $oldch->pagenum != $ch->pagenum or $oldch->hidden != $ch->hidden) {
             // update only if something changed
             $DB->update_record('book_chapters', $ch);
@@ -159,27 +150,6 @@ function book_get_chapter_title($chid, $chapters, $book, $context) {
     return $title;
 }
 
-/**
- * General logging to table
- * @param string $str1
- * @param string $str2
- * @param int $level
- * @return void
- */
-function book_log($str1, $str2, $level = 0) {
-    switch ($level) {
-        case 1:
-            echo '<tr><td><span class="dimmed_text">'.$str1.'</span></td><td><span class="dimmed_text">'.$str2.'</span></td></tr>';
-            break;
-        case 2:
-            echo '<tr><td><span style="color: rgb(255, 0, 0);">'.$str1.'</span></td><td><span style="color: rgb(255, 0, 0);">'.$str2.'</span></td></tr>';
-            break;
-        default:
-            echo '<tr><td>'.$str1.'</class></td><td>'.$str2.'</td></tr>';
-            break;
-    }
-}
-
 /**
  * Add the book TOC sticky block to the 1st region available
  *
@@ -217,7 +187,7 @@ function book_add_fake_block($chapters, $chapter, $book, $cm, $edit) {
 function book_get_toc($chapters, $chapter, $book, $cm, $edit) {
     global $USER, $OUTPUT;
 
-    $toc = '';  // Representation of toc (HTML)
+    $toc = '';
     $nch = 0;   // Chapter number
     $ns = 0;    // Subchapter number
     $first = 1;
@@ -226,27 +196,35 @@ function book_get_toc($chapters, $chapter, $book, $cm, $edit) {
 
     switch ($book->numbering) {
         case BOOK_NUM_NONE:
-            $toc .= '<div class="book_toc_none">';
+            $toc .= html_writer::start_tag('div', array('class' => 'book_toc_none'));
             break;
         case BOOK_NUM_NUMBERS:
-            $toc .= '<div class="book_toc_numbered">';
+            $toc .= html_writer::start_tag('div', array('class' => 'book_toc_numbered'));
             break;
         case BOOK_NUM_BULLETS:
-            $toc .= '<div class="book_toc_bullets">';
+            $toc .= html_writer::start_tag('div', array('class' => 'book_toc_bullets'));
             break;
         case BOOK_NUM_INDENTED:
-            $toc .= '<div class="book_toc_indented">';
+            $toc .= html_writer::start_tag('div', array('class' => 'book_toc_indented'));
             break;
     }
 
     if ($edit) { // Teacher's TOC
-        $toc .= '<ul>';
+        $toc .= html_writer::start_tag('ul');
         $i = 0;
         foreach ($chapters as $ch) {
             $i++;
             $title = trim(format_string($ch->title, true, array('context'=>$context)));
             if (!$ch->subchapter) {
-                $toc .= ($first) ? '<li>' : '</ul></li><li>';
+
+                if ($first) {
+                    $toc .= html_writer::start_tag('li');
+                } else {
+                    $toc .= html_writer::end_tag('ul');
+                    $toc .= html_writer::end_tag('li');
+                    $toc .= html_writer::start_tag('li');
+                }
+
                 if (!$ch->hidden) {
                     $nch++;
                     $ns = 0;
@@ -257,10 +235,18 @@ function book_get_toc($chapters, $chapter, $book, $cm, $edit) {
                     if ($book->numbering == BOOK_NUM_NUMBERS) {
                         $title = "x $title";
                     }
-                    $title = '<span class="dimmed_text">'.$title.'</span>';
+                    $title = html_writer::tag('span', $title, array('class' => 'dimmed_text'));
                 }
             } else {
-                $toc .= ($first) ? '<li><ul><li>' : '<li>';
+
+                if ($first) {
+                    $toc .= html_writer::start_tag('li');
+                    $toc .= html_writer::start_tag('ul');
+                    $toc .= html_writer::start_tag('li');
+                } else {
+                    $toc .= html_writer::start_tag('li');
+                }
+
                 if (!$ch->hidden) {
                     $ns++;
                     if ($book->numbering == BOOK_NUM_NUMBERS) {
@@ -274,75 +260,109 @@ function book_get_toc($chapters, $chapter, $book, $cm, $edit) {
                             $title = "x.x $title";
                         }
                     }
-                    $title = '<span class="dimmed_text">'.$title.'</span>';
+                    $title = html_writer::tag('span', $title, array('class' => 'dimmed_text'));
                 }
             }
 
             if ($ch->id == $chapter->id) {
-                $toc .= '<strong>'.$title.'</strong>';
+                $toc .= html_writer::tag('strong', $title);
             } else {
-                $toc .= '<a title="'.s($title).'" href="view.php?id='.$cm->id.'&amp;chapterid='.$ch->id.'">'.$title.'</a>';
+                $toc .= html_writer::link(new moodle_url('view.php', array('id' => $cm->id, 'chapterid' => $ch->id)), $title, array('title' => s($title)));
             }
             $toc .=  '&nbsp;&nbsp;';
             if ($i != 1) {
-                $toc .=  ' <a title="'.get_string('up').'" href="move.php?id='.$cm->id.'&amp;chapterid='.$ch->id.
-                        '&amp;up=1&amp;sesskey='.$USER->sesskey.'"><img src="'.$OUTPUT->pix_url('t/up').'" class="iconsmall" alt="'.get_string('up').'" /></a>';
+                $toc .= html_writer::link(new moodle_url('move.php', array('id' => $cm->id, 'chapterid' => $ch->id, 'up' => '1', 'sesskey' => $USER->sesskey)),
+                                            $OUTPUT->pix_icon('t/up', get_string('up')), array('title' => get_string('up')));
             }
             if ($i != count($chapters)) {
-                $toc .=  ' <a title="'.get_string('down').'" href="move.php?id='.$cm->id.'&amp;chapterid='.$ch->id.
-                        '&amp;up=0&amp;sesskey='.$USER->sesskey.'"><img src="'.$OUTPUT->pix_url('t/down').'" class="iconsmall" alt="'.get_string('down').'" /></a>';
+                $toc .= html_writer::link(new moodle_url('move.php', array('id' => $cm->id, 'chapterid' => $ch->id, 'up' => '0', 'sesskey' => $USER->sesskey)),
+                                            $OUTPUT->pix_icon('t/down', get_string('down')), array('title' => get_string('down')));
             }
-            $toc .=  ' <a title="'.get_string('edit').'" href="edit.php?cmid='.$cm->id.'&amp;id='.$ch->id.'"><img src="'.
-                    $OUTPUT->pix_url('t/edit').'" class="iconsmall" alt="'.get_string('edit').'" /></a>';
-            $toc .=  ' <a title="'.get_string('delete').'" href="delete.php?id='.$cm->id.'&amp;chapterid='.$ch->id.
-                    '&amp;sesskey='.$USER->sesskey.'"><img src="'.$OUTPUT->pix_url('t/delete').'" class="iconsmall" alt="'.get_string('delete').'" /></a>';
+            $toc .= html_writer::link(new moodle_url('edit.php', array('cmid' => $cm->id, 'id' => $ch->id)),
+                                        $OUTPUT->pix_icon('t/edit', get_string('edit')), array('title' => get_string('edit')));
+            $toc .= html_writer::link(new moodle_url('delete.php', array('id' => $cm->id, 'chapterid' => $ch->id, 'sesskey' => $USER->sesskey)),
+                                        $OUTPUT->pix_icon('t/delete', get_string('delete')), array('title' => get_string('delete')));
             if ($ch->hidden) {
-                $toc .= ' <a title="'.get_string('show').'" href="show.php?id='.$cm->id.'&amp;chapterid='.$ch->id.
-                        '&amp;sesskey='.$USER->sesskey.'"><img src="'.$OUTPUT->pix_url('t/show').'" class="iconsmall" alt="'.get_string('show').'" /></a>';
+                $toc .= html_writer::link(new moodle_url('show.php', array('id' => $cm->id, 'chapterid' => $ch->id, 'sesskey' => $USER->sesskey)),
+                                            $OUTPUT->pix_icon('t/show', get_string('show')), array('title' => get_string('show')));
             } else {
-                $toc .= ' <a title="'.get_string('hide').'" href="show.php?id='.$cm->id.'&amp;chapterid='.$ch->id.
-                        '&amp;sesskey='.$USER->sesskey.'"><img src="'.$OUTPUT->pix_url('t/hide').'" class="iconsmall" alt="'.get_string('hide').'" /></a>';
+                $toc .= html_writer::link(new moodle_url('show.php', array('id' => $cm->id, 'chapterid' => $ch->id, 'sesskey' => $USER->sesskey)),
+                                            $OUTPUT->pix_icon('t/hide', get_string('hide')), array('title' => get_string('hide')));
             }
-            $toc .= ' <a title="'.get_string('addafter', 'mod_book').'" href="edit.php?cmid='.$cm->id.
-                    '&amp;pagenum='.$ch->pagenum.'&amp;subchapter='.$ch->subchapter.'"><img src="'.
-                    $OUTPUT->pix_url('add', 'mod_book').'" class="iconsmall" alt="'.get_string('addafter', 'mod_book').'" /></a>';
+            $toc .= html_writer::link(new moodle_url('edit.php', array('cmid' => $cm->id, 'pagenum' => $ch->pagenum, 'subchapter' => $ch->subchapter)),
+                                            $OUTPUT->pix_icon('add', get_string('addafter', 'mod_book'), 'mod_book'), array('title' => get_string('addafter', 'mod_book')));
 
-            $toc .= (!$ch->subchapter) ? '<ul>' : '</li>';
+
+            if (!$ch->subchapter) {
+                $toc .= html_writer::start_tag('ul');
+            } else {
+                $toc .= html_writer::end_tag('li');
+            }
             $first = 0;
         }
-        $toc .= '</ul></li></ul>';
+
+        $toc .= html_writer::end_tag('ul');
+        $toc .= html_writer::end_tag('li');
+        $toc .= html_writer::end_tag('ul');
+
     } else { // Normal students view
-        $toc .= '<ul>';
+        $toc .= html_writer::start_tag('ul');
         foreach ($chapters as $ch) {
             $title = trim(format_string($ch->title, true, array('context'=>$context)));
             if (!$ch->hidden) {
                 if (!$ch->subchapter) {
                     $nch++;
                     $ns = 0;
-                    $toc .= ($first) ? '<li>' : '</ul></li><li>';
+
+                    if ($first) {
+                        $toc .= html_writer::start_tag('li');
+                    } else {
+                        $toc .= html_writer::end_tag('ul');
+                        $toc .= html_writer::end_tag('li');
+                        $toc .= html_writer::start_tag('li');
+                    }
+
                     if ($book->numbering == BOOK_NUM_NUMBERS) {
                           $title = "$nch $title";
                     }
                 } else {
                     $ns++;
-                    $toc .= ($first) ? '<li><ul><li>' : '<li>';
+
+                    if ($first) {
+                        $toc .= html_writer::start_tag('li');
+                        $toc .= html_writer::start_tag('ul');
+                        $toc .= html_writer::start_tag('li');
+                    } else {
+                        $toc .= html_writer::start_tag('li');
+                    }
+
                     if ($book->numbering == BOOK_NUM_NUMBERS) {
                           $title = "$nch.$ns $title";
                     }
                 }
                 if ($ch->id == $chapter->id) {
-                    $toc .= '<strong>'.$title.'</strong>';
+                    $toc .= html_writer::tag('strong', $title);
                 } else {
-                    $toc .= '<a title="'.s($title).'" href="view.php?id='.$cm->id.'&amp;chapterid='.$ch->id.'">'.$title.'</a>';
+                    $toc .= html_writer::link(new moodle_url('view.php', array('id' => $cm->id, 'chapterid' => $ch->id)), $title, array('title' => s($title)));
                 }
-                $toc .= (!$ch->subchapter) ? '<ul>' : '</li>';
+
+                if (!$ch->subchapter) {
+                    $toc .= html_writer::start_tag('ul');
+                } else {
+                    $toc .= html_writer::end_tag('li');
+                }
+
                 $first = 0;
             }
         }
-        $toc .= '</ul></li></ul>';
+
+        $toc .= html_writer::end_tag('ul');
+        $toc .= html_writer::end_tag('li');
+        $toc .= html_writer::end_tag('ul');
+
     }
 
-    $toc .= '</div>';
+    $toc .= html_writer::end_tag('div');
 
     $toc = str_replace('<ul></ul>', '', $toc); // Cleanup of invalid structures.
 
index b795875..8901645 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index b1fd5e4..7ae229b 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index 38f87bb..11420ae 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index ca52ac5..7af7de2 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index 6ddaf09..39b9417 100644 (file)
@@ -1,5 +1,5 @@
 
-.mod_book .book_chapter_title {
+.path-mod-book .book_chapter_title {
     font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
     text-align: left;
     font-size: large;
@@ -9,7 +9,7 @@
     margin-bottom: 20px;
 }
 
-.mod_book img.bigicon {
+.path-mod-book img.bigicon {
   vertical-align: middle;
   margin-right: 4px;
   margin-left: 4px;
   border: 0px;
 }
 
-.mod_book .navtop {
+.path-mod-book .navtop {
     text-align: right;
     margin-bottom: 0.5em;
 }
 
-.mod_book .navbottom {
+.path-mod-book .navbottom {
     text-align: right;
 }
 
 /* == Fake toc block == */
 
 /* toc style NONE */
-.mod_book .book_toc_none {
+.path-mod-book .book_toc_none {
   font-size: 0.8em;
 }
-.mod_book .book_toc_none ul {
+.path-mod-book .book_toc_none ul {
     margin-left: 5px;
     padding-left: 0px;
 }
-.mod_book .book_toc_none ul ul {
+.path-mod-book .book_toc_none ul ul {
     margin-left: 0px;
     padding-left: 0px;
 }
-.mod_book .book_toc_none li {
+.path-mod-book .book_toc_none li {
     margin-top: 5px;
     list-style: none;
 }
-.mod_book .book_toc_none li li {
+.path-mod-book .book_toc_none li li {
     margin-top: 0px;
     list-style: none;
 }
 
 
 /* toc style NUMBERED */
-.mod_book .book_toc_numbered {
+.path-mod-book .book_toc_numbered {
   font-size: 0.8em;
 }
-.mod_book .book_toc_numbered ul {
+.path-mod-book .book_toc_numbered ul {
     margin-left: 5px;
     padding-left: 0px;
 }
-.mod_book .book_toc_numbered ul ul {
+.path-mod-book .book_toc_numbered ul ul {
     margin-left: 0px;
     padding-left: 0px;
 }
-.mod_book .book_toc_numbered li {
+.path-mod-book .book_toc_numbered li {
     margin-top: 5px;
     list-style: none;
 }
-.mod_book .book_toc_numbered li li {
+.path-mod-book .book_toc_numbered li li {
     margin-top: 0px;
     list-style: none;
 }
 
 
 /*toc style BULLETS */
-.mod_book .book_toc_bullets {
+.path-mod-book .book_toc_bullets {
   font-size: 0.8em;
 }
-.mod_book .book_toc_bullets ul {
+.path-mod-book .book_toc_bullets ul {
     margin-left: 5px;
     padding-left: 0px;
 }
-.mod_book .book_toc_bullets ul ul {
+.path-mod-book .book_toc_bullets ul ul {
     margin-left: 20px;
     padding-left: 0px;
 }
-.mod_book .book_toc_bullets li {
+.path-mod-book .book_toc_bullets li {
     margin-top: 5px;
     list-style: none;
 }
-.mod_book .book_toc_bullets li li {
+.path-mod-book .book_toc_bullets li li {
     margin-top: 0px;
     list-style: circle;
 }
 
 
 /* toc style INDENTED*/
-.mod_book .book_toc_indented {
+.path-mod-book .book_toc_indented {
   font-size: 0.8em;
 }
-.mod_book .book_toc_indented ul {
+.path-mod-book .book_toc_indented ul {
     margin-left: 5px;
     padding-left: 0px;
 }
-.mod_book .book_toc_indented ul ul {
+.path-mod-book .book_toc_indented ul ul {
     margin-left: 15px;
     padding-left: 0px;
 }
-.mod_book .book_toc_indented li {
+.path-mod-book .book_toc_indented li {
     margin-top: 5px;
     list-style: none;
 }
-.mod_book .book_toc_indented li li {
+.path-mod-book .book_toc_indented li li {
     margin-top: 0px;
     list-style: none;
 }
index 5a5cb24..927793b 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index 4a130dc..f123562 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index a9cdd0c..5e05581 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -44,10 +44,6 @@ $context = context_module::instance($cm->id);
 require_capability('mod/book:read', $context);
 require_capability('booktool/exportimscp:export', $context);
 
-$strbooks = get_string('modulenameplural', 'book');
-$strbook  = get_string('modulename', 'book');
-$strtop  = get_string('top', 'book');
-
 add_to_log($course->id, 'book', 'exportimscp', 'tool/exportimscp/index.php?id='.$cm->id, $book->id, $cm->id);
 
 $file = booktool_exportimscp_build_package($book, $context);
index 5b6a505..558469f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index f807c13..732275f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -31,11 +31,7 @@ defined('MOODLE_INTERNAL') || die;
  * @param navigation_node $node The node to add module settings to
  */
 function booktool_exportimscp_extend_settings_navigation(settings_navigation $settings, navigation_node $node) {
-    global $USER, $PAGE, $CFG, $DB, $OUTPUT;
-
-    if ($PAGE->cm->modname !== 'book') {
-        return;
-    }
+    global $PAGE;
 
     if (has_capability('booktool/exportimscp:export', $PAGE->cm->context)) {
         $url = new moodle_url('/mod/book/tool/exportimscp/index.php', array('id'=>$PAGE->cm->id));
index 788c2f4..374dbd6 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index d15cfbe..1c4acc7 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index d1fb35d..bf6cf07 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index ddbae84..38477f1 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index 95bdd38..eaae261 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -48,9 +48,8 @@ if ($chapterid) {
     $chapter = false;
 }
 
-$PAGE->set_title(format_string($book->name));
-$PAGE->add_body_class('mod_book');
-$PAGE->set_heading(format_string($course->fullname));
+$PAGE->set_title($book->name);
+$PAGE->set_heading($course->fullname);
 
 // Prepare the page header.
 $strbook = get_string('modulename', 'mod_book');
index bbd811d..3668101 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index bf9c7d7..53ad230 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -31,11 +31,7 @@ defined('MOODLE_INTERNAL') || die;
  * @param navigation_node $node The node to add module settings to
  */
 function booktool_importhtml_extend_settings_navigation(settings_navigation $settings, navigation_node $node) {
-    global $USER, $PAGE, $CFG, $DB, $OUTPUT;
-
-    if ($PAGE->cm->modname !== 'book') {
-        return;
-    }
+    global $PAGE;
 
     if (has_capability('booktool/importhtml:import', $PAGE->cm->context)) {
         $url = new moodle_url('/mod/book/tool/importhtml/index.php', array('id'=>$PAGE->cm->id));
index 932054b..b846573 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index ce8ad04..764fcf3 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index 5e5c2b1..37ff6b6 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index efaa684..6b23d11 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index 334bd31..9077b84 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index e059fe1..a2b1e95 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index 8172c07..ffa60de 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -33,12 +33,7 @@ defined('MOODLE_INTERNAL') || die;
 function booktool_print_extend_settings_navigation(settings_navigation $settings, navigation_node $node) {
     global $USER, $PAGE, $CFG, $DB, $OUTPUT;
 
-    if ($PAGE->cm->modname !== 'book') {
-        return;
-    }
-
     $params = $PAGE->url->params();
-
     if (empty($params['id']) or empty($params['chapterid'])) {
         return;
     }
index 524ad16..200bee7 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -45,43 +45,67 @@ function booktool_print_get_toc($chapters, $book, $cm) {
 
     switch ($book->numbering) {
         case BOOK_NUM_NONE:
-            $toc .= '<div class="book_toc_none">';
+            $toc .= html_writer::start_tag('div', array('class' => 'book_toc_none'));
             break;
         case BOOK_NUM_NUMBERS:
-            $toc .= '<div class="book_toc_numbered">';
+            $toc .= html_writer::start_tag('div', array('class' => 'book_toc_numbered'));
             break;
         case BOOK_NUM_BULLETS:
-            $toc .= '<div class="book_toc_bullets">';
+            $toc .= html_writer::start_tag('div', array('class' => 'book_toc_bullets'));
             break;
         case BOOK_NUM_INDENTED:
-            $toc .= '<div class="book_toc_indented">';
+            $toc .= html_writer::start_tag('div', array('class' => 'book_toc_indented'));
             break;
     }
 
-    $toc .= '<a name="toc"></a>'; // Representation of toc (HTML).
+    $toc .= html_writer::tag('a', '', array('name' => 'toc')); // Representation of toc (HTML).
 
     if ($book->customtitles) {
-        $toc .= '<h1>'.get_string('toc', 'mod_book').'</h1>';
+        $toc .= html_writer::tag('h1', get_string('toc', 'mod_book'));
     } else {
-        $toc .= '<p class="book_chapter_title">'.get_string('toc', 'mod_book').'</p>';
+        $toc .= html_writer::tag('p', get_string('toc', 'mod_book'), array('class' => 'book_chapter_title'));
     }
-    $toc .= '<ul>';
+    $toc .= html_writer::start_tag('ul');
     foreach ($chapters as $ch) {
         if (!$ch->hidden) {
             $title = book_get_chapter_title($ch->id, $chapters, $book, $context);
             if (!$ch->subchapter) {
-                $toc .= $first ? '<li>' : '</ul></li><li>';
+
+                if ($first) {
+                    $toc .= html_writer::start_tag('li');
+                } else {
+                    $toc .= html_writer::end_tag('ul');
+                    $toc .= html_writer::end_tag('li');
+                    $toc .= html_writer::start_tag('li');
+                }
+
             } else {
-                $toc .= $first ? '<li><ul><li>' : '<li>';
+
+                if ($first) {
+                    $toc .= html_writer::start_tag('li');
+                    $toc .= html_writer::start_tag('ul');
+                    $toc .= html_writer::start_tag('li');
+                } else {
+                    $toc .= html_writer::start_tag('li');
+                }
+
             }
             $titles[$ch->id] = $title;
-            $toc .= '<a title="'.s($title).'" href="#ch'.$ch->id.'">'.$title.'</a>';
-            $toc .= (!$ch->subchapter) ? '<ul>' : '</li>';
+            $toc .= html_writer::link(new moodle_url('#ch'.$ch->id), $title, array('title' => s($title)));
+            if (!$ch->subchapter) {
+                $toc .= html_writer::start_tag('ul');
+            } else {
+                $toc .= html_writer::end_tag('li');
+            }
             $first = false;
         }
     }
-    $toc .= '</ul></li></ul>';
-    $toc .= '</div>';
+
+    $toc .= html_writer::end_tag('ul');
+    $toc .= html_writer::end_tag('li');
+    $toc .= html_writer::end_tag('ul');
+    $toc .= html_writer::end_tag('div');
+
     $toc = str_replace('<ul></ul>', '', $toc); // Cleanup of invalid structures.
 
     return array($toc, $titles);
index b7112b7..2951ef0 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book plugin for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index 1cc1476..cc4ad8f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index 0ec34cf..26d5ac0 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// This file is part of Book module for Moodle - http://moodle.org/
+// This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -114,9 +114,8 @@ $strbook  = get_string('modulename', 'mod_book');
 $strtoc   = get_string('toc', 'mod_book');
 
 // prepare header
-$PAGE->set_title(format_string($book->name));
-$PAGE->add_body_class('mod_book');
-$PAGE->set_heading(format_string($course->fullname));
+$PAGE->set_title($book->name);
+$PAGE->set_heading($course->fullname);
 
 book_add_fake_block($chapters, $chapter, $book, $cm, $edit);
 
index 0a05ec7..a595286 100644 (file)
@@ -560,7 +560,7 @@ function glossary_print_recent_activity($course, $viewfullnames, $timestart) {
             echo '<div class="info"><a href="'.$link.'">'.format_string($entry->concept, true).'</a></div>';
             $entrycount += 1;
         } else {
-            $numnewentries = $DB->count_records_sql($countsql.$joins[0].$clausesql.$approvalsql.')', $params);
+            $numnewentries = $DB->count_records_sql($countsql.$joins[0].$clausesql.$approvalsql, $params);
             echo '<div class="head"><div class="activityhead">'.get_string('andmorenewentries', 'glossary', $numnewentries - GLOSSARY_RECENT_ACTIVITY_LIMIT).'</div></div>';
             break;
         }
index 036b4e2..58a38d1 100644 (file)
@@ -307,6 +307,15 @@ class restore_quiz_activity_structure_step extends restore_questions_activity_st
         $data->timefinish = $this->apply_date_offset($data->timefinish);
         $data->timemodified = $this->apply_date_offset($data->timemodified);
 
+        // Deals with up-grading pre-2.3 back-ups to 2.3+.
+        if (!isset($data->state)) {
+            if ($data->timefinish > 0) {
+                $data->state = 'finished';
+            } else {
+                $data->state = 'inprogress';
+            }
+        }
+
         // The data is actually inserted into the database later in inform_new_usage_id.
         $this->currentquizattempt = clone($data);
     }
index 7184605..9a2186e 100644 (file)
@@ -55,8 +55,8 @@
         <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true" NEXT="quizstatisticsid"/>
         <FIELD NAME="quizstatisticsid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" PREVIOUS="id" NEXT="questionid"/>
         <FIELD NAME="questionid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" PREVIOUS="quizstatisticsid" NEXT="subqid"/>
-        <FIELD NAME="subqid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" PREVIOUS="questionid" NEXT="aid"/>
-        <FIELD NAME="aid" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" PREVIOUS="subqid" NEXT="response"/>
+        <FIELD NAME="subqid" TYPE="char" LENGTH="100" NOTNULL="true" SEQUENCE="false" PREVIOUS="questionid" NEXT="aid"/>
+        <FIELD NAME="aid" TYPE="char" LENGTH="100" NOTNULL="false" SEQUENCE="false" PREVIOUS="subqid" NEXT="response"/>
         <FIELD NAME="response" TYPE="text" LENGTH="big" NOTNULL="false" SEQUENCE="false" PREVIOUS="aid" NEXT="rcount"/>
         <FIELD NAME="rcount" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" PREVIOUS="response" NEXT="credit"/>
         <FIELD NAME="credit" TYPE="number" LENGTH="15" NOTNULL="true" SEQUENCE="false" DECIMALS="5" PREVIOUS="rcount"/>
index 00f9350..f3a7871 100644 (file)
@@ -37,6 +37,32 @@ function xmldb_quiz_statistics_upgrade($oldversion) {
     // Moodle v2.2.0 release upgrade line.
     // Put any upgrade step following this.
 
+    if ($oldversion < 2012061800) {
+
+        // Changing type of field subqid on table quiz_question_response_stats to char.
+        $table = new xmldb_table('quiz_question_response_stats');
+        $field = new xmldb_field('subqid', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null, 'questionid');
+
+        // Launch change of type for field subqid.
+        $dbman->change_field_type($table, $field);
+
+        // Statistics savepoint reached.
+        upgrade_plugin_savepoint(true, 2012061800, 'quiz', 'statistics');
+    }
+
+    if ($oldversion < 2012061801) {
+
+        // Changing type of field aid on table quiz_question_response_stats to char.
+        $table = new xmldb_table('quiz_question_response_stats');
+        $field = new xmldb_field('aid', XMLDB_TYPE_CHAR, '100', null, null, null, null, 'subqid');
+
+        // Launch change of type for field aid.
+        $dbman->change_field_type($table, $field);
+
+        // Statistics savepoint reached.
+        upgrade_plugin_savepoint(true, 2012061801, 'quiz', 'statistics');
+    }
+
     return true;
 }
 
index 1db495a..b9d77cc 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2012061700;
+$plugin->version   = 2012061801;
 $plugin->requires  = 2012061700;
 $plugin->cron      = 18000;
 $plugin->component = 'quiz_statistics';
index 99c42ba..120f61e 100644 (file)
@@ -106,7 +106,7 @@ class portfolio_plugin_boxnet extends portfolio_plugin_push_base {
         }
     }
 
-    public function admin_config_form(&$mform) {
+    public static function admin_config_form(&$mform) {
         global $CFG;
 
         $mform->addElement('text', 'apikey', get_string('apikey', 'portfolio_boxnet'));
index fe63d9d..2815a0f 100644 (file)
@@ -96,7 +96,7 @@ class portfolio_plugin_flickr extends portfolio_plugin_push_base {
         return true;
     }
 
-    public function admin_config_form(&$mform) {
+    public static function admin_config_form(&$mform) {
         global $CFG;
 
         $strrequired = get_string('required');
index dfdc1dc..01420b5 100644 (file)
@@ -49,6 +49,8 @@ function portfolio_googledocs_admin_upgrade_notification() {
         return;
     }
     $mainadmin = reset($admins);
+    $a = new stdClass;
+    $a->docsurl = get_docs_url('Google_OAuth_2.0_setup');
 
     foreach ($admins as $admin) {
         $message = new stdClass();
@@ -58,8 +60,8 @@ function portfolio_googledocs_admin_upgrade_notification() {
         $message->userto            = $admin;
         $message->smallmessage      = get_string('oauth2upgrade_message_small', 'portfolio_googledocs');
         $message->subject           = get_string('oauth2upgrade_message_subject', 'portfolio_googledocs');
-        $message->fullmessage       = get_string('oauth2upgrade_message_content', 'portfolio_googledocs');
-        $message->fullmessagehtml   = get_string('oauth2upgrade_message_content', 'portfolio_googledocs');
+        $message->fullmessage       = get_string('oauth2upgrade_message_content', 'portfolio_googledocs', $a);
+        $message->fullmessagehtml   = get_string('oauth2upgrade_message_content', 'portfolio_googledocs', $a);
         $message->fullmessageformat = FORMAT_PLAIN;
         $message->notification      = 1;
         message_send($message);
index c52bba1..504e3cc 100644 (file)
@@ -27,10 +27,10 @@ $string['noauthtoken'] = 'An authentication token has not been recieved from goo
 $string['nooauthcredentials'] = 'OAuth credentials required.';
 $string['nooauthcredentials_help'] = 'To use the Google Docs portfolio plugin you must configure OAuth credentials in the portfolio settings.';
 $string['nosessiontoken'] = 'A session token does not exist preventing export to google.';
-$string['oauthinfo'] = '<p>To use the google docs portfolio you must be registered with Google. Instructions for registing your installation with Google are described in <a href="{$a->docsurl}">Moodle Docs</a>. The redirect url should be set to:</p><p>{$a->callbackurl}</p>';
+$string['oauthinfo'] = '<p>To use this plugin, you must register your site with Google, as described in the documentation <a href="{$a->docsurl}">Google OAuth 2.0 setup</a>.</p><p>As part of the registration process, you will need to enter the following URL as \'Authorized Redirect URIs\':</p><p>{$a->callbackurl}</p>Once registered, you will be provided with a client ID and secret which can be used to configure all Google Docs and Picasa plugins.</p>';
 $string['oauth2upgrade_message_subject'] = 'Important information regarding Google Docs portfolio plugin';
-$string['oauth2upgrade_message_content'] = 'As part of the upgrade to Moodle 2.3, the Google Docs portfolio plugin has been disabled due to changes in Googles API. To re-enable your plugin, you must configure oauth credentials in this plugin.';
-$string['oauth2upgrade_message_small'] = 'The Google Docs portfolio plugin has been disabled until configured with OAuth2';
+$string['oauth2upgrade_message_content'] = 'As part of the upgrade to Moodle 2.3, the Google Docs portfolio plugin has been disabled. To re-enable it, your Moodle site needs to be registered with Google, as described in the documentation {$a->docsurl}, in order to obtain a client ID and secret. The client ID and secret can then be used to configure all Google Docs and Picasa plugins.';
+$string['oauth2upgrade_message_small'] = 'This plugin has been disabled, as it requires configuration as described in the documentation Google OAuth 2.0 setup.';
 $string['pluginname'] = 'Google Docs';
 $string['sendfailed'] = 'The file {$a} failed to transfer to google';
 $string['secret'] = 'Secret';
index 02ce159..0405ba5 100644 (file)
@@ -100,9 +100,9 @@ class portfolio_plugin_googledocs extends portfolio_plugin_push_base {
         return array('clientid', 'secret');
     }
 
-    public function admin_config_form(&$mform) {
+    public static function admin_config_form(&$mform) {
         $a = new stdClass;
-        $a->docsurl = get_docs_url('Google_OAuth2_Setup');
+        $a->docsurl = get_docs_url('Google_OAuth_2.0_setup');
         $a->callbackurl = google_oauth::callback_url()->out(false);
 
         $mform->addElement('static', null, '', get_string('oauthinfo', 'portfolio_googledocs', $a));
index beb43b1..77c40d6 100644 (file)
@@ -84,7 +84,7 @@ class portfolio_plugin_mahara extends portfolio_plugin_pull_base {
         return true;
     }
 
-    public function admin_config_form(&$mform) {
+    public static function admin_config_form(&$mform) {
         $strrequired = get_string('required');
         $hosts = self::get_mnet_hosts(); // this is called by sanity check but it's ok because it's cached
         foreach ($hosts as $host) {
index e5d1cca..38df9d5 100644 (file)
@@ -49,6 +49,8 @@ function portfolio_picasa_admin_upgrade_notification() {
         return;
     }
     $mainadmin = reset($admins);
+    $a = new stdClass;
+    $a->docsurl = get_docs_url('Google_OAuth_2.0_setup');
 
     foreach ($admins as $admin) {
         $message = new stdClass();
@@ -58,8 +60,8 @@ function portfolio_picasa_admin_upgrade_notification() {
         $message->userto            = $admin;
         $message->smallmessage      = get_string('oauth2upgrade_message_small', 'portfolio_picasa');
         $message->subject           = get_string('oauth2upgrade_message_subject', 'portfolio_picasa');
-        $message->fullmessage       = get_string('oauth2upgrade_message_content', 'portfolio_picasa');
-        $message->fullmessagehtml   = get_string('oauth2upgrade_message_content', 'portfolio_picasa');
+        $message->fullmessage       = get_string('oauth2upgrade_message_content', 'portfolio_picasa', $a);
+        $message->fullmessagehtml   = get_string('oauth2upgrade_message_content', 'portfolio_picasa', $a);
         $message->fullmessageformat = FORMAT_PLAIN;
         $message->notification      = 1;
         message_send($message);
index 93781b6..b0f2252 100644 (file)
@@ -26,10 +26,10 @@ $string['clientid'] = 'Client ID';
 $string['noauthtoken'] = 'An authentication token has not been recieved from google. Please ensure you are allowing moodle to access your google account';
 $string['nooauthcredentials'] = 'OAuth credentials required.';
 $string['nooauthcredentials_help'] = 'To use the Picasa portfolio plugin you must configure OAuth credentials in the portfolio settings.';
-$string['oauthinfo'] = '<p>To use the Picasa portfolio you must be registered with Google. Instructions for registing your installation with Google are described in <a href="{$a->docsurl}">Moodle Docs</a>. The redirect url should be set to:</p><p>{$a->callbackurl}</p>';
+$string['oauthinfo'] = '<p>To use this plugin, you must register your site with Google, as described in the documentation <a href="{$a->docsurl}">Google OAuth 2.0 setup</a>.</p><p>As part of the registration process, you will need to enter the following URL as \'Authorized Redirect URIs\':</p><p>{$a->callbackurl}</p>Once registered, you will be provided with a client ID and secret which can be used to configure all Google Docs and Picasa plugins.</p>';
 $string['oauth2upgrade_message_subject'] = 'Important information regarding Picasa portfolio plugin';
-$string['oauth2upgrade_message_content'] = 'As part of the upgrade to Moodle 2.3, the Picasa portfolio plugin has been disabled due to changes in Googles API. To re-enable your plugin, you must configure oauth credentials in this plugin.';
-$string['oauth2upgrade_message_small'] = 'The Picasa portfolio plugin has been disabled until configured with OAuth2';
+$string['oauth2upgrade_message_content'] = 'As part of the upgrade to Moodle 2.3, the Picasa portfolio plugin has been disabled. To re-enable it, your Moodle site needs to be registered with Google, as described in the documentation {$a->docsurl}, in order to obtain a client ID and secret. The client ID and secret can then be used to configure all Google Docs and Picasa plugins.';
+$string['oauth2upgrade_message_small'] = 'This plugin has been disabled, as it requires configuration as described in the documentation Google OAuth 2.0 setup.';
 $string['pluginname'] = 'Picasa';
 $string['sendfailed'] = 'The file {$a} failed to transfer to picasa';
 $string['secret'] = 'Secret';
index 70200c1..cbef42c 100644 (file)
@@ -100,9 +100,9 @@ class portfolio_plugin_picasa extends portfolio_plugin_push_base {
         return array('clientid', 'secret');
     }
 
-    public function admin_config_form(&$mform) {
+    public static function admin_config_form(&$mform) {
         $a = new stdClass;
-        $a->docsurl = get_docs_url('Google_OAuth2_Setup');
+        $a->docsurl = get_docs_url('Google_OAuth_2.0_setup');
         $a->callbackurl = google_oauth::callback_url()->out(false);
 
         $mform->addElement('static', null, '', get_string('oauthinfo', 'portfolio_picasa', $a));
diff --git a/portfolio/upgrade.txt b/portfolio/upgrade.txt
new file mode 100644 (file)
index 0000000..efc88ea
--- /dev/null
@@ -0,0 +1,9 @@
+This files describes API changes in /portfolio/ portfolio system,
+information provided here is intended especially for developers.
+
+=== 2.3 ===
+
+required changes:
+* The following methods must now be declared static for php5 compatibility:
+    - admin_config_form
+    - admin_config_validation
index 6578afe..e26072e 100644 (file)
@@ -136,7 +136,7 @@ class repository_boxnet extends repository {
                     $list[] = array('title'=>$v,
                             'size'=>$filesizes[$n],
                             'date'=>$filedates[$n],
-                            'source'=>'http://box.net/api/1.0/download/'
+                            'source'=>'https://www.box.com/api/1.0/download/'
                                 .$this->auth_token.'/'.$fileids[$n],
                             'thumbnail' => $OUTPUT->pix_url(file_extension_icon($v, 90))->out(false));
                 }
@@ -158,7 +158,7 @@ class repository_boxnet extends repository {
         $ret  = array();
         $ret['list'] = array();
         $tree = $this->boxclient->getfiletree($path);
-        $ret['manage'] = 'http://www.box.net/files';
+        $ret['manage'] = 'http://www.box.com/files';
         $ret['path'] = array(array('name'=>'Root', 'path'=>0));
         if(!empty($tree)) {
             $ret['list'] = array_filter($tree, array($this, 'filter'));
@@ -176,7 +176,7 @@ class repository_boxnet extends repository {
         if ($this->options['ajax']) {
             $popup_btn = new stdClass();
             $popup_btn->type = 'popup';
-            $popup_btn->url = ' https://www.box.net/api/1.0/auth/' . $t['ticket'];
+            $popup_btn->url = ' https://www.box.com/api/1.0/auth/' . $t['ticket'];
 
             $ret = array();
             $ret['login'] = array($popup_btn);
index f24ac9a..48cc558 100644 (file)
@@ -30,6 +30,7 @@ $string['breadcrumb'] = 'EQUELLA';
 $string['equellaurl'] = 'EQUELLA URL';
 $string['equellaaction'] = 'EQUELLA action';
 $string['equellaoptions'] = 'EQUELLA options';
+$string['equella:view'] = 'View EQUELLA repository';
 $string['sharedid'] = 'Shared secret ID';
 $string['sharedsecrets'] = 'Shared secret';
 
index f5ec4a6..ea1a424 100644 (file)
@@ -518,7 +518,7 @@ M.core_filepicker.init = function(Y, options) {
     Y.extend(FilePickerHelper, Y.Base, {
         api: M.cfg.wwwroot+'/repository/repository_ajax.php',
         cached_responses: {},
-
+        waitinterval : null, // When the loading template is being displayed and its animation is running this will be an interval instance.
         initializer: function(options) {
             this.options = options;
             if (!this.options.savepath) {
@@ -1188,7 +1188,37 @@ M.core_filepicker.init = function(Y, options) {
             }, this);
         },
         wait: function() {
-            this.fpnode.one('.fp-content').setContent(M.core_filepicker.templates.loading);
+            // First check there isn't already an interval in play, and if there is kill it now.
+            if (this.waitinterval != null) {
+                clearInterval(this.waitinterval);
+            }
+            // Prepare the root node we will set content for and the loading template we want to display as a YUI node.
+            var root = this.fpnode.one('.fp-content');
+            var content = Y.Node.create(M.core_filepicker.templates.loading).addClass('fp-content-hidden').setStyle('opacity', 0);
+            var count = 0;
+            // Initiate an interval, we will have a count which will increment every 100 milliseconds.
+            // Count 0 - the loading icon will have visibility set to hidden (invisible) and have an opacity of 0 (invisible also)
+            // Count 5 - the visiblity will be switched to visible but opacity will still be at 0 (inivisible)
+            // Counts 6 - 15 opacity will be increased by 0.1 making the loading icon visible over the period of a second
+            // Count 16 - The interval will be cancelled.
+            var interval = setInterval(function(){
+                if (!content || !root.contains(content) || count >= 15) {
+                    clearInterval(interval);
+                    return true;
+                }
+                if (count == 5) {
+                    content.removeClass('fp-content-hidden');
+                } else if (count > 5) {
+                    var opacity = parseFloat(content.getStyle('opacity'));
+                    content.setStyle('opacity', opacity + 0.1);
+                }
+                count++;
+                return false;
+            }, 100);
+            // Store the wait interval so that we can check it in the future.
+            this.waitinterval = interval;
+            // Set the content to the loading template.
+            root.setContent(content);
         },
         viewbar_set_enabled: function(mode) {
             var viewbar = this.fpnode.one('.fp-viewbar')
@@ -1741,6 +1771,14 @@ M.core_filepicker.init = function(Y, options) {
                         if (obj.repo_id == scope.active_repo.id && obj.form) {
                             // if we did not jump to another repository meanwhile
                             searchform.setContent(obj.form);
+                            // Highlight search text when user click for search.
+                            var searchnode = searchform.one('input[name="s"]');
+                            if (searchnode) {
+                                searchnode.once('click', function(e) {
+                                    e.preventDefault();
+                                    this.select();
+                                });
+                            }
                         }
                     }
                 }, false);
index 893ed39..80a77a6 100644 (file)
@@ -53,6 +53,8 @@ function repository_googledocs_admin_upgrade_notification() {
     }
     $mainadmin = reset($admins);
 
+    $a = new stdClass;
+    $a->docsurl = get_docs_url('Google_OAuth_2.0_setup');
     foreach ($admins as $admin) {
         $message = new stdClass();
         $message->component         = 'moodle';
@@ -61,8 +63,8 @@ function repository_googledocs_admin_upgrade_notification() {
         $message->userto            = $admin;
         $message->smallmessage      = get_string('oauth2upgrade_message_small', 'repository_googledocs');
         $message->subject           = get_string('oauth2upgrade_message_subject', 'repository_googledocs');
-        $message->fullmessage       = get_string('oauth2upgrade_message_content', 'repository_googledocs');
-        $message->fullmessagehtml   = get_string('oauth2upgrade_message_content', 'repository_googledocs');
+        $message->fullmessage       = get_string('oauth2upgrade_message_content', 'repository_googledocs', $a);
+        $message->fullmessagehtml   = get_string('oauth2upgrade_message_content', 'repository_googledocs', $a);
         $message->fullmessageformat = FORMAT_PLAIN;
         $message->notification      = 1;
         message_send($message);
index 4f7faa7..82fbc71 100644 (file)
 $string['clientid'] = 'Client ID';
 $string['configplugin'] = 'Configure Google Docs plugin';
 $string['googledocs:view'] = 'View google docs repository';
-$string['oauthinfo'] = '<p>To use the Google Docs repository you must be registered with Google. Instructions for registing your installation with Google are described in <a href="{$a->docsurl}">Moodle Docs</a>. The redirect url should be set to:</p><p>{$a->callbackurl}</p>';
+$string['oauthinfo'] = '<p>To use this plugin, you must register your site with Google, as described in the documentation <a href="{$a->docsurl}">Google OAuth 2.0 setup</a>.</p><p>As part of the registration process, you will need to enter the following URL as \'Authorized Redirect URIs\':</p><p>{$a->callbackurl}</p>Once registered, you will be provided with a client ID and secret which can be used to configure all Google Docs and Picasa plugins.</p>';
 $string['oauth2upgrade_message_subject'] = 'Important information regarding Google Docs repository plugin';
-$string['oauth2upgrade_message_content'] = 'As part of the upgrade to Moodle 2.3, the Google Docs repository plugin has been disabled due to changes in Googles API. To re-enable your plugin, you must add and reconfigure configure oauth credentials of this plugin.';
-$string['oauth2upgrade_message_small'] = 'The Google Docs repository plugin has been disabled until configured with OAuth2';
+$string['oauth2upgrade_message_content'] = 'As part of the upgrade to Moodle 2.3, the Google Docs portfolio plugin has been disabled. To re-enable it, your Moodle site needs to be registered with Google, as described in the documentation {$a->docsurl}, in order to obtain a client ID and secret. The client ID and secret can then be used to configure all Google Docs and Picasa plugins.';
+$string['oauth2upgrade_message_small'] = 'This plugin has been disabled, as it requires configuration as described in the documentation Google OAuth 2.0 setup.';
 $string['pluginname'] = 'Google Docs';
 $string['secret'] = 'Secret';
 
index df0f23e..ee56c02 100644 (file)
@@ -112,7 +112,7 @@ class repository_googledocs extends repository {
     public static function type_config_form($mform, $classname = 'repository') {
 
         $a = new stdClass;
-        $a->docsurl = get_docs_url('Google_OAuth2_Setup');
+        $a->docsurl = get_docs_url('Google_OAuth_2.0_setup');
         $a->callbackurl = google_oauth::callback_url()->out(false);
 
         $mform->addElement('static', null, '', get_string('oauthinfo', 'repository_googledocs', $a));
index 082e5e3..1cd2f2a 100644 (file)
@@ -52,6 +52,8 @@ function repository_picasa_admin_upgrade_notification() {
         return;
     }
     $mainadmin = reset($admins);
+    $a = new stdClass;
+    $a->docsurl = get_docs_url('Google_OAuth_2.0_setup');
 
     foreach ($admins as $admin) {
         $message = new stdClass();
@@ -61,8 +63,8 @@ function repository_picasa_admin_upgrade_notification() {
         $message->userto            = $admin;
         $message->smallmessage      = get_string('oauth2upgrade_message_small', 'repository_picasa');
         $message->subject           = get_string('oauth2upgrade_message_subject', 'repository_picasa');
-        $message->fullmessage       = get_string('oauth2upgrade_message_content', 'repository_picasa');
-        $message->fullmessagehtml   = get_string('oauth2upgrade_message_content', 'repository_picasa');
+        $message->fullmessage       = get_string('oauth2upgrade_message_content', 'repository_picasa', $a);
+        $message->fullmessagehtml   = get_string('oauth2upgrade_message_content', 'repository_picasa', $a);
         $message->fullmessageformat = FORMAT_PLAIN;
         $message->notification      = 1;
         message_send($message);
index 89d75a6..13a9bc6 100644 (file)
 
 $string['clientid'] = 'Client ID';
 $string['configplugin'] = 'Picasa repository configuration';
-$string['oauthinfo'] = '<p>To use the Picasa repository you must be registered with Google. Instructions for registing your installation with Google are described in <a href="{$a->docsurl}">Moodle Docs</a>. The redirect url should be set to:</p><p>{$a->callbackurl}</p>';
+$string['oauthinfo'] = '<p>To use this plugin, you must register your site with Google, as described in the documentation <a href="{$a->docsurl}">Google OAuth 2.0 setup</a>.</p><p>As part of the registration process, you will need to enter the following URL as \'Authorized Redirect URIs\':</p><p>{$a->callbackurl}</p>Once registered, you will be provided with a client ID and secret which can be used to configure all Google Docs and Picasa plugins.</p>';
 $string['oauth2upgrade_message_subject'] = 'Important information regarding Picasa repository plugin';
-$string['oauth2upgrade_message_content'] = 'As part of the upgrade to Moodle 2.3, the Picasa repository plugin has been disabled due to changes in Googles API. To re-enable your plugin, you must add and reconfigure configure oauth credentials of this plugin.';
-$string['oauth2upgrade_message_small'] = 'The Picasa repository plugin has been disabled until configured with OAuth2';
+$string['oauth2upgrade_message_content'] = 'As part of the upgrade to Moodle 2.3, the Picasa portfolio plugin has been disabled. To re-enable it, your Moodle site needs to be registered with Google, as described in the documentation {$a->docsurl}, in order to obtain a client ID and secret. The client ID and secret can then be used to configure all Google Docs and Picasa plugins.';
+$string['oauth2upgrade_message_small'] = 'This plugin has been disabled, as it requires configuration as described in the documentation Google OAuth 2.0 setup.';
 $string['picasa:view'] = 'View picasa repository';
 $string['pluginname'] = 'Picasa web album';
 $string['secret'] = 'Secret';
index 0d0b63c..7dbdf7b 100644 (file)
@@ -114,7 +114,7 @@ class repository_picasa extends repository {
 
     public static function type_config_form($mform, $classname = 'repository') {
         $a = new stdClass;
-        $a->docsurl = get_docs_url('Google_OAuth2_Setup');
+        $a->docsurl = get_docs_url('Google_OAuth_2.0_setup');
         $a->callbackurl = google_oauth::callback_url()->out(false);
 
         $mform->addElement('static', null, '', get_string('oauthinfo', 'repository_picasa', $a));
index cf023dd..d1a2512 100644 (file)
@@ -57,8 +57,9 @@ class repository_upload extends repository {
         $itemid   = optional_param('itemid', 0, PARAM_INT);
         $license  = optional_param('license', $CFG->sitedefaultlicense, PARAM_TEXT);
         $author   = optional_param('author', '', PARAM_TEXT);
+        $overwriteexisting = optional_param('overwrite', false, PARAM_BOOL);
 
-        return $this->process_upload($saveas_filename, $maxbytes, $types, $savepath, $itemid, $license, $author);
+        return $this->process_upload($saveas_filename, $maxbytes, $types, $savepath, $itemid, $license, $author, $overwriteexisting);
     }
 
     /**
@@ -70,9 +71,10 @@ class repository_upload extends repository {
      * @param int $itemid optional the ID for this item within the file area
      * @param string $license optional the license to use for this file
      * @param string $author optional the name of the author of this file
+     * @param bool $overwriteexisting optional user has asked to overwrite the existing file
      * @return object containing details of the file uploaded
      */
-    public function process_upload($saveas_filename, $maxbytes, $types = '*', $savepath = '/', $itemid = 0, $license = null, $author = '') {
+    public function process_upload($saveas_filename, $maxbytes, $types = '*', $savepath = '/', $itemid = 0, $license = null, $author = '', $overwriteexisting = false) {
         global $USER, $CFG;
 
         if ((is_array($types) and in_array('*', $types)) or $types == '*') {
@@ -191,32 +193,37 @@ class repository_upload extends repository {
         $record->userid    = $USER->id;
 
         if (repository::draftfile_exists($record->itemid, $record->filepath, $record->filename)) {
-            $existingfilename = $record->filename;
-            $unused_filename = repository::get_unused_filename($record->itemid, $record->filepath, $record->filename);
-            $record->filename = $unused_filename;
-            $stored_file = $fs->create_file_from_pathname($record, $_FILES[$elname]['tmp_name']);
-            $event = array();
-            $event['event'] = 'fileexists';
-            $event['newfile'] = new stdClass;
-            $event['newfile']->filepath = $record->filepath;
-            $event['newfile']->filename = $unused_filename;
-            $event['newfile']->url = moodle_url::make_draftfile_url($record->itemid, $record->filepath, $unused_filename)->out(false);
-
-            $event['existingfile'] = new stdClass;
-            $event['existingfile']->filepath = $record->filepath;
-            $event['existingfile']->filename = $existingfilename;
-            $event['existingfile']->url      = moodle_url::make_draftfile_url($record->itemid, $record->filepath, $existingfilename)->out(false);
-            return $event;
-        } else {
-            $stored_file = $fs->create_file_from_pathname($record, $_FILES[$elname]['tmp_name']);
+            if ($overwriteexisting) {
+                repository::delete_tempfile_from_draft($record->itemid, $record->filepath, $record->filename);
+            } else {
+                $existingfilename = $record->filename;
+                $unused_filename = repository::get_unused_filename($record->itemid, $record->filepath, $record->filename);
+                $record->filename = $unused_filename;
+                $stored_file = $fs->create_file_from_pathname($record, $_FILES[$elname]['tmp_name']);
+                $event = array();
+                $event['event'] = 'fileexists';
+                $event['newfile'] = new stdClass;
+                $event['newfile']->filepath = $record->filepath;
+                $event['newfile']->filename = $unused_filename;
+                $event['newfile']->url = moodle_url::make_draftfile_url($record->itemid, $record->filepath, $unused_filename)->out(false);
 
-            return array(
-                'url'=>moodle_url::make_draftfile_url($record->itemid, $record->filepath, $record->filename)->out(false),
-                'id'=>$record->itemid,
-                'file'=>$record->filename);
+                $event['existingfile'] = new stdClass;
+                $event['existingfile']->filepath = $record->filepath;
+                $event['existingfile']->filename = $existingfilename;
+                $event['existingfile']->url      = moodle_url::make_draftfile_url($record->itemid, $record->filepath, $existingfilename)->out(false);
+                return $event;
+            }
         }
+
+        $stored_file = $fs->create_file_from_pathname($record, $_FILES[$elname]['tmp_name']);
+
+        return array(
+            'url'=>moodle_url::make_draftfile_url($record->itemid, $record->filepath, $record->filename)->out(false),
+            'id'=>$record->itemid,
+            'file'=>$record->filename);
     }
 
+
     /**
      * Checks the contents of the given file is not completely NULL - this can happen if a
      * user drags & drops a folder onto a filemanager / filepicker element
index 28153ca..6f38ffd 100644 (file)
@@ -819,8 +819,8 @@ sup {vertical-align: super;}
 }
 
 .moodle-dialogue-base .moodle-dialogue {
-    background-color: transparent!important;
-    border: 0px solid transparent!important;
+    background: none!important;
+    border: 0 none!important;
 }
 
 .chooserdialogue .moodle-dialogue-wrap {
@@ -882,7 +882,7 @@ sup {vertical-align: super;}
     max-height: 550px;
     overflow-x: hidden;
     overflow-y: auto;
-    max-width: 18.5em;
+    max-width: 20.3em;
     box-shadow: inset 0px 0px 30px 0px #CCCCCC;
     -webkit-box-shadow: inset 0px 0px 30px 0px #CCCCCC;
     -moz-box-shadow: inset 0px 0px 30px 0px #CCCCCC;
@@ -902,13 +902,10 @@ sup {vertical-align: super;}
     padding-bottom: 0.4em;
 }
 
-.choosercontainer #chooseform .subtype {
-    margin-bottom: 0;
-    padding: 0 0 0 1em;
-}
-
 .choosercontainer #chooseform .option .typename,
-.choosercontainer #chooseform .option span.modicon img.icon {
+.choosercontainer #chooseform .option span.modicon img.icon,
+.choosercontainer #chooseform .nonoption .typename,
+.choosercontainer #chooseform .nonoption span.modicon img.icon {
     padding: 0 0 0 0.5em;
 }
 
@@ -924,6 +921,21 @@ sup {vertical-align: super;}
     border-bottom: 1px solid #FFFFFF;
 }
 
+.choosercontainer #chooseform .nonoption {
+    padding-left: 2.7em;
+    padding-top: 0.3em;
+    padding-bottom: 0.1em;
+}
+
+.choosercontainer #chooseform .subtype {
+    margin-bottom: 0;
+    padding: 0 1.6em 0 3.2em;
+}
+
+.choosercontainer #chooseform .subtype .typename {
+    margin: 0 0 0 0.2em;
+}
+
 /* The instruction/help area */
 .choosercontainer #chooseform .instruction,
 .jsenabled .choosercontainer #chooseform .typesummary {
@@ -932,9 +944,9 @@ sup {vertical-align: super;}
     top: 0px;
     right: 0px;
     bottom: 0px;
-    left: 18.5em;
+    left: 20.3em;
     margin: 0;
-    padding: 2em 2em 2em 2.4em;
+    padding: 1.6em;
     background-color: #FFFFFF;
     overflow-x: hidden;
     overflow-y: auto;
index 060485c..aed0eba 100644 (file)
@@ -5,11 +5,12 @@
 .filemanager, .file-picker {font-size:11px;color: #555555;letter-spacing: .2px;}
 .filemanager a, .file-picker a {color:#555555;}
 .filemanager a:hover, .file-picker a:hover {color:#555555;text-decoration: none;}
-.filemanager select, .filemanager input, .filemanagerbutton, .filemanager textarea,
+.filemanager select, .filemanager input, .filemanager button, .filemanager textarea,
 .file-picker select, .file-picker input, .file-picker button, .file-picker textarea {color:#555555; letter-spacing: .2px;}
 .filemanager input[type="text"], .file-picker input[type="text"] {border: 1px solid #BBBBBB;width: 265px;height: 18px;padding: 1px 6px;}
 .filemanager select, .file-picker select {height: 22px;padding: 2px 1px;}
 .fp-content-center {height: 100%;width: 100%;display:table-cell;vertical-align: middle;}
+.fp-content-hidden {visibility: hidden;}
 
 /*
  * Dialogue (File Picker and File Manager)
@@ -62,7 +63,7 @@ background: #CCCCCC;filter: progid:DXImageTransform.Microsoft.gradient(startColo
 /*
  * Tools, Path & View on fp-navbar (File Picker and File Manager)
  */
-.fp-toolbar {display: table-row;line-height: 22px;float:left;/*display: inline-block;*/}
+.fp-toolbar {display: table-row;line-height: 22px;float:left;}
 
 .dir-rtl .fp-toolbar {float: right;}
 
@@ -75,7 +76,7 @@ background: #CCCCCC;filter: progid:DXImageTransform.Microsoft.gradient(startColo
 .fp-toolbar .fp-tb-search {width: 228px;height: 14px;}
 .fp-toolbar .fp-tb-search input {background:#FFFFFF url('[[pix:a/search]]') no-repeat 3px 3px;padding: 2px 6px 1px 20px;width: 200px;height: 16px;border: 1px solid #BBBBBB;}
 
-.fp-viewbar {float:right;width:69px;height:22px;margin-right:8px;/*display: inline-block;*/}
+.fp-viewbar {float:right;width:69px;height:22px;margin-right:8px;}
 .dir-rtl .fp-toolbar img {vertical-align: -35%;}
 .dir-rtl .fp-viewbar {float: left;width: 100px;}
 
@@ -104,7 +105,7 @@ background: #CCCCCC;filter: progid:DXImageTransform.Microsoft.gradient(startColo
 .dir-rtl .fp-vb-tree a:hover {background:none; border:30px solid black}
 .dir-rtl .fp-vb-tree.checked a:hover {background:none; border:50px solid black}
 
-.file-picker .fp-pathbar {display: table-row;/*display: inline-block;*/}
+.file-picker .fp-pathbar {display: table-row;}
 .fp-pathbar.empty {display: none;}
 .fp-pathbar .fp-path-folder {background:url('[[pix:theme|fp/path_folder]]') no-repeat 0 0;width:27px;height:12px;margin-left: 4px;}
 .dir-rtl .fp-pathbar .fp-path-folder {background:url('[[pix:theme|fp/path_folder_rtl]]') no-repeat right top;width:auto;height:12px;margin-left: 4px;}
@@ -139,30 +140,30 @@ background: #CCCCCC;filter: progid:DXImageTransform.Microsoft.gradient(startColo
 /*.file-picker .fp-treeview .fp-folder .fp-icon, .filemanager .fp-treeview .fp-folder .fp-icon {}*/
 /* first or middle sibling, no children */
 .file-picker .ygtvtn, .filemanager .ygtvtn {background: url('[[pix:moodle|y/tn]]') 0px 0px no-repeat;width:17px;height:22px;}
-.dir-rtl .file-picker .ygtvtn, .filemanager .ygtvtn {background: url('[[pix:moodle|y/tn_rtl]]') 0px 0px no-repeat;width:17px;height:22px;}
+.dir-rtl .file-picker .ygtvtn {background: url('[[pix:moodle|y/tn_rtl]]') 0px 0px no-repeat;width:17px;height:22px;}
 /* first or middle sibling, collapsable */
 .file-picker .ygtvtm, .filemanager .ygtvtm {background: url('[[pix:moodle|y/tm]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
 /* first or middle sibling, collapsable, hover */
 .file-picker .ygtvtmh, .filemanager .ygtvtmh {background: url('[[pix:moodle|y/tm]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
 /* first or middle sibling, expandable */
 .file-picker .ygtvtp, .filemanager .ygtvtp {background: url('[[pix:moodle|y/tp]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
-.dir-rtl .file-picker .ygtvtp, .filemanager .ygtvtp {background: url('[[pix:moodle|y/tp_rtl]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
+.dir-rtl .file-picker .ygtvtp {background: url('[[pix:moodle|y/tp_rtl]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
 /* first or middle sibling, expandable, hover */
 .file-picker .ygtvtph, .filemanager .ygtvtph {background: url('[[pix:moodle|y/tp]]') 0px 10px no-repeat;width:13px;height:22px;cursor:pointer;}
-.dir-rtl .file-picker .ygtvtph, .filemanager .ygtvtph {background: url('[[pix:moodle|y/tp_rtl]]') 0px 10px no-repeat;width:13px;height:22px;cursor:pointer;}
+.dir-rtl .file-picker .ygtvtph {background: url('[[pix:moodle|y/tp_rtl]]') 0px 10px no-repeat;width:13px;height:22px;cursor:pointer;}
 /* last sibling, no children */
 .file-picker .ygtvln, .filemanager .ygtvln {background: url('[[pix:moodle|y/ln]]') 0px 0px no-repeat;width:17px;height:22px;}
-.dir-rtl .file-picker .ygtvln, .filemanager .ygtvln {background: url('[[pix:moodle|y/ln_rtl]]') 0px 0px no-repeat;width:17px;height:22px;}
+.dir-rtl .file-picker .ygtvln {background: url('[[pix:moodle|y/ln_rtl]]') 0px 0px no-repeat;width:17px;height:22px;}
 /* Last sibling, collapsable */
 .file-picker .ygtvlm, .filemanager .ygtvlm {background: url('[[pix:moodle|y/lm]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
 /* Last sibling, collapsable, hover */
 .file-picker .ygtvlmh, .filemanager .ygtvlmh {background: url('[[pix:moodle|y/lm]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
 /* Last sibling, expandable */
 .file-picker .ygtvlp, .filemanager .ygtvlp {background: url('[[pix:moodle|y/lp]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
-.dir-rtl .file-picker .ygtvlp, .filemanager .ygtvlp {background: url('[[pix:moodle|y/lp_rtl]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
+.dir-rtl .file-picker .ygtvlp {background: url('[[pix:moodle|y/lp_rtl]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
 /* Last sibling, expandable, hover */
 .file-picker .ygtvlph, .filemanager .ygtvlph {background: url('[[pix:moodle|y/lp]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
-.dir-rtl .file-picker .ygtvlph, .filemanager .ygtvlph {background: url('[[pix:moodle|y/lp_rtl]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
+.dir-rtl .file-picker .ygtvlph {background: url('[[pix:moodle|y/lp_rtl]]') 0px 10px no-repeat;width:13px;height:12px;cursor:pointer;}
 /* Loading icon */
 .file-picker .ygtvloading, .filemanager .ygtvloading {background: transparent url('[[pix:moodle|y/loading]]') 0 0 no-repeat;width:16px;height:22px;}
 /* the style for the empty cells that are used for rendering the depth* of the node */
@@ -208,7 +209,8 @@ a.ygtvspacer:hover {color: transparent;text-decoration: none;}
  * File exists dialogue on Upload (File Picker only)
  */
 .file-picker.fp-dlg {text-align: center;}
-.file-picker.fp-dlg .fp-dlg-text {padding: 40px 20px 10px 20px;font-size: 12px;}
+.file-picker.fp-dlg .fp-dlg-text {padding: 30px 20px 10px;font-size: 12px;}
+.file-picker.fp-dlg .fp-dlg-buttons {margin: 0 20px;}
 
 /*
  * Error dialogue on Upload (File Picker only)
@@ -236,18 +238,17 @@ a.ygtvspacer:hover {color: transparent;text-decoration: none;}
  * Select Dialogue (File Picker and File Manager)
  */
 .file-picker.fp-select {width:420px;}
+.fp-select form {padding: 20px 20px 0;}
 .fp-select .fp-select-loading {text-align: center;margin-top: 20px;}
-.fp-select .fp-hr {clear: both;height: 1px; background-color: #FFFFFF;border-bottom: 1px solid #BBBBBB;width: auto; margin: 5px 20px;}
-.fp-select table {margin: 10px 20px;}
-.fp-select-update {float:right;margin-right: 20px;}
-.fp-select .fp-file-update {background:url('[[pix:theme|fp/check]]') no-repeat left center;width:17px;height:17px;}
-.fp-select .fp-file-cancel {background:url('[[pix:theme|fp/cross]]') no-repeat left center;width:17px;height:17px;margin-left: 25px;}
-.fp-select .fp-select-update span {margin-left: 17px;}
-.fp-select .fp-thumbnail {float:left;min-width:110px;min-height:110px;line-height: 110px;text-align: center;margin: 10px 20px 0px 20px;background: #FFFFFF;border: 1px solid #DDDDDD;-webkit-box-shadow: inset 0px 0px 10px 0px #CCCCCC;-moz-box-shadow: inset 0px 0px 10px 0px #CCCCCC;box-shadow: inset 0px 0px 10px 0px #CCCCCC;}
+.fp-select .fp-hr {clear: both;height: 1px; background-color: #FFFFFF;border-bottom: 1px solid #BBBBBB;width: auto; margin: 10px 0;}
+.fp-select table {padding: 0 0 10px;}
+.fp-select .fp-select-buttons {float: right;}
+.fp-select .fp-info {display: block;clear: both;padding: 1px 20px 0;}
+.fp-select .fp-thumbnail {float:left;min-width:110px;min-height:110px;line-height: 110px;text-align: center;margin: 10px 20px 0 0;background: #FFFFFF;border: 1px solid #DDDDDD;-webkit-box-shadow: inset 0 0 10px 0 #CCCCCC;-moz-box-shadow: inset 0 0 10px 0 #CCCCCC;box-shadow: inset 0 0 10px 0 #CCCCCC;}
 .fp-select .fp-thumbnail img {border: 1px solid #DDDDDD;padding:3px;vertical-align: middle;margin: 10px;}
-.fp-select .fp-fileinfo {display: inline-block;margin-top: 4px;margin-right: 20px;}
+.fp-select .fp-fileinfo {display: inline-block;margin-top: 10px;}
 .file-picker.fp-select .fp-fileinfo {max-width:240px;}
-.fp-select .fp-fileinfo div {padding: 4px 0px;}
+.fp-select .fp-fileinfo div {padding-bottom: 5px;}
 
 .file-picker.fp-select .uneditable {display:none;}
 .file-picker.fp-select .fp-select-loading {display:none;}
@@ -370,7 +371,7 @@ a.ygtvspacer:hover {color: transparent;text-decoration: none;}
  * Create folder dialogue (File Manager only)
  */
 .filemanager.fp-mkdir-dlg {text-align: center;}
-.filemanager.fp-mkdir-dlg .fp-mkdir-dlg-text {text-align: left;margin: 40px 20px 20px;}
+.filemanager.fp-mkdir-dlg .fp-mkdir-dlg-text {text-align: left;margin: 20px;}
 
 .dir-rtl .filemanager .fp-mkdir-dlg p {text-align: right;}
 
index d974e50..33cedb4 100644 (file)
 #qtypechoicecontainer {display: none;}
 body.jsenabled #qtypechoicecontainer {display: block;}
 
-#qtypechoicecontainer {background: white;}
-#qtypechoicecontainer #chooseqtype {width: 30em;}
-#qtypechoicecontainer #chooseqtypehead h3 {margin: 0;}
-#qtypechoicecontainer #chooseqtype .qtypes {position: relative;border-bottom: 1px solid grey;padding: 0.24em 0;}
-#qtypechoicecontainer #chooseqtype .qtypeoption {margin-bottom: 0; padding: 0.2em 0 0.2em 0.3em;}
-#qtypechoicecontainer #chooseqtype .qtypeoption img {vertical-align: middle;}
+#qtypechoicecontainer_c.yui-panel-container.shadow .underlay {background: none;}
+#qtypechoicecontainer.yui-panel .hd {color:#333333;letter-spacing: 1px;text-shadow: 1px 1px 1px #FFFFFF;border-radius: 10px 10px 0 0;border: 1px solid #CCCCCC;border-bottom: 1px solid #BBBBBB;background: -webkit-gradient(linear, left top, left bottom, from(#FFFFFF), to(#CCCCCC));background: -moz-linear-gradient(top,  #FFFFFF,  #CCCCCC);}
+
+#qtypechoicecontainer {font-size: 12px;color: #333333;background: #F2F2F2;border-radius: 10px;border:1px solid #CCCCCC;border-top:0 none;-webkit-box-shadow: 5px 5px 20px 0px #666666;-moz-box-shadow: 5px 5px 20px 0px #666666;box-shadow: 5px 5px 20px 0px #666666;}
+#qtypechoicecontainer #chooseqtype {width: 35em;}
+#qtypechoicecontainer #chooseqtypehead h3 {margin: 0;font-weight: normal;}
+#qtypechoicecontainer #chooseqtype .qtypes {position: relative;border-bottom: 1px solid #BBBBBB;padding: 0.24em 0;}
+#qtypechoicecontainer #chooseqtype .qtypeoption {margin-bottom: 0; padding: 0.3em 0 0.3em 1.6em;}
+#qtypechoicecontainer #chooseqtype .qtypeoption img {vertical-align: middle;padding-left: 1em;padding-right: 0.5em;}
+#qtypechoicecontainer #chooseqtype .selected {background-color: #FFFFFF;box-shadow: 0px 0px 10px 0px #CCCCCC;-webkit-box-shadow: 0px 0px 10px 0px #CCCCCC;-moz-box-shadow: 0px 0px 10px 0px #CCCCCC;}
 #qtypechoicecontainer #chooseqtype .instruction,
-#qtypechoicecontainer #chooseqtype .qtypesummary {display: none;position: absolute;top: 0px;right: 0px;bottom: 0px;left: 60%;margin: 0;border-left: 1px solid grey;padding: 0.3em 0.5em;background-color: white;}
+#qtypechoicecontainer #chooseqtype .qtypesummary {display: none;position: absolute;top: 0px;right: 0px;bottom: 0px;left: 60%;margin: 0;padding: 1.5em 1.6em;background-color: #FFFFFF;}
 #qtypechoicecontainer #chooseqtype .instruction,
 #qtypechoicecontainer #chooseqtype .selected .qtypesummary {display: block;}
 
index 2010021..0a2daad 100644 (file)
@@ -12,8 +12,6 @@
 #chooseqtype .qtypename {font-weight: bold;}
 
 #qtypechoicecontainer #chooseqtype .qtypename {font-weight: normal;}
-#qtypechoicecontainer #chooseqtype .qtypes {border-bottom-color: gray;}
-#qtypechoicecontainer #chooseqtype .selected {background: #dddddd;}
 #qtypechoicecontainer #chooseqtype .instruction,
 #qtypechoicecontainer #chooseqtype .qtypesummary {border-left-color: gray;}