/* Cyrillic Virtual (on-screen) keyboard - JavaScript file
   Copyright (c) 2005  Paul Gorodyansky
  
  Implementation: http://Kbd.WinRus.com (http://WinRus.com/onscreen.htm)
     or Russian interface version: 
  http://Klava.WinRus.com = http://porusski.net (http://WinRus.com/klava.htm)

  Author's site - "Cyrillic (Russian): instructions for Windows and Internet": 
  http://WinRus.com/
  
   
 * 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 -
 *      
 *      Supported browsers and detailed description: http://winrus.com/onsreen.htm
 *
 *
 *      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 (and now - WebKit-based: Chrome, Safari
 *
 *  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.
 *
 */



var Netscape, MSIE, Opera, Unknown, NN1, NN2, Ffox=false;
var Win, Mac, Other;
var NetscapeVer, MSIEVer, OperaVer, NetscapeOK, AlertMsg;
var strOperaPos;
var WebKit, WebKitOK;
WebKit=false; WebKitOK=false;

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);
    }
    else
     if (n.indexOf("Mozilla") != -1) // Mozilla, Firefox, WebKit-based Chrome, Safari,...
     { 
       if (n.indexOf("rv:") != -1)  // Mozilla, Firefox
       {
         NN1 = n.substr(n.indexOf("rv:")+3); 
         NN1 = parseFloat(NN1); 
         if (NN1 >= "1.3") NetscapeOK = true;
       }  
       else  //WebKit - Chrome, Safari?
       {
         if (n.indexOf("WebKit") != -1)
         { 
            NN1 = n.substr(n.indexOf("WebKit")+7); 
            WebKit = true;
            NN1 = parseFloat(NN1); 
            if (NN1 >= 525) WebKitOK= true;
         }
       }
      } // Mozilla
  }
  
  if (NetscapeOK || WebKitOK)
  {
      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://WinRus.com
 // http://Klava.WinRus.com

                           // 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": "ì",    
    ",": "ü",
    ".": ".",
    "/": "ý"
  };
  

                                 // YaZHert - Ukrainian
  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": "ì",    
    ",": ",",
    ".": ".",
    "/": "/"
  };

//////////////////////////////////////////////////////////
          
                   // 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': 'yazhert.png',                                     
    '2': 'yawert.png',                                
    '3': 'yashert.png',                                
    '4': 'yaschert.png',                               
    '5': 'student.png',  // AATSEEL Student            
    '6': 'yawert2.png',                                
    '7': 'yashert2.png',                               
    '8': 'yashert3.png',                               
    '9': 'yazhert2.png',                               
   '10': 'yazhert3.png',                              
   '11': 'yayuertj.png',                              
   '12': 'yazh_ukr.png',                              
   '30': 'std_ru.png',                               
   '31': 'std_rutw.png',                              
   '32': 'alphabet.png',                              
   '33': 'std_ukr.png',                               
  '888': 'cyr-lat.png'
  };     
        

  var vkb_layoutTypeArrayNonUS = {
  '41':  'Slayouts',
  '61':  'Flayouts',
  '62':  'Flayouts',
  '42':  'Slayouts', 
  '71':  'Flayouts',
  '72':  'Flayouts',
  '73':  'Flayouts',
  '43':  'Slayouts',
  '81':  'Flayouts',
  '44':  'Slayouts',
  '91':  'Flayouts',
  '45':  'Slayouts',
  '101': 'Flayouts',
  '46':  'Slayouts',
  '111': 'Flayouts',
  '112': 'Flayouts',
  '47':  'Slayouts',
  '121': 'Flayouts',
  '122': 'Flayouts'
  };  

var vkb_optionArrayNonUS = {        
'41':  1,
'61':  1,
'62':  2,
'42':  1,
'71':  1,
'72':  2,
'73':  3,
'43':  1,
'81':  1,
'44':  1,
'91':  1,
'45':  1,
'101': 1,
'46':  1,
'111': 1,
'112': 2,
'47':  1,
'121': 1,
'122': 2
};


var vkb_optionKbdArrayNonUS = {        
'DE':  1,
'SV':  2,
'FR':  3,
'IT':  4,
'ES':  5,
'IL':  6,
'UK':  7
};

           
        
