
var current_kbd = 0;        // 0: English, 1: Bulgarian Phonetic, 2: Bulgarian BDS
var end_kbd = 2;
var kbd_names = ['ENG','PHO','BDS'];
var tran_table = [[],
	[
	  0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
	  0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
	  0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
	  0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
	  0x0040,   1040,   1041,   1062,   1044,   1045,   1060,   1043,   
	    1061,   1048,   1049,   1050,   1051,   1052,   1053,   1054,   
	    1055,   1071,   1056,   1057,   1058,   1059,   1046,   1042,   
	    1068,   1066,   1047,   1096,   1102,   1097, 0x005E, 0x005F,
	    1095,   1072,   1073,   1094,   1076,   1077,   1092,   1075,
	    1093,   1080,   1081,   1082,   1083,   1084,   1085,   1086,
	    1087,   1103,   1088,   1089,   1090,   1091,   1078,   1074,
	    1100,   1098,   1079,   1064,   1070, 1065,   1063
	],
	[
	  0x0020, 0x0021,   1063, 0x002B, 0x0022, 0x0025, 0x003A,   1095,
	  0x0028, 0x0029, 0x002F, 0x002B,   1088, 0x002D,   1083,   1073,
	  0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
	  0x0038, 0x0039,   1052,   1084,   1056, 0x003D,   1051,   1041,
	  0x003F,   1068,   1060,   1066,   1040,   1045,   1054,   1046,   
	    1043,   1057,   1058,   1053,   1042,   1055,   1061,   1044,   
	    1047,     44,   1048,   1071,   1064,   1050,   1046,   1059,   
	    1049,   1065,   1070,   1094,   0x0028,   59, 0x003D, 0x007C,
	    1095,   1100,   1092,   1098,   1072,   1077,   1086,   1078,
	    1075,   1089,   1090,   1085,   1074,   1087,   1093,   1076,
	    1079,   0044,   1080,   1103,   1096,   1082,    118,   1091,
	    1081,   1097,   1102,   1062,   	41,		0125,   0126
	]
];

function SwitchLanguage()
{
  current_kbd += 1;
  if (current_kbd > end_kbd) current_kbd = 0;
  return kbd_names[current_kbd];
}

function KeyPress(e)
{
  var key;
  if (current_kbd > 0) { //If we must change the code
    if (window.event) {
      e = window.event;
      obj = e.srcElement;
      key = e.keyCode;
    } else {
      obj = e.target;
      key = e.charCode;
    }
  
    // Avoid processing if control or higher than ASCII
    // Or ctrl or alt is pressed.
    if (key < 0x0020 || key >= 0x007F || e.ctrlKey || e.altKey || e.metaKey)
      return true;

    // rewrite key
    if (key == 0x0020 && e.shiftKey) // Shift-space -> ZWNJ
      key = 0x200C;
    else {
      key = tran_table[current_kbd][key - 0x0020];
  	}

    try {
      // Gecko before banning fake key emission.
      e.initKeyEvent("keypress", true, true, document.defaultView, false, false, true, false, 0, key, obj);
    } catch (err) {
    try {
      // Windows
      e.keyCode = key;
    } catch (err) {
      try {
          // Try inserting at cursor position, Gecko after banning fake key emission
          pnhMozStringInsert(obj, String.fromCharCode(key));
          e.preventDefault();
        } catch (err) {
          // Everything else, simply add to the end of buffer
          obj.value += String.fromCharCode(key);
          e.preventDefault();
        }
      }
    }
  }
  return true;
}

// Inserts a string at cursor
function pnhMozStringInsert(elt, newtext) {
	var posStart = elt.selectionStart;
	var posEnd = elt.selectionEnd;
	var scrollTop = elt.scrollTop;
	var scrollLeft = elt.scrollLeft;
	
	elt.value = elt.value.slice(0,posStart)+newtext+elt.value.slice(posEnd);
	var newpos = posStart+newtext.length;
	elt.selectionStart = newpos;
	elt.selectionEnd = newpos;
	elt.scrollTop = scrollTop;
	elt.scrollLeft = scrollLeft;
	elt.focus();
}