/* Cyrillic Virtual (on-screen) keyboard - JavaScript file
   Copyright (c) 2005  Paul Gorodyansky
  
  Implementation: http://Kbd.RusWin.net (http://ourworld.compuserve.com/homepages/PaulGor/onscreen.htm)
     or Russian interface version: 
  http://Klava.RusWin.net (http://ourworld.compuserve.com/homepages/PaulGor/screen_r.htm)

  Auhtor's site - "Cyrillic (Russian): instructions for Windows and Internet": 
  http://ourworld.compuserve.com/homepages/PaulGor/
  ( same as http://RusWin.net )
   
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.    
 *  
 *      This JavaScript code is for
 *
 *      Virtual Cyrillic Keyboard - with standard and phonetic layouts -
 *      works with MS Internet Explorer, Opera 8 and newer and with
 *      Mozilla software:
 *      Mozilla ver. 1.3 or higher, Netscape 7.1 or newer, FireFox
 *
 *
 *      Mode: 'as at home with MS Word' - input/edit text normally using 
 *      physical keyboard.
 *      In addition, one can use a mouse with a layout picture to place a
 *      letter into needed position.
 *
 *
 *  This is the first Vurtual Keyboard (that provides physical keyboard input)
 *  with a programming code suitable for all three browser brands:
 *  Internet Explorer, Opera and Mozilla
 *
 *  That is, this code for such "on-the-fly" input/editing is *original* -
 *  both keyboard-based and mouse-based parts -
 *  I could not use any code of older Virtual Keyboards because their programming
 *  code was working only under Internet Explorer.
 *  Also older mouse-based Keyboards were not suitable for normal text input/editing -
 *  they placed a new letter only at the end of the text, thus no text
 *  editing/correction was possible.
 *
 */


JSwasLoaded = true;


var Netscape, MSIE, Opera, Unknown, NN1, NN2, Ffox=false;
var Win, Mac, Other;
var NetscapeVer, MSIEVer, OperaVer, NetscapeOK, AlertMsg;
var strOperaPos;

var Br = "1";

// detect browser

Netscape = navigator.appName == "Netscape";
MSIE = navigator.appName == "Microsoft Internet Explorer";
Opera = navigator.userAgent.indexOf("Opera") > -1;

Unknown = !(Netscape || MSIE || Opera);

NetscapeOK = false;

// detect platform
var n;
Win = navigator.userAgent.indexOf("Win") > -1;
Mac = navigator.userAgent.indexOf("Mac") > -1;
Other = !(Win || Mac);

// now extract version numbers

if(Netscape)
{
  NetscapeVer = parseFloat(navigator.appVersion);
  if (NetscapeVer>4)
  {
    n = navigator.userAgent;
           
    if (n.indexOf("Netscape/") != -1)
    {
       NN1 = n.substr(n.indexOf("Netscape/")+9);
       NN1 = parseFloat(NN1);
    }
    NN1 = n.substr(n.indexOf("rv:")+3);
    NN1 = parseFloat(NN1); 

    if (NN1 >= "1.3")
        NetscapeOK = true;
  }
  if (NetscapeOK)
  {
      Br="NN";    
      if (n.indexOf("Firefox") != -1) Ffox = true;
  }
}
else if(MSIE)
{
  n = navigator.userAgent;
  MSIEVer = n.substr(n.indexOf("MSIE ")+("MSIE ").length, 4);
  MSIEVer = parseFloat(MSIEVer); 
  // converts it into a floatint point number

  if(Opera)
  {
     strOperaPos = n.indexOf("Opera/"); // "Opera " or "Opera/"
     if (strOperaPos == -1)
       OperaVer = n.substr(n.indexOf("Opera ")+("Opera ").length, 4);
     else
       OperaVer = n.substr(strOperaPos + ("Opera/").length, 4);    
        
     OperaVer = parseFloat(OperaVer);
  }
  else
    Br = "IE";
}
else if(Opera)  // Opera does not identify itself as MSIE
{
  n = navigator.userAgent;
  strOperaPos = n.indexOf("Opera/"); // "Opera " or "Opera/"

  if (strOperaPos == -1)
      OperaVer = n.substr(n.indexOf("Opera ")+("Opera ").length, 4);
  else
      OperaVer = n.substr(strOperaPos + ("Opera/").length, 4);    
        
  OperaVer = parseFloat(OperaVer);        
}


