/**
  * Initialize lesson
  *
  * This function is used to initialize specific aspects of the current lesson
  * These aspects can be the lesson content, announcements, users, glossary etc
  * specified in the $deleteEntities array.
  * <br/>Example:
  * <code>
  * try {
  *   $lesson = new EfrontLesson(32);                     //32 is the lesson id
  *  $lesson -> initialize(array('content', 'glossary', 'rules'));           //Erase all content, glossary terms and content rules
  * } catch (Exception $e) {
  *   echo $e -> getMessage();
  * }
  * </code><br/>
  * If $deleteEntities is 'all', then all lesson aspects are reset
  *
  * @param mixed $deleteEntities Eiterh an array with lesson aspects to initialize, or 'all' which equals to 'reset everything'
  * @return boolean True if everything is ok
  * @since 3.5.0
  * @access public
  */
 public function initialize($deleteEntities)
 {
     $possibleEntities = array('content', 'tests', 'questions', 'rules', 'conditions', 'comments', 'users', 'news', 'files', 'calendar', 'glossary', 'tracking', 'scheduling', 'surveys', 'events', 'modules', 'projects');
     if ($deleteEntities == 'all') {
         $deleteEntities = $possibleEntities;
     }
     $content = eF_getTableDataFlat("content", "*", "lessons_ID=" . $this->lesson['id']);
     //Get the lesson units
     sizeof($content['id']) > 0 ? $content_list = implode(",", $content['id']) : ($content_list = array());
     //Create list of content ids, will come in handy later
     $commonFolderLessons = eF_getTableData("lessons", "id", "share_folder=" . $this->lesson['id']);
     foreach ($deleteEntities as $value) {
         switch ($value) {
             case 'tests':
                 $lessonTests = $this->getTests(true);
                 foreach ($lessonTests as $id => $test) {
                     $test->delete();
                 }
                 break;
             case 'questions':
                 $lessonQuestions = $this->getQuestions(true);
                 foreach ($lessonQuestions as $id => $question) {
                     $question->delete();
                 }
                 break;
             case 'rules':
                 $content = new EfrontContentTree($this->lesson['id']);
                 $contentRules = $content->getRules();
                 $content->deleteRules(array_keys($contentRules));
                 break;
             case 'conditions':
                 $lessonConditions = $this->getConditions();
                 $this->deleteConditions(array_keys($lessonConditions));
                 break;
             case 'comments':
                 $content = new EfrontContentTree($this->lesson['id']);
                 $content->deleteComments(array_keys($content->getComments()));
                 //Delete all comments
                 break;
             case 'content':
                 $content = new EfrontContentTree($this->lesson['id']);
                 foreach (new EfrontNodeFilterIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($content->tree), RecursiveIteratorIterator::SELF_FIRST)) as $key => $unit) {
                     $unit->delete();
                 }
                 break;
             case 'users':
                 $lessonUsers = $this->getUsers('student');
                 $this->removeUsers(array_keys($lessonUsers));
                 break;
             case 'news':
                 $lessonNews = news::getNews($this->lesson['id']);
                 //$this -> getNews();
                 foreach ($lessonNews as $value) {
                     $value = new news($value);
                     $value->delete();
                 }
                 break;
             case 'files':
                 //Only delete files if this lesson is not sharing its folder
                 if (!$this->lesson['share_folder'] && empty($commonFolderLessons)) {
                     $directory = new EfrontDirectory($this->directory);
                     $directory->delete();
                     mkdir($this->directory, 0755);
                 }
                 break;
             case 'calendar':
                 !in_array('calendar', $deleteEntities) or calendar::deleteLessonCalendarEvents($this->lesson['id']);
                 break;
             case 'glossary':
                 in_array('glossary', $deleteEntities) ? eF_deleteTableData("glossary", "lessons_ID=" . $this->lesson['id']) : null;
                 break;
             case 'projects':
                 $lessonProjects = $this->getProjects(true);
                 foreach ($lessonProjects as $value) {
                     $value->delete();
                 }
                 break;
             case 'tracking':
                 $tracking_info = array("done_content" => "", "issued_certificate" => "", "comments" => "", "completed" => 0, "current_unit" => 0, "score" => 0);
                 eF_updateTableData("users_to_lessons", $tracking_info, "lessons_ID = " . $this->lesson['id']);
                 /*
                 foreach ($this -> getUsers as $user => $foo) {
                 $cacheKey = "user_lesson_status:lesson:".$this -> lesson['id']."user:"******"completed_tests", "tests_ID={$id}");
                 }
                 $units = $this->getUnits();
                 if (sizeof($units) > 0) {
                     eF_deleteTableData("scorm_data", "content_ID in (" . implode(",", $units) . ")");
                 }
                 break;
             case 'scheduling':
                 $this->lesson['from_timestamp'] = null;
                 $this->lesson['to_timestamp'] = null;
                 $this->persist();
                 break;
             case 'surveys':
                 $surveys = eF_getTableDataFlat("surveys", "id", "lessons_ID=" . $this->lesson['id']);
                 $surveys_list = implode(",", $surveys['id']);
                 if (!empty($surveys_list)) {
                     eF_deleteTableData("questions_to_surveys", "surveys_ID IN ({$surveys_list})");
                     eF_deleteTableData("survey_questions_done", "surveys_ID IN ({$surveys_list})");
                     eF_deleteTableData("users_to_surveys", "surveys_ID IN ({$surveys_list})");
                     eF_deleteTableData("users_to_done_surveys", "surveys_ID IN ({$surveys_list})");
                     eF_deleteTableData("surveys", "lessons_ID=" . $this->lesson['id']);
                 }
                 break;
             case 'events':
                 eF_deleteTableData("events", "lessons_ID=" . $this->lesson['id']);
                 break;
             case 'modules':
                 $modules = eF_loadAllModules();
                 foreach ($modules as $module) {
                     $module->onDeleteLesson($this->lesson['id']);
                 }
                 break;
         }
         EfrontCache::getInstance()->deleteCache();
     }
     /*
     		 if (in_array('questions', $deleteEntities)) {                                                             //Delete lesson questions
     		 $result = eF_getTableData("questions", "id", "lessons_ID=".$this -> lesson['id']);
     		 foreach ($result as $value) {
     		 $questionIds[] = $value['id'];
     		 }
     		 if (sizeof($questionIds) > 0) {
     		 eF_deleteTableData("tests_to_questions", "questions_ID in (".implode(",", $questionIds).")");
     		 }
     		 eF_deleteTableData("questions", "lessons_ID=".$this -> lesson['id']);
     		 }
     		 if (in_array('content', $deleteEntities)) {                                                             //Delete lesson units
     		 foreach ($content['id'] as $value) {
     		 $value = new EfrontUnit($value);
     		 $value -> delete();
     		 }
     		 $result = eF_getTableDataFlat("content", "id", "lessons_ID=".$this -> lesson['id']);
     		 $list   = implode(",", $result['id']);
     		 EfrontSearch :: removeText('content', $list, '', true);
     		 eF_deleteTableData("content", "lessons_ID=".$this -> lesson['id']);                             //Just make sure everything is deleted
     		 }
     		 if (in_array('surveys', $deleteEntities)) {
     		 $surveys      = eF_getTableDataFlat("surveys", "id", "lessons_ID=".$this -> lesson['id']);
     		 $surveys_list = implode(",", $surveys['id']);
     		 eF_deleteTableData("questions_to_surveys",  "surveys_ID IN ($surveys_list)");
     		 eF_deleteTableData("survey_questions_done", "surveys_ID IN ($surveys_list)");
     		 eF_deleteTableData("users_to_surveys",      "surveys_ID IN ($surveys_list)");
     		 eF_deleteTableData("users_to_done_surveys", "surveys_ID IN ($surveys_list)");
     		 eF_deleteTableData("surveys", "lessons_ID=".$this -> lesson['id']);
     		 }
     		 if (in_array('tracking', $deleteEntities)) {
     		 $tracking_info = array("done_content"       => "",
     		 "issued_certificate" => "",
     		 "comments"           => "",
     		 "completed"          => 0,
     		 "current_unit"       => 0,
     		 "score"              => 0);
     		 eF_updateTableData("users_to_lessons", $tracking_info, "lessons_ID = ".$this -> lesson['id']);
     		 }
     		 if (in_array('files', $deleteEntities)) {
     		 $filesystem = new FileSystemTree($this -> getDirectory());
     		 foreach (new ArrayIterator($filesystem -> tree) as $key => $value) {
     		 $value -> delete();
     		 }
     		 }
     		 in_array('conditions', $deleteEntities) ? eF_deleteTableData("lesson_conditions", "lessons_ID=".$this -> lesson['id']) : null;
     		 in_array('calendar',   $deleteEntities) ? eF_deleteTableData("calendar",          "lessons_ID=".$this -> lesson['id']) : null;
     		 in_array('periods',    $deleteEntities) ? eF_deleteTableData("periods",           "lessons_ID=".$this -> lesson['id']) : null;
     		 in_array('news',       $deleteEntities) ? eF_deleteTableData("news",              "lessons_ID=".$this -> lesson['id']) : null;
     		 in_array('glossary',   $deleteEntities) ? eF_deleteTableData("glossary",    "lessons_ID=".$this -> lesson['id']) : null;
     		 in_array('users',      $deleteEntities) ? eF_deleteTableData("users_to_lessons",  "lessons_ID=".$this -> lesson['id']." and user_type = 'student'") : null;
     in_array('comments', $deleteEntities) ? eF_deleteTableData("comments", "content_ID IN (".$content_list.")") : null;
     		 in_array('rules',    $deleteEntities) ? eF_deleteTableData("rules",    "content_ID IN (".$content_list.") or rule_content_ID IN (".$content_list.")") : null;
     $done_tests = eF_getTableDataFlat("done_tests", "id", "tests_ID IN ($content_list)");
     		 sizeof($done_tests) > 0 ? eF_deleteTableData("done_questions", "done_tests_ID IN (".implode(",", $done_tests['id']).")") : null;
     		 eF_deleteTableData("done_tests",          "tests_ID IN ($content_list)");
     		 eF_deleteTableData("users_to_done_tests", "tests_ID IN ($content_list)");
     		 eF_deleteTableData("logs",                "action='test_begin' AND comments IN ($content_list)");
     */
 }