//pr($unitsToQuestionsDifficulties);
if (!$skillgap_tests) {
    if ($_GET['subunits']) {
        if (!$_GET['showall']) {
            foreach ($iterator = new EfrontNodeFilterIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($currentContent->tree), RecursiveIteratorIterator::SELF_FIRST)) as $key => $value) {
                $children = $currentContent->getNodeChildren($value['id']);
                foreach (new EfrontNodeFilterIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($children), RecursiveIteratorIterator::SELF_FIRST)) as $child => $foo) {
                    $subunits[$key][] = $child;
                }
            }
        } else {
            $lessons = EFrontLesson::getLessons(false, true);
            foreach ($lessons as $lesson_ID => $lesson) {
                $lessonsContent = new EfrontContentTree($lesson_ID);
                foreach ($iterator = new EfrontNodeFilterIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($lessonsContent->tree), RecursiveIteratorIterator::SELF_FIRST)) as $key => $value) {
                    $children = $lessonsContent->getNodeChildren($value['id']);
                    foreach (new EfrontNodeFilterIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($children), RecursiveIteratorIterator::SELF_FIRST)) as $child => $foo) {
                        $subunits[$key][] = $child;
                    }
                }
            }
        }
        $unitsToQuestionsDifficultiesSub = array();
        foreach ($unitsToQuestionsDifficulties as $key => $value) {
            if (!empty($subunits[$key])) {
                $unitsToQuestionsDifficultiesSub[$key] = $unitsToQuestionsDifficulties[$key];
                foreach ($subunits[$key] as $value2) {
                    foreach ($unitsToQuestionsDifficulties[$value2] as $type => $num) {
                        $unitsToQuestionsDifficultiesSub[$key][$type] += $num;
                    }
                }
 public function getQuestionsRandomTest($returnObjects = false)
 {
     if (empty($this->questions)) {
         $criteria = $this->options['random_test'];
         foreach ($criteria as $index => $array) {
         }
         $criteria_type = $index;
         if (isset($criteria[$criteria_type])) {
             if (!empty($criteria[$criteria_type])) {
                 $numLessons = eF_getTableDataFlat("content", "distinct(lessons_ID)", "id IN (" . implode(',', array_keys($criteria[$criteria_type])) . ")");
             }
         }
         if ($this->options['random_test_common_pool']) {
             $from_pool = $this->options['random_test_common_pool'];
         } else {
             // in case of linked tests
             if (sizeof($numLessons['lessons_ID']) > 1) {
                 $from_pool = true;
             } else {
                 if (sizeof($numLessons['lessons_ID']) == 1 && $numLessons['lessons_ID'][0] != $this->test['lessons_ID']) {
                     $from_pool = true;
                 } else {
                     $from_pool = false;
                 }
             }
         }
         if (!$from_pool) {
             // if there are performance issues maybe save common_pool flag to test and not retrieve all questions if not necessary
             $result = eF_getTableData("questions", "*", "lessons_ID=" . $_SESSION['s_lessons_ID'], "content_ID ASC");
         } else {
             //@todo common pool
             //$currentUser = EfrontUserFactory::factory($_SESSION['s_login']);
             //$userLessons = $currentUser -> getLessons(false, $_SESSION['s_type']);
             //$result       = eF_getTableData("questions,lessons", "questions.*", "lessons_ID in (".implode(",",array_keys($userLessons)).") and lessons_ID !=0 and lessons.id=questions.lessons_ID and lessons.active=1", "content_ID ASC");
             $result = eF_getTableData("questions", "*", "", "content_ID ASC");
         }
         $content_to_lesson = array();
         $unitsToQuestionsDifficulties = array();
         foreach ($result as $value) {
             $questions[$value['id']] = $value;
             if ($value['content_ID'] != 0) {
                 $content_to_lesson[$value['content_ID']] = $value['lessons_ID'];
             }
             if (!isset($unitsToQuestionsDifficulties[$value['content_ID']])) {
                 $unitsToQuestionsDifficulties[$value['content_ID']] = array();
             }
             $unitsToQuestionsDifficulties[$value['content_ID']][$value['difficulty']][] = $value['id'];
             if (!isset($unitsToQuestionsTypes[$value['content_ID']])) {
                 $unitsToQuestionsTypes[$value['content_ID']] = array();
             }
             $unitsToQuestionsTypes[$value['content_ID']][$value['type']][] = $value['id'];
         }
         if (!$from_pool) {
             $currentContent = new EfrontContentTree($_SESSION['s_lessons_ID']);
         }
         if ($this->options['random_test_subunits']) {
             $unitsToQuestionsDifficultiesSub = $unitsToQuestionsDifficulties;
             $unitsToQuestionsTypesSub = $unitsToQuestionsTypes;
             foreach ($criteria[$criteria_type] as $key => $value) {
                 if ($key && !empty($content_to_lesson[$key])) {
                     // exclude none units questions
                     if ($from_pool) {
                         $currentContent = new EfrontContentTree($content_to_lesson[$key]);
                     }
                     $children = $currentContent->getNodeChildren($key);
                     foreach (new EfrontNodeFilterIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($children), RecursiveIteratorIterator::SELF_FIRST)) as $child => $foo) {
                         if ($criteria_type == 'difficulty') {
                             foreach (array_keys(Question::$questionDifficulties) as $difficulty) {
                                 $unitsToQuestionsDifficultiesSub[$key][$difficulty] = array_merge((array) $unitsToQuestionsDifficultiesSub[$key][$difficulty], (array) $unitsToQuestionsDifficulties[$child][$difficulty]);
                                 if (empty($unitsToQuestionsDifficultiesSub[$key][$difficulty])) {
                                     unset($unitsToQuestionsDifficultiesSub[$key][$difficulty]);
                                 }
                             }
                         } elseif ($criteria_type == 'type') {
                             foreach (array_keys(Question::$questionTypes) as $type) {
                                 $unitsToQuestionsTypesSub[$key][$type] = array_merge((array) $unitsToQuestionsTypesSub[$key][$type], (array) $unitsToQuestionsTypes[$child][$type]);
                                 if (empty($unitsToQuestionsTypesSub[$key][$type])) {
                                     unset($unitsToQuestionsTypesSub[$key][$type]);
                                 }
                             }
                         }
                     }
                 }
             }
             $unitsToQuestionsTypes = $unitsToQuestionsTypesSub;
             $unitsToQuestionsDifficulties = $unitsToQuestionsDifficultiesSub;
         }
         //pr($unitsToQuestionsDifficulties);
         $selectedQuestions = array();
         if (isset($criteria['difficulty'])) {
             foreach ($criteria['difficulty'] as $key => $arr) {
                 foreach ($arr as $diff => $value) {
                     shuffle($unitsToQuestionsDifficulties[$key][$diff]);
                     $choice = array_slice($unitsToQuestionsDifficulties[$key][$diff], 0, $value);
                     $selectedQuestions = array_merge((array) $selectedQuestions, (array) $choice);
                 }
             }
         } elseif (isset($criteria['type'])) {
             foreach ($criteria['type'] as $key => $arr) {
                 foreach ($arr as $type => $value) {
                     shuffle($unitsToQuestionsTypes[$key][$type]);
                     $choice = array_slice($unitsToQuestionsTypes[$key][$type], 0, $value);
                     $selectedQuestions = array_merge((array) $selectedQuestions, (array) $choice);
                 }
             }
         }
         $questions = array();
         foreach ($selectedQuestions as $value) {
             $questions[$value] = $value;
         }
         $temp = array();
         foreach ($questions as $value) {
             $ques = QuestionFactory::factory($value);
             $returnObjects ? $temp[$value] = $ques : ($temp[$value] = $ques->question);
         }
         $this->questions = $temp;
     }
     $questions = array();
     foreach ($this->questions as $key => $value) {
         if ($value instanceof Question) {
             $returnObjects ? $questions[$key] = $value : ($questions[$key] = $value->question);
         } else {
             if (is_array($value)) {
                 $returnObjects ? $questions[$key] = QuestionFactory::factory($value) : ($questions[$key] = $value);
             } else {
                 $returnObjects ? $questions[$key] = QuestionFactory::factory($value) : ($questions[$key] = $value);
             }
         }
     }
     return $questions;
 }
                 $recentTests = eF_getTableData("completed_tests JOIN tests ON tests_id = tests.id JOIN users ON completed_tests.users_LOGIN = users.login JOIN users_to_skillgap_tests ON completed_tests.users_LOGIN = users_to_skillgap_tests.users_LOGIN AND users_to_skillgap_tests.tests_ID = tests.id AND users_to_skillgap_tests.solved = 1", "completed_tests.id, completed_tests.test, users.name as username, users.surname, completed_tests.tests_ID, tests.name, completed_tests.timestamp, completed_tests.users_LOGIN", "completed_tests.tests_id IN ('". implode("','", $test_ids) ."')", "timestamp DESC");
     
                 foreach ($recentTests as $rtid => $rtest) {
                     $completedRecentTest = unserialize($rtest['test']);
                     $recentTests[$rtid]['score'] = $completedRecentTest -> completedTest['score'];
                 }
             }
     
             $smarty -> assign("T_RECENT_TESTS" , $recentTests);
     */
 } else {
     if (!$skillgap_tests) {
         //Get the available questions (only questions from the selected unit, if there is one)
         try {
             isset($_GET['from_unit']) && eF_checkParameter($_GET['from_unit'], 'id') ? $selectedUnit = $_GET['from_unit'] : ($selectedUnit = 0);
             $siblings = $currentContent->getNodeChildren($selectedUnit);
             $children[] = $siblings['id'];
             foreach (new EfrontNodeFilterIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($siblings), RecursiveIteratorIterator::SELF_FIRST)) as $key => $value) {
                 $children[] = $key;
             }
             if (sizeof($children) > 0) {
                 if ($_GET['showall'] && EfrontUser::isOptionVisible('questions_pool')) {
                     if (G_VERSIONTYPE != 'community') {
                         #cpp#ifndef COMMUNITY
                         if (G_VERSIONTYPE != 'standard') {
                             #cpp#ifndef STANDARD
                             $questions = eF_getTableData("questions,lessons", "questions.*", "content_ID in (" . implode(",", $children) . ") and lessons_ID!=0 and lessons.id=questions.lessons_ID and lessons.active=1", "content_ID ASC");
                             //Retrieve all questions that belong to this unit or its subunits
                         }
                         #cpp#endif
                     }