/******************************************************************/
/** Dynamic Keyboard Driver.  version 3.0                        **/
/** Copyright (C) 2002-2009. All Right Reserver.                 **/
/** Created by David A. Mchedlishvili                            **/
/**                                                              **/
/******************************************************************/

//******************************************************************
//**** Keyboard Handle *********************************************
//******************************************************************
function kbdHandle(e)
{
	var t = document.getElementsByName('kbd')[0];
	var k = e.which;
	if (k == 12) { if (t.selectedIndex == t.length-1) t.selectedIndex = 0; else t.selectedIndex++; return true; }
	t = t.options[t.selectedIndex].value;
	if (t != 'en') {
		var n = k;
		eval('n = kbd_'+t+'('+k+');');
		if (n != k) {
			var o = e.target;
			var p = o.selectionStart;
			o.value = o.value.substring(0, o.selectionStart)+String.fromCharCode(n)+o.value.substring(o.selectionEnd);
			p++;
			o.setSelectionRange(p,p);
			return false;
		}
	}
	return true;
}	

//******************************************************************
//**** Keyboard Event **********************************************
//******************************************************************
function kbdEvent(o)
{
	// Browser Agent
	var a = navigator.userAgent.toLowerCase();

	// IE
	if ((a.indexOf("msie") != -1) && (a.indexOf("opera") == -1)) {
		var t = document.getElementsByName('kbd')[0];
		var k = window.event.keyCode;
		if (k == 12) { if (t.selectedIndex == t.length-1) t.selectedIndex = 0; else t.selectedIndex++; return; }
		t = t.options[t.selectedIndex].value;
		if (t != 'en') eval('window.event.keyCode = kbd_'+t+'('+k+');');
		return;
	}

	// Other Browsers
	document.onkeypress = kbdHandle;

	return;
}

//******************************************************************
//**** Change Keyboard *********************************************
//******************************************************************
function kbdChange(t,p)
{
	document.cookie = 'wiskbd='+t.options[t.selectedIndex].value+';path='+p;
	if (kbdFocus) t.form.elements[kbdFocus].focus();
}

//******************************************************************
//**** Georgian on English Keyboards *******************************
//******************************************************************
function kbd_ka_en(key)
{
  switch (key) {
	case 97  : return 4304;		// a
	case 98  : return 4305;		// b
	case 99  : return 4330;		// c
	case 100 : return 4307;		// d
	case 101 : return 4308;		// e
	case 102 : return 4324;		// f
	case 103 : return 4306;		// g
	case 104 : return 4336;		// h
	case 105 : return 4312;		// i
	case 106 : return 4335;		// j
	case 107 : return 4313;		// k
	case 108 : return 4314;		// l
	case 109 : return 4315;		// m
	case 110 : return 4316;		// n
	case 111 : return 4317;		// o
	case 112 : return 4318;		// p
	case 113 : return 4325;		// q
	case 114 : return 4320;		// r
	case 115 : return 4321;		// s
	case 116 : return 4322;		// t
	case 117 : return 4323;		// u
	case 118 : return 4309;		// v
	case 119 : return 4332;		// w
	case 120 : return 4334;		// x
	case 121 : return 4327;		// y
	case 122 : return 4310;		// z
	case 67  : return 4329;		// C
	case 74  : return 4319;		// J
	case 82  : return 4326;		// R
	case 83  : return 4328;		// S
	case 84  : return 4311;		// T
	case 87  : return 4333;		// W
	case 90  : return 4331;		// Z
	default : return key;
  }
}

