//keyoard
//key
ikeyup  = new Image();
ikeyhit = new Image();
ikeyerr = new Image();
ikeydn  = new Image();
ikeyup.src  = "../../_share/_keyboard/keyup.gif";
ikeyhit.src = "../../_share/_keyboard/keyhite.gif";
ikeyerr.src = "../../_share/_keyboard/keyerr.gif";
ikeydn.src  = "../../_share/_keyboard/keydown.gif";
//key f,j
ifjup   = new Image();
ifjhit  = new Image();
ifjerr  = new Image();
ifjdn   = new Image();
ifjup.src   = "../../_share/_keyboard/fup.gif";
ifjhit.src  = "../../_share/_keyboard/fthit.gif";
ifjerr.src  = "../../_share/_keyboard/ffault.gif";
ifjdn.src   = "../../_share/_keyboard/fdown.gif";
//key space-bar
ispup   = new Image();
isphit  = new Image();
ispdn   = new Image();
ispup.src   = "../../_share/_keyboard/spaceup.gif";
isphit.src  = "../../_share/_keyboard/spacehit.gif";
ispdn.src   = "../../_share/_keyboard/spacedown.gif";
//key shift-bar
ishup   = new Image();
ishhit  = new Image();
ishdn   = new Image();
ishup.src   = "../../_share/_keyboard/shiftleftup.gif";
ishhit.src  = "../../_share/_keyboard/shiftlefthite.gif";
ishdn.src   = "../../_share/_keyboard/shiftleftdown.gif";


//drill
var drillID    = 0;
var UnitNum    = 1;
var DrillNum   = 1;
var UnitTot    = 1;
var DrillTot   = 1;

//word of text
var word       = "";
var wordnum    = 0;
var wordTot    = 0;
var typeWord   = "";
var typeKeyNum = 0;

//letter
var letter     = "";
var letNum     = 0;
var letTot     = 0;

//key
var keyid      = "";
var keyshiftid = "";
var keyerrid   = "";
var exText     = "";

//time clock
var interval      =250; /*ms*/
var timeid, drilltimeid=0, msgtimeid=0;
var begintime=0, endtime=0;
var minute  = 0;
var second  = 0;

//correct word
var tickCount = 0;
var bLoad = false;

function initial()
{
	window.focus();
	
	//set keyboard position
	setkeyboard(54,226);
	document.all.item("keyboard").style.visibility = "visible";
	unit_listbox.disabled = false;
	drill_listbox.disabled = false;
	
	drillID     = 1;
	timeid      = 0;
	drilltimeid = 0;
	updatedrill();
}

//get the train text from window.frame(0).document.all.traintext
function showtext()
{
	//show training text
	var text       = exText+" ";
	var head       = "<span id=word";
	var home       = "</span> ";
	var result     = "";
	var pos        = 0;
	var tempWord   = "";
	
	typeKeyNum = 0;	
	wordnum  = 0;
	wordTot  = 0;
	letnum   = 0;
	typeword = "";
	keyerrid = "";
	while((pos = text.search(" "))!=-1)	
	{
		tempWord  = text.substr(0,pos);
		result   += head+wordTot+">" + tempWord+home;
		text      = text.substr(pos+1);
		wordTot ++;
	}
	document.all.traintext.innerHTML = result;
}

function hiteword()
{
    var wordid = "word"+wordnum;
    document.all.item(wordid).style.color = "blue";
	
	//initial letter object of a word
	var wordspan = eval("word"+wordnum);

	letter = wordspan.innerText.substr(0,1);
}

