function getObjectsStatusForUser($a_user_id, array $obj_refs)
 {
     global $ilDB;
     if (sizeof($obj_refs)) {
         $obj_ids = array_keys($obj_refs);
         self::refreshObjectsStatus($obj_ids, array($a_user_id));
         include_once "Services/Tracking/classes/class.ilLPObjSettings.php";
         include_once "Services/Tracking/classes/class.ilLPStatus.php";
         // prepare object view modes
         include_once 'Modules/Course/classes/class.ilObjCourse.php';
         $view_modes = array();
         $query = "SELECT obj_id, view_mode FROM crs_settings" . " WHERE " . $ilDB->in("obj_id", $obj_ids, false, "integer");
         $set = $ilDB->query($query);
         while ($rec = $ilDB->fetchAssoc($set)) {
             $view_modes[(int) $rec["obj_id"]] = (int) $rec["view_mode"];
         }
         $sessions = self::getSessionData($a_user_id, $obj_ids);
         $query = "SELECT object_data.obj_id, title, CASE WHEN status IS NULL THEN " . LP_STATUS_NOT_ATTEMPTED_NUM . " ELSE status END AS status," . " status_changed, percentage, read_count+childs_read_count AS read_count, spent_seconds+childs_spent_seconds AS spent_seconds," . " u_mode, type, visits, mark, u_comment" . " FROM object_data" . " LEFT JOIN ut_lp_settings ON (ut_lp_settings.obj_id = object_data.obj_id)" . " LEFT JOIN read_event ON (read_event.obj_id = object_data.obj_id AND read_event.usr_id = " . $ilDB->quote($a_user_id, "integer") . ")" . " LEFT JOIN ut_lp_marks ON (ut_lp_marks.obj_id = object_data.obj_id AND ut_lp_marks.usr_id = " . $ilDB->quote($a_user_id, "integer") . ")" . " WHERE " . $ilDB->in("object_data.obj_id", $obj_ids, false, "integer") . " ORDER BY title";
         $set = $ilDB->query($query);
         $result = array();
         while ($rec = $ilDB->fetchAssoc($set)) {
             $rec["comment"] = $rec["u_comment"];
             unset($rec["u_comment"]);
             $rec["ref_ids"] = $obj_refs[(int) $rec["obj_id"]];
             $rec["status"] = (int) $rec["status"];
             $rec["percentage"] = (int) $rec["percentage"];
             $rec["read_count"] = (int) $rec["read_count"];
             $rec["spent_seconds"] = (int) $rec["spent_seconds"];
             $rec["u_mode"] = (int) $rec["u_mode"];
             if ($rec["type"] == "sess") {
                 $session = $sessions[$rec["obj_id"]];
                 $rec["title"] = $session["title"];
                 // $rec["status"] = (int)$session["status"];
             }
             // lp mode might not match object/course view mode
             if ($rec["type"] == "crs" && $view_modes[$rec["obj_id"]] == IL_CRS_VIEW_OBJECTIVE) {
                 $rec["u_mode"] = LP_MODE_OBJECTIVES;
             } else {
                 if (!$rec["u_mode"]) {
                     $rec["u_mode"] = ilLPObjSettings::__getDefaultMode($rec["obj_id"], $rec["type"]);
                 }
             }
             // can be default mode
             if (true) {
                 $result[] = $rec;
             }
         }
         return $result;
     }
 }
 function &_getInstance($a_obj_id, $a_mode = NULL)
 {
     include_once 'Services/Tracking/classes/class.ilLPObjSettings.php';
     if ($a_mode === NULL) {
         $a_mode = ilLPObjSettings::_lookupMode($a_obj_id);
     }
     switch ($a_mode) {
         case LP_MODE_VISITS:
             include_once 'Services/Tracking/classes/class.ilLPStatusVisits.php';
             return new ilLPStatusVisits($a_obj_id);
         case LP_MODE_COLLECTION:
             include_once 'Services/Tracking/classes/class.ilLPStatusCollection.php';
             return new ilLPStatusCollection($a_obj_id);
         case LP_MODE_TLT:
             include_once 'Services/Tracking/classes/class.ilLPStatusTypicalLearningTime.php';
             return new ilLPStatusTypicalLearningTime($a_obj_id);
         case LP_MODE_SCORM:
             include_once 'Services/Tracking/classes/class.ilLPStatusSCORM.php';
             return new ilLPStatusSCORM($a_obj_id);
         case LP_MODE_TEST_FINISHED:
             include_once 'Services/Tracking/classes/class.ilLPStatusTestFinished.php';
             return new ilLPStatusTestFinished($a_obj_id);
         case LP_MODE_TEST_PASSED:
             include_once 'Services/Tracking/classes/class.ilLPStatusTestPassed.php';
             return new ilLPStatusTestPassed($a_obj_id);
         case LP_MODE_MANUAL:
             include_once 'Services/Tracking/classes/class.ilLPStatusManual.php';
             return new ilLPStatusManual($a_obj_id);
         case LP_MODE_MANUAL_BY_TUTOR:
             include_once 'Services/Tracking/classes/class.ilLPStatusManualByTutor.php';
             return new ilLPStatusManualByTutor($a_obj_id);
         case LP_MODE_EXERCISE_RETURNED:
             include_once 'Services/Tracking/classes/class.ilLPStatusExerciseReturned.php';
             return new ilLPStatusExerciseReturned($a_obj_id);
         case LP_MODE_OBJECTIVES:
             include_once 'Services/Tracking/classes/class.ilLPStatusObjectives.php';
             return new ilLPStatusObjectives($a_obj_id);
         case LP_MODE_EVENT:
             include_once 'Services/Tracking/classes/class.ilLPStatusEvent.php';
             return new ilLPStatusEvent($a_obj_id);
         case LP_MODE_PLUGIN:
             include_once 'Services/Tracking/classes/class.ilLPStatusPlugin.php';
             return new ilLPStatusEvent($a_obj_id);
         case LP_MODE_UNDEFINED:
             $type = ilObject::_lookupType($a_obj_id);
             $mode = ilLPObjSettings::__getDefaultMode($a_obj_id, $type);
             if ($mode != LP_MODE_UNDEFINED) {
                 return self::_getInstance($a_obj_id, $mode);
             }
             // fallthrough
         // fallthrough
         default:
             echo "ilLPStatusFactory: unknown type " . ilLPObjSettings::_lookupMode($a_obj_id);
             exit;
     }
 }
 function _lookupMode($a_obj_id)
 {
     global $ilDB, $ilObjDataCache;
     if (isset(self::$mode_by_obj_id[$a_obj_id])) {
         return self::$mode_by_obj_id[$a_obj_id];
     }
     if (ilLPObjSettings::_checkObjectives($a_obj_id)) {
         self::$mode_by_obj_id[$a_obj_id] = LP_MODE_OBJECTIVES;
         return LP_MODE_OBJECTIVES;
     }
     if (ilLPObjSettings::_checkSCORMPreconditions($a_obj_id)) {
         self::$mode_by_obj_id[$a_obj_id] = LP_MODE_SCORM;
         return LP_MODE_SCORM;
     }
     $query = "SELECT u_mode FROM ut_lp_settings " . "WHERE obj_id = " . $ilDB->quote($a_obj_id, 'integer');
     $res = $ilDB->query($query);
     while ($row = $res->fetchRow(DB_FETCHMODE_OBJECT)) {
         self::$mode_by_obj_id[$a_obj_id] = $row->u_mode;
         return $row->u_mode;
     }
     // no db entry exists => return default mode by type
     $def_mode = ilLPObjSettings::__getDefaultMode($a_obj_id, $ilObjDataCache->lookupType($a_obj_id));
     self::$mode_by_obj_id[$a_obj_id] = $def_mode;
     return $def_mode;
 }