

//<![CDATA[

<!--

// BrowserCheck Object

function BrowserCheck() {
	var b = navigator.appName
//HBS extension
	this.mac = (navigator.appVersion.indexOf('Mac') != -1)
	if (b=="Netscape") this.b = "ns"
	else if (b=="Microsoft Internet Explorer") this.b = "ie"
	else this.b = b
	this.version = navigator.appVersion
	this.v = parseInt(this.version)
	this.ns = (this.b=="ns" && this.v>=4)
	this.ns4 = (this.b=="ns" && this.v==4)
	this.ns5 = (this.b=="ns" && this.v==5)
	this.ie = (this.b=="ie" && this.v>=4)
	this.ie4 = (this.version.indexOf('MSIE 4')>0)
	this.ie5 = (this.version.indexOf('MSIE 5')>0)
	this.min = (this.ns||this.ie)
	this.CRAPBrowser = (this.ie4 && this.mac); //Cannot Resolve Addresses Properly
}

is = new BrowserCheck();

var LocFolder = GetFolder(window.location.href);
function GetFolder(LocPath){
	LocPath = ReplaceStuff('\'','%27',LocPath);
	var i = LocPath.lastIndexOf('/');
	if (i<0){i=LocPath.lastIndexOf('\\')};
	return LocPath.substring(0,i);
}

function CombineURLs(InURL){
	var i = InURL.indexOf('../');
	var s = LocFolder;
	while (i >- 1){
		s = GetFolder(s);
		InURL = InURL.substring(3,InURL.length);
		i = InURL.indexOf('../');
	}
	return s + '/' + InURL;
}

x = new Array();
function ResolveURLs(InText,Attribute){
	x.length=0;
	var Temp = InText.toLowerCase();
	var z;
	var AttLen = Attribute.length + 2;
	var y=Temp.lastIndexOf(Attribute + '="');
	while (y>-1){
		var sLoc = y+AttLen;
		if (Temp.substring(sLoc,sLoc+5) != 'http:'){
			x[x.length]=new Array();
			x[x.length-1][0] = sLoc;
			z = Temp.indexOf('"',sLoc);
			x[x.length-1][1] = z;
			x[x.length-1][2] = InText.substring(sLoc,z);

		}
		Temp = Temp.substring(0,y);
		y=Temp.lastIndexOf(Attribute + '="');
	}
	for (var j=0; j<x.length; j++){
		InText = InText.substring(0,x[j][0]) + CombineURLs(x[j][2]) + InText.substring(x[j][1], InText.length);
	}
	return InText;
}

function ResolveAllURLs(Stuff){
	Stuff = ResolveURLs(Stuff,'href');
	Stuff = ResolveURLs(Stuff,'src');
	Stuff = ResolveURLs(Stuff,'parent.location');
	return Stuff;
}

var Feedback = '';
var Correct = 'Correct! Well done.';
var Incorrect = 'Some of your answers are incorrect. Incorrect answers have been left in place for you to change.'; 
var GiveHint = 'The next correct letter has been added to the answer.';
var CaseSensitive = true;
var YourScoreIs = 'Your score is ';
var Instructions = 'Fill in all the gaps, then press "Check" to check your answers. You can click on the "[?]" button to get a clue. Note that you will lose points if you ask for hints or clues!';
var BuiltCloze = '';
var ExerciseSubtitle = 'Gap-fill exercise';
var ExerciseTitle = 'Making negative (Part 2): All tenses (Koen Van Cauwenberge)';
var FirstShow = true;
var ReadingURL = '';

var PreviousPage = history.length;







var NavBar='';


NavBar+='<tr><form name="NavButtons1" action=""><td bgcolor="#800000" align="center">';
NavBar+='<font face="Geneva,Arial" size="-1">';


NavBar+='<input type="button" value="Homepage" onclick=\'parent.location="../opera.htm"\'></input>';


NavBar+='</font></td></form></tr>';
if (is.CRAPBrowser){NavBar=ResolveAllURLs(NavBar);}


var TitleCode = '<tr><td align="center" valign="middle" bgcolor="#ffffff">';
TitleCode += '<font size="+1" face="Geneva,Arial" color="#800000">' + ExerciseTitle + '</font><br />';
TitleCode += '<font size="-1" face="Geneva,Arial" color="#800000">' + ExerciseSubtitle + '<br />';

TitleCode += '</font></td></tr>';

var WordBox = '';

var ClozeOpener = '<table border="0" width="85%" cellpadding="10">';
ClozeOpener += '<tr><td valign="top" bgcolor="#ffffff">';
ClozeOpener += '<form name="Cloze" onsubmit="return false"><font face="Geneva,Arial" color="#000000">';