function hitekey(letter, bShow)
{
	//alphabet and digit
	var lowerkeys = "asdfghjklqwertyuiopzxcvbnm1234567890";
	var upperkeys = "ASDFGHJKLQWERTYUIOPZXCVBNM!@#$%^&*()";
	var shiftkeys = "rrrrrllllrrrrrlllllrrrrrllrrrrrlllll";
	//sign
	var lowersign = ";',./-=`\\";
	var uppersign = ":\"<>?_+~|";
	var shiftsign = "lllllllrl";
	var namesign  = "sequcopedimieqwasl";
	
	var index;
	
	if ( (index = findchr(lowerkeys, letter)) != -1 )
	{
		keyid                        = "key_"+lowerkeys.substr(index,1);
		if (letter=='f' || letter=='j')
			document.all.item(keyid).src = bShow?ifjhit.src:ifjup.src;
		else
			document.all.item(keyid).src = bShow?ikeyhit.src:ikeyup.src;
	}
	else if ( (index = findchr(upperkeys, letter)) != -1 )
	{
		keyid                             = "key_"+lowerkeys.substr(index,1);
		keyshiftid                        = "key_s"+shiftkeys.substr(index,1);
		if (letter=='F' || letter=='J')
			document.all.item(keyid).src = bShow?ifjhit.src:ifjup.src;
		else
			document.all.item(keyid).src      = bShow?ikeyhit.src:ikeyup.src;
		document.all.item(keyshiftid).src = bShow?ishhit.src:ishup.src;
	}
	else if ( (index = findchr(lowersign, letter)) != -1 )
	{
		keyid                        = "key_"+namesign.substr(2*index,2);
		document.all.item(keyid).src = bShow?ikeyhit.src:ikeyup.src;
	}
	else if ( (index = findchr(uppersign, letter)) != -1 )
	{
		keyid                             = "key_"+namesign.substr(2*index,2);
		keyshiftid                        = "key_s"+shiftsign.substr(index,1);
		document.all.item(keyid).src      = bShow?ikeyhit.src:ikeyup.src;
		document.all.item(keyshiftid).src = bShow?ishhit.src:ishup.src;
	}
	else if ( letter==' ' )
	{
		document.all.item("key_sp").src = bShow?isphit.src:ispup.src;
	}
}

function findchr(str, chr)
{
	for ( var i = 0; i < str.length; i++ )
	{
		if ( str.charAt(i) == chr )
			return i;
	}
	return -1;
}

function hitefinger(letter, display)
{
	document.all.item("key_spot").style.display = "none";

	var charset  = "1qaz!QAZ2wsx@WSX3edc#EDC4rfv$RFV5tgb%TGB6yhn^YHN7ujm&UJM8ik,*IK<9ol.(OL>0p;/)P:?";
	var charset1 = "`~-['_{\"=]+}\\|"
	var index;
	
	//var rgexp = new RegExp(letter);
	//index = charset.search(rgexp);
	
	index = findchr(charset,letter);
	
	switch(Math.floor(index/8))
	{
		case 0:
			document.all.item("key_spot").style.pixelLeft = 120;
			document.all.item("key_spot").style.pixelTop  = 90;
			break;
		case 1:
			document.all.item("key_spot").style.pixelLeft = 145;
			document.all.item("key_spot").style.pixelTop  = 60;
			break;
		case 2:
			document.all.item("key_spot").style.pixelLeft = 180;
			document.all.item("key_spot").style.pixelTop  = 40;
			break;
		case 3:
		case 4:
			document.all.item("key_spot").style.pixelLeft = 220;
			document.all.item("key_spot").style.pixelTop  = 40;
			break;
		case 5:
		case 6:
			document.all.item("key_spot").style.pixelLeft = 365;
			document.all.item("key_spot").style.pixelTop  = 40;
			break;
		case 7:
			document.all.item("key_spot").style.pixelLeft = 405;
			document.all.item("key_spot").style.pixelTop  = 40;
			break;
		case 8:
			document.all.item("key_spot").style.pixelLeft = 440;
			document.all.item("key_spot").style.pixelTop  = 55;
			break;
		case 9:
			document.all.item("key_spot").style.pixelLeft = 460;
			document.all.item("key_spot").style.pixelTop  = 90;
			break;
		default:
		case ' ':
			if ( letter == ' ' )
			{
				if ( second%2 == 1 )
				{
					document.all.item("key_spot").style.pixelLeft = 250;
					document.all.item("key_spot").style.pixelTop  = 70;
				}
				else
				{
					document.all.item("key_spot").style.pixelLeft = 335;
					document.all.item("key_spot").style.pixelTop  = 75;
				}
			}
			else if ( letter == '`' || letter == '~' )
			{
				document.all.item("key_spot").style.pixelLeft = 120;
				document.all.item("key_spot").style.pixelTop  = 90;
			}
			else
			{
				document.all.item("key_spot").style.pixelLeft = 460;
				document.all.item("key_spot").style.pixelTop  = 90;
			}
			break;
	}
	//delete rgexp;
	document.all.item("key_spot").style.display = display;
}

