

//<![CDATA[

<!--


function Client(){
//if not a DOM browser, hopeless
	this.min = false; if (document.getElementById){this.min = true;};

	this.ua = navigator.userAgent;
	this.name = navigator.appName;
	this.ver = navigator.appVersion;  

//Get data about the browser
	this.mac = (this.ver.indexOf('Mac') != -1);
	this.win = (this.ver.indexOf('Windows') != -1);

//Look for Gecko
	this.gecko = (this.ua.indexOf('Gecko') > 1);
	if (this.gecko){
		this.geckoVer = parseInt(this.ua.substring(this.ua.indexOf('Gecko')+6, this.ua.length));
		if (this.geckoVer < 20020000){this.min = false;}
	}
	
//Look for Firebird
	this.firebird = (this.ua.indexOf('Firebird') > 1);
	
//Look for Safari
	this.safari = (this.ua.indexOf('Safari') > 1);
	if (this.safari){
		this.gecko = false;
	}
	
//Look for IE
	this.ie = (this.ua.indexOf('MSIE') > 0);
	if (this.ie){
		this.ieVer = parseFloat(this.ua.substring(this.ua.indexOf('MSIE')+5, this.ua.length));
		if (this.ieVer < 5.5){this.min = false;}
	}
	
//Look for Opera
	this.opera = (this.ua.indexOf('Opera') > 0);
	if (this.opera){
		this.operaVer = parseFloat(this.ua.substring(this.ua.indexOf('Opera')+6, this.ua.length));
		if (this.operaVer < 7.04){this.min = false;}
	}
	if (this.min == false){
		alert('Your browser may not be able to handle this page.');
	}
	
//Special case for the horrible ie5mac
	this.ie5mac = (this.ie&&this.mac&&(this.ieVer<6));
}

var C = new Client();

//for (prop in C){
//	alert(prop + ': ' + C[prop]);
//}



//CODE FOR HANDLING NAV BUTTONS AND FUNCTION BUTTONS

//[strNavBarJS]
function NavBtnOver(Btn){
	if (Btn.className != 'NavButtonDown'){Btn.className = 'NavButtonUp';}
}

function NavBtnOut(Btn){
	Btn.className = 'NavButton';
}

function NavBtnDown(Btn){
	Btn.className = 'NavButtonDown';
}
//[/strNavBarJS]

function FuncBtnOver(Btn){
	if (Btn.className != 'FuncButtonDown'){Btn.className = 'FuncButtonUp';}
}

function FuncBtnOut(Btn){
	Btn.className = 'FuncButton';
}

function FuncBtnDown(Btn){
	Btn.className = 'FuncButtonDown';
}

function FocusAButton(){
	if (document.getElementById('CheckButton1') != null){
		document.getElementById('CheckButton1').focus();
	}
	else{
		if (document.getElementById('CheckButton2') != null){
			document.getElementById('CheckButton2').focus();
		}
		else{
			document.getElementsByTagName('button')[0].focus();
		}
	}
}




//CODE FOR HANDLING DISPLAY OF POPUP FEEDBACK BOX

var topZ = 1000;

function ShowMessage(Feedback){
	var Output = Feedback + '<br /><br />';
	document.getElementById('FeedbackContent').innerHTML = Output;
	var FDiv = document.getElementById('FeedbackDiv');
	topZ++;
	FDiv.style.zIndex = topZ;
	FDiv.style.top = TopSettingWithScrollOffset(30) + 'px';
//IE can't focus a hidden div; Moz needs to focus before display to avoid jumping
	if (C.gecko){
		document.getElementById('FeedbackOKButton').focus();
	}
	FDiv.style.display = 'block';

	ShowElements(false, 'input');
	ShowElements(false, 'select');
	ShowElements(false, 'object');
	if (C.ie){
		document.getElementById('FeedbackOKButton').focus();
	}
	
//
}

function ShowElements(Show, TagName){
//Special for IE bug -- hide all the form elements that will show through the popup
	if (C.ie){
		var Els = document.getElementsByTagName(TagName);
		for (var i=0; i<Els.length; i++){
			if (Show == true){
				Els[i].style.display = 'inline';
			}
			else{
				Els[i].style.display = 'none';
			}
		}
	} 
}

function HideFeedback(){
	document.getElementById('FeedbackDiv').style.display = 'none';
	ShowElements(true, 'input');
	ShowElements(true, 'select');
	ShowElements(true, 'object');
	if (Finished == true){
		Finish();
	}
}


//GENERAL UTILITY FUNCTIONS AND VARIABLES

//PAGE DIMENSION FUNCTIONS
function PageDim(){
//Get the page width and height
	this.W = 600;
	this.H = 400;
	this.W = document.getElementsByTagName('body')[0].clientWidth;
	this.H = document.getElementsByTagName('body')[0].clientHeight;
}

var pg = null;

function GetPageXY(El) {
	var XY = {x: 0, y: 0};
	while(El){
		XY.x += El.offsetLeft;
		XY.y += El.offsetTop;
		El = El.offsetParent;
	}
	return XY;
}