var ClozeCloser = '</font></form></td></tr>';

var Buttons = '<tr><td align="center" valign="top" bgcolor="#ffffff">';
Buttons += '<form name="Buttons"><font face="Geneva,Arial" color="#000000">';
Buttons += '<input type="button" value="Check" onclick="parent.CheckAnswers()"></input>';



Buttons += '</font></form></td></tr></table>';

var GapCode = '<input type="text" name="[strGapName]" size="[strGapSize]" onFocus="parent.TrackFocus([strItemNum])" value="[strValue]"></input>';
var ClueButton = '';

ClueButton = '<input type="button" value="[?]" onclick="parent.ShowClue([strItemNum])"></input>';


function GoBack(){
	var BackSkip = history.length - PreviousPage;
	if (BackSkip > 0){
		history.go((BackSkip+1)*-1);
	}
	else{
		parent.history.back();
	}
}




function BuildExercise(){
	var OutString = '';
	var ClozeStuff = '';

	for (var i=0; i<I.length; i++){

//Add the text
		ClozeStuff += Text[i];

//Create and add the gap
//If it's already right, then add it in bold:
		if (State[i][4] == 1){
			ClozeStuff += '<b>' + State[i][5] + '</b>';
		}
		
		else{
			GapLen = I[i][1][0][0].length;
			if (GapLen < 3){GapLen = 3;}
			Gap = ReplaceStuff('[strGapSize]', GapLen, GapCode);
			Gap = ReplaceStuff('[strGapName]', 'Gap' + i + '', Gap);
			Gap = ReplaceStuff('[strItemNum]', i + '', Gap);
			Gap = ReplaceStuff('[strValue]', State[i][5], Gap);
			ClozeStuff += Gap;	

//Create and add the clue button
			if (I[i][2].length > 0){
				Btn = ReplaceStuff('[strItemNum]', i + '', ClueButton);
				ClozeStuff += Btn;
			}
		}
	}

//Add the last bit
	if (Text.length > I.length){
		ClozeStuff += Text[Text.length-1];
	}

//Put the final pieces together
	OutString = ClozeOpener + ClozeStuff + ClozeCloser + Buttons;
	BuiltCloze = OutString;
}

function WriteFeedback(Feedback) {
//Build the output string
	var OutString = '';
	OutString += '<html>';
	OutString += '<body  background="" bgcolor="#ffffff" text="#000000" link="#3b3b3b" vlink="#808080">';
	OutString += '<center><table border="0" cellpadding="5" cellspacing="1" width="85%">';
	OutString += NavBar;
	if (Feedback.length>0){
		OutString += '<tr><td bgcolor="#ffffff" align="center">'; 
		OutString += '<font face="Geneva,Arial" size="-1" color="#000000">';
		OutString += Feedback;
		OutString += '</font></td></tr>'
	}
	OutString += '</table></center></body></html>';

	if (is.CRAPBrowser){OutString=ResolveAllURLs(OutString);}

//Write it to the frame
	TopFrame.document.clear();
	TopFrame.document.open();
	TopFrame.document.write(OutString);
	TopFrame.document.close();
}

function DisplayExercise(){
//Build the output string
	var OutString = '';
	OutString += '<html>';
	OutString += '<body  background="" bgcolor="#ffffff" text="#000000" link="#3b3b3b" vlink="#808080">';
	OutString += '<center><table border="0" cellpadding="5" cellspacing="1" width="85%">';
	OutString += TitleCode; 
	OutString += '<tr><td bgcolor="#ffffff" align="center">'; 
	if (WordBox.length > 0){
		OutString += WordBox;
	}
	OutString += '<font face="Geneva,Arial" size="-1">';
	OutString += BuiltCloze;
	OutString += '</font></td></tr>';
	OutString += NavBar;
	OutString += '</table></center></body></html>';

	if (is.CRAPBrowser){OutString=ResolveAllURLs(OutString);}

//Write it to the frame
	BottomFrame.document.clear();
	BottomFrame.document.open();
	BottomFrame.document.write(OutString);
	BottomFrame.document.close();
}

function ShowClue(ItemNum){
//alert(ItemNum);
	State[ItemNum][0] = 1;
	WriteFeedback(I[ItemNum][2]);
}

function SaveCurrentAnswers(){
	for (var i=0; i<I.length; i++){
		State[i][5] = GetGapValue(i);
	}
}

function RestoreCurrentAnswers(){
	for (var i=0; i<I.length; i++){
		SetGapValue(i, State[i][5]);
	}
}

