
// Global variables for platform branching
var NN, NN4, IE, MAC, browserVersion;

// Global variable for the score percentage
var percentageScore = "";

// Global variables for border around bodyDiv, the main division where items are presented.
var xBorder = 0;
var yBorder = 0;

// Global variables for position of feedback divs.
var xFeedback = 200;
var yFeedback = 150;

// Global variables for left and top margin if shifting due to unpublished extras.
shiftLeftMin = 30;
shiftTopMin = 30;

// Global array containing HTML for output
var out = new Array();
var extraOut = new Array();
var linkOut = new Array();

// Global array containing data for all test items.
var testItemArray = new Array();

// Globals for drag drop distractor processing
var isDragDrop = false;
var distractorCount = 0;

// Globals for multi-choice example processing
var isMultiChoice = false;
var exampleCount = 0;

// Globals for fill-blank processing
var isFillBlank = false;


// Global variable containing URL path to images directory
var playerImagesDirectoryURL;


// Global array containing student responses
var studentResponseArray = new Array();

// Boolean array showing whether activity completed.
var activityCompletedArray = new Array();

// Global variables for activity and assignment data
var activityName;
var gradebookID;
var gradebookDesc;
var displayName;
var assignmentName;
var activityUniqueId;

// Global var indicating if the activity score has been submitted to Lycea.
var scoreSubmitted = false;

// Global variable of current student score
var studentScore = 0;

// Global boolean of whether to print
// IE was losing reference to scoreWindow.
var m_printScoreWindow = false;

var testItemsAttempted = 0;
var studentResponsesWritten;
var feedbackShown = false; // has student been shown feedback at end of test.

var useBrowserWnd = false;	// Should score info be shown in a new browser window (rather than an alert).

// Globals hold location of click relative to element
var offsetX, offsetY


//Global switches for output, set by author of interactive in loadData()
//readWrite outputMode added.
var multiPageFormat; // determines whether to display data as single page or multiple pages.
var randomizeItems; // determines whether to randomize test item order.
var evaluationMode; // values "Practice", "Evaluation" -- the mode the activity is running in.
var feedbackMode; // values "Immediate", "Cumulative" -- when feedback is given
var outputMode; // values "Publish", "" -- should publish button be shown?
var emailScores; // values "T" or "F", should the email scores functionality be available?


// Window to contain the score.
var scoreWindow;

// Has frameset been loaded?
var allFramesLoaded = false;


// html for new line
var m_newLine = "<BR>";

// Type of activity
var activityType = "";

// --------------------------------------------------------------------------------------------
// COMMON FUNCTIONS
// --------------------------------------------------------------------------------------------

// Browser test
if (parseInt(navigator.appVersion) >= 4)
{
	if (navigator.appName == "Netscape")
		NN = true
	else
		IE = true
}
// Version
if (IE) {
	browserVersion = navigator.appVersion.charAt(navigator.appVersion.indexOf("MSIE") + 5);
}
else if (NN) {
	var sIndex = navigator.userAgent.lastIndexOf("/");
	browserVersion = navigator.userAgent.substring(sIndex+1,sIndex+4);
	if (navigator.userAgent.indexOf("Firefox") != -1 || navigator.userAgent.indexOf("Safari") != -1)
		browserVersion = "7";
}

if (NN && browserVersion < 6)
	NN4 = true;

// Computer test
if (navigator.appVersion.indexOf("Mac") != -1) {
	MAC = true;
}

// Main Divs in document
// some div paths are assigned in init()
var objectPath;
var popupDiv;
var popupDivClose; // used to fix NN bug

if (NN) {
	objectPath = document;
}
	
else if (IE) {
	objectPath = document.all;
}

// returns the status of all frames loaded.
function getAllFramesLoaded() {
	allFramesLoaded = parent.getAllFramesLoaded()
	return allFramesLoaded;
}


function centerCopyrightDiv() {
	var cwDiv = getObj("copyrightDiv");
	var x = Math.round((getWindowWidth()/2) - (getWidth(cwDiv)/2));
	var y = getTop(cwDiv);

	// fudge factor for silly NS
	if (NN) 
		x *= .5;
	setPos(cwDiv, x, y);
}




// init runs after page loaded.
function init() {
	if (!NN || !MAC)
		document.onkeypress = keyPress;
	
	centerCopyrightDiv();
	
	// Do not let NN users resize window.
	// Resizing causes the page to reload incorrectly -- Netscape Bug
	if (NN4) {
		setResizable(false);
	}	
	loadTestItems(); // put test items into testItem array
	
	// ---------------------
	//Add the current activity to the projectData if loaded in a frameset
	if ((parent != self) && (getAllFramesLoaded())) {
		parent.projectData.setAssignment (getProject());
		parent.projectData.addActivity (activityId, activityName, displayName, 0, 0, false, activityType);

		// Set the title bar text to the display name if there is a value set and not in a project.
		if ( displayName != null && displayName != "" && parent.document.title != "Project") {
			parent.document.title = displayName;
		}
	}
	
	// if this is a drag drop activity, count all the distractor items
	if (testItemArray.length > 0 && testItemArray[0].type == "drag drop")
	{
		isDragDrop = true;

		for (var i = 0; i < testItemArray.length; i++)
		{
			if (testItemArray[i].distractor)
				distractorCount++;
		}
	}

	// if this is a multi-choice activity, count all the example items
	if (testItemArray.length > 0 && testItemArray[0].type == "multiple choice")
	{
		isMultiChoice = true;

		for (var i = 0; i < testItemArray.length; i++)
		{
			if (testItemArray[i].example)
				exampleCount++;
		}
	}

	// check if this is a fill-blank activity
	if (testItemArray.length > 0 && testItemArray[0].type == "short answer")
		isFillBlank = true;

	orderTestItems(); // order activity items by their top value

	formatTestItems(); // format test items as HTML
	
	writeAllTestItems(); // write out all test item HTML
	
	
	if (NN4) {
		popupDiv = objectPath.popupDiv;
		popupDivClose = objectPath.popupDivClose;
	}
	
	else {
		popupDiv = getObj("popupDiv");
		popupDivClose = getObj("popupDivClose");
	}
}

function getActivityId () {

	return activityId;
}

function getActivityName () {

	return activityName;
}

function getDisplayName () {

	return displayName;
}

function getActivityType () {

	return activityType;
}

// Get the project name from the query string
function getProject() {
	var projectName = "";
	var args = getArgs();
	if (args.projectName) projectName = args.projectName;

	return projectName;
}

// Get the query string arguments
function getArgs() {

	var args = new Object();
	var query = location.search.substring(1);
	var pairs = query.split("&");
	for (var i = 0; i<pairs.length; i++) {
		var pos = pairs[i].indexOf('=');
		if (pos == -1) continue;
		var argname = pairs[i].substring(0, pos);
		var value = pairs[i].substring(pos + 1);
		args[argname] = unescape(value);
	}
	return args;

}

// returns testItemsAttempted
function getTestItemsAttempted() {
	return testItemsAttempted;
}

// hide the feedback divs
function hideFeedbackDivs() {

	setHide(getObj("correctFeedbackDiv"));	// Hide the popup feedback messages
	setHide(getObj("incorrectFeedbackDiv"));
	checkActivityComplete();
}

