

//<![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';

	FDiv.style.display = 'block';

	ShowElements(false, 'input');
	ShowElements(false, 'select');
	ShowElements(false, 'object');

//Focus the OK button
	setTimeout("document.getElementById('FeedbackOKButton').focus()", 50);
	
//
}

//Added code to work around Quicktime bug for 6.0.4.24.
function ShowElements(Show, TagName){
//Special for IE bug -- hide all the form elements that will show through the popup
	if ((C.ie)||(TagName == 'object')){
		var Els = document.getElementsByTagName(TagName);
		for (var i=0; i<Els.length; i++){
			if (Show == true){
				Els[i].style.visibility = 'visible';
			}
			else{
				Els[i].style.visibility = 'hidden';
			}
		}
	} 
}

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{
	if (window.addEventListener){
		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){
	var Num;
	var 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-1); 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 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 = true;
var ShuffleQs = false;
var ShuffleAs = false;
var DefaultRight = '<strong>Correct!</strong><br />';
var DefaultWrong = '<strong>Sorry!</strong> Try again.';
var QsToShow = 35;
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;
	if (QsToShow > QList.length){
		QsToShow = QList.length;
	}
	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();
	
	SetFocusToTextbox();
}

function SetFocusToTextbox(){
//if there's a textbox, set the focus in it
	if (QArray[CurrQNum].getElementsByTagName('input')[0] != null){
		QArray[CurrQNum].getElementsByTagName('input')[0].focus();
//and show a keypad if there is one
		if (document.getElementById('CharacterKeypad') != null){
			document.getElementById('CharacterKeypad').style.display = 'block';
		}
	}
	else{
  	if (QArray[CurrQNum].getElementsByTagName('textarea')[0] != null){
  		QArray[CurrQNum].getElementsByTagName('textarea')[0].focus();	
//and show a keypad if there is one
			if (document.getElementById('CharacterKeypad') != null){
				document.getElementById('CharacterKeypad').style.display = 'block';
			}
		}
//This added for 6.0.4.11: hide accented character buttons if no textbox
		else{
			if (document.getElementById('CharacterKeypad') != null){
				document.getElementById('CharacterKeypad').style.display = 'none';
			}
		}
	}
}

function ChangeQ(ChangeBy){
//The following line prevents moving to another question until the current
//question is answered correctly. Uncomment it to enable this behaviour. 
//	if (State[CurrQNum][0] == -1){return;}
	if (((CurrQNum + ChangeBy) < 0)||((CurrQNum + ChangeBy) >= QArray.length)){return;}
	QArray[CurrQNum].style.display = 'none';
	CurrQNum += ChangeBy;
	QArray[CurrQNum].style.display = '';
//Undocumented function added 10/12/2004
	ShowSpecialReadingForQuestion();
	SetQNumReadout();
	SetFocusToTextbox();
}

var HiddenReadingShown = false;
function ShowSpecialReadingForQuestion(){
//Undocumented function for showing specific reading text elements which change with each question
//Added on 10/12/2004
	if (document.getElementById('ReadingDiv') != null){
		if (HiddenReadingShown == true){
			document.getElementById('ReadingDiv').innerHTML = '';
		}
		if (QArray[CurrQNum] != null){
			var Children = QArray[CurrQNum].childNodes;
			for (var i=0; i<Children.length; i++){
			if (Children[i].className=="HiddenReading"){
					document.getElementById('ReadingDiv').innerHTML = Children[i].innerHTML;
					HiddenReadingShown = true;
//Hide the ShowAllQuestions button to avoid confusion
					if (document.getElementById('ShowMethodButton') != null){
						document.getElementById('ShowMethodButton').style.display = 'none';
					}
				}
			}	
		}
	}
}

function SetQNumReadout(){
	document.getElementById('QNumReadout').innerHTML = (CurrQNum+1) + ' / ' + QArray.length;
	if ((CurrQNum+1) >= QArray.length){
		if (document.getElementById('NextQButton') != null){
			document.getElementById('NextQButton').style.visibility = 'hidden';
		}
	}
	else{
		if (document.getElementById('NextQButton') != null){
			document.getElementById('NextQButton').style.visibility = 'visible';
		}
	}
	if (CurrQNum <= 0){
		if (document.getElementById('PrevQButton') != null){
			document.getElementById('PrevQButton').style.visibility = 'hidden';
		}
	}
	else{
		if (document.getElementById('PrevQButton') != null){
			document.getElementById('PrevQButton').style.visibility = 'visible';
		}
	}
}