function GetScrollTop(){
	if (document.documentElement && document.documentElement.scrollTop){
		return document.documentElement.scrollTop;
	}
	else{
		if (document.body){
 			return document.body.scrollTop;
		}
		else{
			return window.pageYOffset;
		}
	}
}

function GetViewportHeight(){
	if (window.innerHeight){
		return window.innerHeight;
	}
	else{
		return document.getElementsByTagName('body')[0].clientHeight;
	}
}

function TopSettingWithScrollOffset(TopPercent){
	var T = Math.floor(GetViewportHeight() * (TopPercent/100));
	return GetScrollTop() + T; 
}

//CODE FOR AVOIDING LOSS OF DATA WHEN BACKSPACE KEY INVOKES history.back()
var InTextBox = false;

function SuppressBackspace(e){ 
	if (InTextBox == true){return;}
	if (C.ie) {
		thisKey = window.event.keyCode;
	}
	else {
		thisKey = e.keyCode;
	}

	var Suppress = false;

	if (thisKey == 8) {
		Suppress = true;
	}

	if (Suppress == true){
		if (C.ie){
			window.event.returnValue = false;	
			window.event.cancelBubble = true;
		}
		else{
			e.preventDefault();
		}
	}
}

if (C.ie){
	document.attachEvent('onkeydown',SuppressBackspace);
	window.attachEvent('onkeydown',SuppressBackspace);
}
else{
	window.addEventListener('keypress',SuppressBackspace,false);
}

function ReduceItems(InArray, ReduceToSize){
	var ItemToDump=0;
	var j=0;
	while (InArray.length > ReduceToSize){
		ItemToDump = Math.floor(InArray.length*Math.random());
		InArray.splice(ItemToDump, 1);
	}
}

function Shuffle(InArray){
	Temp = new Array();
	var Len = InArray.length;

	var j = Len;

	for (var i=0; i<Len; i++){
		Temp[i] = InArray[i];
	}

	for (i=0; i<Len; i++){
		Num = Math.floor(j  *  Math.random());
		InArray[i] = Temp[Num];

		for (var k=Num; k < j; k++) {
			Temp[k] = Temp[k+1];
		}
		j--;
	}
	return InArray;
}

function WriteToInstructions(Feedback) {
	document.getElementById('InstructionsDiv').innerHTML = Feedback;

}




function EscapeDoubleQuotes(InString){
	return InString.replace(/"/g, '&quot;')
}

function FocusAButton(){
	if (document.getElementById('CheckButton1') != null){
		document.getElementById('CheckButton1').focus();
	}
	else{
		document.getElementsByTagName('button')[0].focus();
	}
}

function TrimString(InString){
        var x = 0;

        if (InString.length != 0) {
                while ((InString.charAt(InString.length - 1) == '\u0020') || (InString.charAt(InString.length - 1) == '\u000A') || (InString.charAt(InString.length - 1) == '\u000D')){
                        InString = InString.substring(0, InString.length - 1)
                }

                while ((InString.charAt(0) == '\u0020') || (InString.charAt(0) == '\u000A') || (InString.charAt(0) == '\u000D')){
                        InString = InString.substring(1, InString.length)
                }

                while (InString.indexOf('  ') != -1) {
                        x = InString.indexOf('  ')
                        InString = InString.substring(0, x) + InString.substring(x+1, InString.length)
                 }

                return InString;
        }

        else {
                return '';
        }
}

function FindLongest(InArray){
	if (InArray.length < 1){return -1;}

	var Longest = 0;
	for (var i=1; i<InArray.length; i++){
		if (InArray[i].length > InArray[Longest].length){
			Longest = i;
		}
	}
	return Longest;
}

//UNICODE CHARACTER FUNCTIONS
function IsCombiningDiacritic(CharNum){
	var Result = (((CharNum >= 0x0300)&&(CharNum <= 0x370))||((CharNum >= 0x20d0)&&(CharNum <= 0x20ff)));
	Result = Result || (((CharNum >= 0x3099)&&(CharNum <= 0x309a))||((CharNum >= 0xfe20)&&(CharNum <= 0xfe23)));
	return Result;
}

function IsCJK(CharNum){
	return ((CharNum >= 0x3000)&&(CharNum < 0xd800));
}

//SETUP FUNCTIONS
//BROWSER WILL REFILL TEXT BOXES FROM CACHE IF NOT PREVENTED
function ClearTextBoxes(){
	var NList = document.getElementsByTagName('input');
	for (var i=0; i<NList.length; i++){
		if ((NList[i].id.indexOf('Guess') > -1)||(NList[i].id.indexOf('Gap') > -1)){
			NList[i].value = '';
		}
		if (NList[i].id.indexOf('Chk') > -1){
			NList[i].checked = '';
		}
	}
}

//EXTENSION TO ARRAY OBJECT
function Array_IndexOf(Input){
	var Result = -1;
	for (var i=0; i<this.length; i++){
		if (this[i] == Input){
			Result = i;
		}
	}
	return Result;
}
Array.prototype.indexOf = Array_IndexOf;

//IE HAS RENDERING BUG WITH BOTTOM NAVBAR
function RemoveBottomNavBarForIE(){
	if ((C.ie)&&(document.getElementById('Reading') != null)){
		if (document.getElementById('BottomNavBar') != null){
			document.getElementById('TheBody').removeChild(document.getElementById('BottomNavBar'));
		}
	}
}




//HOTPOTNET-RELATED CODE

var HPNStartTime = (new Date()).getTime();
var SubmissionTimeout = 30000;
var Detail = ''; //Global that is used to submit tracking data

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.detail.value = Detail;
		Frm.submit();
	}
}