////////////////////////


                                 // YaZHert
  var KbdVariant1 = {          
    "~": "Þ",
    "!": "!",    
    "@": "ú",
    "#": "Ú",
    "$": "$",
    "%": "%",
    "^": "¸",
    "&": "¨",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "Ü",
    
    "`": "þ",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "ü",    
    
    "Q": "ß",
    "W": "Æ",
    "E": "Å",
    "R": "Ð",
    "T": "Ò",
    "Y": "Û",
    "U": "Ó",
    "I": "È",
    "O": "Î",
    "P": "Ï",
    "{": "Ø",
    "}": "Ù",
    "|": "Ý",
    
    "q": "ÿ",
    "w": "æ",
    "e": "å",
    "r": "ð",
    "t": "ò",
    "y": "û",
    "u": "ó",
    "i": "è",
    "o": "î",
    "p": "ï",
    "[": "ø",
    "]": "ù",
    "\\": "ý",
    
    "A": "À",
    "S": "Ñ",
    "D": "Ä",
    "F": "Ô",
    "G": "Ã",
    "H": "×",
    "J": "É",
    "K": "Ê",
    "L": "Ë",
    ":": ":",
    "\"": "\"",
    
    "a": "à",
    "s": "ñ",
    "d": "ä",
    "f": "ô",
    "g": "ã",
    "h": "÷",
    "j": "é",
    "k": "ê",
    "l": "ë",
    ";": ";",
    "'": "'",
    
    "Z": "Ç",
    "X": "Õ",
    "C": "Ö",
    "V": "Â",
    "B": "Á",
    "N": "Í",
    "M": "Ì",    
    "<": "<",
    ">": ">",
    "?": "?",    
    
    "z": "ç",
    "x": "õ",
    "c": "ö",
    "v": "â",
    "b": "á",
    "n": "í",
    "m": "ì",    
    ",": ",",
    ".": ".",
    "/": "/"
  };

                   // YaWert
  var KbdVariant2 = {
    "~": "Þ",
    "!": "!",    
    "@": "ú",
    "#": "Ú",
    "$": "$",
    "%": "%",
    "^": "¸",
    "&": "¨",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "Ü",
    
    "`": "þ",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "ü",    
    
    "Q": "ß",
    "W": "Â",
    "E": "Å",
    "R": "Ð",
    "T": "Ò",
    "Y": "Û",
    "U": "Ó",
    "I": "È",
    "O": "Î",
    "P": "Ï",
    "{": "Ø",
    "}": "Ù",
    "|": "Ý",
    
    "q": "ÿ",
    "w": "â",
    "e": "å",
    "r": "ð",
    "t": "ò",
    "y": "û",
    "u": "ó",
    "i": "è",
    "o": "î",
    "p": "ï",
    "[": "ø",
    "]": "ù",
    "\\": "ý",
    
    "A": "À",
    "S": "Ñ",
    "D": "Ä",
    "F": "Ô",
    "G": "Ã",
    "H": "×",
    "J": "É",
    "K": "Ê",
    "L": "Ë",
    ":": ":",
    "\"": "\"",
    
    "a": "à",
    "s": "ñ",
    "d": "ä",
    "f": "ô",
    "g": "ã",
    "h": "÷",
    "j": "é",
    "k": "ê",
    "l": "ë",
    ";": ";",
    "'": "'",
    
    "Z": "Ç",
    "X": "Õ",
    "C": "Ö",
    "V": "Æ",
    "B": "Á",
    "N": "Í",
    "M": "Ì",    
    "<": "<",
    ">": ">",
    "?": "?",    
    
    "z": "ç",
    "x": "õ",
    "c": "ö",
    "v": "æ",
    "b": "á",
    "n": "í",
    "m": "ì",    
    ",": ",",
    ".": ".",
    "/": "/"
  };
 // Copyright (c) 2005 Paul Gorodyansky - http://ourworld.compuserve.com/homepages/PaulGor
 // http://Klava.RusWin.net

                           // YaSHert
  var KbdVariant3 = {
    "~": "Þ",
    "!": "!",    
    "@": "ú",
    "#": "Ú",
    "$": "$",
    "%": "%",
    "^": "¸",
    "&": "¨",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "Ü",
    
    "`": "þ",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "ü",    
    
    "Q": "ß",
    "W": "Ø",
    "E": "Å",
    "R": "Ð",
    "T": "Ò",
    "Y": "Û",
    "U": "Ó",
    "I": "È",
    "O": "Î",
    "P": "Ï",
    "{": "Æ",
    "}": "Ù",
    "|": "Ý",
    
    "q": "ÿ",
    "w": "ø",
    "e": "å",
    "r": "ð",
    "t": "ò",
    "y": "û",
    "u": "ó",
    "i": "è",
    "o": "î",
    "p": "ï",
    "[": "æ",
    "]": "ù",
    "\\": "ý",
    
    "A": "À",
    "S": "Ñ",
    "D": "Ä",
    "F": "Ô",
    "G": "Ã",
    "H": "×",
    "J": "É",
    "K": "Ê",
    "L": "Ë",
    ":": ":",
    "\"": "\"",
    
    "a": "à",
    "s": "ñ",
    "d": "ä",
    "f": "ô",
    "g": "ã",
    "h": "÷",
    "j": "é",
    "k": "ê",
    "l": "ë",
    ";": ";",
    "'": "'",
    
    "Z": "Ç",
    "X": "Õ",
    "C": "Ö",
    "V": "Â",
    "B": "Á",
    "N": "Í",
    "M": "Ì",    
    "<": "<",
    ">": ">",
    "?": "?",    
    
    "z": "ç",
    "x": "õ",
    "c": "ö",
    "v": "â",
    "b": "á",
    "n": "í",
    "m": "ì",    
    ",": ",",
    ".": ".",
    "/": "/"
  };
  
                     // YaSCHert
  var KbdVariant4 = {
    "~": "Þ",
    "!": "!",    
    "@": "ú",
    "#": "Ú",
    "$": "Ü",
    "%": "%",
    "^": "¸",
    "&": "¨",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "+",
    
    "`": "þ",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "=",    
    
    "Q": "ß",
    "W": "Ù",
    "E": "Å",
    "R": "Ð",
    "T": "Ò",
    "Y": "Û",
    "U": "Ó",
    "I": "È",
    "O": "Î",
    "P": "Ï",
    "{": "Æ",
    "}": "Ø",
    "|": "Ý",
    
    "q": "ÿ",
    "w": "ù",
    "e": "å",
    "r": "ð",
    "t": "ò",
    "y": "û",
    "u": "ó",
    "i": "è",
    "o": "î",
    "p": "ï",
    "[": "æ",
    "]": "ø",
    "\\": "ý",
    
    "A": "À",
    "S": "Ñ",
    "D": "Ä",
    "F": "Ô",
    "G": "Ã",
    "H": "×",
    "J": "É",
    "K": "Ê",
    "L": "Ë",
    ":": ":",
    "\"": "\"",
    
    "a": "à",
    "s": "ñ",
    "d": "ä",
    "f": "ô",
    "g": "ã",
    "h": "÷",
    "j": "é",
    "k": "ê",
    "l": "ë",
    ";": ";",
    "'": "ü",
    
    "Z": "Ç",
    "X": "Õ",
    "C": "Ö",
    "V": "Â",
    "B": "Á",
    "N": "Í",
    "M": "Ì",    
    "<": "<",
    ">": ">",
    "?": "?",    
    
    "z": "ç",
    "x": "õ",
    "c": "ö",
    "v": "â",
    "b": "á",
    "n": "í",
    "m": "ì",    
    ",": ",",
    ".": ".",
    "/": "/"
  };
                             
                          // AATSEEL Student
  var KbdVariant5 = {
    "~": "¨",
    "!": "!",    
    "@": "@",
    "#": "#",
    "$": "\"",
    "%": ":",
    "^": "^",
    "&": "&",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "Ú",
    
    "`": "¸",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "ú",    
    
    "Q": "ß",
    "W": "Ø",
    "E": "Å",
    "R": "Ð",
    "T": "Ò",
    "Y": "Û",
    "U": "Ó",
    "I": "È",
    "O": "Î",
    "P": "Ï",
    "{": "Þ",
    "}": "Ù",
    "|": "Ý",
    
    "q": "ÿ",
    "w": "ø",
    "e": "å",
    "r": "ð",
    "t": "ò",
    "y": "û",
    "u": "ó",
    "i": "è",
    "o": "î",
    "p": "ï",
    "[": "þ",
    "]": "ù",
    "\\": "ý",
    
    "A": "À",
    "S": "Ñ",
    "D": "Ä",
    "F": "Ô",
    "G": "Ã",
    "H": "×",
    "J": "É",
    "K": "Ê",
    "L": "Ë",
    ":": "Ü",
    "\"": "Æ",
    
    "a": "à",
    "s": "ñ",
    "d": "ä",
    "f": "ô",
    "g": "ã",
    "h": "÷",
    "j": "é",
    "k": "ê",
    "l": "ë",
    ";": "ü",
    "'": "æ",
    
    "Z": "Ç",
    "X": "Õ",
    "C": "Ö",
    "V": "Â",
    "B": "Á",
    "N": "Í",
    "M": "Ì",    
    "<": "<",
    ">": ">",
    "?": "?",    
    
    "z": "ç",
    "x": "õ",
    "c": "ö",
    "v": "â",
    "b": "á",
    "n": "í",
    "m": "ì",    
    ",": ",",
    ".": ".",
    "/": "/"
  };
  
                   // YaWert2              - Maslov
  var KbdVariant6 = {
    "~": "Þ",
    "!": "!",    
    "@": "@",
    "#": "ú",
    "$": "Ú",
    "%": "%",
    "^": "¸",
    "&": "¨",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "×",
    
    "`": "þ",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "÷",    
    
    "Q": "ß",
    "W": "Â",
    "E": "Å",
    "R": "Ð",
    "T": "Ò",
    "Y": "Û",
    "U": "Ó",
    "I": "È",
    "O": "Î",
    "P": "Ï",
    "{": "Ø",
    "}": "Ù",
    "|": "Ý",
    
    "q": "ÿ",
    "w": "â",
    "e": "å",
    "r": "ð",
    "t": "ò",
    "y": "û",
    "u": "ó",
    "i": "è",
    "o": "î",
    "p": "ï",
    "[": "ø",
    "]": "ù",
    "\\": "ý",
    
    "A": "À",
    "S": "Ñ",
    "D": "Ä",
    "F": "Ô",
    "G": "Ã",
    "H": "Õ",
    "J": "É",
    "K": "Ê",
    "L": "Ë",
    ":": ":",
    "\"": "\"",
    
    "a": "à",
    "s": "ñ",
    "d": "ä",
    "f": "ô",
    "g": "ã",
    "h": "õ",
    "j": "é",
    "k": "ê",
    "l": "ë",
    ";": ";",
    "'": "'",
    
    "Z": "Ç",
    "X": "Ü",
    "C": "Ö",
    "V": "Æ",
    "B": "Á",
    "N": "Í",
    "M": "Ì",    
    "<": "<",
    ">": ">",
    "?": "?",    
    
    "z": "ç",
    "x": "ü",
    "c": "ö",
    "v": "æ",
    "b": "á",
    "n": "í",
    "m": "ì",    
    ",": ",",
    ".": ".",
    "/": "/"
  };  
             
             // YaSHert2
  var KbdVariant7 = {
    "~": "¨",
    "!": "!",    
    "@": "-",
    "#": "#",
    "$": "$",
    "%": "%",
    "^": "^",
    "&": "&",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "Ý",
    "+": "Ù",
    
    "`": "¸",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "ý",    
    "=": "ù",    
    
    "Q": "ß",
    "W": "Ø",
    "E": "Å",
    "R": "Ð",
    "T": "Ò",
    "Y": "Û",
    "U": "Ó",
    "I": "È",
    "O": "Î",
    "P": "Ï",
    "{": "Þ",
    "}": "Ú",
    "|": "¨",
    
    "q": "ÿ",
    "w": "ø",
    "e": "å",
    "r": "ð",
    "t": "ò",
    "y": "û",
    "u": "ó",
    "i": "è",
    "o": "î",
    "p": "ï",
    "[": "þ",
    "]": "ú",
    "\\": "¸",
    
    "A": "À",
    "S": "Ñ",
    "D": "Ä",
    "F": "Ô",
    "G": "Ã",
    "H": "Õ",
    "J": "É",
    "K": "Ê",
    "L": "Ë",
    ":": "×",
    "\"": "Æ",
    
    "a": "à",
    "s": "ñ",
    "d": "ä",
    "f": "ô",
    "g": "ã",
    "h": "õ",
    "j": "é",
    "k": "ê",
    "l": "ë",
    ";": "÷",
    "'": "æ",
    
    "Z": "Ç",
    "X": "Ü",
    "C": "Ö",
    "V": "Â",
    "B": "Á",
    "N": "Í",
    "M": "Ì",    
    "<": "<",
    ">": ">",
    "?": "?",    
    
    "z": "ç",
    "x": "ü",
    "c": "ö",
    "v": "â",
    "b": "á",
    "n": "í",
    "m": "ì",    
    ",": ",",
    ".": ".",
    "/": "/"
  };
  
               // YaSHert3
  var KbdVariant8 = {
    "~": "Ú",
    "!": "!",    
    "@": "\"",
    "#": "¹",
    "$": "=",
    "%": "%",
    "^": "'",
    "&": "+",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "Ù",
    
    "`": "ú",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "ù",    
    
    "Q": "ß",
    "W": "Ø",
    "E": "Å",
    "R": "Ð",
    "T": "Ò",
    "Y": "Û",
    "U": "Ó",
    "I": "È",
    "O": "Î",
    "P": "Ï",
    "{": "Þ",
    "}": "Ý",
    "|": "¨",
    
    "q": "ÿ",
    "w": "ø",
    "e": "å",
    "r": "ð",
    "t": "ò",
    "y": "û",
    "u": "ó",
    "i": "è",
    "o": "î",
    "p": "ï",
    "[": "þ",
    "]": "ý",
    "\\": "¸",
    
    "A": "À",
    "S": "Ñ",
    "D": "Ä",
    "F": "Ô",
    "G": "Ã",
    "H": "Õ",
    "J": "É",
    "K": "Ê",
    "L": "Ë",
    ":": "×",
    "\"": "Ü",
    
    "a": "à",
    "s": "ñ",
    "d": "ä",
    "f": "ô",
    "g": "ã",
    "h": "õ",
    "j": "é",
    "k": "ê",
    "l": "ë",
    ";": "÷",
    "'": "ü",
    
    "Z": "Ç",
    "X": "Æ",
    "C": "Ö",
    "V": "Â",
    "B": "Á",
    "N": "Í",
    "M": "Ì",    
    "<": ";",
    ">": ":",
    "?": "?",    
    
    "z": "ç",
    "x": "æ",
    "c": "ö",
    "v": "â",
    "b": "á",
    "n": "í",
    "m": "ì",    
    ",": ",",
    ".": ".",
    "/": "/"
  };
             
                              // YaZHert2 = Maslov with 'zh' and 'v' changed
    var KbdVariant9 = {
    "~": "Þ",
    "!": "!",    
    "@": "@",
    "#": "ú",
    "$": "Ú",
    "%": "%",
    "^": "¸",
    "&": "¨",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "×",
    
    "`": "þ",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "÷",    
    
    "Q": "ß",
    "W": "Æ",
    "E": "Å",
    "R": "Ð",
    "T": "Ò",
    "Y": "Û",
    "U": "Ó",
    "I": "È",
    "O": "Î",
    "P": "Ï",
    "{": "Ø",
    "}": "Ù",
    "|": "Ý",
    
    "q": "ÿ",
    "w": "æ",
    "e": "å",
    "r": "ð",
    "t": "ò",
    "y": "û",
    "u": "ó",
    "i": "è",
    "o": "î",
    "p": "ï",
    "[": "ø",
    "]": "ù",
    "\\": "ý",
    
    "A": "À",
    "S": "Ñ",
    "D": "Ä",
    "F": "Ô",
    "G": "Ã",
    "H": "Õ",
    "J": "É",
    "K": "Ê",
    "L": "Ë",
    ":": ":",
    "\"": "\"",
    
    "a": "à",
    "s": "ñ",
    "d": "ä",
    "f": "ô",
    "g": "ã",
    "h": "õ",
    "j": "é",
    "k": "ê",
    "l": "ë",
    ";": ";",
    "'": "'",
    
    "Z": "Ç",
    "X": "Ü",
    "C": "Ö",
    "V": "Â",
    "B": "Á",
    "N": "Í",
    "M": "Ì",    
    "<": "<",
    ">": ">",
    "?": "?",    
    
    "z": "ç",
    "x": "ü",
    "c": "ö",
    "v": "â",
    "b": "á",
    "n": "í",
    "m": "ì",    
    ",": ",",
    ".": ".",
    "/": "/"
  };
                             // YaZHert3  ~ orig. of SoftCorp.
    var KbdVariant10 = {
    "~": "Þ",
    "!": "!",    
    "@": "\"",
    "#": "#",
    "$": "?",
    "%": "%",
    "^": "\\",
    "&": "/",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "Ú",
    
    "`": "þ",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "ú",    
    
    "Q": "ß",
    "W": "Æ",
    "E": "Å",
    "R": "Ð",
    "T": "Ò",
    "Y": "Û",
    "U": "Ó",
    "I": "È",
    "O": "Î",
    "P": "Ï",
    "{": "Ø",
    "}": "Ù",
    "|": "Ý",
    
    "q": "ÿ",
    "w": "æ",
    "e": "å",
    "r": "ð",
    "t": "ò",
    "y": "û",
    "u": "ó",
    "i": "è",
    "o": "î",
    "p": "ï",
    "[": "ø",
    "]": "ù",
    "\\": "ý",
    
    "A": "À",
    "S": "Ñ",
    "D": "Ä",
    "F": "Ô",
    "G": "Ã",
    "H": "Õ",
    "J": "É",
    "K": "Ê",
    "L": "Ë",
    ":": "×",
    "\"": "¨",
    
    "a": "à",
    "s": "ñ",
    "d": "ä",
    "f": "ô",
    "g": "ã",
    "h": "õ",
    "j": "é",
    "k": "ê",
    "l": "ë",
    ";": "÷",
    "'": "¸",
    
    "Z": "Ç",
    "X": "Ü",
    "C": "Ö",
    "V": "Â",
    "B": "Á",
    "N": "Í",
    "M": "Ì",    
    "<": ";",
    ">": ":",
    "?": "Ú",    
    
    "z": "ç",
    "x": "ü",
    "c": "ö",
    "v": "â",
    "b": "á",
    "n": "í",
    "m": "ì",    
    ",": ",",
    ".": ".",
    "/": "ú"
  };
  

  
                     // YaYuertj
  var KbdVariant11 = {
    "~": "¨",
    "!": "!",    
    "@": "\"",
    "#": "#",
    "$": ";",
    "%": "%",
    "^": ":",
    "&": "?",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "+",
    
    "`": "¸",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "=",    
    
    "Q": "ß",
    "W": "Þ",
    "E": "Å",
    "R": "Ð",
    "T": "Ò",
    "Y": "É",
    "U": "Ó",
    "I": "È",
    "O": "Î",
    "P": "Ï",
    "{": "Û",
    "}": "Ú",
    "|": "|",
    
    "q": "ÿ",
    "w": "þ",
    "e": "å",
    "r": "ð",
    "t": "ò",
    "y": "é",
    "u": "ó",
    "i": "è",
    "o": "î",
    "p": "ï",
    "[": "û",
    "]": "ú",
    "\\": "/",
    
    "A": "À",
    "S": "Ñ",
    "D": "Ä",
    "F": "Ô",
    "G": "Ã",
    "H": "Õ",
    "J": "Æ",
    "K": "Ê",
    "L": "Ë",
    ":": "×",
    "\"": "Ö",
    
    "a": "à",
    "s": "ñ",
    "d": "ä",
    "f": "ô",
    "g": "ã",
    "h": "õ",
    "j": "æ",
    "k": "ê",
    "l": "ë",
    ";": "÷",
    "'": "ö",
    
    "Z": "Ç",
    "X": "Ù",
    "C": "Ø",
    "V": "Â",
    "B": "Á",
    "N": "Í",
    "M": "Ì",    
    "<": "Ü",
    ">": ",",
    "?": "Ý",    
    
    "z": "ç",
    "x": "ù",
    "c": "ø",
    "v": "â",
    "b": "á",
    "n": "í",
    "m": "ì",    
    ",": "ü",
    ".": ".",
    "/": "ý"
  };
  

          
                   // MS Standard éöóêåí
  var KbdVariant30 = {
    "~": "¨",
    "!": "!",    
    "@": "\"",
    "#": "¹",
    "$": ";",
    "%": "%",
    "^": ":",
    "&": "?",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "+",
    
    "`": "¸",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "=",    
    
    "Q": "É",
    "W": "Ö",
    "E": "Ó",
    "R": "Ê",
    "T": "Å",
    "Y": "Í",
    "U": "Ã",
    "I": "Ø",
    "O": "Ù",
    "P": "Ç",
    "{": "Õ",
    "}": "Ú",
    "|": "/",
    
    "q": "é",
    "w": "ö",
    "e": "ó",
    "r": "ê",
    "t": "å",
    "y": "í",
    "u": "ã",
    "i": "ø",
    "o": "ù",
    "p": "ç",
    "[": "õ",
    "]": "ú",
    "\\": "\\",
    
    "A": "Ô",
    "S": "Û",
    "D": "Â",
    "F": "À",
    "G": "Ï",
    "H": "Ð",
    "J": "Î",
    "K": "Ë",
    "L": "Ä",
    ":": "Æ",
    "\"": "Ý",
    
    "a": "ô",
    "s": "û",
    "d": "â",
    "f": "à",
    "g": "ï",
    "h": "ð",
    "j": "î",
    "k": "ë",
    "l": "ä",
    ";": "æ",
    "'": "ý",
    
    "Z": "ß",
    "X": "×",
    "C": "Ñ",
    "V": "Ì",
    "B": "È",
    "N": "Ò",
    "M": "Ü",    
    "<": "Á",
    ">": "Þ",
    "?": ",",    
    
    "z": "ÿ",
    "x": "÷",
    "c": "ñ",
    "v": "ì",
    "b": "è",
    "n": "ò",
    "m": "ü",    
    ",": "á",
    ".": "þ",
    "/": "."
  };          
  
                   // MS Typewriter éöóêåí
  var KbdVariant31 = {
    "~": "+",
    "!": "1",    
    "@": "2",
    "#": "3",
    "$": "4",
    "%": "5",
    "^": "6",
    "&": "7",
    "*": "8",
    "(": "9",
    ")": "0",
    "_": "=",
    "+": "\\",
    
    "`": "|",
    "1": "¹",
    "2": "-",
    "3": "/",
    "4": "\"",
    "5": ":",
    "6": ",",
    "7": ".",
    "8": "_",
    "9": "?",
    "0": "%",
    "-": "!",    
    "=": ";",    
    
    "Q": "É",
    "W": "Ö",
    "E": "Ó",
    "R": "Ê",
    "T": "Å",
    "Y": "Í",
    "U": "Ã",
    "I": "Ø",
    "O": "Ù",
    "P": "Ç",
    "{": "Õ",
    "}": "Ú",
    "|": "(",
    
    "q": "é",
    "w": "ö",
    "e": "ó",
    "r": "ê",
    "t": "å",
    "y": "í",
    "u": "ã",
    "i": "ø",
    "o": "ù",
    "p": "ç",
    "[": "õ",
    "]": "ú",
    "\\": ")",
    
    "A": "Ô",
    "S": "Û",
    "D": "Â",
    "F": "À",
    "G": "Ï",
    "H": "Ð",
    "J": "Î",
    "K": "Ë",
    "L": "Ä",
    ":": "Æ",
    "\"": "Ý",
    
    "a": "ô",
    "s": "û",
    "d": "â",
    "f": "à",
    "g": "ï",
    "h": "ð",
    "j": "î",
    "k": "ë",
    "l": "ä",
    ";": "æ",
    "'": "ý",
    
    "Z": "ß",
    "X": "×",
    "C": "Ñ",
    "V": "Ì",
    "B": "È",
    "N": "Ò",
    "M": "Ü",    
    "<": "Á",
    ">": "Þ",
    "?": "¨",    
    
    "z": "ÿ",
    "x": "÷",
    "c": "ñ",
    "v": "ì",
    "b": "è",
    "n": "ò",
    "m": "ü",    
    ",": "á",
    ".": "þ",
    "/": "¸"
  };            
  
                     // Alphabet order
  var KbdVariant32 = {
    "~": "~",
    "!": "!",    
    "@": "@",
    "#": "#",
    "$": "$",
    "%": "%",
    "^": "^",
    "&": "&",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "+",
    
    "`": "`",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "=",    
    
    "Q": "À",
    "W": "Á",
    "E": "Â",
    "R": "Ã",
    "T": "Ä",
    "Y": "Å",
    "U": "¨",
    "I": "Æ",
    "O": "Ç",
    "P": "È",
    "{": "È",
    "}": "Ê",
    "|": "|",
    
    "q": "à",
    "w": "á",
    "e": "â",
    "r": "ã",
    "t": "ä",
    "y": "å",
    "u": "¸",
    "i": "æ",
    "o": "ç",
    "p": "è",
    "[": "é",
    "]": "ê",
    "\\": "\\",
    
    "A": "Ë",
    "S": "Ì",
    "D": "Í",
    "F": "Î",
    "G": "Ï",
    "H": "Ð",
    "J": "Ñ",
    "K": "Ò",
    "L": "Ó",
    ":": "Ô",
    "\"": "Õ",
    
    "a": "ë",
    "s": "ì",
    "d": "í",
    "f": "î",
    "g": "ï",
    "h": "ð",
    "j": "ñ",
    "k": "ò",
    "l": "ó",
    ";": "ô",
    "'": "õ",
    
    "Z": "Ö",
    "X": "×",
    "C": "Ø",
    "V": "Ù",
    "B": "Ú",
    "N": "Û",
    "M": "Ü",    
    "<": "Ý",
    ">": "Þ",
    "?": "ß",    
    
    "z": "ö",
    "x": "÷",
    "c": "ø",
    "v": "ù",
    "b": "ú",
    "n": "û",
    "m": "ü",    
    ",": "ý",
    ".": "þ",
    "/": "ÿ"
  };          
  
                     // MS Standard éöóêåí - Ukrainian. Óêðàèíñêàÿ ñòàíäàðòíàÿ - ñì.
                     // http://www.microsoft.com/globaldev/reference/keyboards.aspx

  var KbdVariant33 = {
    "~": "¨",
    "!": "!",    
    "@": "\"",
    "#": "¹",
    "$": ";",
    "%": "%",
    "^": ":",
    "&": "?",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "¥",
    
    "`": "¸",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "´",    
    
    "Q": "É",
    "W": "Ö",
    "E": "Ó",
    "R": "Ê",
    "T": "Å",
    "Y": "Í",
    "U": "Ã",
    "I": "Ø",
    "O": "Ù",
    "P": "Ç",
    "{": "Õ",
    "}": "¯",
    "|": "/",
    
    "q": "é",
    "w": "ö",
    "e": "ó",
    "r": "ê",
    "t": "å",
    "y": "í",
    "u": "ã",
    "i": "ø",
    "o": "ù",
    "p": "ç",
    "[": "õ",
    "]": "¿",
    "\\": "\\",
    
    "A": "Ô",
    "S": "²",
    "D": "Â",
    "F": "À",
    "G": "Ï",
    "H": "Ð",
    "J": "Î",
    "K": "Ë",
    "L": "Ä",
    ":": "Æ",
    "\"": "ª",
    
    "a": "ô",
    "s": "³",
    "d": "â",
    "f": "à",
    "g": "ï",
    "h": "ð",
    "j": "î",
    "k": "ë",
    "l": "ä",
    ";": "æ",
    "'": "º",
    
    "Z": "ß",
    "X": "×",
    "C": "Ñ",
    "V": "Ì",
    "B": "È",
    "N": "Ò",
    "M": "Ü",    
    "<": "Á",
    ">": "Þ",
    "?": ",",    
    
    "z": "ÿ",
    "x": "÷",
    "c": "ñ",
    "v": "ì",
    "b": "è",
    "n": "ò",
    "m": "ü",    
    ",": "á",
    ".": "þ",
    "/": "."
  };          
  
  
  
    var KbdVariant888 = {   // To Translit
    "~": "~",
    "!": "!",    
    "@": "@",
    "#": "#",
    "$": "$",
    "%": "%",
    "^": "^",
    "&": "&",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "+",
    
    "`": "`",
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "0": "0",
    "-": "-",    
    "=": "=",    

    "{": "{",
    "}": "}",    
    "|": "|",    
    "[": "[",
    "]": "]",    
    "\\": "\\",  
    
    ":": ":",    
    "\"": "\"",    
    ";": ";",
    "'": "'",          
        
    "<": "<",
    ">": ">",    
    "?": "?",    
    ",": ",",
    ".": ".",    
    "/": "/",  
        
    "À": "A",
    "Á": "B",
    "Â": "V",
    "Ã": "G",
    "Ä": "D",
    "Å": "E",
    "¨": "YO",
    "Æ": "ZH",
    "Ç": "Z",
    "È": "I",
    "É": "J",
    "Ê": "K",
    "Ë": "L",
    "Ì": "M",
    "Í": "N",
    "Î": "O",
    "Ï": "P",
    "Ð": "R",
    "Ñ": "S",
    "Ò": "T",
    "Ó": "U",
    "Ô": "F",
    "Õ": "X",
    "Ö": "TS",
    "×": "CH",
    "Ø": "SH",    
    "Ù": "SCH",
    "Ú": "\"",
    "Û": "Y",
    "Ü": "'",
    "Ý": "E",
    "Þ": "YU",
    "ß": "YA",
    
    "à": "a",     // 0
    "á": "b",     // 1
    "â": "v",     // 2
    "ã": "g",     // 3
    "ä": "d",     // 4
    "å": "e",     // 5
    "¸": "yo",    // 6
    "æ": "zh",    // 7
    "ç": "z",     // 8
    "è": "i",     // 9
    "é": "j",     // 10
    "ê": "k",     // 11
    "ë": "l",     // 12
    "ì": "m",     // 13
    "í": "n",     // 14
    "î": "o",     // 15
    "ï": "p",     // 16
    "ð": "r",     // 17
    "ñ": "s",     // 18
    "ò": "t",     // 19
    "ó": "u",     // 20
    "ô": "f",     // 21
    "õ": "x",     // 22
    "ö": "ts",    // 23
    "÷": "ch",    // 24
    "ø": "sh",    // 25
    "ù": "sch",  // 26
    "ú": "\"",    // 27
    "û": "y",     // 28
    "ü": "'",     // 29
    "ý": "e",     // 30
    "þ": "yu",    // 31
    "ÿ": "ya"     // 32

  };


  var Pictures = {          
    '1': 'kbd/yazhert.png',                                     
    '2': 'kbd/yawert.png',                                
    '3': 'kbd/yashert.png',                                
    '4': 'kbd/yaschert.png',                               
    '5': 'kbd/student.png',  // AATSEEL Student            
    '6': 'kbd/yawert2.png',                                
    '7': 'kbd/yashert2.png',                               
    '8': 'kbd/yashert3.png',                               
    '9': 'kbd/yazhert2.png',                               
   '10': 'kbd/yazhert3.png',                              
   '11': 'kbd/yayuertj.png',                              
   '30': 'kbd/std_ru.png',                               
   '31': 'kbd/std_rutw.png',                              
   '32': 'kbd/alphabet.png',                              
   '33': 'kbd/std_ukr.png',                               
  '888': 'kbd/cyr-lat.png'
  };     
        
