function getTestResultSubjectsData($resultid)
{
    global $g_db, $G_SESSION, $srv_settings;
    $arrResult = array();
    $i_rSet1 = $g_db->Execute("SELECT questionid, result_answer_points, result_answer_iscorrect FROM " . $srv_settings['table_prefix'] . "results_answers WHERE resultid=" . $resultid);
    if (!$i_rSet1) {
        showDBError('getTestResultSubjectsData', 1);
    } else {
        while (!$i_rSet1->EOF) {
            $arrQuestion = getRecordItems($srv_settings['table_prefix'] . 'questions', array('subjectid', 'question_points'), 'questionid=' . $i_rSet1->fields['questionid']);
            if (!isset($arrResult[$arrQuestion['subjectid']])) {
                $arrResult[$arrQuestion['subjectid']]['got_answers'] = 0;
                $arrResult[$arrQuestion['subjectid']]['total_answers'] = 0;
                $arrResult[$arrQuestion['subjectid']]['got_points'] = 0;
                $arrResult[$arrQuestion['subjectid']]['total_points'] = 0;
            }
            $arrResult[$arrQuestion['subjectid']]['got_answers'] += $i_rSet1->fields['result_answer_iscorrect'] == IGT_ANSWER_IS_CORRECT ? 1 : 0;
            $arrResult[$arrQuestion['subjectid']]['total_answers'] += 1;
            $arrResult[$arrQuestion['subjectid']]['got_points'] += $i_rSet1->fields['result_answer_points'];
            $arrResult[$arrQuestion['subjectid']]['total_points'] += $arrQuestion['question_points'];
            $i_rSet1->MoveNext();
        }
        $i_rSet1->Close();
    }
    return $arrResult;
}
function checkTestAnswer($i_questionno, $i_questionid, $i_answers)
{
    global $g_db, $G_SESSION, $lngstr, $srv_settings;
    $i_rSet1 = $g_db->Execute("SELECT * FROM " . $srv_settings['table_prefix'] . "questions WHERE questionid=" . $i_questionid);
    if (!$i_rSet1) {
        showDBError('checkTestAnswer', 1);
    } else {
        if (!$i_rSet1->EOF) {
            $i_subjectid = $i_rSet1->fields['subjectid'];
            $i_questiontype = $i_rSet1->fields['question_type'];
            $i_question_type2 = $i_rSet1->fields['question_type2'];
            $i_questionpoints = $i_rSet1->fields['question_points'];
        } else {
            die(sprintf($lngstr['err_no_question_n_in_db'], $i_questionno));
        }
        $i_rSet1->Close();
    }
    if ($G_SESSION['yt_state'] == TEST_STATE_QREVIEW) {
        $arrAnswerOld = getRecordItems($srv_settings['table_prefix'] . 'results_answers', array('result_answer_points', 'result_answer_iscorrect', 'result_answer_timespent'), 'result_answerid=' . $i_questionno . ' AND resultid=' . $G_SESSION['resultid'] . ' AND questionid=' . $i_questionid);
        $arrAnswerOld['total_answers'] = 1;
        $arrAnswerOld['question_points'] = $i_questionpoints;
    } else {
        $arrAnswerOld = array('result_answer_points' => 0, 'result_answer_iscorrect' => 0, 'result_answer_timespent' => 0, 'total_answers' => 0, 'question_points' => 0);
    }
    $i_answer_correct = 0;
    $i_answer_points = 0;
    $i_answer_text = '';
    switch ($i_questiontype) {
        case QUESTION_TYPE_ESSAY:
            $i_answer_text = trim($i_answers[0]);
            $i_answer_points = 0;
            $i_answer_correct = 3;
            if ($G_SESSION['yt_state'] != TEST_STATE_QREVIEW) {
                $G_SESSION['yt_points_pending'] += $i_questionpoints;
            }
            break;
        case QUESTION_TYPE_FILLINTHEBLANK:
            $i_answer_text = trim($i_answers[0]);
            $i_rSet2 = $g_db->Execute("SELECT answer_text, isregexp, iscasesensitive FROM " . $srv_settings['table_prefix'] . "answers WHERE questionid=" . $i_questionid . " AND answerid=1");
            if (!$i_rSet2) {
                showDBError('checkTestAnswer', 4);
            } else {
                if (!$i_rSet2->EOF) {
                    if ($i_rSet2->fields['answer_text'] == $i_answer_text || !$i_rSet2->fields['iscasesensitive'] && strtolower($i_rSet2->fields['answer_text']) == strtolower($i_answer_text)) {
                        $i_answer_correct = 2;
                        $i_answer_points = $i_questionpoints;
                    }
                } else {
                    die(sprintf($lngstr['err_no_answers_in_question'], $i_questionid));
                }
                $i_rSet2->Close();
            }
            break;
        case QUESTION_TYPE_MULTIPLECHOICE:
        case QUESTION_TYPE_TRUEFALSE:
            $i_answerno = $G_SESSION['yt_answers'][$i_questionno][(int) $i_answers - 1];
            $i_answer_text = $i_answerno;
            $i_rSet2 = $g_db->Execute("SELECT answer_correct, answer_percents FROM " . $srv_settings['table_prefix'] . "answers WHERE questionid=" . $i_questionid . " AND answerid=" . $i_answerno);
            if (!$i_rSet2) {
                showDBError('checkTestAnswer', 2);
            } else {
                if (!$i_rSet2->EOF) {
                    $i_answer_correct = $i_rSet2->fields['answer_correct'] > 0 ? 2 : 0;
                    $i_answer_points = $i_rSet2->fields['answer_percents'] == 100 ? $i_questionpoints : round($i_questionpoints * $i_rSet2->fields['answer_percents'] / 100, 5);
                } else {
                    die(sprintf($lngstr['err_no_answers_in_question'], $i_questionid));
                }
                $i_rSet2->Close();
            }
            break;
        case QUESTION_TYPE_MULTIPLEANSWER:
            $i_answer_set_count = 0;
            foreach ($i_answers as $val) {
                $i_answerno[] = $G_SESSION['yt_answers'][$i_questionno][(int) $val - 1];
                $i_answer_set_count++;
            }
            sort($i_answerno, SORT_NUMERIC);
            $i_answer_set_correct = 0;
            $i_answer_set_correct_count = 0;
            $i_answer_set_percents = 0;
            $i_answer_set_incorrect = 0;
            $i_rSet2 = $g_db->Execute("SELECT answerid, answer_correct, answer_percents FROM " . $srv_settings['table_prefix'] . "answers WHERE questionid=" . $i_questionid);
            if (!$i_rSet2) {
                showDBError('checkTestAnswer', 3);
            } else {
                if (!$i_rSet2->EOF) {
                    while (!$i_rSet2->EOF) {
                        if ($i_rSet2->fields['answer_correct']) {
                            $i_answer_set_correct_count++;
                        }
                        if (in_array($i_rSet2->fields['answerid'], $i_answerno)) {
                            if ($i_rSet2->fields['answer_correct']) {
                                $i_answer_set_correct++;
                            } else {
                                $i_answer_set_incorrect++;
                            }
                            $i_answer_set_percents += $i_rSet2->fields['answer_percents'];
                        }
                        $i_rSet2->MoveNext();
                    }
                } else {
                    die(sprintf($lngstr['err_no_answers_in_question'], $i_questionid));
                }
                $i_rSet2->Close();
            }
            if ($i_question_type2) {
                if ($i_answer_set_percents >= 100) {
                    $i_answer_correct = 2;
                    $i_answer_points = $i_questionpoints;
                } else {
                    if ($i_answer_set_percents <= 0) {
                        $i_answer_correct = 0;
                        $i_answer_points = 0;
                    } else {
                        $i_answer_correct = 1;
                        $i_answer_points = round($i_questionpoints * $i_answer_set_percents / 100, 5);
                    }
                }
            } else {
                if ($i_answer_set_correct == $i_answer_set_correct_count && !$i_answer_set_incorrect) {
                    $i_answer_correct = 2;
                    $i_answer_points = $i_questionpoints;
                }
            }
            $i_answer_text = implode(QUESTION_TYPE_MULTIPLEANSWER_BREAK, $i_answerno);
            break;
    }
    $i_iscorrect = $i_answer_correct == 2 ? 1 : 0;
    $i_iscorrect_old = $arrAnswerOld['result_answer_iscorrect'] == 2 ? 1 : 0;
    $G_SESSION['yt_got_answers'] += $i_iscorrect - $i_iscorrect_old;
    $G_SESSION['yt_got_points'] += $i_answer_points - $arrAnswerOld['result_answer_points'];
    if (!isset($G_SESSION['yt_subjects'][$i_subjectid])) {
        $G_SESSION['yt_subjects'][$i_subjectid]['got_answers'] = 0;
        $G_SESSION['yt_subjects'][$i_subjectid]['total_answers'] = 0;
        $G_SESSION['yt_subjects'][$i_subjectid]['got_points'] = 0;
        $G_SESSION['yt_subjects'][$i_subjectid]['total_points'] = 0;
    }
    $G_SESSION['yt_subjects'][$i_subjectid]['got_answers'] += $i_iscorrect - $i_iscorrect_old;
    $G_SESSION['yt_subjects'][$i_subjectid]['total_answers'] += 1 - $arrAnswerOld['total_answers'];
    $G_SESSION['yt_subjects'][$i_subjectid]['got_points'] += $i_answer_points - $arrAnswerOld['result_answer_points'];
    $G_SESSION['yt_subjects'][$i_subjectid]['total_points'] += $i_questionpoints - $arrAnswerOld['question_points'];
    $i_now = time();
    $i_timespent = isset($G_SESSION['yt_questionstart']) && $G_SESSION['yt_questionstart'] > 0 ? $i_now - $G_SESSION['yt_questionstart'] : 0;
    $i_questionno_real = $G_SESSION['yt_questions'][$i_questionno - 1];
    $i_timeexceeded = $G_SESSION['yt_teststop'] > 0 && $G_SESSION['yt_teststop'] < $i_now ? 1 : 0;
    if ($G_SESSION['yt_state'] == TEST_STATE_QREVIEW) {
        $qry_str = "UPDATE " . $srv_settings['table_prefix'] . "results_answers SET test_questionid=" . $i_questionno_real . ", result_answer_text=" . $g_db->qstr($i_answer_text, get_magic_quotes_gpc()) . ", result_answer_points=" . $i_answer_points . ", result_answer_iscorrect=" . $i_answer_correct . ", result_answer_timespent=" . $i_timespent . ", result_answer_timeexceeded=" . $i_timeexceeded . " WHERE result_answerid=" . $i_questionno . " AND resultid=" . $G_SESSION['resultid'] . " AND questionid=" . $i_questionid;
    } else {
        $qry_str = "INSERT INTO " . $srv_settings['table_prefix'] . "results_answers (result_answerid, resultid, questionid, test_questionid, result_answer_text, result_answer_points, result_answer_iscorrect, result_answer_feedback, result_answer_timespent, result_answer_timeexceeded) VALUES (" . $i_questionno . ", " . $G_SESSION['resultid'] . ", " . $i_questionid . ", " . $i_questionno_real . ", " . $g_db->qstr($i_answer_text, get_magic_quotes_gpc()) . ", " . $i_answer_points . ", " . $i_answer_correct . ", '', " . $i_timespent . ", " . $i_timeexceeded . ")";
    }
    $g_db->Execute($qry_str);
    eventOnAfterFunction(array('function_name' => 'checkTestAnswer', 'questionno' => $i_questionno, 'questionid' => $i_questionid, 'answers' => $i_answers));
}