//JQUIZ CORE JAVASCRIPT CODE

var CurrQNum = 0;
var CorrectIndicator = ':-)';
var IncorrectIndicator = 'X';
var YourScoreIs = 'Your score is ';
var ContinuousScoring = true;
var CorrectFirstTime = 'Questions answered correctly first time: ';
var ShowCorrectFirstTime = false;
var ShuffleQs = true;
var ShuffleAs = true;
var DefaultRight = 'Correct!';
var DefaultWrong = 'Sorry! Try again.';
var QsToShow = 10;
var Score = 0;
var Finished = false;
var Qs = null;
var QArray = new Array();
var ShowingAllQuestions = false;
var ShowAllQuestionsCaption = 'Show all questions';
var ShowOneByOneCaption = 'Show questions one by one';
var State = new Array();
var Feedback = '';
var TimeOver = false;
var strInstructions = '';

//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<I.length; QNum++){
//Only do this if not multi-select
		if (I[QNum][2] != '3'){
  		for (ANum = 0; ANum<I[QNum][3].length; ANum++){
  			if (I[QNum][3][ANum][1].length < 1){
  				if (I[QNum][3][ANum][2] > 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;
	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<QList.length; i++){
			As = QList[i].getElementsByTagName('ol')[0];
			if (As != null){
  			AList.length = 0;
				while (As.getElementsByTagName('li').length > 0){
					AList.push(As.removeChild(As.getElementsByTagName('li')[0]));
				}
				AList = Shuffle(AList);
				for (j=0; j<AList.length; j++){
					As.appendChild(AList[j]);
				}
			}
		}
	}
	
	for (i=0; i<QList.length; i++){
		Qs.appendChild(QList[i]);
		QArray[QArray.length] = QList[i];
	}

//Show the first item
	QArray[0].style.display = '';
	
//Now hide all except the first item
	for (i=1; i<QArray.length; i++){
		QArray[i].style.display = 'none';
	}		
	SetQNumReadout();
}

function ChangeQ(ChangeBy){
	if (((CurrQNum + ChangeBy) < 0)||((CurrQNum + ChangeBy) >= QArray.length)){return;}
	QArray[CurrQNum].style.display = 'none';
	CurrQNum += ChangeBy;
	QArray[CurrQNum].style.display = '';
	SetQNumReadout();
//if there's a textbox, set the focus in it
	if (QArray[CurrQNum].getElementsByTagName('input')[0] != null){
		QArray[CurrQNum].getElementsByTagName('input')[0].focus();
	}
}

function SetQNumReadout(){
	document.getElementById('QNumReadout').innerHTML = (CurrQNum+1) + ' / ' + QArray.length;
}

I=new Array();
I[0]=new Array();I[0][0]=100;
I[0][1]='';
I[0][2]='0';
I[0][3]=new Array();
I[0][3][0]=new Array('To keep an eye on something.','Correct.  While this might be a common definition of the word "watch", it is not one of the common Navy meanings for the word.',1,100,1);
I[0][3][1]=new Array('The location of the person standing duty.','Nope.  Examples of how it is used in this context include the bridge watch or communications watch.',0,0,1);
I[0][3][2]=new Array('A sailor\'s duty section.','Nope.  Examples of it used in this context include "Port and Starboard" and "First and Second" ',0,0,1);
I[0][3][3]=new Array('To refer to an individual on duty.','Sorry.  It is often used in this context.  An example would be the lookout watch.',0,0,1);
I[0][3][4]=new Array('All of the other answers are examples of the meaning of the "Watch" in the Navy.','Sorry.  There is one on the list that is a common use of the word, but does not apply to the Naval meaning of the word.',0,0,1);
I[1]=new Array();I[1][0]=100;
I[1][1]='';
I[1][2]='0';
I[1][3]=new Array();
I[1][3][0]=new Array('Four hours','Right!  This is true with the exception of the 1600 - 1800 and 1800 - 2000 dogwatches.',1,100,1);
I[1][3][1]=new Array('Two hours','Sorry.  You may be thinking about a "dogwatch", which are divided watches to allow crewmembers to go off watch to eat their evening meal.',0,0,1);
I[1][3][2]=new Array('Eight hours','Nope.  You might be thinking about the normal length of some shorebased watches, which can last for eight hours.',0,0,1);
I[1][3][3]=new Array('Twelve hours','Nope.  You might be thinking about the normal length of some shorebased watches, which can last for 12 hours.',0,0,1);
I[1][3][4]=new Array('There is no set time limit for Naval Watches at sea.','Nope.  There are normal length for shipboard watches and land-based watches.',0,0,1);
I[2]=new Array();I[2][0]=100;
I[2][1]='';
I[2][2]='0';
I[2][3]=new Array();
I[2][3][0]=new Array('Dogwatches','Correct.  Another reason that these watches are shorter (2-hours) is to ensure a rotation so that people are not standing the same watch every day.',1,100,1);
I[2][3][1]=new Array('Quarterwatches','Sorry.  There is no such watch as the Quarterwatch.',0,0,1);
I[2][3][2]=new Array('Shortwatches','Sorry.  While these watches are two hours shorter than a normal watch, this isn\'t the name given to them.',0,0,1);
I[2][3][3]=new Array('Mealwatches','Nope.  Although part of the purpose of these watches is to allow time for watchstanders to get to the evening meal, this isn\'t what they are called.',0,0,1);
I[2][3][4]=new Array('Splitwatches','Nope.  Although the time is split when compared to the normal, 4-hour watch, this isn\'t the proper name.',0,0,1);
I[3]=new Array();I[3][0]=100;
I[3][1]='';
I[3][2]='0';
I[3][3]=new Array();
I[3][3][0]=new Array('Because they are usually less demanding.','Right!  Not only are shore watches less demanding, but because of the extra number of people available ashore, they are less frequently stood.',1,100,1);
I[3][3][1]=new Array('Because there are fewer people ashore to stand the watches.','Sorry.  The number of available people doesn\'t factor in to the decision and, besides, there are more people available ashore, not less.',0,0,1);
I[3][3][2]=new Array('Because there are fewer people on ship to stand the watches.','Sorry.  Although there are fewer people available onboard ship than on shore, this doesn\'t factor in to why the watches are different lengths.',0,0,1);
I[3][3][3]=new Array('To confuse a potential enemy.','Nope.  Any of our potential enemies are already well-aware of how our watches differ between the shore and the ship.',0,0,1);
I[3][3][4]=new Array('Because the watches on shore are more demanding.','Nope  Generally, watches ashore are less demanding, not more.',0,0,1);
I[4]=new Array();I[4][0]=100;
I[4][1]='';
I[4][2]='0';
I[4][3]=new Array();
I[4][3][0]=new Array('The full 24-hours','Correct!  During the time your duty section has duty, you must remain on the ship that entire day and you will probably be assigned to two or more watches.  Even when you are off-watch, you must remain on the ship.',1,100,1);
I[4][3][1]=new Array('Eight hours','Sorry.  This is a normal length of a watch for someone who is shorebased but it isn\'t the amount of time you need to stay on the ship if you are on the duty section in-port.',0,0,1);
I[4][3][2]=new Array('Twelve hours','Sorry.  This is a normal length of a watch for someone who is shorebased but it isn\'t the amount of time you need to stay on the ship if you are on the duty section in-port.',0,0,1);
I[4][3][3]=new Array('Four hours','Nope.  This is the normal length of a shipboard watch, but you may get more than one of these watches assigned while you are in the duty section.',0,0,1);
I[4][3][4]=new Array('Two hours','Nope.  Two hours is the normal length of a dogwatch, which you might or might not stand while in port.  The time you need to stay aboard ship is longer than this.',0,0,1);
I[5]=new Array();I[5][0]=100;
I[5][1]='';
I[5][2]='0';
I[5][3]=new Array();
I[5][3][0]=new Array('The Command Duty Officer (CDO)','Right!  The CDO is generally a senior officer and has this responsibility for a full 24-hour period.  He or she represents the CO when the CO is away from the ship.',1,100,1);
I[5][3][1]=new Array('The Officer of the Deck  (OOD)','Sorry.  The OOD is the Officer on Watch (normally 4-hours) who is in charge of the ship for the duration of the watch.  While he or she will ensure that all orders are carried out during that period, they are not responsible for the other 20-hours when they are not on watch, so someone else has this responsibility.',0,0,1);
I[5][3][2]=new Array('The Junior Officer of the Deck (JOOD)','Nope.  The JOOD is a junior officer who is working directly for the Officer of the Deck and learning that job.',0,0,1);
I[5][3][3]=new Array('The Executive Assistant (EA)','Nope.  While the XO has a number of Executive Officer\'s Assistants to carry out his responsibilities, there is no one person called the "Executive Assistant".',0,0,1);
I[5][3][4]=new Array('The Officer of the Day  (OOD)','Sorry.  The Officer of the Day is the Officer standing the normal eight to twelve-hour watch at a shore station.  While they are responsible for carrying out their instructions, there is another officer who is directly responsible for all items in the XO\'s POD, something that spans a full 24-hour period.',0,0,1);
I[6]=new Array();I[6][0]=100;
I[6][1]='';
I[6][2]='0';
I[6][3]=new Array();
I[6][3][0]=new Array('Deck watches and navigational watches.','Correct.  The Boatswain\'s Mate of the Watch (BMOW) is the petty officer in charge of these topside watches.',1,100,1);
I[6][3][1]=new Array('Deck watches and communications watches','Nope.  Communications watches are not a type of topside watch underway.',0,0,1);
I[6][3][2]=new Array('Communications watches and navigational watches.','Nope.  Communications watches are not a type of topside watch underway.',0,0,1);
I[6][3][3]=new Array('Lookout watches and navigational watches.','Sorry.  Lookout watches are a type of navigational watch.',0,0,1);
I[6][3][4]=new Array('Deck watches and lookout watches.','Sorry.  Lookout watches are a type of navigational watch.',0,0,1);
I[7]=new Array();I[7][0]=100;
I[7][1]='';
I[7][2]='0';
I[7][3]=new Array();
I[7][3][0]=new Array('The Boatswain\'s Mate of the Watch (BOMW)','Right.  The BOMW is in charge of both the deck watches and the navigational watches.',1,100,1);
I[7][3][1]=new Array('The Quartermaster of the Watch (QMOW)','Sorry.  The Quartermaster of the Watch is a member of the navigational watch, only one of the two types of topside watches.',0,0,1);
I[7][3][2]=new Array('The Helmsman','Nope.  The helmsman is a member of the navigational watch, only one of the two types of topside watches.',0,0,1);
I[7][3][3]=new Array('The Lee Helmsman','Nope.  The lee helmsman is a member of the navigational watch, only one of the two types of topside watches.',0,0,1);
I[7][3][4]=new Array('The Command Master Chief','Sorry. The CMC is the senior enlisted sailor aboard and is the direct representative of the enlisted personnel to the Commanding Officer.',0,0,1);
I[8]=new Array();I[8][0]=100;
I[8][1]='';
I[8][2]='0';
I[8][3]=new Array();
I[8][3][0]=new Array('The surface lookout','Correct!  While lookouts must report on the status of the ship\'s navigational lights every half-hour at night, this is considered to be a deck watch and not a navigational watch.',1,100,1);
I[8][3][1]=new Array('The Quartermaster of the Watch','Nope.  The Quartermaster of the Watch maintains the quartermaster\'s notebook, which records all orders to the helm or lee helm and assists the OOD in navigational matters.',0,0,1);
I[8][3][2]=new Array('The helmsman','Sorry.  The helmsman steers courses ordered by the conning officer.',0,0,1);
I[8][3][3]=new Array('The lee helmsman','Sorry.  The lee helmsman is the person who stands watch at the engine-order telegraph on the bridge and rings up the conning officer\'s orders to the engine room on the telegraph and sees that all bells are answered correctly.',0,0,1);
I[8][3][4]=new Array('The after steering watch','Nope.  This is an important navigation watch stationed in an emergency steering station in the after part of the ship.  This person is able to take over the helm in the event of a steering casualty to the bridge.',0,0,1);
I[9]=new Array();I[9][0]=100;
I[9][1]='';
I[9][2]='0';
I[9][3]=new Array();
I[9][3][0]=new Array('The status of the ship\'s navigational lights.','Right!  This is done to ensure that all lights are working properly, a legal requirement and an important measure of safety in congested waters.',1,100,1);
I[9][3][1]=new Array('The status of the ship\'s "big eyes" binoculars.','Sorry.  They will certainly use this equipment and immediately report any malfunction with it, but this is not a required check every half-hour.',0,0,1);
I[9][3][2]=new Array('All contacts within their assigned sector.','Sorry.  Lookouts will report on these type of contacts much more frequently than once every half-hour.',0,0,1);
I[9][3][3]=new Array('The barometric pressure.','Nope.  This is an important reading but it is not one taken by the lookouts.',0,0,1);
I[9][3][4]=new Array('The percentage of cloud cover.','Nope.  This would be a hard thing to do on a dark night!',0,0,1);
I[10]=new Array();I[10][0]=100;
I[10][1]='';
I[10][2]='0';
I[10][3]=new Array();
I[10][3][0]=new Array('The lifebuoy and after lookout watches.','Correct.  These watches must be ready in the event of a man overboard situation.  More of these lookouts may be posted during periods of fog or low visibility to ensure their effectiveness.',1,100,1);
I[10][3][1]=new Array('The lifebuoy and lifeboat watches.','Sorry.  The lifeboat watch does not have to remain on call at the lifeboat station but must be on call, ready for fast action.',0,0,1);
I[10][3][2]=new Array('The after lookout and the lifeboat watches.','Sorry.  The lifeboat watch does not have to remain on call at the lifeboat station but must be on call, ready for fast action.',0,0,1);
I[10][3][3]=new Array('The after steering and the after lookout watches','Nope.  The after steering watch, while located in the after part of the ship, is not stationed on the fantail.',0,0,1);
I[10][3][4]=new Array('The after steering and the lifeboat watches.','Nope.  The after steering watch, while located in the after part of the ship, is not stationed on the fantail.',0,0,1);
I[11]=new Array();I[11][0]=100;
I[11][1]='';
I[11][2]='0';
I[11][3]=new Array();
I[11][3][0]=new Array('The lifeboat watch','Right.  While this watch does not usually have to remain on their lifeboat station for the duration of the watch, they must be on call, ready for fast action in the event they are needed.',1,100,1);
I[11][3][1]=new Array('The lifebuoy watch','Sorry.  While the lifebuoy watch can provide the difference in spotting the person who fell overboard and can provide them with critical flotation, they do not directly participate in the recovery of the individual.',0,0,1);
I[11][3][2]=new Array('The aft lookout watch','Sorry.  While the aft lookout watch plays a critical role in spotting someone falling overboard, they do not participate in the recovery efforts.',0,0,1);
I[11][3][3]=new Array('The after steering watch','Nope.  The after steering watch, stationed in an emergency steering station in the after part of the ship, takes over the helm in the event of a steering casualty to the bridge.',0,0,1);
I[11][3][4]=new Array('The lee helmsman watch','Nope.  The lee helmsman watch is the bridge watch that rings up the conning officer\'s orders to the engine room on the telegraph and sees that all bells are answered correctly.',0,0,1);
I[12]=new Array();I[12][0]=100;
I[12][1]='';
I[12][2]='0';
I[12][3]=new Array();
I[12][3][0]=new Array('The primary watch station is shifted from the bridge to the quarterdeck.','Correct!  The location of the quarterdeck is usually on the main deck of the ship at the head of the brow through which people board or depart the ship.',1,100,1);
I[12][3][1]=new Array('The primary watch station is shifted from the quarterdeck to the bridge.','Nope.  The bridge is the primary watch station at sea, not in-port.',0,0,1);
I[12][3][2]=new Array('More watchstanders are required in port due to heightened security.','Nope.  Actually, fewer watchstanders are required in-port due tot he fact that much more of the equipment on the ship is shut off.',0,0,1);
I[12][3][3]=new Array('Watch and duty assignments are not as frequent.','Sorry.  While this is true for watches ashore, watches are just as frequent and as long for the duty section on the ship in port as at sea.',0,0,1);
I[12][3][4]=new Array('Watches in port are generally eight to twelve hours in length.','Sorry.  While this is true for watches ashore, it is not true for watches in port.  The same length of watches is generally maintained in port as at sea.',0,0,1);
I[13]=new Array();I[13][0]=100;
I[13][1]='';
I[13][2]='0';
I[13][3]=new Array();
I[13][3][0]=new Array('The Executive Officer','Right!  Remember, the MAA is an Executive Assistant and at sea and in-port they report tot he Executive Officer.',1,100,1);
I[13][3][1]=new Array('The Command Duty Officer','Sorry.  While the CDO may work closely with the Duty MAA, he or she is not directly responsible for the Duty Master at Arms.',0,0,1);
I[13][3][2]=new Array('The Officer of the Deck','Sorry.  While the OOD may work with the Duty MAA at times, he or she does not direct this person or watch.',0,0,1);
I[13][3][3]=new Array('The Officer of the Day','Nope.  The Officer of the Day is not a shipboard watch either at sea or in-port.',0,0,1);
I[13][3][4]=new Array('The Master at Arms Officer','Nope.  There is no such position as Master at Arms Officer.',0,0,1);
I[14]=new Array();I[14][0]=100;
I[14][1]='';
I[14][2]='0';
I[14][3]=new Array();
I[14][3][0]=new Array('The Anchor Watch','Correct!  This watch talks by phone to the Quartermaster of the Watch and the Officer of the Deck.',1,100,1);
I[14][3][1]=new Array('The Chain Watch','Sorry.  While this watch must pay close attention to the anchor chain, particularly when the ship is moored to a buoy, this is not the proper name of the watch.',0,0,1);
I[14][3][2]=new Array('The Buoy Watch','Sorry.  There is no such naval watch called the buoy watch.',0,0,1);
I[14][3][3]=new Array('The Mooring Watch','Nope.  There is no such naval watch called the mooring watch.',0,0,1);
I[14][3][4]=new Array('The Brow Watch','Nope.  The brow watch is posted at the foot of the brow on the pier and maintains the security of the brow.',0,0,1);
I[15]=new Array();I[15][0]=100;
I[15][1]='';
I[15][2]='0';
I[15][3]=new Array();
I[15][3][0]=new Array('The Petty Officer of the Watch','Right!  The POOW will always be in charge of this watch section unless a Quartermaster of the Watch is assigned, in which case he or she will assist the QMOW in their duties.',1,100,1);
I[15][3][1]=new Array('The Officer of the Deck','Nope.  Wile the OOD is in the chain of command of all of the watch sections, he or she is not directly in charge of the enlisted deck watch section.',0,0,1);
I[15][3][2]=new Array('The Command Duty Officer','Nope.  Wile the CDO is ultimately in charge of all of the watch sections, he or she is not directly in charge of the enlisted deck watch section.',0,0,1);
I[15][3][3]=new Array('The Helmsman','Nope.  The helmsman steers courses ordered by the conning officer while at sea.',0,0,1);
I[15][3][4]=new Array('The Duty Quartermaster','Sorry.  You may be thinking about the Quartermaster of the Watch, who would be in charge of this section is so assigned.  The duty quartermaster watch is another watch, stationed in navigation.',0,0,1);
I[16]=new Array();I[16][0]=100;
I[16][1]='';
I[16][2]='0';
I[16][3]=new Array();
I[16][3][0]=new Array('Side boys','Correct.  The term "side boys" is generic and does not reflect gender but tradition.',1,100,1);
I[16][3][1]=new Array('Side girls','Sorry.  This isn\'t the term used in these cases.',0,0,1);
I[16][3][2]=new Array('Side women','Sorry.  This isn\'t the term used in these cases.',0,0,1);
I[16][3][3]=new Array('Side personnel','Nope.  The Navy stands by tradition, not the latest fad or fashion.',0,0,1);
I[16][3][4]=new Array('Side people','Nope.  The Navy stands by tradition, not the latest fad or fashion.',0,0,1);
I[17]=new Array();I[17][0]=100;
I[17][1]='';
I[17][2]='0';
I[17][3]=new Array();
I[17][3][0]=new Array('Hourly, their Department Heads.','Right.  They will make these reports to the OOD.',1,100,1);
I[17][3][1]=new Array('Every half-hour, their Department Heads','Sorry.  This is too frequent an interval for normal reporting.',0,0,1);
I[17][3][2]=new Array('Hourly, the Master at Arms Personnel','Sorry.  The MAA personnel work for the XO and the watchstanders generally do not.  That being said, MAA personnel will offer advice and assistance if requested.',0,0,1);
I[17][3][3]=new Array('Every half-hour, the Master at Arms Personnel','Nope.  This is too frequent an interval for normal reporting.',0,0,1);
I[17][3][4]=new Array('Every fifteen minutes, the Command Duty Officer.','Nope.  You are wrong on both counts.  Remember that the CDO is a very busy person and they couldn\u2019t be expected to be available to take reports such as this every fifteen minutes.',0,0,1);
I[18]=new Array();I[18][0]=100;
I[18][1]='';
I[18][2]='0';
I[18][3]=new Array();
I[18][3][0]=new Array('To ensure that all gear is working correctly.','Correct.  Another reason is to ensure that all watches are alert and ready.',1,100,1);
I[18][3][1]=new Array('To ensure that that watch stander has not gone to sleep.','Sorry.  While a valid purpose would be to ensure that all watch standers are alert, you never expect to have a watch fall asleep.  Besides, the after steering watch is connected via a hone circuit and frequently exchanges communications with the bridge during his or her watch.',0,0,1);
I[18][3][2]=new Array('So that maintenance can be done on the helm on the bridge.','Sorry.  While this might be a valid reason to shift the control of steering to the after steering watch, you wouldn\'t need to do this several times a day.',0,0,1);
I[18][3][3]=new Array('So that the helm and lee helm watches can eat.','Nope.  Watches are normally four hours long at sea (except the 2-hour dogwatches) and meals are planned around these watches.',0,0,1);
I[18][3][4]=new Array('Because many times the aft steering watch will have a better view of what is going on.','Nope.  The after steering watch is stationed within the after part of the ship and cannot see what is going on.',0,0,1);
I[19]=new Array();I[19][0]=100;
I[19][1]='';
I[19][2]='0';
I[19][3]=new Array();
I[19][3][0]=new Array('Fifteen minutes before the watch is scheduled to begin.','Right.  This amount of time allows for a good exchange of information between the ongoing and offgoing watches and allows watches at night to have time for their eyes to adjust to the darkness.',1,100,1);
I[19][3][1]=new Array('Fifteen minutes after the watch is scheduled to begin','Nope.  Watches are never supposed to be relieved late.',0,0,1);
I[19][3][2]=new Array('A half-hour before the watch is scheduled to begin.','Sorry.  While it is important to get a good turnover with the person you are relieving prior to assuming the watch, this is a bit too much too time.',0,0,1);
I[19][3][3]=new Array('A half-hour after the watch is scheduled to begin.','Nope.  Watches are never supposed to be relieved late.',0,0,1);
I[19][3][4]=new Array('At exactly the time specified in the watch bill.','Sorry.  While the watch should be changed out by this time, it is important that information be passed down to the oncoming watch stander prior to this.',0,0,1);


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;
	

	

	
	CompleteEmptyFeedback();

	SetUpQuestions();
	ClearTextBoxes();
	CreateStatusArray();
	

	
//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);
			}
		}
	}
}