function showFeedback(feedbackType, feedbackText, activityType) {
	
	// Set the html for the close button.  If scored activity type, point to the specialized function which displays the total score at the end.
	var closeButton;
	if ( activityType == "FillBlank" ||  activityType == "Multichoice" || activityType == "DragDrop") {
		closeButton = "<P align=right><A HREF=\"javascript:hideScoredFeedbackDivs()\"><IMG id='feedbackCloseButton' SRC=\"" + playerImagesDirectoryURL + "close.gif\" BORDER=0 onMouseDown='hideScoredFeedbackDivs(); window.event.cancelBubble=true'></A></P>";
	}else {
		closeButton = "<P align=right><A HREF=\"javascript:hideFeedbackDivs()\"><IMG id='feedbackCloseButton' SRC=\"" + playerImagesDirectoryURL + "close.gif\" BORDER=0 onMouseDown='hideFeedbackDivs(); window.event.cancelBubble=true'></A></P>";
	}
	
	var feedbackBgColor;

	if (feedbackType == "correct") {
		//playSound("correct");
		feedbackBgColor = "#99FF99"; 
	}
	
	else {
		//playSound("incorrect");
		feedbackBgColor = "#FF9999"; 
	}
	
	
	// Set an appropriate width for the feedback div based on the max line width of the feedback text.
	// This code cycles through the feedback text and determines the max width before a newline or breaktag.
	var feedbackBoxWidth = "";
	var index = 0;
	var diff = 0;
	var lastIndex = 0;
	var maxWidth = 0;
	var numOfLines = 1;
		
	// If feedbackText is less than 30 (before hard return) or over 250 chars use a default width, otherwise don't specify the width.
	if ( feedbackText.toString().indexOf("<BR>") != -1 ) {
		while (index != -1)
		{
			lastIndex = index;
			index = feedbackText.toString().indexOf("<BR>", lastIndex + 1)
			if (index == -1){
				diff = feedbackText.toString().length - lastIndex;
			}else {
				diff = index - lastIndex;
				numOfLines = numOfLines + 1;
			}
			if (maxWidth < diff)
				maxWidth = diff;			
		}	
		if ( maxWidth < 29 )
			feedbackBoxWidth = "WIDTH=200";
			
	} else if ( feedbackText.toString().indexOf("\n") != -1 ) {
		while (index != -1)
		{
			lastIndex = index;
			index = feedbackText.toString().indexOf("\n", lastIndex + 1)
			if (index == -1){
				diff = feedbackText.toString().length - lastIndex;
			}else {
				diff = index - lastIndex;
				numOfLines = numOfLines + 1;
			}
			if (maxWidth < diff)
				maxWidth = diff;
		}		
		if ( maxWidth < 29 )
			feedbackBoxWidth = "WIDTH=200";
			
	} else {
		if ( feedbackText.length < 30 )
			feedbackBoxWidth = "WIDTH=200";
	}

	if ( feedbackText.length > 250 ) {
		feedbackBoxWidth = "WIDTH=400";
	}

	//For IE5 Mac added an extra </table> tag at the end of the feedback
	//footer to fix a bug in the way the feedback box was being displayed.
	if ( MAC && IE && browserVersion == 5 ) {
		var feedbackHeaderHTML = "<TABLE " + feedbackBoxWidth + " BGCOLOR=" + feedbackBgColor + " CELLPADDING=1 CELLSPACING=0 BORDER=0><TR><TD><TABLE " + feedbackBoxWidth + " BGCOLOR=#EEEEEE BORDER=0 CELLSPACING=0 CELLPADDING=4><TR><TD VALIGN=MIDDLE ALIGN=LEFT><font size=-1 face=VERDANA,HELVETICA,helvetica,arial>";
		var feedbackFooterHTML = "</TD></TR></TABLE></TD></TR></TABLE></TABLE>";
	} else {
		var feedbackHeaderHTML = "<TABLE " + feedbackBoxWidth + " BGCOLOR=" + feedbackBgColor + " CELLPADDING=1 CELLSPACING=0 BORDER=0><TR><TD><TABLE " + feedbackBoxWidth + " BGCOLOR=#EEEEEE BORDER=0 CELLSPACING=0 CELLPADDING=4><TR><TD VALIGN=MIDDLE ALIGN=LEFT><font size=-1 face=VERDANA,HELVETICA,helvetica,arial>";
		var feedbackFooterHTML = "</TD></TR></TABLE></TD></TR></TABLE>";
	}

	// Use default feedback if feedbackText is blank
	if (feedbackText == "" && feedbackType == "correct") {
		feedbackText = "";
		
	}
	
	else if (feedbackText == "" && feedbackType == "incorrect") {
		feedbackText = "";
		
	}
	
	// Write the feedback text to the feedback divs	
	// (Note: Writing to both feedback divs for simplicity).
	if (NN4) {
		objectPath.correctFeedbackDiv.document.write(feedbackHeaderHTML + closeButton + feedbackText + feedbackFooterHTML);
		objectPath.correctFeedbackDiv.document.close();
		objectPath.incorrectFeedbackDiv.document.write(feedbackHeaderHTML + closeButton + feedbackText + feedbackFooterHTML);
		objectPath.incorrectFeedbackDiv.document.close();
	}
			
	else {
		getObj("correctFeedbackDiv").innerHTML = feedbackHeaderHTML + closeButton + feedbackText + feedbackFooterHTML;
		getObj("incorrectFeedbackDiv").innerHTML = feedbackHeaderHTML + closeButton + feedbackText + feedbackFooterHTML;
	}

	// Place the feedback divs in the correct position
	placeScreenObject(getObj("correctFeedbackDiv"), xFeedback, yFeedback);
	placeScreenObject(getObj("incorrectFeedbackDiv"), xFeedback, yFeedback);
	
	// Show the correct feedback div
	// In Netscape, use alert box because of problem with overlaying form elements.
	if (NN4) {
		//alert(feedbackText);
		displayFeedback(feedbackText, feedbackBoxWidth, numOfLines);
		
		// Check requirements for showing the total score summary.
		if (checkActivityComplete()) {
			if ( feedbackMode == "Immediate" && evaluationMode == "Evaluation" ) {
				showCurrentScore();
			}
		}
	}
	else {
		if (feedbackType == "correct") {
			setShow(getObj("correctFeedbackDiv"));	// Show the popup feedback message for correct answer	
		}

		else if (feedbackType == "incorrect") {
			setShow(getObj("incorrectFeedbackDiv"));	// Show the popup feedback message for incorrect answer
		}
	}
	
}

// This function opens a new browswer window for question feedback.
// For now this will only be called for Netscape, but I have tried to make the code IE compatible just in case.
function displayFeedback(feedbackText, feedbackBoxWidth, numOfLines) {
	var newWindow;
	var pixelMultiple = 38; //trial & error conversion for lineheight/pixel ratio.
	feedbackBoxWidth = (feedbackBoxWidth == "") ? "width=200" : feedbackBoxWidth;
	// get the proper position to display window.
	if (NN) {
		positionX = "screenX=" + (xFeedback + pageXOffset);
		positionY = "screenY=" + (yFeedback + pageYOffset);
	}
	else if (IE) {
		positionX = "left=" + (xFeedback + document.body.scrollLeft);
		positionY = "top=" + (yFeedback + document.body.scrollTop);
	}	

	newWindow = window.open("","","height=" + (numOfLines * pixelMultiple) + "," + feedbackBoxWidth + "," + positionX + "," + positionY);
	newWindow.focus();
	var newContent = "<HTML>";
	newContent += "<BODY BGCOLOR='lightgrey'>";
	newContent += feedbackText;
	newContent += "<BR><FORM><CENTER><INPUT TYPE='button' VALUE='close' onClick='self.close()'></CENTER></FORM>";
	newContent += "</BODY></HTML>";
	newWindow.document.write(newContent);
	newWindow.document.close();
}

// Add HTML to variable "out" array for later output
function addToPageFormat(itemIndex, itemHTML) {

	out[itemIndex] = itemHTML;

}

// Add HTML to variable "extraOut" array for later output
function addToExtraPageFormat(extraIndex, itemHTML) {

	extraOut[extraIndex] = itemHTML;

}


// Add HTML to variable "linkOut" array for later output
function addToLinkPageFormat(linkIndex, itemHTML) {

	linkOut[linkIndex] = itemHTML;

}


// order test items by their top value
function orderTestItems () {

	var testItem;
	var testIndexMax = testItemArray.length - 1;
	var unsorted = true;
	
	while (unsorted) {
		unsorted = false;
		for (var i = 0; i < testIndexMax; i++) {
			
			if (testItemArray[i].top > testItemArray[i+1].top) {
				unsorted = true;
				testItem = testItemArray[i];
				testItemArray[i] = testItemArray[i+1];
				testItemArray[i+1] = testItem;
			}

		}
	}
}



// Show all answers
// Used if in explore mode, feedback at end.
function showAllAnswers () {
	for (var itemIndex = 0; itemIndex < testItemArray.length; itemIndex++) {
	
		// show correct drag drop activity item positions

		if (testItemArray[itemIndex].type == "drag drop") {

			if (NN4) {
				obj = eval("document.bodyDiv.document.dragDropSource" + testItemArray[itemIndex].id);
			}
			else {
				obj = getObj("dragDropSource" + testItemArray[itemIndex].id);
			}
			// move distractors back to their original positions and real items on their targets
			if (testItemArray[itemIndex].distractor)
				setPos(obj, testItemArray[itemIndex].sourceLeft, testItemArray[itemIndex].sourceTop);
			else
				setPos(obj, testItemArray[itemIndex].targetLeft, testItemArray[itemIndex].targetTop);
		}

	
		// show correct multiple choice activity items
		if (testItemArray[itemIndex].type == "multiple choice")
		{
			showMultipleChoiceCorrectAnswer(testItemArray[itemIndex], itemIndex, studentResponseArray[itemIndex]);
		}
		
		// show correct short answer activity items
		else if (testItemArray[itemIndex].type == "short answer") {
			if ( evaluationMode == "Practice" ) {
				// set form value of shortAnswerForm studentAnswer
				switch (testItemArray[itemIndex].numAnswerBoxes) {
				
					case 4 : 	correctAnswer = testItemArray[itemIndex].answerArray4[0];
								if (NN4)
									document.bodyDiv.document.layers["activityItem" + itemIndex].document.forms["shortAnswerForm" + itemIndex].studentAnswer4.value = correctAnswer;
								else
									document.forms["shortAnswerForm" + itemIndex].studentAnswer4.value = correctAnswer;

					case 3 : 	correctAnswer = testItemArray[itemIndex].answerArray3[0];
								if (NN4)
									document.bodyDiv.document.layers["activityItem" + itemIndex].document.forms["shortAnswerForm" + itemIndex].studentAnswer3.value = correctAnswer;
								else
									document.forms["shortAnswerForm" + itemIndex].studentAnswer3.value = correctAnswer;

					case 2 : 	correctAnswer = testItemArray[itemIndex].answerArray2[0];
								if (NN4)
									document.bodyDiv.document.layers["activityItem" + itemIndex].document.forms["shortAnswerForm" + itemIndex].studentAnswer2.value = correctAnswer;
								else
									document.forms["shortAnswerForm" + itemIndex].studentAnswer2.value = correctAnswer;
									
					case 1 : 	correctAnswer = testItemArray[itemIndex].answerArray[0];
								if (NN4)
									document.bodyDiv.document.layers["activityItem" + itemIndex].document.forms["shortAnswerForm" + itemIndex].studentAnswer1.value = correctAnswer;
								else
									document.forms["shortAnswerForm" + itemIndex].studentAnswer1.value = correctAnswer;
				}
			}			
		}

	}
}

