# This patch file was generated by NetBeans IDE
# This patch can be applied using context Tools: Apply Diff Patch action on respective folder.
# It uses platform neutral UTF-8 encoding.
# Above lines and this line are ignored by the patching process.
Index: moodle/admin/settings/grades.php
--- moodle/admin/settings/grades.php Base (1.49)
+++ moodle/admin/settings/grades.php Locally Modified (Based On 1.49)
@@ -166,7 +166,7 @@
         $outcomes = new admin_externalpage('outcomes', get_string('outcomes', 'grades'), $CFG->wwwroot.'/grade/edit/outcome/index.php', 'moodle/grade:manage');
         $ADMIN->add('grades', $outcomes);
     }
-    $letters = new admin_externalpage('letters', get_string('letters', 'grades'), $CFG->wwwroot.'/grade/edit/letter/edit.php', 'moodle/grade:manageletters');
+    $letters = new admin_externalpage('letters', get_string('letters', 'grades'), $CFG->wwwroot.'/grade/edit/letter/index.php', 'moodle/grade:manageletters');
     $ADMIN->add('grades', $letters);
 
     // The plugins must implement a settings.php file that adds their admin settings to the $settings object
Index: moodle/grade/edit/letter/index.php
--- moodle/grade/edit/letter/index.php Base (1.16)
+++ moodle/grade/edit/letter/index.php Locally Modified (Based On 1.16)
@@ -27,31 +27,57 @@
 require_once $CFG->dirroot.'/grade/lib.php';
 require_once $CFG->libdir.'/gradelib.php';
 
-$courseid  = optional_param('id', SITEID, PARAM_INT);
+$contextid = optional_param('id', SYSCONTEXTID, PARAM_INT);
 $action   = optional_param('action', '', PARAM_ALPHA);
+$edit     = optional_param('edit', false, PARAM_BOOL); //are we editing?
 
-$PAGE->set_url('/grade/edit/letter/index.php', array('id' => $courseid));
+$PAGE->set_url('/grade/edit/letter/index.php', array('id' => $contextid));
 
-if (!$course = $DB->get_record('course', array('id' => $courseid))) {
-    print_error('nocourseid');
-}
+list($context, $course, $cm) = get_context_info_array($contextid);
+$contextid = null;//now we have a context object throw away the $contextid from the params
 
-require_login($course);
+//require_login($course, false, $cm);
 
-$context = get_context_instance(CONTEXT_COURSE, $course->id);
+//if viewing
+if (!$edit) {
 if (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:manageletters', $context)) {
     print_error('nopermissiontoviewletergrade');
 }
+} else {
+    require_capability('moodle/grade:manageletters', $context);
+}
 
-$gpr = new grade_plugin_return(array('type'=>'edit', 'plugin'=>'letter', 'courseid'=>$courseid));
+$returnurl = null;
+$editparam = null;
+if ($context->contextlevel == CONTEXT_SYSTEM or $context->contextlevel == CONTEXT_COURSECAT) {
+    require_once $CFG->libdir.'/adminlib.php';
+    require_login();
 
+    admin_externalpage_setup('letters');
+    
+    $admin = true;
+    $returnurl = "$CFG->wwwroot/grade/edit/letter/index.php";
+    $editparam = '?edit=1';
+} else if ($context->contextlevel == CONTEXT_COURSE) {
+    require_login($context->instanceid);
+
+    $admin = false;
+    $returnurl = $CFG->wwwroot.'/grade/edit/letter/index.php?id='.$context->id;
+    $editparam = '&edit=1';
+
+    $gpr = new grade_plugin_return(array('type'=>'edit', 'plugin'=>'letter', 'courseid'=>$course->id));
+} else {
+    print_error('invalidcourselevel');
+}
+
 $strgrades = get_string('grades');
 $pagename  = get_string('letters', 'grades');
 
-print_grade_page_head($courseid, 'letter', 'view', get_string('gradeletters', 'grades'));
-
 $letters = grade_get_letters($context);
+$num = count($letters) + 3;
 
+if (!$edit) {
+
 $data = array();
 
 $max = 100;
@@ -64,6 +90,12 @@
     $max = $boundary - 0.01;
 }
 