//////////////////////////////////////////////////////////
        
var ListName;
        
// var KBDSymbols = "~!@#$%^&*()_+`1234567890-=QWERTYUIOP{}|qwertyuiop[]\\ASDFGHJKL:\"asdfghjkl;'ZXCVBNM<>?zxcvbnm,./";
var RUSymbols = "ÀÁÂÃÄÅ¨ÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäå¸æçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
        
var Show_ToLatin = false;
if (typeof ToLatin != 'undefined')
{       
  if (ToLatin)  Show_ToLatin = true;
}       
        
        
if (Opera)
 if (OperaVer >= 8) Br = "NN"; // Opera 8 works as Mozilla



/*
 * Mozilla did not let me use arrow buttons, Home/End, Fx buttons, etc.
 * The solution was for Mozilla do NOT use event.keyCode, use just event.charCode
 * or to issue
 *     if (evt.ctrlKey)		// Separate pressing 'c' from Ctrl/c
 *        return true;
 * and 
 *     if (evt.which == 0)      // To have arrows, etc. work
 *         return true;
  
  
the third argument to changeKey should be a function
   function exampleKeyChecker (keyCode, CurrentKey)
which returns an object 
  { cancelKey: boolean, replaceKey: boolean, newKeyCode: number, newKey:
    string }
Not all properties need to be present, if cancelKey is set to true the
other properties are not needed.
If replaceKey is set to true then at least newKeyCode needs to be set.

Newly found:
Gecko browsers (and many others) have boolean properties of the event
object:-

event.altKey
event.ctrlKey
event.metaKey
event.shiftKey
*/