// Computes and shows the student's score
function computeScore()
{
	var score = 0;
	var feedbackMessage = "";
	var feedbackObject = new ScoreInfoObject("", "", new Array());
	var notAttempted = 0;
	var studentAnswer1 = "";
	var studentAnswer2 = "";
	var studentAnswer3 = "";
	var studentAnswer4 = "";
	var answerIsCorrect;
	var activityItemId;
	var activityItemObj;
	var isCaseSensitive;
	var isRemoveWhitespace;

	useBrowserWnd = false;

	for (var itemIndex = 0; itemIndex < testItemArray.length; itemIndex++) {
		
		// Set the case sensitive flag.
		if (testItemArray[itemIndex].caseSensitive == "T") {
			isCaseSensitive = true;
		} else {
			isCaseSensitive = false;
		}
		
		// Set the whiteSpace flag.
		if (testItemArray[itemIndex].removeWhitespace == "T") {
			isRemoveWhitespace = true;
		} else {
			isRemoveWhitespace = false;
		}
	
		// Score drag drop activity items
		if (testItemArray[itemIndex].type == "drag drop") {
			if (studentResponseArray[itemIndex] == "correct") {
				score++;
			}
		}
		// Score multiple choice activity items
		else if (testItemArray[itemIndex].type == "multiple choice") {
			if (studentResponseArray[itemIndex] == getCorrectMultipleChoiceAnswerIndex(testItemArray[itemIndex])) {
				score++;
			}
		}
		// Score fill-in-the-blanks activity items
		else if (testItemArray[itemIndex].type == "short answer" && testItemArray[itemIndex].example != "T") {

			activityItemId = "activityItem" + itemIndex;

			switch (testItemArray[itemIndex].numAnswerBoxes) {

				case 4 :	// Get form value of shortAnswerForm studentAnswer4
							if (NN4)
								studentAnswer4 = document.bodyDiv.document.layers["activityItem" + itemIndex].document.forms["shortAnswerForm" + itemIndex].studentAnswer4.value;
							else
								studentAnswer4 = document.forms["shortAnswerForm" + itemIndex].studentAnswer4.value;
			
							// Record student answer if student hasn't already gotten feedback on their answers.
							if ((evaluationMode == "Evaluation") && (feedbackShown)) {
								studentAnswer4 = studentResponseArray[itemIndex][3];
							}
							else {
								if (studentResponseArray[itemIndex] == null)
									studentResponseArray[itemIndex] = new Array();

								studentResponseArray[itemIndex][3] = studentAnswer4;
							}

							// and compare it with testItemArray[itemIndex].answerArray4 values
							answerIsCorrect = false;
							for (var answerIndex = 0; answerIndex < testItemArray[itemIndex].answerArray4.length; answerIndex++) {
								if (isCaseSensitive) {
									if (isRemoveWhitespace) {
										if(removeWhitespace(studentAnswer4) == removeWhitespace(testItemArray[itemIndex].answerArray4[answerIndex])) {
											answerIsCorrect = true;
										}
									}else {
										if (studentAnswer4 == testItemArray[itemIndex].answerArray4[answerIndex]) {
											answerIsCorrect = true;
										}
									}
								}else {
									if (isRemoveWhitespace) {
										if(removeWhitespace(studentAnswer4.toLowerCase()) == removeWhitespace(testItemArray[itemIndex].answerArray4[answerIndex].toLowerCase())) {
											answerIsCorrect = true;
										}
									}else {
										if (studentAnswer4.toLowerCase() == testItemArray[itemIndex].answerArray4[answerIndex].toLowerCase()) {
											answerIsCorrect = true;
										}
									}								
								}
							}
							if (answerIsCorrect) score++;

				case 3 :	// Get form value of shortAnswerForm studentAnswer3
							if (NN4)
								studentAnswer3 = document.bodyDiv.document.layers["activityItem" + itemIndex].document.forms["shortAnswerForm" + itemIndex].studentAnswer3.value;
							else
								studentAnswer3 = document.forms["shortAnswerForm" + itemIndex].studentAnswer3.value;
			
							// Record student answer if student hasn't already gotten feedback on their answers.
							if ((evaluationMode == "Evaluation") && (feedbackShown)) {
								studentAnswer3 = studentResponseArray[itemIndex][2];
							}
							else {
								if (studentResponseArray[itemIndex] == null)
									studentResponseArray[itemIndex] = new Array();

								studentResponseArray[itemIndex][2] = studentAnswer3;
							}

							// and compare it with testItemArray[itemIndex].answerArray3 values
							answerIsCorrect = false;
							for (var answerIndex = 0; answerIndex < testItemArray[itemIndex].answerArray3.length; answerIndex++) {
								if (isCaseSensitive) {
									if (isRemoveWhitespace) {
										if(removeWhitespace(studentAnswer3) == removeWhitespace(testItemArray[itemIndex].answerArray3[answerIndex])) {
											answerIsCorrect = true;
										}
									}else {
										if (studentAnswer3 == testItemArray[itemIndex].answerArray3[answerIndex]) {
											answerIsCorrect = true;
										}
									}
								}else {
									if (isRemoveWhitespace) {
										if(removeWhitespace(studentAnswer3.toLowerCase()) == removeWhitespace(testItemArray[itemIndex].answerArray3[answerIndex].toLowerCase())) {
											answerIsCorrect = true;
										}
									}else {
										if (studentAnswer3.toLowerCase() == testItemArray[itemIndex].answerArray3[answerIndex].toLowerCase()) {
											answerIsCorrect = true;
										}
									}								
								}
							}
							if (answerIsCorrect) score++;

				case 2 :	// Get form value of shortAnswerForm studentAnswer2
							if (NN4)
								studentAnswer2 = document.bodyDiv.document.layers["activityItem" + itemIndex].document.forms["shortAnswerForm" + itemIndex].studentAnswer2.value;
							else
								studentAnswer2 = document.forms["shortAnswerForm" + itemIndex].studentAnswer2.value;
			
							// Record student answer if student hasn't already gotten feedback on their answers.
							if ((evaluationMode == "Evaluation") && (feedbackShown)) {
								studentAnswer2 = studentResponseArray[itemIndex][1];
							}
							else {
								if (studentResponseArray[itemIndex] == null)
									studentResponseArray[itemIndex] = new Array();

								studentResponseArray[itemIndex][1] = studentAnswer2;
							}

							// and compare it with testItemArray[itemIndex].answerArray2 values
							answerIsCorrect = false;
							for (var answerIndex = 0; answerIndex < testItemArray[itemIndex].answerArray2.length; answerIndex++) {
								if (isCaseSensitive) {							
									if (isRemoveWhitespace) {
										if(removeWhitespace(studentAnswer2) == removeWhitespace(testItemArray[itemIndex].answerArray2[answerIndex])) {
											answerIsCorrect = true;
										}
									}else {
										if (studentAnswer2 == testItemArray[itemIndex].answerArray2[answerIndex]) {
											answerIsCorrect = true;
										}
									}									
								}else {
									if (isRemoveWhitespace) {
										if(removeWhitespace(studentAnswer2.toLowerCase()) == removeWhitespace(testItemArray[itemIndex].answerArray2[answerIndex].toLowerCase())) {
											answerIsCorrect = true;
										}
									}else {
										if (studentAnswer2.toLowerCase() == testItemArray[itemIndex].answerArray2[answerIndex].toLowerCase()) {
											answerIsCorrect = true;
										}
									}						
								}
							}
							if (answerIsCorrect) score++;

				case 1 : 	// Get form value of shortAnswerForm studentAnswer1
							if (NN4)
								studentAnswer1 = document.bodyDiv.document.layers["activityItem" + itemIndex].document.forms["shortAnswerForm" + itemIndex].studentAnswer1.value;
							else
								studentAnswer1 = document.forms["shortAnswerForm" + itemIndex].studentAnswer1.value;
			
							// Record student answer if student hasn't already gotten feedback on their answers.
							if ((evaluationMode == "Evaluation") && (feedbackShown)) {
								studentAnswer1 = studentResponseArray[itemIndex][0];
							}
							else {
								if (studentResponseArray[itemIndex] == null)
									studentResponseArray[itemIndex] = new Array();

								studentResponseArray[itemIndex][0] = studentAnswer1;
							}

							// and compare it with testItemArray[itemIndex].answerArray values
							answerIsCorrect = false;
							for (var answerIndex = 0; answerIndex < testItemArray[itemIndex].answerArray.length; answerIndex++) {
								if (isCaseSensitive) {
									if (isRemoveWhitespace) {
										if(removeWhitespace(studentAnswer1) == removeWhitespace(testItemArray[itemIndex].answerArray[answerIndex])) {
											answerIsCorrect = true;
										}
									}else {
										if (studentAnswer1 == testItemArray[itemIndex].answerArray[answerIndex]) {
											answerIsCorrect = true;
										}
									}
								}else {							
									if (isRemoveWhitespace) {
										if(removeWhitespace(studentAnswer1.toLowerCase()) == removeWhitespace(testItemArray[itemIndex].answerArray[answerIndex].toLowerCase())) {
											answerIsCorrect = true;
										}
									}else {
										if (studentAnswer1.toLowerCase() == testItemArray[itemIndex].answerArray[answerIndex].toLowerCase()) {
											answerIsCorrect = true;
										}
									}									
								}
							}
							if (answerIsCorrect) score++;

			}
		}
	}

//	notAttempted = testItemArray.length - testItemsAttempted;

	// If its a fill-blank, studentResponseArray is an array of arrays and test items may contain multiple answer boxes.
	// Call FB functions to deal with this.
	if (isFillBlank)
	{
		notAttempted = getFBBoxCount() - getFBAttemptedCount();
		testItemsAttempted = getFBAttemptedCount();
	}

	// if its a drag drop, don't count the distractors
	if (isDragDrop)
		notAttempted = testItemArray.length - distractorCount - testItemsAttempted;

	// if its a multichoice, don't count the examples
	if (isMultiChoice)
		notAttempted = testItemArray.length - exampleCount - testItemsAttempted;

	// Set the complete property of the activity object to true
	// if all items completed.
	if (notAttempted == 0) {
		// Show the showAllAnswersButton if in Cumulative feedback mode
		//if (feedbackMode == "Cumulative")
		//	if (NN) 
		//		setShow(objectPath.studentInfoDiv.document.showAllAnswersButton);
		//	else
		//		setShow(objectPath.studentInfoDiv.document.all.showAllAnswersButton);
		// if loaded within a frameset
		if (parent != self) {
			if (!scoreSubmitted)
		    	parent.projectData.setComplete (true);
		}
	
	}
	
	// If student hasn't finished activity, don't show score.
	if ((feedbackMode == "Cumulative") && (notAttempted > 0))
	{
		feedbackMessage = "You have not yet completed " + notAttempted + " items. ";
	}
	else
	{
		useBrowserWnd = true;
		var percentage = 0;

		if (testItemsAttempted != 0)
			percentage = Math.round(score * 100 / testItemsAttempted);

		// Store the score in a global var to submit to the Lycea gradebook.
		percentageScore = percentage;

		// Create HTML feedback string to display in score summary window.
		feedbackMessage += "<table cellpadding='0' cellspacing='0'>\n";

		feedbackMessage += "<tr>\n";
		feedbackMessage += "<td align='center' bgcolor='#E0E0E0'>";
		feedbackMessage += "Scoring Summary";
		feedbackMessage += "</td>\n";
		feedbackMessage += "</tr>\n";

		feedbackMessage += "<tr>\n";
		feedbackMessage += "<td>";
		feedbackMessage += "You answered " + score + " out of " + testItemsAttempted + " items correctly. Your score: " + percentage + "%.";
		feedbackMessage += "</td>\n";
		feedbackMessage += "</tr>\n";
		
		// Create an alternate HTML free version in case the user will email their scores.
		feedbackObject.scoreSummary = "For activity \'" + gradebookDesc + "\', you answered " + score + " out of " + testItemsAttempted + " items correctly. Your score: " + percentage + " percent. ";

		var theMissedItems = "";


		// list all the questions with the positive or negative feedback depending on whether they
		// were answered correctly or not.
		for (var itemIndex = 0; itemIndex < testItemArray.length; itemIndex++)
		{
			if (testItemArray[itemIndex].type == "multiple choice" && !testItemArray[itemIndex].example)
			{
				var correctAnswerIndex = getCorrectMultipleChoiceAnswerIndex(testItemArray[itemIndex]);
				var studentAnswerIndex = studentResponseArray[itemIndex];

				if (correctAnswerIndex != studentAnswerIndex)
				{
					if (testItemArray[itemIndex].questionID.length > 0 || testItemArray[itemIndex].metadata.length > 0)
					{
						theMissedItems += formatSummaryTblRow(testItemArray[itemIndex].questionID, testItemArray[itemIndex].metadata);
						feedbackObject.missedItemsArray[feedbackObject.missedItemsArray.length] = testItemArray[itemIndex].questionID + " " + testItemArray[itemIndex].metadata;
					}
				}
			}

			if (testItemArray[itemIndex].type == "short answer" && testItemArray[itemIndex].example != "T")
			{
				var theStudentsAnswer = "";
				
				// Set the case sensitive flag.
				if (testItemArray[itemIndex].caseSensitive == "T") {
					isCaseSensitive = true;
				} else {
					isCaseSensitive = false;
				}
				
				// Set the whiteSpace flag.
				if (testItemArray[itemIndex].removeWhitespace == "T") {
					isRemoveWhitespace = true;
				} else {
					isRemoveWhitespace = false;
				}				

				if (testItemArray[itemIndex].numAnswerBoxes >= 1)
				{
					theStudentsAnswer = studentResponseArray[itemIndex][0];

					var answerIsCorrect = false;
					for (var answerIndex = 0; answerIndex < testItemArray[itemIndex].answerArray.length; answerIndex++)
					{
						if ( isCaseSensitive )
						{
							if (isRemoveWhitespace)
							{
								if (removeWhitespace(theStudentsAnswer) == removeWhitespace(testItemArray[itemIndex].answerArray[answerIndex]))
								{
									answerIsCorrect = true;
									break;
								}
							}
							else
							{
								if (theStudentsAnswer == testItemArray[itemIndex].answerArray[answerIndex])
								{
									answerIsCorrect = true;
									break;
								}
							}
						}
						else
						{
							if (isRemoveWhitespace)
							{
								if (removeWhitespace(theStudentsAnswer.toLowerCase()) == removeWhitespace(testItemArray[itemIndex].answerArray[answerIndex].toLowerCase()))
								{
									answerIsCorrect = true;
									break;
								}
							}
							else
							{						
								if (theStudentsAnswer.toLowerCase() == testItemArray[itemIndex].answerArray[answerIndex].toLowerCase())
								{
									answerIsCorrect = true;
									break;
								}
							}
						}
					}

					if (!answerIsCorrect)
					{
						if (testItemArray[itemIndex].questionName1.length > 0 || testItemArray[itemIndex].metaDataText1.length > 0)
						{
							theMissedItems += formatSummaryTblRow(testItemArray[itemIndex].questionName1, testItemArray[itemIndex].metaDataText1, itemIndex + 1, testItemArray[itemIndex].answerArray[testItemArray[itemIndex].prefAnswerIDX1]);
							feedbackObject.missedItemsArray[feedbackObject.missedItemsArray.length] = testItemArray[itemIndex].questionName1 + " The correct answer is: " + testItemArray[itemIndex].answerArray[testItemArray[itemIndex].prefAnswerIDX1] + ". " + testItemArray[itemIndex].metaDataText1;
						}

						/** HRW no longer wants the correct answer filled in.
						if (feedbackMode != "No feedback")
						{						
							// Fill in the correct answer
							if (NN4)
								document.bodyDiv.document.layers["activityItem" + itemIndex].document.forms["shortAnswerForm" + itemIndex].studentAnswer1.value = testItemArray[itemIndex].answerArray[0];
							else
								document.forms["shortAnswerForm" + itemIndex].studentAnswer1.value = testItemArray[itemIndex].answerArray[0];
						}
						**/
					}
				}

				if (testItemArray[itemIndex].numAnswerBoxes >= 2)
				{
					theStudentsAnswer = studentResponseArray[itemIndex][1];

					var answerIsCorrect = false;
					for (var answerIndex = 0; answerIndex < testItemArray[itemIndex].answerArray2.length; answerIndex++)
					{
						if ( isCaseSensitive )
						{
							if (isRemoveWhitespace)
							{
								if (removeWhitespace(theStudentsAnswer) == removeWhitespace(testItemArray[itemIndex].answerArray2[answerIndex]))
								{
									answerIsCorrect = true;
									break;
								}
							}
							else
							{
								if (theStudentsAnswer == testItemArray[itemIndex].answerArray2[answerIndex])
								{
									answerIsCorrect = true;
									break;
								}
							}							
						}
						else
						{
							if (isRemoveWhitespace)
							{
								if (removeWhitespace(theStudentsAnswer.toLowerCase()) == removeWhitespace(testItemArray[itemIndex].answerArray2[answerIndex].toLowerCase()))
								{
									answerIsCorrect = true;
									break;
								}
							}
							else
							{						
								if (theStudentsAnswer.toLowerCase() == testItemArray[itemIndex].answerArray2[answerIndex].toLowerCase())
								{
									answerIsCorrect = true;
									break;
								}
							}
						}
					}

					if (!answerIsCorrect)
					{
						if (testItemArray[itemIndex].questionName2.length > 0 || testItemArray[itemIndex].metaDataText2.length > 0)
						{
							theMissedItems += formatSummaryTblRow(testItemArray[itemIndex].questionName2, testItemArray[itemIndex].metaDataText2, itemIndex + 1, testItemArray[itemIndex].answerArray2[testItemArray[itemIndex].prefAnswerIDX2]);
							feedbackObject.missedItemsArray[feedbackObject.missedItemsArray.length] = testItemArray[itemIndex].questionName2 + " The correct answer is: " + testItemArray[itemIndex].answerArray2[testItemArray[itemIndex].prefAnswerIDX2] + ". " + testItemArray[itemIndex].metaDataText2;
						}
					
						/** HRW no longer wants the correct answer filled in.
						if (feedbackMode != "No feedback")
						{									
							// Fill in the correct answer
							if (NN4)
								document.bodyDiv.document.layers["activityItem" + itemIndex].document.forms["shortAnswerForm" + itemIndex].studentAnswer2.value = testItemArray[itemIndex].answerArray2[0];
							else
								document.forms["shortAnswerForm" + itemIndex].studentAnswer2.value = testItemArray[itemIndex].answerArray2[0];
						}
						**/
					}
				}

				if (testItemArray[itemIndex].numAnswerBoxes >= 3)
				{
					theStudentsAnswer = studentResponseArray[itemIndex][2];

					var answerIsCorrect = false;
					for (var answerIndex = 0; answerIndex < testItemArray[itemIndex].answerArray3.length; answerIndex++)
					{
						if ( isCaseSensitive )
						{
							if (isRemoveWhitespace)
							{
								if (removeWhitespace(theStudentsAnswer) == removeWhitespace(testItemArray[itemIndex].answerArray3[answerIndex]))
								{
									answerIsCorrect = true;
									break;
								}
							}
							else
							{
								if (theStudentsAnswer == testItemArray[itemIndex].answerArray3[answerIndex])
								{
									answerIsCorrect = true;
									break;
								}
							}							
						}
						else
						{
							if (isRemoveWhitespace)
							{
								if (removeWhitespace(theStudentsAnswer.toLowerCase()) == removeWhitespace(testItemArray[itemIndex].answerArray3[answerIndex].toLowerCase()))
								{
									answerIsCorrect = true;
									break;
								}
							}
							else
							{						
								if (theStudentsAnswer.toLowerCase() == testItemArray[itemIndex].answerArray3[answerIndex].toLowerCase())
								{
									answerIsCorrect = true;
									break;
								}
							}
						}
					}

					if (!answerIsCorrect)
					{
						if (testItemArray[itemIndex].questionName3.length > 0 || testItemArray[itemIndex].metaDataText3.length > 0)
						{
							theMissedItems += formatSummaryTblRow(testItemArray[itemIndex].questionName3, testItemArray[itemIndex].metaDataText3, itemIndex + 1, testItemArray[itemIndex].answerArray3[testItemArray[itemIndex].prefAnswerIDX3]);
							feedbackObject.missedItemsArray[feedbackObject.missedItemsArray.length] = testItemArray[itemIndex].questionName3 + " The correct answer is: " + testItemArray[itemIndex].answerArray3[testItemArray[itemIndex].prefAnswerIDX3] + ". " + testItemArray[itemIndex].metaDataText3;
						}

						/** HRW no longer wants the correct answer filled in.
						if (feedbackMode != "No feedback")
						{						
							// Fill in the correct answer
							if (NN4)
								document.bodyDiv.document.layers["activityItem" + itemIndex].document.forms["shortAnswerForm" + itemIndex].studentAnswer3.value = testItemArray[itemIndex].answerArray3[0];
							else
								document.forms["shortAnswerForm" + itemIndex].studentAnswer3.value = testItemArray[itemIndex].answerArray3[0];
						}
						**/
					}
				}

				if (testItemArray[itemIndex].numAnswerBoxes >= 4)
				{
					theStudentsAnswer = studentResponseArray[itemIndex][3];

					var answerIsCorrect = false;
					for (var answerIndex = 0; answerIndex < testItemArray[itemIndex].answerArray4.length; answerIndex++)
					{
						if ( isCaseSensitive )
						{
							if (isRemoveWhitespace)
							{
								if (removeWhitespace(theStudentsAnswer) == removeWhitespace(testItemArray[itemIndex].answerArray4[answerIndex]))
								{
									answerIsCorrect = true;
									break;
								}
							}
							else
							{
								if (theStudentsAnswer == testItemArray[itemIndex].answerArray4[answerIndex])
								{
									answerIsCorrect = true;
									break;
								}
							}							
						}
						else
						{
							if (isRemoveWhitespace)
							{
								if (removeWhitespace(theStudentsAnswer.toLowerCase()) == removeWhitespace(testItemArray[itemIndex].answerArray4[answerIndex].toLowerCase()))
								{
									answerIsCorrect = true;
									break;
								}
							}
							else
							{						
								if (theStudentsAnswer.toLowerCase() == testItemArray[itemIndex].answerArray4[answerIndex].toLowerCase())
								{
									answerIsCorrect = true;
									break;
								}
							}
						}
					}

					if (!answerIsCorrect)
					{
						if (testItemArray[itemIndex].questionName4.length > 0 || testItemArray[itemIndex].metaDataText4.length > 0)
						{
							theMissedItems += formatSummaryTblRow(testItemArray[itemIndex].questionName4, testItemArray[itemIndex].metaDataText4, itemIndex + 1, testItemArray[itemIndex].answerArray4[testItemArray[itemIndex].prefAnswerIDX4]);
							feedbackObject.missedItemsArray[feedbackObject.missedItemsArray.length] = testItemArray[itemIndex].questionName4 + " The correct answer is: " + testItemArray[itemIndex].answerArray4[testItemArray[itemIndex].prefAnswerIDX4] + ". " + testItemArray[itemIndex].metaDataText4;
						}

						/** HRW no longer wants the correct answer filled in.
						if (feedbackMode != "No feedback")
						{						
							// Fill in the correct answer
							if (NN4)
								document.bodyDiv.document.layers["activityItem" + itemIndex].document.forms["shortAnswerForm" + itemIndex].studentAnswer4.value = testItemArray[itemIndex].answerArray4[testItemArray[itemIndex].prefAnswerIDX4];
							else
								document.forms["shortAnswerForm" + itemIndex].studentAnswer4.value = testItemArray[itemIndex].answerArray4[0];
						}
						**/
					}
				}
			}
		}

		if (score < testItemsAttempted && !isDragDrop && theMissedItems.length > 0)
		{
			feedbackMessage += "<tr>\n";
			feedbackMessage += "<td>";
			feedbackMessage += "You missed the following items:";
			feedbackMessage += "</td>\n";
			feedbackMessage += "</tr>\n";
			
			feedbackObject.missedItemsHeader = "You missed the following items: ";
		
		}

		feedbackMessage += "<tr>\n";
		feedbackMessage += "<td>\n";
		feedbackMessage += "<table cellpadding='0' cellspacing='0'>\n";
		feedbackMessage += theMissedItems;
		feedbackMessage += "</table>\n";
		feedbackMessage += "</td>\n";
		feedbackMessage += "</tr>\n";
		feedbackMessage += "</table>\n";
		
		feedbackShown = true;
		
		// Show the correct answers if not in 'No feedback' mode
		if (feedbackMode != "No feedback")
			showAllAnswers();

	}
	studentScore = score;
	updateNavigationBar(itemIndex);
						
	var feedbackArray = new Array();
	feedbackArray[0] = feedbackMessage;
	feedbackArray[1] = feedbackObject;
	return (feedbackArray);
	
}