var CurrentWord = 0;

function ReplaceStuff(Token, Replacement, InString){
	var i = InString.indexOf(Token);
	var FirstBit = '';
	var LastBit = '';
	while (i>-1){
		FirstBit = InString.substring(0, i);
		LastBit = InString.substring(i + Token.length, InString.length);	
		InString = FirstBit + Replacement + LastBit;
		i = InString.indexOf(Token);
	}
	return InString;
}

I = new Array();

I[0] = new Array();
I[0][1] = new Array();
I[0][1][0] = new Array();
I[0][1][0][0]='haven\'t lived';
I[0][1][1] = new Array();
I[0][1][1][0]='have not lived';
I[0][1][2] = new Array();
I[0][1][2][0]='haven\'t lived';
I[0][2]='';

I[1] = new Array();
I[1][1] = new Array();
I[1][1][0] = new Array();
I[1][1][0][0]='didn\'t start';
I[1][1][1] = new Array();
I[1][1][1][0]='didn\'t start';
I[1][1][2] = new Array();
I[1][1][2][0]='did not start';
I[1][1][3] = new Array();
I[1][1][3][0]='didnot start';
I[1][2]='';

I[2] = new Array();
I[2][1] = new Array();
I[2][1][0] = new Array();
I[2][1][0][0]='shouldn\'t learn';
I[2][1][1] = new Array();
I[2][1][1][0]='shouldn\'t learn';
I[2][1][2] = new Array();
I[2][1][2][0]='shouldnot learn';
I[2][1][3] = new Array();
I[2][1][3][0]='should not learn';
I[2][2]='';

I[3] = new Array();
I[3][1] = new Array();
I[3][1][0] = new Array();
I[3][1][0][0]='didn\'t know';
I[3][1][1] = new Array();
I[3][1][1][0]='didn\'t know';
I[3][1][2] = new Array();
I[3][1][2][0]='did not know';
I[3][1][3] = new Array();
I[3][1][3][0]='didnot know';
I[3][2]='';

I[4] = new Array();
I[4][1] = new Array();
I[4][1][0] = new Array();
I[4][1][0][0]='didn\'t have';
I[4][1][1] = new Array();
I[4][1][1][0]='didn\'t have';
I[4][1][2] = new Array();
I[4][1][2][0]='didnot have';
I[4][1][3] = new Array();
I[4][1][3][0]='did not have';
I[4][2]='';

I[5] = new Array();
I[5][1] = new Array();
I[5][1][0] = new Array();
I[5][1][0][0]='won\'t help';
I[5][1][1] = new Array();
I[5][1][1][0]='won\'t help';
I[5][1][2] = new Array();
I[5][1][2][0]='will not help';
I[5][2]='';

I[6] = new Array();
I[6][1] = new Array();
I[6][1][0] = new Array();
I[6][1][0][0]='didn\'t develop';
I[6][1][1] = new Array();
I[6][1][1][0]='didn\'t develop';
I[6][1][2] = new Array();
I[6][1][2][0]='did not develop';
I[6][1][3] = new Array();
I[6][1][3][0]='didnot develop';
I[6][2]='';

I[7] = new Array();
I[7][1] = new Array();
I[7][1][0] = new Array();
I[7][1][0][0]='hasn\'t been swimming';
I[7][1][1] = new Array();
I[7][1][1][0]='hasn\'t been swimming';
I[7][1][2] = new Array();
I[7][1][2][0]='has not been swimming';
I[7][1][3] = new Array();
I[7][1][3][0]='\'s not been swimming';
I[7][2]='';

I[8] = new Array();
I[8][1] = new Array();
I[8][1][0] = new Array();
I[8][1][0][0]='didn\'t reveal';
I[8][1][1] = new Array();
I[8][1][1][0]='didn\'t reveal';
I[8][1][2] = new Array();
I[8][1][2][0]='did not reveal';
I[8][1][3] = new Array();
I[8][1][3][0]='didnot reveal';
I[8][2]='';

I[9] = new Array();
I[9][1] = new Array();
I[9][1][0] = new Array();
I[9][1][0][0]='\'m not caught';
I[9][1][1] = new Array();
I[9][1][1][0]='\'m not caught';
I[9][1][2] = new Array();
I[9][1][2][0]='am not caught';
I[9][1][3] = new Array();
I[9][1][3][0]='amnot caught';
I[9][2]='';

I[10] = new Array();
I[10][1] = new Array();
I[10][1][0] = new Array();
I[10][1][0][0]='doesn\'t love';
I[10][1][1] = new Array();
I[10][1][1][0]='doesn\'t love';
I[10][1][2] = new Array();
I[10][1][2][0]='does not love';
I[10][1][3] = new Array();
I[10][1][3][0]='doesnot love';
I[10][2]='';