var dotReplacement=null;

function changeKey (textControl, evt, keyChecker1)
{
  if (CyrFromKbd == 'Off' && KbdVariant != '888')  // regular latin editing
     return true;
  
  if (evt.ctrlKey)
     return true;
      
  var keyChecker = eval(keyChecker1); // function name
  var keyCode = void 0;

  keyCode = evt.keyCode ? evt.keyCode :
               evt.charCode ? evt.charCode :
               evt.which ? evt.which : void 0;   

  if (evt.which == 0)
     return true;
		
  var CurrentKey;

  if (keyCode)
      CurrentKey = String.fromCharCode(keyCode);
  
  var keyCheck = keyChecker(keyCode, CurrentKey);
  
  if (keyCode && window.event && !window.opera)   // IE
  {
    if (keyCheck.cancelKey)
      return false;
    else if (keyCheck.replaceKey)  
    {
      window.event.keyCode = keyCheck.newKeyCode;
      if (window.event.preventDefault)
          window.event.preventDefault();
      return true;
    }
    else
      return true;
  }
  else if (typeof textControl.setSelectionRange != 'undefined') // NN
  {
    if (keyCheck.cancelKey)
    {
      if (evt.preventDefault)
         evt.preventDefault();
      return false;
    }
    else if (keyCheck.replaceKey)
    {
      var oldSelectionStart = textControl.selectionStart;
      var oldSelectionEnd = textControl.selectionEnd;
      var selectedText = textControl.value.substring(oldSelectionStart, oldSelectionEnd);
      var newText = typeof keyCheck.newKey != 'undefined' ?
                    keyCheck.newKey : String.fromCharCode(keyCheck.newKeyCode);

      if ( Opera && (OperaVer >= 9) && (keyCode == 46 || keyCode == 35 || keyCode == 36) )
      {
          dotReplacement = newText;
          return true;
      }
      else dotReplacement = null;
                    

      // cancel the key event and insert the newKey for the current selection
      if (evt.preventDefault)
         evt.preventDefault();

      var scrollTop, scrollLeft;                                            
      if (textControl.type == 'textarea' && typeof textControl.scrollTop != 'undefined')
      {                                                        
         scrollTop  = textControl.scrollTop;                                 
         scrollLeft = textControl.scrollLeft;                               
      }                                                                     
      textControl.value =                                                   
               textControl.value.substring(0, oldSelectionStart) +          
               newText +                                                    
               textControl.value.substring(oldSelectionEnd);                
               
      if (typeof scrollTop != 'undefined')
      {                                
         textControl.scrollTop  = scrollTop;                                 
         textControl.scrollLeft = scrollLeft;                               
      }                                                                     
      textControl.setSelectionRange(oldSelectionStart + newText.length,     
                                    oldSelectionStart + newText.length);
      return false;
    }
    else
      return true;
  }          // Other browser:
  else if (keyCheck.cancelKey)
  {
    if (evt.preventDefault)
        evt.preventDefault();
    return false;
  }
  else
   return true;
}