// Creates the HTML of a table row used for displaying the score summary.
function formatSummaryTblRow(questionID, metadata, index, answer)
{
	var rowHTML = "";
	rowHTML += "<tr>\n";
	rowHTML += "<td>";
	rowHTML += "&nbsp;&nbsp;&nbsp;";
	rowHTML += "</td>\n";
	rowHTML += "<td align='right' valign='top'>";
	//rowHTML += index + ") ";//displays a number for each row.
	rowHTML += questionID;
	rowHTML += "</td>\n";
	rowHTML += "<td>";
	if (answer != null && answer != "")
		rowHTML += "&nbsp;&nbsp;The correct answer is&nbsp;<i>" + answer + "</i>.&nbsp;&nbsp;";
	else
		rowHTML += "&nbsp;&nbsp;";		
	rowHTML += "</td>\n";
	rowHTML += "<td align='left' valign='top'>";
	rowHTML += metadata;
	rowHTML += "</td>\n";
	rowHTML += "</tr>\n";
	return rowHTML;
}



// print out a summary of the student's scores
function printScoreSummary() {
	m_printScoreWindow = true;
	writeScoreSummary();

}

function cancelStudentInfo() {
	setHide(getObj("studentInfoDiv"));
	setShow(getObj("bodyDiv"));
	setShow(getObj("studentScoreDiv"));
}

