]> git.mjollnir.org Git - moodle.git/commitdiff
Cleaned code
authorbobopinna <bobopinna>
Thu, 10 Aug 2006 11:32:48 +0000 (11:32 +0000)
committerbobopinna <bobopinna>
Thu, 10 Aug 2006 11:32:48 +0000 (11:32 +0000)
mod/scorm/locallib.php

index 980ca004689cb2a0eef24a72b1089780465f23ec..d744cbc4cd055fd802a7320da015e8092ab14168 100755 (executable)
-
 <?php  // $Id$
+
 define("VALUESCOES",0);
 define("VALUEHIGHEST",1);
 define("VALUEAVERAGE",2);
 define("VALUESUM",3);
 
+// Functions added by Pham Minh Duc
+function scorm_get_score_from_parent($sco,$userid,$grademethod=VALUESCOES) {
+    $scores = NULL; 
+    $scores->scoes = 0;
+    $scores->values = 0;
+    $scores->scaled = 0;
+    $scores->max = 0;
+    $scores->sum = 0;
+
+    $scoes_total = 0;
+    $scoes_count = 0;
+    $attempt = scorm_get_last_attempt($sco->scorm, $userid);
+    $scoes = get_records('scorm_scoes', 'parent', $sco->identifier);
+    foreach ($scoes as $sco)
+    {
+        $scoes_total++;
+        if ($userdata=scorm_get_tracks($sco->id, $userid,$attempt)) {
+            if (($userdata->status == 'completed') || ($userdata->success_status == 'passed')) {
+                $scoes_count++;
+            }
+
+            $scoreraw = $userdata->score_raw; 
+
+            if (!empty($userdata->score_raw)) {
+                $scores->values++;
+                $scores->sum += $userdata->score_raw;
+                $scores->max = ($userdata->score_raw > $scores->max)?$userdata->score_raw:$scores->max;
+            }   
+            if (!empty($userdata->score_scaled)) {
+                $scores->scaled = $scores->scaled + $userdata->score_scaled;
+            }       
+        }       
+    }
+    if ($scoes_count > 0) {
+        $scores->scaled = ($scores->scaled)/($scoes_count);
+    }
+    switch ($grademethod) {
+        case VALUEHIGHEST:
+            return $scores->max;
+        break;  
+        case VALUEAVERAGE:
+            if ($scores->values > 0) {
+                return $scores->sum/$scores->values;
+            } else {
+                return 0;
+            }       
+        break;  
+        case VALUESUM:
+            return $scores->sum;
+        break;  
+        case VALUESCOES:
+            return $scores->scaled;
+        break;  
+    }
+}
+
+function scorm_get_user_sco_count($scormid, $userid) {
+    $scoes_count = 0;
+    $attempt = scorm_get_last_attempt($current->scorm, $userid);
+    $scoes = get_records('scorm_scoes', 'scorm', $scormid);
+
+    foreach ($scoes as $sco) {
+        if ($userdata=scorm_get_tracks($sco->id, $userid,$attempt)) {
+            if (($userdata->status == 'completed') || ($userdata->success_status == 'passed')) {
+                $scoes_count++;
+            }
+        }
+    }
+    return $scoes_count;
+}
+
+function scorm_grade_user_new($scoes, $userid, $grademethod=VALUESCOES) {
+    $scores = NULL; 
+    $scores->scoes = 0;
+    $scores->values = 0;
+    $scores->scaled = 0;
+    $scores->max = 0;
+    $scores->sum = 0;
+
+    if (!$scoes) {
+        return '';
+    }
+    $current = current($scoes);
+    $attempt = scorm_get_last_attempt($current->scorm, $userid);
+    foreach ($scoes as $sco) { 
+        if ($userdata=scorm_get_tracks($sco->id, $userid,$attempt)) {
+            if (($userdata->status == 'completed') || ($userdata->success_status == 'passed')) {
+                $scores->scoes++;
+            }  
+            $scaled = $userdata->score_scaled;
+            $scoreraw = $userdata->score_raw; 
+            if ($scaled ==0){
+                $scores->scaled = $scores->scaled / $scores->scoes;
+            }
+            if (!empty($userdata->score_raw)) {
+                $scores->values++;
+                $scores->sum += $userdata->score_raw;
+                $scores->max = ($userdata->score_raw > $scores->max)?$userdata->score_raw:$scores->max;
+            }  
+            if (!empty($scaled)) {
+                $scores->scaled = (($scores->scaled) * ($scores->scoes-1) + $scaled)/($scores->scoes);
+            }       
+        }       
+    }
+    switch ($grademethod) {
+        case VALUEHIGHEST:
+            return $scores->max;
+        break;  
+        case VALUEAVERAGE:
+            if ($scores->values > 0) {
+                return $scores->sum/$scores->values;
+            } else {
+                return 0;
+            }       
+        break;  
+        case VALUESUM:
+            return $scores->sum;
+        break;  
+        case VALUESCOES:
+            return $scores->scaled;
+        break;  
+    }
+}
+
+function scorm_insert_statistic($statisticInput){
+    $id = null;
+    if ($statistic = get_record_select('scorm_statistic',"userid='$statisticInput->userid' AND scormid='$statisticInput->scormid'")) {
+
+        $statistic->durationtime = $statisticInput->duration;
+        $statistic->accesstime = $statisticInput->accesstime;        
+        $statistic->status = $statisticInput->status;        
+        $statistic->attemptnumber = $statisticInput->attemptnumber;        
+        $id = update_record('scorm_statistic',$statistic);
+    } else {
+        $id = insert_record('scorm_statistic',$statisticInput);
+    }
+    return $id;
+}
+
+function scorm_insert_trackmodel($userid,$scormid,$scoid,$attempt) {
+    $id = null;
+    if ($suspendtrack = get_record_select('scorm_suspendtrack',"userid='$userid' AND scormid='$scormid'")) {
+        $suspendtrack->suspendscoid = $scoid;
+        $suspendtrack->attempt = $attempt;
+        $id = update_record('scorm_suspendtrack',$suspendtrack);
+    } else {
+        $suspendtrack->scormid = $scormid;
+        $suspendtrack->suspendscoid = $scoid;
+        $suspendtrack->userid = $userid;
+        $suspendtrack->attempt = $attempt;
+        $id = insert_record('scorm_suspendtrack',$suspendtrack);
+    }
+    return $id;
+}
+
+function scorm_get_suspendscoid($scormid,$userid) {
+    if ($sco = get_record("scorm_suspendtrack","scormid",$scormid,"userid",$userid)) {
+        $suspendscoid = $sco->suspendscoid;
+        return $suspendscoid;
+    } else {
+        return 0;
+    }
+}
+
+function scorm_set_attempt($scoid,$userid) {
+    if ($scormid = get_field('scorm_scoes','scorm','id',$scoid)) {
+        $attempt = scorm_get_last_attempt($scormid,$userid);
+    } else {
+        $attempt = 1;
+    }
+    $scormtype = get_field('scorm_scoes','scormtype','id',$scoid) ;
+    if ($scormtype == 'sco'){
+        $element = 'cmi.attempt_status';
+        $value = 'attempted';
+        scorm_insert_track($userid,$scormid,$scoid,$attempt,$element,$value);
+    }
+}
+
+function scorm_get_AbsoluteTimeLimit($scoid){
+    $sco = get_record("scorm_scoes","id",$scoid);
+    if (!empty($sco)){
+        return $sco->attemptAbsoluteDurationLimit;
+    }
+    return 0;
+}
+
+function scorm_update_status($scormid,$scoid)
+{
+    
+}
+
+function scorm_get_nextsco($scormid,$scoid)
+{
+
+}
+
+function scorm_get_presco($scormid,$scoid)
+{
+
+}
+
+function scorm_isChoice($scormid,$scoid)
+{
+    $sco = get_record("scorm_sequencing_controlmode","scormid",$scormid,"scoid",$scoid);
+    $scoparent = get_record("scorm_sequencing_controlmode","scormid",$scormid,"identifier",$sco->parent);
+
+    return $scoparent->choice;
+}
+
+function scorm_isChoiceexit($scormid,$scoid)
+{
+    $sco = get_record("scorm_sequencing_controlmode","scormid",$scormid,"scoid",$scoid);
+    $scoparent = get_record("scorm_sequencing_controlmode","scormid",$scormid,"identifier",$sco->parent);
+
+    return $scoparent->choiceexit;
+}
+// End add
+
 /// Local Library of functions and constants for module scorm
 
 /**
@@ -50,11 +268,6 @@ function scorm_datadir($strPath)
 */
 function scorm_validate($packagedir) {
 
-    ////$f = "D:\\test.txt";
-    ////@$ft = fopen($f,"a");
-    ////fwrite($ft,"\n Xu ly trong ham scorm_validate \n");    
-
-
     $validation = new stdClass();
     if (is_file($packagedir.'/imsmanifest.xml')) {
         $validation->result = 'found';
@@ -111,12 +324,6 @@ function scorm_string_wrap($stringa, $len=15) {
 }
 
 function scorm_eval_prerequisites($prerequisites,$usertracks) {
-
-    //$f = "D:\\test.txt";
-    //@$ft = fopen($f,"a");
-    ////fwrite($ft,"\n Xu ly trong ham scorm_eval_prerequisites \n");    
-
-
     $element = '';
     $stack = array();
     $statuses = array(
@@ -144,9 +351,6 @@ function scorm_eval_prerequisites($prerequisites,$usertracks) {
             case '(':
             case ')':
             case '*':
-            //case '{':
-            //case '}':
-            //case ',':
                 $element = trim($element);
                 
                 if (!empty($element)) {
@@ -273,34 +477,11 @@ function scorm_eval_prerequisites($prerequisites,$usertracks) {
     return eval('return '.implode($stack).';');
 }
 
-function scorm_insert_statistic($statisticInput){
-
-    $id = null;
-    if ($statistic = get_record_select('scorm_statistic',"userid='$statisticInput->userid' AND scormid='$statisticInput->scormid'")) {
-
-        $statistic->durationtime = $statisticInput->duration;
-        $statistic->accesstime = $statisticInput->accesstime;        
-        $statistic->status = $statisticInput->status;        
-        $statistic->attemptnumber = $statisticInput->attemptnumber;        
-        $id = update_record('scorm_statistic',$statistic);
-    } else {
-        ////fwrite($ft,"Insert trong ham scorm_insert_track \n");    
-        $id = insert_record('scorm_statistic',$statisticInput);
-    }
-    return $id;
-
-}
 function scorm_insert_track($userid,$scormid,$scoid,$attempt,$element,$value) {
-
-//    //$f = "D:\\test.txt";
-//    //@$ft = fopen($f,"a");
-    ////fwrite($ft,"\n Xu ly trong ham scorm_insert_track \n");    
-
     $id = null;
     if ($track = get_record_select('scorm_scoes_track',"userid='$userid' AND scormid='$scormid' AND scoid='$scoid' AND attempt='$attempt' AND element='$element'")) {
         $track->value = $value;
         $track->timemodified = time();
-        ////fwrite($ft,$userid."Update trong ham scorm_insert_track voi cac gia tri userid = ");    
         $id = update_record('scorm_scoes_track',$track);
     } else {
         $track->userid = $userid;
@@ -310,42 +491,11 @@ function scorm_insert_track($userid,$scormid,$scoid,$attempt,$element,$value) {
         $track->element = $element;
         $track->value = addslashes($value);
         $track->timemodified = time();
-        ////fwrite($ft,"Insert trong ham scorm_insert_track \n");    
         $id = insert_record('scorm_scoes_track',$track);
     }
     return $id;
 }
 
-function scorm_insert_trackmodel($userid,$scormid,$scoid,$attempt) {
-
-//    //$f = "D:\\test.txt";
-//    //@$ft = fopen($f,"a");
-
-    $id = null;
-    if ($suspendtrack = get_record_select('scorm_suspendtrack',"userid='$userid' AND scormid='$scormid'")) {
-        $suspendtrack->suspendscoid = $scoid;
-        $suspendtrack->attempt = $attempt;
-
-        $id = update_record('scorm_suspendtrack',$suspendtrack);
-    } else {
-        $suspendtrack->scormid = $scormid;
-        $suspendtrack->suspendscoid = $scoid;
-        $suspendtrack->userid = $userid;
-        $suspendtrack->attempt = $attempt;
-        $id = insert_record('scorm_suspendtrack',$suspendtrack);
-    }
-    return $id;
-}
-
-function scorm_get_suspendscoid($scormid,$userid) {
-    if ($sco = get_record("scorm_suspendtrack","scormid",$scormid,"userid",$userid)) {
-        $suspendscoid = $sco->suspendscoid;
-        return $suspendscoid;
-    } else {
-        return 0;
-    }
-}
-
 function scorm_add_time($a, $b) {
     $aes = explode(':',$a);
     $bes = explode(':',$b);
@@ -366,243 +516,78 @@ function scorm_add_time($a, $b) {
     $cents = $cents - ($change * 100);
     if (floor($cents) < 10) {
         $cents = '0'. $cents;
-    }
-
-    $secs = $aseconds[0] + $bseconds[0] + $change;  //Seconds
-    $change = floor($secs / 60);
-    $secs = $secs - ($change * 60);
-    if (floor($secs) < 10) {
-        $secs = '0'. $secs;
-    }
-
-    $mins = $aes[1] + $bes[1] + $change;   //Minutes
-    $change = floor($mins / 60);
-    $mins = $mins - ($change * 60);
-    if ($mins < 10) {
-        $mins = '0' .  $mins;
-    }
-
-    $hours = $aes[0] + $bes[0] + $change;  //Hours
-    if ($hours < 10) {
-        $hours = '0' . $hours;
-    }
-
-    if ($cents != '0') {
-        return $hours . ":" . $mins . ":" . $secs . '.' . $cents;
-    } else {
-        return $hours . ":" . $mins . ":" . $secs;
-    }
-}
-
-function scorm_external_link($link) {
-// check if a link is external
-    $result = false;
-    $link = strtolower($link);
-    if (substr($link,0,7) == 'http://') {
-        $result = true;
-    } else if (substr($link,0,8) == 'https://') {
-        $result = true;
-    } else if (substr($link,0,4) == 'www.') {
-        $result = true;
-    }
-    return $result;
-}
-
-function scorm_grade_user($scoes, $userid, $grademethod=VALUESCOES) {
-
-    //$f = "D:\\test.txt";
-    //@$ft = fopen($f,"a");
-    //fwrite($ft,"\n Xu ly trong ham scorm_grade_user \n");    
-
-    $scores = NULL; 
-    $scores->scoes = 0;
-    $scores->values = 0;
-    $scores->max = 0;
-    $scores->sum = 0;
-
-    if (!$scoes) {
-        return '';
-    }
-
-    $current = current($scoes);
-    $attempt = scorm_get_last_attempt($current->scorm, $userid);
-    foreach ($scoes as $sco) { 
-        if ($userdata=scorm_get_tracks($sco->id, $userid,$attempt)) {
-            if (($userdata->status == 'completed') || ($userdata->status == 'passed')) {
-                $scores->scoes++;
-            }       
-            if (!empty($userdata->score_raw)) {
-                $scores->values++;
-                $scores->sum += $userdata->score_raw;
-                $scores->max = ($userdata->score_raw > $scores->max)?$userdata->score_raw:$scores->max;
-            }       
-        }       
-    }
-    switch ($grademethod) {
-        case VALUEHIGHEST:
-            return $scores->max;
-        break;  
-        case VALUEAVERAGE:
-            if ($scores->values > 0) {
-                return $scores->sum/$scores->values;
-            } else {
-                return 0;
-            }       
-        break;  
-        case VALUESUM:
-            return $scores->sum;
-        break;  
-        case VALUESCOES:
-            return $scores->scoes;
-        break;  
-    }
-}
-
-//Lay diem theo Sco cha.. Thuc chat la theo bai kiem tra
-function scorm_get_score_from_parent($sco,$userid,$grademethod=VALUESCOES)
-{
-    
-    $scores = NULL; 
-    $scores->scoes = 0;
-    $scores->values = 0;
-    $scores->scaled = 0;
-    $scores->max = 0;
-    $scores->sum = 0;
-
-    $scoes_total = 0;
-    $scoes_count = 0;
-    $attempt = scorm_get_last_attempt($sco->scorm, $userid);
-    $scoes = get_records('scorm_scoes', 'parent', $sco->identifier);
-    foreach ($scoes as $sco)
-    {
-           $scoes_total++;
-           if ($userdata=scorm_get_tracks($sco->id, $userid,$attempt)) {
-               if (($userdata->status == 'completed') || ($userdata->success_status == 'passed')) {
-                    $scoes_count++;
-               }
-
-
-            $scoreraw = $userdata->score_raw; 
-
-            if (!empty($userdata->score_raw)) {
-                $scores->values++;
-                $scores->sum += $userdata->score_raw;
-                $scores->max = ($userdata->score_raw > $scores->max)?$userdata->score_raw:$scores->max;
-            }   
-            if (!empty($userdata->score_scaled)) {
-                $scores->scaled = $scores->scaled + $userdata->score_scaled;
-            }       
-            
-        }       
-    }
-    if ($scoes_count > 0)
-    {
-        $scores->scaled = ($scores->scaled)/($scoes_count);
-    }
-    switch ($grademethod) {
-        case VALUEHIGHEST:
-            return $scores->max;
-        break;  
-        case VALUEAVERAGE:
-            if ($scores->values > 0) {
-                return $scores->sum/$scores->values;
-            } else {
-                return 0;
-            }       
-        break;  
-        case VALUESUM:
-            return $scores->sum;
-        break;  
-        case VALUESCOES:
-            return $scores->scaled;
-        break;  
-    }
-
-}
-
-// Lay ra so luong cac scoes duoc user thuc hien xong
-function scorm_get_user_sco_count($scormid, $userid)
-{
-    $scoes_count = 0;
-    $attempt = scorm_get_last_attempt($current->scorm, $userid);
-    $scoes = get_records('scorm_scoes', 'scorm', $scormid);
-
+    }
 
+    $secs = $aseconds[0] + $bseconds[0] + $change;  //Seconds
+    $change = floor($secs / 60);
+    $secs = $secs - ($change * 60);
+    if (floor($secs) < 10) {
+        $secs = '0'. $secs;
+    }
 
-    foreach ($scoes as $sco)
-    {
-           if ($userdata=scorm_get_tracks($sco->id, $userid,$attempt)) {
+    $mins = $aes[1] + $bes[1] + $change;   //Minutes
+    $change = floor($mins / 60);
+    $mins = $mins - ($change * 60);
+    if ($mins < 10) {
+        $mins = '0' .  $mins;
+    }
 
-               if (($userdata->status == 'completed') || ($userdata->success_status == 'passed')) {
-                    $scoes_count++;
-               }
-           }
+    $hours = $aes[0] + $bes[0] + $change;  //Hours
+    if ($hours < 10) {
+        $hours = '0' . $hours;
+    }
 
+    if ($cents != '0') {
+        return $hours . ":" . $mins . ":" . $secs . '.' . $cents;
+    } else {
+        return $hours . ":" . $mins . ":" . $secs;
     }
-    return $scoes_count;
-    
 }
 
-function scorm_grade_user_new($scoes, $userid, $grademethod=VALUESCOES) {
-
-    //$f = "D:\\test.txt";
-    //@$ft = fopen($f,"a");
-    //fwrite($ft,"\n Xu ly trong ham scorm_grade_user \n");    
+function scorm_external_link($link) {
+// check if a link is external
+    $result = false;
+    $link = strtolower($link);
+    if (substr($link,0,7) == 'http://') {
+        $result = true;
+    } else if (substr($link,0,8) == 'https://') {
+        $result = true;
+    } else if (substr($link,0,4) == 'www.') {
+        $result = true;
+    }
+    return $result;
+}
 
+function scorm_grade_user($scoes, $userid, $grademethod=VALUESCOES) {
     $scores = NULL; 
     $scores->scoes = 0;
     $scores->values = 0;
-    $scores->scaled = 0;
     $scores->max = 0;
     $scores->sum = 0;
 
     if (!$scoes) {
-        //fwrite($ft,"\n Khong xuat hien mot SCO duoc tinh diem \n");    
         return '';
     }
 
     $current = current($scoes);
     $attempt = scorm_get_last_attempt($current->scorm, $userid);
-    //fwrite($ft,"\n ---------------------------------------\n");    
     foreach ($scoes as $sco) { 
         if ($userdata=scorm_get_tracks($sco->id, $userid,$attempt)) {
-            if (($userdata->status == 'completed') || ($userdata->success_status == 'passed')) {
+            if (($userdata->status == 'completed') || ($userdata->status == 'passed')) {
                 $scores->scoes++;
-                //fwrite($ft,"\n Them mot khoa hoan thanh co id la ".$sco->id." co gia tri scaled la ".$userdata->score_scaled." \n");    
-        
-            }  
-            $scaled = $userdata->score_scaled;
-            $scoreraw = $userdata->score_raw; 
-            if ($scaled ==0){
-                $scores->scaled = $scores->scaled / $scores->scoes;
-                //fwrite($ft,"\n Ti le chinh xac ".($scores->scaled*100)." phan tram");    
-
-            }
-
+            }       
             if (!empty($userdata->score_raw)) {
                 $scores->values++;
                 $scores->sum += $userdata->score_raw;
                 $scores->max = ($userdata->score_raw > $scores->max)?$userdata->score_raw:$scores->max;
-            }  
-                        
-            if (!empty($scaled)) {
-                //fwrite($ft,"\n go ---->>> \n");    
-                $scores->scaled = (($scores->scaled) * ($scores->scoes-1) + $scaled)/($scores->scoes);
-                //fwrite($ft,"\n Ti le chinh xac ".($scores->scaled*100)." phan tram");    
-
             }       
-            
         }       
     }
-    //fwrite($ft,"\n ----+++++++++++------\n");    
-    //fwrite($ft,"\n Kieu gia tri tra ve la  ".$grademethod);    
     switch ($grademethod) {
         case VALUEHIGHEST:
-            //fwrite($ft,"\n Gia tri tra ve thouoc loai cao nhat");    
             return $scores->max;
         break;  
         case VALUEAVERAGE:
-            //fwrite($ft,"\n Gia tri tra ve thouoc loai trung binh");    
             if ($scores->values > 0) {
                 return $scores->sum/$scores->values;
             } else {
@@ -610,12 +595,10 @@ function scorm_grade_user_new($scoes, $userid, $grademethod=VALUESCOES) {
             }       
         break;  
         case VALUESUM:
-            //fwrite($ft,"\n Gia tri tra ve thouoc loai tong cong");    
             return $scores->sum;
         break;  
         case VALUESCOES:
-            //fwrite($ft,"\n Gia tri tra ve thouoc loai scoes co gia tri".$scores->scaled);    
-            return $scores->scaled;
+            return $scores->scoes;
         break;  
     }
 }
@@ -626,14 +609,10 @@ function scorm_count_launchable($scormid,$organization) {
 
 function scorm_get_toc($user,$scorm,$liststyle,$currentorg='',$scoid='',$mode='normal',$attempt='',$play=false) {
     global $CFG;
-
-    //$f = "D:\\test.txt";
-    //@$ft = fopen($f,"a");
-    //fwrite($ft,"\n Xu ly trong ham scorm_get_toc \n");    
-
-    //
+    
+    // Added by Pham Minh Duc
     $suspendscoid = scorm_get_suspendscoid($scorm->id,$user->id);
-    //
+    // End add
 
     $strexpand = get_string('expcoll','scorm');
     $modestr = '';
@@ -666,22 +645,15 @@ function scorm_get_toc($user,$scorm,$liststyle,$currentorg='',$scoid='',$mode='n
         $attempt = scorm_get_last_attempt($scorm->id, $user->id);
     }
     $result->attemptleft = $scorm->maxattempt - $attempt;
-
-    //fwrite($ft,"\n So lan attempt con lai la \n".$result->attemptleft);    
     
     if ($scoes = get_records_select('scorm_scoes',"scorm='$scorm->id' $organizationsql order by id ASC")){
-        //
-        // Lay du lieu da duoc tracking cho moi doi tuong hoc tap
-        // 
         $usertracks = array();
         foreach ($scoes as $sco) {
-            //Kiem tra xem $sco co phai la phan muc khong. Neu la trang Asset hoac SCO thi xu ly tiep
             if (!empty($sco->launch)) {
                 if ($usertrack=scorm_get_tracks($sco->id,$user->id,$attempt)) {
                     if ($usertrack->status == '') {
                         $usertrack->status = 'notattempted';
                     }
-                    // Ghi lai thong tin $usertracks theo tung doi tuong sco
                     $usertracks[$sco->identifier] = $usertrack;
                 }
             }
@@ -744,18 +716,15 @@ function scorm_get_toc($user,$scorm,$liststyle,$currentorg='',$scoid='',$mode='n
                 if (empty($scoid) && ($mode != 'normal')) {
                     $scoid = $sco->id;
                 }
-                //Neu la sco suspend thi hien thi anh khac
                 if ($suspendscoid == $sco->id){
                     $result->toc .= '<img src="'.$scormpixdir.'/suspend.gif" alt="Dang tam dung o day" title="Dang dung o day" />';                
                 } else {
-                //-----------------------
                     if (isset($usertracks[$sco->identifier])) {
                         $usertrack = $usertracks[$sco->identifier];
                         $strstatus = get_string($usertrack->status,'scorm');
                         $result->toc .= '<img src="'.$scormpixdir.'/'.$usertrack->status.'.gif" alt="'.$strstatus.'" title="'.$strstatus.'" />';
                         
                         if (($usertrack->status == 'notattempted') || ($usertrack->status == 'incomplete') || ($usertrack->status == 'browsed')) {
-                            //Neu khoa hoc chua duoc attempted hoac chua hoan thanh hoac la chi browsed
                             $incomplete = true;
                             if ($play && empty($scoid)) {
                                 $scoid = $sco->id;
@@ -793,17 +762,16 @@ function scorm_get_toc($user,$scorm,$liststyle,$currentorg='',$scoid='',$mode='n
                     if ($sco->id == $scoid) {
                         $result->prerequisites = true;
                     }
-                    if (scorm_isChoice($scorm->id,$sco->id) == 1)
-                    {
-                    $url = $CFG->wwwroot.'/mod/scorm/player.php?a='.$scorm->id.'&amp;currentorg='.$currentorg.$modestr.'&amp;scoid='.$sco->id;
-                    $result->toc .= '&nbsp;'.$startbold.'<a href="'.$url.'">'.format_string($sco->title).'</a>'.$score.$endbold."</li>\n";
-                    $tocmenus[$sco->id] = scorm_repeater('&minus;',$level) . '&gt;' . format_string($sco->title);
-                    }
-                    else
-                    {
-                    $result->toc .= '&nbsp;'.$startbold.format_string($sco->title).$score.$endbold."</li>\n";
-                    $tocmenus[$sco->id] = scorm_repeater('&minus;',$level) . '&gt;' . format_string($sco->title);                    
+                // Modified by Pham Minh Duc
+                    if (scorm_isChoice($scorm->id,$sco->id) == 1) {
+                        $url = $CFG->wwwroot.'/mod/scorm/player.php?a='.$scorm->id.'&amp;currentorg='.$currentorg.$modestr.'&amp;scoid='.$sco->id;
+                        $result->toc .= '&nbsp;'.$startbold.'<a href="'.$url.'">'.format_string($sco->title).'</a>'.$score.$endbold."</li>\n";
+                        $tocmenus[$sco->id] = scorm_repeater('&minus;',$level) . '&gt;' . format_string($sco->title);
+                    } else {
+                        $result->toc .= '&nbsp;'.$startbold.format_string($sco->title).$score.$endbold."</li>\n";
+                        $tocmenus[$sco->id] = scorm_repeater('&minus;',$level) . '&gt;' . format_string($sco->title);                    
                     }
+                // End modify
                 } else {
                     if ($sco->id == $scoid) {
                         $result->prerequisites = false;
@@ -865,11 +833,6 @@ function scorm_get_toc($user,$scorm,$liststyle,$currentorg='',$scoid='',$mode='n
 }
 
 function scorm_get_last_attempt($scormid, $userid) {
-
-    //$f = "D:\\test.txt";
-    //@$ft = fopen($f,"a");
-    ////fwrite($ft,"\n Xu ly trong ham scorm_get_last_attempt \n");    
-
 /// Find the last attempt number for the given user id and scorm id
     if ($lastattempt = get_record('scorm_scoes_track', 'userid', $userid, 'scormid', $scormid, '', '', 'max(attempt) as a')) {
         if (empty($lastattempt->a)) {
@@ -880,30 +843,7 @@ function scorm_get_last_attempt($scormid, $userid) {
     }
 }
 
-// Khi mot nguoi truy nhap vao mot SCO thi se thiet lap
-// nguoi do da no luc thuc hien no
-function scorm_set_attempt($scoid,$userid)
-{
-    //Lay gia tri last attempt
-    if ($scormid = get_field('scorm_scoes','scorm','id',$scoid)) {
-        $attempt = scorm_get_last_attempt($scormid,$userid);
-    } else {
-        $attempt = 1;
-    }
-    //Chi set attempt cho cac SCO
-    $scormtype = get_field('scorm_scoes','scormtype','id',$scoid) ;
-    if ($scormtype == 'sco'){
-        $element = 'cmi.attempt_status';
-        $value = 'attempted';
-        scorm_insert_track($userid,$scormid,$scoid,$attempt,$element,$value);
-    }
-}
 function scorm_get_tracks($scoid,$userid,$attempt='') {
-
-    //$f = "D:\\test.txt";
-    //@$ft = fopen($f,"a");
-    ////fwrite($ft,"\n Xu ly trong ham scorm_get_tracks \n");    
-
 /// Gets all tracks of specified sco and user
     global $CFG;
 
@@ -919,30 +859,25 @@ function scorm_get_tracks($scoid,$userid,$attempt='') {
         $usertrack->userid = $userid;
         $usertrack->scoid = $scoid; 
         $usertrack->score_raw = '';
-        $usertrack->score_scaled = '';
         $usertrack->status = '';
-        $usertrack->success_status = '';
-        $usertrack->attempt_status = '';
-        $usertrack->satisfied_status = '';
         $usertrack->total_time = '00:00:00';
         $usertrack->session_time = '00:00:00';
         $usertrack->timemodified = 0;
+        // Added by Pham Minh Duc
+        $usertrack->score_scaled = '';
+        $usertrack->success_status = '';
+        $usertrack->attempt_status = '';
+        $usertrack->satisfied_status = '';
+        // End Add
         foreach ($tracks as $track) {
             $element = $track->element;
             $usertrack->{$element} = $track->value;
             switch ($element) {
-                case 'cmi.core.lesson_status':
+                // Added by Pham Minh Duc
                 case 'cmi.attempt_status':
                     $usertrack->status = $track->value;
                     $usertrack->attempt_status = $track->value;                    
                 break;                
-                case 'cmi.completion_status':
-                    if ($track->value == 'not attempted') {
-                        $track->value = 'notattempted';
-                        $usertrack->attempt_status = $track->value;
-                    }       
-                    $usertrack->status = $track->value;
-                break;  
                 case 'cmi.success_status':
                     $usertrack->success_status = $track->value;
                     if ($track->value=='passed'){
@@ -952,13 +887,21 @@ function scorm_get_tracks($scoid,$userid,$attempt='') {
                         $usertrack->satisfied_status = 'notSatisfied';                    
                     }                    
                 break;
+                case 'cmi.score.scaled':
+                    $usertrack->score_scaled = $track->value;
+                break;  
+                // End Add
+                case 'cmi.core.lesson_status':
+                case 'cmi.completion_status':
+                    if ($track->value == 'not attempted') {
+                        $track->value = 'notattempted';
+                    }       
+                    $usertrack->status = $track->value;
+                break;  
                 case 'cmi.core.score.raw':
                 case 'cmi.score.raw':
                     $usertrack->score_raw = $track->value;
                 break;  
-                case 'cmi.score.scaled':
-                    $usertrack->score_scaled = $track->value;
-                break;  
                 case 'cmi.core.session_time':
                 case 'cmi.session_time':
                     $usertrack->session_time = $track->value;
@@ -978,24 +921,12 @@ function scorm_get_tracks($scoid,$userid,$attempt='') {
     }
 }
 
-
-function scorm_get_AbsoluteTimeLimit($scoid){
-    $sco = get_record("scorm_scoes","id",$scoid);
-    if (!empty($sco)){
-        return $sco->attemptAbsoluteDurationLimit;
-    }
-    return 0;
-}
 //-----------------------------------------------------
 /// Library of functions and constants for parsing packages
 
 function scorm_parse($scorm) {
     global $CFG;
 
-    //$f = "D:\\test.txt";
-    //@$ft = fopen($f,"a");
-    ////fwrite($ft,"\n Xu ly doc thong tin trong ham scorm_parse \n");
-
     // Parse scorm manifest
     if ($scorm->pkgtype == 'AICC') {
         $scorm->launch = scorm_parse_aicc($scorm->dir.'/'.$scorm->id,$scorm->id);
@@ -1054,20 +985,20 @@ function scorm_forge_cols_regexp($columns,$remodule='(".*")?,') {
 }
 
 function scorm_parse_aicc($pkgdir,$scormid){
-    
-    //$f = "D:\\test.txt";
-    //@$ft = fopen($f,"a");
-    ////fwrite($ft,"\n Xu ly doc thong tin trong ham scorm_parse_aicc \n");    
-    
     $version = 'AICC';
     $ids = array();
     $courses = array();
+    $extaiccfiles = array('crs','des','au','cst','ort','pre','cmp');
     if ($handle = opendir($pkgdir)) {
         while (($file = readdir($handle)) !== false) {
-            $ext = substr($file,strrpos($file,'.'));
-            $extension = strtolower(substr($ext,1));
-            $id = strtolower(basename($file,$ext));
-            $ids[$id]->$extension = $file;
+            if ($file[0] != '.') {
+                $ext = substr($file,strrpos($file,'.'));
+                $extension = strtolower(substr($ext,1));
+                if (in_array($extension,$extaiccfiles)) {
+                    $id = strtolower(basename($file,$ext));
+                    $ids[$id]->$extension = $file;
+                }
+            }
         }
         closedir($handle);
     }
@@ -1216,11 +1147,6 @@ function scorm_parse_aicc($pkgdir,$scormid){
 }
 
 function scorm_get_resources($blocks) {
-
-    //$f = "D:\\test.txt";
-    //@$ft = fopen($f,"a");
-    ////fwrite($ft,"\n Xu ly trong ham scorm_get_resources \n");    
-
     foreach ($blocks as $block) {
         if ($block['name'] == 'RESOURCES') {
             foreach ($block['children'] as $resource) {
@@ -1234,12 +1160,6 @@ function scorm_get_resources($blocks) {
 }
 
 function scorm_get_manifest($blocks,$scoes) {
-
-    //$f = "D:\\test.txt";
-    //@$ft = fopen($f,"a");
-    ////fwrite($ft,"\n Xu ly doc thong tin trong ham scorm_get_manifest.  \n");    
-    ////////fwrite($ft,$blocks." la  gia tri block la  \n");    
-
     static $parents = array();
     static $resources;
 
@@ -1265,7 +1185,7 @@ function scorm_get_manifest($blocks,$scoes) {
                     }
                 break;
                 case 'MANIFEST':
-                    $manifest = addslashes($block['attrs']['IDENTIFIER']); //Lay thuoc tinh IDENTFIER cua MANIFEST
+                    $manifest = addslashes($block['attrs']['IDENTIFIER']);
                     $organization = '';
                     $resources = array();
                     $resources = scorm_get_resources($block['children']);
@@ -1340,7 +1260,6 @@ function scorm_get_manifest($blocks,$scoes) {
                         $scoes->elements[$manifest][$organization][$identifier]->scormtype = addslashes($resources[$idref]['ADLCP:SCORMTYPE']);
                     }
                     
-                    //////fwrite($ft,"---Dang lam viec voi ITEM co Identifier = ".$identifier);
                     $parent = new stdClass();
                     $parent->identifier = $identifier;
                     $parent->organization = $organization;
@@ -1353,246 +1272,260 @@ function scorm_get_manifest($blocks,$scoes) {
                 case 'TITLE':
                     $parent = array_pop($parents);
                     array_push($parents, $parent);
+                    if (!isset($block['tagData'])) {
+                        $block['tagData'] = '';
+                    }
                     $scoes->elements[$manifest][$parent->organization][$parent->identifier]->title = addslashes($block['tagData']);
                 break;
                 case 'ADLCP:PREREQUISITES':
                     if ($block['attrs']['TYPE'] == 'aicc_script') {
                         $parent = array_pop($parents);
                         array_push($parents, $parent);
+                        if (!isset($block['tagData'])) {
+                            $block['tagData'] = '';
+                        }
                         $scoes->elements[$manifest][$parent->organization][$parent->identifier]->prerequisites = addslashes($block['tagData']);
                     }
                 break;
                 case 'ADLCP:MAXTIMEALLOWED':
                     $parent = array_pop($parents);
                     array_push($parents, $parent);
+                    if (!isset($block['tagData'])) {
+                        $block['tagData'] = '';
+                    }
                     $scoes->elements[$manifest][$parent->organization][$parent->identifier]->maxtimeallowed = addslashes($block['tagData']);
                 break;
                 case 'ADLCP:TIMELIMITACTION':
                     $parent = array_pop($parents);
                     array_push($parents, $parent);
+                    if (!isset($block['tagData'])) {
+                        $block['tagData'] = '';
+                    }
                     $scoes->elements[$manifest][$parent->organization][$parent->identifier]->timelimitaction = addslashes($block['tagData']);
                 break;
                 case 'ADLCP:DATAFROMLMS':
                     $parent = array_pop($parents);
                     array_push($parents, $parent);
+                    if (!isset($block['tagData'])) {
+                        $block['tagData'] = '';
+                    }
                     $scoes->elements[$manifest][$parent->organization][$parent->identifier]->datafromlms = addslashes($block['tagData']);
                 break;
                 case 'ADLCP:MASTERYSCORE':
                     $parent = array_pop($parents);
                     array_push($parents, $parent);
+                    if (!isset($block['tagData'])) {
+                        $block['tagData'] = '';
+                    }
                     $scoes->elements[$manifest][$parent->organization][$parent->identifier]->masteryscore = addslashes($block['tagData']);
                 break;
+                // Added by Pham Minh Duc
                 case 'ADLNAV:PRESENTATION':
                     $parent = array_pop($parents);
                     array_push($parents, $parent);
                     foreach ($block['children'] as $adlnav) {
-                        if ($adlnav['name'] == 'ADLNAV:NAVIGATIONINTERFACE') {                                    //////fwrite($ft,$scoes->elements[$manifest][$parent->organization][$parent->identifier]->title."  Xuat hien dieu khien NAV \n");
-                            foreach ($adlnav['children'] as $adlnavInterface){
-                                if ($adlnavInterface['name'] == 'ADLNAV:HIDELMSUI'){
-                                //////fwrite($ft,$scoes->elements[$manifest][$parent->organization][$parent->identifier]->title."  Xuat hien dieu khien NAV HIDELMSUI\n");
-                                //////fwrite($ft," Gia tri thuoc tinh an la ".$adlnavInterface['tagData']);
-                                    if ($adlnavInterface['tagData'] == 'continue')    {
-                                    $scoes->elements[$manifest][$parent->organization][$parent->identifier]->next = 1; 
-//                                    //////fwrite($ft," Thiet lap thuoc tinh an OK ");
+                        if ($adlnav['name'] == 'ADLNAV:NAVIGATIONINTERFACE') {
+                            foreach ($adlnav['children'] as $adlnavInterface) {
+                                if ($adlnavInterface['name'] == 'ADLNAV:HIDELMSUI') {
+                                    if ($adlnavInterface['tagData'] == 'continue') {
+                                        $scoes->elements[$manifest][$parent->organization][$parent->identifier]->next = 1; 
                                     }
-                                    if ($adlnavInterface['tagData'] == 'previous')    {
-                                    $scoes->elements[$manifest][$parent->organization][$parent->identifier]->previous = 1; 
-//                                    //////fwrite($ft," Thiet lap thuoc tinh an OK ");
+                                    if ($adlnavInterface['tagData'] == 'previous') {
+                                        $scoes->elements[$manifest][$parent->organization][$parent->identifier]->previous = 1; 
                                     }
                                 }
 
                             }
-
                         }
                     }
                 break;
-
                 case 'IMSSS:SEQUENCING':
                     $parent = array_pop($parents);
                     array_push($parents, $parent);
                     foreach ($block['children'] as $sequencing) {
-                        //////fwrite($ft,"\n Xuat hien IMSSS:SEQUENCING cua ".$parent->identifier);
-                        if ($sequencing['name']=='IMSSS:CONTROLMODE'){
-                            //Xu ly cac Control Mode voi mot Item trong SCO
-                            if ($sequencing['attrs']['CHOICE'] == 'false'){
-                            $scoes->elements[$manifest][$parent->organization][$parent->identifier]->choice = 0;
-                            //////fwrite($ft,"\n Xuat hien lua chon choice  \n");
+                        if ($sequencing['name']=='IMSSS:CONTROLMODE') {
+                            if ($sequencing['attrs']['CHOICE'] == 'false') {
+                                $scoes->elements[$manifest][$parent->organization][$parent->identifier]->choice = 0;
                             }
-                            if ($sequencing['attrs']['CHOICEEXIT'] == 'false'){
-                            $scoes->elements[$manifest][$parent->organization][$parent->identifier]->choiceexit = 0;
+                            if ($sequencing['attrs']['CHOICEEXIT'] == 'false') {
+                                $scoes->elements[$manifest][$parent->organization][$parent->identifier]->choiceexit = 0;
                             }
-                            if ($sequencing['attrs']['FLOW'] == 'true'){
-                            $scoes->elements[$manifest][$parent->organization][$parent->identifier]->flow = 1;
+                            if ($sequencing['attrs']['FLOW'] == 'true') {
+                                $scoes->elements[$manifest][$parent->organization][$parent->identifier]->flow = 1;
                             }
-                            if ($sequencing['attrs']['FORWARDONLY'] == 'true'){
-                            $scoes->elements[$manifest][$parent->organization][$parent->identifier]->forwardonly = 1;
+                            if ($sequencing['attrs']['FORWARDONLY'] == 'true') {
+                                $scoes->elements[$manifest][$parent->organization][$parent->identifier]->forwardonly = 1;
                             }
-                            if ($sequencing['attrs']['USECURRENTATTEMPTOBJECTINFO'] == 'true'){
-                            $scoes->elements[$manifest][$parent->organization][$parent->identifier]->usecurrentattemptobjectinfo = 1;
+                            if ($sequencing['attrs']['USECURRENTATTEMPTOBJECTINFO'] == 'true') {
+                                $scoes->elements[$manifest][$parent->organization][$parent->identifier]->usecurrentattemptobjectinfo = 1;
                             }
-                            if ($sequencing['attrs']['USECURRENTATTEMPTPROGRESSINFO'] == 'true'){
-                            $scoes->elements[$manifest][$parent->organization][$parent->identifier]->usecurrentattemptprogressinfo = 1;
+                            if ($sequencing['attrs']['USECURRENTATTEMPTPROGRESSINFO'] == 'true') {
+                                $scoes->elements[$manifest][$parent->organization][$parent->identifier]->usecurrentattemptprogressinfo = 1;
                             }
                         }
-                        if ($sequencing['name']=='ADLSEQ:CONSTRAINEDCHOICECONSIDERATIONS'){
-                            //Xu ly cac dieu kien rang buoc thu tu 
-                            if ($sequencing['attrs']['CONSTRAINCHOICE'] == 'true'){
-                            $scoes->elements[$manifest][$parent->organization][$parent->identifier]->constrainChoice = 1;
+                        if ($sequencing['name']=='ADLSEQ:CONSTRAINEDCHOICECONSIDERATIONS') {
+                            if ($sequencing['attrs']['CONSTRAINCHOICE'] == 'true') {
+                                $scoes->elements[$manifest][$parent->organization][$parent->identifier]->constrainChoice = 1;
                             }
-                            if ($sequencing['attrs']['PREVENTACTIVATION'] == 'true'){
-                            $scoes->elements[$manifest][$parent->organization][$parent->identifier]->preventactivation = 1;
+                            if ($sequencing['attrs']['PREVENTACTIVATION'] == 'true') {
+                                $scoes->elements[$manifest][$parent->organization][$parent->identifier]->preventactivation = 1;
                             }
 
                         }
-                        if ($sequencing['name']=='IMSSS:OBJECTIVES'){
-                            //Xu ly cac cac gia tri muc tieu
-                            foreach ($sequencing['children'] as $objective){
-                                if($objective['name']=='IMSSS:PRIMARYOBJECTIVE'){
-                                    //Xac dinh primary objective de lay thong so
-                                    foreach ($objective['children'] as $primaryobjective){
-                                        if($primaryobjective['name']=='IMSSS:MINNORMALIZEDMEASURE'){    $scoes->elements[$manifest][$parent->organization][$parent->identifier]->minnormalizedmeasure = $primaryobjective['tagData'];
+                        if ($sequencing['name']=='IMSSS:OBJECTIVES') {
+                            foreach ($sequencing['children'] as $objective) {
+                                if ($objective['name']=='IMSSS:PRIMARYOBJECTIVE') {
+                                    foreach ($objective['children'] as $primaryobjective) {
+                                        if ($primaryobjective['name']=='IMSSS:MINNORMALIZEDMEASURE') {
+                                            $scoes->elements[$manifest][$parent->organization][$parent->identifier]->minnormalizedmeasure = $primaryobjective['tagData'];
                                         }
                                     }
                                 }
                             }
                         }
-                        if ($sequencing['name']=='IMSSS:LIMITCONDITIONS'){
-                            //Xu ly cac cac gia tri cac dieu kien gioi han
-                            if (!empty($sequencing['attrs']['ATTEMPTLIMIT'])){
-                                    $scoes->elements[$manifest][$parent->organization][$parent->identifier]->attemptLimit = $sequencing['attrs']['ATTEMPTLIMIT'];                                
+                        if ($sequencing['name']=='IMSSS:LIMITCONDITIONS') {
+                            if (!empty($sequencing['attrs']['ATTEMPTLIMIT'])) {
+                                $scoes->elements[$manifest][$parent->organization][$parent->identifier]->attemptLimit = $sequencing['attrs']['ATTEMPTLIMIT'];                                
                             }
-                            if (!empty($sequencing['attrs']['ATTEMPTABSOLUTEDURATIONLIMIT'])){
-                                    $scoes->elements[$manifest][$parent->organization][$parent->identifier]->attemptAbsoluteDurationLimit = $sequencing['attrs']['ATTEMPTABSOLUTEDURATIONLIMIT'];                                
+                            if (!empty($sequencing['attrs']['ATTEMPTABSOLUTEDURATIONLIMIT'])) {
+                                $scoes->elements[$manifest][$parent->organization][$parent->identifier]->attemptAbsoluteDurationLimit = $sequencing['attrs']['ATTEMPTABSOLUTEDURATIONLIMIT'];                                
                             }                            
                         }                        
-                        if ($sequencing['name']=='IMSSS:ROLLUPRULES'){
+                        if ($sequencing['name']=='IMSSS:ROLLUPRULES') {
                             $rolluprules = array();
-                            //Phan danh cho RollupRule
-                            if (!empty($sequencing['attrs']['ROLLUPOBJECTIVESATISFIED'])){
-                                if ($sequencing['attrs']['ROLLUPOBJECTIVESATISFIED']== 'false'){
-                                    $scoes->elements[$manifest][$parent->organization][$parent->identifier]->rollupobjectivesatisfied = 0;                                
+                            if (!empty($sequencing['attrs']['ROLLUPOBJECTIVESATISFIED'])) {
+                                if ($sequencing['attrs']['ROLLUPOBJECTIVESATISFIED']== 'false') {
+                                    $scoes->elements[$manifest][$parent->organization][$parent->identifier]->rollupobjectivesatisfied = 0;
                                 }
                             }
-                            if (!empty($sequencing['attrs']['ROLLUPPROGRESSCOMPLETION'])){
-                                if ($sequencing['attrs']['ROLLUPPROGRESSCOMPLETION']== 'false'){
-                                    $scoes->elements[$manifest][$parent->organization][$parent->identifier]->rollupprogresscompletion = 0;                                
+                            if (!empty($sequencing['attrs']['ROLLUPPROGRESSCOMPLETION'])) {
+                                if ($sequencing['attrs']['ROLLUPPROGRESSCOMPLETION']== 'false') {
+                                    $scoes->elements[$manifest][$parent->organization][$parent->identifier]->rollupprogresscompletion = 0; 
                                 }
                             }
-                            if (!empty($sequencing['attrs']['OBJECTIVEMEASUREWEIGHT'])){
+                            if (!empty($sequencing['attrs']['OBJECTIVEMEASUREWEIGHT'])) {
                                 $scoes->elements[$manifest][$parent->organization][$parent->identifier]->objectivemeasureweight = $sequencing['attrs']['OBJECTIVEMEASUREWEIGHT'];                    
                             }
 
                             if (!empty($sequencing['children'])){
-                                foreach ($sequencing['children'] as $sequencingrolluprule){
-                                    if ($sequencingrolluprule['name']=='IMSSS:ROLLUPRULE' ){
+                                foreach ($sequencing['children'] as $sequencingrolluprule) {
+                                    if ($sequencingrolluprule['name']=='IMSSS:ROLLUPRULE' ) {
                                         $rolluprule = new stdClass();
-                                        if ($sequencingrolluprule['attrs']['CHILDACTIVITYSET'] !=' '){
+                                        if ($sequencingrolluprule['attrs']['CHILDACTIVITYSET'] !=' ') {
                                             $rolluprule->childactivityset = $sequencingrolluprule['attrs']['CHILDACTIVITYSET'];
-                                            ////fwrite($ft,"\n Thiet lap them 1 childActivitySet la ".$rolluprule->childactivityset);
-
-                                            //Phan xu ly danh sach condition
-                                            if (!empty($sequencingrolluprule['children'])){
-                                                foreach ($sequencingrolluprule['children'] as $rolluproleconditions)
-                                                {
-                                                    if ($rolluproleconditions['name']=='IMSSS:ROLLUPCONDITIONS'){
+                                            if (!empty($sequencingrolluprule['children'])) {
+                                                foreach ($sequencingrolluprule['children'] as $rolluproleconditions) {
+                                                    if ($rolluproleconditions['name']=='IMSSS:ROLLUPCONDITIONS') {
                                                         $conditions = array();
-                                                        if (!empty($rolluproleconditions['attrs']['conditionCombination'])){
-                                                        $rolluprule->conditionCombination = $rolluproleconditions['attrs']['conditionCombination'];
+                                                        if (!empty($rolluproleconditions['attrs']['conditionCombination'])) {
+                                                            $rolluprule->conditionCombination = $rolluproleconditions['attrs']['conditionCombination'];
                                                         }
-                                                        foreach ($rolluproleconditions['children'] as $rolluprulecondition){
-                                                            if ($rolluprulecondition['name']=='IMSSS:ROLLUPCONDITION'){
+                                                        foreach ($rolluproleconditions['children'] as $rolluprulecondition) {
+                                                            if ($rolluprulecondition['name']=='IMSSS:ROLLUPCONDITION') {
                                                                 $condition = new stdClass();
-                                                                if (!empty($rolluprulecondition['attrs']['OPERATOR'])){
+                                                                if (!empty($rolluprulecondition['attrs']['OPERATOR'])) {
                                                                     $condition->operator = $rolluprulecondition['attrs']['OPERATOR'];
                                                                 }
-                                                                if (!empty($rolluprulecondition['attrs']['CONDITION'])){
+                                                                if (!empty($rolluprulecondition['attrs']['CONDITION'])) {
                                                                     $condition->condition = $rolluprulecondition['attrs']['CONDITION'];
                                                                 }
-                                                            array_push($conditions,$condition);    
-                                                            ////fwrite($ft,"Da them mot rolluprulecondition");
+                                                                array_push($conditions,$condition);    
                                                             }
-
                                                         }
-                                                    $rolluprule->conditions = $conditions;
+                                                        $rolluprule->conditions = $conditions;
                                                     }
-                                                    if ($rolluproleconditions['name']=='IMSSS:ROLLUPACTION'){
-                                                    $rolluprule->rollupruleaction = $rolluproleconditions['attrs']['ACTION'];
+                                                    if ($rolluproleconditions['name']=='IMSSS:ROLLUPACTION') {
+                                                        $rolluprule->rollupruleaction = $rolluproleconditions['attrs']['ACTION'];
                                                     }
                                                 }
                                             }
-                                            //Ket thuc xu ly danh sach condition
-
                                         }
-                                        ////fwrite($ft,"\n Dua them 1 rule vao \n");
                                         array_push($rolluprules, $rolluprule);
-                                        ////fwrite($ft,"\n Dua them 1 rule vao mang \n");
                                     }
-
                                 }
                             }
                             $scoes->elements[$manifest][$parent->organization][$parent->identifier]->rolluprules = $rolluprules;
-
-//                            ////fwrite($ft,"\n >>>>NOW TEST ");
-//                            foreach ($scoes->elements[$manifest][$parent->organization][$parent->identifier]->rolluprules as $rolluptest){
-//                            ////fwrite($ft,"\n >>>> Gia tri Test thu duoc la:".$rolluptest->childactivityset);
-    
                         }
-
-
                         
-                        if ($sequencing['name']=='IMSSS:SEQUENCINGRULES'){
-                            //Xu ly cac dieu kien Rules cua Sequencing
-                            //////fwrite($ft,"\n Xuat hien SEQUENCINGRULES >>>>>>>>>>");                            
+                        if ($sequencing['name']=='IMSSS:SEQUENCINGRULES') {
                             $sequencingrules = array();
-                            foreach ($sequencing['children'] as $conditionrules){
-                                if($conditionrules['name']=='IMSSS:EXITCONDITIONRULE'){
-                                        $sequencingrule = new stdClass();
-                                        //Phan xu ly danh sach condition
-                                        //////fwrite($ft,"\n Xuat hien exitrule >>>>>>>>>>");
-                                        if (!empty($conditionrules['children'])){
-                                            foreach ($conditionrules['children'] as $conditionrule)
-                                            {
-                                                if ($conditionrule['name']=='IMSSS:RULECONDITIONS'){
-                                                    $ruleconditions = array();
-                                                    if (!empty($conditionrule['attrs']['conditionCombination'])){
+                            foreach ($sequencing['children'] as $conditionrules) {
+                                if ($conditionrules['name']=='IMSSS:EXITCONDITIONRULE') {
+                                    $sequencingrule = new stdClass();
+                                    if (!empty($conditionrules['children'])) {
+                                        foreach ($conditionrules['children'] as $conditionrule) {
+                                            if ($conditionrule['name']=='IMSSS:RULECONDITIONS') {
+                                                $ruleconditions = array();
+                                                if (!empty($conditionrule['attrs']['conditionCombination'])) {
                                                     $sequencingrule->conditionCombination = $conditionrule['attrs']['conditionCombination'];
-                                                    }
-                                                    foreach ($conditionrule['children'] as $rulecondition){
-                                                        if ($rulecondition['name']=='IMSSS:RULECONDITION'){
-                                                            $condition = new stdClass();
-                                                            if (!empty($rulecondition['attrs']['OPERATOR'])){
-                                                                $condition->operator = $rulecondition['attrs']['OPERATOR'];
-                                                            }
-                                                            if (!empty($rulecondition['attrs']['CONDITION'])){
-                                                                $condition->condition = $rulecondition['attrs']['CONDITION'];
-                                                            }
-                                                            if (!empty($rulecondition['attrs']['MEASURETHRESHOLD'])){
-                                                                $condition->measurethreshold = $rulecondition['attrs']['MEASURETHRESHOLD'];
-                                                            }
-                                                            if (!empty($rulecondition['attrs']['REFERENCEDOBJECTIVE'])){
-                                                                $condition->referencedobjective = $rulecondition['attrs']['REFERENCEDOBJECTIVE'];
-                                                            }                                                                                                                        
-                                                        array_push($ruleconditions,$condition);    
-                                                        ////fwrite($ft,"\n Da them mot rulecondition trong exitrule");
+                                                }
+                                                foreach ($conditionrule['children'] as $rulecondition) {
+                                                    if ($rulecondition['name']=='IMSSS:RULECONDITION') {
+                                                        $condition = new stdClass();
+                                                        if (!empty($rulecondition['attrs']['OPERATOR'])) {
+                                                            $condition->operator = $rulecondition['attrs']['OPERATOR'];
                                                         }
-
+                                                        if (!empty($rulecondition['attrs']['CONDITION'])) {
+                                                            $condition->condition = $rulecondition['attrs']['CONDITION'];
+                                                        }
+                                                        if (!empty($rulecondition['attrs']['MEASURETHRESHOLD'])) {
+                                                            $condition->measurethreshold = $rulecondition['attrs']['MEASURETHRESHOLD'];
+                                                        }
+                                                        if (!empty($rulecondition['attrs']['REFERENCEDOBJECTIVE'])) {
+                                                            $condition->referencedobjective = $rulecondition['attrs']['REFERENCEDOBJECTIVE'];
+                                                        } 
+                                                        array_push($ruleconditions,$condition);
                                                     }
-                                                $sequencingrule->ruleconditions = $ruleconditions;
                                                 }
-                                                if ($conditionrule['name']=='IMSSS:RULEACTION'){
+                                                $sequencingrule->ruleconditions = $ruleconditions;
+                                            }
+                                            if ($conditionrule['name']=='IMSSS:RULEACTION') {
                                                 $sequencingrule->exitconditionruleaction = $conditionrule['attrs']['ACTION'];
+                                            }
+                                        }
+                                    }
+                                    array_push($sequencingrules,$sequencingrule);                                        
+                                }
+                                if ($conditionrules['name']=='IMSSS:PRECONDITIONRULE') {
+                                    $sequencingrule = new stdClass();
+                                    if (!empty($conditionrules['children'])) {
+                                        foreach ($conditionrules['children'] as $conditionrule) {
+                                            if ($conditionrule['name']=='IMSSS:RULECONDITIONS') {
+                                                $ruleconditions = array();
+                                                if (!empty($conditionrule['attrs']['conditionCombination'])) {
+                                                    $sequencingrule->conditionCombination = $conditionrule['attrs']['conditionCombination'];
+                                                }
+                                                foreach ($conditionrule['children'] as $rulecondition) {
+                                                    if ($rulecondition['name']=='IMSSS:RULECONDITION') {
+                                                        $condition = new stdClass();
+                                                        if (!empty($rulecondition['attrs']['OPERATOR'])) {
+                                                            $condition->operator = $rulecondition['attrs']['OPERATOR'];
+                                                        }
+                                                        if (!empty($rulecondition['attrs']['CONDITION'])) {
+                                                            $condition->condition = $rulecondition['attrs']['CONDITION'];
+                                                        }
+                                                        if (!empty($rulecondition['attrs']['MEASURETHRESHOLD'])) {
+                                                            $condition->measurethreshold = $rulecondition['attrs']['MEASURETHRESHOLD'];
+                                                        }
+                                                        if (!empty($rulecondition['attrs']['REFERENCEDOBJECTIVE'])) {
+                                                            $condition->referencedobjective = $rulecondition['attrs']['REFERENCEDOBJECTIVE'];
+                                                        } 
+                                                        array_push($ruleconditions,$condition);    
+                                                    }
                                                 }
+                                                $sequencingrule->ruleconditions = $ruleconditions;
+                                            }
+                                            if ($conditionrule['name']=='IMSSS:RULEACTION') {
+                                                $sequencingrule->preconditionruleaction = $conditionrule['attrs']['ACTION'];
                                             }
                                         }
-                                        //Ket thuc xu ly danh sach condition
-                                array_push($sequencingrules,$sequencingrule);                                        
+                                    }
+                                    array_push($sequencingrules,$sequencingrule);                                
                                 }
-                                if ($conditionrules['name']=='IMSSS:PRECONDITIONRULE'){
+                                if ($conditionrules['name']=='IMSSS:POSTCONDITIONRULE') {
                                     $sequencingrule = new stdClass();
-                                    //Phan xu ly danh sach condition
-                                    if (!empty($conditionrules['children'])){
-                                        foreach ($conditionrules['children'] as $conditionrule)
-                                        {
+                                    if (!empty($conditionrules['children'])) {
+                                        foreach ($conditionrules['children'] as $conditionrule) {
                                             if ($conditionrule['name']=='IMSSS:RULECONDITIONS'){
                                                 $ruleconditions = array();
                                                 if (!empty($conditionrule['attrs']['conditionCombination'])){
@@ -1612,83 +1545,33 @@ function scorm_get_manifest($blocks,$scoes) {
                                                         }
                                                         if (!empty($rulecondition['attrs']['REFERENCEDOBJECTIVE'])){
                                                             $condition->referencedobjective = $rulecondition['attrs']['REFERENCEDOBJECTIVE'];
-                                                        }                                                                                                                        
-                                                    array_push($ruleconditions,$condition);    
-                                                    ////fwrite($ft,"\n Da them mot rulecondition trong prerule");
+                                                        } 
+                                                        array_push($ruleconditions,$condition);    
                                                     }
-
                                                 }
-                                            $sequencingrule->ruleconditions = $ruleconditions;
+                                                $sequencingrule->ruleconditions = $ruleconditions;
                                             }
                                             if ($conditionrule['name']=='IMSSS:RULEACTION'){
-                                            $sequencingrule->preconditionruleaction = $conditionrule['attrs']['ACTION'];
-                                            }
-                                        }
-                                    }
-                                    //Ket thuc xu ly danh sach condition
-                                array_push($sequencingrules,$sequencingrule);                                
-                                }
-                                if($conditionrules['name']=='IMSSS:POSTCONDITIONRULE'){
-                                        $sequencingrule = new stdClass();
-                                        //Phan xu ly danh sach condition
-                                        if (!empty($conditionrules['children'])){
-                                            foreach ($conditionrules['children'] as $conditionrule)
-                                            {
-                                                if ($conditionrule['name']=='IMSSS:RULECONDITIONS'){
-                                                    $ruleconditions = array();
-                                                    if (!empty($conditionrule['attrs']['conditionCombination'])){
-                                                    $sequencingrule->conditionCombination = $conditionrule['attrs']['conditionCombination'];
-                                                    }
-                                                    foreach ($conditionrule['children'] as $rulecondition){
-                                                        if ($rulecondition['name']=='IMSSS:RULECONDITION'){
-                                                            $condition = new stdClass();
-                                                            if (!empty($rulecondition['attrs']['OPERATOR'])){
-                                                                $condition->operator = $rulecondition['attrs']['OPERATOR'];
-                                                            }
-                                                            if (!empty($rulecondition['attrs']['CONDITION'])){
-                                                                $condition->condition = $rulecondition['attrs']['CONDITION'];
-                                                            }
-                                                            if (!empty($rulecondition['attrs']['MEASURETHRESHOLD'])){
-                                                                $condition->measurethreshold = $rulecondition['attrs']['MEASURETHRESHOLD'];
-                                                            }
-                                                            if (!empty($rulecondition['attrs']['REFERENCEDOBJECTIVE'])){
-                                                                $condition->referencedobjective = $rulecondition['attrs']['REFERENCEDOBJECTIVE'];
-                                                            }                                                                                                                        
-                                                        array_push($ruleconditions,$condition);    
-                                                        ////fwrite($ft,"\n Da them mot rulecondition trong postrule");
-                                                        }
-
-                                                    }
-                                                $sequencingrule->ruleconditions = $ruleconditions;
-                                                }
-                                                if ($conditionrule['name']=='IMSSS:RULEACTION'){
                                                 $sequencingrule->postconditionruleaction = $conditionrule['attrs']['ACTION'];
-                                                }
                                             }
                                         }
-                                        //Ket thuc xu ly danh sach condition
-                                array_push($sequencingrules,$sequencingrule);                                
+                                    }
+                                    array_push($sequencingrules,$sequencingrule);                                
                                 }
-                                $scoes->elements[$manifest][$parent->organization][$parent->identifier]->sequencingrules = $sequencingrules;                                
+                                $scoes->elements[$manifest][$parent->organization][$parent->identifier]->sequencingrules = $sequencingrules;
                             }
                         }
                     }
-
                 break;
-
+                // End Add
             }
         }
     }
-
     return $scoes;
 }
 
 function scorm_parse_scorm($pkgdir,$scormid) {
     global $CFG;
-
-    //$f = "D:\\test.txt";
-    //@$ft = fopen($f,"a");
-    //////fwrite($ft,"\n Xu ly doc thong tin trong ham scorm_parse_scorm \n");
     
     $launch = 0;
     $manifestfile = $pkgdir.'/imsmanifest.xml';
@@ -1710,66 +1593,45 @@ function scorm_parse_scorm($pkgdir,$scormid) {
                         $item->scorm = $scormid;
                         $item->manifest = $manifest;
                         $item->organization = $organization;
-                        //////fwrite($ft,"\n ---- Item chuan bi dua vao la ".$item->identifier);
                         $id = insert_record('scorm_scoes',$item);
-                        //////fwrite($ft,"\n Lay duoc ScoID la ".$id);
+                        // Added by Pham Minh Duc
                         $item->scormid = $scormid;
                         $item->scoid = $id;
                         $idControlMode = insert_record('scorm_sequencing_controlmode',$item);
 
-                        if (!empty($item->sequencingrules)){
-                            ////fwrite($ft,"\n ++++++++Them SequencingRules cho SCO: ".$item->scoid) ;
-                            foreach($item->sequencingrules as $sequencingrule){
-                                ////fwrite($ft,"\n ----Chuan bi them 1 sequencingrule vao CSDL: ");
+                        if (!empty($item->sequencingrules)) {
+                            foreach($item->sequencingrules as $sequencingrule) {
                                 $sequencingrule->scormid = $scormid;
                                 $sequencingrule->scoid = $item->scoid;
-                                ////fwrite($ft,"\n ----Thong tin Scormid: ".$sequencingrule->scormid);                                                                                            
-                                ////fwrite($ft,"\n ----Thong tin Scoid: ".$sequencingrule->scoid);                                                                                                                            
                                 $idruleconditions = insert_record('scorm_sequencing_ruleconditions',$sequencingrule);
-                                foreach($sequencingrule->ruleconditions as $rulecondition){
+                                foreach($sequencingrule->ruleconditions as $rulecondition) {
                                     $rulecondition->scormid = $sequencingrule->scormid;
                                     $rulecondition->scoid = $sequencingrule->scoid;
                                     $rulecondition->ruleconditionsid = $idruleconditions;
                                     $idrulecondition = insert_record('scorm_sequencing_rulecondition',$rulecondition);
-                                    ////fwrite($ft,"\n ----Da them 1 sequencingrulecondition vao CSDL: ");                                    
                                 }
-                            
                             }                        
                         }
                         
-                        if (!empty($item->rolluprules)){
-                            ////fwrite($ft,"\n ++++++++Them RollupRules cho SCO: ".$item->scoid) ;
+                        if (!empty($item->rolluprules)) {
                             $idControlMode = insert_record('scorm_sequencing_rolluprules',$item);
-                            ////fwrite($ft,"\n ----Gia tri idRollupRules \n");
-                            foreach($item->rolluprules as $rollup)
-                            {
-                                ////fwrite($ft,"\n ----Chuan bi them 1 rule vao CSDL ");
+                            foreach($item->rolluprules as $rollup) {
                                 $rollup->rolluprulesid =$idControlMode;
                                 $rollup->scormid = $scormid;
                                 $rollup->scoid =  $item->scoid;
 
-                                ////fwrite($ft,"\n ----Cac thong tin cua Rule: \n ");
-                                ////fwrite($ft,"\n ----rolluprulesid:  ".$rollup->rolluprulesid);
-                                ////fwrite($ft,"\n ----scormid:  ".$rollup->scormid );
-                                ////fwrite($ft,"\n ----scoid:  ".$rollup->scoid);
-                                ////fwrite($ft,"\n ----activichild:  ".$rollup->childactivityset);
-                                ////fwrite($ft,"\n ----rollupaction:  ".$rollup->rollupruleaction);
                                 $idRollupRule = insert_record('scorm_sequencing_rolluprule',$rollup);
-                                ////fwrite($ft,"\n ----Dua them 1 rule vao CSDL -- Chuan bi them condition vao rule".$idRollupRule);
                                 $rollup->rollupruleid = $idRollupRule;
                                 $idconditions = insert_record('scorm_sequencing_rollupruleconditions',$rollup);
-                                ////fwrite($ft,"\n --Dua cac condition con vao CSDL");
                                 foreach($rollup->conditions as $condition){
                                     $condition->ruleconditionsid = $idconditions;
                                     $condition->scormid = $rollup->scormid;
                                     $condition->scoid = $rollup->scoid;
                                     $idcondition = insert_record('scorm_sequencing_rolluprulecondition',$condition);
-                                    ////fwrite($ft,"\n --Da dua them 1 condition vao CSDL");
                                 }
-                                                                
-                                
                             }
                         }
+                        // End Add
                         if (($launch == 0) && ((empty($scoes->defaultorg)) || ($scoes->defaultorg == $identifier))) {
                             $launch = $id;
                         }
@@ -1865,31 +1727,26 @@ function scorm_view_display ($user, $scorm, $action, $cm, $blockwidth='') {
     }
     $result = scorm_get_toc($user,$scorm,'structlist',$orgidentifier);
     $incomplete = $result->incomplete;
-//    echo ("Toc ---");
     echo $result->toc;
-//    echo ("Ket thuc");
     print_simple_box_end();
 ?>
             <div class="center">
                 <form name="theform" method="post" action="<?php echo $CFG->wwwroot ?>/mod/scorm/player.php?id=<?php echo $cm->id ?>"<?php echo $scorm->popup == 1?' target="newwin"':'' ?>>
               <?php
+                  // Added by Pham Minh Duc
+                  $suspend = get_record("scorm_suspendtrack","scormid",$scorm->id,"userid",$user->id);
+                  // End Add
 
-// Thiet lap suspend
-            $suspend = get_record("scorm_suspendtrack","scormid",$scorm->id,"userid",$user->id);
-
-//------------------
                   if ($scorm->hidebrowse == 0) {
                       print_string("mode","scorm");
                       echo ': <input type="radio" id="b" name="mode" value="browse" /><label for="b">'.get_string('browse','scorm').'</label>'."\n";
                       if ($incomplete === true) {
                           echo '<input type="radio" id="n" name="mode" value="normal" checked="checked" /><label for="n">'.get_string('normal','scorm')."</label>\n";
-                            
-                            //Neu co luu tru thi co the chon continue de tiep tu
-                          if (!empty($suspend))
-                          {
+                          // Added by Pham Minh Duc
+                          if (!empty($suspend)) {
                               echo '<input type="radio" id="n" name="mode" value="continue" checked="checked" /><label for="n">'.get_string('continue','scorm')."</label>\n";
                           }
-
+                          // End Add
                       } else {
                           echo '<input type="radio" id="r" name="mode" value="review" checked="checked" /><label for="r">'.get_string('review','scorm')."</label>\n";
                       }
@@ -1917,12 +1774,6 @@ function scorm_view_display ($user, $scorm, $action, $cm, $blockwidth='') {
 <?php
 }
 
-function scorm_update_status($scormid,$scoid)
-{
-    
-}
-
-
 function scorm_repeater($what, $times) {
     if ($times <= 0) {
         return null;
@@ -1934,43 +1785,6 @@ function scorm_repeater($what, $times) {
     return $return;
 }
 
-//chuyen toi SCO duoc thuc hien tiep theo
-function scorm_get_nextsco($scormid,$scoid)
-{
-
-
-
-}
-//Chuyen toi SCO duoc thuc hien truoc
-function scorm_get_presco($scormid,$scoid)
-{
-
-
-
-}
-//Xac dinh xem doi tuong do co cho phep lua chon khong
-function scorm_isChoice($scormid,$scoid)
-{
-//    //$f = "D:\\test.txt";
-//    //@$ft = fopen($f,"a");
-    $sco = get_record("scorm_sequencing_controlmode","scormid",$scormid,"scoid",$scoid);
-//    ////fwrite($ft,"\n Xu ly doc thong tin trong ham scorm_isChoice scormid la ".$scormid." scoid la: ".$scoid);
-    $scoparent = get_record("scorm_sequencing_controlmode","scormid",$scormid,"identifier",$sco->parent);
-//    ////fwrite($ft,"\n Xu ly doc thong tin trong ham scorm_isChoice scoparent scormid la ".$scormid." scoid la: ".$scoparent->scoid);
-
-
-//    ////fwrite($ft,"\n Xu ly doc thong tin trong ham scorm_isChoice gia tri la: ".$scoparent->choice);
-    return $scoparent->choice;
-}
-
-//Xac dinh xem doi tuong do co cho phep lua chon thoat khong
-function scorm_isChoiceexit($scormid,$scoid)
-{
-    $sco = get_record("scorm_sequencing_controlmode","scormid",$scormid,"scoid",$scoid);
-    $scoparent = get_record("scorm_sequencing_controlmode","scormid",$scormid,"identifier",$sco->parent);
-
-    return $scoparent->choiceexit;
-}
 /* Usage
  Grab some XML data, either from a file, URL, etc. however you want. Assume storage in $strYourXML;
 
@@ -1992,30 +1806,37 @@ class xml2Array {
    * @return string
    */
    function utf8_to_entities($str) {
+       global $CFG;
+
        $entities = '';
        $values = array();
        $lookingfor = 1;
 
-       for ($i = 0; $i < strlen($str); $i++) {
-           $thisvalue = ord($str[$i]);
-           if ($thisvalue < 128) {
-               $entities .= $str[$i]; // Leave ASCII chars unchanged 
-           } else {
-               if (count($values) == 0) {
-                   $lookingfor = ($thisvalue < 224) ? 2 : 3;
-               }
-               $values[] = $thisvalue;
-               if (count($values) == $lookingfor) {
-                   $number = ($lookingfor == 3) ?
-                       (($values[0] % 16) * 4096) + (($values[1] % 64) * 64) + ($values[2] % 64):
-                       (($values[0] % 32) * 64) + ($values[1] % 64);
-                   $entities .= '&#' . $number . ';';
-                   $values = array();
-                   $lookingfor = 1;
+       if (empty($CFG->unicodedb)) {  // If Unicode DB support enable does not convert string
+           $textlib = textlib_get_instance();
+           for ($i = 0; $i < $textlib->strlen($str,'utf-8'); $i++) {
+               $thisvalue = ord($str[$i]);
+               if ($thisvalue < 128) {
+                   $entities .= $str[$i]; // Leave ASCII chars unchanged 
+               } else {
+                   if (count($values) == 0) {
+                       $lookingfor = ($thisvalue < 224) ? 2 : 3;
+                   }
+                   $values[] = $thisvalue;
+                   if (count($values) == $lookingfor) {
+                       $number = ($lookingfor == 3) ?
+                           (($values[0] % 16) * 4096) + (($values[1] % 64) * 64) + ($values[2] % 64):
+                           (($values[0] % 32) * 64) + ($values[1] % 64);
+                       $entities .= '&#' . $number . ';';
+                       $values = array();
+                       $lookingfor = 1;
+                   }
                }
            }
+           return $entities;
+       } else {
+           return $str;
        }
-       return $entities;
    }
 
    /**