function fIE (keyCode, CurrentKey) {
 
  if (KbdVariant == '888')  // To Translit
  {
      if (RUSymbols.indexOf(CurrentKey) != -1)
      {
         if ( txtControl.isTextEdit )
         {
             var newString = KbdVariant888[CurrentKey];
             insertAtCaret(txtControl, newString);
         }
         return { cancelKey: true };         
      }
      else
         return { cancelKey: false };
  }
  else       // Regular           
  {
   if (CyrFromKbd == 'On')
   {
       var newKeyOut = eval("KbdVariant" + KbdVariant)[CurrentKey];
       if (newKeyOut)
         return { replaceKey: true, newKeyCode: newKeyOut.charCodeAt(), newKey: newKeyOut };    
       else
         return { cancelKey: false };
   }
   else
      return { cancelKey: false };
  }   
}
  // Copyright (c) 2005  Paul Gorodyansky http://RusWin.net http://Klava.RusWin.net
function fNN (keyCode, CurrentKey) {

  if (KbdVariant == '888')  // To Translit
  {
      if (RUSymbols.indexOf(CurrentKey) != -1)
      {
          return { replaceKey: true, newKeyCode: keyCode, newKey:
                   KbdVariant888[CurrentKey] };
      }
      else
         return { cancelKey: false };
  }
  else
  {
   if (CyrFromKbd == 'On')
   { 
       var newKeyOut = eval("KbdVariant" + KbdVariant)[CurrentKey];
       if (newKeyOut)
         return { replaceKey: true, newKeyCode: keyCode, newKey: newKeyOut };
       else
         return { cancelKey: false };
   }
   else 
      return { cancelKey: false };
  } 
}