function setStudentInfo(form) {
	setHide(getObj("studentInfoDiv"));
	setShow(getObj("bodyDiv"));
	setShow(getObj("studentScoreDiv"));
	// if loaded within a frameset
	if (parent != self) {
		parent.projectData.setStudent(form.studentName.value, form.teacherName.value, form.studentPeriod.value);
	}
	
	if (activityType == "Open Ended") {
		publish();
	}
	else {
		writeScoreSummary();
	}
}


function getStudentInfo() {

	// set position of studentInfoDiv to center of screen.
	placeScreenObject(getObj("studentInfoDiv"), 200, 200);

	var html = "";
	html += "<FORM>";
	html += "<TABLE BORDER = 0 CELLSPACING = 0 bgcolor=\"#555555\"><TR><TD>";
	html += "<TABLE BORDER = 0 CELLSPACING = 0 CELLPADDING = 6 bgcolor=\"#D0DEEA\"><TR><TD COLSPAN=2>";
	html += "Please fill out the following information <BR>and click the OK button.</TD></TR>";
	html += "<TR><TD>Your First Name and Initial</TD><TD><INPUT TYPE=TEXT NAME=\"studentName\" onFocus=\"theCursorLoc.enterTextbox()\" onBlur=\"theCursorLoc.exitTextbox()\"></TD></TR>";
	html += "<TR><TD>Teacher's Name</TD><TD><INPUT TYPE=TEXT NAME=\"teacherName\" onFocus=\"theCursorLoc.enterTextbox()\" onBlur=\"theCursorLoc.exitTextbox()\"></TD></TR>";
	html += "<TR><TD>Period</TD><TD><INPUT TYPE=TEXT NAME=\"studentPeriod\" onFocus=\"theCursorLoc.enterTextbox()\" onBlur=\"theCursorLoc.exitTextbox()\"></TD></TR>";
	html += "<TR><TD>&nbsp;</TD><TD><INPUT TYPE=BUTTON VALUE=\"OK\" onClick=\"setStudentInfo(this.form)\"><INPUT TYPE=BUTTON VALUE=\"Cancel\" onClick=\"cancelStudentInfo()\"></TD></TR>";
	html += "</TABLE>";
	html += "</TD></TR></TABLE>";

	html += "</FORM>";
	
	//To fix a display bug in IE5 MAC by adding and extra close tag.
	if ( MAC && IE && browserVersion == 5 ) {
		html += "</FORM>";
	}
	
	if (NN4) {
		document.studentInfoDiv.document.write(html);
		document.studentInfoDiv.document.close();
	}
	else {
		getObj("studentInfoDiv").innerHTML = html;
	}
	
	// Reset position of studentInfoDiv to center of screen.
	// must be done after changes on IE5 for MAC to prevent redraw problems
	if ( MAC && IE & browserVersion == 5) {
		placeScreenObject(getObj("studentInfoDiv"), 200, 200);
	}
	
	//show studentInfoDiv
	setShow(getObj("studentInfoDiv"));	
	setHide(getObj("studentScoreDiv"));
	setHide(getObj("bodyDiv"));
	
}



