mirror of
https://github.com/moodle/moodle.git
synced 2025-02-22 02:49:53 +01:00
373 lines
9.1 KiB
Plaintext
373 lines
9.1 KiB
Plaintext
[inclScorm1.2]
|
|
//JCROSS-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 a detailed reports on the item
|
|
var ItemLabel = 'Crossword';
|
|
API.LMSSetValue('cmi.objectives.0.id', 'obj'+ItemLabel);
|
|
API.LMSSetValue('cmi.interactions.0.id', 'int'+ItemLabel);
|
|
if (Finished == true){
|
|
API.LMSSetValue('cmi.objectives.0.status', 'completed');
|
|
}
|
|
else{
|
|
API.LMSSetValue('cmi.objectives.0.status', 'incomplete');
|
|
}
|
|
API.LMSSetValue('cmi.objectives.0.score.min', '0');
|
|
API.LMSSetValue('cmi.objectives.0.score.max', '100');
|
|
API.LMSSetValue('cmi.objectives.0.score.raw', Score);
|
|
//We're not sending any student response data, so we can set this to a non-standard value
|
|
API.LMSSetValue('cmi.interactions.0.type', 'crossword');
|
|
|
|
API.LMSCommit('');
|
|
}
|
|
}
|
|
[/inclScorm1.2]
|
|
|
|
//JCROSS CORE JAVASCRIPT CODE
|
|
|
|
var InGap = false;
|
|
var CurrentBox = null;
|
|
var Feedback = '';
|
|
var AcrossCaption = '';
|
|
var DownCaption = '';
|
|
var Correct = '[strCorrect]';
|
|
var Incorrect = '[strIncorrect]';
|
|
var GiveHint = '[strGiveHint]';
|
|
var YourScoreIs = '[strYourScoreIs]';
|
|
var BuiltGrid = '';
|
|
var BuiltExercise = '';
|
|
var Penalties = 0;
|
|
var Score = 0;
|
|
var InTextBox = false;
|
|
var Locked = false;
|
|
var TimeOver = false;
|
|
var CaseSensitive = [boolCaseSensitive];
|
|
|
|
var InputStuff = '<form method="post" action="" onsubmit="return false;"><span class="ClueNum">[strClueNum]: </span>';
|
|
InputStuff += '[strClue] <input onfocus="CurrentBox=this;InTextBox=true;" onblur="InTextBox=false;" id="[strBoxId]" type="edit" size="[strEditSize]" maxlength="[strMaxLength]"></input>';
|
|
InputStuff += '<button class="FuncButton" onfocus="FuncBtnOver(this)" onblur="FuncBtnOut(this)" onmouseover="FuncBtnOver(this)" onmouseout="FuncBtnOut(this)" onmousedown="FuncBtnDown(this)" onmouseup="FuncBtnOut(this)" onclick="EnterGuess([strParams])">[strEnterCaption]</button>';
|
|
InputStuff += '[inclHint]<button class="FuncButton" onfocus="FuncBtnOver(this)" onblur="FuncBtnOut(this)" onmouseover="FuncBtnOver(this)" onmouseout="FuncBtnOut(this)" onmousedown="FuncBtnDown(this)" onmouseup="FuncBtnOut(this)" onclick="ShowHint([strParams])">[strHintCaption]</button>[/inclHint]';
|
|
InputStuff += '</form>';
|
|
|
|
var CurrBoxElement = null;
|
|
var Finished = false;
|
|
|
|
function StartUp(){
|
|
RemoveBottomNavBarForIE();
|
|
//Show a keypad if there is one (added bugfix for 6.0.4.12)
|
|
if (document.getElementById('CharacterKeypad') != null){
|
|
document.getElementById('CharacterKeypad').style.display = 'block';
|
|
}
|
|
[inclScorm1.2]
|
|
ScormStartUp();
|
|
[/inclScorm1.2]
|
|
|
|
AcrossCaption = document.getElementById('CluesAcrossLabel').innerHTML;
|
|
DownCaption = document.getElementById('CluesDownLabel').innerHTML;
|
|
[inclSendResults]
|
|
GetUserName();
|
|
[/inclSendResults]
|
|
|
|
[inclPreloadImages]
|
|
PreloadImages([PreloadImageList]);
|
|
[/inclPreloadImages]
|
|
|
|
[inclTimer]
|
|
StartTimer();
|
|
[/inclTimer]
|
|
|
|
}
|
|
|
|
function GetAnswerLength(Across,x,y){
|
|
Result = 0;
|
|
if (Across == false){
|
|
while ((x<L.length)&&(L[x][y].length > 0)){
|
|
Result += L[x][y].length;
|
|
x++;
|
|
}
|
|
return Result;
|
|
}
|
|
else{
|
|
while ((y<L[x].length)&&(L[x][y].length > 0)){
|
|
Result += L[x][y].length;
|
|
y++;
|
|
}
|
|
return Result;
|
|
}
|
|
}
|
|
|
|
function GetEditSize(Across,x,y){
|
|
var Len = GetAnswerLength(Across,x,y);
|
|
if (IsCJK(L[x][y].charCodeAt(0))){
|
|
Len *= 2;
|
|
}
|
|
return Len;
|
|
}
|
|
|
|
function ShowClue(ClueNum,x,y){
|
|
var Result = '';
|
|
var Temp;
|
|
var strParams;
|
|
var Clue = document.getElementById('Clue_A_' + ClueNum);
|
|
if (Clue != null){
|
|
Temp = InputStuff.replace(/\[ClueNum\]/g, ClueNum);
|
|
Temp = Temp.replace(/\[strClueNum\]/g, AcrossCaption + ' ' + ClueNum);
|
|
strParams = 'true,' + ClueNum + ',' + x + ',' + y + ',\'[strBoxId]\'';
|
|
Temp = Temp.replace(/\[strParams\]/g, strParams);
|
|
Temp = Temp.replace(/\[strBoxId\]/g, 'GA_' + ClueNum + '_' + x + '_' + y);
|
|
Temp = Temp.replace(/\[strEditSize\]/g, GetEditSize(true,x,y));
|
|
Temp = Temp.replace(/\[strMaxLength\]/g, GetAnswerLength(true,x,y));
|
|
Temp = Temp.replace(/\[strClue\]/g, Clue.innerHTML, Temp);
|
|
Result += Temp;
|
|
}
|
|
Clue = document.getElementById('Clue_D_' + ClueNum);
|
|
if (Clue != null){
|
|
Temp = InputStuff.replace(/\[ClueNum\]/g, ClueNum);
|
|
Temp = Temp.replace(/\[strClueNum\]/g, DownCaption + ' ' + ClueNum);
|
|
strParams = 'false,' + ClueNum + ',' + x + ',' + y + ',\'[strBoxId]\'';
|
|
Temp = Temp.replace(/\[strParams\]/g, strParams);
|
|
Temp = Temp.replace(/\[strBoxId\]/g, 'GD_' + ClueNum + '_' + x + '_' + y);
|
|
Temp = Temp.replace(/\[strEditSize\]/g, GetAnswerLength(false,x,y));
|
|
Temp = Temp.replace(/\[strClue\]/g, Clue.innerHTML, Temp);
|
|
Result += Temp;
|
|
}
|
|
document.getElementById('ClueEntry').innerHTML = Result;
|
|
}
|
|
|
|
function EnterGuess(Across,ClueNum,x,y,BoxId){
|
|
if (document.getElementById(BoxId) != null){
|
|
var Guess = document.getElementById(BoxId).value;
|
|
var AnsLength = GetAnswerLength(Across,x,y);
|
|
EnterAnswer(Guess,Across,AnsLength,x,y);
|
|
}
|
|
}
|
|
|
|
function SplitStringToPerceivedChars(InString, PC){
|
|
var Temp = InString.charAt(0);
|
|
if (InString.length > 1){
|
|
for (var i=1; i<InString.length; i++){
|
|
if (IsCombiningDiacritic(InString.charCodeAt(i)) == true){
|
|
Temp += InString.charAt(i);
|
|
}
|
|
else{
|
|
PC.push(Temp);
|
|
Temp = InString.charAt(i);
|
|
}
|
|
}
|
|
}
|
|
PC.push(Temp);
|
|
}
|
|
|
|
function EnterAnswer(Guess,Across,AnsLength,x,y){
|
|
var PC = new Array();
|
|
SplitStringToPerceivedChars(Guess, PC);
|
|
|
|
var i=x;
|
|
var j=y;
|
|
var Letter = 0;
|
|
while (Letter < AnsLength){
|
|
if (Letter < PC.length){
|
|
G[i][j] = PC[Letter];
|
|
if (document.getElementById('L_' + i + '_' + j) != null){
|
|
document.getElementById('L_' + i + '_' + j).innerHTML = PC[Letter];
|
|
}
|
|
}
|
|
if (Across == true){
|
|
j++;
|
|
}
|
|
else{
|
|
i++;
|
|
}
|
|
Letter++;
|
|
}
|
|
}
|
|
|
|
function SetGridSquareValue(x,y,Val){
|
|
var GridId = 'L_' + x + '_' + y;
|
|
if (document.getElementById(GridId) != null){
|
|
document.getElementById(GridId).innerHTML = Val;
|
|
}
|
|
}
|
|
|
|
function ShowHint(Across,ClueNum,x,y,BoxId){
|
|
var i=x;
|
|
var j=y;
|
|
var LetterFromGuess = '';
|
|
var LetterFromKey = '';
|
|
var OutString = '';
|
|
if (Across==true){
|
|
while (j<L[i].length){
|
|
if (L[i][j] != ''){
|
|
OutString += L[i][j];
|
|
if (CaseSensitive == true){
|
|
LetterFromKey = L[i][j];
|
|
LetterFromGuess = G[i][j];
|
|
}
|
|
else {
|
|
LetterFromKey = L[i][j].toUpperCase();
|
|
LetterFromGuess = G[i][j].toUpperCase();
|
|
}
|
|
if (LetterFromGuess != LetterFromKey){
|
|
// if (G[i][j] != L[i][j]){
|
|
G[i][j] = L[i][j];
|
|
Penalties++;
|
|
break;
|
|
}
|
|
}
|
|
else{
|
|
break;
|
|
}
|
|
j++;
|
|
}
|
|
}
|
|
else{
|
|
while (i<L.length){
|
|
if (L[i][j] != ''){
|
|
OutString += L[i][j];
|
|
if (CaseSensitive == true){
|
|
LetterFromKey = L[i][j];
|
|
LetterFromGuess = G[i][j];
|
|
}
|
|
else {
|
|
LetterFromKey = L[i][j].toUpperCase();
|
|
LetterFromGuess = G[i][j].toUpperCase();
|
|
}
|
|
if (LetterFromGuess != LetterFromKey){
|
|
// if (G[i][j] != L[i][j]){
|
|
G[i][j] = L[i][j];
|
|
Penalties++;
|
|
break;
|
|
}
|
|
}
|
|
else{
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
if (document.getElementById(BoxId) != null){
|
|
document.getElementById(BoxId).value = OutString;
|
|
}
|
|
}
|
|
|
|
L = new Array();
|
|
[strLetterArray]
|
|
|
|
CL = new Array();
|
|
[strClueNumArray]
|
|
|
|
G = new Array();
|
|
[strGuessArray]
|
|
|
|
function CheckAnswers(){
|
|
if (Locked == true){return;}
|
|
|
|
var AllCorrect = true;
|
|
var TotLetters = 0;
|
|
var CorrectLetters = 0;
|
|
var LetterFromKey = '';
|
|
var LetterFromGuess = '';
|
|
|
|
//Check each letter
|
|
for (var i=0; i<L.length; i++){
|
|
for (var j=0; j<L[i].length; j++){
|
|
if (L[i][j] != ''){
|
|
TotLetters++;
|
|
if (CaseSensitive == true) {
|
|
LetterFromKey = L[i][j];
|
|
LetterFromGuess = G[i][j];
|
|
}
|
|
else {
|
|
LetterFromKey = L[i][j].toUpperCase();
|
|
LetterFromGuess = G[i][j].toUpperCase();
|
|
}
|
|
if (LetterFromGuess != LetterFromKey){
|
|
G[i][j] = '';
|
|
//Blank that square in the grid
|
|
SetGridSquareValue(i,j,'');
|
|
AllCorrect = false;
|
|
}
|
|
else{
|
|
CorrectLetters++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Score = Math.floor(((CorrectLetters-Penalties) * 100)/TotLetters);
|
|
if (Score < 0){Score = 0;}
|
|
|
|
//Compile the output
|
|
var Output = '';
|
|
|
|
if (AllCorrect == true){
|
|
Output = Correct + '<br />';
|
|
}
|
|
|
|
Output += YourScoreIs + ' ' + Score + '%.<br />';
|
|
if (AllCorrect == false){
|
|
Output += Incorrect;
|
|
Penalties++;
|
|
}
|
|
|
|
ShowMessage(Output);
|
|
WriteToInstructions(Output);
|
|
|
|
if ((AllCorrect == true)||(TimeOver == true)){
|
|
[inclSendResults]
|
|
setTimeout('SendResults(' + Score + ')', 50);
|
|
[/inclSendResults]
|
|
[inclTimer]
|
|
window.clearInterval(Interval);
|
|
[/inclTimer]
|
|
TimeOver = true;
|
|
Locked = true;
|
|
Finished = true;
|
|
setTimeout('Finish()', SubmissionTimeout);
|
|
}
|
|
[inclScorm1.2]
|
|
if (AllCorrect == true){
|
|
SetScormComplete();
|
|
}
|
|
else{
|
|
SetScormIncomplete();
|
|
}
|
|
[/inclScorm1.2]
|
|
}
|
|
|
|
function Finish(){
|
|
//If there's a form, fill it out and submit it
|
|
if (document.store != null){
|
|
Frm = document.store;
|
|
Frm.starttime.value = HPNStartTime;
|
|
Frm.endtime.value = (new Date()).getTime();
|
|
Frm.mark.value = Score;
|
|
Frm.submit();
|
|
}
|
|
}
|
|
|
|
function TypeChars(Chars){
|
|
if (CurrentBox != null){
|
|
CurrentBox.value += Chars;
|
|
}
|
|
}
|
|
|
|
[inclTimer]
|
|
function TimesUp() {
|
|
document.getElementById('Timer').innerHTML = '[strTimesUp]';
|
|
[inclPreloadImages]
|
|
RefreshImages();
|
|
[/inclPreloadImages]
|
|
TimeOver = true;
|
|
Finished = true;
|
|
CheckAnswers();
|
|
Locked = true;
|
|
[inclScorm1.2]
|
|
SetScormTimedOut();
|
|
[/inclScorm1.2]
|
|
}
|
|
[/inclTimer] |