Subversion Repositories wimsdev

Rev

Rev 1220 | Rev 3262 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1220 Rev 3131
Line 1... Line 1...
1
/* ********************************************************************
1
/* ********************************************************************
2
 **********************************************************************
2
 **********************************************************************
3
 * HTML Virtual Keyboard Interface Script - v1.26
3
 * HTML Virtual Keyboard Interface Script - v1.32
4
 *   Copyright (c) 2009 - GreyWyvern
4
 *   Copyright (c) 2009 - GreyWyvern
5
 *
5
 *
6
 *  - Licenced for free distribution under the BSDL
6
 *  - Licenced for free distribution under the BSDL
7
 *          http://www.opensource.org/licenses/bsd-license.php
7
 *          http://www.opensource.org/licenses/bsd-license.php
8
 *
8
 *
Line 10... Line 10...
10
 * fields and textareas.
10
 * fields and textareas.
11
 *
11
 *
12
 * See http://www.greywyvern.com/code/javascript/keyboard for examples
12
 * See http://www.greywyvern.com/code/javascript/keyboard for examples
13
 * and usage instructions.
13
 * and usage instructions.
14
 *
14
 *
15
 * Version 1.26 - June 5, 2009
15
 * Version 1.32 - December 31, 2009
-
 
16
 *   - Added keyboard position switch function
-
 
17
 *   - Added some CSS3 styles
16
 *   - Slovak keyboard layout added
18
 *   - Added Pashto keyboard layout
-
 
19
 *   - Added Macedonian keyboard layout
-
 
20
 *   - Added Ukrainian keyboard layout
17
 *
21
 *
18
 *   See full changelog at:
22
 *   See full changelog at:
19
 *     http://www.greywyvern.com/code/javascript/keyboard.changelog.txt
23
 *     http://www.greywyvern.com/code/javascript/keyboard.changelog.txt
20
 *
24
 *
21
 * Keyboard Credits
25
 * Keyboard Credits
-
 
26
 *   - Ukrainian keyboard layout by Dmitry Nikitin
-
 
27
 *   - Macedonian keyboard layout by Damjan Dimitrioski
-
 
28
 *   - Pashto keyboard layout by Ahmad Wali Achakzai (qamosona.com)
-
 
29
 *   - Armenian Eastern and Western keyboard layouts by Hayastan Project (www.hayastan.co.uk)
-
 
30
 *   - Pinyin keyboard layout from a collaboration with Lou Winklemann
-
 
31
 *   - Kazakh keyboard layout by Alex Madyankin
-
 
32
 *   - Danish keyboard layout by Verner Kjærsgaard
22
 *   - Slovak keyboard layout by Daniel Lara (www.learningslovak.com)
33
 *   - Slovak keyboard layout by Daniel Lara (www.learningslovak.com)
23
 *   - Belarusian, Serbian Cyrillic and Serbian Latin keyboard layouts by Evgeniy Titov
34
 *   - Belarusian, Serbian Cyrillic and Serbian Latin keyboard layouts by Evgeniy Titov
24
 *   - Bulgarian Phonetic keyboard layout by Samuil Gospodinov
35
 *   - Bulgarian Phonetic keyboard layout by Samuil Gospodinov
25
 *   - Swedish keyboard layout by Håkan Sandberg
36
 *   - Swedish keyboard layout by Håkan Sandberg
26
 *   - Romanian keyboard layout by Aurel
37
 *   - Romanian keyboard layout by Aurel
Line 34... Line 45...
34
 *   - German keyboard layout by QuHno
45
 *   - German keyboard layout by QuHno
35
 *   - French keyboard layout by Hidden Evil
46
 *   - French keyboard layout by Hidden Evil
36
 *   - Polish Programmers layout by moose
47
 *   - Polish Programmers layout by moose
37
 *   - Turkish keyboard layouts by offcu
48
 *   - Turkish keyboard layouts by offcu
38
 *   - Dutch and US Int'l keyboard layouts by jerone
49
 *   - Dutch and US Int'l keyboard layouts by jerone
39
 *   - Portuguese keyboard layout by clisboa
-
 
40
 *
50
 *
41
 */
51
 */
42
var VKI_attach, VKI_close;
52
var VKI_attach, VKI_close;
43
  function VKI_buildKeyboardInputs() {
53
  function VKI_buildKeyboardInputs() {
44
    var self = this;
54
    var self = this;
45
 
55
 
46
    this.VKI_version = "1.26";
56
    this.VKI_version = "1.32";
-
 
57
    this.VKI_showVersion = true;
47
    this.VKI_target = this.VKI_visible = false;
58
    this.VKI_target = this.VKI_visible = false;
48
    this.VKI_shift = this.VKI_capslock = this.VKI_alternate = this.VKI_dead = false;
59
    this.VKI_shift = this.VKI_shiftlock = false;
-
 
60
    this.VKI_altgr = this.VKI_altgrlock = false;
-
 
61
    this.VKI_switcher = true; // show the position switcher
-
 
62
    this.VKI_above = 0; // 0 = below the input, 1 = above
-
 
63
    this.VKI_dead = false;
49
    this.VKI_deadkeysOn = false;
64
    this.VKI_deadkeysOn = false;
50
    this.VKI_kt = "French";  // Default keyboard layout
65
    this.VKI_kt = "French";  // Default keyboard layout
51
    this.VKI_clearPasswords = false;  // Clear password fields on focus
66
    this.VKI_clearPasswords = false;  // Clear password fields on focus
52
    this.VKI_showVersion = true;
-
 
53
    this.VKI_imageURI = "keyboard.png";
67
    this.VKI_imageURI = "keyboard.png";
54
    this.VKI_clickless = false;
68
    this.VKI_clickless = 0;  // 0 = disabled, > 0 = delay in ms
55
    this.VKI_clicklessDelay = 500;
-
 
56
    this.VKI_keyCenter = 3;
69
    this.VKI_keyCenter = 3;
57
 
70
 
58
    this.VKI_isIE = /*@cc_on!@*/false;
71
    this.VKI_isIE = /*@cc_on!@*/false;
59
    this.VKI_isIE6 = /*@if(@_jscript_version == 5.6)!@end@*/false;
72
    this.VKI_isIE6 = /*@if(@_jscript_version == 5.6)!@end@*/false;
60
    this.VKI_isIElt8 = /*@if(@_jscript_version < 5.8)!@end@*/false;
73
    this.VKI_isIElt8 = /*@if(@_jscript_version < 5.8)!@end@*/false;
Line 62... Line 75...
62
    this.VKI_isWebKit = RegExp("KHTML").test(navigator.userAgent);
75
    this.VKI_isWebKit = RegExp("KHTML").test(navigator.userAgent);
63
 
76
 
64
 
77
 
65
    /* ***** Create keyboards ************************************** */
78
    /* ***** Create keyboards ************************************** */
66
    this.VKI_layout = {};
79
    this.VKI_layout = {};
67
    this.VKI_layoutDDK = {};
-
 
68
 
80
 
69
    // - Lay out each keyboard in rows of sub-arrays.  Each sub-array
81
    // - Lay out each keyboard in rows of sub-arrays.  Each sub-array
70
    //   represents one key.
82
    //   represents one key.
71
    //
83
    //
72
    // - Each sub-array consists of four slots described as follows:
84
    // - Each sub-array consists of four slots described as follows:
73
    //     example: ["a", "A", "\u00e1", "\u00c1"]
85
    //     example: ["a", "A", "\u00e1", "\u00c1"]
74
    //
86
    //
75
    //          a) Normal character
87
    //          a) Normal character
76
    //          A) Character + Shift or Caps
88
    //          A) Character + Shift/Caps
77
    //     \u00e1) Character + Alt or AltGr
89
    //     \u00e1) Character + Alt/AltGr/AltLk
78
    //     \u00c1) Character + Shift or Caps + Alt or AltGr
90
    //     \u00c1) Character + Shift/Caps + Alt/AltGr/AltLk
79
    //
91
    //
80
    //   You may include sub-arrays which are fewer than four slots.
92
    //   You may include sub-arrays which are fewer than four slots.
81
    //   In these cases, the missing slots will be blanked when the
93
    //   In these cases, the missing slots will be blanked when the
82
    //   corresponding modifier key (Shift or AltGr) is pressed.
94
    //   corresponding modifier key (Shift or AltGr) is pressed.
83
    //
95
    //
84
    // - If the second slot of a sub-array matches one of the following
96
    // - If the second slot of a sub-array matches one of the following
85
    //   strings:
97
    //   strings:
86
    //       "Tab", "Caps", "Shift", "Enter", "Bksp", "Alt" OR "AltGr"
98
    //     "Tab", "Caps", "Shift", "Enter", "Bksp",
-
 
99
    //     "Alt" OR "AltGr", "AltLk"
87
    //   then the function of the key will be the following,
100
    //   then the function of the key will be the following,
88
    //   respectively:
101
    //   respectively:
89
    //     - Insert a tab
102
    //     - Insert a tab
90
    //     - Toggle Caps Lock (technically a Shift Lock)
103
    //     - Toggle Caps Lock (technically a Shift Lock)
91
    //     - Next entered character will be the shifted character
104
    //     - Next entered character will be the shifted character
92
    //     - Insert a newline (textarea), or close the keyboard
105
    //     - Insert a newline (textarea), or close the keyboard
93
    //     - Delete the previous character
106
    //     - Delete the previous character
94
    //     - Next entered character will be the alternate character
107
    //     - Next entered character will be the alternate character
-
 
108
    //     - Toggle Alt/AltGr Lock
95
    //
109
    //
96
    //   The first slot of this sub-array will be the text to display
110
    //   The first slot of this sub-array will be the text to display
97
    //   on the corresponding key.  This allows for easy localisation
111
    //   on the corresponding key.  This allows for easy localisation
98
    //   of key names.
112
    //   of key names.
99
    //
113
    //
100
    // - Layout dead keys (diacritic + letter) should be added as
114
    // - Layout dead keys (diacritic + letter) should be added as
Line 102... Line 116...
102
    //   diacritic.  See the "this.VKI_deadkey" object below the layout
116
    //   diacritic.  See the "this.VKI_deadkey" object below the layout
103
    //   definitions.  In  each two item child array, the second item
117
    //   definitions.  In  each two item child array, the second item
104
    //   is what the diacritic would change the first item to.
118
    //   is what the diacritic would change the first item to.
105
    //
119
    //
106
    // - To disable dead keys for a layout, simply assign true to the
120
    // - To disable dead keys for a layout, simply assign true to the
107
    //   this.VKI_layoutDDK (DDK = disable dead keys) object of the
121
    //   DDK property of the layout (DDK = disable dead keys).  See the
108
    //   same name as the layout.  See the Numpad layout below for an
122
    //   Numpad layout below for an example.
109
    //   example.
-
 
110
    //
123
    //
111
    // - Note that any characters beyond the normal ASCII set should be
124
    // - Note that any characters beyond the normal ASCII set should be
112
    //   entered in escaped Unicode format.  (eg \u00a3 = Pound symbol)
125
    //   entered in escaped Unicode format.  (eg \u00a3 = Pound symbol)
113
    //   You can find Unicode values for characters here:
126
    //   You can find Unicode values for characters here:
114
    //     http://unicode.org/charts/
127
    //     http://unicode.org/charts/
Line 120... Line 133...
120
      [["\u0630", "\u0651 "], ["1", "!", "\u00a1", "\u00b9"], ["2", "@", "\u00b2"], ["3", "#", "\u00b3"], ["4", "$", "\u00a4", "\u00a3"], ["5", "%", "\u20ac"], ["6", "^", "\u00bc"], ["7", "&", "\u00bd"], ["8", "*", "\u00be"], ["9", "(", "\u2018"], ["0", ")", "\u2019"], ["-", "_", "\u00a5"], ["=", "+", "\u00d7", "\u00f7"], ["Bksp", "Bksp"]],
133
      [["\u0630", "\u0651 "], ["1", "!", "\u00a1", "\u00b9"], ["2", "@", "\u00b2"], ["3", "#", "\u00b3"], ["4", "$", "\u00a4", "\u00a3"], ["5", "%", "\u20ac"], ["6", "^", "\u00bc"], ["7", "&", "\u00bd"], ["8", "*", "\u00be"], ["9", "(", "\u2018"], ["0", ")", "\u2019"], ["-", "_", "\u00a5"], ["=", "+", "\u00d7", "\u00f7"], ["Bksp", "Bksp"]],
121
      [["Tab", "Tab"], ["\u0636", "\u064e"], ["\u0635", "\u064b"], ["\u062b", "\u064f"], ["\u0642", "\u064c"], ["\u0641", "\u0644"], ["\u063a", "\u0625"], ["\u0639", "\u2018"], ["\u0647", "\u00f7"], ["\u062e", "\u00d7"], ["\u062d", "\u061b"], ["\u062c", "\u003c"], ["\u062f", "\u003e"], ["\u005c", "\u007c"]],
134
      [["Tab", "Tab"], ["\u0636", "\u064e"], ["\u0635", "\u064b"], ["\u062b", "\u064f"], ["\u0642", "\u064c"], ["\u0641", "\u0644"], ["\u063a", "\u0625"], ["\u0639", "\u2018"], ["\u0647", "\u00f7"], ["\u062e", "\u00d7"], ["\u062d", "\u061b"], ["\u062c", "\u003c"], ["\u062f", "\u003e"], ["\u005c", "\u007c"]],
122
      [["Caps", "Caps"], ["\u0634", "\u0650"], ["\u0633", "\u064d"], ["\u064a", "\u005d"], ["\u0628", "\u005b"], ["\u0644", "\u0644"], ["\u0627", "\u0623"], ["\u062a", "\u0640"], ["\u0646", "\u060c"], ["\u0645", "\u002f"], ["\u0643", "\u003a"], ["\u0637", "\u0022"], ["Enter", "Enter"]],
135
      [["Caps", "Caps"], ["\u0634", "\u0650"], ["\u0633", "\u064d"], ["\u064a", "\u005d"], ["\u0628", "\u005b"], ["\u0644", "\u0644"], ["\u0627", "\u0623"], ["\u062a", "\u0640"], ["\u0646", "\u060c"], ["\u0645", "\u002f"], ["\u0643", "\u003a"], ["\u0637", "\u0022"], ["Enter", "Enter"]],
123
      [["Shift", "Shift"], ["\u0626", "\u007e"], ["\u0621", "\u0652"], ["\u0624", "\u007d"], ["\u0631", "\u007b"], ["\u0644", "\u0644"], ["\u0649", "\u0622"], ["\u0629", "\u2019"], ["\u0648", "\u002c"], ["\u0632", "\u002e"], ["\u0638", "\u061f"], ["Shift", "Shift"]],
136
      [["Shift", "Shift"], ["\u0626", "\u007e"], ["\u0621", "\u0652"], ["\u0624", "\u007d"], ["\u0631", "\u007b"], ["\u0644", "\u0644"], ["\u0649", "\u0622"], ["\u0629", "\u2019"], ["\u0648", "\u002c"], ["\u0632", "\u002e"], ["\u0638", "\u061f"], ["Shift", "Shift"]],
124
      [[" ", " ", " ", " "], ["Alt", "Alt"]]
137
      [[" ", " ", " ", " "], ["Alt", "Alt"]]
-
 
138
    ];
-
 
139
 
-
 
140
    this.VKI_layout["Armenian East"] = [ // Eastern Armenian Keyboard
-
 
141
      [["\u055D", "\u055C"], [":", "1"], ["\u0571", "\u0541"], ["\u0575", "\u0545"], ["\u055B", "3"], [",", "4"], ["-", "9"], [".", "\u0587"], ["\u00AB", "("], ["\u00BB", ")"], ["\u0585", "\u0555"], ["\u057C", "\u054C"], ["\u056A", "\u053A"], ["Bksp", "Bksp"]],
-
 
142
      [["Tab", "Tab"], ["\u056D", "\u053D"], ["\u0582", "\u0552"], ["\u0567", "\u0537"], ["\u0580", "\u0550"], ["\u057F", "\u054F"], ["\u0565", "\u0535"], ["\u0568", "\u0538"], ["\u056B", "\u053B"], ["\u0578", "\u0548"], ["\u057A", "\u054A"], ["\u0579", "\u0549"], ["\u057B", "\u054B"], ["'", "\u055E"]],
-
 
143
      [["Caps", "Caps"], ["\u0561", "\u0531"], ["\u057D", "\u054D"], ["\u0564", "\u0534"], ["\u0586", "\u0556"], ["\u0584", "\u0554"], ["\u0570", "\u0540"], ["\u0573", "\u0543"], ["\u056F", "\u053F"], ["\u056C", "\u053C"], ["\u0569", "\u0539"], ["\u0583", "\u0553"], ["Enter", "Enter"]],
-
 
144
      [["Shift", "Shift"], ["\u0566", "\u0536"], ["\u0581", "\u0551"], ["\u0563", "\u0533"], ["\u057E", "\u054E"], ["\u0562", "\u0532"], ["\u0576", "\u0546"], ["\u0574", "\u0544"], ["\u0577", "\u0547"], ["\u0572", "\u0542"], ["\u056E", "\u053E"], ["Shift", "Shift"]],
-
 
145
      [[" ", " "]]
-
 
146
    ];
-
 
147
 
-
 
148
    this.VKI_layout["Armenian West"] = [ // Western Armenian Keyboard
-
 
149
      [["\u055D", "\u055C"], [":", "1"], ["\u0571", "\u0541"], ["\u0575", "\u0545"], ["\u055B", "3"], [",", "4"], ["-", "9"], [".", "\u0587"], ["\u00AB", "("], ["\u00BB", ")"], ["\u0585", "\u0555"], ["\u057C", "\u054C"], ["\u056A", "\u053A"], ["Bksp", "Bksp"]],
-
 
150
      [["Tab", "Tab"], ["\u056D", "\u053D"], ["\u057E", "\u054E"], ["\u0567", "\u0537"], ["\u0580", "\u0550"], ["\u0564", "\u0534"], ["\u0565", "\u0535"], ["\u0568", "\u0538"], ["\u056B", "\u053B"], ["\u0578", "\u0548"], ["\u0562", "\u0532"], ["\u0579", "\u0549"], ["\u057B", "\u054B"], ["'", "\u055E"]],
-
 
151
      [["Caps", "Caps"], ["\u0561", "\u0531"], ["\u057D", "\u054D"], ["\u057F", "\u054F"], ["\u0586", "\u0556"], ["\u056F", "\u053F"], ["\u0570", "\u0540"], ["\u0573", "\u0543"], ["\u0584", "\u0554"], ["\u056C", "\u053C"], ["\u0569", "\u0539"], ["\u0583", "\u0553"], ["Enter", "Enter"]],
-
 
152
      [["Shift", "Shift"], ["\u0566", "\u0536"], ["\u0581", "\u0551"], ["\u0563", "\u0533"], ["\u0582", "\u0552"], ["\u057A", "\u054A"], ["\u0576", "\u0546"], ["\u0574", "\u0544"], ["\u0577", "\u0547"], ["\u0572", "\u0542"], ["\u056E", "\u053E"], ["Shift", "Shift"]],
-
 
153
      [[" ", " "]]
125
    ];
154
    ];