function keypress()
{
	if(!bLoad) return;
	//keyboard not ready
	if ( document.all.item("keyboard").style.visibility == "hidden" ||
	     document.all.traintext.innerText == "loading..." )
		return;

	var keycode  = event.keyCode;

	if ( wordnum >= wordTot )
	{
		stoptimer();
		hitekey(letter,false);
		return;
	}

	var wordspan = eval("word"+wordnum);
	var typeletter = toChar(keycode);
	
	//if not start the timer, then start it. 
	if ( timeid == 0 )
	{
		initstat();
		starttimer();
	}
	
	typeKeyNum ++;
	
	switch(keycode)
	{
		//go to next word
		case 32: //space
			hitekey(letter, false);
			if ( typeword == wordspan.innerText )
			{
			    wordspan.style.color = "green";
				tickCount ++;   /*correctness counter*/
			}
			else
			    wordspan.style.color = "red";
			wordnum ++;
			letnum = 0;
			typeword = "";
			if ( wordnum >= wordTot ) //next drill
			{
				stoptimer();
				hitekey(letter,false);
				hitefinger(letter, "none");
				endmsg();
			}
			else //next word
			{
				hiteword();
				hitekey(letter, true);
				hitefinger(letter, "block");
			}
			break;	
		case 8:  //back space
			keyerrid = "";
			if (letnum>0)
			{
				letnum --;
				typeword = typeword.left(typeword.length-1);
			}
			break;
		default:
		{
			typeword += typeletter;
			if ( typeletter == letter )
			{
				keyerrid = "";
				//set key hite-status
				hitekey(letter,false);
				if ( letnum == wordspan.innerText.length-1 )
				{
					letter = " ";
					hitekey(letter,true);
					hitefinger(" ", "block");
				}
				else
				{
					letnum ++;
					letter = wordspan.innerText.substr(letnum,1);
					hitekey(letter,true);
					hitefinger(letter, "block");
				}
			}
		}
		    break;
	}
	
	return;		
}

//letter to keyboard
var kletnam = new Array("","","","","","","","","ba","ta","","","","en","","","","","","","","","","","","","","","","","","",
                       "sp","or","qu","3","4","5","7","qu","9","0","8","eq","co","mi","pe","di",
                       "0","1","2","3","4","5","6","7","8","9",
                       "se","se","co","eq","pe","di","2",
                       "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
                       "bl","or","br","6","mi","wa", 
                       "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
                       "bl","or","br","wa");
//key down to keyboard
var kdwnnam = new Array("","","","","","","","","ba","ta","","","","en","","","sl","cl","al","","ca","","","","","","","","","","","",
                       "sp","","","","","","","","","","","","","","","",
                       "0","1","2","3","4","5","6","7","8","9",
                       "","","","","","","",
                       "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
                       "wl","","wr","","","", 
                       "","","","","","","","","","","","","","","","","","","","","","","","","","",
                       "","","","","",
                       "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",
                       "","","","","","","","","","","","","","","","","","","","","","","","","","","se","eq","co","mi","pe","di",
                       "wa","","","","","","","","","","","","","","","","","","","","","","","","","","","bl","or","br","qu","",
                       "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""
                       );
                       
function keydown()
{
	if(!bLoad) return;
	hidemsg()
	window.focus();
	
	var keyVal = event.keyCode;
	if( kletnam[toAsc(letter)] != kdwnnam[keyVal] )
	{
		if ( keyVal == 70 || keyVal == 74 )
			document.all.item("key_"+kdwnnam[keyVal]).src = ifjerr.src;
		else if( keyVal>=48  && keyVal<=57  ||
	     	     keyVal>=65  && keyVal<=90  ||
		         keyVal>=186 && keyVal<=191 ||
		         keyVal>=219 && keyVal<=222 )
			document.all.item("key_"+kdwnnam[keyVal]).src = ikeyerr.src;
	}
	return true;
}

function keyup()
{
	if(!bLoad) return;
	var keyVal = event.keyCode;
	if( kletnam[toAsc(letter)] != kdwnnam[keyVal] )
	{
		if ( keyVal == 70 || keyVal == 74 )
			document.all.item("key_"+kdwnnam[keyVal]).src = ifjup.src;
		else if( keyVal>=48  && keyVal<=57  ||
	     	     keyVal>=65  && keyVal<=90  ||
		         keyVal>=186 && keyVal<=191 ||
		         keyVal>=219 && keyVal<=222 )
			document.all.item("key_"+kdwnnam[keyVal]).src = ikeyup.src;
	}
	return true;
}