function fOther (keyCode, CurrentKey) {
 
  if (KbdVariant == '888')  // To Translit
  {
      if (RUSymbols.indexOf(CurrentKey) != -1)
      {
         var newString = KbdVariant888[CurrentKey];
         txtControl.value += newString;
         return { cancelKey: true };         
      }
      else
         return { cancelKey: false };
  }
  else
  {
   if (CyrFromKbd == 'On')
   {
      var newKeyOut = eval("KbdVariant" + KbdVariant)[CurrentKey];
      if (newKeyOut)
      {
         txtControl.value += newKeyOut;
         return { cancelKey: true };
      }
      else
         return { cancelKey: false };
   }
   else
      return { cancelKey: false };
  }   
}



/************ End of main, typing related code *************************************/

function Kbd_OnOff(form,ev)
{
   var mKey = ModeSwitchKeyPressed(ev);
   
   var swKeyPressed = false;
   if (Opera)
   {
     if (OperaVer < 8) {if (mKey == 27) swKeyPressed = true;}
     else {if (mKey == 117) swKeyPressed = true;}     
   }
   else {if (mKey == 27 || mKey == 123) swKeyPressed = true;} 
   
   if (swKeyPressed)
   {
      if (typeof UseVirtKbd != 'undefined')
      {
         if (UseVirtKbd)
             switchMode(form);   
      }
      else
         switchMode(form);   
             
      if (Br == "IE")
         ev.returnValue=false;
   }    
}                       
                        // 17 - Ctrl, 123 - F12, 117 - F6, ESC - 27        
                        // IE - standard behavior for TEXTAREA - 
                        // remove all text if press Esc. Can be overridden, unlike Firefox and Opera 9:
                        // Firefox does the same, but only in <input type='text' and not in <textarea          
                        // Opera - since ver 9 - Esc: a) "deselect all" b) input field looses focus   
                        // Opera 7 - can not use F6. So in Opera 7 - use Esc, then from ver 8 - F6
                        
                        
