### Eclipse Workspace Patch 1.0
#P moodle
Index: mod/scorm/lib.php
===================================================================
RCS file: /cvsroot/moodle/moodle/mod/scorm/lib.php,v
retrieving revision 1.85
diff -u -r1.85 lib.php
--- mod/scorm/lib.php	27 May 2007 16:26:05 -0000	1.85
+++ mod/scorm/lib.php	11 Jun 2007 22:42:21 -0000
@@ -57,6 +57,8 @@
             set_field('scorm','launch',$scorm->launch,'id',$scorm->id);
         }
 
+        scorm_grade_item_update(stripslashes_recursive($scorm));
+
         return $id;
     } else {
         error(get_string('badpackage','scorm'));
@@ -121,7 +123,11 @@
         $scorm->reference = $oldscorm->reference; // This fix a problem with Firefox when the teacher choose Cancel on overwrite question
     }
     
-    return update_record('scorm', $scorm);
+    if ($result = update_record('scorm', $scorm)) {
+        scorm_grade_item_update(stripslashes_recursive($scorm));
+    }
+
+    return $result;
 }
 
 /**
@@ -187,7 +193,10 @@
     }
     if (! delete_records('scorm_sequencing_ruleconditions', 'scormid', $scorm->id)) {
         $result = false;
-    }*/       
+    }*/     
+
+    scorm_grade_item_delete(stripslashes_recursive($scorm));
+  
     return $result;
 }
 