I[11] = new Array();
I[11][1] = new Array();
I[11][1][0] = new Array();
I[11][1][0][0]='haven\'t been feeling';
I[11][1][1] = new Array();
I[11][1][1][0]='haven\'t been feeling';
I[11][1][2] = new Array();
I[11][1][2][0]='have not been feeling';
I[11][1][3] = new Array();
I[11][1][3][0]='\'ve not been feeling';
I[11][2]='';

I[12] = new Array();
I[12][1] = new Array();
I[12][1][0] = new Array();
I[12][1][0][0]='didn\'t use to drink';
I[12][1][1] = new Array();
I[12][1][1][0]='didn\'t use to drink';
I[12][1][2] = new Array();
I[12][1][2][0]='didnot use to drink';
I[12][1][3] = new Array();
I[12][1][3][0]='did not use to drink';
I[12][2]='';

I[13] = new Array();
I[13][1] = new Array();
I[13][1][0] = new Array();
I[13][1][0][0]='weren\'t married';
I[13][1][1] = new Array();
I[13][1][1][0]='weren\'t married';
I[13][1][2] = new Array();
I[13][1][2][0]='were not married';
I[13][2]='';

I[14] = new Array();
I[14][1] = new Array();
I[14][1][0] = new Array();
I[14][1][0][0]='wasn\'t called';
I[14][1][1] = new Array();
I[14][1][1][0]='wasn\'t called';
I[14][1][2] = new Array();
I[14][1][2][0]='wasnot called';
I[14][1][3] = new Array();
I[14][1][3][0]='was not called';
I[14][2]='';


Text = new Array();
Text[0]='<b>Make the next sentences negative.</b><br /><br />1.  My parents ';
Text[1]=' (have lived) in Bath for ages.<br />2.  I ';
Text[2]=' (started) smoking as a kid.<br />3.  People ';
Text[3]=' (should learn) from Beckham instead of talking him down.<br />4.  She ';
Text[4]=' (knew) him from High School.<br />5.  I ';
Text[5]=' (had) the opportunity to visit Disneyland last year.<br />6.  I ';
Text[6]=' (\'ll help) you.<br />7.  Flemish scientists ';
Text[7]=' (developed) a medicine to cure malaria last year.<br />8.  Cameron Diaz is in the swimming pool. She ';
Text[8]=' (has been swimming) the whole day. <br />9.  The journalist ';
Text[9]=' (revealed) the truth about the Clinton family.<br />10. I';
Text[10]=' (\'m caught) up in a whirlwind of success.<br />11. Garfield ';
Text[11]=' (loves) Mondays.<br />12. I ';
Text[12]=' (\'ve been feeling) really exhausted lately.<br />13. Ozzy Osbourne ';
Text[13]=' (used to drink) on a regular basis.<br />14. They ';
Text[14]=' (were married) for two years.<br />15. Rio Ferdinand ';
Text[15]=' (was called) Bart Simpson at school.<br />';


State = new Array();

function StartUp(){

	var i = 0;



	State.length = 0;
	for (i=0; i<I.length; i++){
		State[i] = new Array();
		State[i][0] = 0; // clue asked for or not
		State[i][1] = 0; // hints asked for, or penalties for checking a wrong answer
		State[i][2] = 0; // length of answer matched
		State[i][3] = 0; // score for this item
		State[i][4] = 0; // already answered correctly 
		State[i][5] = ''; // answer entered in text box (right or not)
	}
	BuildExercise();
	WriteFeedback(Instructions);
	DisplayExercise();





}

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 CheckAnswers(){

	SaveCurrentAnswers();
	var AllCorrect = 1;

//Check each answer
	for (var i = 0; i< I.length; i++){

		if (State[i][4] != 1){
//If it's right, calculate its score
			if (CheckAnswer(i, true) > -1){
				var TotalChars = GetGapValue(i).length;
				State[i][3] = (TotalChars-State[i][1])/TotalChars;
				if (State[i][0] > 0){State[i][3] = State[i][3]/2;}
				if (State[i][3]<0){State[i][3] = 0;}
				State[i][4] = 1;
			}
			else{
//Otherwise, add zero to the array and increment the hints for this item, as a penalty
				State[i][1]++;
				State[i][3] = 0;

//then set the flag
				AllCorrect = 0;
			}
		}
	}

//Calculate the total score
	var TotalScore = 0;
	for (i=0; i<State.length; i++){
		TotalScore += State[i][3];
	}
	TotalScore = Math.floor((TotalScore * 100)/I.length);

//Compile the output
	Output = '';

	if (AllCorrect == 1){
		Output = Correct + '<br />';
	}

	Output += YourScoreIs + ' ' + TotalScore + '%.<br />';
	if (AllCorrect == 0){
		Output += '<br />' + Incorrect;
	}
	BuildExercise();
	WriteFeedback(Output);



	DisplayExercise();
	RestoreCurrentAnswers();
}


