/* 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": "ì",    
    ",": ",",
    ".": ".",
    "/": "ú"
  };
  
                                // YaZHert4 - RusLang.com
    var KbdVariant11 = {
     "\u00b1": "\u00b1",
          "~": "Þ",
          "!": "!",    
          "@": "¨",
     "\u00a3": "Ú",
          "#": "Ú",
          "$": "$",
          "%": "%",
          "^": "Ý",
          "&": "&",
          "*": "*",
          "(": "(",
          ")": ")",
          "_": "_",
          "+": "×",
          
     "\u00a7": "\u00a7",
          "`": "þ",
          "1": "1",
          "2": "2",
          "3": "ú",
          "4": "4",
          "5": "5",
          "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 KbdVariant12 = {
    "~": "¨",
    "!": "!",    
    "@": "\"",
    "#": "#",
    "$": ";",
    "%": "%",
    "^": ":",
    "&": "?",
    "*": "*",
    "(": "(",
    ")": ")",
    "_": "_",
    "+": "+",
    
    "`": "¸",
    "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 - ER UniversI2
  var KbdVariant13 = {
    "~": "Ý",
    "!": "¹",    
    "@": "!",
    "#": "-",
    "$": "\"",
    "%": ":",
    "^": "«",
    "&": "»",
    "*": "?",
    "(": "(",
    ")": ")",
    "_": "-",
    "+": "Ú",
    
    "`": "ý",
    "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': '../lang/kbd/yazhert.gif',                                     
    '2': '../lang/kbd/yawert.gif',                                
    '3': '../lang/kbd/yashert.gif',                                
    '4': '../lang/kbd/yaschert.gif',                               
    '5': '../lang/kbd/student.gif',  // AATSEEL Student            
    '6': '../lang/kbd/yawert2.gif',                                
    '7': '../lang/kbd/yashert2.gif',                               
    '8': '../lang/kbd/yashert3.gif',                               
    '9': '../lang/kbd/yazhert2.gif',                               
   '10': '../lang/kbd/yazhert3.gif',                              
   '11': '../lang/kbd/yayuertj.gif',                              
   '30': '../lang/kbd/std_ru.gif',                               
   '31': '../lang/kbd/std_rutw.gif',                              
   '32': '../lang/kbd/alphabet.gif',                              
   '33': '../lang/kbd/std_ukr.gif',                               
  '888': '../lang/kbd/cyr-lat.gif'
  };     
        
//////////////////////////////////////////////////////////
        
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
*/


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)
    {
      // cancel the key event and insert the newKey for the current selection
      if (evt.preventDefault)
         evt.preventDefault();
 
      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);
                    

      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)
{
   if ( ModeSwitchKeyPressed(ev) == 27 || (!Opera && ModeSwitchKeyPressed(ev) == 123) )
   {
      if (typeof UseVirtKbd != 'undefined')
      {
         if (UseVirtKbd)
             switchMode(form);   
      }
      else
         switchMode(form);   
             
      if (Br == "IE")
          ev.returnValue=false;
   }    
}                       
                        // 17 - Ctrl, 123 - F12, ESC - 27        
                        // IE - standard behavior for TEXTAREA - 
                        // remove all text if press Esc          

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 = '../lang/kbd/cyr-late.gif';
      
  if (window.document.images) window.document.images[name].src = picture;
}

function SetVariant(myForm, sName, variant, PicTagName)
{
  var pic;
  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();
}          
           
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
*/


