var l_letter = new Array('`','1','2','3','4','5','6','7','8','9','0','-','=','q','w','e','r','t','y','u','i','o','p','[',']','BackSpace','Shift','a','s','d','f','g','h','j','k','l',';',"'",'Enter','CapsLock','z','x','c','v','b','n','m',',','.','/','\\','Rus/Lat','Undo',' ','Clear');
var lb_letter = new Array('~','!','@','#','$','%','^','&','*','(',')','_','+','Q','W','E','R','T','Y','U','I','O','P','{','}','BackSpace','Shift','A','S','D','F','G','H','J','K','L',':','"','Enter','CapsLock','Z','X','C','V','B','N','M','<','>','?','|','Rus/Lat','Undo',' ','Clear');
var r_letter = new Array('ё','1','2','3','4','5','6','7','8','9','0','-','=','й','ц','у','к','е','н','г','ш','щ','з','х','ъ','BackSpace','Shift','ф','ы','в','а','п','р','о','л','д','ж','э','Enter','CapsLock','я','ч','с','м','и','т','ь','б','ю','.','\\','Rus/Lat','Undo',' ','Clear');
var rb_letter = new Array('Ё','!','"','№',';','%',':','?','*','(',')','_','+','Й','Ц','У','К','Е','Н','Г','Ш','Щ','З','Х','Ъ','BackSpace','Shift','Ф','Ы','В','А','П','Р','О','Л','Д','Ж','Э','Enter','CapsLock','Я','Ч','С','М','И','Т','Ь','Б','Ю',',','\\','Rus/Lat','Undo',' ','Clear');
var ltype = new Array(2,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,2,0,0,3,3,3,3);
var letter = new Array(l_letter, lb_letter, r_letter, rb_letter);
var dec1 = new Array(1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1070,1056,1057,1058,1059,1042,1065,1061,1067,1047,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1102,1088,1089,1090,1091,1074,1097,1093,1099,1079,1100,1098);
var dec2 = new Array(1071,1041,1063,1044,1069,1060,1046,1065,1048,1049,1050,1051,1052,1053,1025,1055,1070,1056,1064,1058,1070,1042,1065,1061,1067,1046,1103,1073,1095,1076,1101,1092,1078,1097,1080,1081,1082,1083,1084,1085,1105,1087,1102,1088,1096,1090,1102,1074,1097,1093,1099,1078,1068,1066);
var dec3 = new Array(1060,1048,1057,1042,1059,1040,1055,1056,1064,1054,1051,1044,1068,1058,1065,1047,1049,1050,1067,1045,1043,1052,1062,1063,1053,1071,1092,1080,1089,1074,1091,1072,1087,1088,1096,1086,1083,1076,1100,1090,1097,1079,1081,1082,1099,1077,1075,1084,1094,1095,1085,1103,1093,1098,1078,1101,1073,1102,46,1061,1066,1046,1069,1041,1070,44,1105,1025);
var off = 0;
var keymode = 2;
var savemode = 0;
var qn = 55;
var shift = false;
var capslock = false;
var apostr = false;
var formname = "keyb2", textname = "v0";
var undotext = "";
var op;
var par = new String(location.search);


function saveres()
{

 if (savemode==0 || savemode==1)
 op.document.getElementById(textname).value = document.getElementById(textname).value;
 else if (savemode == 2) op.document.getElementById(textname).value = op.document.getElementById(textname).value + document.getElementById(textname).value;
 else if (savemode == 3) op.document.getElementById(textname).value = document.getElementById(textname).value + op.document.getElementById(textname).value;

 window.close();
 return false;
}

function cans()
{
 if((document.getElementById(textname).value == "") || confirm('Вы действительно хотите закрыть клавиатуру без сохранения текста?')) window.close();

 document.getElementById(textname).focus();
 return false;

}

function clr()
{
 undotext = document.getElementById(textname).value;
 document.getElementById(textname).value = "";

 document.getElementById(textname).focus();
 return false;
}

function undo()
{
 var s;
 s = document.getElementById(textname).value;
 document.getElementById(textname).value = undotext;
 undotext = s;

 document.getElementById(textname).focus();
 return false;
}

function changeLetter(n)
{
 var i;

 if((n != 5) && shift) keymode ^=1;
 keymode ^= n & 3;
 shift = ((n == 5) && !shift);

 for(i=0;i<qn;i++) document.keyb.elements[i+off].value = letter[(shift)?(keymode | (((ltype[i] >> (keymode >> 1)) & 1)^1)):(keymode & ((ltype[i] >> (keymode >> 1)) | 2))][i];
//out([keymode]);
if(document.getElementById(textname)!=null)
{
	 document.getElementById(textname).focus();
}

 return false;
}