function ModeSwitchKeyPressed(ev)
{
  if (window.event) return window.event.keyCode
  else if (ev) return ev.which
     else return null;
}

                        
function switchMode(form)
{
  if (CyrFromKbd == 'Off')
  {
    CyrFromKbd = 'On';
    form.fromKbd[0].checked = true; // "On"
  }
  else
  {
    CyrFromKbd = 'Off';
    form.fromKbd[1].checked = true;  // "Off"
  }
  txtControl.focus();
}

function NewKbdPic(name,picture)
{
  if (KbdVariant == "888" && interfaceLanguage == 'E')
      picture = 'kbd/cyr-late.png';
      
  if (window.document.images) window.document.images[name].src = picture;
}

function SetVariant(myForm, sName, variant, PicTagName)
{
  var pic;
  if (variant.value == "0") {variant.value = KbdVariant; txtControl.focus(); return false;}
  
  variant.selected = true;  KbdVariant = variant.value;  txtControl.focus();

  if (KbdPhysical != "EN") // non-US
  {
     if (typeof JSnonUSwasLoaded != 'undefined')
       if (JSnonUSwasLoaded) nonUS_SetVariant(myForm, KbdVariant, PicTagName);
  }
  else
  { 
     pic = Pictures[KbdVariant];
     NewKbdPic(PicTagName, pic);
  }   

  if (sName == "Slayouts")
  {        
     myForm.Flayouts.options[0].selected = true;   
     if (Show_ToLatin)  myForm.Latin.options[0].selected = true;
  }        
  else if (sName == "Flayouts")
  {        
     myForm.Slayouts.options[0].selected = true;   
     if (Show_ToLatin) myForm.Latin.options[0].selected = true;   
  }        
  else     
  {        
        // "Latin" then:
        myForm.Flayouts.options[0].selected = true;
        myForm.Slayouts.options[0].selected = true;
  }        
           
}          
           
           
function CopyText(box, parent_box)
{          
   var txt = parent_box.value + box.value;
           
   parent_box.value = txt;
   // parent_box.focus();
}          
           
function saveCaret(elem)
{          
  if ( elem.isTextEdit ) 
     elem.caretPos = document.selection.createRange();
    
  if (Opera && OperaVer >= 9 && dotReplacement != null)
  {
            var oldSelectionStart = elem.selectionStart;
            var oldSelectionEnd = elem.selectionEnd;
            var selectedText = elem.value.substring(oldSelectionStart, oldSelectionEnd);
            
            var str1 = elem.value.substring(0, oldSelectionStart);
            var sym = str1.substring(str1.length - 1);

            if (sym == "." || sym == "#" || sym == "$")
            {
               elem.value = elem.value.substring(0, oldSelectionStart-1) +          
                            dotReplacement +
                            elem.value.substring(oldSelectionEnd);                
               
               elem.setSelectionRange(oldSelectionStart, oldSelectionStart);
            }
            dotReplacement = null;
  }  
}          
           
function insertAtCaret(textElement, newText)
{   
  if ( textElement.isTextEdit )
  { 
    if ( !textElement.caretPos )
    {
       saveCaret(textElement);       
    }
    
    var caretPos = textElement.caretPos;
    caretPos.text = newText;
    caretPos.select(); 
  } 
}   

 
var Mouse30 = "¨!\"¹;%:?*()_+ÉÖÓÊÅÍÃØÙÇÕÚ/ÔÛÂÀÏÐÎËÄÆÝ/|ß×ÑÌÈÒÜÁÞ,¸1234567890-=éöóêåíãøùçõú\\ôûâàïðîëäæý\\\\ÿ÷ñìèòüáþ.";
var Mouse31 = "+1234567890=\\ÉÖÓÊÅÍÃØÙÇÕÚ(ÔÛÂÀÏÐÎËÄÆÝ(|ß×ÑÌÈÒÜÁÞ¨|¹-/\":,._?%!;éöóêåíãøùçõú)ôûâàïðîëäæý)\\ÿ÷ñìèòüáþ¸";
var Mouse32 = "~!@#$%^&*()_+ÀÁÂÃÄÅ¨ÆÇÈÉÊ|ËÌÍÎÏÐÑÒÓÔÕ||Ö×ØÙÚÛÜÝÞß`1234567890-=àáâãäå¸æçèéê\\ëìíîïðñòóôõ\\\\ö÷øùúûüýþÿ";
var Mouse33 = "¨!\"¹;%:?*()_¥ÉÖÓÊÅÍÃØÙÇÕ¯/Ô²ÂÀÏÐÎËÄÆª/¥ß×ÑÌÈÒÜÁÞ,¸1234567890-´éöóêåíãøùçõ¿\\ô³âàïðîëäæº\\´ÿ÷ñìèòüáþ.";
var Mouse34 = "¨!\"¹;%:?*()_+ÉÖÓÊÅÍÃØÙÇÕÚ/ÔÛÂÀÏÐÎËÄÆÝ/>ß×ÑÌÈÒÜÁÞ,¸1234567890-=éöóêåíãøùçõú\\ôûâàïðîëäæý\\<ÿ÷ñìèòüáþ.";

