// Copyright © Elnaz Abolahrar, 2011 // translation_quiz.js, assumes that quiz_support.js has also been loaded /*-------------------------------------- Configuration Variables --------------------------------------*/ var pass_percentage = 0.75; var min_no_questions = 10; var exam_quesNo = 10; // sets the number of questions appearing in an exam var max_answer_times = 1; // the max limit for the user to increase his/her score /*-------------------------------------- other Variables --------------------------------------*/ var grammar; var question_lang; var answer_lang; //saves the random tree generated by the server in generate_question function to be used by the check_answer var rand_tree; var counter; var score; var confirmed_check = new Boolean(true); var prev_pressed = new Boolean(); var prev_question; var prev_explanation; var prev_answer; var prev_hint; var current_question; var current_answer; var current_explanation= ""; var current_hint; //for history var quiz_history = []; var history_shown= new Boolean(); var index =0; //for check answer var answer_was_right= new Boolean(); var raw_user_answer; var user_answer; var user_answer_splited; var server_answer; var all_answers = []; var parsed_trees = 0; var words_hidden = new Boolean(); var answer_times ; var hint_times ; var hint_pressed = new Boolean(); var restart_active = new Boolean(); var is_ended = new Boolean(); var info_hidden = new Boolean(); //modes variables var have_minibar = new Boolean(); var have_prevQuestion = new Boolean(); var have_checkAns = new Boolean(); var max_hint_times; var selected_mode; /*-------------------------------------- Functions --------------------------------------*/ function default_values() { //resets the question, answer and the explanation and hint display areas document.question.question_text.value= "Quiz questions will be displayed here."; document.answer.answer_text.value = " "; document.explanation.explanation_text.value= "Explanations are displayed here."; document.getElementById("hint_txt").innerHTML = ""; //resets some flags prev_pressed = false; is_ended = false; //refering to the End button or end o quiz by score or end of exam restart_active = false; //refering to the Restart button hint_pressed = false; answer_was_right= false; history_shown= false; //resets the counter and score displays and some variables answer_times = 1; counter = 0; score = 0; hint_times =0; document.getElementById('counter_display').value = counter; document.getElementById('score_display').value = score; //resets the variables for keeping the history quiz_history = []; index =0; var history=element("history_part"); history.innerHTML =""; //resets the variables for keeping the parsing and linearization altenatives parsed_trees = 0; all_answers = []; //shows the normal user answer area show_element("user_answer"); } function start_quiz() { //sets the grammar and From and To languages grammar= minibar.grammar_menu.value; question_lang= minibar.from_menu.value; answer_lang= minibar.to_menu.value; //removes the start button minibar.quizbar.removeChild(minibar.quizbar.lastChild); set_mode(); //shows the minibar area and buttons var buttons_bar=element("buttons_bar"); if (have_minibar) { //show the minibar word magnets show_element("minibar_contin"); //show the delete and clear buttons show_element("minibar_buttons"); //hides the normal user answer area hide_element("user_answer"); //changes the "Check Answer" button to a none_submit one buttons_bar.removeChild(buttons_bar.lastChild); appendChildren(buttons_bar, [ button("Check Answer","check_answer_quiz()","C", "check_answer")]); } else { //enable the user answer area document.getElementById('user_answer').disabled = false; //hide the minibar word magnets hide_element("minibar_contin"); //hide the delete and clear buttons hide_element("minibar_buttons"); //changes the "Check Answer" button to a submit one buttons_bar.removeChild(buttons_bar.lastChild); appendChildren(buttons_bar, [ submit_button("Check Answer", "check_answer")]); } //conditionally enbles the "Hint", "Check Answer", "Next Question" and "Previous Question" buttons, and the minibar if (have_checkAns) document.getElementById('check_answer').disabled = false; else document.getElementById('check_answer').disabled = true; if (have_prevQuestion) document.getElementById('previous_question').disabled = false; if ( max_hint_times > 0 ) document.getElementById('hint').disabled = false; document.getElementById('next_question').disabled = false; //generates the first quiz question generate_question(); //resets the restart_active restart_active= true ; //hides the information if ( info_hidden == false ) toggle_info(); } function restart_quiz() { //javascript:location.reload(true); if (restart_active == true) { var end_confirmed= new Boolean(true); if (!is_ended ) end_confirmed = confirm(" Are you sure you want to quit this quiz!"); if (end_confirmed) { end_quiz(false); reset_mode(); //add the start button appendChildren(minibar.quizbar,[ button("Start Quiz","start_quiz()","S")]); //removes the History button var history_bar=element("history_bar"); history_bar.removeChild(history_bar.lastChild); default_values(); } } } function generate_question() { //for the exam mode if (selected_mode == "Exam Mode") { if (check_notEmpty()) { if (counter > 0) { document.getElementById('score_display').value = "?"; //save the current user answer for history current_answer = document.answer.answer_text.value; quiz_history[index][1] = current_answer; make_all_answers(); } else exam_continue(); } } else { if (prev_pressed == true ) { //changes the question, answer and the explanation back to the current one document.question.question_text.value= current_question; document.answer.answer_text.value = current_answer; document.explanation.explanation_text.value= current_explanation; document.getElementById("hint_txt").innerHTML = current_hint; prev_pressed = false; // to go back to normal //enables the "Previous Question","Hint" and "Check Answer" buttons document.getElementById('previous_question').disabled = false; document.getElementById('check_answer').disabled = false; document.getElementById('hint').disabled = false; } else { // if the user clicks the "Next Question" without cheking his/her previous answer, // asks for user's confirmation before moving to the next question if ( answer_times == 0 ) { confirmed_check = confirm("Are you sure you don't want to check your answer's correctness!"); if ( hint_times == 0 ) { //saves the current answer and the explanation which is null(the answer was not checked or hinted) current_answer = document.answer.answer_text.value; current_explanation = "You did not check your answer's correctness!"; current_hint = ""; } //save the current user answer for history quiz_history[index][1] = document.answer.answer_text.value; //save the current explanation for history quiz_history[index][2] = "You did not check your answer's correctness!"; } if (confirmed_check == true ) { //save the current question for the "previous question" button and history prev_question = current_question; //save the current answer for the "previous question" button prev_answer = current_answer; //save the current explanation and hint for the "previous question" button prev_explanation = current_explanation; prev_hint= current_hint; //clears the question, answer and the explanation and hint display areas clearing(); if (have_minibar) { minibar.clear_all(); //unhides the words area and removes the "Show Magnets" button show_word_magnets(); } if (answer_was_right) //here it still contains info about the previous question document.explanation.explanation_text.value= current_explanation; //resets the times user has answered to the current question answer_times = 0; //resets the times user has pressed hint for the current question hint_times = 0; document.getElementById('counter_display').value = counter; //increments the counter counter= ++ counter; //sends a question retrival request to the server server.get_random(generate_question2); } } } //sets the focus on the answer area document.answer.answer_text.focus(); } function generate_question2(random_trees) { //we now have a random abstract syntax tree that we need to linearize server.pgf_call("linearizeAll",{tree:random_trees[0].tree, to:question_lang}, generate_question3); rand_tree= random_trees[0].tree; } function generate_question3(random_texts) { var no_of_lins = random_texts[0].texts.length; //generates a random number, to determine which linearization should be used as the question var which= Math.floor(Math.random()* no_of_lins ); if (which >= no_of_lins) which = which - 1; //display the new quiz quetion sent by server document.question.question_text.value= counter +". " + random_texts[0].texts[which]; //save the current question for the "previous question" button and history current_question = document.question.question_text.value; index = quiz_history.length; quiz_history[index] = []; quiz_history[index][0]= current_question; } function check_answer_quiz() { if (check_notEmpty()) { //resets the user confirmation for moving to next question without checking the answer confirmed_check = true; //clears the explanation and Hint display area document.explanation.explanation_text.value = ""; document.getElementById("hint_txt").innerHTML = ""; //save the current user answer for the "peivious question" button and history current_answer = document.answer.answer_text.value; quiz_history[index][1] = current_answer; //increments the times the user has answered to the current question answer_times ++; //resets the hint_pressed flag hint_pressed = false; if ((answer_times + hint_times) <= 1) make_all_answers(); else continue_checking(); } } function make_all_answers() { //resets the variables for keeping the parsing and linearization altenatives parsed_trees = 0; all_answers = []; //we now need to linearize the random abstract syntax tree in order to //find all possible correct answers then we check user's answer against these answers. server.pgf_call("linearize",{tree:rand_tree, to:question_lang}, parse_answer); } function parse_answer(right_answer) { server.parse(question_lang,right_answer[0].text, parse_answer2); } var trees_to_go; function parse_answer2(parsed_answer) { trees_to_go = parsed_trees = parsed_answer[0].trees.length; var j =0; for (j= 0; j < parsed_trees ; j++) { server.linearizeAll(parsed_answer[0].trees[j], answer_lang, collect_answers); } } function collect_answers(lin_answer) { var next= 0; var i=0; for (i= 0; i < lin_answer[0].texts.length ; i++) { next = all_answers.length; all_answers[next]= lin_answer[0].texts[i]; } trees_to_go--; if(trees_to_go == 0) continue_checking(); } function continue_checking() { if (selected_mode == "Exam Mode") { check_answer_exam2(); exam_continue(); } else if (hint_pressed) show_hint2(); else check_answer2(); } function check_answer2() { if (have_minibar) hide_word_magnets(); raw_user_answer= document.answer.answer_text.value; user_answer = remove_unwanted_characters(raw_user_answer); answer_was_right= false; var k = 0 ; for (k= 0; k < all_answers.length; k++) { server_answer = remove_unwanted_characters(all_answers[k]); if ( user_answer == server_answer ) { if (answer_times <= max_answer_times) { //increments the score score ++; document.getElementById('score_display').value = score; } document.explanation.explanation_text.value = "Yes, that was the correct answer."; answer_was_right= true; break; } } if (k >= all_answers.length) { document.explanation.explanation_text.value= "No, the correct answer(s) is(are): \n " + all_answers; document.getElementById('counter_display').value = counter; } //save the current explanation for the "previous question" button and history current_explanation = document.explanation.explanation_text.value; quiz_history[index][2] = current_explanation; if ((counter >= min_no_questions) && ((score/counter) >= pass_percentage)) { if (answer_was_right) document.explanation.explanation_text.value += "\nAlso, "; else document.explanation.explanation_text.value += "\nHowever, "; document.explanation.explanation_text.value += "Congratulations!!! You passed the quiz. Click \"Restart Quiz\" for a new one."; document.getElementById('counter_display').value = counter; end_quiz(false); } else if (answer_was_right) { //goes to the next question automaticly after getting the correct answer generate_question(); } //save the current hint for the "previous question" button current_hint = document.getElementById("hint_txt").innerHTML ; } function check_answer_exam2() { raw_user_answer= document.answer.answer_text.value; user_answer = remove_unwanted_characters(raw_user_answer); var k = 0 ; for (k= 0; k < all_answers.length; k++) { server_answer = remove_unwanted_characters(all_answers[k]); if ( user_answer == server_answer ) { //increments the score score ++; //save the current explanation for history current_explanation = "Yes, that was the correct answer."; quiz_history[index][2] = current_explanation; break; } } if (k >= all_answers.length) { //save the current explanation for history current_explanation = "No, the correct answer(s) is(are): \n " + all_answers; quiz_history[index][2] = current_explanation; } } function exam_continue() { if (counter >= exam_quesNo) exam_result(); else { //clears the question and answer and the explanation and hint display areas clearing(); document.getElementById('counter_display').value = counter + "/" + exam_quesNo; //increments the counter counter= ++ counter; //sends a question retrival request to the server server.get_random(generate_question2); } } function exam_result() { document.getElementById('score_display').value = score; document.getElementById('counter_display').value = counter + "/" + exam_quesNo; document.explanation.explanation_text.value= "That's the end of exam."; end_quiz(false); } function show_hint() { if (hint_times < max_hint_times) { if (check_notEmpty()) { //clears the explanation and Hint area document.explanation.explanation_text.value = ""; document.getElementById("hint_txt").innerHTML = ""; //increments the times the user has pressed hint button hint_times= ++ hint_times; //resets the user confirmation for moving to next question without checking the answer confirmed_check = true; //save the current user answer for the "peivious question" button current_answer = document.answer.answer_text.value; //sets the hint_pressed flag hint_pressed = true; raw_user_answer= document.answer.answer_text.value; user_answer = remove_unwanted_characters(raw_user_answer); user_answer_splited = split_to_words(user_answer); if ((answer_times + hint_times) <= 1) make_all_answers(); else continue_checking(); } } else { //Error message (max_hint_times is passed) document.explanation.explanation_text.value = "Sorry, you have already used up your allowed number of hints for this question."; } } function show_hint2() { var best_answer = new Array(); best_answer= find_closest(all_answers); var compared = new Array(); compared = string_matching(best_answer, user_answer_splited); //preparing the Hint spans var hint = element("hint_txt"); hint.innerHTML = "Hint: "; var max_length = Math.max(best_answer.length, user_answer_splited.length); for (k= 0; k < max_length; k++) { var id = "word" + k.toString(); var word_span= span_id(id); hint.appendChild(word_span); } var k=0; var visited = new Array(); for (k= 0; k < best_answer.length; k++) { visited[k] = 0; } var i= 0; //i is used for the user_answer var myid = ""; while ( i < compared.length) { myid = "word" + i.toString(); if (compared[i] == 0) { var j =0; //j is used for the server_answer while (j < best_answer.length) { if (visited[j] == 0 && user_answer_splited[i] == best_answer[j] && (j >= compared.length || compared[j] == 0 )) { //yellow for the right word in wrong place document.getElementById(myid).style.color="#FFFF00"; visited[j] = 1; break; } j++; } if ( j >= best_answer.length) { //red for the totaly wrong word document.getElementById(myid).style.color="#FF0000"; } } else { //green for the right word in right place document.getElementById(myid).style.color="#339933"; } document.getElementById(myid).innerHTML = user_answer_splited[i] + " "; i++; } while ( i < best_answer.length) { myid = "word" + i.toString(); document.getElementById(myid).style.color="#FF0000"; document.getElementById(myid).innerHTML = "____ "; i++; } //save the current explanation and hint for the "previous question" button current_explanation = document.explanation.explanation_text.value; current_hint = document.getElementById("hint_txt").innerHTML ; } function previous_question_quiz() { if ( counter > 1) { if ( answer_times == 0 && hint_times == 0 ) { //sets the current answer and the explanation and hint current_answer = document.answer.answer_text.value; current_explanation = ""; current_hint = ""; } //disables the "Previous Question","Hint" and "Check Answer" buttons document.getElementById('previous_question').disabled = true; document.getElementById('check_answer').disabled = true; document.getElementById('hint').disabled = true; //changes the question, answer and the explanation document.question.question_text.value= prev_question; document.answer.answer_text.value = prev_answer; document.explanation.explanation_text.value= prev_explanation; document.getElementById("hint_txt").innerHTML = prev_hint; prev_pressed = true; // to remember the current question, answer and explanation } } function end_quiz(confirm_needed) { if (restart_active == true && is_ended == false) { var end= new Boolean(true); if (confirm_needed) end = confirm(" Are you sure you want to quit this quiz!"); if (end) { if (have_minibar) { //removes the "Show Magnets" button if exists show_word_magnets(); //remove the minibar word magnets if there was any remove_minibar(); //shows the normal user answer area show_element("user_answer"); } disable_all(); is_ended = true; //adds a Show Quiz History button var history_bar=element("history_bar"); appendChildren(history_bar, [ button("Show Quiz History","show_history()","H", "quiz_history")]); } } } function show_history() { var current_grammar = minibar.grammar.name; // minibar.grammar.name gives the grammar name without .pgf var to_lang= langpart(minibar.to_menu.value,current_grammar); var from_lang= langpart(minibar.from_menu.value,current_grammar); var history=element("history_part"); if (history_shown == false) { var i=0; for (i= 0; i < quiz_history.length ; i++) { var question = text("Question" + " "+quiz_history[i][0] + "\n"); history.appendChild(empty("br")); history.appendChild(question); history.appendChild(empty("br")); var answer = text("Your Answer" + ": "+ quiz_history[i][1] + "\n"); history.appendChild(answer); history.appendChild(empty("br")); var explan = text("Explanation" + ": "+ quiz_history[i][2] + "\n"); history.appendChild(explan); history.appendChild(empty("br")); history.appendChild(empty("br")); } history_shown = true; } var history_content = history.innerHTML; var history_window = window.open('', 'historyPopup', "dependent = 1, scrollbars=1, location=1, statusbar=1, width=540, height=650, left = 10, top = 20"); history_window.document.writeln('