function delLetter()
{
 var str = new String(document.getElementById(textname).value);
 var del=1;
 if(str.charAt(str.length-1) == '\n') del=2;
 document.getElementById(textname).value = str.substr(0, str.length-del);

 document.getElementById(textname).focus();
 return false;
}

function addLetter(but)
{
 var chr = but.value;
 if( chr == 'Enter' ) chr='\n';
 document.getElementById(textname).value += chr;
 if(shift)
 {
  shift=false;
  changeLetter(1);
 }
 document.getElementById(textname).focus();
 return false;
}

function getpar(parname)
{
 var j,k;
 j = par.indexOf(parname + "=")
 if(j == -1) return null;
 k = par.indexOf("&", j + parname.length + 1);
 return par.substring(j + parname.length + 1, (k == -1) ? par.length : k);
}

function init(formname, textname)
{
 var i, s;
 var domain;

 if((s=getpar("form")) != null) formname = s;
 if((s=getpar("text")) != null) textname = s;
 if((s=getpar("savemode")) != null)
 {
  savemode = parseInt(s,10);
  if(isNaN(savemode) || savemode < 0 || savemode > 3) savemode = 0;
 }
 if((s=getpar("keymode")) != null)
 {
  keymode = parseInt(s,10);
  if(isNaN(keymode) || keymode < 0 || keymode > 3) keymode = 2;
 }

 if(window.name == "keyb" && formname!="" && textname!="")
 {

  domain = new String(document.domain);
  if(domain.indexOf("mail.ru") != -1) document.domain="mail.ru";
  op = window.opener;
  //document.write('<b><a class=com href="" onClick="return saveres();">Сохранить результаты</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a class=com href="" onClick="return cans();">Закрыть окно</a></b>');
  if(savemode == 0) document.getElementById(textname).value=op.document.getElementById(textname).value;
 }

 if(document.getElementById(textname) != null)
 {
	 undotext = document.getElementById(textname).value;
 }


 changeLetter(0);
 return false;
}


var lastKeyCode;
function keyDown(event) {

	lastKeyCode = event.keyCode;
	return true;

}
var dec_table = [
					[
						{192 : 96, 49 : 49, 50 : 50, 51 : 51, 52 : 52, 53 : 53, 54 : 54, 55 : 55, 56 : 56, 57 : 57, 48 : 48, 109 : 45, 61 : 61, 81 : 113, 87 : 119, 69 : 101, 82 : 114, 84 : 116, 89 : 121, 85 : 117, 73 : 105, 79 : 111, 80 : 112, 219 : 91, 221 : 93, 220 : 92, 65 : 97, 83 : 115, 68 : 100, 70 : 102, 71 : 103, 72 : 104, 74 : 106, 75 : 107, 76 : 108, 59 : 59, 222 : 39, 90 : 122, 88 : 120, 67 : 99, 86 : 118, 66 : 98, 78 : 110, 77 : 109, 188 : 44, 190 : 46, 191 : 47},
						{192 : 126, 49 : 33, 50 : 64, 51 : 35, 52 : 36, 53 : 37, 54 : 94, 55 : 38, 56 : 42, 57 : 40, 48 : 41, 109 : 95, 61 : 43, 81 : 81, 87 : 87, 69 : 69, 82 : 82, 84 : 84, 89 : 89, 85 : 85, 73 : 73, 79 : 79, 80 : 80, 219 : 123, 221 : 125, 220 : 124, 65 : 65, 83 : 83, 68 : 68, 70 : 70, 71 : 71, 72 : 72, 74 : 74, 75 : 75, 76 : 76, 59 : 58, 222 : 34, 90 : 90, 88 : 88, 67 : 67, 86 : 86, 66 : 66, 78 : 78, 77 : 77, 188 : 60, 190 : 62, 191 : 63}
					],
					[
						{192 : 1105, 49 : 49, 50 : 50, 51 : 51, 52 : 52, 53 : 53, 54 : 54, 55 : 55, 56 : 56, 57 : 57, 48 : 48, 109 : 45, 61 : 61, 81 : 1081, 87 : 1094, 69 : 1091, 82 : 1082, 84 : 1077, 89 : 1085, 85 : 1075, 73 : 1096, 79 : 1097, 80 : 1079, 219 : 1093, 221 : 1098, 220 : 92, 65 : 1092, 83 : 1099, 68 : 1074, 70 : 1072, 71 : 1087, 72 : 1088, 74 : 1086, 75 : 1083, 76 : 1076, 59 : 1078, 222 : 1101, 90 : 1103, 88 : 1095, 67 : 1089, 86 : 1084, 66 : 1080, 78 : 1090, 77 : 1100, 188 : 1073, 190 : 1102, 191 : 46},
						{192 : 1025, 49 : 33, 50 : 34, 51 : 8470, 52 : 59, 53 : 37, 54 : 58, 55 : 63, 56 : 42, 57 : 40, 48 : 41, 109 : 95, 61 : 43, 81 : 1049, 87 : 1062, 69 : 1059, 82 : 1050, 84 : 1045, 89 : 1053, 85 : 1043, 73 : 1064, 79 : 1065, 80 : 1047, 219 : 1061, 221 : 1066, 220 : 47, 65 : 1060, 83 : 1067, 68 : 1042, 70 : 1040, 71 : 1055, 72 : 1056, 74 : 1054, 75 : 1051, 76 : 1044, 59 : 1046, 222 : 1069, 90 : 1071, 88 : 1063, 67 : 1057, 86 : 1052, 66 : 1048, 78 : 1058, 77 : 1068, 188 : 1041, 190 : 1070, 191 : 44}
					]
				];

