//Copywrite 1999, Kent E. Gunnison
var onceonly = 0;
var percent = 0;
var min = 0;
var sec = 0;
var fixedArr = 0;
var answer = "";
var charAssigned = new Array(350);
var charTyped = new Array(350);
var clicker = -1;
var restart = 0;
var dur = 0;
var durlength = Math.tan(1.5*Math.PI);	//Infinity
var x = 0;
var stp = 0;
var err = 0;
var speed = 0;
var cnt = 0;
var tottime = 0;
var lastvalue = "";
var lastname = "";
var sett = 10;
var good = "Wow! -- Great! -- Keep it up!";
var waiting = 333;
var ax = "";
var fixq = 0;
var qfixed = "  /  "
var fixquote = 0;
var quotefixed = "  '  ";
var fixcolon = 0;
var colonfixed = "  ;  ";
var fixexclaim = 0;
var exclaimfixed = " 1 ";
var fixampersand = 0;
var ampersandfixed = " 7 ";
var timerID = null;
var timerRunning = false;
var countme = 0;
var xx = "";
var y = "";
var oldvalue = ""
var q = 0;
var t = 0;
var akey = "";
var winner = 0;
var one = new Keys ("A", "S", "D", "F", "G", "H", "J", "K", "L", "Enter", "Space", "Semi");
var two = new Keys ("E", "N", "U", "T", ".");
var three = new Keys ("A", "S", "D", "F", "G", "H", "J", "K", "L", "Enter", "Space", "I", "E", "N", "H", "T", ".");
var four = new Keys ("R", "C", "O", "I");
var five = new Keys ("W", ",", "B", "P");
var six = new Keys ("Ampersand", "Question", "X", "V");
var seven = new Keys ("Q", "M", "Colon", "Apostrophe");
var eight = new Keys ("Z", "Y", "Quote", "Exclaim");
var nine = new Keys ("A", "S", "D", "F", "G", "H", "J", "K", "L", "Enter", "Space", "I", "E", "N", "H", "T", ".", "R", "C", "O", "I", "W", ",", "B", "P", "Ampersand", "Question", "X", "V", "Q", "M", "Colon", "Apostrophe", "Z", "Y", "Quote", "Exclaim");
var ten = new Keys ("one1", "eight8", "five5", "Zero0");
var eleven = new Keys ("A", "S", "D", "F", "G", "H", "J", "K", "L", "Enter", "Space", "I", "E", "N", "H", "T", ".", "R", "C", "O", "Semi", "W", ",", "B", "P", "Colon", "G", "Question", "X", "V", "Q", "M", "V", "Apostrophe", "Z", "Y", "Quote", "Exclaim", "one1", "eight8", "five5", "Zero0", "Ampersand");
var twelve = new Keys ("two2", "seven7", "four4", "nine9", "=");
var thirteen = new Keys ("three3", "six6", "-", "Slash");
var fourteen = new Keys ("A", "S", "D", "F", "G", "H", "J", "K", "L", "Enter", "Space", "I", "E", "N", "H", "T", ".", "R", "C", "O", "Semi", "W", ",", "B", "P", "Colon", "G", "Question", "X", "V", "Q", "M", "V", "Apostrophe", "Z", "Y", "Quote", "Exclaim", "one1", "eight8", "five5", "Zero0", "two2", "seven7", "four4", "nine9", "three3", "six6", "-", "Slash", "Ampersand");
function NextRandomNumber() {
	var hi = this.seed / this.Q;
	var lo = this.seed % this.Q;
	var test = this.A * lo - this.R * hi;
	if (test > 0)
		this.seed = test;
	else
		this.seed = test + this.M;
	return (this.seed * this.oneOverM);
}
function RandomNumberGenerator() {
	var d = new Date();
	this.seed = 2345678901 +
		(d.getSeconds() * 0xFFFFFF) +
		(d.getMinutes() * 0xFFFF);
	this.A = 48271;
	this.M = 2147483647;
	this.Q = this.M / this.A;
	this.R = this.M % this.A;
	this.oneOverM = 1.0 / this.M;
	this.next = NextRandomNumber;
	return this;
}
var rand = new RandomNumberGenerator();
function stopclock() {
	if(timerRunning) 
		clearTimeout(timerID);
	timerRunning = false;
}
function startclock() {
	stopclock();
	flash();
}
function changer() {
	keeptrack();
	if (fixampersand == 1) {
		fixampersand = 0;
		form1.seven7.value = ampersandfixed;
	}
	if (fixexclaim == 1) {
		fixexclaim = 0;
		form1.one1.value = exclaimfixed;
	}
	if (fixcolon == 1) {
		fixcolon = 0;
		form1.Semi.value = colonfixed;
	}
	if (fixquote == 1) {
		fixquote = 0;
		form1.Apostrophe.value = quotefixed;
	}
	if (fixq == 1) {
		fixq = 0;
		form1.Slash.value = qfixed;
	}
	if (xx) {
	if (form1[xx].value.charAt(2) == "$") {
		form1[xx].value = " " + form1.hideme.value + " ";
	}
	}
	document.bgColor="FBF3D7";
	form1.stoper.value = "--- Break ---"
	winner = 0;
	var r = 0;
	r = form1.lesson.selectedIndex;
	if (r == 1) akey = one;
	if (r == 2) akey = two;
	if (r == 3) akey = three;
	if (r == 4) akey = four;
	if (r == 5) akey = five;
	if (r == 6) akey = six;
	if (r == 7) akey = seven;
	if (r == 8) akey = eight;
	if (r == 9) akey = nine;
	if (r == 10) akey = ten;
	if (r == 11) akey = eleven;
	if (r == 12) akey = twelve;
	if (r == 13) akey = thirteen;
	if (r == 14) akey = fourteen;
	if (r == 15) akey = fifteen;
	if (r == 16) akey = sixteen;
	if (r == 17) akey = seventeen;
	if (r == 18) akey = eighteen;
	form1.hideme.value = akey;
	xx = form1.hideme.value;
		if (xx == y) {
			 changer();
		}
	if (form1[xx].value != form2[xx].value) form1[xx].value = form2[xx].value;
	if (xx == "Ampersand") {
		form1.seven7.value = ' & ';
		fixampersand = 1;
	}
	if (xx == "Exclaim") {
		form1.one1.value = ' ! ';
		fixexclaim = 1;
	}
	if (xx == "Colon") {
		form1.Semi.value = ' : ';
		fixcolon = 1;
	}
	if (xx == "Quote") {
		form1.Apostrophe.value = ' " ';
		fixquote = 1;
	}
	if (xx == "Question") {
		form1.Slash.value = " ? ";
		fixq = 1;
	}
	y = form1[xx].value;
	oldvalue = form1[xx].value;
	form1.hideme.value = "";
	form1.hideme.focus();
	flash();
}
function Keys () {
	var argv = Keys.arguments;
	var argc = argv.length;
	this.list = new Object();
		for (var i = 0; i < argc; i++)
			this.list[i] = argv[i];
			this.count = argc;
			this.toString = Keystring;
	return this;
}
function Keystring() {
	var i = Math.round((this.count - 1) * rand.next ());
	return this.list[i];
}
function blanker() {
	form1[xx].value = lastvalue;
	}