// write out Student scores
// Note: student scores are kept in projectData hidden frame.
function writeScoreSummary() {
	// if loaded within a frameset, write out the score summary, otherwise, do nothing.
	if (parent != self) {
		if (parent.projectData.getStudent() == null) {
			getStudentInfo();
			return;
		}

		var student = parent.projectData.getStudent();
		var activityArray = parent.projectData.getActivityArray();
		var assignment = parent.projectData.getAssignment();
		var activityScoreString = "";
		var name; // holds displayName or activityName
	
		if (feedbackMode == "Cumulative") {
			computeScore();
		}
	
		parent.projectData.setScore(studentScore);
		parent.projectData.setTestItemsAttempted(testItemsAttempted);
	
		scoreWindow = window.open("", "scoreWindow", "toolbar, menubar, scrollbars, resizable, location");
		//scoreWindow = window.open("", "scoreWindow", "height=600, width=600");
	
		// -----------------------
		// Write out the score
		var content = "<HTML><HEAD><TITLE>Activity Results</TITLE></HEAD><BODY bgcolor=\"#FFFFFF\">";
		//var content = "";
		content += "<B>Student Name:</B> " + student.studentName + m_newLine;
		content += "<B>Teacher Name:</B> " + student.teacherName + m_newLine;
		content += "<B>Period:</B> " + student.studentPeriod + m_newLine;

		content += "<H3>Project: " + parent.projectData.underlineToSpace(assignment.assignmentName) + "</H3>" + 
		"<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3><TR><TD><FONT FACE=\"arial,helvetica,geneva\"><B>Activity</B></FONT></TD><TD><FONT FACE=\"arial,helvetica,geneva\"><B>Score</B></FONT></TD></TR>";
	
		// Write out the scores for all activities
		// Skip activities that have not been started
		// If the display name exists, use it, otherwise use activity name.
		for (var i = 0; i < activityArray.length; i++) {		
			activityScoreString = parent.projectData.getActivityScoreString(i);
			if (activityScoreString != "null") {		
				if ( activityArray[i].displayName == "" ) {
					content += "<TR><TD>" + activityArray[i].activityName + "</TD><TD>" + activityScoreString + "</TD></TR>";
				} else {
					content += "<TR><TD>" + activityArray[i].displayName + "</TD><TD>" + activityScoreString + "</TD></TR>";
				}
			}
		}
	
		content += "<TR><TD><B>Total Score</B></TD><TD>" + parent.projectData.getTotalScoreString() + "</TD></TR>"; 
		 
		content += "</TABLE></BODY></HTML>";
		scoreWindow.document.write (content);
		scoreWindow.document.close();
		scoreWindow.focus();
	
		if (m_printScoreWindow) {
			if (NN || (IE && browserVersion > 4))
				scoreWindow.print();
			m_printScoreWindow = false;
		}
	}
}

// If all activity items have been completed, write out score summary.
function checkActivityComplete() {

	var incompleteItems = getIncompleteItems("activityItem");
	
	if (incompleteItems == null) {
		if (parent != self) {
			if (!scoreSubmitted) {
				parent.projectData.setScore(studentScore);
				parent.projectData.setTestItemsAttempted(testItemsAttempted);
			}
		}
		return true;
	} else {
		return false;
	}

}
	


function scrollToActivityItem(itemName) {
     self.location.hash=itemName;
}





function goItem(itemName) {

	if (NN) {
		scrollToActivityItem(itemName);
	}
			
	else {
		// The following code gets around an Mac IE code bug that doesn't
		// let window.location.hash scroll without reloading the page.
		var goAnchor;
		var hashIndex = self.location.href.lastIndexOf("#");
		if (hashIndex == -1) {
			goAnchor = self.location + "#" + itemName;
		}
		else {
			goAnchor = self.location.href.substring(0, hashIndex) + "#" + itemName;
		}

		parent.main.location = goAnchor;
	}
	
	// TODO The following is not working.
	// hilight the found object
	/*
	if (activityType == "Open Ended") {
		var obj = getObj("note" + getIndexFromString(itemName));
		if (obj != null)
			showDiv(obj);
	}
	*/
}

// returns an HTML list of incomplete test items, with links to those items.
function getIncompleteItems() {

	var anchorPrefix;
	var itemArray;
	
	var activityCompleted = true;
	var incompleteItemsHTML = "";
	var itemNumber = 0;
	
	var isExample = false;

	
	// Add testItemArray items to activity item list
	itemArray = testItemArray;
	anchorPrefix = "activityItem";
	for (var itemIndex = 0; itemIndex < itemArray.length; itemIndex++) {
	
		// Check to see if this is an example Multichoice or FillBlank.		
		if (itemArray[itemIndex].example) {
			if  (itemArray[itemIndex].example == "F")
				isExample = false;
			else
				isExample = true;
		}else
			isExample = false;

		// Always show activity items if in an open-ended activity
		if (activityType == "Open Ended" || (activityType != "Open Ended" && (studentResponseArray[itemIndex] == null) || (studentResponseArray[itemIndex] == "")) && !isExample) {
			activityCompleted = false;
			itemNumber = itemNumber + 1;	
			incompleteItemsHTML += "<A TARGET=\"main\" HREF=\"javascript:parent.main.goItem('" + anchorPrefix + itemIndex + "')\">" + itemNumber + "</A> ";

		}
	}
	

	
	// Activity never completed if open-ended
	if (activityType == "Open Ended") activityCompleted=false;
	
	
	if (activityCompleted) {
		incompleteItemsHTML = null;
		
		// If there are no incomplete items, setComplete to false
		if (self != parent) {
			if (!scoreSubmitted)
				parent.projectData.setComplete(true);
		}

		
	}
	//alert(incompleteItemsHTML);
	return incompleteItemsHTML;
}