126
 
155
 
127
    this.VKI_layout.Belarusian = [ // Belarusian Standard Keyboard
156
    this.VKI_layout.Belarusian = [ // Belarusian Standard Keyboard
128
      [["\u0451", "\u0401"], ["1", "!"], ["2", '"'], ["3", "\u2116"], ["4", ";"], ["5", "%"], ["6", ":"], ["7", "?"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
157
      [["\u0451", "\u0401"], ["1", "!"], ["2", '"'], ["3", "\u2116"], ["4", ";"], ["5", "%"], ["6", ":"], ["7", "?"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
129
      [["Tab", "Tab"], ["\u0439", "\u0419"], ["\u0446", "\u0426"], ["\u0443", "\u0423"], ["\u043a", "\u041a"], ["\u0435", "\u0415"], ["\u043d", "\u041d"], ["\u0433", "\u0413"], ["\u0448", "\u0428"], ["\u045e", "\u040e"], ["\u0437", "\u0417"], ["\u0445", "\u0425"], ["'", "'"], ["\\", "/"]],
158
      [["Tab", "Tab"], ["\u0439", "\u0419"], ["\u0446", "\u0426"], ["\u0443", "\u0423"], ["\u043a", "\u041a"], ["\u0435", "\u0415"], ["\u043d", "\u041d"], ["\u0433", "\u0413"], ["\u0448", "\u0428"], ["\u045e", "\u040e"], ["\u0437", "\u0417"], ["\u0445", "\u0425"], ["'", "'"], ["\\", "/"]],
Line 135... Line 164...
135
    this.VKI_layout.Belgian = [ // Belgian Standard Keyboard
164
    this.VKI_layout.Belgian = [ // Belgian Standard Keyboard
136
      [["\u00b2", "\u00b3"], ["&", "1", "|"], ["\u00e9", "2", "@"], ['"', "3", "#"], ["'", "4"], ["(", "5"], ["\u00a7", "6", "^"], ["\u00e8", "7"], ["!", "8"], ["\u00e7", "9", "{"], ["\u00e0", "0", "}"], [")", "\u00b0"], ["-", "_"], ["Bksp", "Bksp"]],
165
      [["\u00b2", "\u00b3"], ["&", "1", "|"], ["\u00e9", "2", "@"], ['"', "3", "#"], ["'", "4"], ["(", "5"], ["\u00a7", "6", "^"], ["\u00e8", "7"], ["!", "8"], ["\u00e7", "9", "{"], ["\u00e0", "0", "}"], [")", "\u00b0"], ["-", "_"], ["Bksp", "Bksp"]],
137
      [["Tab", "Tab"], ["a", "A"], ["z", "Z"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u005e", "\u00a8", "["], ["$", "*", "]"], ["Enter", "Enter"]],
166
      [["Tab", "Tab"], ["a", "A"], ["z", "Z"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u005e", "\u00a8", "["], ["$", "*", "]"], ["Enter", "Enter"]],
138
      [["Caps", "Caps"], ["q", "Q"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["m", "M"], ["\u00f9", "%", "\u00b4"], ["\u03bc", "\u00a3", "`"]],
167
      [["Caps", "Caps"], ["q", "Q"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["m", "M"], ["\u00f9", "%", "\u00b4"], ["\u03bc", "\u00a3", "`"]],
139
      [["Shift", "Shift"], ["<", ">", "\\"], ["w", "W"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], [",", "?"], [";", "."], [":", "/"], ["=", "+", "~"], ["Shift", "Shift"]],
168
      [["Shift", "Shift"], ["<", ">", "\\"], ["w", "W"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], [",", "?"], [";", "."], [":", "/"], ["=", "+", "~"], ["Shift", "Shift"]],
-
 
169
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
-
 
170
    ];
-
 
171
 
-
 
172
    this.VKI_layout.Bengali = [ // Bengali Standard Keyboard
-
 
173
      [[""], ["1", "", "\u09E7"], ["2", "", "\u09E8"], ["3", "\u09CD\u09B0", "\u09E9"], ["4", "\u09B0\u09CD", "\u09EA"], ["5", "\u099C\u09CD\u09B0", "\u09EB"], ["6", "\u09A4\u09CD\u09B7", "\u09EC"], ["7", "\u0995\u09CD\u09B0", "\u09ED"], ["8", "\u09B6\u09CD\u09B0", "\u09EE"], ["9", "(", "\u09EF"], ["0", ")", "\u09E6"], ["-", "\u0983"], ["\u09C3", "\u098B", "\u09E2", "\u09E0"], ["Bksp", "Bksp"]],
-
 
174
      [["Tab", "Tab"], ["\u09CC", "\u0994", "\u09D7"], ["\u09C8", "\u0990"], ["\u09BE", "\u0986"], ["\u09C0", "\u0988", "\u09E3", "\u09E1"], ["\u09C2", "\u098A"], ["\u09AC", "\u09AD"], ["\u09B9", "\u0999"], ["\u0997", "\u0998"], ["\u09A6", "\u09A7"], ["\u099C", "\u099D"], ["\u09A1", "\u09A2", "\u09DC", "\u09DD"], ["\u09BC", "\u099E"]],
-
 
175
      [["Caps", "Caps"], ["\u09CB", "\u0993", "\u09F4", "\u09F5"], ["\u09C7", "\u098F", "\u09F6", "\u09F7"], ["\u09CD", "\u0985", "\u09F8", "\u09F9"], ["\u09BF", "\u0987", "\u09E2", "\u098C"], ["\u09C1", "\u0989"], ["\u09AA", "\u09AB"], ["\u09B0", "", "\u09F0", "\u09F1"], ["\u0995", "\u0996"], ["\u09A4", "\u09A5"], ["\u099A", "\u099B"], ["\u099F", "\u09A0"], ["Enter", "Enter"]],
-
 
176
      [["Shift", "Shift"], [""], ["\u0982", "\u0981", "\u09FA"], ["\u09AE", "\u09A3"], ["\u09A8"], ["\u09AC"], ["\u09B2"], ["\u09B8", "\u09B6"], [",", "\u09B7"], [".", "{"], ["\u09AF", "\u09DF"], ["Shift", "Shift"]],
140
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
177
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
141
    ];
178
    ];
142
 
179
 
143
    this.VKI_layout['Bulgarian Ph'] = [ // Bulgarian Phonetic Keyboard
180
    this.VKI_layout['Bulgarian Ph'] = [ // Bulgarian Phonetic Keyboard
144
      [["\u0447", "\u0427"], ["1", "!"], ["2", "@"], ["3", "#"], ["4", "$"], ["5", "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
181
      [["\u0447", "\u0427"], ["1", "!"], ["2", "@"], ["3", "#"], ["4", "$"], ["5", "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
Line 160... Line 197...
160
     [[";", "\u00b0", "`", "~"], ["+", "1", "!"], ["\u011B", "2", "@"], ["\u0161", "3", "#"], ["\u010D", "4", "$"], ["\u0159", "5", "%"], ["\u017E", "6", "^"], ["\u00FD", "7", "&"], ["\u00E1", "8", "*"], ["\u00ED", "9", "("], ["\u00E9", "0", ")"], ["=", "%", "-", "_"], ["\u00B4", "\u02c7", "=", "+"], ["Bksp", "Bksp"]],
197
     [[";", "\u00b0", "`", "~"], ["+", "1", "!"], ["\u011B", "2", "@"], ["\u0161", "3", "#"], ["\u010D", "4", "$"], ["\u0159", "5", "%"], ["\u017E", "6", "^"], ["\u00FD", "7", "&"], ["\u00E1", "8", "*"], ["\u00ED", "9", "("], ["\u00E9", "0", ")"], ["=", "%", "-", "_"], ["\u00B4", "\u02c7", "=", "+"], ["Bksp", "Bksp"]],
161
     [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u20AC"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u00FA", "/", "[", "{"], [")", "(", "]", "}"], ["Enter", "Enter"]],
198
     [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u20AC"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u00FA", "/", "[", "{"], [")", "(", "]", "}"], ["Enter", "Enter"]],
162
     [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u016F", '"', ";", ":"], ["\u00A7", "!", "\u00a4", "^"], ["\u00A8", "'", "\\", "|"]],
199
     [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u016F", '"', ";", ":"], ["\u00A7", "!", "\u00a4", "^"], ["\u00A8", "'", "\\", "|"]],
163
     [["Shift", "Shift"], ["\\", "|", "", "\u02dd"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", "?", "<", "\u00d7"], [".", ":", ">", "\u00f7"], ["-", "_", "/", "?"], ["Shift", "Shift"]],
200
     [["Shift", "Shift"], ["\\", "|", "", "\u02dd"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", "?", "<", "\u00d7"], [".", ":", ">", "\u00f7"], ["-", "_", "/", "?"], ["Shift", "Shift"]],
164
     [[" ", " ", " ", " "], ["Alt", "Alt"]]
201
     [[" ", " ", " ", " "], ["Alt", "Alt"]]
-
 
202
    ];
-
 
203
 
-
 
204
    this.VKI_layout.Danish = [ // Danish Standard Keyboard
-
 
205
      [["\u00bd", "\u00a7"], ["1", "!"], ["2", '"', "@"], ["3", "#", "\u00a3"], ["4", "\u00a4", "$"], ["5", "%", "\u20ac"], ["6", "&"], ["7", "/", "{"], ["8", "(", "["], ["9", ")", "]"], ["0", "=", "}"], ["+", "?"], ["\u00b4", "`", "|"], ["Bksp", "Bksp"]],
-
 
206
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u00e5", "\u00c5"], ["\u00a8", "^", "~"], ["Enter", "Enter"]],
-
 
207
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u00e6", "\u00c6"], ["\u00f8", "\u00d8"], ["'", "*"]],
-
 
208
      [["Shift", "Shift"], ["<", ">", "\\"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M", "\u03bc", "\u039c"], [",", ";"], [".", ":"], ["-", "_"], ["Shift", "Shift"]],
-
 
209
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
165
    ];
210
    ];
166
 
211
 
167
    this.VKI_layout.Dutch = [ // Dutch Standard Keyboard
212
    this.VKI_layout.Dutch = [ // Dutch Standard Keyboard
168
      [["@", "\u00a7", "\u00ac"], ["1", "!", "\u00b9"], ["2", '"', "\u00b2"], ["3", "#", "\u00b3"], ["4", "$", "\u00bc"], ["5", "%", "\u00bd"], ["6", "&", "\u00be"], ["7", "_", "\u00a3"], ["8", "(", "{"], ["9", ")", "}"], ["0", "'"], ["/", "?", "\\"], ["\u00b0", "~", "\u00b8"], ["Bksp", "Bksp"]],
213
      [["@", "\u00a7", "\u00ac"], ["1", "!", "\u00b9"], ["2", '"', "\u00b2"], ["3", "#", "\u00b3"], ["4", "$", "\u00bc"], ["5", "%", "\u00bd"], ["6", "&", "\u00be"], ["7", "_", "\u00a3"], ["8", "(", "{"], ["9", ")", "}"], ["0", "'"], ["/", "?", "\\"], ["\u00b0", "~", "\u00b8"], ["Bksp", "Bksp"]],
169
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u20ac"], ["r", "R", "\u00b6"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u00a8", "^"], ["*", "|"], ["<", ">"]],
214
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u20ac"], ["r", "R", "\u00b6"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u00a8", "^"], ["*", "|"], ["<", ">"]],
170
      [["Caps", "Caps"], ["a", "A"], ["s", "S", "\u00df"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["+", "\u00b1"], ["\u00b4", "\u0060"], ["Enter", "Enter"]],
215
      [["Caps", "Caps"], ["a", "A"], ["s", "S", "\u00df"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["+", "\u00b1"], ["\u00b4", "\u0060"], ["Enter", "Enter"]],
171
      [["Shift", "Shift"], ["]", "[", "\u00a6"], ["z", "Z", "\u00ab"], ["x", "X", "\u00bb"], ["c", "C", "\u00a2"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M", "\u00b5"], [",", ";"], [".", ":", "\u00b7"], ["-", "="], ["Shift", "Shift"]],
216
      [["Shift", "Shift"], ["]", "[", "\u00a6"], ["z", "Z", "\u00ab"], ["x", "X", "\u00bb"], ["c", "C", "\u00a2"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M", "\u00b5"], [",", ";"], [".", ":", "\u00b7"], ["-", "="], ["Shift", "Shift"]],
172
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
217
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
173
    ];
218
    ];
174
 
219
 
175
    this.VKI_layout.Dvorak = [ // Dvorak Keyboard
220
    this.VKI_layout.Dvorak = [ // Dvorak Keyboard
176
      [["`", "~"], ["1", "!"], ["2", "@"], ["3", "#"], ["4", "$"], ["5", "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["[", "{"], ["]", "}"], ["Bksp", "Bksp"]],
221
      [["`", "~"], ["1", "!"], ["2", "@"], ["3", "#"], ["4", "$"], ["5", "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["[", "{"], ["]", "}"], ["Bksp", "Bksp"]],
177
      [["Tab", "Tab"],["'", '"'], [",", "<"], [".", ">"], ["p", "P"], ["y", "Y"], ["f", "F"], ["g", "G"], ["c", "C"], ["r", "R"], ["l", "L"], ["/", "?"], ["=", "+"], ["\\", "|"]],
222
      [["Tab", "Tab"],["'", '"'], [",", "<"], [".", ">"], ["p", "P"], ["y", "Y"], ["f", "F"], ["g", "G"], ["c", "C"], ["r", "R"], ["l", "L"], ["/", "?"], ["=", "+"], ["\\", "|"]],
178
      [["Caps", "Caps"], ["a", "A"], ["o", "O"], ["e", "E"], ["u", "U"], ["i", "I"], ["d", "D"], ["h", "H"], ["t", "T"], ["n", "N"], ["s", "S"], ["-", "_"], ["Enter", "Enter"]],
223
      [["Caps", "Caps"], ["a", "A"], ["o", "O"], ["e", "E"], ["u", "U"], ["i", "I"], ["d", "D"], ["h", "H"], ["t", "T"], ["n", "N"], ["s", "S"], ["-", "_"], ["Enter", "Enter"]],
179
      [["Shift", "Shift"], [";", ":"], ["q", "Q"], ["j", "J"], ["k", "K"], ["x", "X"], ["b", "B"], ["m", "M"], ["w", "W"], ["v", "V"], ["z", "Z"], ["Shift", "Shift"]],
224
      [["Shift", "Shift"], [";", ":"], ["q", "Q"], ["j", "J"], ["k", "K"], ["x", "X"], ["b", "B"], ["m", "M"], ["w", "W"], ["v", "V"], ["z", "Z"], ["Shift", "Shift"]],
180
      [[" ", " "]]
225
      [[" ", " "]]
181
    ];
226
    ];
182
 
227
 
183
    this.VKI_layout.Farsi = [ // Farsi Keyboard
228
    this.VKI_layout.Farsi = [ // Farsi Keyboard
184
      [["\u067e", "\u0651 "], ["1", "!", "\u00a1", "\u00b9"], ["2", "@", "\u00b2"], ["3", "#", "\u00b3"], ["4", "$", "\u00a4", "\u00a3"], ["5", "%", "\u20ac"], ["6", "^", "\u00bc"], ["7", "&", "\u00bd"], ["8", "*", "\u00be"], ["9", "(", "\u2018"], ["0", ")", "\u2019"], ["-", "_", "\u00a5"], ["=", "+", "\u00d7", "\u00f7"], ["Bksp", "Bksp"]],
229
      [["\u067e", "\u0651 "], ["1", "!", "\u00a1", "\u00b9"], ["2", "@", "\u00b2"], ["3", "#", "\u00b3"], ["4", "$", "\u00a4", "\u00a3"], ["5", "%", "\u20ac"], ["6", "^", "\u00bc"], ["7", "&", "\u00bd"], ["8", "*", "\u00be"], ["9", "(", "\u2018"], ["0", ")", "\u2019"], ["-", "_", "\u00a5"], ["=", "+", "\u00d7", "\u00f7"], ["Bksp", "Bksp"]],
185
      [["Tab", "Tab"], ["\u0636", "\u064e"], ["\u0635", "\u064b"], ["\u062b", "\u064f"], ["\u0642", "\u064c"], ["\u0641", "\u0644"], ["\u063a", "\u0625"], ["\u0639", "\u2018"], ["\u0647", "\u00f7"], ["\u062e", "\u00d7"], ["\u062d", "\u061b"], ["\u062c", "\u003c"], ["\u0686", "\u003e"], ["\u0698", "\u007c"]],
230
      [["Tab", "Tab"], ["\u0636", "\u064e"], ["\u0635", "\u064b"], ["\u062b", "\u064f"], ["\u0642", "\u064c"], ["\u0641", "\u0644"], ["\u063a", "\u0625"], ["\u0639", "\u2018"], ["\u0647", "\u00f7"], ["\u062e", "\u00d7"], ["\u062d", "\u061b"], ["\u062c", "\u003c"], ["\u0686", "\u003e"], ["\u0698", "\u007c"]],
186
      [["Caps", "Caps"], ["\u0634", "\u0650"], ["\u0633", "\u064d"], ["\u064a", "\u005d"], ["\u0628", "\u005b"], ["\u0644", "\u0644"], ["\u0627", "\u0623"], ["\u062a", "\u0640"], ["\u0646", "\u060c"], ["\u0645", "\u005c"], ["\u06af", "\u003a"], ["\u0643", "\u0022"], ["Enter", "Enter"]],
231
      [["Caps", "Caps"], ["\u0634", "\u0650"], ["\u0633", "\u064d"], ["\u064a", "\u005d"], ["\u0628", "\u005b"], ["\u0644", "\u0644"], ["\u0627", "\u0623"], ["\u062a", "\u0640"], ["\u0646", "\u060c"], ["\u0645", "\u005c"], ["\u06af", "\u003a"], ["\u0643", "\u0022"], ["Enter", "Enter"]],
187
      [["Shift", "Shift"], ["\u0626", "\u007e"], ["\u0621", "\u0652"], ["\u0632", "\u007d"], ["\u0631", "\u007b"], ["\u0630", "\u0644"], ["\u062f", "\u0622"], ["\u0626", "\u0621"], ["\u0648", "\u002c"], [".", "\u002e"], ["/", "\u061f"], ["Shift", "Shift"]],
232
      [["Shift", "Shift"], ["\u0626", "\u007e"], ["\u0621", "\u0652"], ["\u0632", "\u007d"], ["\u0631", "\u007b"], ["\u0630", "\u0644"], ["\u062f", "\u0622"], ["\u0626", "\u0621"], ["\u0648", "\u002c"], [".", "\u002e"], ["/", "\u061f"], ["Shift", "Shift"]],
188
      [[" ", " ", " ", " "], ["Alt", "Alt"]]
233
      [[" ", " ", " ", " "], ["Alt", "Alt"]]
189
    ];
234
    ];
190
 
235
 
191
    this.VKI_layout.French = [ // French Standard Keyboard
236
    this.VKI_layout.French = [ // French Standard Keyboard
192
      [["\u00b2", "\u00b3"], ["&", "1"], ["\u00e9", "2", "~"], ['"', "3", "#"], ["'", "4", "{"], ["(", "5", "["], ["-", "6", "|"], ["\u00e8", "7", "\u0060"], ["_", "8", "\\"], ["\u00e7", "9", "\u005e"], ["\u00e0", "0", "\u0040"], [")", "\u00b0", "]"], ["=", "+", "}"], ["Bksp", "Bksp"]],
237
      [["\u00b2", "\u00b3"], ["&", "1"], ["\u00e9", "2", "~"], ['"', "3", "#"], ["'", "4", "{"], ["(", "5", "["], ["-", "6", "|"], ["\u00e8", "7", "\u0060"], ["_", "8", "\\"], ["\u00e7", "9", "\u005e"], ["\u00e0", "0", "\u0040"], [")", "\u00b0", "]"], ["=", "+", "}"], ["Bksp", "Bksp"]],
193
      [["Tab", "Tab"], ["a", "A"], ["z", "Z"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["^", "\u00a8"], ["$", "\u00a3", "\u00a4"], ["Enter", "Enter"]],
238
      [["Tab", "Tab"], ["a", "A"], ["z", "Z"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["^", "\u00a8"], ["$", "\u00a3", "\u00a4"], ["Enter", "Enter"]],
194
      [["Caps", "Caps"], ["q", "Q"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["m", "M"], ["\u00f9", "%"], ["*", "\u03bc"]],
239
      [["Caps", "Caps"], ["q", "Q"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["m", "M"], ["\u00f9", "%"], ["*", "\u03bc"]],
195
      [["Shift", "Shift"], ["<", ">"], ["w", "W"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], [",", "?"], [";", "."], [":", "/"], ["!", "\u00a7"], ["Shift", "Shift"]],
240
      [["Shift", "Shift"], ["<", ">"], ["w", "W"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], [",", "?"], [";", "."], [":", "/"], ["!", "\u00a7"], ["Shift", "Shift"]],
196
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
241
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
197
    ];
242
    ];
198
 
243
 
199
    this.VKI_layout.German = [ // German Standard Keyboard
244
    this.VKI_layout.German = [ // German Standard Keyboard
200
      [["\u005e", "\u00b0"], ["1", "!"], ["2", '"', "\u00b2"], ["3", "\u00a7", "\u00b3"], ["4", "$"], ["5", "%"], ["6", "&"], ["7", "/", "{"], ["8", "(", "["], ["9", ")", "]"], ["0", "=", "}"], ["\u00df", "?", "\\"], ["\u00b4", "\u0060"], ["Bksp", "Bksp"]],
245
      [["\u005e", "\u00b0"], ["1", "!"], ["2", '"', "\u00b2"], ["3", "\u00a7", "\u00b3"], ["4", "$"], ["5", "%"], ["6", "&"], ["7", "/", "{"], ["8", "(", "["], ["9", ")", "]"], ["0", "=", "}"], ["\u00df", "?", "\\"], ["\u00b4", "\u0060"], ["Bksp", "Bksp"]],
201
      [["Tab", "Tab"], ["q", "Q", "\u0040"], ["w", "W"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["z", "Z"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u00fc", "\u00dc"], ["+", "*", "~"], ["Enter", "Enter"]],
246
      [["Tab", "Tab"], ["q", "Q", "\u0040"], ["w", "W"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["z", "Z"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u00fc", "\u00dc"], ["+", "*", "~"], ["Enter", "Enter"]],
202
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u00f6", "\u00d6"], ["\u00e4", "\u00c4"], ["#", "'"]],
247
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u00f6", "\u00d6"], ["\u00e4", "\u00c4"], ["#", "'"]],
203
      [["Shift", "Shift"], ["<", ">", "\u00a6"], ["y", "Y"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M", "\u00b5"], [",", ";"], [".", ":"], ["-", "_"], ["Shift", "Shift"]],
248
      [["Shift", "Shift"], ["<", ">", "\u00a6"], ["y", "Y"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M", "\u00b5"], [",", ";"], [".", ":"], ["-", "_"], ["Shift", "Shift"]],
204
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
249
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
205
    ];
250
    ];
206
 
251
 
207
    this.VKI_layout.Greek = [ // Greek Standard Keyboard
252
    this.VKI_layout.Greek = [ // Greek Standard Keyboard
208
      [["`", "~"], ["1", "!"], ["2", "@", "\u00b2"], ["3", "#", "\u00b3"], ["4", "$", "\u00a3"], ["5", "%", "\u00a7"], ["6", "^", "\u00b6"], ["7", "&"], ["8", "*", "\u00a4"], ["9", "(", "\u00a6"], ["0", ")", "\u00ba"], ["-", "_", "\u00b1"], ["=", "+", "\u00bd"], ["Bksp", "Bksp"]],
253
      [["`", "~"], ["1", "!"], ["2", "@", "\u00b2"], ["3", "#", "\u00b3"], ["4", "$", "\u00a3"], ["5", "%", "\u00a7"], ["6", "^", "\u00b6"], ["7", "&"], ["8", "*", "\u00a4"], ["9", "(", "\u00a6"], ["0", ")", "\u00ba"], ["-", "_", "\u00b1"], ["=", "+", "\u00bd"], ["Bksp", "Bksp"]],
209
      [["Tab", "Tab"], [";", ":"], ["\u03c2", "^"], ["\u03b5", "\u0395"], ["\u03c1", "\u03a1"], ["\u03c4", "\u03a4"], ["\u03c5", "\u03a5"], ["\u03b8", "\u0398"], ["\u03b9", "\u0399"], ["\u03bf", "\u039f"], ["\u03c0", "\u03a0"], ["[", "{", "\u201c"], ["]", "}", "\u201d"], ["Enter", "Enter"]],
254
      [["Tab", "Tab"], [";", ":"], ["\u03c2", "^"], ["\u03b5", "\u0395"], ["\u03c1", "\u03a1"], ["\u03c4", "\u03a4"], ["\u03c5", "\u03a5"], ["\u03b8", "\u0398"], ["\u03b9", "\u0399"], ["\u03bf", "\u039f"], ["\u03c0", "\u03a0"], ["[", "{", "\u201c"], ["]", "}", "\u201d"], ["Enter", "Enter"]],
210
      [["Caps", "Caps"], ["\u03b1", "\u0391"], ["\u03c3", "\u03a3"], ["\u03b4", "\u0394"], ["\u03c6", "\u03a6"], ["\u03b3", "\u0393"], ["\u03b7", "\u0397"], ["\u03be", "\u039e"], ["\u03ba", "\u039a"], ["\u03bb", "\u039b"], ["\u0384", "\u00a8", "\u0385"], ["'", '"'], ["\\", "|", "\u00ac"]],
255
      [["Caps", "Caps"], ["\u03b1", "\u0391"], ["\u03c3", "\u03a3"], ["\u03b4", "\u0394"], ["\u03c6", "\u03a6"], ["\u03b3", "\u0393"], ["\u03b7", "\u0397"], ["\u03be", "\u039e"], ["\u03ba", "\u039a"], ["\u03bb", "\u039b"], ["\u0384", "\u00a8", "\u0385"], ["'", '"'], ["\\", "|", "\u00ac"]],
211
      [["Shift", "Shift"], ["<", ">"], ["\u03b6", "\u0396"], ["\u03c7", "\u03a7"], ["\u03c8", "\u03a8"], ["\u03c9", "\u03a9"], ["\u03b2", "\u0392"], ["\u03bd", "\u039d"], ["\u03bc", "\u039c"], [",", "<"], [".", ">"], ["/", "?"], ["Shift", "Shift"]],
256
      [["Shift", "Shift"], ["<", ">"], ["\u03b6", "\u0396"], ["\u03c7", "\u03a7"], ["\u03c8", "\u03a8"], ["\u03c9", "\u03a9"], ["\u03b2", "\u0392"], ["\u03bd", "\u039d"], ["\u03bc", "\u039c"], [",", "<"], [".", ">"], ["/", "?"], ["Shift", "Shift"]],
212
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
257
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
213
    ];
258
    ];
214
 
259
 
215
    this.VKI_layout.Hebrew = [ // Hebrew Standard Keyboard
260
    this.VKI_layout.Hebrew = [ // Hebrew Standard Keyboard
216
      [["~", "`"], ["1", "!"], ["2", "@"], ["3", "#"], ["4" , "$", "\u20aa"], ["5" , "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", ")"], ["0", "("], ["-", "_"], ["=", "+"], ["\\", "|"], ["Bksp", "Bksp"]],
261
      [["~", "`"], ["1", "!"], ["2", "@"], ["3", "#"], ["4" , "$", "\u20aa"], ["5" , "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", ")"], ["0", "("], ["-", "_"], ["=", "+"], ["\\", "|"], ["Bksp", "Bksp"]],
217
      [["Tab", "Tab"], ["/", "Q"], ["'", "W"], ["\u05e7", "E", "\u20ac"], ["\u05e8", "R"], ["\u05d0", "T"], ["\u05d8", "Y"], ["\u05d5", "U", "\u05f0"], ["\u05df", "I"], ["\u05dd", "O"], ["\u05e4", "P"], ["]", "}"], ["[", "{"]],
262
      [["Tab", "Tab"], ["/", "Q"], ["'", "W"], ["\u05e7", "E", "\u20ac"], ["\u05e8", "R"], ["\u05d0", "T"], ["\u05d8", "Y"], ["\u05d5", "U", "\u05f0"], ["\u05df", "I"], ["\u05dd", "O"], ["\u05e4", "P"], ["]", "}"], ["[", "{"]],
218
      [["Caps", "Caps"], ["\u05e9", "A"], ["\u05d3", "S"], ["\u05d2", "D"], ["\u05db", "F"], ["\u05e2", "G"], ["\u05d9", "H", "\u05f2"], ["\u05d7", "J", "\u05f1"], ["\u05dc", "K"], ["\u05da", "L"], ["\u05e3", ":"], ["," , '"'], ["Enter", "Enter"]],
263
      [["Caps", "Caps"], ["\u05e9", "A"], ["\u05d3", "S"], ["\u05d2", "D"], ["\u05db", "F"], ["\u05e2", "G"], ["\u05d9", "H", "\u05f2"], ["\u05d7", "J", "\u05f1"], ["\u05dc", "K"], ["\u05da", "L"], ["\u05e3", ":"], ["," , '"'], ["Enter", "Enter"]],
219
      [["Shift", "Shift"], ["\u05d6", "Z"], ["\u05e1", "X"], ["\u05d1", "C"], ["\u05d4", "V"], ["\u05e0", "B"], ["\u05de", "N"], ["\u05e6", "M"], ["\u05ea", ">"], ["\u05e5", "<"], [".", "?"], ["Shift", "Shift"]],
264
      [["Shift", "Shift"], ["\u05d6", "Z"], ["\u05e1", "X"], ["\u05d1", "C"], ["\u05d4", "V"], ["\u05e0", "B"], ["\u05de", "N"], ["\u05e6", "M"], ["\u05ea", ">"], ["\u05e5", "<"], [".", "?"], ["Shift", "Shift"]],
-
 
265
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
-
 
266
    ];
-
 
267
 
-
 
268
    this.VKI_layout.Hindi = [ // Hindi Traditional Keyboard
-
 
269
      [["\u200d", "\u200c", "`", "~"], ["1", "\u090D", "\u0967", "!"], ["2", "\u0945", "\u0968", "@"], ["3", "\u094D\u0930", "\u0969", "#"], ["4", "\u0930\u094D", "\u096A", "$"], ["5", "\u091C\u094D\u091E", "\u096B", "%"], ["6", "\u0924\u094D\u0930", "\u096C", "^"], ["7", "\u0915\u094D\u0937", "\u096D", "&"], ["8", "\u0936\u094D\u0930", "\u096E", "*"], ["9", "(", "\u096F", "("], ["0", ")", "\u0966", ")"], ["-", "\u0903", "-", "_"], ["\u0943", "\u090B", "=", "+"], ["Bksp", "Bksp"]],
-
 
270
      [["Tab", "Tab"], ["\u094C", "\u0914"], ["\u0948", "\u0910"], ["\u093E", "\u0906"], ["\u0940", "\u0908"], ["\u0942", "\u090A"], ["\u092C", "\u092D"], ["\u0939", "\u0919"], ["\u0917", "\u0918"], ["\u0926", "\u0927"], ["\u091C", "\u091D"], ["\u0921", "\u0922", "[", "{"], ["\u093C", "\u091E", "]", "}"], ["Enter", "Enter"]],
-
 
271
      [["Caps", "Caps"], ["\u094B", "\u0913"], ["\u0947", "\u090F"], ["\u094D", "\u0905"], ["\u093F", "\u0907"], ["\u0941", "\u0909"], ["\u092A", "\u092B"], ["\u0930", "\u0931"], ["\u0915", "\u0916"], ["\u0924", "\u0925"], ["\u091A", "\u091B", ";", ":"], ["\u091F", "\u0920", "'", '"'], ["\u0949", "\u0911", "\\", "|"]],
-
 
272
      [["Shift", "Shift"], [""], ["\u0902", "\u0901", "", "\u0950"], ["\u092E", "\u0923"], ["\u0928"], ["\u0935"], ["\u0932", "\u0933"], ["\u0938", "\u0936"], [",", "\u0937", ",", "<"], [".", "\u0964", ".", ">"], ["\u092F", "\u095F", "/", "?"], ["Shift", "Shift"]],
220
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
273
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
221
    ];
274
    ];
222
 
275
 
223
    this.VKI_layout.Hungarian = [ // Hungarian Standard Keyboard
276
    this.VKI_layout.Hungarian = [ // Hungarian Standard Keyboard
224
      [["0", "\u00a7"], ["1", "'", "\u007e"], ["2", '"', "\u02c7"], ["3", "+", "\u02c6"], ["4", "!", "\u02d8"], ["5", "%", "\u00b0"], ["6", "/", "\u02db"], ["7", "=", "\u0060"], ["8", "(", "\u02d9"], ["9", ")", "\u00b4"], ["\u00f6", "\u00d6", "\u02dd"], ["\u00fc", "\u00dc", "\u00a8"], ["\u00f3", "\u00d3", "\u00b8"], ["Bksp", "Bksp"]],
277
      [["0", "\u00a7"], ["1", "'", "\u007e"], ["2", '"', "\u02c7"], ["3", "+", "\u02c6"], ["4", "!", "\u02d8"], ["5", "%", "\u00b0"], ["6", "/", "\u02db"], ["7", "=", "\u0060"], ["8", "(", "\u02d9"], ["9", ")", "\u00b4"], ["\u00f6", "\u00d6", "\u02dd"], ["\u00fc", "\u00dc", "\u00a8"], ["\u00f3", "\u00d3", "\u00b8"], ["Bksp", "Bksp"]],
225
      [["Tab", "Tab"], ["q", "Q", "\u005c"], ["w", "W", "\u007c"], ["e", "E", "\u00c4"], ["r", "R"], ["t", "T"], ["z", "Z"], ["u", "U", "\u20ac"], ["i", "I", "\u00cd"], ["o", "O"], ["p", "P"], ["\u0151", "\u0150", "\u00f7"], ["\u00fa", "\u00da", "\u00d7"], ["Enter", "Enter"]],
278
      [["Tab", "Tab"], ["q", "Q", "\u005c"], ["w", "W", "\u007c"], ["e", "E", "\u00c4"], ["r", "R"], ["t", "T"], ["z", "Z"], ["u", "U", "\u20ac"], ["i", "I", "\u00cd"], ["o", "O"], ["p", "P"], ["\u0151", "\u0150", "\u00f7"], ["\u00fa", "\u00da", "\u00d7"], ["Enter", "Enter"]],
226
      [["Caps", "Caps"], ["a", "A", "\u00e4"], ["s", "S","\u0111"], ["d", "D","\u0110"], ["f", "F","\u005b"], ["g", "G","\u005d"], ["h", "H"], ["j", "J","\u00ed"], ["k", "K","\u0141"], ["l", "L","\u0142"], ["\u00e9", "\u00c9","\u0024"], ["\u00e1", "\u00c1","\u00df"], ["\u0171", "\u0170","\u00a4"]],
279
      [["Caps", "Caps"], ["a", "A", "\u00e4"], ["s", "S","\u0111"], ["d", "D","\u0110"], ["f", "F","\u005b"], ["g", "G","\u005d"], ["h", "H"], ["j", "J","\u00ed"], ["k", "K","\u0141"], ["l", "L","\u0142"], ["\u00e9", "\u00c9","\u0024"], ["\u00e1", "\u00c1","\u00df"], ["\u0171", "\u0170","\u00a4"]],
227
      [["Shift", "Shift"], ["\u00ed", "\u00cd","\u003c"], ["y", "Y","\u003e"], ["x", "X","\u0023"], ["c", "C","\u0026"], ["v", "V","\u0040"], ["b", "B","\u007b"], ["n", "N","\u007d"], ["m", "M","\u003c"], [",", "?","\u003b"], [".", ":","\u003e"], ["-", "_","\u002a"], ["Shift", "Shift"]],
280
      [["Shift", "Shift"], ["\u00ed", "\u00cd","\u003c"], ["y", "Y","\u003e"], ["x", "X","\u0023"], ["c", "C","\u0026"], ["v", "V","\u0040"], ["b", "B","\u007b"], ["n", "N","\u007d"], ["m", "M","\u003c"], [",", "?","\u003b"], [".", ":","\u003e"], ["-", "_","\u002a"], ["Shift", "Shift"]],
228
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
281
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
229
    ];
282
    ];
230
 
283
 
231
    this.VKI_layout.Italian = [ // Italian Standard Keyboard
284
    this.VKI_layout.Italian = [ // Italian Standard Keyboard
232
      [["\u005c", "\u007c"], ["1", "!"], ["2", '"'], ["3", "\u00a3"], ["4", "$", "\u20ac"], ["5", "%"], ["6", "&"], ["7", "/"], ["8", "("], ["9", ")"], ["0", "="], ["'", "?"], ["\u00ec", "\u005e"], ["Bksp", "Bksp"]],
285
      [["\u005c", "\u007c"], ["1", "!"], ["2", '"'], ["3", "\u00a3"], ["4", "$", "\u20ac"], ["5", "%"], ["6", "&"], ["7", "/"], ["8", "("], ["9", ")"], ["0", "="], ["'", "?"], ["\u00ec", "\u005e"], ["Bksp", "Bksp"]],
233
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u00e8", "\u00e9", "[", "{"], ["+", "*", "]", "}"], ["Enter", "Enter"]],
286
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u00e8", "\u00e9", "[", "{"], ["+", "*", "]", "}"], ["Enter", "Enter"]],
234
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u00f2", "\u00e7", "@"], ["\u00e0", "\u00b0", "#"], ["\u00f9", "\u00a7"]],
287
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u00f2", "\u00e7", "@"], ["\u00e0", "\u00b0", "#"], ["\u00f9", "\u00a7"]],
235
      [["Shift", "Shift"], ["<", ">"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", ";"], [".", ":"], ["-", "_"], ["Shift", "Shift"]],
288
      [["Shift", "Shift"], ["<", ">"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", ";"], [".", ":"], ["-", "_"], ["Shift", "Shift"]],
236
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
289
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
-
 
290
    ];
-
 
291
 
-
 
292
    this.VKI_layout.Kazakh = [ // Kazakh Standard Keyboard
-
 
293
      [["(", ")"], ['"', "!"], ["\u04d9", "\u04d8"], ["\u0456", "\u0406"], ["\u04a3", "\u04a2"], ["\u0493", "\u0492"], [",", ";"], [".", ":"], ["\u04af", "\u04ae"], ["\u04b1", "\u04b0"], ["\u049b", "\u049a"], ["\u04e9", "\u04e8"], ["\u04bb", "\u04ba"], ["Bksp", "Bksp"]],
-
 
294
      [["Tab", "Tab"], ["\u0439", "\u0419"], ["\u0446", "\u0426"], ["\u0443", "\u0423"], ["\u043A", "\u041A"], ["\u0435", "\u0415"], ["\u043D", "\u041D"], ["\u0433", "\u0413"], ["\u0448", "\u0428"], ["\u0449", "\u0429"], ["\u0437", "\u0417"], ["\u0445", "\u0425"], ["\u044A", "\u042A"], ["\\", "/"]],
-
 
295
      [["Caps", "Caps"], ["\u0444", "\u0424"], ["\u044B", "\u042B"], ["\u0432", "\u0412"], ["\u0430", "\u0410"], ["\u043F", "\u041F"], ["\u0440", "\u0420"], ["\u043E", "\u041E"], ["\u043B", "\u041B"], ["\u0434", "\u0414"], ["\u0436", "\u0416"], ["\u044D", "\u042D"], ["Enter", "Enter"]],
-
 
296
      [["Shift", "Shift"], ["\\", "|"], ["\u044F", "\u042F"], ["\u0447", "\u0427"], ["\u0441", "\u0421"], ["\u043C", "\u041C"], ["\u0438", "\u0418"], ["\u0442", "\u0422"], ["\u044C", "\u042C"], ["\u0431", "\u0411"], ["\u044E", "\u042E"], ["\u2116", "?"], ["Shift", "Shift"]],
-
 
297
      [[" ", " "]]
237
    ];
298
    ];
238
 
299
 
239
    this.VKI_layout.Lithuanian = [ // Lithuanian Standard Keyboard
300
    this.VKI_layout.Lithuanian = [ // Lithuanian Standard Keyboard
240
      [["`", "~"], ["\u0105", "\u0104"], ["\u010D", "\u010C"], ["\u0119", "\u0118"], ["\u0117", "\u0116"], ["\u012F", "\u012E"], ["\u0161", "\u0160"], ["\u0173", "\u0172"], ["\u016B", "\u016A"], ["\u201E", "("], ["\u201C", ")"], ["-", "_"], ["\u017E", "\u017D"], ["Bksp", "Bksp"]],
301
      [["`", "~"], ["\u0105", "\u0104"], ["\u010D", "\u010C"], ["\u0119", "\u0118"], ["\u0117", "\u0116"], ["\u012F", "\u012E"], ["\u0161", "\u0160"], ["\u0173", "\u0172"], ["\u016B", "\u016A"], ["\u201E", "("], ["\u201C", ")"], ["-", "_"], ["\u017E", "\u017D"], ["Bksp", "Bksp"]],
241
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["[", "{"], ["]", "}"], ["Enter", "Enter"]],
302
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["[", "{"], ["]", "}"], ["Enter", "Enter"]],
242
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], [";", ":"], ["'", '"'], ["\\", "|"]],
303
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], [";", ":"], ["'", '"'], ["\\", "|"]],
243
      [["Shift", "Shift"], ["\u2013", "\u20AC"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", "<"], [".", ">"], ["/", "?"], ["Shift", "Shift"]],
304
      [["Shift", "Shift"], ["\u2013", "\u20AC"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", "<"], [".", ">"], ["/", "?"], ["Shift", "Shift"]],
244
      [[" ", " "]]
305
      [[" ", " "]]
-
 
306
    ];
-
 
307
 
-
 
308
    this.VKI_layout.Macedonian = [ // Macedonian Cyrillic Standard Keyboard
-
 
309
      [["`", "~"], ["1", "!"], ["2", "\u201E"], ["3", "\u201C"], ["4", "\u2019"], ["5", "%"], ["6", "\u2018"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
-
 
310
      [["Tab", "Tab"], ["\u0459", "\u0409"], ["\u045A", "\u040A"], ["\u0435", "\u0415", "\u20AC"], ["\u0440", "\u0420"], ["\u0442", "\u0422"], ["\u0455", "\u0405"], ["\u0443", "\u0423"], ["\u0438", "\u0418"], ["\u043E", "\u041E"], ["\u043F", "\u041F"], ["\u0448", "\u0428", "\u0402"], ["\u0453", "\u0403", "\u0452"], ["Enter", "Enter"]],
-
 
311
      [["Caps", "Caps"], ["\u0430", "\u0410"], ["\u0441", "\u0421"], ["\u0434", "\u0414"], ["\u0444", "\u0424", "["], ["\u0433", "\u0413", "]"], ["\u0445", "\u0425"], ["\u0458", "\u0408"], ["\u043A", "\u041A"], ["\u043B", "\u041B"], ["\u0447", "\u0427", "\u040B"], ["\u045C", "\u040C", "\u045B"], ["\u0436", "\u0416"]],
-
 
312
      [["Shift", "Shift"], ["\u0451", "\u0401"], ["\u0437", "\u0417"], ["\u045F", "\u040F"], ["\u0446", "\u0426"], ["\u0432", "\u0412", "@"], ["\u0431", "\u0411", "{"], ["\u043D", "\u041D", "}"], ["\u043C", "\u041C", "\u00A7"], [",", ";"], [".", ":"], ["/", "?"], ["Shift", "Shift"]],
-
 
313
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
245
    ];
314
    ];
246
 
315
 
247
    this.VKI_layout.Norwegian = [ // Norwegian Standard Keyboard
316
    this.VKI_layout.Norwegian = [ // Norwegian Standard Keyboard
248
      [["|", "\u00a7"], ["1", "!"], ["2", '"', "@"], ["3", "#", "\u00a3"], ["4", "\u00a4", "$"], ["5", "%"], ["6", "&"], ["7", "/", "{"], ["8", "(", "["], ["9", ")", "]"], ["0", "=", "}"], ["+", "?"], ["\\", "`", "\u00b4"], ["Bksp", "Bksp"]],
317
      [["|", "\u00a7"], ["1", "!"], ["2", '"', "@"], ["3", "#", "\u00a3"], ["4", "\u00a4", "$"], ["5", "%"], ["6", "&"], ["7", "/", "{"], ["8", "(", "["], ["9", ")", "]"], ["0", "=", "}"], ["+", "?"], ["\\", "`", "\u00b4"], ["Bksp", "Bksp"]],
249
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u00e5", "\u00c5"], ["\u00a8", "^", "~"], ["Enter", "Enter"]],
318
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u00e5", "\u00c5"], ["\u00a8", "^", "~"], ["Enter", "Enter"]],
250
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u00f8", "\u00d8"], ["\u00e6", "\u00c6"], ["'", "*"]],
319
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u00f8", "\u00d8"], ["\u00e6", "\u00c6"], ["'", "*"]],
251
      [["Shift", "Shift"], ["<", ">"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M", "\u03bc", "\u039c"], [",", ";"], [".", ":"], ["-", "_"], ["Shift", "Shift"]],
320
      [["Shift", "Shift"], ["<", ">"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M", "\u03bc", "\u039c"], [",", ";"], [".", ":"], ["-", "_"], ["Shift", "Shift"]],
252
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
321
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
253
    ];
322
    ];
254
 
323
 
255
    this.VKI_layout.Numpad = [ // Number pad
324
    this.VKI_layout.Numpad = [ // Number pad
256
      [["$"], ["\u00a3"], ["\u20ac"], ["\u00a5"], ["/"], ["^"], ["Bksp", "Bksp"]],
325
      [["$"], ["\u00a3"], ["\u20ac"], ["\u00a5"], ["/"], ["^"], ["Bksp", "Bksp"]],
257
      [["."], ["7"], ["8"], ["9"], ["*"], ["<"], ["("], ["["]],
326
      [["."], ["7"], ["8"], ["9"], ["*"], ["<"], ["("], ["["]],
258
      [["="], ["4"], ["5"], ["6"], ["-"], [">"], [")"], ["]"]],
327
      [["="], ["4"], ["5"], ["6"], ["-"], [">"], [")"], ["]"]],
259
      [["0"], ["1"], ["2"], ["3"], ["+"], ["Enter", "Enter"]],
328
      [["0"], ["1"], ["2"], ["3"], ["+"], ["Enter", "Enter"]],
260
      [[" "]]
329
      [[" "]]
261
    ];
330
    ];
262
    this.VKI_layoutDDK.Numpad = true;
331
    this.VKI_layout.Numpad.DDK = true;
-
 
332
 
-
 
333
    this.VKI_layout.Pashto = [ // Pashto Keyboard
-
 
334
      [["\u200d", "\u00f7"], ["\u06f1", "\u0021", "\u0060"], ["\u06f2", "\u066c", "\u0040"], ["\u06f3", "\u066b", "\u066b"], ["\u06f4", "\u00a4", "\u00a3"], ["\u06f5", "\u066a", "\u0025"], ["\u06f6", "\u00d7", "\u005e"], ["\u06f7", "\u00ab", "\u0026"], ["\u06f8", "\u00bb", "\u002a"], ["\u06f9", "(", "\ufdf2"], ["\u06f0", ")", "\ufefb"], ["\u002d", "\u0640", "\u005f"], ["\u003d", "\u002b", "\ufe87", "\u00f7"], ["Bksp", "Bksp"]],
-
 
335
      [["Tab", "Tab"], ["\u0636", "\u0652", "\u06d5"], ["\u0635", "\u064c", "\u0653"], ["\u062b", "\u064d", "\u20ac"], ["\u0642", "\u064b", "\ufef7"], ["\u0641", "\u064f", "\ufef5"], ["\u063a", "\u0650", "\u0027"], ["\u0639", "\u064e", "\ufe84"], ["\u0647", "\u0651", "\u0670"], ["\u062e", "\u0685", "\u0027"], ["\u062d", "\u0681", "\u0022"], ["\u062c", "\u005b", "\u007b"], ["\u0686", "\u005d", "\u007d"], ["\u005c", "\u066d", "\u007c"]],
-
 
336
      [["Caps", "Caps"], ["\u0634", "\u069a", "\ufbb0"], ["\u0633", "\u0626", "\ufe87"], ["\u06cc", "\u064a", "\u06d2"], ["\u0628", "\u067e", "\u06ba"], ["\u0644", "\u0623", "\u06b7"], ["\u0627", "\u0622", "\u0671"], ["\u062a", "\u067c", "\u0679"], ["\u0646", "\u06bc", "\u003c"], ["\u0645", "\u0629", "\u003e"], ["\u06a9", "\u003a", "\u0643"], ["\u06af", "\u061b", "\u06ab"], ["Enter", "Enter"]],
-
 
337
      [["Shift", "Shift"], ["\u06cd", "\u0638", "\u003b"], ["\u06d0", "\u0637", "\ufbb0"], ["\u0632", "\u0698", "\u0655"], ["\u0631", "\u0621", "\u0654"], ["\u0630", "\u200c", "\u0625"], ["\u062f", "\u0689", "\u0688"], ["\u0693", "\u0624", "\u0691"], ["\u0648", "\u060c", "\u002c"], ["\u0696", "\u002e", "\u06c7"], ["\u002f", "\u061f", "\u06c9"], ["Shift", "Shift", "\u064d"]],
-
 
338
      [[" ", " ", " ", " "], ["Alt", "Alt"]]
-
 
339
    ];
-
 
340
 
-
 
341
    this.VKI_layout.Pinyin = [ // Pinyin Keyboard
-
 
342
      [["`", "~", "\u4e93", "\u301C"], ["1", "!", "\uFF62"], ["2", "@", "\uFF63"], ["3", "#", "\u301D"], ["4", "$", "\u301E"], ["5", "%", "\u301F"], ["6", "^", "\u3008"], ["7", "&", "\u3009"], ["8", "*", "\u302F"], ["9", "(", "\u300A"], ["0", ")", "\u300B"], ["-", "_", "\u300E"], ["=", "+", "\u300F"], ["Bksp", "Bksp"]],
-
 
343
      [["Tab", "Tab"], ["q", "Q", "\u0101", "\u0100"], ["w", "W", "\u00E1", "\u00C1"], ["e", "E", "\u01CE", "\u01CD"], ["r", "R", "\u00E0", "\u00C0"], ["t", "T", "\u0113", "\u0112"], ["y", "Y", "\u00E9", "\u00C9"], ["u", "U", "\u011B", "\u011A"], ["i", "I", "\u00E8", "\u00C8"], ["o", "O", "\u012B", "\u012A"], ["p", "P", "\u00ED", "\u00CD"], ["[", "{", "\u01D0", "\u01CF"], ["]", "}", "\u00EC", "\u00CC"], ["\\", "|", "\u3020"]],
-
 
344
      [["Caps", "Caps"], ["a", "A", "\u014D", "\u014C"], ["s", "S", "\u00F3", "\u00D3"], ["d", "D", "\u01D2", "\u01D1"], ["f", "F", "\u00F2", "\u00D2"], ["g", "G", "\u00fc", "\u00dc"], ["h", "H", "\u016B", "\u016A"], ["j", "J", "\u00FA", "\u00DA"], ["k", "K", "\u01D4", "\u01D3"], ["l", "L", "\u00F9", "\u00D9"], [";", ":"], ["'", '"'], ["Enter", "Enter"]],
-
 
345
      [["Shift", "Shift"], ["z", "Z", "\u01D6", "\u01D5"], ["x", "X", "\u01D8", "\u01D7"], ["c", "C", "\u01DA", "\u01D9"], ["v", "V", "\u01DC", "\u01DB"], ["b", "B"], ["n", "N"], ["m", "M"], [",", "<", "\u3001"], [".", ">", "\u3002"], ["/", "?"], ["Shift", "Shift"]],
-
 
346
      [["AltLk", "AltLk"], [" ", " ", " ", " "], ["Alt", "Alt"]]
-
 
347
    ];
263
 
348
 
264
    this.VKI_layout["Polish Prog"] = [ // Polish Programmers Keyboard
349
    this.VKI_layout["Polish Prog"] = [ // Polish Programmers Keyboard
265
      [["`", "~"], ["1", "!"], ["2", "@"], ["3", "#"], ["4", "$"], ["5", "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
350
      [["`", "~"], ["1", "!"], ["2", "@"], ["3", "#"], ["4", "$"], ["5", "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
266
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u0119", "\u0118"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O", "\u00f3", "\u00d3"], ["p", "P"], ["[", "{"], ["]", "}"], ["\\", "|"]],
351
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u0119", "\u0118"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O", "\u00f3", "\u00d3"], ["p", "P"], ["[", "{"], ["]", "}"], ["\\", "|"]],
267
      [["Caps", "Caps"], ["a", "A", "\u0105", "\u0104"], ["s", "S", "\u015b", "\u015a"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L", "\u0142", "\u0141"], [";", ":"], ["'", '"'], ["Enter", "Enter"]],
352
      [["Caps", "Caps"], ["a", "A", "\u0105", "\u0104"], ["s", "S", "\u015b", "\u015a"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L", "\u0142", "\u0141"], [";", ":"], ["'", '"'], ["Enter", "Enter"]],
268
      [["Shift", "Shift"], ["z", "Z", "\u017c", "\u017b"], ["x", "X", "\u017a", "\u0179"], ["c", "C", "\u0107", "\u0106"], ["v", "V"], ["b", "B"], ["n", "N", "\u0144", "\u0143"], ["m", "M"], [",", "<"], [".", ">"], ["/", "?"], ["Shift", "Shift"]],
353
      [["Shift", "Shift"], ["z", "Z", "\u017c", "\u017b"], ["x", "X", "\u017a", "\u0179"], ["c", "C", "\u0107", "\u0106"], ["v", "V"], ["b", "B"], ["n", "N", "\u0144", "\u0143"], ["m", "M"], [",", "<"], [".", ">"], ["/", "?"], ["Shift", "Shift"]],
269
      [[" ", " ", " ", " "], ["Alt", "Alt"]]
354
      [[" ", " ", " ", " "], ["Alt", "Alt"]]
270
    ];
355
    ];
271
 
356
 
272
    this.VKI_layout.Portuguese = [ // Portuguese Standard Keyboard
357
    this.VKI_layout["Portuguese Br"] = [ // Portuguese (Brazil) Standard Keyboard
273
      [["`", "\u00ac", "\u00a6"], ["1", "!"], ["2", '"'], ["3", "\u00a3"], ["4", "$", "\u20ac"], ["5", "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
358
      [["'", '"'], ["1", "!", "\u00b9"], ["2", "@", "\u00b2"], ["3", "#", "\u00b3"], ["4", "$", "\u00a3"], ["5", "%", "\u00a2"], ["6", "\u00a8", "\u00ac"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+", "\u00a7"], ["Bksp", "Bksp"]],
-
 
359
      [["Tab", "Tab"], ["q", "Q", "/"], ["w", "W", "?"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u00b4", "`"], ["[", "{", "\u00aa"], ["Enter", "Enter"]],
-
 
360
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u00e7", "\u00c7"], ["~", "^"], ["]", "}", "\u00ba"], ["/", "?"]],
-
 
361
      [["Shift", "Shift"], ["\\", "|"], ["z", "Z"], ["x", "X"], ["c", "C", "\u20a2"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", "<"], [".", ">"], [":", ":"], ["Shift", "Shift"]],
-
 
362
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
-
 
363
    ];
-
 
364
 
-
 
365
    this.VKI_layout["Portuguese Pt"] = [ // Portuguese (Portugal) Standard Keyboard
-
 
366
      [["\\", "|"], ["1", "!"], ["2", '"', "@"], ["3", "#", "\u00a3"], ["4", "$", "\u00a7"], ["5", "%"], ["6", "&"], ["7", "/", "{"], ["8", "(", "["], ["9", ")", "]"], ["0", "=", "}"], ["'", "?"], ["\u00ab", "\u00bb"], ["Bksp", "Bksp"]],
274
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u00e9", "\u00c9"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U", "\u00fa", "\u00da"], ["i", "I", "\u00ed", "\u00cd"], ["o", "O", "\u00f3", "\u00d3"], ["p", "P"], ["[", "{"], ["]", "}"], ["Enter", "Enter"]],
367
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u20ac"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["+", "*", "\u00a8"], ["\u00b4", "`"], ["Enter", "Enter"]],
275
      [["Caps", "Caps"], ["a", "A", "\u00e1", "\u00c1"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u00e7", "\u00c7"], [";", ":"], ["'", "@"], ["#", "~"]],
368
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u00e7", "\u00c7"], ["\u00ba", "\u00aa"], ["~", "^"]],
276
      [["Shift", "Shift"], ["\\", "|"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", "<"], [".", ">"], ["/", "?"], ["Shift", "Shift"]],
369
      [["Shift", "Shift"], ["<", ">", "\\"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", ";"], [".", ":"], ["-", "_"], ["Shift", "Shift"]],
277
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
370
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
278
    ];
371
    ];
279
 
372
 
280
    this.VKI_layout.Romanian = [ // Romanian Standard Keyboard
373
    this.VKI_layout.Romanian = [ // Romanian Standard Keyboard
281
     [["\u201E", "\u201D", "\u0060", "~"], ["1", "!","~"], ["2", "\u0040", "\u02C7"], ["3", "#","\u005E"], ["4", "$", "\u02D8"], ["5", "%", "\u00B0"], ["6", "\u005E", "\u02DB"], ["7", "&", "\u0060"], ["8", "*", "\u02D9"], ["9", "(", "\u00B4"], ["0", ")", "\u02DD"], ["-", "_", "\u00A8"], ["=", "+", "\u00B8", "\u00B1"], ["Bksp", "Bksp"]],
374
     [["\u201E", "\u201D", "\u0060", "~"], ["1", "!","~"], ["2", "\u0040", "\u02C7"], ["3", "#","\u005E"], ["4", "$", "\u02D8"], ["5", "%", "\u00B0"], ["6", "\u005E", "\u02DB"], ["7", "&", "\u0060"], ["8", "*", "\u02D9"], ["9", "(", "\u00B4"], ["0", ")", "\u02DD"], ["-", "_", "\u00A8"], ["=", "+", "\u00B8", "\u00B1"], ["Bksp", "Bksp"]],
Line 323... Line 416...
323
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F", "["], ["g", "G", "]"], ["h", "H"], ["j", "J"], ["k", "K", "\u0142"], ["l", "L", "\u0141"], ["\u010D", "\u010C"], ["\u0107", "\u0106", "\u00df"], ["\u017E", "\u017D", "\u00a4"]],
416
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F", "["], ["g", "G", "]"], ["h", "H"], ["j", "J"], ["k", "K", "\u0142"], ["l", "L", "\u0141"], ["\u010D", "\u010C"], ["\u0107", "\u0106", "\u00df"], ["\u017E", "\u017D", "\u00a4"]],
324
      [["Shift", "Shift"], ["<", ">"], ["y", "Y"], ["x", "X"], ["c", "C"], ["v", "V", "@"], ["b", "B", "{",], ["n", "N", "}"], ["m", "M", "\u00a7"], [",", ";"], [".", ":"], ["-", "_"], ["Shift", "Shift"]],
417
      [["Shift", "Shift"], ["<", ">"], ["y", "Y"], ["x", "X"], ["c", "C"], ["v", "V", "@"], ["b", "B", "{",], ["n", "N", "}"], ["m", "M", "\u00a7"], [",", ";"], [".", ":"], ["-", "_"], ["Shift", "Shift"]],
325
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
418
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
326
    ];
419
    ];
327
 
420
 
328
    this.VKI_layout["Spanish-SP"] = [ // Spanish (Spain) Standard Keyboard
421
    this.VKI_layout["Spanish Es"] = [ // Spanish (Spain) Standard Keyboard
329
      [["\u00ba", "\u00aa", "\\"], ["1", "!", "|"], ["2", '"', "@"], ["3", "'", "#"], ["4", "$", "~"], ["5", "%", "\u20ac"], ["6", "&","\u00ac"], ["7", "/"], ["8", "("], ["9", ")"], ["0", "="], ["'", "?"], ["\u00a1", "\u00bf"], ["Bksp", "Bksp"]],
422
      [["\u00ba", "\u00aa", "\\"], ["1", "!", "|"], ["2", '"', "@"], ["3", "'", "#"], ["4", "$", "~"], ["5", "%", "\u20ac"], ["6", "&","\u00ac"], ["7", "/"], ["8", "("], ["9", ")"], ["0", "="], ["'", "?"], ["\u00a1", "\u00bf"], ["Bksp", "Bksp"]],
330
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u0060", "^", "["], ["\u002b", "\u002a", "]"], ["Enter", "Enter"]],
423
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["\u0060", "^", "["], ["\u002b", "\u002a", "]"], ["Enter", "Enter"]],
331
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u00f1", "\u00d1"], ["\u00b4", "\u00a8", "{"], ["\u00e7", "\u00c7", "}"]],
424
      [["Caps", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], ["\u00f1", "\u00d1"], ["\u00b4", "\u00a8", "{"], ["\u00e7", "\u00c7", "}"]],
332
      [["Shift", "Shift"], ["<", ">"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", ";"], [".", ":"], ["-", "_"], ["Shift", "Shift"]],
425
      [["Shift", "Shift"], ["<", ">"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", ";"], [".", ":"], ["-", "_"], ["Shift", "Shift"]],
333
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
426
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
Line 361... Line 454...
361
      [["`", "\u00ac", "\u00a6"], ["1", "!"], ["2", '"'], ["3", "\u00a3"], ["4", "$", "\u20ac"], ["5", "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
454
      [["`", "\u00ac", "\u00a6"], ["1", "!"], ["2", '"'], ["3", "\u00a3"], ["4", "$", "\u20ac"], ["5", "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
362
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u00e9", "\u00c9"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U", "\u00fa", "\u00da"], ["i", "I", "\u00ed", "\u00cd"], ["o", "O", "\u00f3", "\u00d3"], ["p", "P"], ["[", "{"], ["]", "}"], ["Enter", "Enter"]],
455
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E", "\u00e9", "\u00c9"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U", "\u00fa", "\u00da"], ["i", "I", "\u00ed", "\u00cd"], ["o", "O", "\u00f3", "\u00d3"], ["p", "P"], ["[", "{"], ["]", "}"], ["Enter", "Enter"]],
363
      [["Caps", "Caps"], ["a", "A", "\u00e1", "\u00c1"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], [";", ":"], ["'", "@"], ["#", "~"]],
456
      [["Caps", "Caps"], ["a", "A", "\u00e1", "\u00c1"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], [";", ":"], ["'", "@"], ["#", "~"]],
364
      [["Shift", "Shift"], ["\\", "|"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", "<"], [".", ">"], ["/", "?"], ["Shift", "Shift"]],
457
      [["Shift", "Shift"], ["\\", "|"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", "<"], [".", ">"], ["/", "?"], ["Shift", "Shift"]],
365
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
458
      [[" ", " ", " ", " "], ["AltGr", "AltGr"]]
-
 
459
    ];
-
 
460
 
-
 
461
    this.VKI_layout.Ukrainian = [ // Ukrainian Standard Keyboard
-
 
462
      [["\u00b4", "~"], ["1", "!"], ["2", '"'], ["3", "\u2116"], ["4", ";"], ["5", "%"], ["6", ":"], ["7", "?"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
-
 
463
      [["Tab", "Tab"], ["\u0439", "\u0419"], ["\u0446", "\u0426"], ["\u0443", "\u0423"], ["\u043A", "\u041A"], ["\u0435", "\u0415"], ["\u043D", "\u041D"], ["\u0433", "\u0413"], ["\u0448", "\u0428"], ["\u0449", "\u0429"], ["\u0437", "\u0417"], ["\u0445", "\u0425"], ["\u0457", "\u0407"], ["\u0491", "\u0490"]],
-
 
464
      [["Caps", "Caps"], ["\u0444", "\u0424"], ["\u0456", "\u0406"], ["\u0432", "\u0412"], ["\u0430", "\u0410"], ["\u043F", "\u041F"], ["\u0440", "\u0420"], ["\u043E", "\u041E"], ["\u043B", "\u041B"], ["\u0434", "\u0414"], ["\u0436", "\u0416"], ["\u0454", "\u0404"], ["Enter", "Enter"]],
-
 
465
      [["Shift", "Shift"], ["\u044F", "\u042F"], ["\u0447", "\u0427"], ["\u0441", "\u0421"], ["\u043C", "\u041C"], ["\u0438", "\u0418"], ["\u0442", "\u0422"], ["\u044C", "\u042C"], ["\u0431", "\u0411"], ["\u044E", "\u042E"], [".", ","], ["Shift", "Shift"]],
-
 
466
      [[" ", " "]]
366
    ];
467
    ];
367
 
468
 
368
    this.VKI_layout.US = [ // US Standard Keyboard
469
    this.VKI_layout.US = [ // US Standard Keyboard
369
      [["`", "~"], ["1", "!"], ["2", "@"], ["3", "#"], ["4", "$"], ["5", "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
470
      [["`", "~"], ["1", "!"], ["2", "@"], ["3", "#"], ["4", "$"], ["5", "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp"]],
370
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["[", "{"], ["]", "}"], ["\\", "|"]],
471
      [["Tab", "Tab"], ["q", "Q"], ["w", "W"], ["e", "E"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["[", "{"], ["]", "}"], ["\\", "|"]],
Line 377... Line 478...
377
      [["`", "~"], ["1", "!", "\u00a1", "\u00b9"], ["2", "@", "\u00b2"], ["3", "#", "\u00b3"], ["4", "$", "\u00a4", "\u00a3"], ["5", "%", "\u20ac"], ["6", "^", "\u00bc"], ["7", "&", "\u00bd"], ["8", "*", "\u00be"], ["9", "(", "\u2018"], ["0", ")", "\u2019"], ["-", "_", "\u00a5"], ["=", "+", "\u00d7", "\u00f7"], ["Bksp", "Bksp"]],
478
      [["`", "~"], ["1", "!", "\u00a1", "\u00b9"], ["2", "@", "\u00b2"], ["3", "#", "\u00b3"], ["4", "$", "\u00a4", "\u00a3"], ["5", "%", "\u20ac"], ["6", "^", "\u00bc"], ["7", "&", "\u00bd"], ["8", "*", "\u00be"], ["9", "(", "\u2018"], ["0", ")", "\u2019"], ["-", "_", "\u00a5"], ["=", "+", "\u00d7", "\u00f7"], ["Bksp", "Bksp"]],
378
      [["Tab", "Tab"], ["q", "Q", "\u00e4", "\u00c4"], ["w", "W", "\u00e5", "\u00c5"], ["e", "E", "\u00e9", "\u00c9"], ["r", "R", "\u00ae"], ["t", "T", "\u00fe", "\u00de"], ["y", "Y", "\u00fc", "\u00dc"], ["u", "U", "\u00fa", "\u00da"], ["i", "I", "\u00ed", "\u00cd"], ["o", "O", "\u00f3", "\u00d3"], ["p", "P", "\u00f6", "\u00d6"], ["[", "{", "\u00ab"], ["]", "}", "\u00bb"], ["\\", "|", "\u00ac", "\u00a6"]],
479
      [["Tab", "Tab"], ["q", "Q", "\u00e4", "\u00c4"], ["w", "W", "\u00e5", "\u00c5"], ["e", "E", "\u00e9", "\u00c9"], ["r", "R", "\u00ae"], ["t", "T", "\u00fe", "\u00de"], ["y", "Y", "\u00fc", "\u00dc"], ["u", "U", "\u00fa", "\u00da"], ["i", "I", "\u00ed", "\u00cd"], ["o", "O", "\u00f3", "\u00d3"], ["p", "P", "\u00f6", "\u00d6"], ["[", "{", "\u00ab"], ["]", "}", "\u00bb"], ["\\", "|", "\u00ac", "\u00a6"]],
379
      [["Caps", "Caps"], ["a", "A", "\u00e1", "\u00c1"], ["s", "S", "\u00df", "\u00a7"], ["d", "D", "\u00f0", "\u00d0"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L", "\u00f8", "\u00d8"], [";", ":", "\u00b6", "\u00b0"], ["'", '"', "\u00b4", "\u00a8"], ["Enter", "Enter"]],
480
      [["Caps", "Caps"], ["a", "A", "\u00e1", "\u00c1"], ["s", "S", "\u00df", "\u00a7"], ["d", "D", "\u00f0", "\u00d0"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L", "\u00f8", "\u00d8"], [";", ":", "\u00b6", "\u00b0"], ["'", '"', "\u00b4", "\u00a8"], ["Enter", "Enter"]],
380
      [["Shift", "Shift"], ["z", "Z", "\u00e6", "\u00c6"], ["x", "X"], ["c", "C", "\u00a9", "\u00a2"], ["v", "V"], ["b", "B"], ["n", "N", "\u00f1", "\u00d1"], ["m", "M", "\u00b5"], [",", "<", "\u00e7", "\u00c7"], [".", ">"], ["/", "?", "\u00bf"], ["Shift", "Shift"]],
481
      [["Shift", "Shift"], ["z", "Z", "\u00e6", "\u00c6"], ["x", "X"], ["c", "C", "\u00a9", "\u00a2"], ["v", "V"], ["b", "B"], ["n", "N", "\u00f1", "\u00d1"], ["m", "M", "\u00b5"], [",", "<", "\u00e7", "\u00c7"], [".", ">"], ["/", "?", "\u00bf"], ["Shift", "Shift"]],
381
      [[" ", " ", " ", " "], ["Alt", "Alt"]]
482
      [[" ", " ", " ", " "], ["Alt", "Alt"]]
382
    ];
483
    ];
-
 
484
 
383
 
485
 
384
    /* ***** Define Dead Keys ************************************** */
486
    /* ***** Define Dead Keys ************************************** */
385
    this.VKI_deadkey = {};
487
    this.VKI_deadkey = {};
386
 
488
 
387
    // - Lay out each dead key set in one row of sub-arrays.  The rows
489
    // - Lay out each dead key set in one row of sub-arrays.  The rows
Line 395... Line 497...
395
    // - Note that if you have created a new keyboard layout and want
497
    // - Note that if you have created a new keyboard layout and want
396
    //   it included in the distributed script, PLEASE TELL ME if you
498
    //   it included in the distributed script, PLEASE TELL ME if you
397
    //   have added additional dead keys to the ones below.
499
    //   have added additional dead keys to the ones below.
398
 
500
 
399
    this.VKI_deadkey['"'] = this.VKI_deadkey['\u00a8'] = [ // Umlaut / Diaeresis / Greek Dialytika
501
    this.VKI_deadkey['"'] = this.VKI_deadkey['\u00a8'] = [ // Umlaut / Diaeresis / Greek Dialytika
400
      ["a", "\u00e4"], ["e", "\u00eb"], ["i", "\u00ef"], ["o", "\u00f6"], ["u", "\u00fc"], ["y", "\u00ff"], ["\u03b9", "\u03ca"], ["\u03c5", "\u03cb"],
502
      ["a", "\u00e4"], ["e", "\u00eb"], ["i", "\u00ef"], ["o", "\u00f6"], ["u", "\u00fc"], ["y", "\u00ff"], ["\u03b9", "\u03ca"], ["\u03c5", "\u03cb"], ["\u016B", "\u01D6"], ["\u00FA", "\u01D8"], ["\u01D4", "\u01DA"], ["\u00F9", "\u01DC"],
401
      ["A", "\u00c4"], ["E", "\u00cb"], ["I", "\u00cf"], ["O", "\u00d6"], ["U", "\u00dc"], ["Y", "\u0178"], ["\u0399", "\u03aa"], ["\u03a5", "\u03ab"]
503
      ["A", "\u00c4"], ["E", "\u00cb"], ["I", "\u00cf"], ["O", "\u00d6"], ["U", "\u00dc"], ["Y", "\u0178"], ["\u0399", "\u03aa"], ["\u03a5", "\u03ab"], ["\u016A", "\u01D5"], ["\u00DA", "\u01D7"], ["\u01D3", "\u01D9"], ["\u00D9", "\u01DB"]
402
    ];
504
    ];
403
    this.VKI_deadkey['~'] = [ // Tilde
505
    this.VKI_deadkey['~'] = [ // Tilde / Stroke
404
      ["a", "\u00e3"], ["o", "\u00f5"], ["n", "\u00f1"],
506
      ["a", "\u00e3"], ["l", "\u0142"], ["n", "\u00f1"], ["o", "\u00f5"],
405
      ["A", "\u00c3"], ["O", "\u00d5"], ["N", "\u00d1"]
507
      ["A", "\u00c3"], ["L", "\u0141"], ["N", "\u00d1"], ["O", "\u00d5"]
406
    ];
508
    ];
407
    this.VKI_deadkey['^'] = [ // Circumflex
509
    this.VKI_deadkey['^'] = [ // Circumflex
408
      ["a", "\u00e2"], ["e", "\u00ea"], ["i", "\u00ee"], ["o", "\u00f4"], ["u", "\u00fb"], ["w", "\u0175"], ["y", "\u0177"],
510
      ["a", "\u00e2"], ["e", "\u00ea"], ["i", "\u00ee"], ["o", "\u00f4"], ["u", "\u00fb"], ["w", "\u0175"], ["y", "\u0177"],
409
      ["A", "\u00c2"], ["E", "\u00ca"], ["I", "\u00ce"], ["O", "\u00d4"], ["U", "\u00db"], ["W", "\u0174"], ["Y", "\u0176"]
511
      ["A", "\u00c2"], ["E", "\u00ca"], ["I", "\u00ce"], ["O", "\u00d4"], ["U", "\u00db"], ["W", "\u0174"], ["Y", "\u0176"]
410
    ];
512
    ];
411
    this.VKI_deadkey['\u02c7'] = [ // Baltic caron
513
    this.VKI_deadkey['\u02c7'] = [ // Baltic caron
412
      ["c", "\u010D"], ["s", "\u0161"], ["z", "\u017E"], ["r", "\u0159"], ["d", "\u010f"], ["t", "\u0165"], ["n", "\u0148"], ["l", "\u013e"], ["e", "\u011b"],
514
      ["c", "\u010D"], ["d", "\u010f"], ["e", "\u011b"], ["s", "\u0161"], ["l", "\u013e"], ["n", "\u0148"], ["r", "\u0159"], ["t", "\u0165"], ["u", "\u01d4"], ["z", "\u017E"], ["\u00fc", "\u01da"],
413
      ["C", "\u010C"], ["S", "\u0160"], ["Z", "\u017D"], ["R", "\u0158"], ["D", "\u010e"], ["T", "\u0164"], ["N", "\u0147"], ["L", "\u013d"], ["E", "\u011a"]
515
      ["C", "\u010C"], ["D", "\u010e"], ["E", "\u011a"], ["S", "\u0160"], ["L", "\u013d"], ["N", "\u0147"], ["R", "\u0158"], ["T", "\u0164"], ["U", "\u01d3"], ["Z", "\u017D"], ["\u00dc", "\u01d9"]
414
    ];
516
    ];
415
    this.VKI_deadkey['\u02d8'] = [ // Romanian and Turkish breve
517
    this.VKI_deadkey['\u02d8'] = [ // Romanian and Turkish breve
416
      ["a", "\u0103"], ["g", "\u011f"],
518
      ["a", "\u0103"], ["g", "\u011f"],
417
      ["A", "\u0102"], ["G", "\u011e"]
519
      ["A", "\u0102"], ["G", "\u011e"]
-
 
520
    ];
-
 
521
    this.VKI_deadkey['-'] = this.VKI_deadkey['\u00af'] = [ // Macron
-
 
522
      ["a", "\u0101"], ["e", "\u0113"], ["i", "\u012b"], ["o", "\u014d"], ["u", "\u016B"], ["y", "\u0233"], ["\u00fc", "\u01d6"],
-
 
523
      ["A", "\u0100"], ["E", "\u0112"], ["I", "\u012a"], ["O", "\u014c"], ["U", "\u016A"], ["Y", "\u0232"], ["\u00dc", "\u01d5"]
418
    ];
524
    ];
419
    this.VKI_deadkey['`'] = [ // Grave
525
    this.VKI_deadkey['`'] = [ // Grave
420
      ["a", "\u00e0"], ["e", "\u00e8"], ["i", "\u00ec"], ["o", "\u00f2"], ["u", "\u00f9"],
526
      ["a", "\u00e0"], ["e", "\u00e8"], ["i", "\u00ec"], ["o", "\u00f2"], ["u", "\u00f9"], ["\u00fc", "\u01dc"],
421
      ["A", "\u00c0"], ["E", "\u00c8"], ["I", "\u00cc"], ["O", "\u00d2"], ["U", "\u00d9"]
527
      ["A", "\u00c0"], ["E", "\u00c8"], ["I", "\u00cc"], ["O", "\u00d2"], ["U", "\u00d9"], ["\u00dc", "\u01db"]
422
    ];
528
    ];
423
    this.VKI_deadkey["'"] = this.VKI_deadkey['\u00b4'] = this.VKI_deadkey['\u0384'] = [ // Acute / Greek Tonos
529
    this.VKI_deadkey["'"] = this.VKI_deadkey['\u00b4'] = this.VKI_deadkey['\u0384'] = [ // Acute / Greek Tonos
424
      ["a", "\u00e1"], ["e", "\u00e9"], ["i", "\u00ed"], ["o", "\u00f3"], ["u", "\u00fa"], ["y", "\u00fd"], ["\u03b1", "\u03ac"], ["\u03b5", "\u03ad"], ["\u03b7", "\u03ae"], ["\u03b9", "\u03af"], ["\u03bf", "\u03cc"], ["\u03c5", "\u03cd"], ["\u03c9", "\u03ce"],
530
      ["a", "\u00e1"], ["e", "\u00e9"], ["i", "\u00ed"], ["o", "\u00f3"], ["u", "\u00fa"], ["y", "\u00fd"], ["\u03b1", "\u03ac"], ["\u03b5", "\u03ad"], ["\u03b7", "\u03ae"], ["\u03b9", "\u03af"], ["\u03bf", "\u03cc"], ["\u03c5", "\u03cd"], ["\u03c9", "\u03ce"], ["\u00fc", "\u01d8"],
425
      ["A", "\u00c1"], ["E", "\u00c9"], ["I", "\u00cd"], ["O", "\u00d3"], ["U", "\u00da"], ["Y", "\u00dd"], ["\u0391", "\u0386"], ["\u0395", "\u0388"], ["\u0397", "\u0389"], ["\u0399", "\u038a"], ["\u039f", "\u038c"], ["\u03a5", "\u038e"], ["\u03a9", "\u038f"]
531
      ["A", "\u00c1"], ["E", "\u00c9"], ["I", "\u00cd"], ["O", "\u00d3"], ["U", "\u00da"], ["Y", "\u00dd"], ["\u0391", "\u0386"], ["\u0395", "\u0388"], ["\u0397", "\u0389"], ["\u0399", "\u038a"], ["\u039f", "\u038c"], ["\u03a5", "\u038e"], ["\u03a9", "\u038f"], ["\u00dc", "\u01d7"]
426
    ];
532
    ];
427
    this.VKI_deadkey['\u02dd'] = [ // Hungarian Double Acute Accent
533
    this.VKI_deadkey['\u02dd'] = [ // Hungarian Double Acute Accent
428
      ["o", "\u0151"], ["u", "\u0171"],
534
      ["o", "\u0151"], ["u", "\u0171"],
429
      ["O", "\u0150"], ["U", "\u0170"]
535
      ["O", "\u0150"], ["U", "\u0170"]
430
    ];
536
    ];
Line 440... Line 546...
440
      ["A", "\u0105"], ["E", "\u0118"], ["I", "\u012e"], ["O", "\u01ea"], ["U", "\u0172"], ["Y", "\u0176"]
546
      ["A", "\u0105"], ["E", "\u0118"], ["I", "\u012e"], ["O", "\u01ea"], ["U", "\u0172"], ["Y", "\u0176"]
441
    ];
547
    ];
442
    this.VKI_deadkey['\u02D9'] = [ // Dot-above
548
    this.VKI_deadkey['\u02D9'] = [ // Dot-above
443
      ["c", "\u010B"], ["e", "\u0117"], ["g", "\u0121"], ["z", "\u017C"],
549
      ["c", "\u010B"], ["e", "\u0117"], ["g", "\u0121"], ["z", "\u017C"],
444
      ["C", "\u010A"], ["E", "\u0116"], ["G", "\u0120"], ["Z", "\u017B"]
550
      ["C", "\u010A"], ["E", "\u0116"], ["G", "\u0120"], ["Z", "\u017B"]
445
    ];
551
    ];
446
    this.VKI_deadkey['\u00B8'] = this.VKI_deadkey['\u201a'] = [ // Cedilla
552
    this.VKI_deadkey['\u00B8'] = this.VKI_deadkey['\u201a'] = [ // Cedilla
447
      ["c", "\u00e7"], ["s", "\u015F"],
553
      ["c", "\u00e7"], ["s", "\u015F"],
448
      ["C", "\u00c7"], ["S", "\u015E"]
554
      ["C", "\u00c7"], ["S", "\u015E"]
449
    ];
555
    ];
450
    this.VKI_deadkey[','] = [ // Comma
556
    this.VKI_deadkey[','] = [ // Comma
451
      ["s", (this.VKI_isIElt8) ? "\u015F" : "\u0219"], ["t", (this.VKI_isIElt8) ? "\u0163" : "\u021B"],
557
      ["s", (this.VKI_isIElt8) ? "\u015F" : "\u0219"], ["t", (this.VKI_isIElt8) ? "\u0163" : "\u021B"],
452
      ["S", (this.VKI_isIElt8) ? "\u015E" : "\u0218"], ["T", (this.VKI_isIElt8) ? "\u0162" : "\u021A"]
558
      ["S", (this.VKI_isIElt8) ? "\u015E" : "\u0218"], ["T", (this.VKI_isIElt8) ? "\u0162" : "\u021A"]
453
    ];
559
    ];
-
 
560
 
-
 
561
 
-
 
562
    /* ***** Define Symbols **************************************** */
-
 
563
    this.VKI_symbol = {
-
 
564
      '\u200c': "ZW\r\nNJ", '\u200d': "ZW\r\nJ"
-
 
565
    };
454
 
566
 
455
 
567
 
456
 
568
 
457
    /* ****************************************************************
569
    /* ****************************************************************
458
     * Attach the keyboard to an element
570
     * Attach the keyboard to an element
Line 532... Line 644...
532
                  checkbox.checked = this.VKI_deadkeysOn;
644
                  checkbox.checked = this.VKI_deadkeysOn;
533
            th.appendChild(label);
645
            th.appendChild(label);
534
          tr.appendChild(th);
646
          tr.appendChild(th);
535
 
647
 
536
        var td = document.createElement('td');
648
        var td = document.createElement('td');
-
 
649
          if (this.VKI_switcher) {
-
 
650
            var switcher = document.createElement('span');
-
 
651
                switcher.id = "keyboardInputSwitch";
-
 
652
                switcher.appendChild(document.createTextNode("\u21d1"));
-
 
653
                switcher.title = "Switch keyboard position";
-
 
654
                switcher.onmousedown = function() { this.className = "pressed"; };
-
 
655
                switcher.onmouseup = function() { this.className = ""; };
-
 
656
                switcher.onclick = function() {
-
 
657
                  self.VKI_position(self.VKI_above ^= 1);
-
 
658
                  this.firstChild.nodeValue = (self.VKI_above) ? "\u21d3" : "\u21d1";
-
 
659
                  return false;
-
 
660
                };
-
 
661
              td.appendChild(switcher);
-
 
662
          }
-
 
663
 
537
          var clearer = document.createElement('span');
664
          var clearer = document.createElement('span');
538
              clearer.id = "keyboardInputClear";
665
              clearer.id = "keyboardInputClear";
539
              clearer.appendChild(document.createTextNode("Clear"));
666
              clearer.appendChild(document.createTextNode("Clear"));
540
              clearer.title = "Clear this input";
667
              clearer.title = "Clear this input";
541
              clearer.onmousedown = function() { this.className = "pressed"; };
668
              clearer.onmousedown = function() { this.className = "pressed"; };
Line 584... Line 711...
584
      this.VKI_iframe.style.border = "0px none";
711
      this.VKI_iframe.style.border = "0px none";
585
      this.VKI_iframe.style.filter = "mask()";
712
      this.VKI_iframe.style.filter = "mask()";
586
      this.VKI_iframe.style.zIndex = "999999";
713
      this.VKI_iframe.style.zIndex = "999999";
587
      this.VKI_iframe.src = this.VKI_imageURI;
714
      this.VKI_iframe.src = this.VKI_imageURI;
588
    }
715
    }
589
 
716
 
590
 
717
 
591
    /* ****************************************************************
718
    /* ****************************************************************
592
     * Build or rebuild the keyboard keys
719
     * Build or rebuild the keyboard keys
593
     *
720
     *
594
     */
721
     */
595
    this.VKI_buildKeys = function() {
722
    this.VKI_buildKeys = function() {
596
      this.VKI_shift = this.VKI_capslock = this.VKI_alternate = this.VKI_dead = false;
723
      this.VKI_shift = this.VKI_shiftlock = this.VKI_altgr = this.VKI_altgrlock = this.VKI_dead = false;
597
      this.VKI_deadkeysOn = (this.VKI_layoutDDK[this.VKI_kt]) ? false : this.VKI_keyboard.getElementsByTagName('label')[0].getElementsByTagName('input')[0].checked;
724
      this.VKI_deadkeysOn = (this.VKI_layout[this.VKI_kt].DDK) ? false : this.VKI_keyboard.getElementsByTagName('label')[0].getElementsByTagName('input')[0].checked;
598
 
725
 
599
      var container = this.VKI_keyboard.tBodies[0].getElementsByTagName('div')[0];
726
      var container = this.VKI_keyboard.tBodies[0].getElementsByTagName('div')[0];
600
      while (container.firstChild) container.removeChild(container.firstChild);
727
      while (container.firstChild) container.removeChild(container.firstChild);
601
 
728
 
602
      for (var x = 0, hasDeadKey = false, lyt; lyt = this.VKI_layout[this.VKI_kt][x++];) {
729
      for (var x = 0, hasDeadKey = false, lyt; lyt = this.VKI_layout[this.VKI_kt][x++];) {
Line 605... Line 732...
605
        if (lyt.length <= this.VKI_keyCenter) table.className = "keyboardInputCenter";
732
        if (lyt.length <= this.VKI_keyCenter) table.className = "keyboardInputCenter";
606
          var tbody = document.createElement('tbody');
733
          var tbody = document.createElement('tbody');
607
            var tr = document.createElement('tr');
734
            var tr = document.createElement('tr');
608
            for (var y = 0, lkey; lkey = lyt[y++];) {
735
            for (var y = 0, lkey; lkey = lyt[y++];) {
609
              var td = document.createElement('td');
736
              var td = document.createElement('td');
-
 
737
                if (this.VKI_symbol[lkey[0]]) {
-
 
738
                  var span = document.createElement('span');
-
 
739
                      span.className = lkey[0];
-
 
740
                      span.appendChild(document.createTextNode(this.VKI_symbol[lkey[0]]));
-
 
741
                    td.appendChild(span);
610
                  td.appendChild(document.createTextNode(lkey[0]));
742
                } else td.appendChild(document.createTextNode(lkey[0] || "\xa0"));
611
 
743
 
612
                var className = [];
744
                var className = [];
613
                if (this.VKI_deadkeysOn)
745
                if (this.VKI_deadkeysOn)
614
                  for (key in this.VKI_deadkey)
746
                  for (key in this.VKI_deadkey)
615
                    if (key === lkey[0]) { className.push("alive"); break; }
747
                    if (key === lkey[0]) { className.push("alive"); break; }
Line 627... Line 759...
627
                  }
759
                  }
628
                  td.onmouseover = function() {
760
                  td.onmouseover = function() {
629
                    if (self.VKI_clickless) {
761
                    if (self.VKI_clickless) {
630
                      var _self = this;
762
                      var _self = this;
631
                      clearTimeout(this.VKI_clickless);
763
                      clearTimeout(this.VKI_clickless);
632
                      this.VKI_clickless = setTimeout(function() { _self.click(); }, self.VKI_clicklessDelay);
764
                      this.VKI_clickless = setTimeout(function() { _self.click(); }, self.VKI_clickless);
633
                    }
765
                    }
634
                    if (this.firstChild.nodeValue != "\xa0") this.className += " hover";
766
                    if ((this.firstChild.nodeValue || this.firstChild.className) != "\xa0") this.className += " hover";
635
                  };
767
                  };
636
                  td.onmouseout = function() {
768
                  td.onmouseout = function() {
637
                    if (self.VKI_clickless) clearTimeout(this.VKI_clickless);
769
                    if (self.VKI_clickless) clearTimeout(this.VKI_clickless);
638
                    this.className = this.className.replace(/ ?(hover|pressed)/g, "");
770
                    this.className = this.className.replace(/ ?(hover|pressed)/g, "");
639
                  };
771
                  };
640
                  td.onmousedown = function() {
772
                  td.onmousedown = function() {
641
                    if (self.VKI_clickless) clearTimeout(this.VKI_clickless);
773
                    if (self.VKI_clickless) clearTimeout(this.VKI_clickless);
642
                    if (this.firstChild.nodeValue != "\xa0") this.className += " pressed";
774
                    if ((this.firstChild.nodeValue || this.firstChild.className) != "\xa0") this.className += " pressed";
643
                  };
775
                  };
644
                  td.onmouseup = function() {
776
                  td.onmouseup = function() {
645
                    if (self.VKI_clickless) clearTimeout(this.VKI_clickless);
777
                    if (self.VKI_clickless) clearTimeout(this.VKI_clickless);
646
                    this.className = this.className.replace(/ ?pressed/g, "");
778
                    this.className = this.className.replace(/ ?pressed/g, "");
647
                  };
779
                  };
648
                  td.ondblclick = function() { return false; };
780
                  td.ondblclick = function() { return false; };
649
 
781
 
650
                switch (lkey[1]) {
782
                switch (lkey[1]) {
651
                  case "Caps":
-
 
652
                  case "Shift":
783
                  case "Caps": case "Shift":
653
                  case "Alt":
-
 
654
                  case "AltGr":
784
                  case "Alt": case "AltGr": case "AltLk":
655
                    td.onclick = (function(type) { return function() { self.VKI_modify(type); return false; }; })(lkey[1]);
785
                    td.onclick = (function(type) { return function() { self.VKI_modify(type); return false; }; })(lkey[1]);
656
                    break;
786
                    break;
657
                  case "Tab":
787
                  case "Tab":
658
                    td.onclick = function() { self.VKI_insert("\t"); return false; };
788
                    td.onclick = function() { self.VKI_insert("\t"); return false; };
659
                    break;
789
                    break;
Line 678... Line 808...
678
                        } catch(e) { self.VKI_target.range = document.selection.createRange(); }
808
                        } catch(e) { self.VKI_target.range = document.selection.createRange(); }
679
                        if (!self.VKI_target.range.text.length) self.VKI_target.range.moveStart('character', -1);
809
                        if (!self.VKI_target.range.text.length) self.VKI_target.range.moveStart('character', -1);
680
                        self.VKI_target.range.text = "";
810
                        self.VKI_target.range.text = "";
681
                      } else self.VKI_target.value = self.VKI_target.value.substr(0, self.VKI_target.value.length - 1);
811
                      } else self.VKI_target.value = self.VKI_target.value.substr(0, self.VKI_target.value.length - 1);
682
                      if (self.VKI_shift) self.VKI_modify("Shift");
812
                      if (self.VKI_shift) self.VKI_modify("Shift");
683
                      if (self.VKI_alternate) self.VKI_modify("AltGr");
813
                      if (self.VKI_altgr) self.VKI_modify("AltGr");
684
                      self.VKI_target.focus();
814
                      self.VKI_target.focus();
685
                      return true;
815
                      return true;
686
                    };
816
                    };
687
                    break;
817
                    break;
688
                  case "Enter":
818
                  case "Enter":
Line 694... Line 824...
694
                      return true;
824
                      return true;
695
                    };
825
                    };
696
                    break;
826
                    break;
697
                  default:
827
                  default:
698
                    td.onclick = function() {
828
                    td.onclick = function() {
-
 
829
                      var character = this.firstChild.nodeValue || this.firstChild.className;
699
                      if (self.VKI_deadkeysOn && self.VKI_dead) {
830
                      if (self.VKI_deadkeysOn && self.VKI_dead) {
700
                        if (self.VKI_dead != this.firstChild.nodeValue) {
831
                        if (self.VKI_dead != character) {
701
                          for (key in self.VKI_deadkey) {
832
                          for (key in self.VKI_deadkey) {
702
                            if (key == self.VKI_dead) {
833
                            if (key == self.VKI_dead) {
703
                              if (this.firstChild.nodeValue != " ") {
834
                              if (character != " ") {
704
                                for (var z = 0, rezzed = false, dk; dk = self.VKI_deadkey[key][z++];) {
835
                                for (var z = 0, rezzed = false, dk; dk = self.VKI_deadkey[key][z++];) {
705
                                  if (dk[0] == this.firstChild.nodeValue) {
836
                                  if (dk[0] == character) {
706
                                    self.VKI_insert(dk[1]);
837
                                    self.VKI_insert(dk[1]);
707
                                    rezzed = true;
838
                                    rezzed = true;
708
                                    break;
839
                                    break;
709
                                  }
840
                                  }
710
                                }
841
                                }
Line 715... Line 846...
715
                            }
846
                            }
716
                          }
847
                          }
717
                        } else rezzed = true;
848
                        } else rezzed = true;
718
                      } self.VKI_dead = false;
849
                      } self.VKI_dead = false;
719
 
850
 
720
                      if (!rezzed && this.firstChild.nodeValue != "\xa0") {
851
                      if (!rezzed && character != "\xa0") {
721
                        if (self.VKI_deadkeysOn) {
852
                        if (self.VKI_deadkeysOn) {
722
                          for (key in self.VKI_deadkey) {
853
                          for (key in self.VKI_deadkey) {
723
                            if (key == this.firstChild.nodeValue) {
854
                            if (key == character) {
724
                              self.VKI_dead = key;
855
                              self.VKI_dead = key;
725
                              this.className += " dead";
856
                              this.className += " dead";
726
                              if (self.VKI_shift) self.VKI_modify("Shift");
857
                              if (self.VKI_shift) self.VKI_modify("Shift");
727
                              if (self.VKI_alternate) self.VKI_modify("AltGr");
858
                              if (self.VKI_altgr) self.VKI_modify("AltGr");
728
                              break;
859
                              break;
729
                            }
860
                            }
730
                          }
861
                          }
731
                          if (!self.VKI_dead) self.VKI_insert(this.firstChild.nodeValue);
862
                          if (!self.VKI_dead) self.VKI_insert(character);
732
                        } else self.VKI_insert(this.firstChild.nodeValue);
863
                        } else self.VKI_insert(character);
733
                      }
864
                      }
734
 
865
 
735
                      self.VKI_modify("");
866
                      self.VKI_modify("");
736
                      return false;
867
                      return false;
737
                    };
868
                    };
Line 744... Line 875...
744
            for (var z = 0; z < 4; z++)
875
            for (var z = 0; z < 4; z++)
745
              if (this.VKI_deadkey[lkey[z] = lkey[z] || "\xa0"]) hasDeadKey = true;
876
              if (this.VKI_deadkey[lkey[z] = lkey[z] || "\xa0"]) hasDeadKey = true;
746
        }
877
        }
747
        container.appendChild(table);
878
        container.appendChild(table);
748
      }
879
      }
749
      this.VKI_deadkeysElem.style.display = (!this.VKI_layoutDDK[this.VKI_kt] && hasDeadKey) ? "inline" : "none";
880
      this.VKI_deadkeysElem.style.display = (!this.VKI_layout[this.VKI_kt].DDK && hasDeadKey) ? "inline" : "none";
750
    };
881
    };
751
 
882
 
752
    this.VKI_buildKeys();
883
    this.VKI_buildKeys();
753
    VKI_disableSelection(this.VKI_keyboard);
884
    VKI_disableSelection(this.VKI_keyboard);
754
 
885
 
Line 758... Line 889...
758
     *
889
     *
759
     */
890
     */
760
    this.VKI_modify = function(type) {
891
    this.VKI_modify = function(type) {
761
      switch (type) {
892
      switch (type) {
762
        case "Alt":
893
        case "Alt":
763
        case "AltGr": this.VKI_alternate = !this.VKI_alternate; break;
894
        case "AltGr": this.VKI_altgr = !this.VKI_altgr; break;
-
 
895
        case "AltLk": this.VKI_altgrlock = !this.VKI_altgrlock; break;
764
        case "Caps": this.VKI_capslock = !this.VKI_capslock; break;
896
        case "Caps": this.VKI_shiftlock = !this.VKI_shiftlock; break;
765
        case "Shift": this.VKI_shift = !this.VKI_shift; break;
897
        case "Shift": this.VKI_shift = !this.VKI_shift; break;
766
      } var vchar = 0;
898
      } var vchar = 0;
767
      if (!this.VKI_shift != !this.VKI_capslock) vchar += 1;
899
      if (!this.VKI_shift != !this.VKI_shiftlock) vchar += 1;
-
 
900
      if (!this.VKI_altgr != !this.VKI_altgrlock) vchar += 2;
768
 
901
 
769
      var tables = this.VKI_keyboard.getElementsByTagName('table');
902
      var tables = this.VKI_keyboard.getElementsByTagName('table');
770
      for (var x = 0; x < tables.length; x++) {
903
      for (var x = 0; x < tables.length; x++) {
771
        var tds = tables[x].getElementsByTagName('td');
904
        var tds = tables[x].getElementsByTagName('td');
772
        for (var y = 0; y < tds.length; y++) {
905
        for (var y = 0; y < tds.length; y++) {
773
          var className = [];
-
 
774
          var lkey = this.VKI_layout[this.VKI_kt][x][y];
906
          var className = [], lkey = this.VKI_layout[this.VKI_kt][x][y];
775
 
907
 
776
          if (tds[y].className.indexOf('hover') > -1) className.push("hover");
908
          if (tds[y].className.indexOf('hover') > -1) className.push("hover");
777
 
909
 
778
          switch (lkey[1]) {
910
          switch (lkey[1]) {
779
            case "Alt":
911
            case "Alt":
780
            case "AltGr":
912
            case "AltGr":
-
 
913
              if (this.VKI_altgr) className.push("dead");
-
 
914
              break;
-
 
915
            case "AltLk":
781
              if (this.VKI_alternate) className.push("dead");
916
              if (this.VKI_altgrlock) className.push("dead");
782
              break;
917
              break;
783
            case "Shift":
918
            case "Shift":
784
              if (this.VKI_shift) className.push("dead");
919
              if (this.VKI_shift) className.push("dead");
785
              break;
920
              break;
786
            case "Caps":
921
            case "Caps":
787
              if (this.VKI_capslock) className.push("dead");
922
              if (this.VKI_shiftlock) className.push("dead");
788
              break;
923
              break;
789
            case "Tab": case "Enter": case "Bksp": break;
924
            case "Tab": case "Enter": case "Bksp": break;
790
            default:
925
            default:
-
 
926
              if (type) {
-
 
927
                tds[y].removeChild(tds[y].firstChild);
-
 
928
                if (this.VKI_symbol[lkey[vchar]]) {
-
 
929
                  var span = document.createElement('span');
-
 
930
                      span.className = lkey[vchar];
791
              if (type) tds[y].firstChild.nodeValue = lkey[vchar + ((this.VKI_alternate && lkey.length == 4) ? 2 : 0)];
931
                      span.appendChild(document.createTextNode(this.VKI_symbol[lkey[vchar]]));
-
 
932
                    tds[y].appendChild(span);
-
 
933
                } else tds[y].appendChild(document.createTextNode(lkey[vchar]));
-
 
934
              }
792
              if (this.VKI_deadkeysOn) {
935
              if (this.VKI_deadkeysOn) {
793
                var char = tds[y].firstChild.nodeValue;
936
                var character = tds[y].firstChild.nodeValue || tds[y].firstChild.className;
794
                if (this.VKI_dead) {
937
                if (this.VKI_dead) {
795
                  if (char == this.VKI_dead) className.push("dead");
938
                  if (character == this.VKI_dead) className.push("dead");
796
                  for (var z = 0; z < this.VKI_deadkey[this.VKI_dead].length; z++) {
939
                  for (var z = 0; z < this.VKI_deadkey[this.VKI_dead].length; z++) {
797
                    if (char == this.VKI_deadkey[this.VKI_dead][z][0]) {
940
                    if (character == this.VKI_deadkey[this.VKI_dead][z][0]) {
798
                      className.push("target");
941
                      className.push("target");
799
                      break;
942
                      break;
800
                    }
943
                    }
801
                  }
944
                  }
802
                }
945
                }
803
                for (key in this.VKI_deadkey)
946
                for (key in this.VKI_deadkey)
804
                  if (key === char) { className.push("alive"); break; }
947
                  if (key === character) { className.push("alive"); break; }
805
              }
948
              }
806
          }
949
          }
807
 
950
 
808
          if (y == tds.length - 1 && tds.length > this.VKI_keyCenter) className.push("last");
951
          if (y == tds.length - 1 && tds.length > this.VKI_keyCenter) className.push("last");
809
          if (lkey[0] == " ") className.push("space");
952
          if (lkey[0] == " ") className.push("space");
Line 842... Line 985...
842
          this.VKI_target.range.text = text;
985
          this.VKI_target.range.text = text;
843
          this.VKI_target.range.collapse(true);
986
          this.VKI_target.range.collapse(true);
844
          this.VKI_target.range.select();
987
          this.VKI_target.range.select();
845
        } else this.VKI_target.value += text;
988
        } else this.VKI_target.value += text;
846
        if (this.VKI_shift) this.VKI_modify("Shift");
989
        if (this.VKI_shift) this.VKI_modify("Shift");
847
        if (this.VKI_alternate) this.VKI_modify("AltGr");
990
        if (this.VKI_altgr) this.VKI_modify("AltGr");
848
        this.VKI_target.focus();
991
        this.VKI_target.focus();
849
      } else if (this.VKI_target.createTextRange && this.VKI_target.range)
992
      } else if (this.VKI_target.createTextRange && this.VKI_target.range)
850
        this.VKI_target.range.select();
993
        this.VKI_target.range.select();
851
    };
994
    };
852
 
995
 
Line 891... Line 1034...
891
 
1034
 
892
    /* ****************************************************************
1035
    /* ****************************************************************
893
     * Position the keyboard
1036
     * Position the keyboard
894
     *
1037
     *
895
     */
1038
     */
896
    this.VKI_position = function() {
1039
    this.VKI_position = function(above) {
-
 
1040
      if (typeof above == "undefined") above = self.VKI_above;
897
      if (self.VKI_visible) {
1041
      if (self.VKI_visible) {
898
        var inputElemPos = VKI_findPos(self.VKI_target);
1042
        var inputElemPos = VKI_findPos(self.VKI_target);
-
 
1043
        above = (above) ? -self.VKI_keyboard.offsetHeight - 3 : self.VKI_target.offsetHeight + 3;
899
        self.VKI_keyboard.style.top = inputElemPos[1] - ((self.VKI_target.keyboardPosition == "fixed" && !self.VKI_isIE && !self.VKI_isMoz) ? VKI_scrollDist()[1] : 0) + self.VKI_target.offsetHeight + 3 + "px";
1044
        self.VKI_keyboard.style.top = inputElemPos[1] - ((self.VKI_target.keyboardPosition == "fixed" && !self.VKI_isIE && !self.VKI_isMoz) ? VKI_scrollDist()[1] : 0) + above + "px";
900
        self.VKI_keyboard.style.left = Math.min(VKI_innerDimensions()[0] - self.VKI_keyboard.offsetWidth - 15, inputElemPos[0]) + "px";
1045
        self.VKI_keyboard.style.left = Math.min(VKI_innerDimensions()[0] - self.VKI_keyboard.offsetWidth - 15, inputElemPos[0]) + "px";
901
        if (self.VKI_isIE6) {
1046
        if (self.VKI_isIE6) {
902
          self.VKI_iframe.style.width = self.VKI_keyboard.offsetWidth + "px";
1047
          self.VKI_iframe.style.width = self.VKI_keyboard.offsetWidth + "px";
903
          self.VKI_iframe.style.height = self.VKI_keyboard.offsetHeight + "px";
1048
          self.VKI_iframe.style.height = self.VKI_keyboard.offsetHeight + "px";
904
          self.VKI_iframe.style.top = self.VKI_keyboard.style.top;
1049
          self.VKI_iframe.style.top = self.VKI_keyboard.style.top;