

//<![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 blanked out.'; 
var GiveHint = 'The next correct letter has been added to the answer.';
var CaseSensitive = false;
var YourScoreIs = 'Your score is ';
var Instructions = 'Fill in all the gaps, with the comparative of the adjective given.<br />Remember the different rules.<br />Press "Check" to check your answers. <br />Use the "Hint" button to get a free letter if an answer is giving you trouble. <br />Note - you will lose points if you ask for hints!';
var BuiltCloze = '';
var ExerciseSubtitle = 'Comparative exercise';
var ExerciseTitle = 'What\'s the comparative';
var FirstShow = true;
var ReadingURL = '';

var PreviousPage = history.length;







var NavBar='';


NavBar+='<tr><form name="NavButtons1" action=""><td bgcolor="#000033" align="center">';
NavBar+='<font face="Geneva,Arial" size="-1">';


NavBar+='<input type="button" value="Return to the Grammar Page" onclick=\'parent.location="../../grammarpage.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="#006699">' + ExerciseTitle + '</font><br />';
TitleCode += '<font size="-1" face="Geneva,Arial" color="#006699">' + 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="#000033">';

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="#000033">';
Buttons += '<input type="button" value="Check" onclick="parent.CheckAnswers()"></input>';


Buttons += '<input type="button" value="Hint" onclick="parent.ShowHint()"></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="#000033" link="#0000ff" vlink="#0000cc">';
	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="#000033">';
		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="#000033" link="#0000ff" vlink="#0000cc">';
	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]='worse';
I[0][2]='Irregular form.';

I[1] = new Array();
I[1][1] = new Array();
I[1][1][0] = new Array();
I[1][1][0][0]='more beautiful';
I[1][2]='Remember the rule for when the adjective has more than one syllable.';

I[2] = new Array();
I[2][1] = new Array();
I[2][1][0] = new Array();
I[2][1][0][0]='more boring';
I[2][2]='Remember the rule for when the adjective has more than one syllable.';

I[3] = new Array();
I[3][1] = new Array();
I[3][1][0] = new Array();
I[3][1][0][0]='busier';
I[3][2]='Remember the rule when the adjective ends in \'y\'.';

I[4] = new Array();
I[4][1] = new Array();
I[4][1][0] = new Array();
I[4][1][0][0]='cheaper';
I[4][2]='Remember the rule for short adjectives.';

I[5] = new Array();
I[5][1] = new Array();
I[5][1][0] = new Array();
I[5][1][0][0]='cleaner';
I[5][2]='Remember the rule for short adjectives.';

I[6] = new Array();
I[6][1] = new Array();
I[6][1][0] = new Array();
I[6][1][0][0]='more comfortable';
I[6][2]='Remember the rule for when the adjective has more than one syllable.';

I[7] = new Array();
I[7][1] = new Array();
I[7][1][0] = new Array();
I[7][1][0][0]='more crowded';
I[7][2]='Remember the rule for when the adjective has more than one syllable.';

I[8] = new Array();
I[8][1] = new Array();
I[8][1][0] = new Array();
I[8][1][0][0]='more difficult';
I[8][2]='Remember the rule for when the adjective has more than one syllable.';

I[9] = new Array();
I[9][1] = new Array();
I[9][1][0] = new Array();
I[9][1][0][0]='easier';
I[9][2]='Remember the rule when the adjective ends in \'y\'.';

I[10] = new Array();
I[10][1] = new Array();
I[10][1][0] = new Array();
I[10][1][0][0]='more expensive';
I[10][2]='Remember the rule for when the adjective has more than one syllable.';

I[11] = new Array();
I[11][1] = new Array();
I[11][1][0] = new Array();
I[11][1][0][0]='faster';
I[11][2]='Remember the rule for short adjectives.';

I[12] = new Array();
I[12][1] = new Array();
I[12][1][0] = new Array();
I[12][1][0][0]='better';
I[12][2]='Irregular form.';

I[13] = new Array();
I[13][1] = new Array();
I[13][1][0] = new Array();
I[13][1][0][0]='more interesting';
I[13][2]='Remember the rule for when the adjective has more than one syllable.';

I[14] = new Array();
I[14][1] = new Array();
I[14][1][0] = new Array();
I[14][1][0][0]='lovelier';
I[14][2]='Remember the rule when the adjective ends in \'y\'.';

I[15] = new Array();
I[15][1] = new Array();
I[15][1][0] = new Array();
I[15][1][0][0]='nicer';
I[15][2]='Remember the rule for short adjectives.';

I[16] = new Array();
I[16][1] = new Array();
I[16][1][0] = new Array();
I[16][1][0][0]='more polite';
I[16][1][1] = new Array();
I[16][1][1][0]='politer';
I[16][2]='Remember the rule for when the adjective has more than one syllable.';

I[17] = new Array();
I[17][1] = new Array();
I[17][1][0] = new Array();
I[17][1][0][0]='ruder';
I[17][2]='Remember the rule for short adjectives.';

I[18] = new Array();
I[18][1] = new Array();
I[18][1][0] = new Array();
I[18][1][0][0]='uglier';
I[18][2]='Remember the rule when the adjective ends in \'y\'.';


Text = new Array();
Text[0]='<table border="1" cellpadding="2" cellspacing="2" width="100%"><tr><td>Adjective</td><td>Comparative</td></tr><tr><td>bad</td><td>';
Text[1]='</td></tr><tr><td>beautiful</td><td>';
Text[2]='</td></tr><tr><td>boring</td><td>';
Text[3]='</td></tr><tr><td>busy</td><td>';
Text[4]='</td></tr><tr><td>cheap</td><td>';
Text[5]='</td></tr><tr><td>clean</td><td>';
Text[6]='</td></tr><tr><td>comfortable</td><td>';
Text[7]='</td></tr><tr><td>crowded</td><td>';
Text[8]='</td></tr><tr><td>difficult</td><td>';
Text[9]='</td></tr><tr><td>easy</td><td>';
Text[10]='</td></tr><tr><td>expensive</td><td>';
Text[11]='</td></tr><tr><td>fast</td><td>';
Text[12]='</td></tr><tr><td>good</td><td>';
Text[13]='</td></tr><tr><td>interesting</td><td>';
Text[14]='</td></tr><tr><td>lovely</td><td>';
Text[15]='</td></tr><tr><td>nice</td><td>';
Text[16]='</td></tr><tr><td>polite</td><td>';
Text[17]='</td></tr><tr><td>rude</td><td>';
Text[18]='</td></tr><tr><td>ugly</td><td>';
Text[19]='</td></tr></table>';


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>';
}

//-->

//]]>