function decode(event)
{

	if( event.ctrlKey )
		return;

	var lang = 0;
	if(document.getElementById('test_button').value != '`')
		lang = 1;

	var event_charCode = typeof( event.charCode ) == 'undefined' ? event.keyCode : event.charCode;

	var shift = 0;
	if( event.shiftKey || ( event_charCode >= 65 && event_charCode <= 90 ) || ( event_charCode >= 1040 && event_charCode <= 1071 ) )
		shift = 1;

	if( !dec_table[lang][shift][lastKeyCode] )
		return true;

	if(event.preventDefault)
		event.preventDefault();

	try {
		event.keyCode = dec_table[lang][shift][lastKeyCode];
	} catch (e) {
		try {
			var se = document.getElementById(textname).selectionStart + 1;
			document.getElementById(textname).value = document.getElementById(textname).value.substr(0, document.getElementById(textname).selectionStart) + String.fromCharCode(dec_table[lang][shift][lastKeyCode]) + document.getElementById(textname).value.substr(document.getElementById(textname).selectionEnd);
			document.getElementById(textname).setSelectionRange( se, se );
			event.preventDefault();
		} catch (e) { }
	}


	return false;
}

function decode()
{
 if((document.keyb.decflag.type != "select-one") || (document.keyb.decflag.value == 0)) return true;

 var code = event.keyCode, i = -1;

 if(code >= 65 && code <=90) i = code - 65;
 else if(code >= 97 && code <=122) i = code - 71;

 if(document.keyb.decflag.value == 1)
 {
  if(i == -1)
   switch (code)
   {
    case 91:  i = 52; break;
    case 93:  i = 53; break;
    case 39:  apostr = !apostr; return !apostr;
   }

  if(i != -1) event.keyCode = (apostr)?dec2[i]:dec1[i];
  apostr = false;
 }
 else
 {
  if(i == -1)
   switch (code)
   {
    case 91:  i = (capslock)?59:52; break;
    case 93:  i = (capslock)?60:53; break;
    case 59:  i = (capslock)?61:54; break;
    case 39:  i = (capslock)?62:55; break;
    case 44:  i = (capslock)?63:56; break;
    case 46:  i = (capslock)?64:57; break;
    case 47:  i = 58; break;
    case 123: i = (capslock)?52:59; break;
    case 125: i = (capslock)?53:60; break;
    case 58:  i = (capslock)?54:61; break;
    case 34:  i = (capslock)?55:62; break;
    case 60:  i = (capslock)?56:63; break;
    case 62:  i = (capslock)?57:64; break;
    case 63:  i = 65; break;
    case 96:  i = (capslock)?67:66; break;
    case 126: i = (capslock)?66:67; break;
   }
  else
  {
   if(i < 26) capslock = !event.shiftKey;
   else capslock = event.shiftKey;
  }
  if(i != -1) event.keyCode = dec3[i];

 }
 return true;

}

function cfocus()
{
 document.getElementById(textname).focus();
 return true;
}