function flash() {
	if (restart == 0) {
	if (durlength <= (tottime / 3)) {
		restart = 1;
		form1.stoper.click();
	}
tottime++;
	if ( form1.hideme.length > 1)  {
		blanker();
	}
	if (fixampersand == 1) {
		t = t - .2;
		dollarsign = "$$";
		if (form1.seven7.value != dollarsign){
			form1.seven7.value = dollarsign;
		} else {
			form1.seven7.value = " & ";
		}
	}
	if (fixexclaim == 1) {
		t = t - .2;
		dollarsign = "$$";
		if (form1.one1.value != dollarsign){
			form1.one1.value = dollarsign;
		} else {
			form1.one1.value = " ! ";
		}
	}
	if (fixcolon == 1) {
		t = t - .2;
		dollarsign = "$$";
		if (form1.Semi.value != dollarsign){
			form1.Semi.value = dollarsign;
		} else {
			form1.Semi.value = " : ";
		}
	}
	if (fixquote == 1) {
		t = t - .2;
		dollarsign = "$$";
		if (form1.Apostrophe.value != dollarsign){
			form1.Apostrophe.value = dollarsign;
		} else {
			form1.Apostrophe.value = ' " ';
		}
	}
	if (fixq == 1) {
		t = t - .2;
		dollarsign = "$$";
		if (form1.Slash.value != dollarsign){
			form1.Slash.value = dollarsign;
		} else {
			form1.Slash.value = " ? ";
		}
	}
	if (form1[xx].value == y) {
			var longer = oldvalue.length / 2;
			var dollarsign = "";
			for (ri = 0; ri <= longer; ri++ ) {
				dollarsign = dollarsign + "$";
			}
		if (xx == "I") dollarsign = "$$";
		form1[xx].value = dollarsign;
	} else {
		form1[xx].value = oldvalue;
	} 
	stopclock();
	timerID = setTimeout("flash()", waiting);
	timerRunning = true;
	form1.text1.value = xx;
	var answer = form1.hideme.value.toUpperCase();
		if (xx == "Ampersand") {
			if (asc(answer) == 38) {
				winner = 1;
				cnt++;
				fixampersand = 1;
				t = 0;
				stopclock();
				timerID=setTimeout("changer()", waiting);
			}
		}
		if (xx == "Exclaim") {
			if (asc(answer) == 33) {
				winner = 1;
				cnt++;
				fixexclaim = 1;
				t = 0;
				stopclock();
				timerID=setTimeout("changer()", waiting);
			}
		}
		if (xx == "Semi") {
			if (asc(answer) == 59) {
				winner = 1;
				cnt++;
				fixcolon = 1;
				t = 0;
				stopclock();
				timerID=setTimeout("changer()", waiting);
			}
		}
		if (xx == "Question") {
			if (asc(answer) == 63) {
				winner = 1;
				cnt++;
				fixq = 1;
				t = 0;
				stopclock();
				timerID=setTimeout("changer()", waiting);
			}
		}
		if (xx == "Colon") {
			if (asc(answer) == 58) {
				winner = 1;
				cnt++;
				fixcolon = 1;
				t = 0;
				stopclock();
				timerID=setTimeout("changer()", waiting);
			}
		}
		if (xx == "Quote") {
			if (asc(answer) == 34) {
				winner = 1;
				cnt++;
				fixquote = 1;
				t = 0;
				stopclock();
				timerID=setTimeout("changer()", waiting);
			}
		}
		if (xx == "Slash") {
			if (asc(answer) == 47) {
				winner = 1;
				cnt++;
				fixq = 1;
				t = 0;
				stopclock();
				timerID=setTimeout("changer()", waiting);
			}
		}
		if (xx == "Apostrophe") {
			if (answer == "'") {
				winner = 1;
				cnt++;
				fixquote = 1;
				t = 0;
				stopclock();
				timerID=setTimeout("changer()", waiting);
			}
		}
		if (asc(answer) == 32) {
			xx = "Space";
			winner = 1;
			cnt++;
			form1[xx].value = "          Space          ";
			stopclock();
			timerID=setTimeout("changer()", waiting);
		}
	if (answer == xx || asc(answer) == chr(form1.hideme.value) || answer ==             form1[xx].name.charAt(form1[xx].name.length - 1)) {
		winner = 1;
		cnt++
		t = 0;
		form1[xx].value = oldvalue;
		form1.stoper.value = good;
		lastvalue = oldvalue;
		stopclock();
		timerID=setTimeout("changer()", waiting);
	}
	t++;
	form1.text5.value = t;
	if (t >= sett) {
		if (winner != 1) {
			document.bgColor="red";
		t = 0;
		form1[xx].value = oldvalue;
		lastvalue = oldvalue;
		err++;
		stopclock();
		timerID=setTimeout("changer()", waiting);
	}
tottime++;
	}
}
}
function keeptrack() {
	clicker++;
	charAssigned[clicker] = form1.text1.value;
	charTyped[clicker] = form1.hideme.value.toUpperCase();
}
function enter() {
	aa = asc(form1.hideme.value);
	if (aa > 125) {
		xx = "Enter";
		Winner = 1;
		cnt++
	form1[xx].value = "Enter";
	stopclock();
	timerID=setTimeout("changer()", waiting);
	}
	form1.stoper.value = good;
}
function asc(achar) {
	var n = 0;
	var csstr = makeCharsetString();
	for (i = 0; i <= csstr.length; i++) {
		if (achar == csstr.substring(i,i+1)) {
		 break;
		}
	}
	return  i + 32
}
function chr(x) {
	var ar = '';
	var astr = makeCharsetString();
	result = ''
	if (x >= 32 || x < 126) {
		x = x - 32;
		ar = astr.charAt(x);
		result = ar;
	}
}
function makeCharsetString() {
	var astr;
	astr=' !"#$%&\'()*+,-./0123456789:;<=>?@'
	astr += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
	astr += '[\]^_`abcdefghijklmnopqrstuvwxyz'
	astr += '{|}~'
	return astr;
}
function pause() {
	keeptrack();
	speed = Math.round( (cnt / 5) / ((tottime / 3) / 260));
	tottime = tottime / 3;
	min = Math.floor(tottime / 60);
	sec = Math.round(tottime % 60);
	if (sec < 10) sec = "0" + sec;
	percent = ((cnt - err) / cnt) * 100; 
	if (cnt > 0) {
	if (confirm("            Your Results\n\nNumber of characters: \t" + cnt + "\nNumber of Errors: \t\t" + err + "\nAccuracy: \t\t" + Math.round(percent) + " %\nElapsed Time: \t\t" + min +  " : " + sec + "\n-----------------------------------------------------\nTest your speed by clicking:\n\n             Speed Test\n-----------------------------------------------------                      \nIf you would like a more complete display\nof your statistics, click [OK].\n\n")) {
keeptrack();
showstats();
}
	form1[xx].value = oldvalue;
	}
	clicker = 0;
	tottime = 0;
	cnt = 0;
	err = 0;
	stopclock()
}
function showstats() {
	statWindow=window.open('','','toolbar=no,location=no,directories=no,status=no,scrollbars =yes,resizable=yes,copyhistory=no,width=400,height=300');
	statWindow.document.write( '<HTML><HEAD><TITLE>Statistics</TITLE></HEAD><BODY text="Arial" bgcolor="FFECA9">' );
	statWindow.document.write( '<font size="6" color="blue" face="Arial"> ' );
	statWindow.document.write( "<center>Statistical Information</font><font face='arial' size='2' color='black'> " );
	statWindow.document.write( '<br><font size="1" color="000000">Please Wait . . .</font><p>')
	statWindow.document.write( "<table border='3'  bgcolor='FFDD99' bordercolorlight='E06050' bordercolordark='8F004A'>" );
	statWindow.document.write( "<tr><th>Keys Assigned</th><th>Keys You Typed</th></tr>" );
		for (j = 1; j <= (clicker - 2); j++) {
	statWindow.document.write( "<tr><td><font color='000000'><center>" + charAssigned[j] + "</td><td><font color='000000'><center>" + charTyped[j] + "</td></tr>" );
		}
	statWindow.document.write( "</table><br><font size='1' color='000000'>The [Enter] key and [Space] bar have no character to display and may appear to be blank entries!</font>" );
	statWindow.document.write( "<P><TABLE border=0><tr><td align=right>Number of characters typed:&nbsp&nbsp</td><td>&nbsp" + cnt + "</td></tr>" );
	statWindow.document.write( "<tr><td align=right>Number of errors:&nbsp&nbsp</td><td>&nbsp" + err + "</td></tr>" );
	statWindow.document.write( "<tr><td align=right>Accuracy:&nbsp&nbsp</td><td>&nbsp" + Math.round(percent) + " %</td></tr>" );
statWindow.document.write( "<tr><td align=right>Elapsed Time:&nbsp&nbsp</td><td>&nbsp" + min +  " : " + sec + "</td></tr>");
	statWindow.document.write( "</table><P><font size='2' color='blue'><U>TO PRINT</u> these results, press [Ctrl]-A, then [Ctrl]-P, then chose <U>Selection</u> from the <I>Print Range</i> list." );
	statWindow.document.write( "<P><INPUT TYPE=button NAME=closeBtn VALUE=Close onClick='window.close()'>" );
	statWindow.document.write( "</body></html>" );
	statWindow.focus();
}
function startbutton() {
	if (xx != "") {
		clicker = -1;
		initiala();
		initialb();
		restart = 0;
		form1[xx].value = form2[xx].value;
		timerID=setTimeout('changer()', 2000);
	}
}
function leveler() {
	jj = form1.level.selectedIndex
	if (jj == 1) sett = 24;
	if (jj == 2) sett = 15;
	if (jj == 3) sett = 9;
}
function loadhelp() {
	window.open('kbhelpfile.htm', 'Note', 'toolbar=no,location=no,directories=no,status=no,scrollbars=yes,resizable=yes,copyhistory=no,width=360,height=400');
}
function initiala() {
	for (j = 0; j <= 350; j++) {
		charAssigned[j] = "";
	}
}
function initialb() {
	for (j = 0; j <= 350; j++) {
		charTyped[j] = "";
	}
}
function startup() {
		initiala();
		initialb();
	x = form1.lesson.selectedIndex;
	homeon();
}
function setduration() {
	dur = form1.duration.selectedIndex;
	if (dur == 0 || dur == 1) durlength = Math.tan(1.5*Math.PI);
	if (dur == 2) durlength = 60;
	if (dur == 3) durlength = 120;
	if (dur == 4) durlength = 180;
	if (dur == 5) durlength = 300;
}
function homeon() {
	if ( onceonly == 0 ) {
		onceonly = 1;
	//	alert("This page requires Microsoft Internet Explorer 4 or higher.\n\nTo get the most from this page, click on 'Help / Readme'");
	}

	timerID=setTimeout('homeon()',1000)
	if (x == form1.lesson.selectedIndex) {
		if (form1.G.value != form2.G.value) {
			form1.G.value = form2.G.value;
			form1.H.value = form2.H.value;
			form1.helper.value = "Help";
	} else {
			form1.G.value = "Home";
			form1.H.value = "  Row  ";
			form1.helper.value = "Read Me";
	}	
	} else {
			form1.G.value = form2.G.value;
			form1.H.value = form2.H.value;
			form1.helper.value = "Help";
}
}
function goodby() {
	if(confirm("If . . . you haven't e-mailed your comments about this page,\nthey would be greatly appreciated at this time."))
	location.href="mailto:mrkent@mrkent.com";
}
//Copywrite 1999, Kent E. Gunnison