moodle/mod/hotpot/v6/source/jcloze6.js_

334 lines
7.6 KiB
Plaintext

//JCLOZE CORE JAVASCRIPT CODE
function ItemState(){
this.ClueGiven = false;
this.HintsAndChecks = 0;
this.MatchedAnswerLength = 0;
this.ItemScore = 0;
this.AnsweredCorrectly = false;
this.Guesses = new Array();
return this;
}
var Feedback = '';
var Correct = '[strCorrect]';
var Incorrect = '[strIncorrect]';
var GiveHint = '[strGiveHint]';
var CaseSensitive = [boolCaseSensitive];
var YourScoreIs = '[strYourScoreIs]';
var Finished = false;
var Locked = false;
var Score = 0;
var CurrentWord = 0;
var Guesses = '';
var TimeOver = false;
I = new Array();
[strItemArray]
State = new Array();
function StartUp(){
RemoveBottomNavBarForIE();
[inclSendResults]
GetUserName();
[/inclSendResults]
[inclPreloadImages]
PreloadImages([PreloadImageList]);
[/inclPreloadImages]
var i = 0;
State.length = 0;
for (i=0; i<I.length; i++){
State[i] = new ItemState();
}
ClearTextBoxes();
[inclTimer]
StartTimer();
[/inclTimer]
}
function ShowClue(ItemNum){
if (Locked == true){return;}
State[ItemNum].ClueGiven = true;
ShowMessage(I[ItemNum][2]);
}
function SaveCurrentAnswers(){
var Ans = ''
for (var i=0; i<I.length; i++){
Ans = GetGapValue(i);
if ((Ans.length > 0)&&(Ans != State[i].Guesses[State[i].Guesses.length-1])){
State[i].Guesses[State[i].Guesses.length] = Ans;
}
}
}
function CompileGuesses(){
var F = document.getElementById('store');
if (F != null){
var Temp = '<?xml version="1.0"?><hpnetresult><fields>';
var GapLabel = '';
for (var i=0; i<State.length; i++){
GapLabel = 'Gap ' + (i+1).toString();
Temp += '<field><fieldname>' + GapLabel + '</fieldname>';
Temp += '<fieldtype>student-responses</fieldtype><fieldlabel>' + GapLabel + '</fieldlabel>';
Temp += '<fieldlabelid>JClozeStudentResponses</fieldlabelid><fielddata>';
for (var j=0; j<State[i].Guesses.length; j++){
if (j>0){Temp += '| ';}
Temp += State[i].Guesses[j] + ' ';
}
Temp += '</fielddata></field>';
}
Temp += '</fields></hpnetresult>';
Detail = Temp;
}
}
function CheckAnswers(){
if (Locked == true){return;}
SaveCurrentAnswers();
var AllCorrect = true;
//Check each answer
for (var i = 0; i<I.length; i++){
if (State[i].AnsweredCorrectly == false){
//If it's right, calculate its score
if (CheckAnswer(i, true) > -1){
var TotalChars = GetGapValue(i).length;
State[i].ItemScore = (TotalChars-State[i].HintsAndChecks)/TotalChars;
if (State[i].ClueGiven == true){State[i].ItemScore /= 2;}
if (State[i].ItemScore <0 ){State[i].ItemScore = 0;}
State[i].AnsweredCorrectly = true;
//Drop the correct answer into the page, replacing the text box
SetCorrectAnswer(i, GetGapValue(i));
}
else{
//Otherwise, increment the hints for this item, as a penalty
State[i].HintsAndChecks++;
//then set the flag
AllCorrect = false;
}
}
}
//Calculate the total score
var TotalScore = 0;
for (i=0; i<State.length; i++){
TotalScore += State[i].ItemScore;
}
TotalScore = Math.floor((TotalScore * 100)/I.length);
//Compile the output
Output = '';
if (AllCorrect == true){
Output = Correct + '<br />';
}
Output += YourScoreIs + ' ' + TotalScore + '%.<br />';
if (AllCorrect == false){
Output += '<br />' + Incorrect;
}
ShowMessage(Output);
setTimeout('WriteToInstructions(Output)', 50);
Score = TotalScore;
CompileGuesses();
if ((AllCorrect == true)||(Finished == true)){
[inclSendResults]
setTimeout('SendResults(' + TotalScore + ')', 50);
[/inclSendResults]
[inclTimer]
window.clearInterval(Interval);
[/inclTimer]
TimeOver = true;
Locked = true;
Finished = true;
setTimeout('Finish()', SubmissionTimeout);
}
}
function TrackFocus(BoxNumber){
CurrentWord = BoxNumber;
InTextBox = true;
}
function LeaveGap(){
InTextBox = false;
}
function CheckBeginning(Guess, Answer){
var OutString = '';
var i = 0;
var UpperGuess = '';
var UpperAnswer = '';
if (CaseSensitive == false) {
UpperGuess = Guess.toUpperCase();
UpperAnswer = Answer.toUpperCase();
}
else {
UpperGuess = Guess;
UpperAnswer = Answer;
}
while (UpperGuess.charAt(i) == UpperAnswer.charAt(i)) {
OutString += Guess.charAt(i);
i++;
}
OutString += Answer.charAt(i);
return OutString;
}
function GetGapValue(GNum){
var RetVal = '';
if ((GNum<0)||(GNum>=I.length)){return RetVal;}
if (document.getElementById('Gap' + GNum) != null){
RetVal = document.getElementById('Gap' + GNum).value;
RetVal = TrimString(RetVal);
}
else{
RetVal = State[GNum].Guesses[State[GNum].Guesses.length-1];
}
return RetVal;
}
function SetGapValue(GNum, Val){
if ((GNum<0)||(GNum>=I.length)){return;}
if (document.getElementById('Gap' + GNum) != null){
document.getElementById('Gap' + GNum).value = Val;
document.getElementById('Gap' + GNum).focus();
}
}
function SetCorrectAnswer(GNum, Val){
if ((GNum<0)||(GNum>=I.length)){return;}
if (document.getElementById('GapSpan' + GNum) != null){
document.getElementById('GapSpan' + GNum).innerHTML = Val;
}
}
function FindCurrent() {
var x = 0;
FoundCurrent = -1;
//Test the current word:
//If its state is not set to already correct, check the word.
if (State[CurrentWord].AnsweredCorrectly == false){
if (CheckAnswer(CurrentWord, false) < 0){
return CurrentWord;
}
}
x=CurrentWord + 1;
while (x<I.length){
if (State[x].AnsweredCorrectly == false){
if (CheckAnswer(x, false) < 0){
return x;
}
}
x++;
}
x = 0;
while (x<CurrentWord){
if (State[x].AnsweredCorrectly == false){
if (CheckAnswer(x, false) < 0){
return x;
}
}
x++;
}
return FoundCurrent;
}
function CheckAnswer(GapNum, MarkAnswer){
var Guess = GetGapValue(GapNum);
var UpperGuess = '';
var UpperAnswer = '';
if (CaseSensitive == false){
UpperGuess = Guess.toUpperCase();
}
else{
UpperGuess = Guess;
}
var Match = -1;
for (var i = 0; i<I[GapNum][1].length; i++){
if (CaseSensitive == false){
UpperAnswer = I[GapNum][1][i][0].toUpperCase();
}
else{
UpperAnswer = I[GapNum][1][i][0];
}
if (TrimString(UpperGuess) == UpperAnswer){
Match = i;
if (MarkAnswer == true){
State[GapNum].AnsweredCorrectly = true;
}
}
}
return Match;
}
function GetHint(GapNum){
Guess = GetGapValue(GapNum);
if (CheckAnswer(GapNum, false) > -1){return ''}
RightBits = new Array();
for (var i=0; i<I[GapNum][1].length; i++){
RightBits[i] = CheckBeginning(Guess, I[GapNum][1][i][0]);
}
var RightOne = FindLongest(RightBits);
var Result = I[GapNum][1][RightOne][0].substring(0,RightBits[RightOne].length);
//Add another char if the last one is a space
if (Result.charAt(Result.length-1) == ' '){
Result = I[GapNum][1][RightOne][0].substring(0,RightBits[RightOne].length+1);
}
return Result;
}
function ShowHint(){
if (Locked == true){return;}
var CurrGap = FindCurrent();
if (CurrGap < 0){return;}
var HintString = GetHint(CurrGap);
if (HintString.length > 0){
SetGapValue(CurrGap, HintString);
State[CurrGap].HintsAndChecks += 1;
}
ShowMessage(GiveHint);
}
function TypeChars(Chars){
var CurrGap = FindCurrent();
if (CurrGap < 0){return;}
if (document.getElementById('Gap' + CurrGap) != null){
SetGapValue(CurrGap, document.getElementById('Gap' + CurrGap).value + Chars);
}
}
[inclTimer]
function TimesUp() {
document.getElementById('Timer').innerHTML = '[strTimesUp]';
[inclPreloadImages]
RefreshImages();
[/inclPreloadImages]
TimeOver = true;
Finished = true;
CheckAnswers();
Locked = true;
}
[/inclTimer]