function initstat()
{
	minute  = 0;
	second  = 0;
	tickCount = 0;
	document.all.time.innerText     = "00:00";
	document.all.speed.innerText    = "000.00";
	document.all.accuracy.innerText = "100.00";
}

function starttimer()
{
	timeid = window.setInterval("elapsedtime()", interval, "Javascript");
	begintime = new Date();
}

function stoptimer()
{
	if ( timeid != 0 )
	{
		elapsedtime();
		window.clearInterval(timeid);
		timeid = 0;
	}
}

function elapsedtime()
{
	endtime = new Date();
	var usedtime = endtime.getTime() - begintime.getTime();
	second = Math.floor(usedtime/1000%60);
	minute = Math.floor(usedtime/60000%100);

	var time = "";
	if(minute<10)
		time += "0"+minute;
	else 
	    time += "" +minute;
	if(second<10)
		time += ":0"+second;
	else 
	    time += ":" +second;
	document.all.time.innerText = time;
	
	//speed
	var speedtxt = "";
	var speed = 0;
	if ((minute != 0 || second != 0) && typeKeyNum!=0)
		speed = Math.floor(60*/*wordnum*/typeKeyNum/(minute*60+second)*100)/100;
	if ( speed < 10 )
		speedtxt += "00"+speed;
	else if ( speed < 100 )
		speedtxt +=  "0"+speed;
	else
		speedtxt +=   ""+speed;
	if ( speed == Math.floor(speed) )
		speedtxt += '.00';
	else if ( speed*10 == Math.floor(speed*10) )
		speedtxt += '0';
	document.all.speed.innerText = speedtxt;
	
	//accuracy
	var accuracytxt = "";
	var accuracy = 0;
	if ( wordnum != 0 )
		accuracy = Math.floor(100*tickCount/wordnum*100)/100;
	if ( accuracy < 10 )
		accuracytxt += ' '+accuracy;
	else
		accuracytxt +=  ''+accuracy;
	if ( accuracy == Math.floor(accuracy) )
		accuracytxt += '.00';
	else if ( accuracy*10 == Math.floor(accuracy*10) )
		accuracytxt += '0';
		
	document.all.accuracy.innerText = accuracytxt;
}

function listbox_onchange()
{
	updatedrill();
}

function updatedrill()
{
	hitekey(letter,false);
	//clear timer
	stoptimer();
	initstat();

	//get new drill from database
	var drillID    = unit_listbox.selectedIndex*3 + drill_listbox.selectedIndex + 1;
	var str;
	str  = "../../_share/_asp/traindata.asp?";
	str += "drillID="+drillID;
	window.traindata.document.location = str;
	
	//set the timer to check the data loading is ready or not with interval 0f 100ms
	//alert(str);
	if( drilltimeid == 0 )
	{
		document.all.traintext.innerText = "loading..."
		drilltimeid = window.setInterval("newdrill()",100,"Javascript");
	}
}

function newdrill()
{
	var drill = window.traindata.drilltext;
	if( drill != null && typeof(drill) == "object" && drill.innerText != "" )
	{
                
		exText = drill.innerText;
		drill.innerText = "";
		
		//close the timer
		if(drilltimeid != 0)
		{
			window.clearInterval(drilltimeid);
			drilltimeid = 0;
		}
		//show
		showtext();
		hiteword();
		hitekey(letter,true);
		hitefinger(letter, "block");
		bLoad = true;
	}
}

function endmsg()
{
	document.all.item("endmsg").style.display = "block";
	if(msgtimeid==0)
		msgtimeid = window.setTimeout("hidemsg()",5000,"Javascript");
}

function hidemsg()
{
	if ( msgtimeid != 0 )
	{
		document.all.item("endmsg").style.display = "none";
		window.clearTimeout(msgtimeid);
		msgtimeid = 0;
		if( confirm("Do it again?") == true )
		{
			updatedrill();
		}
	}
}

function setkeyboard(x,y)
{
	var coll = document.all;
	for (var i = coll.item("key_wa").sourceIndex;  i <= coll.item("let_cr").sourceIndex; i++)
	{
		 coll.item(i).style.pixelLeft  += x;
		 coll.item(i).style.pixelTop   += y;
	}
}