var Mouse1  = "Þ!úÚ$%¸¨*()_ÜßÆÅÐÒÛÓÈÎÏØÙÝÀÑÄÔÃ×ÉÊË:\"Ý|ÇÕÖÂÁÍÌ<>?þ1234567890-üÿæåðòûóèîïøùýàñäôã÷éêë;'ý\\çõöâáíì,./";
var Mouse2  = "Þ!úÚ$%¸¨*()_ÜßÂÅÐÒÛÓÈÎÏØÙÝÀÑÄÔÃ×ÉÊË:\"Ý|ÇÕÖÆÁÍÌ<>?þ1234567890-üÿâåðòûóèîïøùýàñäôã÷éêë;'ý\\çõöæáíì,./";
var Mouse3  = "Þ!úÚ$%¸¨*()_ÜßØÅÐÒÛÓÈÎÏÆÙÝÀÑÄÔÃ×ÉÊË:\"Ý|ÇÕÖÆÁÍÌ<>?þ1234567890-üÿøåðòûóèîïæùýàñäôã÷éêë;'ý\\çõöæáíì,./";
var Mouse4  = "Þ!úÚÜ%¸¨*()_+ßÙÅÐÒÛÓÈÎÏÆØÝÀÑÄÔÃ×ÉÊË:\"Ý|ÇÕÖÂÁÍÌ<>?þ1234567890-=ÿùåðòûóèîïæøýàñäôã÷éêë;üý\\çõöâáíì,./";
var Mouse5  = "¨!@#\":^&*()_ÚßØÅÐÒÛÓÈÎÏÞÙÝÀÑÄÔÃ×ÉÊËÜÆÝ|ÇÕÖÂÁÍÌ<>?¸1234567890-úÿøåðòûóèîïþùýàñäôã÷éêëüæý\\çõöâáíì,./";
var Mouse6  = "Þ!@úÚ%¸¨*()_×ßÂÅÐÒÛÓÈÎÏØÙÝÀÑÄÔÃÕÉÊË:\"Ý|ÇÜÖÆÁÍÌ<>?þ1234567890-÷ÿâåðòûóèîïøùýàñäôãõéêë;'ý\\çüöæáíì,./";
var Mouse7  = "¨!-#$%^&*()ÝÙßØÅÐÒÛÓÈÎÏÞÚ|ÀÑÄÔÃÕÉÊË×Æ||ÇÜÖÂÁÍÌ<>?¸1234567890ýùÿøåðòûóèîïþú\\àñäôãõéêë÷æ\\\\çüöâáíì,./";
var Mouse8  = "Ú!\"¹=%'+*()_ÙßØÅÐÒÛÓÈÎÏÞÝ¨ÀÑÄÔÃÕÉÊË×Ü¨|ÇÆÖÂÁÍÌ;:?ú1234567890-ùÿøåðòûóèîïþý¸àñäôãõéêë÷ü¸\\çæöâáíì,./";
var Mouse9  = "Þ!@úÚ%¸¨*()_×ßÆÅÐÒÛÓÈÎÏØÙÝÀÑÄÔÃÕÉÊË:\"Ý|ÇÜÖÂÁÍÌ<>?þ1234567890-÷ÿæåðòûóèîïøùýàñäôãõéêë;'ý\\çüöâáíì,./";
var Mouse10  = "Þ!\"#?%\\/*()_ÚßÆÅÐÒÛÓÈÎÏØÙÝÀÑÄÔÃÕÉÊË×¨Ý|ÇÜÖÂÁÍÌ;:Úþ1234567890-úÿæåðòûóèîïøùýàñäôãõéêë÷¸ý\\çüöâáíì,.ú";
var Mouse11 = "¨!\"#;%:?*()_+ßÞÅÐÒÉÓÈÎÏÛÚ|ÀÑÄÔÃÕÆÊË×Ö||ÇÙØÂÁÍÌÜ,Ý¸1234567890-=ÿþåðòéóèîïûú\\àñäôãõæêë÷ö\\\\çùøâáíìü.ý";

              

function fromAlphabet(LetNumber, evt)
{
  var CurrentKey; 
  if (  KbdVariant != 888  )
  {
    var ListName;
    if (KbdVariant < 60 && KbdVariant > 40)  // non-US: std_ru layout for larger physical keyboard is the same for every language
    {
      if (KbdPhysical == "UK")       // |\ on the button in the bottom left
         ListName = Mouse30;
      else                           // <> on the button in the bottom left
         ListName = Mouse34;
    } 
    else
     ListName = eval("Mouse" + KbdVariant);
     
    var ShiftNum = 49;
        
    if (evt.shiftKey)
        CurrentKey =  ListName.charAt(LetNumber);
    else
        CurrentKey =  ListName.charAt(LetNumber+ShiftNum);
    
    txtControl.focus();

    if (Br == "NN")
    {
       if (typeof txtControl.setSelectionRange != 'undefined')
       {
         var oldSelectionStart = txtControl.selectionStart;
         var oldSelectionEnd = txtControl.selectionEnd;
         var selectedText = txtControl.value.substring(oldSelectionStart, oldSelectionEnd);
         var newText = CurrentKey;
         
         var scrollTop, scrollLeft;                                            
         if (txtControl.type == 'textarea' &&                                  
             typeof txtControl.scrollTop != 'undefined')                       
         {                                                                     
            scrollTop  = txtControl.scrollTop;                                 
            scrollLeft = txtControl.scrollLeft;  
         }                                                                     
         txtControl.value =                                                                                 
                  txtControl.value.substring(0, oldSelectionStart) +                                        
                  newText +                                                                                 
                  txtControl.value.substring(oldSelectionEnd);                                              
                                                                                                            
         if (typeof scrollTop != 'undefined')                                                               
         {                                                                                                  
            txtControl.scrollTop  = scrollTop;                                                              
            txtControl.scrollLeft = scrollLeft;                                                            
         }                                                                                                  
         txtControl.setSelectionRange(oldSelectionStart + newText.length,                                   
                                      oldSelectionStart + newText.length);                                  
       }
    }
    else if (Br == "IE")
         { 
            insertAtCaret(txtControl,CurrentKey);
         }
         else
            txtControl.value += CurrentKey;
   } 
}


/* Paul Gorodyansky, author of the site
   "Cyrillic (Russian): instructions for Windows and Internet": 
   http://ourworld.compuserve.com/homepages/PaulGor/
   same as http://RusWin.net
*/