@@ -203,9 +212,7 @@
 * @return mixed
 */
 function scorm_user_outline($course, $user, $mod, $scorm) { 
-
-    $return = NULL;
-
+    global $CFG;
     require_once('locallib.php');
 
     $return = scorm_grade_user($scorm, $user->id, true);
@@ -404,35 +411,124 @@
 }
 
 /**
-* Given a scorm id return all the grades of that activity
-*
-* @param int $scormid Scorm instance id
-* @return mixed
-*/
-function scorm_grades($scormid) {
-
+ * Return grade for given user or all users.
+ *
+ * @param int $scormid id of scorm
+ * @param int $userid optional user id, 0 means all users
+ * @return array array of grades, false if none
+ */
+function scorm_get_user_grades($scorm, $userid=0) {
     global $CFG;
+    require_once('locallib.php');
+
+    $grades = array();
+    if (empty($userid)) {
+        if ($scousers=get_records_select('scorm_scoes_track', "scormid='$scorm->id' GROUP BY userid", "", "userid,null")) {
+            foreach ($scousers as $scouser) {
+                $grades[$scouser->userid] = new object();
+                $grades[$scouser->userid]->id         = $scouser->userid;
+                $grades[$scouser->userid]->userid     = $scouser->userid;
+                $grades[$scouser->userid]->gradevalue = scorm_grade_user($scorm, $scouser->userid);
+            }
+        } else {
+            return false;
+        }
 
-    if (!$scorm = get_record('scorm', 'id', $scormid)) {
-        return NULL;
+    } else {
+        if (!get_records_select('scorm_scoes_track', "scormid='$scorm->id' AND userid='$userid' GROUP BY userid", "", "userid,null")) {
+            return false; //no attempt yet
+        }
+        $grades[$userid] = new object();
+        $grades[$userid]->id         = $userid;
+        $grades[$userid]->userid     = $userid;
+        $grades[$userid]->gradevalue = scorm_grade_user($scorm, $userid);
     }
 
-    if (($scorm->grademethod % 10) == 0) { // GRADESCOES
-        if (!$return->maxgrade = count_records_select('scorm_scoes',"scorm='$scormid' AND launch<>''")) {
-            return NULL;
+    return $grades;
+}
+
+/**
+ * Update grades in central gradebook
+ *
+ * @param object $scorm null means all scormbases
+ * @param int $userid specific user only, 0 mean all
+ */
+function scorm_update_grades($scorm=null, $userid=0, $nullifnone=true) {
+    global $CFG;
+    if (!function_exists('grade_update')) { //workaround for buggy PHP versions
+        require_once($CFG->libdir.'/gradelib.php');
+    }
+
+    if ($scorm != null) {
+        if ($grades = scorm_get_user_grades($scorm, $userid)) {
+            grade_update('mod/scorm', $scorm->course, 'mod', 'scorm', $scorm->id, 0, $grades);
+
+        } else if ($userid and $nullifnone) {
+            $grade = new object();
+            $grade->itemid     = $scorm->id;
+            $grade->userid     = $userid;
+            $grade->gradevalue = NULL;
+            grade_update('mod/scorm', $scorm->course, 'mod', 'scorm', $scorm->id, 0, $grade);
         }
+
     } else {
-        $return->maxgrade = $scorm->maxgrade;
+        $sql = "SELECT s.*, cm.idnumber as cmidnumber
+                  FROM {$CFG->prefix}scorm s, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
+                 WHERE m.name='scorm' AND m.id=cm.module AND cm.instance=s.id";
+        if ($rs = get_recordset_sql($sql)) {
+            if ($rs->RecordCount() > 0) {
+                while ($scorm = rs_fetch_next_record($rs)) {
+                    scorm_grade_item_update($scorm);
+                    scorm_update_grades($scorm, 0, false);
+                }
+            }
+            rs_close($rs);
+        }
     }
+}
 
-    $return->grades = NULL;
-    if ($scousers=get_records_select('scorm_scoes_track', "scormid='$scormid' GROUP BY userid", "", "userid,null")) {
-        require_once('locallib.php');
-        foreach ($scousers as $scouser) {
-            $return->grades[$scouser->userid] = scorm_grade_user($scorm, $scouser->userid);
+/**
+ * Update/create grade item for given scorm
+ *
+ * @param object $scorm object with extra cmidnumber
+ * @return object grade_item
+ */
+function scorm_grade_item_update($scorm) {
+    global $CFG;
+    if (!function_exists('grade_update')) { //workaround for buggy PHP versions
+        require_once($CFG->libdir.'/gradelib.php');
+    }
+
+    $params = array('itemname'=>$scorm->name, 'idnumber'=>$scorm->cmidnumber);
+
+    if (($scorm->grademethod % 10) == 0) { // GRADESCOES
+        if ($maxgrade = count_records_select('scorm_scoes',"scorm='$scorm->id' AND launch<>''")) {
+            $params['gradetype'] = GRADE_TYPE_VALUE;
+            $params['grademax']  = $maxgrade;
+            $params['grademin']  = 0;
+        } else {
+            $params['gradetype'] = GRADE_TYPE_NONE;
         }
+    } else {
+        $params['gradetype'] = GRADE_TYPE_VALUE;
+        $params['grademax']  = $scorm->maxgrade;
+        $params['grademin']  = 0;
     }
-    return $return;
+
+    return grade_update('mod/scorm', $scorm->course, 'mod', 'scorm', $scorm->id, 0, NULL, $params);
+}
+
+/**
+ * Delete grade item for given scorm
+ *
+ * @param object $scorm object
+ * @return object grade_item
+ */
+function scorm_grade_item_delete($scorm) {
+    global $CFG;
+    require_once($CFG->libdir.'/gradelib.php');
+
+    return grade_update('mod/scorm', $scorm->course, 'mod', 'scorm', $scorm->id, 0, NULL, array('deleted'=>1));
 }
 
 function scorm_get_view_actions() {
Index: mod/scorm/version.php
===================================================================
RCS file: /cvsroot/moodle/moodle/mod/scorm/version.php,v
retrieving revision 1.50
diff -u -r1.50 version.php
--- mod/scorm/version.php	15 Mar 2007 08:04:20 -0000	1.50
+++ mod/scorm/version.php	11 Jun 2007 22:42:21 -0000
@@ -10,8 +10,8 @@
 //       catch up now, so until 27th October please only increment in very tiny steps 
 //       in HEAD, until we get past that date..
 
-$module->version  = 2007031300;   // The (date) version of this module
-$module->requires = 2007020200;   // The version of Moodle that is required
+$module->version  = 2007061100;   // The (date) version of this module
+$module->requires = 2007060502;   // The version of Moodle that is required
 $module->cron     = 300;            // How often should cron check this module (seconds)?
 
 ?>
Index: mod/scorm/aicc.php
===================================================================
RCS file: /cvsroot/moodle/moodle/mod/scorm/aicc.php,v
retrieving revision 1.20
diff -u -r1.20 aicc.php
--- mod/scorm/aicc.php	29 Nov 2006 22:30:54 -0000	1.20
+++ mod/scorm/aicc.php	11 Jun 2007 22:42:21 -0000
@@ -327,6 +327,7 @@
                                 $track->timemodified = time();
                                 $id = insert_record('scorm_scoes_track',$track);
                             }
+                            scorm_update_grades($scorm, $USER->id);
                         }
                         
                         $SESSION->scorm_status = 'Terminated';
Index: mod/scorm/db/upgrade.php
===================================================================
RCS file: /cvsroot/moodle/moodle/mod/scorm/db/upgrade.php,v
retrieving revision 1.10
diff -u -r1.10 upgrade.php
--- mod/scorm/db/upgrade.php	8 May 2007 15:44:46 -0000	1.10
+++ mod/scorm/db/upgrade.php	11 Jun 2007 22:42:21 -0000
@@ -262,6 +262,14 @@
         }
     }
 
+    if ($result && $oldversion < 2007061100) {
+        require_once($CFG->dirroot.'/mod/scorm/lib.php');
+        // too much debug output
+        $db->debug = false;
+        scorm_update_grades();
+        $db->debug = true;
+    }  
+
     return $result;
 }
 
