var selectedKey = "";
var animatekeys = true;
var ctrlSpaceChangeLang = false;

function PrintKey(keynum, keywidth, keyclass, name)
{
	document.write('<td id="key' + keynum + '" class="' + keyclass + '" colspan="' + keywidth + '"><span style="color:green" id="key' + keynum + 'english"></span><span id="key' + keynum + 'text">'+name+'</span></td>');
}

function PrintKeyboard()
{
	document.write('<table cellspacing="1" ID="Table2">');
	document.write('<tr>');
	PrintKey(1,2,"dbl");
	PrintKey(2,2,"dbl");
	PrintKey(3,2,"dbl");
	PrintKey(4,2,"dbl");
	PrintKey(5,2,"dbl");
	PrintKey(6,2,"dbl");
	PrintKey(7,2,"dbl");
	PrintKey(8,2,"dbl");
	PrintKey(9,2,"dbl");
	PrintKey(10,2,"dbl");
	PrintKey(11,2,"dbl");
	PrintKey(12,2,"dbl");
	PrintKey(13,2,"dbl");
	PrintKey(14,5,"act","");
	document.write('</tr><tr>');
	PrintKey(15,3,"act","");
	PrintKey(16,2,"dbl");
	PrintKey(17,2,"dbl");
	PrintKey(18,2,"dbl");
	PrintKey(19,2,"dbl");
	PrintKey(20,2,"dbl");
	PrintKey(21,2,"dbl");
	PrintKey(22,2,"dbl");
	PrintKey(23,2,"dbl");
	PrintKey(24,2,"dbl");
	PrintKey(25,2,"dbl");
	PrintKey(26,2,"dbl");
	PrintKey(27,2,"dbl");
	/*PrintKey(41,2,"dbl");
	PrintKey(59,2,"dbl","&nbsp;");*/
	PrintKey(41,3,"dbl");
	PrintKey(59,1,"dbl","&nbsp;");
	document.write('</tr><tr>');
	PrintKey(29,4,"act","Caps");
	PrintKey(30,2,"dbl");
	PrintKey(31,2,"dbl");
	PrintKey(32,2,"dbl");
	PrintKey(33,2,"dbl");
	PrintKey(34,2,"dbl");
	PrintKey(35,2,"dbl");
	PrintKey(36,2,"dbl");
	PrintKey(37,2,"dbl");
	PrintKey(38,2,"dbl");
	PrintKey(39,2,"dbl");
	PrintKey(40,2,"dbl");
	PrintKey(28,5,"act","Enter");
	document.write('</tr><tr>');
	PrintKey(42,3,"act","");
	PrintKey(43,2,"dbl");
	PrintKey(44,2,"dbl");
	PrintKey(45,2,"dbl");
	PrintKey(46,2,"dbl");
	PrintKey(47,2,"dbl");
	PrintKey(48,2,"dbl");
	PrintKey(49,2,"dbl");
	PrintKey(50,2,"dbl");
	PrintKey(51,2,"dbl");
	PrintKey(52,2,"dbl");
	PrintKey(53,8,"act","Shift");
	document.write('</tr><tr>');
	PrintKey(54,4,"act","Ctrl");
	PrintKey(55,4,"act","Alt");
	PrintKey(56,15,"act","&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
	PrintKey(57,4,"act","Alt");
	PrintKey(58,4,"act","Ctrl");
	document.write('</tr></table>');
}
function findLastChar()
{
	var elem = document.getElementById(elementID);
	
	if (elem.createTextRange)
	{
		var range = document.selection.createRange().duplicate();
		
		range.moveStart("character",-1);
		
		return(range.text);
	}
	else if (elem.selectionStart)
	{
		var startPos = elem.selectionStart;
		var endPos = elem.selectionEnd;
		
		startPos = startPos - 1;
		endPos = startPos + 1;
		
		return (elem.value).substring(startPos, endPos);
	}
	
	return "";
}

function eraseLastChar()
{
	var elem = document.getElementById(elementID);
	
	if (elem.createTextRange)
	{
		var range = document.selection.createRange().duplicate();
		range.moveStart("character", -1);
		range.text = "";
	}
	else
	{
		var txtarea = elem;
		var startPos = txtarea.selectionStart-1;
		var endPos = txtarea.selectionEnd;
		var scrollTop = txtarea.scrollTop;
		txtarea.value = txtarea.value.substring(0, startPos) + txtarea.value.substring(endPos, txtarea.value.length);
		var cPos = startPos;
		txtarea.selectionStart = cPos;
		txtarea.selectionEnd = cPos;
		txtarea.scrollTop = scrollTop;
	}
}
function insertAtCaret(text)
{
	var elem = document.getElementById(elementID);	
	var txtarea = document.getElementById(elementID);
	
	if (document.selection) 
	{
		var CaretPos;
		
		if (elem.createTextRange)
		{
			CaretPos = document.selection.createRange().duplicate();
			CaretPos.text = text;
		}
	}
	else if(txtarea.selectionStart || txtarea.selectionStart == '0')
	{
		var startPos = txtarea.selectionStart;
		var endPos = txtarea.selectionEnd;
		var scrollTop = txtarea.scrollTop;
		var myText = (txtarea.value).substring(startPos, endPos);
		
		if (!myText) { myText = text; }

		txtarea.value = txtarea.value.substring(0, startPos) + text +  txtarea.value.substring(endPos, txtarea.value.length);
		txtarea.focus();

		var cPos = startPos + text.length;
		
		txtarea.selectionStart = cPos;
		txtarea.selectionEnd = cPos;
		txtarea.scrollTop = scrollTop;
	}
}

function getRef(obj)
{
	if (typeof obj == "string")
		obj = document.getElementById(obj);

	return obj;
}

function setStyle(obj, style, value)
{
	obj = getRef(obj);
	obj.style[style] = value;
}

function getStyle(obj,style)
{
	if (!document.getElementById)
		return;
		
	var obj = getRef(obj);
	var value = obj.style[style];
	if(!value)
	if(document.defaultView)
	value=document.defaultView.
	getComputedStyle(obj,"").getPropertyValue(style);
	else if(obj.currentStyle)
	value=obj.currentStyle[style];
	return value;
}

function setClassName(obj,className)
{
	getRef(obj).className=className;
}

function setKeyText(keyNum,upperText,lowerText)
{
	var keyTextName = "key" + keyNum + "text";
	
	obj=getRef(keyTextName);
	
	var i;
	var str;
	
	str = new String("");
	
	for (i = 0; i < 3 - upperText.length; i++)
		str = str.concat("&nbsp;");

	str = str.concat(upperText,"<br />", lowerText);

	for (i=0;i<3-lowerText.length;i++)
		str=str.concat("&nbsp;");		
		
	obj.innerHTML=str;

	var englishkey;
	
	if (lang == 0)
		englishkey = GetEnglishButton(keyNum,false);
	else
		englishkey="";
	
	keyTextName="key"+keyNum+"english";
	obj=getRef(keyTextName);
	obj.innerHTML=englishkey;
}
function lightonKey(keyName)
{
if(selectedKey!="")lightoffKey();
setStyle(keyName,"backgroundColor","red");
selectedKey=keyName;
}
function lightoffKey()
{
if(selectedKey!="")
{
setStyle(selectedKey,"backgroundColor","#dcdcdc");
selectedKey="";
}
}
function animateKey(keyNum)
{
var keyName="key"+keyNum;
lightonKey(keyName);
setTimeout('lightoffKey()',500);
}
function AnimateControlKey(keyCode)
{
switch(keyCode)
{
case 13:animateKey(28);
break;
case 46:break;
break;
case 8:animateKey(14);
break;
}
}
function AnimateButtonPress(keyChar)
{
	switch(keyChar){
	case"~":
	case"`":
	animateKey(1);
	break;
	case"!":
	case"1":
	animateKey(2);
	break;
	case"@":
	case"2":
	animateKey(3);
	break;
	case"#":
	case"3":
	animateKey(4);
	break;
	case"$":
	case"4":
	animateKey(5);
	break;
	case"%":
	case"5":
	animateKey(6);
	break;
	case"^":
	case"6":
	animateKey(7);
	break;
	case"&":
	case"7":
	animateKey(8);
	break;
	case"*":
	case"8":
	animateKey(9);
	break;
	case"(":
	case"9":
	animateKey(10);
	break;
	case"0":
	case")":
	animateKey(11);
	break;
	case"-":
	case"_":
	animateKey(12);
	break;
	case"+":
	case"=":
	animateKey(13);
	break;
	case"Q":
	case"q":
	animateKey(16);
	break;
	case"W":
	case"w":
	animateKey(17);
	break;
	case"E":
	case"e":
	animateKey(18);
	break;
	case"R":
	case"r":
	animateKey(19);
	break;
	case"T":
	case"t":
	animateKey(20);
	break;
	case"Y":
	case"y":
	animateKey(21);
	break;
	case"U":
	case"u":
	animateKey(22);
	break;
	case"I":
	case"i":
	animateKey(23);
	break;
	case"O":
	case"o":
	animateKey(24);
	break;
	case"P":
	case"p":
	animateKey(25);
	break;
	case"{":
	case"[":
	animateKey(26);
	break;
	case"}":
	case"]":
	animateKey(27);
	break;
	case"A":
	case"a":
	animateKey(30);
	break;
	case"S":
	case"s":
	animateKey(31);
	break;
	case"D":
	case"d":
	animateKey(32);
	break;
	case"F":
	case"f":
	animateKey(33);
	break;
	case"G":
	case"g":
	animateKey(34);
	break;
	case"H":
	case"h":
	animateKey(35);
	break;
	case"J":
	case"j":
	animateKey(36);
	break;
	case"K":
	case"k":
	animateKey(37);
	break;
	case"L":
	case"l":
	animateKey(38);
	break;
	case";":
	case":":
	animateKey(39);
	break;
	case'"':
	case"'":
	animateKey(40);
	break;
	case"|":
	case"\\":
	animateKey(41);
	break;
	case"Z":
	case"z":
	animateKey(43);
	break;
	case"X":
	case"x":
	animateKey(44);
	break;
	case"C":
	case"c":
	animateKey(45);
	break;
	case"V":
	case"v":
	animateKey(46);
	break;
	case"B":
	case"b":
	animateKey(47);
	break;
	case"N":
	case"n":
	animateKey(48);
	break;
	case"M":
	case"m":
	animateKey(49);
	break;
	case"<":
	case",":
	animateKey(50);
	break;
	case">":
	case".":
	animateKey(51);
	break;
	case"?":
	case"/":
	animateKey(52);
	break;
	case" ":
	animateKey(56);
	break;
	}
	}
	
function GetEnglishButton(num, shift)
{
	switch(num)
	{
	case 1: 
		if(shift) return "~";
		return "`";
	case 2: if(shift) return "!";
		return "1";
	case 3: if(shift) return '@';
		return "2";
	case 4: if(shift) return "#";
		return "3";
	case 5: if(shift) return "$";
		return "4";
	case 6: if(shift) return "%";
		return "5";
	case 7: if(shift) return "^";
		return "6";
	case 8: if(shift) return "&";
		return "7";
	case 9: if(shift) return "*";
		return "8";
	case 10:if(shift) return "(";
		return "9";
	case 11:if(shift) return ")";
		return "0";
	case 12:if(shift) return "_";
		return "-";
	case 13:if(shift) return "+";
		return "=";
	case 13:if(shift) return "BackSp";
		return "";
	case 16:if(shift) return "Q";
		return "q";
	case 17:if(shift) return "W";
		return "w";
	case 18:if(shift) return "E";
		return "e";
	case 19:if(shift) return "R";
		return "r";
	case 20:if(shift) return "T";
		return "t";
	case 21:if(shift) return "Y";
		return "y";
	case 22:if(shift) return "U";
		return "u";
	case 23:if(shift) return "I";
		return "i";
	case 24:if(shift) return "O";
		return "o";
	case 25:if(shift) return "P";
		return "p";
	case 26:if(shift) return "{";
		return "[";;
	case 27:if(shift) return "}";
		return "]";
	case 30:if(shift) return "A";
		return "a";
	case 31:if(shift) return "S";
		return "s";
	case 32:if(shift) return "D";
		return "d";
	case 33:if(shift) return "F";
		return "f";
	case 34:if(shift) return "G";
		return "g";
	case 35:if(shift) return "H";
		return "h";
	case 36:if(shift) return "J";
		return "j";
	case 37:if(shift) return "K";
		return "k";
	case 38:if(shift) return "L";
		return "l";
	case 39:if(shift) return ":";
		return ";";
	case 40:if(shift) return '"';
		return "'";
	case 41:if(shift) return "|";
		return '\\';
	case 43:if(shift) return "Z";
		return "z";
	case 44:if(shift) return "X";
		return "x";
	case 45:if(shift) return "C";
		return "c";
	case 46:if(shift) return "V";
		return "v";
	case 47:if(shift) return "B";
		return "b";
	case 48:if(shift) return "N";
		return "n";
	case 49:if(shift) return "M";
		return "m";
	case 50:if(shift) return "<";
		return ',';
	case 51:if(shift) return ">";
		return '.';
	case 52:if(shift) return '?';
		return '/';	
	}
	return "";
}

function setEnglishKeyboardButtons()
{
	var i;
	for (i=1;i<=52;i++)
	{
		setKeyText(i,GetEnglishButton(i,true),GetEnglishButton(i,false));
	}
}

function setKeyboardButtons()
{
	if (lang == 1)
		setEnglishKeyboardButtons();
	else
	{
		var i;
		var down;
		var downsecond;
		var up;
		
		for (i=1;i<=52;i++)
		{
			down = getNextState("", GetEnglishButton(i,false), false);
			downsecond = getNextState(down,GetEnglishButton(i,false),false);
			
			if (down.charCodeAt(0) != downsecond.charCodeAt(0))
			{
				down = down + downsecond;
			}
			
			up = getNextState("", GetEnglishButton(i, true), false);
			setKeyText(i,up,down);
		}
	}
}
	
function replaceEndOfWord(character)
{
	var newChar = String.fromCharCode(changeEndOfWord(character.charCodeAt(0)));

	if (newChar != character)
	{
		eraseLastChar();
		insertAtCaret(newChar);
	}
}

function isVisibleChar(character)
{
	switch(character)
	{
		case"\\":
		case"a":
		case"b":
		case"c":
		case"d":
		case"e":
		case"f":
		case"g":
		case"h":
		case"i":
		case"j":
		case"k":
		case"l":
		case"m":
		case"n":
		case"o":
		case"p":
		case"q":
		case"r":
		case"s":
		case"t":
		case"u":
		case"v":
		case"w":
		case"x":
		case"y":
		case"z":
		case"A":
		case"B":
		case"C":
		case"D":
		case"E":
		case"F":
		case"G":
		case"H":
		case"I":
		case"J":
		case"K":
		case"L":
		case"M":
		case"N":
		case"O":
		case"P":
		case"Q":
		case"R":
		case"S":
		case"T":
		case"U":
		case"V":
		case"W":
		case"X":
		case"Y":
		case"Z":
		case" ":
		case"1":
		case"2":
		case"3":
		case"4":
		case"5":
		case"6":
		case"7":
		case"8":
		case"9":
		case"0":
		case"!":
		case"§":
		case"$":
		case"%":
		case"&":
		case"/":
		case"(":
		case")":
		case"=":
		case"?":
		case"{":
		case"}":
		case"[":
		case"]":
		case"*":
		case"-":
		case"+":
		case"<":
		case">":
		case"|":
		case",":
		case";":
		case".":
		case":":
		case"-":
		case"_":
		case"#":
		case"'":
		case"~":
		case"@":
		case" ":
			return true;
	}
	
	return false;
}

function isValidAlphabet(character)
{
	if (getNextState("", character) == "", false) 
		return false;
		
	return true;
}

function moveCursor()
{
	var elem = document.getElementById(elementID);
	var range = elem.createTextRange();
	
	range.moveStart("character", caret);
	range.collapse(),range.select();
}

function KeyPress(evt)
{
	var keyCode;
	var keyChar;
	//alert("KeyPress");
	evt = (evt) ? evt : (window.event) ? event : null;

	if (ctrlSpaceChangeLang)
	{
		var __nav4 = window.event ? true : false;
		var ctrlPressed = false;
			 
		if (__nav4)	// IE
		{
			if (window.event.ctrlKey)
				ctrlPressed = true;
			else
				ctrlPressed = false;
			
			code = evt.keyCode;
		} 
		else	// mozilla/ff
		{
			code = evt.charCode;
			ctrlPressed = evt.ctrlKey;
		}
	
		if (ctrlPressed)
		{ 
			if (code == 32)	//ctrl + space
			{			
				SetLang(!lang);
				
				if (evt.stopPropagation)
					evt.stopPropagation();  // Firefox
				else
					evt.returnValue = false;  // IE
		  
				return false;
			}
		}
	}

	if (evt)
	{
		if (window.event)
			keyCode = evt.keyCode;
		else
			keyCode = evt.charCode;
		
		if (evt.ctrlKey == true)
			return true;
		
		if (evt.altKey == true)
			return true;
		
		if ((keyCode == 0) || (keyCode == 13))
			return true;

		//alert(evt.type + ': evt.keyCode: ' + evt.keyCode + '; evt.charCode: ' + evt.charCode);
	}
	else
	{
		alert("Wrong version");
		
		return true;
	}
	
	evt.returnValue = false;
	//alert(keyCode);
	keyChar = String.fromCharCode(keyCode);
	//alert(keyChar);

	if (lang == 0)
	{
		if (isValidAlphabet(keyChar))
		{
			if (animatekeys == true)
			{
				AnimateButtonPress(keyChar);
			}
			
			var hebChar = getNextState(findLastChar(), keyChar, true);

			if (hebChar == keyChar)
			{
				if (layout == 0)
					replaceEndOfWord(findLastChar());
			}
			
			insertAtCaret(hebChar);
			
			if (evt.preventDefault)
			{
				evt.preventDefault();
				evt.cancelBubble = true;    
			}
		}
		else
		{
			evt.returnValue=true;
		}
	}
	else if (isVisibleChar(keyChar))
	{		
		if (animatekeys == true)
		{
			AnimateButtonPress(keyChar);
		}
		
		if (layout==0)
			replaceEndOfWord(findLastChar());
		
		insertAtCaret(keyChar);
		
		if (evt.preventDefault)
		{
			evt.preventDefault();
			evt.cancelBubble = true;    
		}
	}
	else
	{
		evt.returnValue = true;
	}
	
	var elem = document.getElementById(elementID);
	elem.focus();
}

function SetLang(num)
{
	lang = num;
	setKeyboardButtons();
}

function SetLayout(num)
{
	if (num == 0)
		SaveLayoutSelection("PHONETIC");
	else
		SaveLayoutSelection("HEBREW");
		
	layout = num;
	setKeyboardButtons();
}

function copyTextArea()
{
	var elem = document.getElementById(elementID);
	
	elem.focus();
	elem.select();
}

function resetTextArea()
{
	var elem = document.getElementById(elementID);
	elem.value = new String();
}