// show current score
function showCurrentScore() {

	var scoreInfoArray = computeScore();
	var scoreInfoHTML = scoreInfoArray[0];
	var scoreInfoObject = scoreInfoArray[1];
	
	// Customize the URL depending on whether this is an HRW machine or one of ours.
	var netdREF = (document.URL.indexOf("iconstructs.com") != -1) ? "SCRIPTS/nd_ISAPI_50.dll" : "hrw.nd";

	if (useBrowserWnd)
	{
		// Open a browser window to show the score info.
		var scoreWnd = window.open("", "score_wnd", "width=500,height=425,scrollbars=yes,resizable=yes");
		scoreWnd.focus();

		var scoreWndHTML = "";
		scoreWndHTML += "<html><head><title>Scoring Summary</title>\n";
		scoreWndHTML += "<SCRIPT language=\"JavaScript\">\n";
		scoreWndHTML += "var scoreSummary = \"" + scoreInfoObject.scoreSummary + "\";\n";
		scoreWndHTML += "var missedItemsHeader = \"" + scoreInfoObject.missedItemsHeader + "\";\n";
		scoreWndHTML += "var missedItemsArray = new Array();\n";
		for ( i = 0; i < scoreInfoObject.missedItemsArray.length; i++ )
		{
			scoreWndHTML += "missedItemsArray[" + i + "] = \"" + escapeQuotes(scoreInfoObject.missedItemsArray[i]) + "\";\n";
		}
		scoreWndHTML += "\n";
		scoreWndHTML += "function goToEmail()\n";
		scoreWndHTML += "{\n";
		scoreWndHTML += "     var temp = missedItemsArray.join(\"|\");\n";
		scoreWndHTML += "     //Go to the email page.\n";
		scoreWndHTML += "     var url = \"/" + netdREF + "/courseware/pEmailStudentScores?score=\" + scoreSummary + \"&mihead=\" + missedItemsHeader + \"&miarray=\" + temp\n";
		scoreWndHTML += "     location = url";
		scoreWndHTML += "\n}\n"
		scoreWndHTML += "</SCRIPT>\n"
		scoreWndHTML += "</head><body><form>\n";

		scoreWndHTML += scoreInfoHTML;
		
		var args = getTopFrameArgs();
		if (emailScores == "T" && (args["scored"] == null || args["scored"] != "true"))
		{
			scoreWndHTML += "<br><INPUT TYPE=BUTTON VALUE=\"Email Results\" ONCLICK=\"goToEmail();\">";
		}
		scoreWndHTML += "</form></body></html>\n";

		scoreWnd.document.write(scoreWndHTML);
		scoreWnd.document.close();

		if (!scoreSubmitted)
		{
			// Get the form for submitting score to the gradebook.
			theSubmitForm = parent.projectData.document.forms[0];

			// Submit score to the gradebook if activity was initiated by it.
			submitEolScore(theSubmitForm);
		}
	}
	else
	{
		alert(scoreInfoHTML);
	}
}

// returns a navigation bar
function getNavigationBar(itemIndex) {

	var navigationHeaderHTML = "<HTML><HEAD></HEAD><BODY background = \"" + playerImagesDirectoryURL + "navbar.jpg\"><FONT SIZE= -2 FACE=\"arial,helvetica,geneva\">";
	var navigationFooterHTML = "</FONT></BODY></HTML>";

	var incompleteItems = "";
	var newLine = "<BR>";
	var header;
	var computeScore = "";
	var showAllAnswers = "";
	var scoreFeedback = "";
	var scoreSummaryURL = "<A HREF=\"javascript:parent.main.writeScoreSummary()\">show summary</A>" + newLine;
	var printSummary = "";
	if (NN || (IE && browserVersion > 4))
		printSummary = "<A HREF=\"javascript:parent.main.printScoreSummary()\">print summary</A>" + newLine;
	var scoreHeader = "<FONT SIZE= -1><B>score</B></FONT><BR>";
	
	// Show the computeScoreButton if in feedback at end mode.
	// Do not show the running score
	if (feedbackMode == "Cumulative") {
		computeScore = "<A HREF=\"javascript:parent.main.showCurrentScore()\">check all</A>"+ newLine;
		showScore = false;
		// display the showAllAnswersButton if in explore mode, or if feedback has already been given.
		if ((evaluationMode == "Practice") || (feedbackShown)) {
			showAllAnswers = "<A HREF=\"JavaScript:parent.main.showAllAnswers()\">show answers</A>" + newLine;
		}
	}
	
	
	if (showIncomplete) {
		var incompleteItemList = getIncompleteItems();
	
		if (incompleteItemList == null) {
			incompleteItems = "<FONT SIZE= -2 COLOR=green>Activity Completed</FONT>" + newLine;
		}
		else if (incompleteItemList == "") {
			incompleteItems = "" + newLine;		
		}
		else {
			incompleteItems = "<FONT SIZE= -1 FACE=\"arial,helvetica,geneva\"><B>activity items</B></FONT><TABLE CELLSPACING=0 CELLPADDING=0 BORDER =0 width = 80><TR><TD><FONT SIZE= -1>" + incompleteItemList + "</FONT></TD></TR></TABLE>"+ newLine;
		}
	}
	
	if ((testItemsAttempted > 0) && (showScore)) {
		scoreFeedback = studentScore + "/" + testItemsAttempted + " = " + Math.round(100 * studentScore/testItemsAttempted) + "%" + newLine;
	}
	
	// Don't display score and navigation if activity is open ended
	if (activityType != "Open Ended")
		return (navigationHeaderHTML  + incompleteItems  + scoreHeader + computeScore + showAllAnswers + scoreFeedback  + scoreSummaryURL + printSummary + navigationFooterHTML + newLine);
	else 
		return (navigationHeaderHTML  + navigationFooterHTML + newLine);

}




// update the contents of the navigation header div to show score, etc.
// Also update the projectData testItemsAttempted
function updateNavigationBar(itemIndex) {
	
	var navigationBar = getNavigationBar(itemIndex);
	
	// if in a frameset, and not an open ended activity, show a navigation bar in a features frame
	if (parent != self) {
		checkActivityComplete();
		
		//readWrite
		parent.features.document.write (navigationBar);
		parent.features.document.close();
	}
	

}
	

function newLine() {
	return "\r\n";
}



// write out all test items to the bodyDiv as HTML
function writeAllTestItems() {

	var previousButton = "";
	var nextButton = "";
	var allData="";

	var bannerHeader = "<BR>";
		
	for (var itemIndex = 0; itemIndex < testItemArray.length; itemIndex++) {
		if (testItemArray[itemIndex].type == "drag drop" || testItemArray[itemIndex].type == "popup") {
			initDragDrop();
		}
		else if (testItemArray[itemIndex].type == "explore") {
			initExplore();
		}
	

		allData +=  out[itemIndex];
	}

	for (var extraIndex = 0; extraIndex < activityExtraArray.length; extraIndex++) {
		allData +=  extraOut[extraIndex];
	}
	
	for (var linkIndex = 0; linkIndex < activityLinkArray.length; linkIndex++) {
		
		allData +=  linkOut[linkIndex];
	}
	
	if (NN)
		allData += "<DIV style=\"position:absolute; left:5000\"></DIV>";
	

	if (NN4) {
		getObj("bodyDiv").document.write(bannerHeader  + allData);
		closeBodyDocument();
	}
	
	else {
		getObj("bodyDiv").innerHTML = allData;
	}

	var hiddenFormElements = "";
	var args = getTopFrameArgs();

	// Check if this score should be submitted to the gradebook.
	if (args["scored"] != null && args["scored"] == "true")
	{
		// Create the hidden form elements used to submit scoring info to the gradebook.
		hiddenFormElements += "<input type='hidden' name='ActivityID'>";
		hiddenFormElements += "<input type='hidden' name='ActivityLabel'>";
		hiddenFormElements += "<input type='hidden' name='ActivityDescription'>";
		hiddenFormElements += "<input type='hidden' name='Score'>";
		hiddenFormElements += "<input type='hidden' name='Summary'>";
		hiddenFormElements += "<input type='hidden' name='StudentActivityID'>";
	}

	var buttonHtml = "";
	
	// NOT USED: Show a Check All button if feedbackMode is Cumulative
	// Removed from UI
	if (feedbackMode == "Cumulative") {
		buttonHtml += "<INPUT TYPE=BUTTON VALUE='Check All' onClick='showCurrentScore()'>";
		// buttonHtml += "<INPUT TYPE=BUTTON ID='showAllAnswersButton' VALUE='Show Correct Answers' onClick='showAllAnswers()'>";
	}

	if (feedbackMode == "No feedback" && evaluationMode == "Evaluation")
	{
		buttonHtml += "<INPUT TYPE=BUTTON VALUE='Submit' onClick='submitEolScore(this.form)'>";
	}

	if (outputMode == "Publish") {	
		buttonHtml += "<INPUT TYPE=BUTTON VALUE='Publish' onClick='publish()'>";	
	}
	// Write a compute score button to studentScoreDiv 
	buttonHtml = "<FORM id=checkAnswersForm>" + buttonHtml + hiddenFormElements + "</FORM>";
	
	//Fixes another text shift bug in IE5 Mac by adding an extra close tag.
	if ( MAC && IE && browserVersion == 5 ) {
		buttonHtml += "</FORM>";
	}
	
	if (NN4) {
		document.studentScoreDiv.document.write(buttonHtml);
		document.studentScoreDiv.document.close();
		closeBodyDocument();

	}
	
	else {
		getObj("studentScoreDiv").innerHTML = buttonHtml;
	}
	setShow(getObj("studentScoreDiv"));
	
	if (outputMode != "OpenEnded") {
		updateNavigationBar(null);
	}
	else {
		updateNavigationBarOpenEnded(null);
	}
	//prompt("", allData);
	
	// Fix for IE bug that doesn't display images when page reloaded.
	if (IE) {
		var imageCount = document.images.length;
		for (var i = 0; i < imageCount; i++) {
			document.images[i].src = document.images[i].src;
		}
	}
}