function ShowHideQuestions(){
	FuncBtnOut(document.getElementById('ShowMethodButton'));
	document.getElementById('ShowMethodButton').style.display = 'none';
	if (ShowingAllQuestions == false){
		for (var i=0; i<QArray.length; i++){
				QArray[i].style.display = '';
			}
		document.getElementById('Questions').style.listStyleType = 'decimal';
		document.getElementById('OneByOneReadout').style.display = 'none';
		document.getElementById('ShowMethodButton').innerHTML = ShowOneByOneCaption;
		ShowingAllQuestions = true;
	}
	else{
		for (var i=0; i<QArray.length; i++){
				if (i != CurrQNum){
					QArray[i].style.display = 'none';
				}
			}
		document.getElementById('Questions').style.listStyleType = 'none';
		document.getElementById('OneByOneReadout').style.display = '';
		document.getElementById('ShowMethodButton').innerHTML = ShowAllQuestionsCaption;
		ShowingAllQuestions = false;	
	}
	document.getElementById('ShowMethodButton').style.display = 'inline';
}

function CreateStatusArray(){
	var QNum, ANum;
//For each item in the item array
	for (QNum=0; QNum<I.length; QNum++){
//Check if the question still exists (hasn't been nuked by showing a random selection)
		if (document.getElementById('Q_' + QNum) != null){
			State[QNum] = new Array();
			State[QNum][0] = -1; //Score for this q; -1 shows question not done yet
			State[QNum][1] = new Array(); //answers
			for (ANum = 0; ANum<I[QNum][3].length; ANum++){
				State[QNum][1][ANum] = 0; //answer not chosen yet; when chosen, will store its position in the series of choices
			}
			State[QNum][2] = 0; //tries at this q so far
			State[QNum][3] = 0; //incrementing percent-correct values of selected answers
			State[QNum][4] = 0; //penalties incurred for hints
			State[QNum][5] = ''; //Sequence of answers chosen by number
		}
		else{
			State[QNum] = null;
		}
	}
}