var 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('All the land right next to a stream or lake','',0,25,1);
I[0][3][1]=new Array('All the land areas that drains to a stream or lake','<strong>Correct!</strong> <br /> Find out more about <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'../../../../understanding/watershed.html\');return false;">watersheds</a> <br />',1,100,1);
I[0][3][2]=new Array('Lowland areas surrounding a lake or stream','',0,25,1);
I[0][3][3]=new Array('None of the above','',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('Pathogens, Sediment, and Temperature','',1,100,1);
I[1][3][1]=new Array('Sediment, Nutrients, and Groundwater','Sorry! <br /> Groundwater is not a pollutant Try again. <br />',0,67,1);
I[1][3][2]=new Array('Impervious Surfaces, Litter, and Pathogens','Sorry! <br /> Impervious surfaces are not pollutants Try again. <br />',0,67,1);
I[1][3][3]=new Array('All of the Above','Sorry! <br /> Groundwater and Impervious surfaces are not pollutants Try again. <br />',0,78,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('Clouds up water','',0,25,1);
I[2][3][1]=new Array('Smothers fish/insect habitat','',0,25,1);
I[2][3][2]=new Array('Clogs fish gills','',0,25,1);
I[2][3][3]=new Array('Carries phosphorus (P) and mercury (Hg ), and other contaminants','',0,25,1);
I[2][3][4]=new Array('All of the above','<strong>Correct!</strong> <br /> Find out more about <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'../../../../understanding/param_turbidity.html\');return false;">sediments and turbidity</a> <br />',1,100,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('Point sources of pollution','',0,0,1);
I[3][3][1]=new Array('Nonpoint source pollution','<strong>Correct!</strong> <br /> Virtually all the major point sources, such as wastewater treatment plants and industrial discharges have stringent water quality permits with monitoring requirements and pollutant concentration and loading limits. Find out more at WaterontheWeb <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'http://waterontheweb.org/curricula/ws/unit_01/U1mod1.html\');return false;">Lecture 3</a> and the <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'http://www.epa.gov/watertrain/#introductory\');return false;">EPA Watershed Academy</a> <br />',1,100,1);
I[3][3][2]=new Array('Neither','',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('True','',0,0,1);
I[4][3][1]=new Array('False','<strong>Correct!</strong> <br /> Find out more about <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'../../../../understanding/param_turbidity.html\');return false;">sediments and turbidity</a> <br />',1,100,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('cause undue hardship and expense on the developer and contractor.','',0,0,1);
I[5][3][1]=new Array('provide jobs for government employees.','',0,0,1);
I[5][3][2]=new Array('give environmental activists something to do.','',0,0,1);
I[5][3][3]=new Array('provide a means of construction without harming the environment through sediment pollution.','<strong>Correct!</strong> <br /> Although it sometimes might seem like there are multiple correct answers to this question, excess sediment is extremely destructive to aquatic systems and water quality. <br />',1,100,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('The inspector','',0,0,1);
I[6][3][1]=new Array('Whoever is the easiest to blame','',0,0,1);
I[6][3][2]=new Array('The owner of the project and the general contractor/operator responsible for the site','<strong>Correct!</strong> <br /> The owner and contractor both sign onto the NPDES Construction permit and are JOINTLY responsible for preventing pollution. <br />',1,100,1);
I[6][3][3]=new Array('The downstream property owner','',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('Perimeter controls such as silt fence','',0,0,1);
I[7][3][1]=new Array('Retaining existing vegetation','<strong>Correct!</strong> <br /> Source control of pollutants is virtually always the cheapest approach <br />',1,100,1);
I[7][3][2]=new Array('Sediment traps or basins','',0,0,1);
I[7][3][3]=new Array('Inlet controls','',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('Shielding soil surfaces from raindrops','',0,33,1);
I[8][3][1]=new Array('Roots holding soil','',0,33,1);
I[8][3][2]=new Array('Slowing runoff velocity','',0,33,1);
I[8][3][3]=new Array('All of the above','',1,100,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('True','',0,0,1);
I[9][3][1]=new Array('False','<strong>Correct!</strong><br /> See the <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'etc/StormwaterComplianceCalendar2006.pdf\');return false;">MPCA Stormwater Compliance Calendar</a> (1.8 MB pdf file)<br />',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('Sheet','',0,0,1);
I[10][3][1]=new Array('Rill','',0,0,1);
I[10][3][2]=new Array('Gully','',1,100,1);
I[10][3][3]=new Array('Channel','',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('True','',0,0,1);
I[11][3][1]=new Array('False','<strong>Correct!</strong><br /> Again, source control of pollutants is virtually almost the most effective way to prevent pollution problems<br />',1,100,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('\u00BD','<strong>Correct!</strong><br /> See the <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'etc/StormwaterComplianceCalendar2006.pdf\');return false;">MPCA Stormwater Compliance Calendar</a> (1.8 MB pdf file)<br />',1,100,1);
I[12][3][1]=new Array('All','',0,0,1);
I[12][3][2]=new Array('\u00BC','',0,0,1);
I[12][3][3]=new Array('\u00BE','',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('They do not have to be trenched in.','',0,0,1);
I[13][3][1]=new Array('They can be placed up and down a slope as well as across a slope.','',0,0,1);
I[13][3][2]=new Array('They last longer.','',1,100,1);
I[13][3][3]=new Array('They do not require frequent  inspection and maintenance.','',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('Protecting the soil from rain splash','',0,0,1);
I[14][3][1]=new Array('Enhancing the soil infiltration rate','',0,0,1);
I[14][3][2]=new Array('Slowing surface runoff velocities','',1,100,1);
I[14][3][3]=new Array('All of the above','',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('By the end of each work week','',0,0,1);
I[15][3][1]=new Array('Within 24 hours of discovery','<strong>Correct!</strong><br /> See the <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'etc/StormwaterComplianceCalendar2006.pdf\');return false;">MPCA Stormwater Compliance Calendar</a> (1.8 MB pdf file)<br />',1,100,1);
I[15][3][2]=new Array('Twice a day','',0,0,1);
I[15][3][3]=new Array('Only if a neighbor complains','',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('Within 12 hours','',0,0,1);
I[16][3][1]=new Array('Immediately','',0,0,1);
I[16][3][2]=new Array('Within 24 hours or as soon as field conditions allow access','<strong>Correct!</strong><br /> See the <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'etc/StormwaterComplianceCalendar2006.pdf\');return false;">MPCA Stormwater Compliance Calendar</a> (1.8 MB pdf file)<br />',1,100,1);
I[16][3][3]=new Array('Within 72 hours','',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('Within 24 hours of any upgradient land disturbance','',0,0,1);
I[17][3][1]=new Array('Within 2 days of land disturbance','',0,0,1);
I[17][3][2]=new Array('Before any up gradient land disturbance begins','<strong>Correct!</strong><br /> Other perimeter control mechanisms include: topsoil berms, staked in biorolls, or simply leaving a strip of grassed vegetation to capture sediment.  MPCA <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'http://www.pca.state.mn.us/water/stormwater/index.html\');return false;">Stormwater Site</a> <br />',1,100,1);
I[17][3][3]=new Array('Within 1 week of land disturbance','',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('True','<strong>Correct!</strong><br /> Clay soils don\u2019t allow water to soak in as fast as sandy soils.<br />',1,100,1);
I[18][3][1]=new Array('False','',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('Is best constructed with  1-1/2\u201Dto 3\u201D crushed stone','',0,33,1);
I[19][3][1]=new Array('Can have geotextile fabric underneath  the crushed stone','',0,33,1);
I[19][3][2]=new Array('Needs continual maintenance','',0,33,1);
I[19][3][3]=new Array('All of the above','<strong>Correct!</strong><br /> Sometimes a construction entrance isn\u2019t effective or there isn\u2019t enough room to install one.  Other solutions may include putting out metal sheet piling for trucks to bounce their tires over, or simply sweeping between every few trucks during the work day.<br />',1,100,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('Filling in deep pools which give fish protective cover','',0,33,1);
I[20][3][1]=new Array('Covering over gravel bottoms used by fish to deposit eggs','',0,33,1);
I[20][3][2]=new Array('Filling in the stream channel, causing more frequent flooding and bank erosion','',0,33,1);
I[20][3][3]=new Array('All of the above','<strong>Correct!</strong><br /> Find out more about  <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'../../../../understanding/param_turbidity.html\');return false;">sediment</a><br />',1,100,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('Natural Protection of Developed Erosion Sites','',0,0,1);
I[21][3][1]=new Array('National Pollutant Discharge Elimination System','<strong>Correct!</strong><br /> Learn more in this <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'etc/wq-strm2-03.pdf\');return false;">MPCA Guide</a> (118 KB pdf file)<br />',1,100,1);
I[21][3][2]=new Array('National Pollutant Development and Elimination System','',0,0,1);
I[21][3][3]=new Array('National Policy for Discharge of Erosion and Sediment','',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('Rainfall on the surface of the earth','',0,33,1);
I[22][3][1]=new Array('Wind on the surface of the earth','',0,33,1);
I[22][3][2]=new Array('Snow melt on the surface of the earth','',0,33,1);
I[22][3][3]=new Array('All of the above','<strong>Correct!</strong><br /> Find out more about <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'../../../../understanding/impact_erosion.html\');return false;">erosion</a><br />',1,100,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('Rainfall/climate','',0,33,1);
I[23][3][1]=new Array('Erodibility of the soil','',0,33,1);
I[23][3][2]=new Array('Slope length and steepness','',0,33,1);
I[23][3][3]=new Array('All of the above','<strong>Correct!</strong><br /> Find out more about <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'../../../../understanding/impact_erosion.html\');return false;">erosion</a><br />',1,100,1);
I[24]=new Array();I[24][0]=100;
I[24][1]='';
I[24][2]='0';
I[24][3]=new Array();
I[24][3][0]=new Array('The root systems are very shallow, causing the water to run over the top','',0,0,1);
I[24][3][1]=new Array('They require annual fertilization and maintenance','',0,0,1);
I[24][3][2]=new Array('They are deeply rooted, allowing for greater infiltration and  erosion control','<strong>Correct!</strong><br /> See:  <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'http://www.pca.state.mn.us/publications/manuals/pfsd-section1.pdf\');return false;">Plants for Stormwater Design</a> (MPCA 2003)  [1.5 MB pdf file]<br',1,100,1);
I[24][3][3]=new Array('They should not be used for permanent cover','',0,0,1);
I[25]=new Array();I[25][0]=100;
I[25][1]='';
I[25][2]='0';
I[25][3]=new Array();
I[25][3][0]=new Array('The sediment reaches one third the height of the fabric','',1,100,1);
I[25][3][1]=new Array('The sediment reaches one half the height of the fabric','',0,0,1);
I[25][3][2]=new Array('The sediment reaches three quarters the height of the fabric','',0,0,1);
I[25][3][3]=new Array('None of the above','',0,0,1);
I[26]=new Array();I[26][0]=100;
I[26][1]='';
I[26][2]='0';
I[26][3]=new Array();
I[26][3][0]=new Array('Realize that each site is unique and will require a different approach','',0,0,1);
I[26][3][1]=new Array('Evaluate each part of a project with an eye toward erosion control and minimization of soil loss','',0,0,1);
I[26][3][2]=new Array('Use good common sense','',0,0,1);
I[26][3][3]=new Array('All of the above','<strong>Correct!</strong><br /> See the MPCA Stormwater Construction   <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'http://www.pca.state.mn.us/publications/wq-strm2-10.pdf\');return false;">Inspection Guide</a>  [6.1 MB pdf file]<br />',1,100,1);
I[27]=new Array();I[27][0]=100;
I[27][1]='';
I[27][2]='0';
I[27][3]=new Array();
I[27][3][0]=new Array('Erosion control','',0,0,1);
I[27][3][1]=new Array('Sediment control','<strong>Correct!</strong><br /> Silt fence is designed to capture moving sediment, not to prevent soil from eroding away.<br />',1,100,1);
I[27][3][2]=new Array('Both erosion and sediment control','',0,0,1);
I[27][3][3]=new Array('Neither erosion nor sediment control','',0,0,1);
I[28]=new Array();I[28][0]=100;
I[28][1]='';
I[28][2]='0';
I[28][3]=new Array();
I[28][3][0]=new Array('Erosion control','<strong>Correct!</strong><br /> Mulch \u201Croughens\u201D up the slope, and it slows the water down, giving it less energy to erode away the soil underneath.<br />',1,100,1);
I[28][3][1]=new Array('Sediment control','',0,0,1);
I[28][3][2]=new Array('Both erosion and sediment control','',0,0,1);
I[28][3][3]=new Array('Neither erosion nor sediment control','',0,0,1);
I[29]=new Array();I[29][0]=100;
I[29][1]='';
I[29][2]='0';
I[29][3]=new Array();
I[29][3][0]=new Array('True','<strong>Correct!</strong><br /> Control of pollutants as close to the source as possible is usually the most effective approach, both environmentally and economically in the long run.<br />',1,100,1);
I[29][3][1]=new Array('False','',0,0,1);
I[30]=new Array();I[30][0]=100;
I[30][1]='';
I[30][2]='0';
I[30][3]=new Array();
I[30][3][0]=new Array('1','',1,100,1);
I[30][3][1]=new Array('3','',0,0,1);
I[30][3][2]=new Array('7','',0,0,1);
I[30][3][3]=new Array('14','',0,0,1);
I[31]=new Array();I[31][0]=100;
I[31][1]='';
I[31][2]='0';
I[31][3]=new Array();
I[31][3][0]=new Array('Seed & fertilizer','',1,100,1);
I[31][3][1]=new Array('Seed & mulch','',0,0,1);
I[31][3][2]=new Array('Pavement','',0,0,1);
I[31][3][3]=new Array('Rip rap','',0,0,1);
I[32]=new Array();I[32][0]=100;
I[32][1]='';
I[32][2]='0';
I[32][3]=new Array();
I[32][3][0]=new Array('Wetland','',0,0,1);
I[32][3][1]=new Array('Storm sewer','',0,0,1);
I[32][3][2]=new Array('Curb & gutter','',0,0,1);
I[32][3][3]=new Array('Stream','',0,0,1);
I[32][3][4]=new Array('None of the above','<strong>Correct!</strong><br /> Find more information on the  <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'http://www.pca.state.mn.us/water/stormwater/stormwater-c-steps.html \');return false;">MPCA Stormwater webpage</a>.<br />',1,100,1);
I[33]=new Array();I[33][0]=100;
I[33][1]='';
I[33][2]='0';
I[33][3]=new Array();
I[33][3][0]=new Array('Installing silt fence','',0,0,1);
I[33][3][1]=new Array('Having multiple BMPs working together to prevent erosion and provide several \u201Cchances\u201D for capturing sediment before it leaves the site','<strong>Correct!</strong><br /> We used to describe this as creating a riffle/pool effect. The Metro area Erosion and Sediment Control folks refer to this in more general terms as the  \u201CTreatment Train\u201D concept.For example: An example of a site with a \u201Ctreatment train\u201D would be one where a slope is mulched/seeded, has biorolls staked in as ditch checks every 30 feet, and silt fence installed at the bottom of the hill.<br />',1,100,1);
I[33][3][2]=new Array('Installing hay bale barriers','',0,0,1);
I[33][3][3]=new Array('Conveying stormwater off the site as quickly as possible','',0,0,1);
I[34]=new Array();I[34][0]=100;
I[34][1]='';
I[34][2]='0';
I[34][3]=new Array();
I[34][3][0]=new Array('Trout stream','',0,0,1);
I[34][3][1]=new Array('Trout lake','',0,0,1);
I[34][3][2]=new Array('Lake Superior','',0,0,1);
I[34][3][3]=new Array('A historic bridge','<strong>Correct!</strong><br /> Find more information on the  <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'http://www.pca.state.mn.us/water/stormwater/stormwater-c-steps.html \');return false;">MPCA Stormwater webpage</a>.<br />',1,100,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);
			}
		}
	}
//Undocumented function added 10/12/2004
	ShowSpecialReadingForQuestion();
}

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));
			}
		}
//Fix for Safari bug added for version 6.0.3.42 (negative infinity problem)
		if ((State[QNum][0] < 0)||(State[QNum][0] == Number.NEGATIVE_INFINITY)){
			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);
	}
}










//-->

//]]>