//////////////////////////////////////////////////////////
        
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  && !WebKitOK)   // 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;  // dot/Del or Home/# or End/$
          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://WinRus.com http://Klava.WinRus.com
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 (WebKit) { if (mKey == 27) swKeyPressed = true; } // only Esc
 else
 {  
   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
                        // Google Chrome (WebKit) - only Esc as F12 and F6 are used by the browser

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 = '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);
         storeIntelligentCookie(cookieName,KbdVariant);
       }
     }
  }
  else
  { 
     pic = Pictures[KbdVariant];
     NewKbdPic(PicTagName, pic);
     
     if (sName != "Latin") storeIntelligentCookie(cookieName,KbdVariant); 
  }   

  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 KbdPhysicalCalculate(num)  // non-US keyboard modes
{
  if (num < 60) // Standard 
  {
    switch (num)
    {                                                                           
      case 41:   KbdPhysical = "DE"; vkb_curImage = "std_de.png"; break;
      case 42:   KbdPhysical = "SV"; vkb_curImage = "std_sv.png"; break;
      case 43:   KbdPhysical = "FR"; vkb_curImage = "std_fr.png"; break;
      case 44:   KbdPhysical = "IT"; vkb_curImage = "std_it.png"; break;
      case 45:   KbdPhysical = "ES"; vkb_curImage = "std_es.png"; break;
      case 46:   KbdPhysical = "UK"; vkb_curImage = "std_uk.png"; break;            
      case 47:   KbdPhysical = "IL"; vkb_curImage = "std_il.png"; break;
      default: break;
    }      
  }
  else 
  {
    if (num < 70) {KbdPhysical = "DE"; if (num==61) vkb_curImage="german1.png"; else vkb_curImage="german2.png";}
    else if (num < 80) {KbdPhysical = "SV"; if (num==71) vkb_curImage="swedish1.png"; else if (num==72) vkb_curImage="swedish2.png"; else vkb_curImage="swedish3.png";}
         else if (num < 90) {KbdPhysical = "FR"; vkb_curImage="french1.png";}
              else if (num < 100) {KbdPhysical = "IT"; vkb_curImage="italian1.png";}    
                   else if (num < 110) {KbdPhysical = "ES"; vkb_curImage="spanish1.png";}        
                        else if (num < 120) {KbdPhysical = "UK"; if (num==111) vkb_curImage="british1.png"; else vkb_curImage="brit1ukr.png";}        
                             else if (num < 130) {KbdPhysical = "IL"; if (num==121) vkb_curImage="hebrew1.png"; else vkb_curImage="hebrew2.png";}    
  }
  
} 

           
function UseCookie()
{
   vkb_KbdVariantNonDefault = true;     
   vkb_KbdVariantNumber = parseFloat(KbdVariant); 
   var vkb_tmpNum; 
   
   if (vkb_KbdVariantNumber > 39)
   {
       vkb_tmpNum = vkb_layoutTypeArrayNonUS[KbdVariant];
       if (typeof vkb_tmpNum == 'undefined') vkb_KbdVariantNonDefault = false; // erroneous; set back 
       else
       {
        if (!JSnonUSwasLoaded) vkb_KbdVariantNonDefault = false;
        else
        { 
          if (interfaceLanguage == 'E' && !JSnon_EwasLoaded) vkb_KbdVariantNonDefault = false;
          else KbdPhysicalCalculate(vkb_KbdVariantNumber); // sets KbdPhysical and vkb_curImage  
        }
       }
   }
   else
   {
     vkb_tmpNum = Pictures[KbdVariant];
     if (typeof vkb_tmpNum == 'undefined') vkb_KbdVariantNonDefault = false; // erroneous; set back 
     else vkb_curImage = vkb_tmpNum;
   }

   if (!vkb_KbdVariantNonDefault) // erroneous; set back 
      {KbdVariant = "0"; vkb_KbdVariantNumber = 0;}

}

function SetupPerCookie()
{
 var tmp_Keyboard,  tmp_ItemNumber, tmp_Layout;
 
    if (vkb_KbdVariantNumber > 39) 
    {
      tmp_Keyboard = vkb_optionKbdArrayNonUS[KbdPhysical];
      myForm.Keyboards.options[tmp_Keyboard].selected=true;

      tmp_ItemNumber = vkb_optionArrayNonUS[KbdVariant];      
      
      tmp_Layout = vkb_layoutTypeArrayNonUS[KbdVariant];
      
      if (interfaceLanguage == 'E' && JSnon_EwasLoaded) nonUSsetMenusE(KbdPhysical);
      else nonUSsetMenus(KbdPhysical);
    }
    else if (vkb_KbdVariantNumber > 29) { tmp_Layout="Slayouts"; tmp_ItemNumber = vkb_KbdVariantNumber - 30 + 1;}
         else {tmp_Layout="Flayouts"; tmp_ItemNumber = vkb_KbdVariantNumber;}        
         

 if (tmp_Layout == "Slayouts")
 {
   myForm.Flayouts.options[0].selected = true;   
   myForm.Slayouts.options[tmp_ItemNumber].selected = true;   
 }
 else
 {
   myForm.Slayouts.options[0].selected = true;   
   myForm.Flayouts.options[tmp_ItemNumber].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-=ÿþåðòéóèîïûú\\àñäôãõæêë÷ö\\\\çùøâáíìü.ý";

var Mouse12  = "Þ!¿¯$%´¥*()_ÜßÆÅÐÒÈÓ²ÎÏØÙªÀÑÄÔÃ×ÉÊË:\"ª|ÇÕÖÂÁÍÌ<>?þ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;
   } 
}



JSwasLoaded = true;

/* Paul Gorodyansky, author of the site
   "Cyrillic (Russian): instructions for Windows and Internet": 
   http://WinRus.com/
   same as http://WinRus.com
*/