function CheckMCAnswer(QNum, ANum, Btn){
//if question doesn't exist, bail
	if (State[QNum].length < 1){return;}
	
//Get the feedback
	Feedback = I[QNum][3][ANum][1];
	
//Now show feedback and bail if question already complete
	if (State[QNum][0] > -1){
//Add an extra message explaining that the question
// is finished if defined by the user
		if (strQuestionFinished.length > 0){Feedback += '<br />' + 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];
	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 += '<br />' + 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 += '<br />' + 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));
			}
		}
		if (State[QNum][0] < 0){
			State[QNum][0] = 0;
		}
	}
}

function GetTotalMCAnswers(QNum){
	var Result = 0;
	for (var ANum=0; ANum<I[QNum][3].length; ANum++){
		if (I[QNum][3][ANum][4] == 1){ //This is an MC answer
			Result++;
		}
	}
	return Result;
}

function FinalAnswer(QNum){
	var UnchosenAnswers = 0;
	var FinalAnswer = -1;
	for (var ANum=0; ANum<I[QNum][3].length; ANum++){
		if (I[QNum][3][ANum][4] == 1){ //This is an MC answer
			if (State[QNum][1][ANum] < 1){ //This answer hasn't been chosen yet
				UnchosenAnswers++;
				FinalAnswer = ANum;
			}
		}
	}
	if (UnchosenAnswers == 1){
		return FinalAnswer;
	}
	else{
		return -1;
	}
}