function TrackFocus(BoxNumber){
	CurrentWord = BoxNumber;
}

function CheckBeginning(Guess, Answer){
	var OutString = '';
	var i = 0;
	var UpperGuess = '';
	var UpperAnswer = '';

	if (CaseSensitive == false) {
		UpperGuess = Guess.toUpperCase();
		UpperAnswer = Answer.toUpperCase();
	}
	else {
		UpperGuess = Guess;
		UpperAnswer = Answer;
	}

	while (UpperGuess.charAt(i) == UpperAnswer.charAt(i)) {
		OutString += Guess.charAt(i);
		i++;
	}
	OutString += Answer.charAt(i);
	return OutString;
}

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;
}

function GetGapValue(GNum){
	var RetVal = '';
	if ((GNum<0)||(GNum>=I.length)){return RetVal;}
	if (eval('BottomFrame.document.Cloze.Gap' + GNum) != null){
		RetVal = eval('BottomFrame.document.Cloze.Gap' + GNum).value;
		RetVal = TrimString(RetVal);
	}
	else{
		RetVal = State[GNum][5];
	}
	return RetVal;
}

function SetGapValue(GNum, Val){
	if ((GNum<0)||(GNum>=I.length)){return;}
	if (eval('BottomFrame.document.Cloze.Gap' + GNum) != null){
		eval('BottomFrame.document.Cloze.Gap' + GNum).value = Val;
	}
}

function FindCurrent() {
	var x = 0;
	FoundCurrent = -1;

//Test the current word:
//If it's state is not set to already correct, check the word.
	if (State[CurrentWord][4] != 1){
		if (CheckAnswer(CurrentWord, false) < 0){
			return CurrentWord;
		}
	}
	
	x=CurrentWord + 1;
	while (x<I.length){
		if (State[x][4] != 1){
			if (CheckAnswer(x, false) < 0){
				return x;
			}
		}
	x++;	
	}

	x = 0;
	while (x<CurrentWord){
		if (State[x][4] != 1){
			if (CheckAnswer(x, false) < 0){
				return x;
			}
		}
	x++;	
	}
	return FoundCurrent;
}

function CheckAnswer(GapNum, MarkAnswer){
	var Guess = GetGapValue(GapNum);
	var UpperGuess = '';
	var UpperAnswer = '';
	if (CaseSensitive == false){
		UpperGuess = Guess.toUpperCase();
	}
	else{
		UpperGuess = Guess;
	}
	var Match = -1;
	for (var i = 0; i<I[GapNum][1].length; i++){
		if (CaseSensitive == false){
			UpperAnswer = I[GapNum][1][i][0].toUpperCase();
		}
		else{
			UpperAnswer = I[GapNum][1][i][0];
		}
		if (TrimString(UpperGuess) == UpperAnswer){
			Match = i;
			if (MarkAnswer == true){
				State[GapNum][4] = 1;
			}
			State[GapNum][5] = Guess;
		}
	}
	return Match;
}

function GetHint(GapNum){
	Guess = GetGapValue(GapNum);

	if (CheckAnswer(GapNum, false) > -1){return ''}
	RightBits = new Array();
	for (var i=0; i<I[GapNum][1].length; i++){
		RightBits[i] = CheckBeginning(Guess, I[GapNum][1][i][0]);
	}
	var RightOne = FindLongest(RightBits);
	var Result = I[GapNum][1][RightOne][0].substring(0,RightBits[RightOne].length);
//Add another char if the last one is a space
	if (Result.charAt(Result.length-1) == ' '){
		Result = I[GapNum][1][RightOne][0].substring(0,RightBits[RightOne].length+1);
	}
	return Result;
}

function ShowHint(){
	var CurrGap = FindCurrent();
	if (CurrGap < 0){return;}

	var HintString = GetHint(CurrGap);

	if (HintString.length > 0){
		SetGapValue(CurrGap, HintString);
		State[CurrGap][1] = State[CurrGap][1] + 1;
	}
	WriteFeedback(GiveHint);
}




function Blank(){
	return '<html><body>&copy;Half-Baked Software. Loading...</body></html>';
}

//-->

//]]>


