[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]