/**
 * Display the exercise results
 * @param Exercise $objExercise
 * @param int $exe_id
 * @param bool $save_user_result save users results (true) or just show the results (false)
 */
function display_question_list_by_attempt($objExercise, $exe_id, $save_user_result = false)
{
    global $origin;
    // Getting attempt info
    $exercise_stat_info = $objExercise->get_stat_track_exercise_info_by_exe_id($exe_id);
    // Getting question list
    $question_list = array();
    if (!empty($exercise_stat_info['data_tracking'])) {
        $question_list = explode(',', $exercise_stat_info['data_tracking']);
    } else {
        // Try getting the question list only if save result is off
        if ($save_user_result == false) {
            $question_list = $objExercise->get_validated_question_list();
        }
    }
    $counter = 1;
    $total_score = $total_weight = 0;
    $exercise_content = null;
    // Hide results
    $show_results = false;
    $show_only_score = false;
    if ($objExercise->results_disabled == RESULT_DISABLE_SHOW_SCORE_AND_EXPECTED_ANSWERS) {
        $show_results = true;
    }
    if (in_array($objExercise->results_disabled, array(RESULT_DISABLE_SHOW_SCORE_ONLY, RESULT_DISABLE_SHOW_FINAL_SCORE_ONLY_WITH_CATEGORIES))) {
        $show_only_score = true;
    }
    // Not display expected answer, but score, and feedback
    $show_all_but_expected_answer = false;
    if ($objExercise->results_disabled == RESULT_DISABLE_SHOW_SCORE_ONLY && $objExercise->feedback_type == EXERCISE_FEEDBACK_TYPE_END) {
        $show_all_but_expected_answer = true;
        $show_results = true;
        $show_only_score = false;
    }
    if ($show_results || $show_only_score) {
        $user_info = api_get_user_info($exercise_stat_info['exe_user_id']);
        //Shows exercise header
        echo $objExercise->show_exercise_result_header($user_info, api_convert_and_format_date($exercise_stat_info['start_date'], DATE_TIME_FORMAT_LONG), $exercise_stat_info['duration']);
    }
    // Display text when test is finished #4074 and for LP #4227
    $end_of_message = $objExercise->selectTextWhenFinished();
    if (!empty($end_of_message)) {
        Display::display_normal_message($end_of_message, false);
        echo "<div class='clear'>&nbsp;</div>";
    }
    $question_list_answers = array();
    $media_list = array();
    $category_list = array();
    // Loop over all question to show results for each of them, one by one
    if (!empty($question_list)) {
        foreach ($question_list as $questionId) {
            // creates a temporary Question object
            $objQuestionTmp = Question::read($questionId);
            // This variable came from exercise_submit_modal.php
            ob_start();
            // We're inside *one* question. Go through each possible answer for this question
            $result = $objExercise->manage_answer($exercise_stat_info['exe_id'], $questionId, null, 'exercise_result', array(), $save_user_result, true, $show_results, $objExercise->selectPropagateNeg(), array());
            if (empty($result)) {
                continue;
            }
            // In case of global score, make sure the calculated total score is integer
            /*if (!is_int($result['score'])) {
                  $result['score'] = round($result['score']);
              }*/
            $total_score += $result['score'];
            $total_weight += $result['weight'];
            $question_list_answers[] = array('question' => $result['open_question'], 'answer' => $result['open_answer'], 'answer_type' => $result['answer_type']);
            $my_total_score = $result['score'];
            $my_total_weight = $result['weight'];
            // Category report
            $category_was_added_for_this_test = false;
            if (isset($objQuestionTmp->category) && !empty($objQuestionTmp->category)) {
                $category_list[$objQuestionTmp->category]['score'] += $my_total_score;
                $category_list[$objQuestionTmp->category]['total'] += $my_total_weight;
                $category_was_added_for_this_test = true;
            }
            if (isset($objQuestionTmp->category_list) && !empty($objQuestionTmp->category_list)) {
                foreach ($objQuestionTmp->category_list as $category_id) {
                    $category_list[$category_id]['score'] += $my_total_score;
                    $category_list[$category_id]['total'] += $my_total_weight;
                    $category_was_added_for_this_test = true;
                }
            }
            // No category for this question!
            if ($category_was_added_for_this_test == false) {
                if (!isset($category_list['none']['score'])) {
                    $category_list['none']['score'] = 0;
                }
                if (!isset($category_list['none']['total'])) {
                    $category_list['none']['total'] = 0;
                }
                $category_list['none']['score'] += $my_total_score;
                $category_list['none']['total'] += $my_total_weight;
            }
            if ($objExercise->selectPropagateNeg() == 0 && $my_total_score < 0) {
                $my_total_score = 0;
            }
            $comnt = null;
            if ($show_results) {
                $comnt = get_comments($exe_id, $questionId);
                if (!empty($comnt)) {
                    echo '<b>' . get_lang('Feedback') . '</b>';
                    echo '<div id="question_feedback">' . $comnt . '</div>';
                }
            }
            if ($show_results) {
                $score = array('result' => get_lang('Score') . " : " . show_score($my_total_score, $my_total_weight, false, true), 'pass' => $my_total_score >= $my_total_weight ? true : false, 'score' => $my_total_score, 'weight' => $my_total_weight, 'comments' => $comnt);
            } else {
                $score = array();
            }
            $contents = ob_get_clean();
            $question_content = '<div class="question_row">';
            if ($show_results) {
                $show_media = false;
                /*if ($objQuestionTmp->parent_id != 0 && !in_array($objQuestionTmp->parent_id, $media_list)) {
                      $show_media = true;
                      $media_list[] = $objQuestionTmp->parent_id;
                  }*/
                //Shows question title an description
                $question_content .= $objQuestionTmp->return_header(null, $counter, $score);
            }
            $counter++;
            $question_content .= $contents;
            $question_content .= '</div>';
            $exercise_content .= $question_content;
        }
        // end foreach() block that loops over all questions
    }
    $total_score_text = null;
    if ($origin != 'learnpath') {
        if ($show_results || $show_only_score) {
            $total_score_text .= '<div class="question_row">';
            $total_score_text .= get_question_ribbon($objExercise, $total_score, $total_weight, true);
            $total_score_text .= '</div>';
        }
    }
    if (!empty($category_list) && ($show_results || $show_only_score)) {
        //Adding total
        $category_list['total'] = array('score' => $total_score, 'total' => $total_weight);
        echo Testcategory::get_stats_table_by_attempt($objExercise->id, $category_list);
    }
    if ($show_all_but_expected_answer) {
        $exercise_content .= "<div class='normal-message'>" . get_lang("ExerciseWithFeedbackWithoutCorrectionComment") . "</div>";
    }
    // Remove audio auto play from questions on results page - refs BT#7939
    $exercise_content = preg_replace('/autoplay[\\=\\".+\\"]+/', '', $exercise_content);
    echo $total_score_text;
    echo $exercise_content;
    if (!$show_only_score) {
        echo $total_score_text;
    }
    if ($save_user_result) {
        // Tracking of results
        $learnpath_id = $exercise_stat_info['orig_lp_id'];
        $learnpath_item_id = $exercise_stat_info['orig_lp_item_id'];
        $learnpath_item_view_id = $exercise_stat_info['orig_lp_item_view_id'];
        if (api_is_allowed_to_session_edit()) {
            update_event_exercice($exercise_stat_info['exe_id'], $objExercise->selectId(), $total_score, $total_weight, api_get_session_id(), $learnpath_id, $learnpath_item_id, $learnpath_item_view_id, $exercise_stat_info['exe_duration'], $question_list, '', array());
        }
        // Send notification ..
        if (!api_is_allowed_to_edit(null, true)) {
            if (api_get_course_setting('email_alert_manager_on_new_quiz') == 1) {
                $objExercise->send_mail_notification_for_exam($question_list_answers, $origin, $exe_id);
            }
            $objExercise->send_notification_for_open_questions($question_list_answers, $origin, $exe_id);
            $objExercise->send_notification_for_oral_questions($question_list_answers, $origin, $exe_id);
        }
    }
}
             $exercise_stat_info = $objExercise->get_stat_track_exercise_info_by_exe_id($exe_id);
         }
         $key = get_time_control_key($exercise_id, $exercise_stat_info['orig_lp_id'], $exercise_stat_info['orig_lp_item_id']);
         if (isset($_SESSION['duration_time'][$key]) && !empty($_SESSION['duration_time'][$key])) {
             $duration = $now - $_SESSION['duration_time'][$key];
             if (!empty($exercise_stat_info['exe_duration'])) {
                 $duration += $exercise_stat_info['exe_duration'];
             }
             $duration = intval($duration);
         } else {
             if (!empty($exercise_stat_info['exe_duration'])) {
                 $duration = $exercise_stat_info['exe_duration'];
             }
         }
         $_SESSION['duration_time'][$key] = time();
         update_event_exercice($exe_id, $objExercise->selectId(), $total_score, $total_weight, $session_id, $exercise_stat_info['orig_lp_id'], $exercise_stat_info['orig_lp_item_id'], $exercise_stat_info['orig_lp_item_view_id'], $duration, $question_list, 'incomplete', $remind_list);
         // Destruction of the Question object
         unset($objQuestionTmp);
         if ($debug) {
             error_log(" -- end question -- ");
         }
     }
     if ($debug) {
         error_log(" ------ end ajax call ------- ");
     }
 }
 if ($objExercise->type == ONE_PER_PAGE) {
     echo 'one_per_page';
     exit;
 }
 echo 'ok';