+    print_grade_page_head($COURSE->id, 'letter', 'view', get_string('gradeletters', 'grades'));
+
+    //get_string('editgradeletters', 'grades')
+    $editlink = html_writer::nonempty_tag('div', html_writer::link($returnurl.$editparam, get_string('edit')), array('class'=>'mdl-align'));
+    echo $editlink;
+
 $table = new html_table();
 $table->head  = array(get_string('max', 'grades'), get_string('min', 'grades'), get_string('letter', 'grades'));
 $table->size  = array('30%', '30%', '40%');
@@ -73,4 +105,85 @@
 $table->tablealign  = 'center';
 echo html_writer::table($table);
 
+    echo $editlink;
+} else { //else we're editing
+    require_once('edit_form.php');
+
+    $data = new object();
+    $data->id = $context->id;
+
+    $i = 1;
+    foreach ($letters as $boundary=>$letter) {
+        $gradelettername = 'gradeletter'.$i;
+        $gradeboundaryname = 'gradeboundary'.$i;
+
+        $data->$gradelettername   = $letter;
+        $data->$gradeboundaryname = $boundary;
+        $i++;
+    }
+    $data->override = $DB->record_exists('grade_letters', array('contextid' => $context->id));
+
+    $mform = new edit_letter_form($returnurl.$editparam, array('num'=>$num, 'admin'=>$admin));
+    $mform->set_data($data);
+
+    if ($mform->is_cancelled()) {
+        redirect($returnurl);
+
+    } else if ($data = $mform->get_data()) {
+        if (!$admin and empty($data->override)) {
+            $DB->delete_records('grade_letters', array('contextid' => $context->id));
+            redirect($returnurl);
+        }
+
+        $letters = array();
+        for($i=1; $i<$num+1; $i++) {
+            $gradelettername = 'gradeletter'.$i;
+            $gradeboundaryname = 'gradeboundary'.$i;
+
+            if (array_key_exists($gradeboundaryname, $data) and $data->$gradeboundaryname != -1) {
+                $letter = trim($data->$gradelettername);
+                if ($letter == '') {
+                    continue;
+                }
+                $letters[$data->$gradeboundaryname] = $letter;
+            }
+        }
+        krsort($letters, SORT_NUMERIC);
+
+        $old_ids = array();
+        if ($records = $DB->get_records('grade_letters', array('contextid' => $context->id), 'lowerboundary ASC', 'id')) {
+            $old_ids = array_keys($records);
+        }
+
+        foreach($letters as $boundary=>$letter) {
+            $record = new object();
+            $record->letter        = $letter;
+            $record->lowerboundary = $boundary;
+            $record->contextid     = $context->id;
+
+            if ($old_id = array_pop($old_ids)) {
+                $record->id = $old_id;
+                $DB->update_record('grade_letters', $record);
+            } else {
+                $DB->insert_record('grade_letters', $record);
+            }
+        }
+
+        foreach($old_ids as $old_id) {
+            $DB->delete_records('grade_letters', array('id' => $old_id));
+        }
+
+        redirect($returnurl);
+    }
+
+    print_grade_page_head($COURSE->id, 'letter', 'edit', get_string('editgradeletters', 'grades'));
+
+    //$viewlink = html_writer::link($returnurl, get_string('view'));
+    //echo $viewlink;
+
+    $mform->display();
+
+    //echo $viewlink;
+}
+
 echo $OUTPUT->footer();
Index: moodle/grade/lib.php
--- moodle/grade/lib.php Base (1.202)
+++ moodle/grade/lib.php Locally Modified (Based On 1.202)
@@ -2343,8 +2343,8 @@
         $canmanageletters = has_capability('moodle/grade:manageletters', $context);
         if ($canmanage || $canmanageletters) {
             self::$letterinfo = array(
-                'view' => new grade_plugin_info('view', new moodle_url('/grade/edit/letter/index.php', array('id'=>$courseid)), get_string('view')),
-                'edit' => new grade_plugin_info('edit', new moodle_url('/grade/edit/letter/edit.php', array('id'=>$courseid)), get_string('edit'))
\ No newline at end of file
+                'view' => new grade_plugin_info('view', new moodle_url('/grade/edit/letter/index.php', array('id'=>$context->id)), get_string('view')),
+                'edit' => new grade_plugin_info('edit', new moodle_url('/grade/edit/letter/index.php', array('edit'=>1,'id'=>$context->id)), get_string('edit'))
\ No newline at end of file
             );
         } else {
             self::$letterinfo = false;
