[inclScorm1.2] //JQUIZ-SPECIFIC SCORM-RELATED JAVASCRIPT CODE function SetScormScore(){ //Reports the current score and any other information back to the LMS if (API != null){ API.LMSSetValue('cmi.core.score.raw', Score); //Now send detailed reports about each item for (var i=0; i 0){ ThisItemScore = Math.floor(State[i][0] * 100) + ''; ThisItemStatus = 'completed'; } else{ ThisItemScore = '0'; ThisItemStatus = 'incomplete'; } API.LMSSetValue('cmi.objectives.' + i + '.score.raw', ThisItemScore); API.LMSSetValue('cmi.objectives.' + i + '.status', ThisItemStatus); API.LMSSetValue('cmi.interactions.' + i + '.weighting', I[i][0]); //We can only use the performance type, because we're storing multiple responses of various types. API.LMSSetValue('cmi.interactions.' + i + '.type', 'performance'); API.LMSSetValue('cmi.interactions.' + i + '.student_response', State[i][5]); } } API.LMSCommit(''); } } [/inclScorm1.2] //JQUIZ CORE JAVASCRIPT CODE var CurrQNum = 0; var CorrectIndicator = '[strCorrectIndicator]'; var IncorrectIndicator = '[strIncorrectIndicator]'; var YourScoreIs = '[strYourScoreIs]'; var ContinuousScoring = [boolContinuousScoring]; var CorrectFirstTime = '[strCorrectFirstTime]'; var ShowCorrectFirstTime = [boolShowCorrectFirstTime]; var ShuffleQs = [boolShuffleQs]; var ShuffleAs = [boolShuffleAs]; var DefaultRight = '[strDefaultRight]'; var DefaultWrong = '[strDefaultWrong]'; var QsToShow = [QsToShow]; var Score = 0; var Finished = false; var Qs = null; var QArray = new Array(); var ShowingAllQuestions = false; var ShowAllQuestionsCaption = '[strShowAllQuestionsCaptionJS]'; var ShowOneByOneCaption = '[strShowOneByOneCaptionJS]'; var State = new Array(); var Feedback = ''; var TimeOver = false; var strInstructions = ''; var Locked = false; //The following variable can be used to add a message explaining that //the question is finished, so no further marking will take place. var strQuestionFinished = ''; function CompleteEmptyFeedback(){ var QNum, ANum; for (QNum=0; QNum 0){ I[QNum][3][ANum][1] = DefaultRight; } else{ I[QNum][3][ANum][1] = DefaultWrong; } } } } } } function SetUpQuestions(){ var AList = new Array(); var QList = new Array(); var i, j; Qs = document.getElementById('Questions'); while (Qs.getElementsByTagName('li').length > 0){ QList.push(Qs.removeChild(Qs.getElementsByTagName('li')[0])); } var DumpItem = 0; if (QsToShow > QList.length){ QsToShow = QList.length; } while (QsToShow < QList.length){ DumpItem = Math.floor(QList.length*Math.random()); for (j=DumpItem; j<(QList.length-1); j++){ QList[j] = QList[j+1]; } QList.length = QList.length-1; } if (ShuffleQs == true){ QList = Shuffle(QList); } if (ShuffleAs == true){ var As; for (var i=0; i 0){ AList.push(As.removeChild(As.getElementsByTagName('li')[0])); } AList = Shuffle(AList); for (j=0; j= QArray.length)){return;} QArray[CurrQNum].style.display = 'none'; CurrQNum += ChangeBy; QArray[CurrQNum].style.display = ''; //Undocumented function added 10/12/2004 ShowSpecialReadingForQuestion(); SetQNumReadout(); SetFocusToTextbox(); } var HiddenReadingShown = false; function ShowSpecialReadingForQuestion(){ //Undocumented function for showing specific reading text elements which change with each question //Added on 10/12/2004 if (document.getElementById('ReadingDiv') != null){ if (HiddenReadingShown == true){ document.getElementById('ReadingDiv').innerHTML = ''; } if (QArray[CurrQNum] != null){ //Fix for 6.0.4.25 var Children = QArray[CurrQNum].getElementsByTagName('div'); for (var i=0; i= QArray.length){ if (document.getElementById('NextQButton') != null){ document.getElementById('NextQButton').style.visibility = 'hidden'; } } else{ if (document.getElementById('NextQButton') != null){ document.getElementById('NextQButton').style.visibility = 'visible'; } } if (CurrQNum <= 0){ if (document.getElementById('PrevQButton') != null){ document.getElementById('PrevQButton').style.visibility = 'hidden'; } } else{ if (document.getElementById('PrevQButton') != null){ document.getElementById('PrevQButton').style.visibility = 'visible'; } } } [strItemArray] function StartUp(){ RemoveBottomNavBarForIE(); //If there's only one question, no need for question navigation controls if (QsToShow < 2){ document.getElementById('QNav').style.display = 'none'; } //Stash the instructions so they can be redisplayed strInstructions = document.getElementById('InstructionsDiv').innerHTML; [inclScorm1.2] ScormStartUp(); [/inclScorm1.2] [inclSendResults] GetUserName(); [/inclSendResults] [inclPreloadImages] PreloadImages([PreloadImageList]); [/inclPreloadImages] CompleteEmptyFeedback(); SetUpQuestions(); ClearTextBoxes(); CreateStatusArray(); [inclTimer] setTimeout('StartTimer()', 50); [/inclTimer] //Check search string for q parameter if (document.location.search.length > 0){ if (ShuffleQs == false){ var JumpTo = parseInt(document.location.search.substring(1,document.location.search.length))-1; if (JumpTo <= QsToShow){ ChangeQ(JumpTo); } } } //Undocumented function added 10/12/2004 ShowSpecialReadingForQuestion(); } function ShowHideQuestions(){ FuncBtnOut(document.getElementById('ShowMethodButton')); document.getElementById('ShowMethodButton').style.display = 'none'; if (ShowingAllQuestions == false){ for (var i=0; i -1){ //Add an extra message explaining that the question // is finished if defined by the user if (strQuestionFinished.length > 0){Feedback += '
' + strQuestionFinished;} //Show the feedback ShowMessage(Feedback); return; } //Hide the button while processing Btn.style.display = 'none'; //Increment the number of tries State[QNum][2]++; //Add the percent-correct value of this answer State[QNum][3] += I[QNum][3][ANum][3]; //Store the try number in the answer part of the State array, for tracking purposes State[QNum][1][ANum] = State[QNum][2]; if (State[QNum][5].length > 0){State[QNum][5] += ' | ';} State[QNum][5] += String.fromCharCode(65+ANum); //Should this answer be accepted as correct? if (I[QNum][3][ANum][2] < 1){ //It's wrong //Mark the answer Btn.innerHTML = IncorrectIndicator; //Remove any previous score unless exercise is finished (6.0.3.8+) if (Finished == false){ WriteToInstructions(strInstructions); } //Check whether this leaves just one MC answer unselected, in which case the Q is terminated var RemainingAnswer = FinalAnswer(QNum); if (RemainingAnswer > -1){ //Behave as if the last answer had been selected, but give no credit for it //Increment the number of tries State[QNum][2]++; //Calculate the score for this question CalculateMCQuestionScore(QNum); //Get the overall score and add it to the feedback CalculateOverallScore(); if ((ContinuousScoring == true)||(Finished == true)){ Feedback += '
' + YourScoreIs + ' ' + Score + '%.'; WriteToInstructions(YourScoreIs + ' ' + Score + '%.'); } } } else{ //It's right //Mark the answer Btn.innerHTML = CorrectIndicator; //Calculate the score for this question CalculateMCQuestionScore(QNum); //Get the overall score and add it to the feedback if (ContinuousScoring == true){ CalculateOverallScore(); if ((ContinuousScoring == true)||(Finished == true)){ Feedback += '
' + YourScoreIs + ' ' + Score + '%.'; WriteToInstructions(YourScoreIs + ' ' + Score + '%.'); } } } //Show the button again Btn.style.display = 'inline'; //Finally, show the feedback ShowMessage(Feedback); //Check whether all questions are now done CheckFinished(); } function CalculateMCQuestionScore(QNum){ var Tries = State[QNum][2] + State[QNum][4]; //include tries and hint penalties var PercentCorrect = State[QNum][3]; var TotAns = GetTotalMCAnswers(QNum); var HintPenalties = State[QNum][4]; //Make sure it's not already complete if (State[QNum][0] < 0){ //Allow for Hybrids if (HintPenalties >= 1){ State[QNum][0] = 0; } else{ //This line calculates the score for this question if (TotAns == 1){ State[QNum][0] = 1; } else{ State[QNum][0] = ((TotAns-((Tries*100)/State[QNum][3]))/(TotAns-1)); } } //Fix for Safari bug added for version 6.0.3.42 (negative infinity problem) if ((State[QNum][0] < 0)||(State[QNum][0] == Number.NEGATIVE_INFINITY)){ State[QNum][0] = 0; } } } function GetTotalMCAnswers(QNum){ var Result = 0; for (var ANum=0; ANum 0){State[QNum][5] += ' | ';} //Check if there are any mismatches Feedback = ''; var CheckBox = null; for (var ANum=0; ANum' + Feedback; if (Matches == I[QNum][3].length){ //It's right CalculateMultiSelQuestionScore(QNum); if (ContinuousScoring == true){ CalculateOverallScore(); if ((ContinuousScoring == true)||(Finished == true)){ Feedback += '
' + YourScoreIs + ' ' + Score + '%.'; WriteToInstructions(YourScoreIs + ' ' + Score + '%.'); } } } else{ //It's wrong -- Remove any previous score unless exercise is finished (6.0.3.8+) if (Finished == false){ WriteToInstructions(strInstructions); } } //Show the feedback ShowMessage(Feedback); //Check whether all questions are now done CheckFinished(); } function CalculateMultiSelQuestionScore(QNum){ var Tries = State[QNum][2]; var TotAns = State[QNum][1].length; //Make sure it's not already complete if (State[QNum][0] < 0){ State[QNum][0] = (TotAns - (Tries-1)) / TotAns; if (State[QNum][0] < 0){ State[QNum][0] = 0; } } } [/inclMultiSelect] function CalculateOverallScore(){ var TotalWeighting = 0; var TotalScore = 0; for (var QNum=0; QNum -1){ TotalWeighting += I[QNum][0]; TotalScore += (I[QNum][0] * State[QNum][0]); } } } if (TotalWeighting > 0){ Score = Math.floor((TotalScore/TotalWeighting)*100); } else{ //if TotalWeighting is 0, no questions so far have any value, so //no penalty should be shown. Score = 100; } } function CheckFinished(){ var FB = ''; var AllDone = true; for (var QNum=0; QNum= 1){ CFT++; } } } FB += '
' + CorrectFirstTime + ' ' + CFT + '/' + QsToShow; } WriteToInstructions(FB); Finished == true; [inclTimer] window.clearInterval(Interval); [/inclTimer] [inclScorm1.2] if (TimeOver == true){ SetScormTimedOut(); } else{ SetScormComplete(); } [/inclScorm1.2] TimeOver = true; Locked = true; [inclSendResults] setTimeout('SendResults(' + Score + ')', 50); [/inclSendResults] Finished = true; Detail = ''; for (QNum=0; QNum 0){ Detail += 'Question #' + (QNum+1) + 'question-trackingQ ' + (QNum+1) + 'QuestionTrackingField' + State[QNum][5] + ''; } } } Detail += ''; setTimeout('Finish()', SubmissionTimeout); } [inclScorm1.2] else{ SetScormIncomplete(); } [/inclScorm1.2] } [inclTimer] function TimesUp(){ document.getElementById('Timer').innerHTML = '[strTimesUp]'; [inclPreloadImages] RefreshImages(); [/inclPreloadImages] TimeOver = true; Finished = true; ShowMessage('[strTimesUp]'); //Set all remaining scores to 0 for (var QNum=0; QNum