//******************************************************************
//**** Georgian on Russian Keyboards *******************************
//******************************************************************
function kbd_ka_ru(key)
{
  switch (key) {
	case 102 : return 4304;		// a
	case 44  : return 4305;		// b
	case 119 : return 4330;		// c
	case 108 : return 4307;		// d
	case 116 : return 4308;		// e
	case 97  : return 4324;		// f
	case 117 : return 4306;		// g
	case 96  : return 4336;		// h
	case 98  : return 4312;		// i
	case 93  : return 4335;		// j
	case 114 : return 4313;		// k
	case 107 : return 4314;		// l
	case 118 : return 4315;		// m
	case 121 : return 4316;		// n
	case 106 : return 4317;		// o
	case 103 : return 4318;		// p
	case 109 : return 4325;		// q
	case 104 : return 4320;		// r
	case 99  : return 4321;		// s
	case 110 : return 4322;		// t
	case 101 : return 4323;		// u
	case 100 : return 4309;		// v
	case 111 : return 4332;		// w
	case 91  : return 4334;		// x
	case 46  : return 4327;		// y
	case 112 : return 4310;		// z
	case 120 : return 4329;		// C
	case 59  : return 4319;		// J
	case 113 : return 4326;		// R
	case 105 : return 4328;		// S
	case 115 : return 4311;		// T
	case 122 : return 4333;		// W
	case 39  : return 4331;		// Z
	// Others
	case 64  : return 34;		// @
	case 36  : return 59;		// $
	case 94  : return 58;		// ^
	case 38  : return 63;		// &
	case 124 : return 47;		// |
	case 47  : return 46;		// /
	case 63  : return 44;		// ?
	default : return key;
  }
}

//******************************************************************
//**** Russian *****************************************************
//******************************************************************
function kbd_ru(key)
{
  switch (key) {
	case 96  : return 1105;	case 126 : return 1025; //  (ie)
	case 102 : return 1072;	case 70  : return 1040;	// 
	case 44  : return 1073;	case 60  : return 1041;	// 
	case 100 : return 1074;	case 68  : return 1042;	// 
	case 117 : return 1075;	case 85  : return 1043;	// 
	case 108 : return 1076;	case 76  : return 1044;	// 
	case 116 : return 1077;	case 84  : return 1045;	// 
	case 59  : return 1078; case 58  : return 1046;	// 
	case 112 : return 1079;	case 80  : return 1047;	// 
	case 98  : return 1080;	case 66  : return 1048;	// 
	case 113 : return 1081;	case 81  : return 1049;	// 
	case 114 : return 1082;	case 82  : return 1050;	// 
	case 107 : return 1083;	case 75  : return 1051;	// 
	case 118 : return 1084;	case 86  : return 1052;	// 
	case 121 : return 1085;	case 89  : return 1053;	// 
	case 106 : return 1086;	case 74  : return 1054;	// 
	case 103 : return 1087;	case 71  : return 1055;	// 
	case 104 : return 1088;	case 72  : return 1056;	// 
	case 99  : return 1089;	case 67  : return 1057;	// 
	case 110 : return 1090;	case 78  : return 1058;	// 
	case 101 : return 1091;	case 69  : return 1059;	// 
	case 97  : return 1092;	case 65  : return 1060;	// 
	case 91  : return 1093;	case 123 : return 1061;	// 
	case 119 : return 1094;	case 87  : return 1062;	// 
	case 120 : return 1095;	case 88  : return 1063;	// 
	case 105 : return 1096;	case 73  : return 1064;	// 
	case 111 : return 1097;	case 79  : return 1065;	// 
	case 109 : return 1100;	case 77  : return 1068;	// 
	case 115 : return 1099;	case 83  : return 1067;	// 
	case 93  : return 1098;	case 125 : return 1066;	// 
	case 39  : return 1101;	case 34  : return 1069;	// 
	case 46  : return 1102;	case 62  : return 1070;	// 
	case 122 : return 1103;	case 90  : return 1071;	// 
	// Others
	case 64  : return 34;		// @
	case 36  : return 59;		// $
	case 94  : return 58;		// ^
	case 38  : return 63;		// &
	case 124 : return 47;		// |
	case 47  : return 46;		// /
	case 63  : return 44;		// ?
	default : return key;
  }
}