function CalculateOverallScore(){
	var TotalWeighting = 0;
	var TotalScore = 0;
	
	for (var QNum=0; QNum<State.length; QNum++){
		if (State[QNum] != null){
			if (State[QNum][0] > -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<State.length; QNum++){
		if (State[QNum] != null){
			if (State[QNum][0] < 0){
				AllDone = false;
			}
		}
	}
	if (AllDone == true){
	
//Report final score and submit if necessary
		CalculateOverallScore();
		FB = YourScoreIs + ' ' + Score + '%.';
		if (ShowCorrectFirstTime == true){
			var CFT = 0;
			for (QNum=0; QNum<State.length; QNum++){
				if (State[QNum] != null){
					if (State[QNum][0] >= 1){
						CFT++;
					}
				}
			}
			FB += '<br />' + CorrectFirstTime + ' ' + CFT + '/' + QsToShow;
		}
		WriteToInstructions(FB);
		
		Finished == true;

		TimeOver = true;
		Locked = true;
		


		Finished = true;
		Detail = '<?xml version="1.0"?><hpnetresult><fields>';
		for (QNum=0; QNum<State.length; QNum++){
			if (State[QNum] != null){
				if (State[QNum][5].length > 0){
					Detail += '<field><fieldname>Question #' + (QNum+1) + '</fieldname><fieldtype>question-tracking</fieldtype><fieldlabel>Q ' + (QNum+1) + '</fieldlabel><fieldlabelid>QuestionTrackingField</fieldlabelid><fielddata>' + State[QNum][5] + '</fielddata></field>';
				}
			}
		}
		Detail += '</fields></hpnetresult>';
		setTimeout('Finish()', SubmissionTimeout);
	}
}










//-->

//]]>