function closeBodyDocument() {

	if (NN4) {document.bodyDiv.document.close();}

}





// format test items as HTML
function formatTestItems() {

	var itemHTML;

	for (var itemIndex = 0; itemIndex < testItemArray.length; itemIndex++) {
	
		if (testItemArray[itemIndex].type == "multiple choice") {
			itemHTML = formatMultipleChoiceItem(itemIndex, testItemArray[itemIndex]);
		}
		
		else if (testItemArray[itemIndex].type == "short answer") {
			itemHTML = formatShortAnswerItem(itemIndex, testItemArray[itemIndex], null);
		}
		
		else if (testItemArray[itemIndex].type == "drag drop") {
			itemHTML = formatDragDropItem(testItemArray[itemIndex]);
		}
		
		else if (testItemArray[itemIndex].type == "explore") {
			itemHTML = formatExploreItem(itemIndex, testItemArray[itemIndex], 0);
		}
		
		//readWriteAcross
		else if (testItemArray[itemIndex].type == "text area") {
			itemHTML = formatTextAreaItem(itemIndex, testItemArray[itemIndex]);
		}
		
		else if (testItemArray[itemIndex].type == "image menu") {
			itemHTML = formatImageMenu(itemIndex, testItemArray[itemIndex]);
		}
				
		else if (testItemArray[itemIndex].type == "popup") {
			itemHTML = formatPopupItem(itemIndex, testItemArray[itemIndex]);
		}

		
		addToPageFormat(itemIndex, itemHTML);
		


	}
	
	for (var extraIndex = 0; extraIndex < activityExtraArray.length; extraIndex++) {
		if (activityExtraArray[extraIndex].type == "extra") {
			itemHTML = formatActivityExtra(extraIndex, activityExtraArray[extraIndex], 0, 0);
		}
		
		else if (activityExtraArray[extraIndex].type == "nonprinting extra"){
			itemHTML = formatActivityExtra(extraIndex, activityExtraArray[extraIndex], 0, 0);
		}
		else if (activityExtraArray[extraIndex].type == "static box") {
			itemHTML = formatStaticBox(activityExtraArray[extraIndex], 0, 0);
		}
		addToExtraPageFormat(extraIndex, itemHTML);
	}
	
	for (var linkIndex = 0; linkIndex < activityLinkArray.length; linkIndex++) {

		itemHTML = formatLinkExtra(linkIndex, activityLinkArray[linkIndex]);
		addToLinkPageFormat(linkIndex, itemHTML);
	}
	

}

// Record student responses in studentResponseArray.
function recordStudentResponse(itemIndex, studentAnswer, subIndex)
{
	if (subIndex == null)
	{
		if (studentResponseArray[itemIndex] == null)
			testItemsAttempted++;

		studentResponseArray[itemIndex] = studentAnswer;
	}
	else
	{
		if (studentResponseArray[itemIndex][subIndex] == null)
			testItemsAttempted++;

		studentResponseArray[itemIndex][subIndex] = studentAnswer;
	}
}


// Format the number displayed before an activity item
function getItemDisplayNumber (itemIndex) {

	return "";
	// If use automatic numbering.
	//return (itemIndex + 1) + ".&nbsp;";
	
}


// Returns the header for an activity item.
function getActivityItemHeader (itemIndex) {
	var left = testItemArray[itemIndex].left;
	var top = testItemArray[itemIndex].top;
	var width = testItemArray[itemIndex].width;
	var zindex = 0;
	
	if (testItemArray[itemIndex].zindex && (testItemArray[itemIndex].zindex != null)) {
		zindex = testItemArray[itemIndex].zindex;
	}
	
	if (width > 0)
		return "<DIV id=\"activityItem" + itemIndex + "\" STYLE=\"position:absolute; z-index:" + zindex + "; left:" + left + "; top:" + top + "; width:" + width + "\">";
	else
		return "<DIV id=\"activityItem" + itemIndex + "\" STYLE=\"position:absolute; z-index:" + zindex + "; left:" + left + "; top:" + top + "\">";
		
}



// Set event capture for Navigator
function setNSEventCapture() {
	if (NN) {
		document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP)
	}
}


// plays a sound file
function playSound (soundFile) {
	var NSsound = navigator.plugins && navigator.plugins["LiveAudio"];
	var IEsound = navigator.plugins && document.all;
	var audioEnabled = NSsound || IEsound;
	if (!audioEnabled) {
		alert("Your browser cannot play sound files.");
		return;
	}
	
	else {
		html = "<EMBED NAME='Sound' SRC=\"" + soundFile + "\" MASTERSOUND HEIGHT='60' WIDTH='144' HIDDEN='true'>";
		
		if (NN4) {
			objectPath.audioDiv.document.write(html);
			objectPath.audioDiv.document.close();
		}
		else {
			getObj("audioDiv").innerHTML = html;
		}
	}
}

// This function submits score data to the gradebook.
function submitEolScore(theForm)
{
	var args = getTopFrameArgs();

	// Check if this score should be submitted to the gradebook.
	if (args["scored"] != null && args["scored"] == "true")
	{
		// Check if the submit button was already pressed.
		if (scoreSubmitted)
			return;

		var scoreInfoArray = computeScore();
		var scoreInfoStr = scoreInfoArray[0];

		// If useBrowserWnd is true, the activity was completed so continue submitting the score.
		if (useBrowserWnd)
		{
			var summaryHTML = "";
			summaryHTML += "<html><head><title>Scoring Summary</title>\n";
			summaryHTML += "<meta content=\"no-cache\" http-equiv=\"pragma\"></meta>\n";
			summaryHTML += "</head><body><form>\n";
			summaryHTML += scoreInfoStr;
			summaryHTML += "</form></body></html>\n";

			// Enter the score data in the form.
			theForm.elements["ActivityID"].value = activityId;
			theForm.elements["ActivityLabel"].value = gradebookID;
			theForm.elements["ActivityDescription"].value = (!gradebookDesc) ? "No Description Available" : gradebookDesc;
			theForm.elements["Score"].value = percentageScore;
			theForm.elements["Summary"].value = summaryHTML;
			theForm.elements["StudentActivityID"].value = args["studentactivityid"];

			// Setup the form to submit to the scoring servlet.
			theForm.action = args["action"];
			theForm.target = "projectData";
			theForm.method = "post";

			// Keep track if the score was already submitted just in case the user presses the button more than once.
			scoreSubmitted = true;
			// Submit the form.
			theForm.submit();
		}
		else
		{
			// Alert the user that the activity has not been completed yet.
			alert(scoreInfoStr);
		}
	}
}


// This function parses the query string of the top frame.
function getTopFrameArgs()
{
	var args = new Object();
	var query = parent.location.search.substring(1);
	var pairs = query.split("&");
	for (var i = 0; i < pairs.length; i++)
	{
		var pos = pairs[i].indexOf('=');
		if (pos == -1)
			continue;
		var argname = pairs[i].substring(0, pos);
		var value = pairs[i].substring(pos + 1);
		args[argname] = unescape(value);
	}
	return args;
}

// Creates an object to hold student score info
function ScoreInfoObject(
						scoreSummary,
						missedItemsHeader,
						missedItemsArray
						)
{
	this.scoreSummary = scoreSummary;
	this.missedItemsHeader = missedItemsHeader;
	this.missedItemsArray = missedItemsArray;
}

// Hide the feedback divs for special scored activity types and show the total score info.
// This is similar to hideFeedbackDivs() except for the call to showCurrentScore()
// as HRW only wants this to happen for FIB, MC and DD activities.
function hideScoredFeedbackDivs() {

	setHide(getObj("correctFeedbackDiv"));	// Hide the popup feedback messages
	setHide(getObj("incorrectFeedbackDiv"));
	if (checkActivityComplete()) {
		if (feedbackMode == "Immediate" && evaluationMode == "Evaluation")
			showCurrentScore();
	}
}