/**
  * {@inheritdoc}
  */
 public function export()
 {
     if (empty($this->item_id)) {
         throw new TransactionExportException('Undefined item_id');
     }
     $attempt_id = $this->item_id;
     $attempt = get_exercise_results_by_attempt($attempt_id);
     if (empty($attempt)) {
         throw new TransactionExportException(sprintf('There is no exercise attempt information associated with exe_id "%d" in the database.', $attempt_id));
     }
     $exercise = new Exercise();
     $exercise_stat_info = $exercise->getStatTrackExerciseInfoByExeId($attempt_id);
     if (empty($exercise_stat_info)) {
         throw new TransactionExportException(sprintf('There is no exercise stat information associated with exe_id "%d" in the database.', $attempt_id));
     }
     // Exercise read expects course id set.
     $exercise->course_id = $exercise_stat_info['c_id'];
     if (!$exercise->read($exercise_stat_info['exe_exo_id'])) {
         throw new TransactionExportException(sprintf('The associated exercise id "%d" does not currently exist in the database.', $exercise_stat_info['exe_exo_id']));
     }
     // Prepare the export.
     $this->data['stat_info'] = $exercise_stat_info;
     $this->data['attempt_info'] = $attempt;
     $content = (array) $this;
     return json_encode($content);
 }
 /**
  * @param $exeId
  * @param $exercise_stat_info
  * @param $remindList
  * @param $currentQuestion
  * @return int|null
  */
 public static function getNextQuestionId($exeId, $exercise_stat_info, $remindList, $currentQuestion)
 {
     $result = get_exercise_results_by_attempt($exeId, 'incomplete');
     if (isset($result[$exeId])) {
         $result = $result[$exeId];
     } else {
         return null;
     }
     $data_tracking = $exercise_stat_info['data_tracking'];
     $data_tracking = explode(',', $data_tracking);
     // if this is the final question do nothing.
     if ($currentQuestion == count($data_tracking)) {
         return null;
     }
     $currentQuestion = $currentQuestion - 1;
     if (!empty($result['question_list'])) {
         $answeredQuestions = array();
         foreach ($result['question_list'] as $question) {
             if (!empty($question['answer'])) {
                 $answeredQuestions[] = $question['question_id'];
             }
         }
         // Checking answered questions
         $counterAnsweredQuestions = 0;
         foreach ($data_tracking as $questionId) {
             if (!in_array($questionId, $answeredQuestions)) {
                 if ($currentQuestion != $counterAnsweredQuestions) {
                     break;
                 }
             }
             $counterAnsweredQuestions++;
         }
         $counterRemindListQuestions = 0;
         // Checking questions saved in the reminder list
         if (!empty($remindList)) {
             foreach ($data_tracking as $questionId) {
                 if (in_array($questionId, $remindList)) {
                     // Skip the current question
                     if ($currentQuestion != $counterRemindListQuestions) {
                         break;
                     }
                 }
                 $counterRemindListQuestions++;
             }
             if ($counterRemindListQuestions < $currentQuestion) {
                 return null;
             }
             if (!empty($counterRemindListQuestions)) {
                 if ($counterRemindListQuestions > $counterAnsweredQuestions) {
                     return $counterAnsweredQuestions;
                 } else {
                     return $counterRemindListQuestions;
                 }
             }
         }
         return $counterAnsweredQuestions;
     }
 }
    /**
     * This function was originally found in the exercise_show.php
     * @param int       $exeId
     * @param int       $questionId
     * @param int       $choice the user selected
     * @param string    $from  function is called from 'exercise_show' or 'exercise_result'
     * @param array     $exerciseResultCoordinates the hotspot coordinates $hotspot[$question_id] = coordinates
     * @param bool      $saved_results save results in the DB or just show the reponse
     * @param bool      $from_database gets information from DB or from the current selection
     * @param bool      $show_result show results or not
     * @param int       $propagate_neg
     * @param array     $hotspot_delineation_result
     *
     * @todo    reduce parameters of this function
     * @return  string  html code
     */
    public function manage_answer($exeId, $questionId, $choice, $from = 'exercise_show', $exerciseResultCoordinates = array(), $saved_results = true, $from_database = false, $show_result = true, $propagate_neg = 0, $hotspot_delineation_result = array())
    {
        global $debug;
        //needed in order to use in the exercise_attempt() for the time
        global $learnpath_id, $learnpath_item_id;
        require_once api_get_path(LIBRARY_PATH) . 'geometry.lib.php';
        $feedback_type = $this->selectFeedbackType();
        $results_disabled = $this->selectResultsDisabled();
        if ($debug) {
            error_log("<------ manage_answer ------> ");
            error_log('exe_id: ' . $exeId);
            error_log('$from:  ' . $from);
            error_log('$saved_results: ' . intval($saved_results));
            error_log('$from_database: ' . intval($from_database));
            error_log('$show_result: ' . $show_result);
            error_log('$propagate_neg: ' . $propagate_neg);
            error_log('$exerciseResultCoordinates: ' . print_r($exerciseResultCoordinates, 1));
            error_log('$hotspot_delineation_result: ' . print_r($hotspot_delineation_result, 1));
            error_log('$learnpath_id: ' . $learnpath_id);
            error_log('$learnpath_item_id: ' . $learnpath_item_id);
            error_log('$choice: ' . print_r($choice, 1));
        }
        $extra_data = array();
        $final_overlap = 0;
        $final_missing = 0;
        $final_excess = 0;
        $overlap_color = 0;
        $missing_color = 0;
        $excess_color = 0;
        $threadhold1 = 0;
        $threadhold2 = 0;
        $threadhold3 = 0;
        $arrques = null;
        $arrans = null;
        $questionId = intval($questionId);
        $exeId = intval($exeId);
        $TBL_TRACK_ATTEMPT = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
        $table_ans = Database::get_course_table(TABLE_QUIZ_ANSWER);
        // Creates a temporary Question object
        $course_id = api_get_course_int_id();
        $objQuestionTmp = Question::read($questionId, $course_id);
        if ($objQuestionTmp === false) {
            return false;
        }
        $questionName = $objQuestionTmp->selectTitle();
        $questionWeighting = $objQuestionTmp->selectWeighting();
        $answerType = $objQuestionTmp->selectType();
        $quesId = $objQuestionTmp->selectId();
        $extra = $objQuestionTmp->extra;
        $next = 1;
        //not for now
        // Extra information of the question
        if (!empty($extra)) {
            $extra = explode(':', $extra);
            if ($debug) {
                error_log(print_r($extra, 1));
            }
            // Fixes problems with negatives values using intval
            $true_score = floatval(trim($extra[0]));
            $false_score = floatval(trim($extra[1]));
            $doubt_score = floatval(trim($extra[2]));
        }
        $totalWeighting = 0;
        $totalScore = 0;
        // Destruction of the Question object
        unset($objQuestionTmp);
        // Construction of the Answer object
        $objAnswerTmp = new Answer($questionId);
        $nbrAnswers = $objAnswerTmp->selectNbrAnswers();
        if ($debug) {
            error_log('Count of answers: ' . $nbrAnswers);
            error_log('$answerType: ' . $answerType);
        }
        if ($answerType == FREE_ANSWER || $answerType == ORAL_EXPRESSION || $answerType == CALCULATED_ANSWER) {
            $nbrAnswers = 1;
        }
        $nano = null;
        if ($answerType == ORAL_EXPRESSION) {
            require_once api_get_path(LIBRARY_PATH) . 'nanogong.lib.php';
            $exe_info = get_exercise_results_by_attempt($exeId);
            $exe_info = isset($exe_info[$exeId]) ? $exe_info[$exeId] : null;
            $params = array();
            $params['course_id'] = api_get_course_int_id();
            $params['session_id'] = api_get_session_id();
            $params['user_id'] = isset($exe_info['exe_user_id']) ? $exe_info['exe_user_id'] : api_get_user_id();
            $params['exercise_id'] = isset($exe_info['exe_exo_id']) ? $exe_info['exe_exo_id'] : $this->id;
            $params['question_id'] = $questionId;
            $params['exe_id'] = isset($exe_info['exe_id']) ? $exe_info['exe_id'] : $exeId;
            $nano = new Nanogong($params);
            //probably this attempt came in an exercise all question by page
            if ($feedback_type == 0) {
                $nano->replace_with_real_exe($exeId);
            }
        }
        $user_answer = '';
        // Get answer list for matching
        $sql_answer = 'SELECT id, answer FROM ' . $table_ans . '
                       WHERE c_id = ' . $course_id . ' AND question_id = "' . $questionId . '"';
        $res_answer = Database::query($sql_answer);
        $answer_matching = array();
        while ($real_answer = Database::fetch_array($res_answer)) {
            $answer_matching[$real_answer['id']] = $real_answer['answer'];
        }
        $real_answers = array();
        $quiz_question_options = Question::readQuestionOption($questionId, $course_id);
        $organs_at_risk_hit = 0;
        $questionScore = 0;
        if ($debug) {
            error_log('Start answer loop ');
        }
        $answer_correct_array = array();
        for ($answerId = 1; $answerId <= $nbrAnswers; $answerId++) {
            $answer = $objAnswerTmp->selectAnswer($answerId);
            $answerComment = $objAnswerTmp->selectComment($answerId);
            $answerCorrect = $objAnswerTmp->isCorrect($answerId);
            $answerWeighting = (double) $objAnswerTmp->selectWeighting($answerId);
            $numAnswer = $objAnswerTmp->selectAutoId($answerId);
            $answer_correct_array[$answerId] = (bool) $answerCorrect;
            if ($debug) {
                error_log("answer auto id: {$numAnswer} ");
                error_log("answer correct: {$answerCorrect} ");
            }
            // Delineation
            $delineation_cord = $objAnswerTmp->selectHotspotCoordinates(1);
            $answer_delineation_destination = $objAnswerTmp->selectDestination(1);
            switch ($answerType) {
                // for unique answer
                case UNIQUE_ANSWER:
                case UNIQUE_ANSWER_NO_OPTION:
                    if ($from_database) {
                        $sql = "SELECT answer FROM {$TBL_TRACK_ATTEMPT}\n                                WHERE\n                                    exe_id = '" . $exeId . "' AND\n                                    question_id= '" . $questionId . "'";
                        $result = Database::query($sql);
                        $choice = Database::result($result, 0, "answer");
                        $studentChoice = $choice == $numAnswer ? 1 : 0;
                        if ($studentChoice) {
                            $questionScore += $answerWeighting;
                            $totalScore += $answerWeighting;
                        }
                    } else {
                        $studentChoice = $choice == $numAnswer ? 1 : 0;
                        if ($studentChoice) {
                            $questionScore += $answerWeighting;
                            $totalScore += $answerWeighting;
                        }
                    }
                    break;
                    // for multiple answers
                // for multiple answers
                case MULTIPLE_ANSWER_TRUE_FALSE:
                    if ($from_database) {
                        $choice = array();
                        $sql = "SELECT answer FROM {$TBL_TRACK_ATTEMPT}\n                                WHERE\n                                    exe_id = {$exeId} AND\n                                    question_id = " . $questionId;
                        $result = Database::query($sql);
                        while ($row = Database::fetch_array($result)) {
                            $ind = $row['answer'];
                            $values = explode(':', $ind);
                            $my_answer_id = $values[0];
                            $option = $values[1];
                            $choice[$my_answer_id] = $option;
                        }
                    }
                    $studentChoice = isset($choice[$numAnswer]) ? $choice[$numAnswer] : null;
                    if (!empty($studentChoice)) {
                        if ($studentChoice == $answerCorrect) {
                            $questionScore += $true_score;
                        } else {
                            if ($quiz_question_options[$studentChoice]['name'] != "Don't know") {
                                $questionScore += $false_score;
                            } else {
                                $questionScore += $doubt_score;
                            }
                        }
                    } else {
                        // If no result then the user just hit don't know
                        $studentChoice = 3;
                        $questionScore += $doubt_score;
                    }
                    $totalScore = $questionScore;
                    break;
                case MULTIPLE_ANSWER:
                    //2
                    if ($from_database) {
                        $choice = array();
                        $queryans = "SELECT answer FROM " . $TBL_TRACK_ATTEMPT . "\n                                     WHERE exe_id = '" . $exeId . "' AND question_id= '" . $questionId . "'";
                        $resultans = Database::query($queryans);
                        while ($row = Database::fetch_array($resultans)) {
                            $ind = $row['answer'];
                            $choice[$ind] = 1;
                        }
                        $studentChoice = isset($choice[$numAnswer]) ? $choice[$numAnswer] : null;
                        $real_answers[$answerId] = (bool) $studentChoice;
                        if ($studentChoice) {
                            $questionScore += $answerWeighting;
                        }
                    } else {
                        $studentChoice = isset($choice[$numAnswer]) ? $choice[$numAnswer] : null;
                        $real_answers[$answerId] = (bool) $studentChoice;
                        if (isset($studentChoice)) {
                            $questionScore += $answerWeighting;
                        }
                    }
                    $totalScore += $answerWeighting;
                    if ($debug) {
                        error_log("studentChoice: {$studentChoice}");
                    }
                    break;
                case GLOBAL_MULTIPLE_ANSWER:
                    if ($from_database) {
                        $choice = array();
                        $sql = "SELECT answer FROM {$TBL_TRACK_ATTEMPT}\n                                WHERE exe_id = '" . $exeId . "' AND question_id= '" . $questionId . "'";
                        $resultans = Database::query($sql);
                        while ($row = Database::fetch_array($resultans)) {
                            $ind = $row['answer'];
                            $choice[$ind] = 1;
                        }
                        $studentChoice = isset($choice[$numAnswer]) ? $choice[$numAnswer] : null;
                        $real_answers[$answerId] = (bool) $studentChoice;
                        if ($studentChoice) {
                            $questionScore += $answerWeighting;
                        }
                    } else {
                        $studentChoice = isset($choice[$numAnswer]) ? $choice[$numAnswer] : null;
                        if (isset($studentChoice)) {
                            $questionScore += $answerWeighting;
                        }
                        $real_answers[$answerId] = (bool) $studentChoice;
                    }
                    $totalScore += $answerWeighting;
                    if ($debug) {
                        error_log("studentChoice: {$studentChoice}");
                    }
                    break;
                case MULTIPLE_ANSWER_COMBINATION_TRUE_FALSE:
                    if ($from_database) {
                        $queryans = "SELECT answer FROM " . $TBL_TRACK_ATTEMPT . "\n                                     WHERE exe_id = " . $exeId . " AND question_id= " . $questionId;
                        $resultans = Database::query($queryans);
                        while ($row = Database::fetch_array($resultans)) {
                            $ind = $row['answer'];
                            $result = explode(':', $ind);
                            $my_answer_id = $result[0];
                            $option = $result[1];
                            $choice[$my_answer_id] = $option;
                        }
                        $numAnswer = $objAnswerTmp->selectAutoId($answerId);
                        $studentChoice = $choice[$numAnswer];
                        if ($answerCorrect == $studentChoice) {
                            //$answerCorrect = 1;
                            $real_answers[$answerId] = true;
                        } else {
                            //$answerCorrect = 0;
                            $real_answers[$answerId] = false;
                        }
                    } else {
                        $studentChoice = $choice[$numAnswer];
                        if ($answerCorrect == $studentChoice) {
                            //$answerCorrect = 1;
                            $real_answers[$answerId] = true;
                        } else {
                            //$answerCorrect = 0;
                            $real_answers[$answerId] = false;
                        }
                    }
                    break;
                case MULTIPLE_ANSWER_COMBINATION:
                    if ($from_database) {
                        $queryans = "SELECT answer FROM " . $TBL_TRACK_ATTEMPT . "\n                                     WHERE exe_id = '" . $exeId . "' and question_id= '" . $questionId . "'";
                        $resultans = Database::query($queryans);
                        while ($row = Database::fetch_array($resultans)) {
                            $ind = $row['answer'];
                            $choice[$ind] = 1;
                        }
                        $numAnswer = $objAnswerTmp->selectAutoId($answerId);
                        $studentChoice = $choice[$numAnswer];
                        if ($answerCorrect == 1) {
                            if ($studentChoice) {
                                $real_answers[$answerId] = true;
                            } else {
                                $real_answers[$answerId] = false;
                            }
                        } else {
                            if ($studentChoice) {
                                $real_answers[$answerId] = false;
                            } else {
                                $real_answers[$answerId] = true;
                            }
                        }
                    } else {
                        $studentChoice = $choice[$numAnswer];
                        if ($answerCorrect == 1) {
                            if ($studentChoice) {
                                $real_answers[$answerId] = true;
                            } else {
                                $real_answers[$answerId] = false;
                            }
                        } else {
                            if ($studentChoice) {
                                $real_answers[$answerId] = false;
                            } else {
                                $real_answers[$answerId] = true;
                            }
                        }
                    }
                    break;
                    // for fill in the blanks
                // for fill in the blanks
                case FILL_IN_BLANKS:
                    // the question is encoded like this
                    // [A] B [C] D [E] F::10,10,10@1
                    // number 1 before the "@" means that is a switchable fill in blank question
                    // [A] B [C] D [E] F::10,10,10@ or  [A] B [C] D [E] F::10,10,10
                    // means that is a normal fill blank question
                    // first we explode the "::"
                    $pre_array = explode('::', $answer);
                    // is switchable fill blank or not
                    $last = count($pre_array) - 1;
                    $is_set_switchable = explode('@', $pre_array[$last]);
                    $switchable_answer_set = false;
                    if (isset($is_set_switchable[1]) && $is_set_switchable[1] == 1) {
                        $switchable_answer_set = true;
                    }
                    $answer = '';
                    for ($k = 0; $k < $last; $k++) {
                        $answer .= $pre_array[$k];
                    }
                    // splits weightings that are joined with a comma
                    $answerWeighting = explode(',', $is_set_switchable[0]);
                    // we save the answer because it will be modified
                    $temp = $answer;
                    $answer = '';
                    $j = 0;
                    //initialise answer tags
                    $user_tags = $correct_tags = $real_text = array();
                    // the loop will stop at the end of the text
                    while (1) {
                        // quits the loop if there are no more blanks (detect '[')
                        if (($pos = api_strpos($temp, '[')) === false) {
                            // adds the end of the text
                            $answer = $temp;
                            $real_text[] = $answer;
                            break;
                            //no more "blanks", quit the loop
                        }
                        // adds the piece of text that is before the blank
                        //and ends with '[' into a general storage array
                        $real_text[] = api_substr($temp, 0, $pos + 1);
                        $answer .= api_substr($temp, 0, $pos + 1);
                        //take the string remaining (after the last "[" we found)
                        $temp = api_substr($temp, $pos + 1);
                        // quit the loop if there are no more blanks, and update $pos to the position of next ']'
                        if (($pos = api_strpos($temp, ']')) === false) {
                            // adds the end of the text
                            $answer .= $temp;
                            break;
                        }
                        if ($from_database) {
                            $queryfill = "SELECT answer FROM " . $TBL_TRACK_ATTEMPT . "\n                                          WHERE\n                                            exe_id = '" . $exeId . "' AND\n                                            question_id= " . intval($questionId) . "";
                            $resfill = Database::query($queryfill);
                            $str = Database::result($resfill, 0, 'answer');
                            api_preg_match_all('#\\[([^[]*)\\]#', $str, $arr);
                            $str = str_replace('\\r\\n', '', $str);
                            $choice = $arr[1];
                            if (isset($choice[$j])) {
                                $tmp = api_strrpos($choice[$j], ' / ');
                                $choice[$j] = api_substr($choice[$j], 0, $tmp);
                                $choice[$j] = trim($choice[$j]);
                                // Needed to let characters ' and " to work as part of an answer
                                $choice[$j] = stripslashes($choice[$j]);
                            } else {
                                $choice[$j] = null;
                            }
                        } else {
                            // This value is the user input, not escaped while correct answer is escaped by fckeditor
                            $choice[$j] = api_htmlentities(trim($choice[$j]));
                        }
                        $user_tags[] = $choice[$j];
                        //put the contents of the [] answer tag into correct_tags[]
                        $correct_tags[] = api_substr($temp, 0, $pos);
                        $j++;
                        $temp = api_substr($temp, $pos + 1);
                    }
                    $answer = '';
                    $real_correct_tags = $correct_tags;
                    $chosen_list = array();
                    for ($i = 0; $i < count($real_correct_tags); $i++) {
                        if ($i == 0) {
                            $answer .= $real_text[0];
                        }
                        if (!$switchable_answer_set) {
                            // Needed to parse ' and " characters
                            $user_tags[$i] = stripslashes($user_tags[$i]);
                            if ($correct_tags[$i] == $user_tags[$i]) {
                                // gives the related weighting to the student
                                $questionScore += $answerWeighting[$i];
                                // increments total score
                                $totalScore += $answerWeighting[$i];
                                // adds the word in green at the end of the string
                                $answer .= $correct_tags[$i];
                            } elseif (!empty($user_tags[$i])) {
                                // else if the word entered by the student IS NOT the same as the one defined by the professor
                                // adds the word in red at the end of the string, and strikes it
                                $answer .= '<font color="red"><s>' . $user_tags[$i] . '</s></font>';
                            } else {
                                // adds a tabulation if no word has been typed by the student
                                $answer .= '';
                                // remove &nbsp; that causes issue
                            }
                        } else {
                            // switchable fill in the blanks
                            if (in_array($user_tags[$i], $correct_tags)) {
                                $chosen_list[] = $user_tags[$i];
                                $correct_tags = array_diff($correct_tags, $chosen_list);
                                // gives the related weighting to the student
                                $questionScore += $answerWeighting[$i];
                                // increments total score
                                $totalScore += $answerWeighting[$i];
                                // adds the word in green at the end of the string
                                $answer .= $user_tags[$i];
                            } elseif (!empty($user_tags[$i])) {
                                // else if the word entered by the student IS NOT the same as the one defined by the professor
                                // adds the word in red at the end of the string, and strikes it
                                $answer .= '<font color="red"><s>' . $user_tags[$i] . '</s></font>';
                            } else {
                                // adds a tabulation if no word has been typed by the student
                                $answer .= '';
                                // remove &nbsp; that causes issue
                            }
                        }
                        // adds the correct word, followed by ] to close the blank
                        $answer .= ' / <font color="green"><b>' . $real_correct_tags[$i] . '</b></font>]';
                        if (isset($real_text[$i + 1])) {
                            $answer .= $real_text[$i + 1];
                        }
                    }
                    break;
                    // for calculated answer
                // for calculated answer
                case CALCULATED_ANSWER:
                    $answer = $objAnswerTmp->selectAnswer($_SESSION['calculatedAnswerId'][$questionId]);
                    $preArray = explode('@@', $answer);
                    $last = count($preArray) - 1;
                    $answer = '';
                    for ($k = 0; $k < $last; $k++) {
                        $answer .= $preArray[$k];
                    }
                    $answerWeighting = array($answerWeighting);
                    // we save the answer because it will be modified
                    $temp = $answer;
                    $answer = '';
                    $j = 0;
                    //initialise answer tags
                    $userTags = $correctTags = $realText = array();
                    // the loop will stop at the end of the text
                    while (1) {
                        // quits the loop if there are no more blanks (detect '[')
                        if (($pos = api_strpos($temp, '[')) === false) {
                            // adds the end of the text
                            $answer = $temp;
                            $realText[] = $answer;
                            break;
                            //no more "blanks", quit the loop
                        }
                        // adds the piece of text that is before the blank
                        //and ends with '[' into a general storage array
                        $realText[] = api_substr($temp, 0, $pos + 1);
                        $answer .= api_substr($temp, 0, $pos + 1);
                        //take the string remaining (after the last "[" we found)
                        $temp = api_substr($temp, $pos + 1);
                        // quit the loop if there are no more blanks, and update $pos to the position of next ']'
                        if (($pos = api_strpos($temp, ']')) === false) {
                            // adds the end of the text
                            $answer .= $temp;
                            break;
                        }
                        if ($from_database) {
                            $queryfill = "SELECT answer FROM " . $TBL_TRACK_ATTEMPT . "\n                                          WHERE\n                                            exe_id = '" . $exeId . "' AND\n                                            question_id= " . intval($questionId) . "";
                            $resfill = Database::query($queryfill);
                            $str = Database::result($resfill, 0, 'answer');
                            api_preg_match_all('#\\[([^[]*)\\]#', $str, $arr);
                            $str = str_replace('\\r\\n', '', $str);
                            $choice = $arr[1];
                            if (isset($choice[$j])) {
                                $tmp = api_strrpos($choice[$j], ' / ');
                                $choice[$j] = api_substr($choice[$j], 0, $tmp);
                                $choice[$j] = trim($choice[$j]);
                                // Needed to let characters ' and " to work as part of an answer
                                $choice[$j] = stripslashes($choice[$j]);
                            } else {
                                $choice[$j] = null;
                            }
                        } else {
                            // This value is the user input, not escaped while correct answer is escaped by fckeditor
                            $choice[$j] = api_htmlentities(trim($choice[$j]));
                        }
                        $userTags[] = $choice[$j];
                        //put the contents of the [] answer tag into correct_tags[]
                        $correctTags[] = api_substr($temp, 0, $pos);
                        $j++;
                        $temp = api_substr($temp, $pos + 1);
                    }
                    $answer = '';
                    $realCorrectTags = $correctTags;
                    for ($i = 0; $i < count($realCorrectTags); $i++) {
                        if ($i == 0) {
                            $answer .= $realText[0];
                        }
                        // Needed to parse ' and " characters
                        $userTags[$i] = stripslashes($userTags[$i]);
                        if ($correctTags[$i] == $userTags[$i]) {
                            // gives the related weighting to the student
                            $questionScore += $answerWeighting[$i];
                            // increments total score
                            $totalScore += $answerWeighting[$i];
                            // adds the word in green at the end of the string
                            $answer .= $correctTags[$i];
                        } elseif (!empty($userTags[$i])) {
                            // else if the word entered by the student IS NOT the same as the one defined by the professor
                            // adds the word in red at the end of the string, and strikes it
                            $answer .= '<font color="red"><s>' . $userTags[$i] . '</s></font>';
                        } else {
                            // adds a tabulation if no word has been typed by the student
                            $answer .= '';
                            // remove &nbsp; that causes issue
                        }
                        // adds the correct word, followed by ] to close the blank
                        $answer .= ' / <font color="green"><b>' . $realCorrectTags[$i] . '</b></font>]';
                        if (isset($realText[$i + 1])) {
                            $answer .= $realText[$i + 1];
                        }
                    }
                    break;
                    // for free answer
                // for free answer
                case FREE_ANSWER:
                    if ($from_database) {
                        $query = "SELECT answer, marks FROM " . $TBL_TRACK_ATTEMPT . " WHERE exe_id = '" . $exeId . "' AND question_id= '" . $questionId . "'";
                        $resq = Database::query($query);
                        $choice = Database::result($resq, 0, 'answer');
                        $choice = str_replace('\\r\\n', '', $choice);
                        $choice = stripslashes($choice);
                        $questionScore = Database::result($resq, 0, "marks");
                        if ($questionScore == -1) {
                            $totalScore += 0;
                        } else {
                            $totalScore += $questionScore;
                        }
                        if ($questionScore == '') {
                            $questionScore = 0;
                        }
                        $arrques = $questionName;
                        $arrans = $choice;
                    } else {
                        $studentChoice = $choice;
                        if ($studentChoice) {
                            //Fixing negative puntation see #2193
                            $questionScore = 0;
                            $totalScore += 0;
                        }
                    }
                    break;
                case ORAL_EXPRESSION:
                    if ($from_database) {
                        $query = "SELECT answer, marks FROM " . $TBL_TRACK_ATTEMPT . " WHERE exe_id = '" . $exeId . "' AND question_id= '" . $questionId . "'";
                        $resq = Database::query($query);
                        $choice = Database::result($resq, 0, 'answer');
                        $choice = str_replace('\\r\\n', '', $choice);
                        $choice = stripslashes($choice);
                        $questionScore = Database::result($resq, 0, "marks");
                        if ($questionScore == -1) {
                            $totalScore += 0;
                        } else {
                            $totalScore += $questionScore;
                        }
                        $arrques = $questionName;
                        $arrans = $choice;
                    } else {
                        $studentChoice = $choice;
                        if ($studentChoice) {
                            //Fixing negative puntation see #2193
                            $questionScore = 0;
                            $totalScore += 0;
                        }
                    }
                    break;
                case MATCHING:
                    if ($from_database) {
                        $sql_answer = 'SELECT id, answer, id_auto FROM ' . $table_ans . ' WHERE c_id = ' . $course_id . ' AND question_id="' . $questionId . '" AND correct = 0';
                        $res_answer = Database::query($sql_answer);
                        // Getting the real answer
                        $real_list = array();
                        while ($real_answer = Database::fetch_array($res_answer)) {
                            $real_list[$real_answer['id']] = $real_answer['answer'];
                        }
                        $sql_select_answer = 'SELECT id, answer, correct, id_auto, ponderation FROM ' . $table_ans . '
                                              WHERE c_id = ' . $course_id . ' AND question_id="' . $questionId . '" AND correct <> 0
                                              ORDER BY id_auto';
                        $res_answers = Database::query($sql_select_answer);
                        $questionScore = 0;
                        while ($a_answers = Database::fetch_array($res_answers)) {
                            $i_answer_id = $a_answers['id'];
                            //3
                            $s_answer_label = $a_answers['answer'];
                            // your daddy - your mother
                            $i_answer_correct_answer = $a_answers['correct'];
                            //1 - 2
                            $i_answer_id_auto = $a_answers['id_auto'];
                            // 3 - 4
                            $sql_user_answer = "SELECT answer FROM {$TBL_TRACK_ATTEMPT}\n                                                WHERE exe_id = '{$exeId}' AND question_id = '{$questionId}' AND position = '{$i_answer_id_auto}'";
                            $res_user_answer = Database::query($sql_user_answer);
                            if (Database::num_rows($res_user_answer) > 0) {
                                $s_user_answer = Database::result($res_user_answer, 0, 0);
                                //  rich - good looking
                                //$s_user_answer = Database::result($res_user_answer, 0, 1); //  rich - good looking
                            } else {
                                $s_user_answer = 0;
                            }
                            //$i_answerWeighting = $objAnswerTmp->selectWeighting($i_answer_id);
                            $i_answerWeighting = $a_answers['ponderation'];
                            $user_answer = '';
                            if (!empty($s_user_answer)) {
                                if ($s_user_answer == $i_answer_correct_answer) {
                                    $questionScore += $i_answerWeighting;
                                    $totalScore += $i_answerWeighting;
                                    $user_answer = '<span>' . $real_list[$i_answer_id] . '</span>';
                                } else {
                                    $user_answer = '<span style="color: #FF0000; text-decoration: line-through;">' . $real_list[$s_user_answer] . '</span>';
                                }
                            }
                            if ($show_result) {
                                echo '<tr>';
                                echo '<td>' . $s_answer_label . '</td>';
                                echo '<td>' . $user_answer;
                                echo ' <b><span style="color: #008000;">' . $real_list[$i_answer_correct_answer] . '</span></b> ';
                                echo '</td>';
                                echo '</tr>';
                            }
                        }
                        break 2;
                        // break the switch and the "for" condition
                    } else {
                        $numAnswer = $objAnswerTmp->selectAutoId($answerId);
                        if ($answerCorrect) {
                            if ($answerCorrect == $choice[$numAnswer]) {
                                $questionScore += $answerWeighting;
                                $totalScore += $answerWeighting;
                                $user_answer = '<span>' . $answer_matching[$choice[$numAnswer]] . '</span>';
                            } else {
                                $user_answer = '<span style="color: #FF0000; text-decoration: line-through;">' . $answer_matching[$choice[$numAnswer]] . '</span>';
                            }
                            $matching[$numAnswer] = $choice[$numAnswer];
                        }
                        break;
                    }
                case HOT_SPOT:
                    if ($from_database) {
                        $TBL_TRACK_HOTSPOT = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
                        $sql = "SELECT hotspot_correct\n                                FROM {$TBL_TRACK_HOTSPOT}\n                                WHERE\n                                    hotspot_exe_id = '" . $exeId . "' AND\n                                    hotspot_question_id= '" . $questionId . "' AND\n                                    hotspot_answer_id = " . intval($answerId) . "";
                        $result = Database::query($sql);
                        $studentChoice = Database::result($result, 0, "hotspot_correct");
                        if ($studentChoice) {
                            $questionScore += $answerWeighting;
                            $totalScore += $answerWeighting;
                        }
                    } else {
                        $studentChoice = $choice[$answerId];
                        if ($studentChoice) {
                            $questionScore += $answerWeighting;
                            $totalScore += $answerWeighting;
                        }
                    }
                    break;
                    // @todo never added to chamilo
                    //for hotspot with fixed order
                // @todo never added to chamilo
                //for hotspot with fixed order
                case HOT_SPOT_ORDER:
                    $studentChoice = $choice['order'][$answerId];
                    if ($studentChoice == $answerId) {
                        $questionScore += $answerWeighting;
                        $totalScore += $answerWeighting;
                        $studentChoice = true;
                    } else {
                        $studentChoice = false;
                    }
                    break;
                    // for hotspot with delineation
                // for hotspot with delineation
                case HOT_SPOT_DELINEATION:
                    if ($from_database) {
                        // getting the user answer
                        $TBL_TRACK_HOTSPOT = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
                        $query = "SELECT hotspot_correct, hotspot_coordinate\n                                    FROM {$TBL_TRACK_HOTSPOT}\n                                    WHERE\n                                        hotspot_exe_id = '" . $exeId . "' AND\n                                        hotspot_question_id= '" . $questionId . "' AND\n                                        hotspot_answer_id='1'";
                        //by default we take 1 because it's a delineation
                        $resq = Database::query($query);
                        $row = Database::fetch_array($resq, 'ASSOC');
                        $choice = $row['hotspot_correct'];
                        $user_answer = $row['hotspot_coordinate'];
                        // THIS is very important otherwise the poly_compile will throw an error!!
                        // round-up the coordinates
                        $coords = explode('/', $user_answer);
                        $user_array = '';
                        foreach ($coords as $coord) {
                            list($x, $y) = explode(';', $coord);
                            $user_array .= round($x) . ';' . round($y) . '/';
                        }
                        $user_array = substr($user_array, 0, -1);
                    } else {
                        if ($studentChoice) {
                            $newquestionList[] = $questionId;
                        }
                        if ($answerId === 1) {
                            $studentChoice = $choice[$answerId];
                            $questionScore += $answerWeighting;
                            if ($hotspot_delineation_result[1] == 1) {
                                $totalScore += $answerWeighting;
                                //adding the total
                            }
                        }
                    }
                    $_SESSION['hotspot_coord'][1] = $delineation_cord;
                    $_SESSION['hotspot_dest'][1] = $answer_delineation_destination;
                    break;
            }
            // end switch Answertype
            global $origin;
            if ($show_result) {
                if ($debug) {
                    error_log('show result ' . $show_result);
                }
                if ($from == 'exercise_result') {
                    if ($debug) {
                        error_log('Showing questions $from ' . $from);
                    }
                    //display answers (if not matching type, or if the answer is correct)
                    if ($answerType != MATCHING || $answerCorrect) {
                        if (in_array($answerType, array(UNIQUE_ANSWER, UNIQUE_ANSWER_NO_OPTION, MULTIPLE_ANSWER, MULTIPLE_ANSWER_COMBINATION, GLOBAL_MULTIPLE_ANSWER))) {
                            //if ($origin != 'learnpath') {
                            ExerciseShowFunctions::display_unique_or_multiple_answer($feedback_type, $answerType, $studentChoice, $answer, $answerComment, $answerCorrect, 0, 0, 0, $results_disabled);
                            //}
                        } elseif ($answerType == MULTIPLE_ANSWER_TRUE_FALSE) {
                            //if ($origin!='learnpath') {
                            ExerciseShowFunctions::display_multiple_answer_true_false($feedback_type, $answerType, $studentChoice, $answer, $answerComment, $answerCorrect, 0, $questionId, 0, $results_disabled);
                            //}
                        } elseif ($answerType == MULTIPLE_ANSWER_COMBINATION_TRUE_FALSE) {
                            //	if ($origin!='learnpath') {
                            ExerciseShowFunctions::display_multiple_answer_combination_true_false($feedback_type, $answerType, $studentChoice, $answer, $answerComment, $answerCorrect, 0, 0, 0, $results_disabled);
                            //}
                        } elseif ($answerType == FILL_IN_BLANKS) {
                            //if ($origin!='learnpath') {
                            ExerciseShowFunctions::display_fill_in_blanks_answer($feedback_type, $answer, 0, 0);
                            //	}
                        } elseif ($answerType == CALCULATED_ANSWER) {
                            //if ($origin!='learnpath') {
                            ExerciseShowFunctions::display_calculated_answer($feedback_type, $answer, 0, 0);
                            //  }
                        } elseif ($answerType == FREE_ANSWER) {
                            //if($origin != 'learnpath') {
                            ExerciseShowFunctions::display_free_answer($feedback_type, $choice, $exeId, $questionId, $questionScore);
                            //}
                        } elseif ($answerType == ORAL_EXPRESSION) {
                            // to store the details of open questions in an array to be used in mail
                            //if ($origin != 'learnpath') {
                            ExerciseShowFunctions::display_oral_expression_answer($feedback_type, $choice, 0, 0, $nano);
                            //}
                        } elseif ($answerType == HOT_SPOT) {
                            //if ($origin != 'learnpath') {
                            ExerciseShowFunctions::display_hotspot_answer($feedback_type, $answerId, $answer, $studentChoice, $answerComment, $results_disabled);
                            //	}
                        } elseif ($answerType == HOT_SPOT_ORDER) {
                            //if ($origin != 'learnpath') {
                            ExerciseShowFunctions::display_hotspot_order_answer($feedback_type, $answerId, $answer, $studentChoice, $answerComment);
                            //}
                        } elseif ($answerType == HOT_SPOT_DELINEATION) {
                            $user_answer = $_SESSION['exerciseResultCoordinates'][$questionId];
                            //round-up the coordinates
                            $coords = explode('/', $user_answer);
                            $user_array = '';
                            foreach ($coords as $coord) {
                                list($x, $y) = explode(';', $coord);
                                $user_array .= round($x) . ';' . round($y) . '/';
                            }
                            $user_array = substr($user_array, 0, -1);
                            if ($next) {
                                //$tbl_track_e_hotspot = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
                                // Save into db
                                /*	$sql = "INSERT INTO $tbl_track_e_hotspot (hotspot_user_id, hotspot_course_code, hotspot_exe_id, hotspot_question_id, hotspot_answer_id, hotspot_correct, hotspot_coordinate )
                                   VALUES ('".Database::escape_string($_user['user_id'])."', '".Database::escape_string($_course['id'])."', '".Database::escape_string($exeId)."', '".Database::escape_string($questionId)."', '".Database::escape_string($answerId)."', '".Database::escape_string($studentChoice)."', '".Database::escape_string($user_array)."')";
                                   $result = api_sql_query($sql,__FILE__,__LINE__);*/
                                $user_answer = $user_array;
                                // we compare only the delineation not the other points
                                $answer_question = $_SESSION['hotspot_coord'][1];
                                $answerDestination = $_SESSION['hotspot_dest'][1];
                                //calculating the area
                                $poly_user = convert_coordinates($user_answer, '/');
                                $poly_answer = convert_coordinates($answer_question, '|');
                                $max_coord = poly_get_max($poly_user, $poly_answer);
                                $poly_user_compiled = poly_compile($poly_user, $max_coord);
                                $poly_answer_compiled = poly_compile($poly_answer, $max_coord);
                                $poly_results = poly_result($poly_answer_compiled, $poly_user_compiled, $max_coord);
                                $overlap = $poly_results['both'];
                                $poly_answer_area = $poly_results['s1'];
                                $poly_user_area = $poly_results['s2'];
                                $missing = $poly_results['s1Only'];
                                $excess = $poly_results['s2Only'];
                                //$overlap = round(polygons_overlap($poly_answer,$poly_user)); //this is an area in pixels
                                if ($debug > 0) {
                                    error_log(__LINE__ . ' - Polygons results are ' . print_r($poly_results, 1), 0);
                                }
                                if ($overlap < 1) {
                                    //shortcut to avoid complicated calculations
                                    $final_overlap = 0;
                                    $final_missing = 100;
                                    $final_excess = 100;
                                } else {
                                    // the final overlap is the percentage of the initial polygon that is overlapped by the user's polygon
                                    $final_overlap = round((double) $overlap / (double) $poly_answer_area * 100);
                                    if ($debug > 1) {
                                        error_log(__LINE__ . ' - Final overlap is ' . $final_overlap, 0);
                                    }
                                    // the final missing area is the percentage of the initial polygon that is not overlapped by the user's polygon
                                    $final_missing = 100 - $final_overlap;
                                    if ($debug > 1) {
                                        error_log(__LINE__ . ' - Final missing is ' . $final_missing, 0);
                                    }
                                    // the final excess area is the percentage of the initial polygon's size that is covered by the user's polygon outside of the initial polygon
                                    $final_excess = round(((double) $poly_user_area - (double) $overlap) / (double) $poly_answer_area * 100);
                                    if ($debug > 1) {
                                        error_log(__LINE__ . ' - Final excess is ' . $final_excess, 0);
                                    }
                                }
                                //checking the destination parameters parsing the "@@"
                                $destination_items = explode('@@', $answerDestination);
                                $threadhold_total = $destination_items[0];
                                $threadhold_items = explode(';', $threadhold_total);
                                $threadhold1 = $threadhold_items[0];
                                // overlap
                                $threadhold2 = $threadhold_items[1];
                                // excess
                                $threadhold3 = $threadhold_items[2];
                                //missing
                                // if is delineation
                                if ($answerId === 1) {
                                    //setting colors
                                    if ($final_overlap >= $threadhold1) {
                                        $overlap_color = true;
                                        //echo 'a';
                                    }
                                    //echo $excess.'-'.$threadhold2;
                                    if ($final_excess <= $threadhold2) {
                                        $excess_color = true;
                                        //echo 'b';
                                    }
                                    //echo '--------'.$missing.'-'.$threadhold3;
                                    if ($final_missing <= $threadhold3) {
                                        $missing_color = true;
                                        //echo 'c';
                                    }
                                    // if pass
                                    if ($final_overlap >= $threadhold1 && $final_missing <= $threadhold3 && $final_excess <= $threadhold2) {
                                        $next = 1;
                                        //go to the oars
                                        $result_comment = get_lang('Acceptable');
                                        $final_answer = 1;
                                        // do not update with  update_exercise_attempt
                                    } else {
                                        $next = 0;
                                        $result_comment = get_lang('Unacceptable');
                                        $comment = $answerDestination = $objAnswerTmp->selectComment(1);
                                        $answerDestination = $objAnswerTmp->selectDestination(1);
                                        //checking the destination parameters parsing the "@@"
                                        $destination_items = explode('@@', $answerDestination);
                                    }
                                } elseif ($answerId > 1) {
                                    if ($objAnswerTmp->selectHotspotType($answerId) == 'noerror') {
                                        if ($debug > 0) {
                                            error_log(__LINE__ . ' - answerId is of type noerror', 0);
                                        }
                                        //type no error shouldn't be treated
                                        $next = 1;
                                        continue;
                                    }
                                    if ($debug > 0) {
                                        error_log(__LINE__ . ' - answerId is >1 so we\'re probably in OAR', 0);
                                    }
                                    //check the intersection between the oar and the user
                                    //echo 'user';	print_r($x_user_list);		print_r($y_user_list);
                                    //echo 'official';print_r($x_list);print_r($y_list);
                                    //$result = get_intersection_data($x_list,$y_list,$x_user_list,$y_user_list);
                                    $inter = $result['success'];
                                    //$delineation_cord=$objAnswerTmp->selectHotspotCoordinates($answerId);
                                    $delineation_cord = $objAnswerTmp->selectHotspotCoordinates($answerId);
                                    $poly_answer = convert_coordinates($delineation_cord, '|');
                                    $max_coord = poly_get_max($poly_user, $poly_answer);
                                    $poly_answer_compiled = poly_compile($poly_answer, $max_coord);
                                    $overlap = poly_touch($poly_user_compiled, $poly_answer_compiled, $max_coord);
                                    if ($overlap == false) {
                                        //all good, no overlap
                                        $next = 1;
                                        continue;
                                    } else {
                                        if ($debug > 0) {
                                            error_log(__LINE__ . ' - Overlap is ' . $overlap . ': OAR hit', 0);
                                        }
                                        $organs_at_risk_hit++;
                                        //show the feedback
                                        $next = 0;
                                        $comment = $answerDestination = $objAnswerTmp->selectComment($answerId);
                                        $answerDestination = $objAnswerTmp->selectDestination($answerId);
                                        $destination_items = explode('@@', $answerDestination);
                                        $try_hotspot = $destination_items[1];
                                        $lp_hotspot = $destination_items[2];
                                        $select_question_hotspot = $destination_items[3];
                                        $url_hotspot = $destination_items[4];
                                    }
                                }
                            } else {
                                // the first delineation feedback
                                if ($debug > 0) {
                                    error_log(__LINE__ . ' first', 0);
                                }
                            }
                        } elseif ($answerType == MATCHING) {
                            // if ($origin != 'learnpath') {
                            echo '<tr>';
                            echo '<td>' . $answer_matching[$answerId] . '</td><td>' . $user_answer . ' / <b><span style="color: #008000;">' . $answer_matching[$answerCorrect] . '</span></b></td>';
                            echo '</tr>';
                            //}
                        }
                    }
                } else {
                    if ($debug) {
                        error_log('Showing questions $from ' . $from);
                    }
                    switch ($answerType) {
                        case UNIQUE_ANSWER:
                        case UNIQUE_ANSWER_NO_OPTION:
                        case MULTIPLE_ANSWER:
                        case GLOBAL_MULTIPLE_ANSWER:
                        case MULTIPLE_ANSWER_COMBINATION:
                            if ($answerId == 1) {
                                ExerciseShowFunctions::display_unique_or_multiple_answer($feedback_type, $answerType, $studentChoice, $answer, $answerComment, $answerCorrect, $exeId, $questionId, $answerId, $results_disabled);
                            } else {
                                ExerciseShowFunctions::display_unique_or_multiple_answer($feedback_type, $answerType, $studentChoice, $answer, $answerComment, $answerCorrect, $exeId, $questionId, "", $results_disabled);
                            }
                            break;
                        case MULTIPLE_ANSWER_COMBINATION_TRUE_FALSE:
                            if ($answerId == 1) {
                                ExerciseShowFunctions::display_multiple_answer_combination_true_false($feedback_type, $answerType, $studentChoice, $answer, $answerComment, $answerCorrect, $exeId, $questionId, $answerId, $results_disabled);
                            } else {
                                ExerciseShowFunctions::display_multiple_answer_combination_true_false($feedback_type, $answerType, $studentChoice, $answer, $answerComment, $answerCorrect, $exeId, $questionId, "", $results_disabled);
                            }
                            break;
                        case MULTIPLE_ANSWER_TRUE_FALSE:
                            if ($answerId == 1) {
                                ExerciseShowFunctions::display_multiple_answer_true_false($feedback_type, $answerType, $studentChoice, $answer, $answerComment, $answerCorrect, $exeId, $questionId, $answerId, $results_disabled);
                            } else {
                                ExerciseShowFunctions::display_multiple_answer_true_false($feedback_type, $answerType, $studentChoice, $answer, $answerComment, $answerCorrect, $exeId, $questionId, "", $results_disabled);
                            }
                            break;
                        case FILL_IN_BLANKS:
                            ExerciseShowFunctions::display_fill_in_blanks_answer($feedback_type, $answer, $exeId, $questionId);
                            break;
                        case CALCULATED_ANSWER:
                            ExerciseShowFunctions::display_calculated_answer($feedback_type, $answer, $exeId, $questionId);
                            break;
                        case FREE_ANSWER:
                            echo ExerciseShowFunctions::display_free_answer($feedback_type, $choice, $exeId, $questionId, $questionScore);
                            break;
                        case ORAL_EXPRESSION:
                            echo '<tr>
		                            <td valign="top">' . ExerciseShowFunctions::display_oral_expression_answer($feedback_type, $choice, $exeId, $questionId, $nano) . '</td>
		                            </tr>
		                            </table>';
                            break;
                        case HOT_SPOT:
                            ExerciseShowFunctions::display_hotspot_answer($feedback_type, $answerId, $answer, $studentChoice, $answerComment, $results_disabled);
                            break;
                        case HOT_SPOT_DELINEATION:
                            $user_answer = $user_array;
                            if ($next) {
                                //$tbl_track_e_hotspot = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
                                // Save into db
                                /*	$sql = "INSERT INTO $tbl_track_e_hotspot (hotspot_user_id, hotspot_course_code, hotspot_exe_id, hotspot_question_id, hotspot_answer_id, hotspot_correct, hotspot_coordinate )
                                   VALUES ('".Database::escape_string($_user['user_id'])."', '".Database::escape_string($_course['id'])."', '".Database::escape_string($exeId)."', '".Database::escape_string($questionId)."', '".Database::escape_string($answerId)."', '".Database::escape_string($studentChoice)."', '".Database::escape_string($user_array)."')";
                                   $result = api_sql_query($sql,__FILE__,__LINE__);*/
                                $user_answer = $user_array;
                                // we compare only the delineation not the other points
                                $answer_question = $_SESSION['hotspot_coord'][1];
                                $answerDestination = $_SESSION['hotspot_dest'][1];
                                //calculating the area
                                $poly_user = convert_coordinates($user_answer, '/');
                                $poly_answer = convert_coordinates($answer_question, '|');
                                $max_coord = poly_get_max($poly_user, $poly_answer);
                                $poly_user_compiled = poly_compile($poly_user, $max_coord);
                                $poly_answer_compiled = poly_compile($poly_answer, $max_coord);
                                $poly_results = poly_result($poly_answer_compiled, $poly_user_compiled, $max_coord);
                                $overlap = $poly_results['both'];
                                $poly_answer_area = $poly_results['s1'];
                                $poly_user_area = $poly_results['s2'];
                                $missing = $poly_results['s1Only'];
                                $excess = $poly_results['s2Only'];
                                //$overlap = round(polygons_overlap($poly_answer,$poly_user)); //this is an area in pixels
                                if ($debug > 0) {
                                    error_log(__LINE__ . ' - Polygons results are ' . print_r($poly_results, 1), 0);
                                }
                                if ($overlap < 1) {
                                    //shortcut to avoid complicated calculations
                                    $final_overlap = 0;
                                    $final_missing = 100;
                                    $final_excess = 100;
                                } else {
                                    // the final overlap is the percentage of the initial polygon that is overlapped by the user's polygon
                                    $final_overlap = round((double) $overlap / (double) $poly_answer_area * 100);
                                    if ($debug > 1) {
                                        error_log(__LINE__ . ' - Final overlap is ' . $final_overlap, 0);
                                    }
                                    // the final missing area is the percentage of the initial polygon that is not overlapped by the user's polygon
                                    $final_missing = 100 - $final_overlap;
                                    if ($debug > 1) {
                                        error_log(__LINE__ . ' - Final missing is ' . $final_missing, 0);
                                    }
                                    // the final excess area is the percentage of the initial polygon's size that is covered by the user's polygon outside of the initial polygon
                                    $final_excess = round(((double) $poly_user_area - (double) $overlap) / (double) $poly_answer_area * 100);
                                    if ($debug > 1) {
                                        error_log(__LINE__ . ' - Final excess is ' . $final_excess, 0);
                                    }
                                }
                                //checking the destination parameters parsing the "@@"
                                $destination_items = explode('@@', $answerDestination);
                                $threadhold_total = $destination_items[0];
                                $threadhold_items = explode(';', $threadhold_total);
                                $threadhold1 = $threadhold_items[0];
                                // overlap
                                $threadhold2 = $threadhold_items[1];
                                // excess
                                $threadhold3 = $threadhold_items[2];
                                //missing
                                // if is delineation
                                if ($answerId === 1) {
                                    //setting colors
                                    if ($final_overlap >= $threadhold1) {
                                        $overlap_color = true;
                                        //echo 'a';
                                    }
                                    //echo $excess.'-'.$threadhold2;
                                    if ($final_excess <= $threadhold2) {
                                        $excess_color = true;
                                        //echo 'b';
                                    }
                                    //echo '--------'.$missing.'-'.$threadhold3;
                                    if ($final_missing <= $threadhold3) {
                                        $missing_color = true;
                                        //echo 'c';
                                    }
                                    // if pass
                                    if ($final_overlap >= $threadhold1 && $final_missing <= $threadhold3 && $final_excess <= $threadhold2) {
                                        $next = 1;
                                        //go to the oars
                                        $result_comment = get_lang('Acceptable');
                                        $final_answer = 1;
                                        // do not update with  update_exercise_attempt
                                    } else {
                                        $next = 0;
                                        $result_comment = get_lang('Unacceptable');
                                        $comment = $answerDestination = $objAnswerTmp->selectComment(1);
                                        $answerDestination = $objAnswerTmp->selectDestination(1);
                                        //checking the destination parameters parsing the "@@"
                                        $destination_items = explode('@@', $answerDestination);
                                    }
                                } elseif ($answerId > 1) {
                                    if ($objAnswerTmp->selectHotspotType($answerId) == 'noerror') {
                                        if ($debug > 0) {
                                            error_log(__LINE__ . ' - answerId is of type noerror', 0);
                                        }
                                        //type no error shouldn't be treated
                                        $next = 1;
                                        continue;
                                    }
                                    if ($debug > 0) {
                                        error_log(__LINE__ . ' - answerId is >1 so we\'re probably in OAR', 0);
                                    }
                                    //check the intersection between the oar and the user
                                    //echo 'user';	print_r($x_user_list);		print_r($y_user_list);
                                    //echo 'official';print_r($x_list);print_r($y_list);
                                    //$result = get_intersection_data($x_list,$y_list,$x_user_list,$y_user_list);
                                    $inter = $result['success'];
                                    //$delineation_cord=$objAnswerTmp->selectHotspotCoordinates($answerId);
                                    $delineation_cord = $objAnswerTmp->selectHotspotCoordinates($answerId);
                                    $poly_answer = convert_coordinates($delineation_cord, '|');
                                    $max_coord = poly_get_max($poly_user, $poly_answer);
                                    $poly_answer_compiled = poly_compile($poly_answer, $max_coord);
                                    $overlap = poly_touch($poly_user_compiled, $poly_answer_compiled, $max_coord);
                                    if ($overlap == false) {
                                        //all good, no overlap
                                        $next = 1;
                                        continue;
                                    } else {
                                        if ($debug > 0) {
                                            error_log(__LINE__ . ' - Overlap is ' . $overlap . ': OAR hit', 0);
                                        }
                                        $organs_at_risk_hit++;
                                        //show the feedback
                                        $next = 0;
                                        $comment = $answerDestination = $objAnswerTmp->selectComment($answerId);
                                        $answerDestination = $objAnswerTmp->selectDestination($answerId);
                                        $destination_items = explode('@@', $answerDestination);
                                        $try_hotspot = $destination_items[1];
                                        $lp_hotspot = $destination_items[2];
                                        $select_question_hotspot = $destination_items[3];
                                        $url_hotspot = $destination_items[4];
                                    }
                                }
                            } else {
                                // the first delineation feedback
                                if ($debug > 0) {
                                    error_log(__LINE__ . ' first', 0);
                                }
                            }
                            break;
                        case HOT_SPOT_ORDER:
                            ExerciseShowFunctions::display_hotspot_order_answer($feedback_type, $answerId, $answer, $studentChoice, $answerComment);
                            break;
                        case MATCHING:
                            // if ($origin != 'learnpath') {
                            echo '<tr>';
                            echo '<td>' . $answer_matching[$answerId] . '</td><td>' . $user_answer . ' / <b><span style="color: #008000;">' . $answer_matching[$answerCorrect] . '</span></b></td>';
                            echo '</tr>';
                            //}
                            break;
                    }
                }
            }
            if ($debug) {
                error_log(' ------ ');
            }
        }
        // end for that loops over all answers of the current question
        if ($debug) {
            error_log('-- end answer loop --');
        }
        $final_answer = true;
        foreach ($real_answers as $my_answer) {
            if (!$my_answer) {
                $final_answer = false;
            }
        }
        //we add the total score after dealing with the answers
        if ($answerType == MULTIPLE_ANSWER_COMBINATION || $answerType == MULTIPLE_ANSWER_COMBINATION_TRUE_FALSE) {
            if ($final_answer) {
                //getting only the first score where we save the weight of all the question
                $answerWeighting = $objAnswerTmp->selectWeighting(1);
                $questionScore += $answerWeighting;
                $totalScore += $answerWeighting;
            }
        }
        //Fixes multiple answer question in order to be exact
        //if ($answerType == MULTIPLE_ANSWER || $answerType == GLOBAL_MULTIPLE_ANSWER) {
        /* if ($answerType == GLOBAL_MULTIPLE_ANSWER) {
                    $diff = @array_diff($answer_correct_array, $real_answers);
        
                    // All good answers or nothing works like exact
        
                    $counter = 1;
                    $correct_answer = true;
                    foreach ($real_answers as $my_answer) {
                        if ($debug) error_log(" my_answer: $my_answer answer_correct_array[counter]: ".$answer_correct_array[$counter]);
                        if ($my_answer != $answer_correct_array[$counter]) {
                            $correct_answer = false;
                            break;
                        }
                        $counter++;
                    }
        
                    if ($debug) error_log(" answer_correct_array: ".print_r($answer_correct_array, 1)."");
                    if ($debug) error_log(" real_answers: ".print_r($real_answers, 1)."");
                    if ($debug) error_log(" correct_answer: ".$correct_answer);
        
                    if ($correct_answer == false) {
                        $questionScore = 0;
                    }
        
                    // This makes the result non exact
                    if (!empty($diff)) {
                        $questionScore = 0;
                    }
                }*/
        $extra_data = array('final_overlap' => $final_overlap, 'final_missing' => $final_missing, 'final_excess' => $final_excess, 'overlap_color' => $overlap_color, 'missing_color' => $missing_color, 'excess_color' => $excess_color, 'threadhold1' => $threadhold1, 'threadhold2' => $threadhold2, 'threadhold3' => $threadhold3);
        if ($from == 'exercise_result') {
            // if answer is hotspot. To the difference of exercise_show.php, we use the results from the session (from_db=0)
            // TODO Change this, because it is wrong to show the user some results that haven't been stored in the database yet
            if ($answerType == HOT_SPOT || $answerType == HOT_SPOT_ORDER || $answerType == HOT_SPOT_DELINEATION) {
                if ($debug) {
                    error_log('$from AND this is a hotspot kind of question ');
                }
                $my_exe_id = 0;
                $from_database = 0;
                if ($answerType == HOT_SPOT_DELINEATION) {
                    if (0) {
                        if ($overlap_color) {
                            $overlap_color = 'green';
                        } else {
                            $overlap_color = 'red';
                        }
                        if ($missing_color) {
                            $missing_color = 'green';
                        } else {
                            $missing_color = 'red';
                        }
                        if ($excess_color) {
                            $excess_color = 'green';
                        } else {
                            $excess_color = 'red';
                        }
                        if (!is_numeric($final_overlap)) {
                            $final_overlap = 0;
                        }
                        if (!is_numeric($final_missing)) {
                            $final_missing = 0;
                        }
                        if (!is_numeric($final_excess)) {
                            $final_excess = 0;
                        }
                        if ($final_overlap > 100) {
                            $final_overlap = 100;
                        }
                        $table_resume = '<table class="data_table">
        				<tr class="row_odd" >
        					<td></td>
        					<td ><b>' . get_lang('Requirements') . '</b></td>
        					<td><b>' . get_lang('YourAnswer') . '</b></td>
        				</tr>
        				<tr class="row_even">
        					<td><b>' . get_lang('Overlap') . '</b></td>
        					<td>' . get_lang('Min') . ' ' . $threadhold1 . '</td>
        					<td><div style="color:' . $overlap_color . '">' . ($final_overlap < 0 ? 0 : intval($final_overlap)) . '</div></td>
        				</tr>
        				<tr>
        					<td><b>' . get_lang('Excess') . '</b></td>
        					<td>' . get_lang('Max') . ' ' . $threadhold2 . '</td>
        					<td><div style="color:' . $excess_color . '">' . ($final_excess < 0 ? 0 : intval($final_excess)) . '</div></td>
        				</tr>
        				<tr class="row_even">
        					<td><b>' . get_lang('Missing') . '</b></td>
        					<td>' . get_lang('Max') . ' ' . $threadhold3 . '</td>
        					<td><div style="color:' . $missing_color . '">' . ($final_missing < 0 ? 0 : intval($final_missing)) . '</div></td>
        				</tr>
        				</table>';
                        if ($next == 0) {
                            $try = $try_hotspot;
                            $lp = $lp_hotspot;
                            $destinationid = $select_question_hotspot;
                            $url = $url_hotspot;
                        } else {
                            //show if no error
                            //echo 'no error';
                            $comment = $answerComment = $objAnswerTmp->selectComment($nbrAnswers);
                            $answerDestination = $objAnswerTmp->selectDestination($nbrAnswers);
                        }
                        echo '<h1><div style="color:#333;">' . get_lang('Feedback') . '</div></h1>
        				<p style="text-align:center">';
                        $message = '<p>' . get_lang('YourDelineation') . '</p>';
                        $message .= $table_resume;
                        $message .= '<br />' . get_lang('ResultIs') . ' ' . $result_comment . '<br />';
                        if ($organs_at_risk_hit > 0) {
                            $message .= '<p><b>' . get_lang('OARHit') . '</b></p>';
                        }
                        $message .= '<p>' . $comment . '</p>';
                        echo $message;
                    } else {
                        echo $hotspot_delineation_result[0];
                        //prints message
                        $from_database = 1;
                        // the hotspot_solution.swf needs this variable
                    }
                    //save the score attempts
                    if (1) {
                        $final_answer = $hotspot_delineation_result[1];
                        //getting the answer 1 or 0 comes from exercise_submit_modal.php
                        if ($final_answer == 0) {
                            $questionScore = 0;
                        }
                        exercise_attempt($questionScore, 1, $quesId, $exeId, 0);
                        // we always insert the answer_id 1 = delineation
                        //in delineation mode, get the answer from $hotspot_delineation_result[1]
                        exercise_attempt_hotspot($exeId, $quesId, 1, $hotspot_delineation_result[1], $exerciseResultCoordinates[$quesId]);
                    } else {
                        if ($final_answer == 0) {
                            $questionScore = 0;
                            $answer = 0;
                            exercise_attempt($questionScore, $answer, $quesId, $exeId, 0);
                            if (is_array($exerciseResultCoordinates[$quesId])) {
                                foreach ($exerciseResultCoordinates[$quesId] as $idx => $val) {
                                    exercise_attempt_hotspot($exeId, $quesId, $idx, 0, $val);
                                }
                            }
                        } else {
                            exercise_attempt($questionScore, $answer, $quesId, $exeId, 0);
                            if (is_array($exerciseResultCoordinates[$quesId])) {
                                foreach ($exerciseResultCoordinates[$quesId] as $idx => $val) {
                                    exercise_attempt_hotspot($exeId, $quesId, $idx, $choice[$idx], $val);
                                }
                            }
                        }
                    }
                    $my_exe_id = $exeId;
                }
            }
            if ($answerType == HOT_SPOT || $answerType == HOT_SPOT_ORDER) {
                // We made an extra table for the answers
                if ($show_result) {
                    //	if ($origin != 'learnpath') {
                    echo '</table></td></tr>';
                    echo '<tr>
                            <td colspan="2">';
                    echo '<i>' . get_lang('HotSpot') . '</i><br /><br />';
                    echo '<object type="application/x-shockwave-flash" data="' . api_get_path(WEB_CODE_PATH) . 'plugin/hotspot/hotspot_solution.swf?modifyAnswers=' . Security::remove_XSS($questionId) . '&exe_id=' . $exeId . '&from_db=1" width="552" height="352">
								<param name="movie" value="../plugin/hotspot/hotspot_solution.swf?modifyAnswers=' . Security::remove_XSS($questionId) . '&exe_id=' . $exeId . '&from_db=1" />
							</object>';
                    echo '</td>
                        </tr>';
                    //	}
                }
            }
            //if ($origin != 'learnpath') {
            if ($show_result) {
                echo '</table>';
            }
            //	}
        }
        unset($objAnswerTmp);
        $totalWeighting += $questionWeighting;
        // Store results directly in the database
        // For all in one page exercises, the results will be
        // stored by exercise_results.php (using the session)
        if ($saved_results) {
            if ($debug) {
                error_log("Save question results {$saved_results}");
            }
            if ($debug) {
                error_log(print_r($choice, 1));
            }
            if (empty($choice)) {
                $choice = 0;
            }
            if ($answerType == MULTIPLE_ANSWER_TRUE_FALSE || $answerType == MULTIPLE_ANSWER_COMBINATION_TRUE_FALSE) {
                if ($choice != 0) {
                    $reply = array_keys($choice);
                    for ($i = 0; $i < sizeof($reply); $i++) {
                        $ans = $reply[$i];
                        exercise_attempt($questionScore, $ans . ':' . $choice[$ans], $quesId, $exeId, $i, $this->id);
                        if ($debug) {
                            error_log('result =>' . $questionScore . ' ' . $ans . ':' . $choice[$ans]);
                        }
                    }
                } else {
                    exercise_attempt($questionScore, 0, $quesId, $exeId, 0, $this->id);
                }
            } elseif ($answerType == MULTIPLE_ANSWER || $answerType == GLOBAL_MULTIPLE_ANSWER) {
                if ($choice != 0) {
                    $reply = array_keys($choice);
                    if ($debug) {
                        error_log("reply " . print_r($reply, 1) . "");
                    }
                    for ($i = 0; $i < sizeof($reply); $i++) {
                        $ans = $reply[$i];
                        exercise_attempt($questionScore, $ans, $quesId, $exeId, $i, $this->id);
                    }
                } else {
                    exercise_attempt($questionScore, 0, $quesId, $exeId, 0, $this->id);
                }
            } elseif ($answerType == MULTIPLE_ANSWER_COMBINATION) {
                if ($choice != 0) {
                    $reply = array_keys($choice);
                    for ($i = 0; $i < sizeof($reply); $i++) {
                        $ans = $reply[$i];
                        exercise_attempt($questionScore, $ans, $quesId, $exeId, $i, $this->id);
                    }
                } else {
                    exercise_attempt($questionScore, 0, $quesId, $exeId, 0, $this->id);
                }
            } elseif ($answerType == MATCHING) {
                if (isset($matching)) {
                    foreach ($matching as $j => $val) {
                        exercise_attempt($questionScore, $val, $quesId, $exeId, $j, $this->id);
                    }
                }
            } elseif ($answerType == FREE_ANSWER) {
                $answer = $choice;
                exercise_attempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
            } elseif ($answerType == ORAL_EXPRESSION) {
                $answer = $choice;
                exercise_attempt($questionScore, $answer, $quesId, $exeId, 0, $this->id, $nano);
            } elseif ($answerType == UNIQUE_ANSWER || $answerType == UNIQUE_ANSWER_NO_OPTION) {
                $answer = $choice;
                exercise_attempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
                //            } elseif ($answerType == HOT_SPOT || $answerType == HOT_SPOT_DELINEATION) {
            } elseif ($answerType == HOT_SPOT) {
                exercise_attempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
                if (isset($exerciseResultCoordinates[$questionId]) && !empty($exerciseResultCoordinates[$questionId])) {
                    foreach ($exerciseResultCoordinates[$questionId] as $idx => $val) {
                        exercise_attempt_hotspot($exeId, $quesId, $idx, $choice[$idx], $val, $this->id);
                    }
                }
            } else {
                exercise_attempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
            }
        }
        if ($propagate_neg == 0 && $questionScore < 0) {
            $questionScore = 0;
        }
        if ($saved_results) {
            $stat_table = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
            $sql = 'UPDATE ' . $stat_table . ' SET
                        exe_result = exe_result + ' . floatval($questionScore) . '
                    WHERE exe_id = ' . $exeId;
            if ($debug) {
                error_log($sql);
            }
            Database::query($sql);
        }
        $return_array = array('score' => $questionScore, 'weight' => $questionWeighting, 'extra' => $extra_data, 'open_question' => $arrques, 'open_answer' => $arrans, 'answer_type' => $answerType);
        return $return_array;
    }