

//<![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('Weapons systems maintenance','Correct!  Routine and dedicated maintenance of weapons systems is not a function of the damage control organization.',1,100,1);
I[0][3][1]=new Array('Firefighting','Sorry.  Fire on a ship remains one of the greatest dangers.  Damage control personnel need to be able to respond quickly and effectively to battle fires.',0,0,1);
I[0][3][2]=new Array('Collision and grounding damage','Nope.  On all ships and at all times you must be ready for possible collisions and grounding.  The timeliness and effectiveness of the response to such events can determine the survival of the ship and her crew.',0,0,1);
I[0][3][3]=new Array('Battle damage','Nope.  This is a primary function of damage control organization during combat operations.',0,0,1);
I[0][3][4]=new Array('Care of the injured','Sorry.  This is an important area of damage control because injuries follow damage to the ship.  Those who respond to repair the damage must be ready to deal with injured personnel.',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('The Engineer Officer','Right!  He or she will be assisted in their duties by the damage control assistant.  This makes sense when you remember that the engineer officer has perhaps the best overall knowledge of the ship and its layout.',1,100,1);
I[1][3][1]=new Array('The Executive Officer','Nope.  Although the XO will be closely involved with the damage control efforts, he or she is not normally designated as the damage control officer.',0,0,1);
I[1][3][2]=new Array('The Commanding Officer','Nope.  While he or she has overall responsibility for everything that happens onboard their ship, the Commanding Officer delegates the position of damage control officer to another officer.',0,0,1);
I[1][3][3]=new Array('The Safety Officer','Sorry.  While closely involved in the damage control process, the Safety Officer is not normally designated as the damage control officer.',0,0,1);
I[1][3][4]=new Array('The First Lieutenant','Sorry.  The First Lieutenant does not have this as a primary responsibility.',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('The Damage Control Assistant (DCA)','Correct.  The DCA is also responsible for preventing and repairing damage and caring for machinery, drainage, and piping assigned to the damage control organization.',1,100,1);
I[2][3][1]=new Array('The Damage Control Officer (DCO)','Sorry.  The DCO has overall responsibility for all aspects of damage control, but they have another individual to whom they delegate the responsibility of damage control training.',0,0,1);
I[2][3][2]=new Array('The Commanding Officer','Nope.  While the CO is ultimately responsible for everything that takes pace on the ship, he or she delegates the damage control training to another individual.',0,0,1);
I[2][3][3]=new Array('The Engineer Officer','Nope.  While this officer is normally designated as the damage control officer, he or she is not normally personally responsible for the training of the crew in damage control procedures.',0,0,1);
I[2][3][4]=new Array('The Safety Officer','Sorry.  While he or she is involved in almost every aspect of damage control, the Safety Officer has his or her own program and training to run.',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('Damage Control Central','Right.  It is from this location that the DCA coordinates all the repair parties for hull, propulsion, electronics, weapons, air operations, and the battle dressing stations.',1,100,1);
I[3][3][1]=new Array('Main Stations Damage Control','Sorry.  While this may sound like a correct combination of words, there is no such thing within normal ship\'s organization.',0,0,1);
I[3][3][2]=new Array('Repair Locker Central','Nope.  There is no such thing as "Repair Locker Central."',0,0,1);
I[3][3][3]=new Array('Repair Locker One','Sorry.  While there will be a Repair Locker One, it is simply one of many repair lockers spread throughout the ship to handle damage control tasks within its specific area.',0,0,1);
I[3][3][4]=new Array('Central Control','Nope.  There is no such station as \'Central Control".',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('Repair parties','Correct!  Repair parties are the main components in the Damage Control Assistant\'s damage control organization.',1,100,1);
I[4][3][1]=new Array('Away teams','Sorry.  Away teams are groups of ships company personnel who are sent ashore or to another ship for a specific purpose, not damage control teams.',0,0,1);
I[4][3][2]=new Array('Damage control groups','Sorry.  While this might sound like it has the right elements in it, there is no such thing as "Damage Control Groups".',0,0,1);
I[4][3][3]=new Array('CBR parties','Nope.  CBR (chemical, Biological, and Nuclear Warfare) is just one of them many different types of damage that can happen to a ship and need to be controlled.',0,0,1);
I[4][3][4]=new Array('Damage Control Assistants','Nope.  You are thinking about the Damage Control Assistant (CDA), the person in primary control of Damage Control Central during damage control problems.  He or she is the one who would send out the personnel to make the emergency repairs.',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('Battle dressing stations','Right!  Stretcher cases may be brought directly to the station by the repair party stretcher-bearers.',1,100,1);
I[5][3][1]=new Array('Emergency Medical Lockers','Nope.  There is no such thing as "Emergency Medical Lockers".',0,0,1);
I[5][3][2]=new Array('Emergency Medical Stations','Nope.  While this sounds like it could be correct and several such stations may exist on the ship, this is not the spot where casualties are taken for treatment by medical personnel.',0,0,1);
I[5][3][3]=new Array('Damage Control Centrals','Sorry.  DCC is the headquarters for all damage control activities and focuses on repair party control and keeping the ship in fighting shape.  Casualties would only get in the way here and so they are treated in another area.',0,0,1);
I[5][3][4]=new Array('Repair Lockers','Sorry.  While repair lockers will have the essential equipment needed for the repair parties and even some basic medical supplies, this is not the place you would find the dedicated treatment of casualties by medical department personnel.',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('WISKEY','Correct.  There is no such material condition of readiness.',1,100,1);
I[6][3][1]=new Array('X-RAY','Sorry.  X-Ray is the least restrictive of the material conditions.',0,0,1);
I[6][3][2]=new Array('YOKE','Nope.  Yoke is an intermediate condition of readiness and is normally set while at sea and outside of regular working hours during peacetime in port.',0,0,1);
I[6][3][3]=new Array('ZEBRA','Sorry.  Zebra offers the greatest degree of protection of the three material conditions.',0,0,1);
I[6][3][4]=new Array('These are all basic material conditions of readiness.','Nope.  There are only three material conditions of readiness aboard ship.',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('X-RAY','Right.  This material condition offers the ship the least amount of protection against fire and flooding and can only be set during the most protected times.',1,100,1);
I[7][3][1]=new Array('YOKE','Sorry.  Yoke provides intermediate protection and is set and maintained at sea and is set in port in peacetime outside of normal working hours.',0,0,1);
I[7][3][2]=new Array('ZEBRA','Sorry.  Zebra is actually the most restrictive material condition and is set before going to sea or when entering port during war.',0,0,1);
I[7][3][3]=new Array('WISKEY','Nope.  There is no material condition named "Whiskey".',0,0,1);
I[7][3][4]=new Array('VICTOR','Nope.  There is no material condition named "Victor".',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('Circle fittings, such as a circle X-Ray fitting.','Correct.  These circle fittings allow for the temporary movement of personnel during battle conditions along the most traveled routes.',1,100,1);
I[8][3][1]=new Array('Zebra Fittings','Nope.  Zebra is the most restrictive of material conditions and when set it requires the permission of the DCA or OOD to open them unless they have an additional marking on them.',0,0,1);
I[8][3][2]=new Array('Yoke Fittings','Nope.  Yoke is the intermediate material condition of readiness.  When these fittings are closed it requires permission through the DCA or OOD to open them.',0,0,1);
I[8][3][3]=new Array('William Fittings','Sorry.  William fittings are ventilation fittings and are never closed unless they have a circle around them and then only closed to limit air circulation during a CBR attack.',0,0,1);
I[8][3][4]=new Array('Dog-Zebra Fittings','Sorry.  Dog-Zebra fittings are fittings closed for darken ship conditions.',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('William','Right!  These are ventilation fittings that must remain open at all times for the safety of the ship and the crew.',1,100,1);
I[9][3][1]=new Array('Circle William','Sorry.  Circle William fittings may be closed to limit air circulation during a CBR attack.',0,0,1);
I[9][3][2]=new Array('X-Ray','Nope.  X-Ray fittings are fittings which must be closed anytime X-Ray, Yoke or Zebra material conditions are set throughout the ship.',0,0,1);
I[9][3][3]=new Array('Dog-Zebra','Sorry.  Dog-Zebra fittings are fittings that are closed to cut off interior light during darken ship conditions.',0,0,1);
I[9][3][4]=new Array('Circle Yoke','Nope.  Circle Yoke markings would indicate a Yoke fitting that could be temporarily opened without having to obtain permission from the DCA or OOD>',1,100,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('To establish and maintain flood boundaries.','Correct!  This is done using the watertight compartmentation in the ship.',1,100,1);
I[10][3][1]=new Array('To install large pumps to pump out the incoming water.','Sorry.  While pumps are used to control the extent of flooding, there is something else that is done first.',0,0,1);
I[10][3][2]=new Array('To attempt to send divers over the side to close off the hole.','Sorry.  If you can\'t plug the hole from the inside you will have no time to do so from the outside.',0,0,1);
I[10][3][3]=new Array('The heel the ship over to the opposite side to get the hole above the waterline.','Nope.  Nice thought but this would be impractical in most cases.',0,0,1);
I[10][3][4]=new Array('A hole that cannot be plugged below the waterline is sure to sink the ship.','Nope.  Modern ships are built to be able to sustain such damage as long as the area it is limited to is contained.',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 Ships Telephone system (STS)','Right!  While there is a telephone system onboard ship it cannot be counted on to be reliable during emergencies and so is not normally counted on for damage control drills or actual damage control events.',1,100,1);
I[11][3][1]=new Array('The 1MC','Nope.  The 1MC is the name given to the ship\'s general announcing system and it is a fast method of getting information out to all hands during emergencies when damage hasn\'t put it out of action.',0,0,1);
I[11][3][2]=new Array('The general announcing system','Sorry.  This system, also known as the 1MC, is a quick means of getting out information to all hands when it is still functional.',0,0,1);
I[11][3][3]=new Array('Sound-powered telephones','Nope.  this is actually the primary means of transmitting damage control information.',0,0,1);
I[11][3][4]=new Array('Messengers','Sorry.  Messengers are a backup method of communications which has proven fast and reliable when electronic systems are put out of action.',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('Collision alarm','Correct.  This indicates that a collision with another ship or object is imminent.',1,100,1);
I[12][3][1]=new Array('General alarm','Sorry.  General alarms are a series of single gong tones.',0,0,1);
I[12][3][2]=new Array('Chemical alarm','Nope.  Chemical alarms are a steady tone signal.',0,0,1);
I[12][3][3]=new Array('General Quarters alarm','Sorry.  General Quarters is a series of single gong tones.',0,0,1);
I[12][3][4]=new Array('Fire alarm','Nope.  There is no specific fire alarm on board Navy ships.',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('Cooling the fire with lots of water.','Right.  This is generally done using both solid stream and fog (spray) nozzles to cool the burning surface rapidly.',1,100,1);
I[13][3][1]=new Array('Pumping in carbon dioxide to remove the oxygen.','Sorry.  While this is an often-used method to break the fire triangle and put out a fire, it isn\'t the most common method.',0,0,1);
I[13][3][2]=new Array('Using chemical powders, foam or sand to remove the oxygen.','Sorry.  While this method will extinguish a fire, it is not always practical or available.',0,0,1);
I[13][3][3]=new Array('Allowing the fire to burn itself out.','Nope.  This is seldom if ever the best method of putting out a fire.',0,0,1);
I[13][3][4]=new Array('Removing the source of the fuel for the fire.','Nope.  While this would put a fire out, it isn\'t the most common method available due to the nature of the majority of fires onboard ships.',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('Alpha','Right.  Class Alpha fires are usually cooled down with fog spray, then a solid stream of water is used to break up the material for further cooling.',1,100,1);
I[14][3][1]=new Array('Bravo','Sorry.  Class Bravo fires involve flammable liquids.',0,0,1);
I[14][3][2]=new Array('Charlie','Sorry.  Class Charlie fires are those burning in electrical or electronic equipment.',0,0,1);
I[14][3][3]=new Array('Delta','Nope  Class Delta fires involve combustible metals such as magnesium, sodium, and titanium.',0,0,1);
I[14][3][4]=new Array('Echo','Nope.  There is no such category as class Echo fires.',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('Class Bravo','Right!  Smaller class Bravo fires are put out with Carbon dioxide but larger fires require light water to be used.',1,100,1);
I[15][3][1]=new Array('Class Alpha','Sorry.  Class Alpha fires involve combustible materials such as wood, cloth, or paper.',0,0,1);
I[15][3][2]=new Array('Class Charlie','Sorry.  Class Charlie fires are those burning in electrical or electronic equipment.',0,0,1);
I[15][3][3]=new Array('Class Delta','Nope.  Class Delta fires involve combustible metals.',0,0,1);
I[15][3][4]=new Array('Class Echo','Nope.  There is no such thing as a class Echo fire.',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('Class Charlie','Correct!  These type of fires require Carbon dioxide and dry chemical extinguishers.',1,100,1);
I[16][3][1]=new Array('Class Alpha','Sorry.  Class Alpha fires involve combustible materials such as wood, cloth, or paper.',0,0,1);
I[16][3][2]=new Array('Class Bravo','Sorry.  Class Bravo fires involve flammable liquids.',0,0,1);
I[16][3][3]=new Array('Class Delta','Nope.  Class Delta fires involve combustible metals.',0,0,1);
I[16][3][4]=new Array('Class Echo','Nope.  There is no such thing as a class Echo fire.',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('Class Delta','right!  Only light water or low-velocity fog should be used on these type of fires.',1,100,1);
I[17][3][1]=new Array('Class Alpha','Sorry.  Class Alpha fires involve combustible materials such as wood, cloth, or paper.',0,0,1);
I[17][3][2]=new Array('Class Bravo','Sorry.  Class Bravo fires involve flammable liquids.',0,0,1);
I[17][3][3]=new Array('Class Charlie','Nope.  Class Charlie fires are those burning in electrical or electronic equipment.',0,0,1);
I[17][3][4]=new Array('Class Echo','Nope.  There is no such thing as a Class Echo fire.',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('Class Bravo','Correct.  Class Bravo fires involve flammable liquids and these tend to just break up and spread out when hit with a solid stream of water.',1,100,1);
I[18][3][1]=new Array('Class Alpha','Nope.  Solid streams of water are used on Class Alpha fires after they have been cooled by fog in order to break up the material for further cooling.',0,0,1);
I[18][3][2]=new Array('Class Charlie','Sorry.  While you shouldn\'t use water on Class Charlie fires, it is due to the potential shock hazard and not because it would scatter the fuel.',0,0,1);
I[18][3][3]=new Array('Class Delta','Sorry.  While solid streams of water are generally not used on these types of fire, it isn\'t because there is concern that it will scatter the fuel and spread the flames.',0,0,1);
I[18][3][4]=new Array('Class Echo','Nope.  There is no such thing as a Class Echo fire.',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('Class Delta','Right.  Class Delta fires involve combustible metals and these tend to burn at such a high temperature and brightness that eye protection is often required.',1,100,1);
I[19][3][1]=new Array('Class Alpha','Sorry.  Class Alpha fires involve materials such as wood, cloth, or paper.  These do not burn bright enough to require this degree of protection.',0,0,1);
I[19][3][2]=new Array('Class Charlie','Sorry  Class Charlie fires involve burning electrical or electronic equipment and generally would not burn bright enough to require such protection for the eyes.',0,0,1);
I[19][3][3]=new Array('Class Bravo','Nope.  Class Bravo fires involve flammable liquids and do not burn bright enough to need welder\'s goggles.',0,0,1);
I[19][3][4]=new Array('Class Echo','Nope.  There is no such thing as a Class Echo fire.',0,0,1);
I[20]=new Array();I[20][0]=100;
I[20][1]='';
I[20][2]='0';
I[20][3]=new Array();
I[20][3][0]=new Array('It delivers seawater to fireplugs and sprinkler systems.','Correct! It is similar in function to a city\'s fire main system.',1,100,1);
I[20][3][1]=new Array('It supplies the freshwater wash down system for the outside spaces.','Sorry.  The freshwater wash down system is supplied by another system.',0,0,1);
I[20][3][2]=new Array('It causes sprinkler systems to go off automatically when compartment temperatures reach a certain level.','Nope.  This system has nothing to do with temperature sensing.',0,0,1);
I[20][3][3]=new Array('It automatically reloads and recharges the portable fire extinguishers located at various stations throughout the ship.','Nope.  Most of the portable extinguishers aboard ship are carbon dioxide and not water.',0,0,1);
I[20][3][4]=new Array('It detects the presence of fire in various parts of the ship and automatically closes the nearby watertight hatches.','Sorry. This is not a temperature-activated or mechanical system.',0,0,1);
I[21]=new Array();I[21][0]=100;
I[21][1]='';
I[21][2]='0';
I[21][3]=new Array();
I[21][3][0]=new Array('Carbon dioxide and PKP','Right!  These two types of portable extinguishers are effective in fighting Class Bravo and Class Charlie fires.',1,100,1);
I[21][3][1]=new Array('Carbon dioxide and water','Sorry.  There are generally no water-type portable fire extinguisher used aboard ship.',0,0,1);
I[21][3][2]=new Array('PKP and water','Sorry.  There are generally no water-type portable fire extinguisher used aboard ship.',0,0,1);
I[21][3][3]=new Array('Light water and PKP','Nope  There are no light water-type portable extinguishers onboard ship.',0,0,1);
I[21][3][4]=new Array('Carbon dioxide and Light water','Nope  There are no light water-type portable extinguishers onboard ship.',0,0,1);
I[22]=new Array();I[22][0]=100;
I[22][1]='';
I[22][2]='0';
I[22][3]=new Array();
I[22][3][0]=new Array('Investigators','Correct.  Once they find the fire, they check bulkheads, decks and vents for heat to see if a fire is in an adjoining compartment and ensure that the fire has not spread to them.',1,100,1);
I[22][3][1]=new Array('Smokemen','Nope.  There is no such term as this used aboard Navy ships.',0,0,1);
I[22][3][2]=new Array('Door dogs','Sorry.  Door dogs are heavy latches designed to close watertight doors and hatches.',0,0,1);
I[22][3][3]=new Array('Trace runners','Nope.  There is no such term as this used aboard Navy ships.',0,0,1);
I[22][3][4]=new Array('Reflash watchers','Sorry.  While repair party personnel do set a reflash watch after a fire has been contained, this is not the name of the personnel who are the first to check for the location of a fire.',0,0,1);
I[23]=new Array();I[23][0]=100;
I[23][1]='';
I[23][2]='0';
I[23][3]=new Array();
I[23][3][0]=new Array('Dewatering','Right.  This can be a large and time-consuming process depending on the scale of the fire and the amount of water used to fight it.',1,100,1);
I[23][3][1]=new Array('Reflash watch','Sorry.  A reflash watch is set to ensure that a fire doesn\'t rekindle from the ashes of the fire that was just put out.',0,0,1);
I[23][3][2]=new Array('Door dogging','Nope.  Door dogs are heavy latches used to tightly close watertight doors and hatches.  They have nothing to do with the process of removing the water used to fight the fire.',0,0,1);
I[23][3][3]=new Array('Reverse flow','Nope.  there is no such term used in this process.',0,0,1);
I[23][3][4]=new Array('Drying out','Sorry  While materials within the spaces affected may be removed to dry out, this is not the term used for the process of removing the water.',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);
	}
}










//-->

//]]>


