├── pix └── icon.gif ├── tinymce ├── img │ └── keyboard.png ├── editor_plugin.js ├── css │ └── keyboard.css └── js │ └── keyboard.js ├── thirdpartylibs.xml ├── lang └── en │ └── tinymce_virtualkeyboard.php ├── version.php ├── lib.php └── readme.md /pix/icon.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kndnsow/moodle-tinymce_virtualkeyboard/HEAD/pix/icon.gif -------------------------------------------------------------------------------- /tinymce/img/keyboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kndnsow/moodle-tinymce_virtualkeyboard/HEAD/tinymce/img/keyboard.png -------------------------------------------------------------------------------- /thirdpartylibs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | tinymce/js/ 5 | HTML Virtual Keyboard Interface Script 6 | BSDL 7 | v1.53 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /lang/en/tinymce_virtualkeyboard.php: -------------------------------------------------------------------------------- 1 | . 16 | /** 17 | * Strings for Moodle Vortual Keyboard plugin. 18 | * 19 | * @package tinymce_virtualkeyboard 20 | * @author DualCube 21 | * @copyright 2022 DualCube (https://dualcube.com) 22 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 | */ 24 | $string['pluginname'] = 'Virtual Keyboard'; 25 | -------------------------------------------------------------------------------- /tinymce/editor_plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE plugin Virtual Keyboard 3 | * 4 | * Copyright 2022 DualCube (https://dualcube.com) 5 | * Author DualCube 6 | * License http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 7 | */ 8 | (function() { 9 | var DOM = tinymce.DOM; 10 | tinymce.create('tinymce.plugins.MoodleVirtualKeyboardPlugin', { 11 | init : function(ed, url) { 12 | var s = ed.settings; 13 | // Register commands 14 | ed.addCommand('mceVirtualKeyboard', function() { 15 | document.getElementById(ed.id + 'xyz').click(); 16 | }); 17 | DOM.loadCSS((s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : '') || url + "/css/keyboard.css"); 18 | // Register buttons 19 | ed.addButton('keyboard', { 20 | title : 'virtual keyboard', 21 | cmd : 'mceVirtualKeyboard', 22 | image : url + '/img/keyboard.png' 23 | }); 24 | }, 25 | getInfo : function() { 26 | return { 27 | longname : 'Virtual Keyboard', 28 | author : 'DualCube', 29 | version : '1.2' // Version of Virtual Keyboard plugin this plugin is based on. 30 | }; 31 | } 32 | }); 33 | // Register plugin 34 | tinymce.PluginManager.add('virtualkeyboard', tinymce.plugins.MoodleVirtualKeyboardPlugin); 35 | })(); 36 | -------------------------------------------------------------------------------- /version.php: -------------------------------------------------------------------------------- 1 | . 16 | /** 17 | * TinyMCE virtualkeyboard plugin version details. 18 | * 19 | * @package tinymce_virtualkeyboard 20 | * @author DualCube 21 | * @copyright 2022 DualCube (https://dualcube.com) 22 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 | */ 24 | defined('MOODLE_INTERNAL') || die(); 25 | $plugin->component = 'tinymce_virtualkeyboard'; 26 | $plugin->version = 2023042500; 27 | $plugin->requires = 2013051400; 28 | $plugin->maturity = MATURITY_STABLE; 29 | $plugin->release = '1.3 (Build: 2023042500)'; 30 | -------------------------------------------------------------------------------- /lib.php: -------------------------------------------------------------------------------- 1 | . 16 | /** 17 | * virtual keyboard addons for tinyMCE editor 18 | * 19 | * @package tinymce_virtualkeyboard 20 | * @author DualCube 21 | * @copyright 2022 DualCube (https://dualcube.com) 22 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 | */ 24 | defined('MOODLE_INTERNAL') || die(); 25 | class tinymce_virtualkeyboard extends editor_tinymce_plugin { 26 | /** @var array list of buttons defined by this plugin */ 27 | protected $buttons = array('keyboard'); 28 | /** 29 | * This load require js files and update the init parameters. 30 | * 31 | * @param array $params 32 | * @param context $context 33 | * @param array $options display options: null 34 | * @return void 35 | */ 36 | protected function update_init_params(array &$params, context $context, 37 | array $options = null) { 38 | global $PAGE, $CFG; 39 | // This plugin overrides standard 'image' button, no need to insert new button. 40 | $PAGE->requires->js(new moodle_url( 41 | $CFG->httpswwwroot.'/lib/editor/tinymce/plugins/virtualkeyboard/tinymce/js/keyboard.js')); 42 | // Add JS file, which uses default name. 43 | $this->add_js_plugin($params); 44 | } 45 | /** 46 | * Get sort order. 47 | * 48 | * @return 110 49 | */ 50 | protected function get_sort_order() { 51 | return 110; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | Moodle Virtual Keyboard Plugin [tinymce_virtualkeyboard] 2 | ======================= 3 | * Developed by: Team DualCube 4 | * Copyright: (c) 2022 DualCube (https://dualcube.com) 5 | * License: [GNU GENERAL PUBLIC LICENSE](LICENSE) 6 | * Contributors: DualCube 7 | 8 | Description 9 | =========== 10 | This is a TinyMCE editor add-on plugin that helps to type without Keyboard. It's add a virtual Keyboard on web-page with bunch of language and functionality. 11 | 12 | This is a modification of JavaScript Graphical / Virtual Keyboard Interface by GreyWyvern, 13 | see http://www.greywyvern.com/code/javascript/keyboard 14 | 15 | 16 | _Added features include:_ 17 | * Language: Default Language is “US International”. You can change the language by selecting from this dropdown list. 18 | * Number Pad: This will show the number, basic arithmatic notation and currency symbols. 19 | * Enlarge/Shrink: For zoom In/Out the keyboard. 20 | * Clear Editor: Clear the whole editor text, Image or any others content. 21 | * Close: Close the keyboard. 22 | * Backspace: Delete the character in backward direction of the selected line. 23 | * Enter: Create the new line. 24 | * Right/Left Shift: Toggle the charecter (Small to capital or capital to small) and symbols/numbers. 25 | * Alt: Mathematical symbols and special notation (¼, ß, æ, ø, ¥). 26 | * Space: Single space between character. 27 | * Toggle Dead Key: This will show the dead keys (ù, ò, é, ū). 28 | * Caps: Show the capital letter of the selected language. 29 | 30 | 31 | Installation 32 | ============ 33 | 1. Login to your moodle site as an “admin user” and follow the steps. 34 | 2. Upload the zip package from Site administration > Plugins > Install plugins. or Add files to ["lib/editor/tinymce/plugins/"], check the acknowledgement and install. 35 | 3. Go to Administration > Plugins > Text editors > TinyMCE HTML editor > General settings Settings tab and add the keyword “keyboard” in any position of the “editor_tinymce | customtoolbar ” . 36 | 4. Go to Administration > Plugins > Text editors > Manage editors and ensure thet “TinyMCE HTML editor (legacy)” is in the top of the ‘Available text editors’ list. 37 | 5. This completes all the steps from the administrator end. Now all users can use virtual keyboard in any editable form successful, which will appearon the top of the editor. 38 | 39 | Requirements 40 | ------------ 41 | * Moodle 2.5.0 - 4.1.X 42 | 43 | 44 | 45 | Uninstall 46 | ========= 47 | * Go to Administration > Plugins > Text editors > TinyMCE HTML editor > General settings and find Virtual keyboard on the Plugins list and uninstall. 48 | -------------------------------------------------------------------------------- /tinymce/css/keyboard.css: -------------------------------------------------------------------------------- 1 | span.mce_keyboard img.mceIcon { 2 | object-fit: contain; 3 | object-position: center center; 4 | height: 100%; 5 | width: 100%; 6 | } 7 | #keyboardInputMaster { 8 | position:absolute; 9 | font:normal 0.8rem Arial,sans-serif; 10 | border-top:0.1em solid #eeeeee; 11 | border-right:0.1em solid #888888; 12 | border-bottom:0.1em solid #444444; 13 | border-left:0.1em solid #cccccc; 14 | border-collapse:separate; 15 | border-radius:0.6em; 16 | box-shadow:0 0.2em 1em #444444; 17 | opacity:0.95; 18 | filter:alpha(opacity=95); 19 | background-color:#dddddd; 20 | text-align:left; 21 | z-index:1000000; 22 | width:auto; 23 | height:auto; 24 | min-width:0; 25 | min-height:0; 26 | margin:0; 27 | padding:0; 28 | line-height:normal; 29 | pointer-events:auto; 30 | -moz-user-select:none; 31 | cursor:default; 32 | } 33 | #keyboardInputMaster * { 34 | position:static; 35 | color:#000000; 36 | opacity:1; 37 | filter:alpha(opacity=100); 38 | background:transparent; 39 | font:normal 0.8rem Arial,sans-serif; 40 | width:auto; 41 | height:auto; 42 | min-width:0; 43 | min-height:0; 44 | margin:0; 45 | padding:0; 46 | border:0 none; 47 | outline:0; 48 | vertical-align:baseline; 49 | line-height:1.3em; 50 | pointer-events:auto; 51 | } 52 | #keyboardInputMaster table { 53 | table-layout:auto; 54 | } 55 | #keyboardInputMaster.keyboardInputSize1, 56 | #keyboardInputMaster.keyboardInputSize1 * { 57 | font-size:0.7rem; 58 | } 59 | #keyboardInputMaster.keyboardInputSize3, 60 | #keyboardInputMaster.keyboardInputSize3 * { 61 | font-size:0.9rem; 62 | } 63 | #keyboardInputMaster.keyboardInputSize4, 64 | #keyboardInputMaster.keyboardInputSize4 * { 65 | font-size:1rem; 66 | } 67 | #keyboardInputMaster.keyboardInputSize5, 68 | #keyboardInputMaster.keyboardInputSize5 * { 69 | font-size:1.1rem; 70 | } 71 | 72 | #keyboardInputMaster thead tr th { 73 | padding:0.3em 0.3em 0.1em 0.3em; 74 | background-color:#999999; 75 | white-space:nowrap; 76 | text-align:right; 77 | border-radius:0.6em 0.6em 0 0; 78 | } 79 | #keyboardInputMaster thead tr th div { 80 | float:left; 81 | font-size:130% !important; 82 | height:1.3em; 83 | font-weight:bold; 84 | position:relative; 85 | z-index:1; 86 | margin-right:0.5em; 87 | cursor:pointer; 88 | background-color:transparent; 89 | } 90 | #keyboardInputMaster thead tr th div ol { 91 | position:absolute; 92 | left:0; 93 | top:90%; 94 | list-style-type:none; 95 | height:9.4em; 96 | overflow-y:auto; 97 | overflow-x:hidden; 98 | background-color:#f6f6f6; 99 | border:0.1em solid #999999; 100 | display:none; 101 | text-align:left; 102 | width:12em; 103 | } 104 | #keyboardInputMaster thead tr th div ol li { 105 | padding:0.2em 0.4em; 106 | cursor:pointer; 107 | white-space:nowrap; 108 | width:12em; 109 | } 110 | #keyboardInputMaster thead tr th div ol li.selected { 111 | background-color:#ffffcc; 112 | } 113 | #keyboardInputMaster thead tr th div ol li:hover, 114 | #keyboardInputMaster thead tr th div ol li.hover { 115 | background-color:#dddddd; 116 | } 117 | #keyboardInputMaster thead tr th span, 118 | #keyboardInputMaster thead tr th strong, 119 | #keyboardInputMaster thead tr th small, 120 | #keyboardInputMaster thead tr th big { 121 | display:inline-block; 122 | padding:0 0.4em; 123 | height:1.4em; 124 | line-height:1.4em; 125 | border-top:0.1em solid #e5e5e5; 126 | border-right:0.1em solid #5d5d5d; 127 | border-bottom:0.1em solid #5d5d5d; 128 | border-left:0.1em solid #e5e5e5; 129 | background-color:#cccccc; 130 | cursor:pointer; 131 | margin:0 0 0 0.3em; 132 | border-radius:0.3em; 133 | vertical-align:middle; 134 | transition:background-color .15s ease-in-out; 135 | } 136 | #keyboardInputMaster thead tr th strong { 137 | font-weight:bold; 138 | } 139 | #keyboardInputMaster thead tr th small { 140 | border-radius:0.3em 0 0 0.3em; 141 | border-right:0.1em solid #aaaaaa; 142 | padding:0 0.2em 0 0.3em; 143 | } 144 | #keyboardInputMaster thead tr th big { 145 | border-radius:0 0.3em 0.3em 0; 146 | border-left:0 none; 147 | margin:0; 148 | padding:0 0.3em 0 0.2em; 149 | } 150 | #keyboardInputMaster thead tr th span:hover, 151 | #keyboardInputMaster thead tr th span.hover, 152 | #keyboardInputMaster thead tr th strong:hover, 153 | #keyboardInputMaster thead tr th strong.hover, 154 | #keyboardInputMaster thead tr th small:hover, 155 | #keyboardInputMaster thead tr th small.hover, 156 | #keyboardInputMaster thead tr th big:hover, 157 | #keyboardInputMaster thead tr th big.hover { 158 | background-color:#dddddd; 159 | } 160 | 161 | #keyboardInputMaster tbody tr td { 162 | text-align:left; 163 | padding:0.2em 0.3em 0.3em 0.3em; 164 | vertical-align:top; 165 | } 166 | #keyboardInputMaster tbody tr td div { 167 | text-align:center; 168 | position:relative; 169 | zoom:1; 170 | } 171 | #keyboardInputMaster tbody tr td table { 172 | white-space:nowrap; 173 | width:100%; 174 | border-collapse:separate; 175 | border-spacing:0; 176 | } 177 | #keyboardInputMaster tbody tr td#keyboardInputNumpad table { 178 | margin-left:0.2em; 179 | width:auto; 180 | } 181 | #keyboardInputMaster tbody tr td table.keyboardInputCenter { 182 | width:auto; 183 | margin:0 auto; 184 | } 185 | #keyboardInputMaster tbody tr td table tbody tr td { 186 | vertical-align:middle; 187 | padding:0 0.45em; 188 | white-space:pre; 189 | height:1.8em; 190 | font-family:'Lucida Console','Arial Unicode MS',monospace; 191 | border-top:0.1em solid #e5e5e5; 192 | border-right:0.1em solid #5d5d5d; 193 | border-bottom:0.1em solid #5d5d5d; 194 | border-left:0.1em solid #e5e5e5; 195 | background-color:#eeeeee; 196 | cursor:default; 197 | min-width:0.75em; 198 | border-radius:0.2em; 199 | transition:background-color .15s ease-in-out; 200 | } 201 | #keyboardInputMaster tbody tr td table tbody tr td.last { 202 | width:99%; 203 | } 204 | #keyboardInputMaster tbody tr td table tbody tr td.space { 205 | padding:0 4em; 206 | } 207 | #keyboardInputMaster tbody tr td table tbody tr td.deadkey { 208 | background-color:#ccccdd; 209 | } 210 | #keyboardInputMaster tbody tr td table tbody tr td.target { 211 | background-color:#ddddcc; 212 | } 213 | #keyboardInputMaster tbody tr td table tbody tr td:hover, 214 | #keyboardInputMaster tbody tr td table tbody tr td.hover { 215 | border-top:0.1em solid #d5d5d5; 216 | border-right:0.1em solid #555555; 217 | border-bottom:0.1emsolid #555555; 218 | border-left:0.1em solid #d5d5d5; 219 | background-color:#cccccc; 220 | } 221 | #keyboardInputMaster thead tr th span:active, 222 | #keyboardInputMaster thead tr th span.pressed, 223 | #keyboardInputMaster tbody tr td table tbody tr td:active, 224 | #keyboardInputMaster tbody tr td table tbody tr td.pressed { 225 | border-top:0.1em solid #555555 !important; 226 | border-right:0.1em solid #d5d5d5; 227 | border-bottom:0.1em solid #d5d5d5; 228 | border-left:0.1em solid #555555; 229 | background-color:#cccccc; 230 | } 231 | 232 | #keyboardInputMaster tbody tr td table tbody tr td small { 233 | display:block; 234 | text-align:center; 235 | font-size:0.6em !important; 236 | line-height:1.1em; 237 | } 238 | 239 | #keyboardInputMaster tbody tr td div label { 240 | position:absolute; 241 | bottom:0.2em; 242 | left:0.3em; 243 | } 244 | #keyboardInputMaster tbody tr td div label input { 245 | background-color:#f6f6f6; 246 | vertical-align:middle; 247 | font-size:inherit; 248 | width:1.1em; 249 | height:1.1em; 250 | } 251 | #keyboardInputMaster tbody tr td div var { 252 | position:absolute; 253 | bottom:0; 254 | right:0.3em; 255 | font-weight:bold; 256 | font-style:italic; 257 | color:#444444; 258 | } 259 | 260 | #keyboardInputMaster #keyboardInputNumpadBksp, 261 | #keyboardInputMaster.numpadOnly #keyboardInputSelect, 262 | #keyboardInputMaster.numpadOnly #keyboardInputNumpadToggle, 263 | #keyboardInputMaster.numpadOnly #keyboardInputKeyboard, 264 | #keyboardInputMaster.numpadOnly #keyboardInputNumpad td { 265 | display:none; 266 | } 267 | #keyboardInputMaster.numpadOnly #keyboardInputNumpadBksp { 268 | display:inline-block; 269 | } 270 | #keyboardInputMaster.numpadOnly #keyboardInputNumpad table { 271 | margin-left:auto; 272 | margin-right:auto; 273 | } 274 | #keyboardInputMaster.numpadOnly > thead > tr > th > * { 275 | font-size:125%; 276 | } 277 | #keyboardInputMaster.numpadOnly #keyboardInputNumpad td.digit, 278 | #keyboardInputMaster.numpadOnly #keyboardInputNumpad.showNegative td.negative, 279 | #keyboardInputMaster.numpadOnly #keyboardInputNumpad.showDecimal td.decimal { 280 | display:table-cell; 281 | font-size:200%; 282 | padding:0 0.9em; 283 | } 284 | 285 | .keyboardInputInitiator { 286 | margin:0 0.3em; 287 | vertical-align:middle; 288 | cursor:pointer; 289 | max-height:1.3em; 290 | } -------------------------------------------------------------------------------- /tinymce/js/keyboard.js: -------------------------------------------------------------------------------- 1 | /* ******************************************************************** 2 | ********************************************************************** 3 | * HTML Virtual Keyboard Interface Script - v1.53 4 | * Copyright (c) 2022 - GreyWyvern 5 | * 6 | * - Licenced for free distribution under the BSDL 7 | * https://www.opensource.org/licenses/bsd-license.php 8 | * 9 | * Add a script-driven keyboard interface to text fields, password 10 | * fields and textareas. 11 | * 12 | * See https://greywyvern.com/code/javascript/keyboard/ for examples 13 | * and usage instructions. 14 | * 15 | * Version 1.53 - December 27, 2022 16 | * - Prevent showing mobile keyboard (if possible) when Virtual 17 | * Keyboard is attached 18 | * - Font size is now rem unit based instead of px based so it should 19 | * scale better. 20 | * 21 | * See full changelog at: 22 | * https://greywyvern.com/code/javascript/keyboard/changelog.txt 23 | * 24 | * Keyboard Credits 25 | * - Yiddish (Yidish Lebt) keyboard layout by Simche Taub (jidysz.net) 26 | * - Urdu Phonetic keyboard layout by Khalid Malik 27 | * - Yiddish keyboard layout by Helmut Wollmersdorfer 28 | * - Khmer keyboard layout by Sovann Heng (km-kh.com) 29 | * - Dari keyboard layout by Saif Fazel 30 | * - Kurdish keyboard layout by Ara Qadir 31 | * - Assamese keyboard layout by Kanchan Gogoi 32 | * - Bulgarian BDS keyboard layout by Milen Georgiev 33 | * - Basic Japanese Hiragana/Katakana keyboard layout by Damjan 34 | * - Ukrainian keyboard layout by Dmitry Nikitin 35 | * - Macedonian keyboard layout by Damjan Dimitrioski 36 | * - Pashto keyboard layout by Ahmad Wali Achakzai (qamosona.com) 37 | * - Armenian Eastern and Western keyboard layouts by Hayastan Project (www.hayastan.co.uk) 38 | * - Pinyin keyboard layout from a collaboration with Lou Winklemann 39 | * - Kazakh keyboard layout by Alex Madyankin 40 | * - Danish keyboard layout by Verner Kjærsgaard 41 | * - Slovak keyboard layout by Daniel Lara (www.learningslovak.com) 42 | * - Belarusian and Serbian Cyrillic keyboard layouts by Evgeniy Titov 43 | * - Bulgarian Phonetic keyboard layout by Samuil Gospodinov 44 | * - Swedish keyboard layout by HÃ¥kan Sandberg 45 | * - Romanian keyboard layout by Aurel 46 | * - Farsi (Persian) keyboard layout by Kaveh Bakhtiyari (www.bakhtiyari.com) 47 | * - Burmese keyboard layout by Cetanapa 48 | * - Bosnian/Croatian/Serbian Latin/Slovenian keyboard layout by Miran Zeljko 49 | * - Hungarian keyboard layout by Antal Sall 'Hiromacu' 50 | * - Arabic keyboard layout by Srinivas Reddy 51 | * - Italian and Spanish (Spain) keyboard layouts by dictionarist.com 52 | * - Lithuanian and Russian keyboard layouts by Ramunas 53 | * - German keyboard layout by QuHno 54 | * - French keyboard layout by Hidden Evil 55 | * - Polish Programmers layout by moose 56 | * - Turkish keyboard layouts by offcu 57 | * - Dutch and US Int'l keyboard layouts by jerone 58 | * 59 | */ 60 | var VKI_attach, VKI_close; 61 | (function() { 62 | let self = this; 63 | 64 | let scripts = document.getElementsByTagName('script'); 65 | let scrpath = new URL(scripts[scripts.length - 1].src); 66 | 67 | this.VKI_version = '1.53'; 68 | this.VKI_showVersion = true; // Display the version number 69 | this.VKI_deadBox = true; // Show the dead keys checkbox 70 | this.VKI_deadkeysOn = false; // Turn dead keys on by default 71 | this.VKI_numberPad = true; // Allow user to open and close the number pad 72 | this.VKI_numberPadOn = false; // Show number pad by default 73 | this.VKI_kts = this.VKI_kt = 'US International'; // Default keyboard layout 74 | this.VKI_langAdapt = true; // Use lang attribute of input to pre-select keyboard 75 | this.VKI_size = 2; // Default keyboard size (1-5) 76 | this.VKI_sizeAdj = true; // Allow user to adjust keyboard size 77 | this.VKI_clearPasswords = false; // Clear password fields on focus 78 | this.VKI_flashPassword = 1000; // Flash last character of password: 0 = disabled, > 0 = delay in ms 79 | this.VKI_imageURI = 'keyboard.svg'; // If empty string, use imageless mode 80 | this.VKI_clickless = 0; // 0 = disabled, > 0 = delay in ms 81 | this.VKI_activeTab = 0; // Tab moves to next: 1 = element, 2 = keyboard enabled element 82 | this.VKI_enterSubmit = true; // Submit forms when Enter is pressed 83 | this.VKI_keyCenter = 3; // If this many or fewer keys in a row, center the row 84 | 85 | // Do not touch these 86 | this.VKI_target = false; 87 | this.VKI_shift = this.VKI_shiftlock = false; 88 | this.VKI_altgr = this.VKI_altgrlock = false; 89 | this.VKI_dead = false; 90 | this.VKI_path = scrpath.pathname.replace(/\/[^\/]*$/, '/'); 91 | 92 | this.VKI_isIE = /*@cc_on!@*/false; 93 | this.VKI_isIE6 = /*@if(@_jscript_version == 5.6)!@end@*/false; 94 | this.VKI_isIElt8 = /*@if(@_jscript_version < 5.8)!@end@*/false; 95 | this.VKI_isWebKit = RegExp('KHTML').test(navigator.userAgent); 96 | this.VKI_isOpera = RegExp('Opera').test(navigator.userAgent); 97 | this.VKI_isMoz = (!this.VKI_isWebKit && navigator.product == 'Gecko'); 98 | 99 | /* ***** i18n text strings ************************************* */ 100 | this.VKI_i18n = { 101 | '00': 'Display Number Pad', 102 | '01': 'Display virtual keyboard interface', 103 | '02': 'Select keyboard layout', 104 | '03': 'Dead keys', 105 | '04': 'On', 106 | '05': 'Off', 107 | '06': 'Close the keyboard', 108 | '07': 'Clear', 109 | '08': 'Clear this input', 110 | '09': 'Version', 111 | '10': 'Decrease keyboard size', 112 | '11': 'Increase keyboard size', 113 | '12': 'Backspace' 114 | }; 115 | 116 | 117 | /* ***** Create keyboards ************************************** */ 118 | this.VKI_layout = {}; 119 | 120 | // - Lay out each keyboard in rows of sub-arrays. Each sub-array 121 | // represents one key. 122 | // 123 | // - Each sub-array consists of four slots described as follows: 124 | // example: ['a', 'A', '\u00e1', '\u00c1'] 125 | // 126 | // a) Normal character 127 | // A) Character + Shift/Caps 128 | // \u00e1) Character + Alt/AltGr/AltLk 129 | // \u00c1) Character + Shift/Caps + Alt/AltGr/AltLk 130 | // 131 | // You may include sub-arrays which are fewer than four slots. 132 | // In these cases, the missing slots will be blanked when the 133 | // corresponding modifier key (Shift or AltGr) is pressed. 134 | // 135 | // - If the second slot of a sub-array matches one of the following 136 | // strings: 137 | // 'Tab', 'Caps', 'Shift', 'Enter', 'Bksp', 138 | // 'Alt' OR 'AltGr', 'AltLk' 139 | // then the function of the key will be the following, 140 | // respectively: 141 | // - Insert a tab 142 | // - Toggle Caps Lock (technically a Shift Lock) 143 | // - Next entered character will be the shifted character 144 | // - Insert a newline (textarea), or close the keyboard 145 | // - Delete the previous character 146 | // - Next entered character will be the alternate character 147 | // - Toggle Alt/AltGr Lock 148 | // 149 | // The first slot of this sub-array will be the text to display 150 | // on the corresponding key. This allows for easy localisation 151 | // of key names. 152 | // 153 | // - Layout dead keys (diacritic + letter) should be added as 154 | // property/value pairs of objects with hash keys equal to the 155 | // diacritic. See the 'this.VKI_deadkey' object below the layout 156 | // definitions. In each property/value pair, the value is what 157 | // the diacritic would change the property name to. 158 | // 159 | // - Note that any characters beyond the normal ASCII set should be 160 | // entered in escaped Unicode format. (eg \u00a3 = Pound symbol) 161 | // You can find Unicode values for characters here: 162 | // https://unicode.org/charts/ 163 | // 164 | // - To remove a keyboard, just delete it, or comment it out of the 165 | // source code. If you decide to remove the US International 166 | // keyboard layout, make sure you change the default layout 167 | // (this.VKI_kt) above so it references an existing layout. 168 | 169 | this.VKI_layout['\u0627\u0644\u0639\u0631\u0628\u064a\u0629'] = { 170 | 'name': 'Arabic', 'keys': [ 171 | [['\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']], 172 | [['Tab', 'Tab'], ['\u0636', '\u064e'], ['\u0635', '\u064b'], ['\u062b', '\u064f'], ['\u0642', '\u064c'], ['\u0641', '\u0644'], ['\u063a', '\u0625'], ['\u0639', '\u2018'], ['\u0647', '\u00f7'], ['\u062e', '\u00d7'], ['\u062d', '\u061b'], ['\u062c', '<'], ['\u062f', '>'], ['\\', '|']], 173 | [['Caps', 'Caps'], ['\u0634', '\u0650'], ['\u0633', '\u064d'], ['\u064a', ']'], ['\u0628', '['], ['\u0644', '\u0644'], ['\u0627', '\u0623'], ['\u062a', '\u0640'], ['\u0646', '\u060c'], ['\u0645', '/'], ['\u0643', ':'], ['\u0637', '"'], ['Enter', 'Enter']], 174 | [['Shift', 'Shift'], ['\u0626', '~'], ['\u0621', '\u0652'], ['\u0624', '}'], ['\u0631', '{'], ['\u0644', '\u0644'], ['\u0649', '\u0622'], ['\u0629', '\u2019'], ['\u0648', ','], ['\u0632', '.'], ['\u0638', '\u061f'], ['Shift', 'Shift']], 175 | [[' ', ' ', ' ', ' '], ['Alt', 'Alt']] 176 | ], 'lang': ['ar'] }; 177 | 178 | this.VKI_layout['\u0985\u09b8\u09ae\u09c0\u09df\u09be'] = { 179 | 'name': 'Assamese', 'keys': [ 180 | [['+', '?'], ['\u09E7', '{', '\u09E7'], ['\u09E8', '}', '\u09E8'], ['\u09E9', '\u09CD\u09F0', '\u09E9'], ['\u09EA', '\u09F0\u09CD', '\u09EA'], ['\u09EB', '\u099C\u09CD\u09F0', '\u09EB'], ['\u09EC', '\u0995\u09CD\u09B7', '\u09EC'], ['\u09ED', '\u0995\u09CD\u09F0', '\u09ED'], ['\u09EE', '\u09B6\u09CD\u09F0', '\u09EE'], ['\u09EF', '(', '\u09EF'], ['\u09E6', ')', '\u09E6'], ['-', ''], ['\u09C3', '\u098B', '\u09E2', '\u09E0'], ['Bksp', 'Bksp']], 181 | [['Tab', 'Tab'], ['\u09CC', '\u0994', '\u09D7'], ['\u09C8', '\u0990'], ['\u09BE', '\u0986'], ['\u09C0', '\u0988', '\u09E3', '\u09E1'], ['\u09C2', '\u098A'], ['\u09F1', '\u09AD'], ['\u09B9', '\u0999'], ['\u0997', '\u0998'], ['\u09A6', '\u09A7'], ['\u099C', '\u099D'], ['\u09A1', '\u09A2', '\u09DC', '\u09DD'], ['Enter', 'Enter']], 182 | [['Caps', 'Caps'], ['\u09CB', '\u0993', '\u09F4', '\u09F5'], ['\u09C7', '\u098F', '\u09F6', '\u09F7'], ['\u09CD', '\u0985', '\u09F8', '\u09F9'], ['\u09BF', '\u0987', '\u09E2', '\u098C'], ['\u09C1', '\u0989'], ['\u09AA', '\u09AB'], ['\u09F0', '', '\u09F0', '\u09F1'], ['\u0995', '\u0996'], ['\u09A4', '\u09A5'], ['\u099A', '\u099B'], ['\u099F', '\u09A0'], ['\u09BC', '\u099E']], 183 | [['Shift', 'Shift'], ['\u09CE', '\u0983'], ['\u0982', '\u0981', '\u09FA'], ['\u09AE', '\u09A3'], ['\u09A8', '\u09F7'], ['\u09AC', '"'], ['\u09B2', '\''], ['\u09B8', '\u09B6'], [',', '\u09B7'], ['.', ';'], ['\u09AF', '\u09DF'], ['Shift', 'Shift']], 184 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 185 | ], 'lang': ['as'] }; 186 | 187 | this.VKI_layout['\u0410\u0437\u04d9\u0440\u0431\u0430\u0458\u04b9\u0430\u043d\u04b9\u0430'] = { 188 | 'name': 'Azerbaijani Cyrillic', 'keys': [ 189 | [['`', '~'], ['1', '!'], ['2', '"'], ['3', '\u2116'], ['4', ';'], ['5', '%'], ['6', ':'], ['7', '?'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 190 | [['Tab', 'Tab'], ['\u0458', '\u0408'], ['\u04AF', '\u04AE'], ['\u0443', '\u0423'], ['\u043A', '\u041A'], ['\u0435', '\u0415'], ['\u043D', '\u041D'], ['\u0433', '\u0413'], ['\u0448', '\u0428'], ['\u04BB', '\u04BA'], ['\u0437', '\u0417'], ['\u0445', '\u0425'], ['\u04B9', '\u04B8'], ['\\', '/']], 191 | [['Caps', 'Caps'], ['\u0444', '\u0424'], ['\u044B', '\u042B'], ['\u0432', '\u0412'], ['\u0430', '\u0410'], ['\u043F', '\u041F'], ['\u0440', '\u0420'], ['\u043E', '\u041E'], ['\u043B', '\u041B'], ['\u0434', '\u0414'], ['\u0436', '\u0416'], ['\u049D', '\u049C'], ['Enter', 'Enter']], 192 | [['Shift', 'Shift'], ['\\', '|'], ['\u04D9', '\u04D8'], ['\u0447', '\u0427'], ['\u0441', '\u0421'], ['\u043C', '\u041C'], ['\u0438', '\u0418'], ['\u0442', '\u0422'], ['\u0493', '\u0492'], ['\u0431', '\u0411'], ['\u04E9', '\u04E8'], ['.', ','], ['Shift', 'Shift']], 193 | [[' ', ' ']] 194 | ], 'lang': ['az-Cyrl'] }; 195 | 196 | this.VKI_layout['Az\u0259rbaycanca'] = { 197 | 'name': 'Azerbaijani Latin', 'keys': [ 198 | [['`', '~'], ['1', '!'], ['2', '"'], ['3', '\u2166'], ['4', ';'], ['5', '%'], ['6', ':'], ['7', '?'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 199 | [['Tab', 'Tab'], ['q', 'Q'], ['\u00FC', '\u00DC'], ['e', 'E'], ['r', 'R'], ['t', 'T'], ['y', 'Y'], ['u', 'U'], ['i', '\u0130'], ['o', 'O'], ['p', 'P'], ['\u00F6', '\u00D6'], ['\u011F', '\u011E'], ['\\', '/']], 200 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u0131', 'I'], ['\u0259', '\u018F'], ['Enter', 'Enter']], 201 | [['Shift', 'Shift'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], ['\u00E7', '\u00C7'], ['\u015F', '\u015E'], ['.', ','], ['Shift', 'Shift']], 202 | [[' ', ' ']] 203 | ], 'lang': ['az'] }; 204 | 205 | this.VKI_layout['\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f'] = { 206 | 'name': 'Belarusian', 'keys': [ 207 | [['\u0451', '\u0401'], ['1', '!'], ['2', '"'], ['3', '\u2116'], ['4', ';'], ['5', '%'], ['6', ':'], ['7', '?'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 208 | [['Tab', 'Tab'], ['\u0439', '\u0419'], ['\u0446', '\u0426'], ['\u0443', '\u0423'], ['\u043a', '\u041a'], ['\u0435', '\u0415'], ['\u043d', '\u041d'], ['\u0433', '\u0413'], ['\u0448', '\u0428'], ['\u045e', '\u040e'], ['\u0437', '\u0417'], ['\u0445', '\u0425'], ['\'', '\''], ['\\', '/']], 209 | [['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']], 210 | [['Shift', 'Shift'], ['/', '|'], ['\u044f', '\u042f'], ['\u0447', '\u0427'], ['\u0441', '\u0421'], ['\u043c', '\u041c'], ['\u0456', '\u0406'], ['\u0442', '\u0422'], ['\u044c', '\u042c'], ['\u0431', '\u0411'], ['\u044e', '\u042e'], ['.', ','], ['Shift', 'Shift']], 211 | [[' ', ' ']] 212 | ], 'lang': ['be'] }; 213 | 214 | this.VKI_layout['Belgische / Belge'] = { 215 | 'name': 'Belgian', 'keys': [ 216 | [['\u00b2', '\u00b3'], ['&', '1', '|'], ['\u00e9', '2', '@'], ['"', '3', '#'], ['\'', '4'], ['(', '5'], ['\u00a7', '6', '^'], ['\u00e8', '7'], ['!', '8'], ['\u00e7', '9', '{'], ['\u00e0', '0', '}'], [')', '\u00b0'], ['-', '_'], ['Bksp', 'Bksp']], 217 | [['Tab', 'Tab'], ['a', 'A'], ['z', 'Z'], ['e', 'E', '\u20ac'], ['r', 'R'], ['t', 'T'], ['y', 'Y'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['^', '\u00a8', '['], ['$', '*', ']'], ['\u03bc', '\u00a3', '`']], 218 | [['Caps', 'Caps'], ['q', 'Q'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['m', 'M'], ['\u00f9', '%', '\u00b4'], ['Enter', 'Enter']], 219 | [['Shift', 'Shift'], ['<', '>', '\\'], ['w', 'W'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], [',', '?'], [';', '.'], [':', '/'], ['=', '+', '~'], ['Shift', 'Shift']], 220 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 221 | ], 'lang': ['nl-BE', 'fr-BE'] }; 222 | 223 | this.VKI_layout['\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438 \u0424\u043e\u043d\u0435\u0442\u0438\u0447\u0435\u043d'] = { 224 | 'name': 'Bulgarian Phonetic', 'keys': [ 225 | [['\u0447', '\u0427'], ['1', '!'], ['2', '@'], ['3', '#'], ['4', '$'], ['5', '%'], ['6', '^'], ['7', '&'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 226 | [['Tab', 'Tab'], ['\u044F', '\u042F'], ['\u0432', '\u0412'], ['\u0435', '\u0415'], ['\u0440', '\u0420'], ['\u0442', '\u0422'], ['\u044A', '\u042A'], ['\u0443', '\u0423'], ['\u0438', '\u0418'], ['\u043E', '\u041E'], ['\u043F', '\u041F'], ['\u0448', '\u0428'], ['\u0449', '\u0429'], ['\u044E', '\u042E']], 227 | [['Caps', 'Caps'], ['\u0430', '\u0410'], ['\u0441', '\u0421'], ['\u0434', '\u0414'], ['\u0444', '\u0424'], ['\u0433', '\u0413'], ['\u0445', '\u0425'], ['\u0439', '\u0419'], ['\u043A', '\u041A'], ['\u043B', '\u041B'], [';', ':'], ['\'', '"'], ['Enter', 'Enter']], 228 | [['Shift', 'Shift'], ['\u0437', '\u0417'], ['\u044C', '\u042C'], ['\u0446', '\u0426'], ['\u0436', '\u0416'], ['\u0431', '\u0411'], ['\u043D', '\u041D'], ['\u043C', '\u041C'], [',', '<'], ['.', '>'], ['/', '?'], ['Shift', 'Shift']], 229 | [[' ', ' ']] 230 | ], 'lang': ['bg'] }; 231 | 232 | this.VKI_layout['\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438'] = { 233 | 'name': 'Bulgarian BDS', 'keys': [ 234 | [['`', '~'], ['1', '!'], ['2', '?'], ['3', '+'], ['4', '"'], ['5', '%'], ['6', '='], ['7', ':'], ['8', '/'], ['9', '_'], ['0', '\u2116'], ['-', '\u0406'], ['=', 'V'], ['Bksp', 'Bksp']], 235 | [['Tab', 'Tab'], [',', '\u044b'], ['\u0443', '\u0423'], ['\u0435', '\u0415'], ['\u0438', '\u0418'], ['\u0448', '\u0428'], ['\u0449', '\u0429'], ['\u043a', '\u041a'], ['\u0441', '\u0421'], ['\u0434', '\u0414'], ['\u0437', '\u0417'], ['\u0446', '\u0426'], [';', '\u00a7'], ['(', ')']], 236 | [['Caps', 'Caps'], ['\u044c', '\u042c'], ['\u044f', '\u042f'], ['\u0430', '\u0410'], ['\u043e', '\u041e'], ['\u0436', '\u0416'], ['\u0433', '\u0413'], ['\u0442', '\u0422'], ['\u043d', '\u041d'], ['\u0412', '\u0412'], ['\u043c', '\u041c'], ['\u0447', '\u0427'], ['Enter', 'Enter']], 237 | [['Shift', 'Shift'], ['\u042e', '\u044e'], ['\u0439', '\u0419'], ['\u044a', '\u042a'], ['\u044d', '\u042d'], ['\u0444', '\u0424'], ['\u0445', '\u0425'], ['\u043f', '\u041f'], ['\u0440', '\u0420'], ['\u043b', '\u041b'], ['\u0431', '\u0411'], ['Shift', 'Shift']], 238 | [[' ', ' ']] 239 | ]}; 240 | 241 | this.VKI_layout['\u09ac\u09be\u0982\u09b2\u09be'] = { 242 | 'name': 'Bengali', 'keys': [ 243 | [[''], ['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']], 244 | [['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'], ['Enter', 'Enter']], 245 | [['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'], ['\u09BC', '\u099E']], 246 | [['Shift', 'Shift'], [''], ['\u0982', '\u0981', '\u09FA'], ['\u09AE', '\u09A3'], ['\u09A8'], ['\u09AC'], ['\u09B2'], ['\u09B8', '\u09B6'], [',', '\u09B7'], ['.', '{'], ['\u09AF', '\u09DF'], ['Shift', 'Shift']], 247 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 248 | ], 'lang': ['bn'] }; 249 | 250 | this.VKI_layout['Bosanski'] = { 251 | 'name': 'Bosnian', 'keys': [ 252 | [['\u00B8', '\u00A8'], ['1', '!', '~'], ['2', '"', '\u02C7'], ['3', '#', '^'], ['4', '$', '\u02D8'], ['5', '%', '\u00B0'], ['6', '&', '\u02DB'], ['7', '/', '`'], ['8', '(', '\u02D9'], ['9', ')', '\u00B4'], ['0', '=', '\u02DD'], ['\'', '?', '\u00A8'], ['+', '*', '\u00B8'], ['Bksp', 'Bksp']], 253 | [['Tab', 'Tab'], ['q', 'Q', '\\'], ['w', 'W', '|'], ['e', 'E', '\u20AC'], ['r', 'R'], ['t', 'T'], ['z', 'Z'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['\u0161', '\u0160', '\u00F7'], ['\u0111', '\u0110', '\u00D7'], ['\u017E', '\u017D', '\u00A4']], 254 | [['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'], ['Enter', 'Enter']], 255 | [['Shift', 'Shift'], ['<', '>'], ['y', 'Y'], ['x', 'X'], ['c', 'C'], ['v', 'V', '@'], ['b', 'B', '{'], ['n', 'N', '}'], ['m', 'M', '\u00A7'], [',', ';', '<'], ['.', ':', '>'], ['-', '_', '\u00A9'], ['Shift', 'Shift']], 256 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 257 | ], 'lang': ['bs'] }; 258 | 259 | this.VKI_layout['Canadienne-fran\u00e7aise'] = { 260 | 'name': 'Canadian French', 'keys': [ 261 | [['#', '|', '\\'], ['1', '!', '\u00B1'], ['2', '"', '@'], ['3', '/', '\u00A3'], ['4', '$', '\u00A2'], ['5', '%', '\u00A4'], ['6', '?', '\u00AC'], ['7', '&', '\u00A6'], ['8', '*', '\u00B2'], ['9', '(', '\u00B3'], ['0', ')', '\u00BC'], ['-', '_', '\u00BD'], ['=', '+', '\u00BE'], ['Bksp', 'Bksp']], 262 | [['Tab', 'Tab'], ['q', 'Q'], ['w', 'W'], ['e', 'E'], ['r', 'R'], ['t', 'T'], ['y', 'Y'], ['u', 'U'], ['i', 'I'], ['o', 'O', '\u00A7'], ['p', 'P', '\u00B6'], ['^', '^', '['], ['\u00B8', '\u00A8', ']'], ['<', '>', '}']], 263 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], [';', ':', '~'], ['`', '`', '{'], ['Enter', 'Enter']], 264 | [['Shift', 'Shift'], ['\u00AB', '\u00BB', '\u00B0'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M', '\u00B5'], [',', '\'', '\u00AF'], ['.', '.', '\u00AD'], ['\u00E9', '\u00C9', '\u00B4'], ['Shift', 'Shift']], 265 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 266 | ], 'lang': ['fr-CA'] }; 267 | 268 | this.VKI_layout['\u010cesky'] = { 269 | 'name': 'Czech', 'keys': [ 270 | [[';', '\u00b0', '`', '~'], ['+', '1', '!'], ['\u011B', '2', '@'], ['\u0161', '3', '#'], ['\u010D', '4', '$'], ['\u0159', '5', '%'], ['\u017E', '6', '^'], ['\u00FD', '7', '&'], ['\u00E1', '8', '*'], ['\u00ED', '9', '('], ['\u00E9', '0', ')'], ['=', '%', '-', '_'], ['\u00B4', '\u02c7', '=', '+'], ['Bksp', 'Bksp']], 271 | [['Tab', 'Tab'], ['q', 'Q'], ['w', 'W'], ['e', 'E', '\u20AC'], ['r', 'R'], ['t', 'T'], ['y', 'Y'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['\u00FA', '/', '[', '{'], [')', '(', ']', '}'], ['\u00A8', '\'', '\\', '|']], 272 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u016F', '"', ';', ':'], ['\u00A7', '!', '\u00a4', '^'], ['Enter', 'Enter']], 273 | [['Shift', 'Shift'], ['\\', '|', '', '\u02dd'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', '?', '<', '\u00d7'], ['.', ':', '>', '\u00f7'], ['-', '_', '/', '?'], ['Shift', 'Shift']], 274 | [[' ', ' ', ' ', ' '], ['Alt', 'Alt']] 275 | ], 'lang': ['cs'] }; 276 | 277 | this.VKI_layout['Dansk'] = { 278 | 'name': 'Danish', 'keys': [ 279 | [['\u00bd', '\u00a7'], ['1', '!'], ['2', '"', '@'], ['3', '#', '\u00a3'], ['4', '\u00a4', '$'], ['5', '%', '\u20ac'], ['6', '&'], ['7', '/', '{'], ['8', '(', '['], ['9', ')', ']'], ['0', '=', '}'], ['+', '?'], ['\u00b4', '`', '|'], ['Bksp', 'Bksp']], 280 | [['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', '^', '~'], ['\'', '*']], 281 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00e6', '\u00c6'], ['\u00f8', '\u00d8'], ['Enter', 'Enter']], 282 | [['Shift', 'Shift'], ['<', '>', '\\'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M', '\u03bc', '\u039c'], [',', ';'], ['.', ':'], ['-', '_'], ['Shift', 'Shift']], 283 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 284 | ], 'lang': ['da'] }; 285 | 286 | this.VKI_layout['Deutsch'] = { 287 | 'name': 'German', 'keys': [ 288 | [['^', '\u00b0'], ['1', '!'], ['2', '"', '\u00b2'], ['3', '\u00a7', '\u00b3'], ['4', '$'], ['5', '%'], ['6', '&'], ['7', '/', '{'], ['8', '(', '['], ['9', ')', ']'], ['0', '=', '}'], ['\u00df', '?', '\\'], ['\u00b4', '`'], ['Bksp', 'Bksp']], 289 | [['Tab', 'Tab'], ['q', 'Q', '@'], ['w', 'W'], ['e', 'E', '\u20ac'], ['r', 'R'], ['t', 'T'], ['z', 'Z'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['\u00fc', '\u00dc'], ['+', '*', '~'], ['#', '\'']], 290 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00f6', '\u00d6'], ['\u00e4', '\u00c4'], ['Enter', 'Enter']], 291 | [['Shift', 'Shift'], ['<', '>', '\u00a6'], ['y', 'Y'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M', '\u00b5'], [',', ';'], ['.', ':'], ['-', '_'], ['Shift', 'Shift']], 292 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 293 | ], 'lang': ['de'] }; 294 | 295 | this.VKI_layout['Dingbats'] = { 296 | 'name': 'Dingbats', 'keys': [ 297 | [['\u2764', '\u2765', '\u2766', '\u2767'], ['\u278a', '\u2780', '\u2776', '\u2768'], ['\u278b', '\u2781', '\u2777', '\u2769'], ['\u278c', '\u2782', '\u2778', '\u276a'], ['\u278d', '\u2783', '\u2779', '\u276b'], ['\u278e', '\u2784', '\u277a', '\u276c'], ['\u278f', '\u2785', '\u277b', '\u276d'], ['\u2790', '\u2786', '\u277c', '\u276e'], ['\u2791', '\u2787', '\u277d', '\u276f'], ['\u2792', '\u2788', '\u277e', '\u2770'], ['\u2793', '\u2789', '\u277f', '\u2771'], ['\u2795', '\u2796', '\u274c', '\u2797'], ['\u2702', '\u2704', '\u2701', '\u2703'], ['Bksp', 'Bksp']], 298 | [['Tab', 'Tab'], ['\u2714', '\u2705', '\u2713'], ['\u2718', '\u2715', '\u2717', '\u2716'], ['\u271a', '\u2719', '\u271b', '\u271c'], ['\u271d', '\u271e', '\u271f', '\u2720'], ['\u2722', '\u2723', '\u2724', '\u2725'], ['\u2726', '\u2727', '\u2728', '\u2756'], ['\u2729', '\u272a', '\u272d', '\u2730'], ['\u272c', '\u272b', '\u272e', '\u272f'], ['\u2736', '\u2731', '\u2732', '\u2749'], ['\u273b', '\u273c', '\u273d', '\u273e'], ['\u2744', '\u2745', '\u2746', '\u2743'], ['\u2733', '\u2734', '\u2735', '\u2721'], ['\u2737', '\u2738', '\u2739', '\u273a']], 299 | [['Caps', 'Caps'], ['\u2799', '\u279a', '\u2798', '\u2758'], ['\u27b5', '\u27b6', '\u27b4', '\u2759'], ['\u27b8', '\u27b9', '\u27b7', '\u275a'], ['\u2794', '\u279c', '\u27ba', '\u27bb'], ['\u279d', '\u279e', '\u27a1', '\u2772'], ['\u27a9', '\u27aa', '\u27ab', '\u27ac'], ['\u27a4', '\u27a3', '\u27a2', '\u279b'], ['\u27b3', '\u27bc', '\u27bd', '\u2773'], ['\u27ad', '\u27ae', '\u27af', '\u27b1'], ['\u27a8', '\u27a6', '\u27a5', '\u27a7'], ['\u279f', '\u27a0', '\u27be', '\u27b2'], ['Enter', 'Enter']], 300 | [['Shift', 'Shift'], ['\u270c', '\u270b', '\u270a', '\u270d'], ['\u274f', '\u2750', '\u2751', '\u2752'], ['\u273f', '\u2740', '\u2741', '\u2742'], ['\u2747', '\u2748', '\u274a', '\u274b'], ['\u2757', '\u2755', '\u2762', '\u2763'], ['\u2753', '\u2754', '\u27b0', '\u27bf'], ['\u270f', '\u2710', '\u270e', '\u2774'], ['\u2712', '\u2711', '\u274d', '\u274e'], ['\u2709', '\u2706', '\u2708', '\u2707'], ['\u275b', '\u275d', '\u2761', '\u2775'], ['\u275c', '\u275e', '\u275f', '\u2760'], ['Shift', 'Shift']], 301 | [['AltLk', 'AltLk'], [' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 302 | ]}; 303 | 304 | this.VKI_layout['\u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0'] = { 305 | 'name': 'Divehi', 'keys': [ 306 | [['`', '~'], ['1', '!'], ['2', '@'], ['3', '#'], ['4', '$'], ['5', '%'], ['6', '^'], ['7', '&'], ['8', '*'], ['9', ')'], ['0', '('], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 307 | [['Tab', 'Tab'], ['\u07ab', '\u00d7'], ['\u07ae', '\u2019'], ['\u07a7', '\u201c'], ['\u07a9', '/'], ['\u07ad', ':'], ['\u078e', '\u07a4'], ['\u0783', '\u079c'], ['\u0789', '\u07a3'], ['\u078c', '\u07a0'], ['\u0780', '\u0799'], ['\u078d', '\u00f7'], ['[', '{'], [']', '}']], 308 | [['Caps', 'Caps'], ['\u07a8', '<'], ['\u07aa', '>'], ['\u07b0', '.', ',', ','], ['\u07a6', '\u060c'], ['\u07ac', '"'], ['\u0788', '\u07a5'], ['\u0787', '\u07a2'], ['\u0782', '\u0798'], ['\u0786', '\u079a'], ['\u078a', '\u07a1'], ['\ufdf2', '\u061b', ';', ';'], ['Enter', 'Enter']], 309 | [['Shift', 'Shift'], ['\\', '|'], ['\u0792', '\u0796'], ['\u0791', '\u0795'], ['\u0790', '\u078f'], ['\u0794', '\u0797', '\u200D'], ['\u0785', '\u079f', '\u200C'], ['\u078b', '\u079b', '\u200E'], ['\u0784', '\u079D', '\u200F'], ['\u0781', '\\'], ['\u0793', '\u079e'], ['\u07af', '\u061f'], ['Shift', 'Shift']], 310 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 311 | ], 'lang': ['dv'] }; 312 | 313 | this.VKI_layout['Dvorak'] = { 314 | 'name': 'Dvorak', 'keys': [ 315 | [['`', '~'], ['1', '!'], ['2', '@'], ['3', '#'], ['4', '$'], ['5', '%'], ['6', '^'], ['7', '&'], ['8', '*'], ['9', '('], ['0', ')'], ['[', '{'], [']', '}'], ['Bksp', 'Bksp']], 316 | [['Tab', 'Tab'], ['\'', '"'], [',', '<'], ['.', '>'], ['p', 'P'], ['y', 'Y'], ['f', 'F'], ['g', 'G'], ['c', 'C'], ['r', 'R'], ['l', 'L'], ['/', '?'], ['=', '+'], ['\\', '|']], 317 | [['Caps', 'Caps'], ['a', 'A'], ['o', 'O'], ['e', 'E'], ['u', 'U'], ['i', 'I'], ['d', 'D'], ['h', 'H'], ['t', 'T'], ['n', 'N'], ['s', 'S'], ['-', '_'], ['Enter', 'Enter']], 318 | [['Shift', 'Shift'], [';', ':'], ['q', 'Q'], ['j', 'J'], ['k', 'K'], ['x', 'X'], ['b', 'B'], ['m', 'M'], ['w', 'W'], ['v', 'V'], ['z', 'Z'], ['Shift', 'Shift']], 319 | [[' ', ' ']] 320 | ]}; 321 | 322 | this.VKI_layout['\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac'] = { 323 | 'name': 'Greek', 'keys': [ 324 | [['`', '~'], ['1', '!'], ['2', '@', '\u00b2'], ['3', '#', '\u00b3'], ['4', '$', '\u00a3'], ['5', '%', '\u00a7'], ['6', '^', '\u00b6'], ['7', '&'], ['8', '*', '\u00a4'], ['9', '(', '\u00a6'], ['0', ')', '\u00ba'], ['-', '_', '\u00b1'], ['=', '+', '\u00bd'], ['Bksp', 'Bksp']], 325 | [['Tab', 'Tab'], [';', ':'], ['\u03c2', '^'], ['\u03b5', '\u0395'], ['\u03c1', '\u03a1'], ['\u03c4', '\u03a4'], ['\u03c5', '\u03a5'], ['\u03b8', '\u0398'], ['\u03b9', '\u0399'], ['\u03bf', '\u039f'], ['\u03c0', '\u03a0'], ['[', '{', '\u201c'], [']', '}', '\u201d'], ['\\', '|', '\u00ac']], 326 | [['Caps', 'Caps'], ['\u03b1', '\u0391'], ['\u03c3', '\u03a3'], ['\u03b4', '\u0394'], ['\u03c6', '\u03a6'], ['\u03b3', '\u0393'], ['\u03b7', '\u0397'], ['\u03be', '\u039e'], ['\u03ba', '\u039a'], ['\u03bb', '\u039b'], ['\u0384', '\u00a8', '\u0385'], ['\'', '"'], ['Enter', 'Enter']], 327 | [['Shift', 'Shift'], ['<', '>'], ['\u03b6', '\u0396'], ['\u03c7', '\u03a7'], ['\u03c8', '\u03a8'], ['\u03c9', '\u03a9'], ['\u03b2', '\u0392'], ['\u03bd', '\u039d'], ['\u03bc', '\u039c'], [',', '<'], ['.', '>'], ['/', '?'], ['Shift', 'Shift']], 328 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 329 | ], 'lang': ['el'] }; 330 | 331 | this.VKI_layout['Eesti'] = { 332 | 'name': 'Estonian', 'keys': [ 333 | [['\u02C7', '~'], ['1', '!'], ['2', '"', '@', '@'], ['3', '#', '\u00A3', '\u00A3'], ['4', '\u00A4', '$', '$'], ['5', '%', '\u20AC'], ['6', '&'], ['7', '/', '{', '{'], ['8', '(', '[', '['], ['9', ')', ']', ']'], ['0', '=', '}', '}'], ['+', '?', '\\', '\\'], ['\u00B4', '`'], ['Bksp', 'Bksp']], 334 | [['Tab', 'Tab'], ['q', 'Q'], ['w', 'W'], ['e', 'E', '\u20AC'], ['r', 'R'], ['t', 'T'], ['y', 'Y'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['\u00FC', '\u00DC'], ['\u00F5', '\u00D5', '\u00A7', '\u00A7'], ['\'', '*', '\u00BD', '\u00BD']], 335 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S', '\u0161', '\u0160'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00F6', '\u00D6'], ['\u00E4', '\u00C4', '^', '^'], ['Enter', 'Enter']], 336 | [['Shift', 'Shift'], ['<', '>', '|', '|'], ['z', 'Z', '\u017E', '\u017D'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', ';'], ['.', ':'], ['-', '_'], ['Shift', 'Shift']], 337 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 338 | ], 'lang': ['et'] }; 339 | 340 | this.VKI_layout['Espa\u00f1ol'] = { 341 | 'name': 'Spanish', 'keys': [ 342 | [['\u00ba', '\u00aa', '\\'], ['1', '!', '|'], ['2', '"', '@'], ['3', '\'', '#'], ['4', '$', '~'], ['5', '%', '\u20ac'], ['6', '&', '\u00ac'], ['7', '/'], ['8', '('], ['9', ')'], ['0', '='], ['\'', '?'], ['\u00a1', '\u00bf'], ['Bksp', 'Bksp']], 343 | [['Tab', 'Tab'], ['q', 'Q'], ['w', 'W'], ['e', 'E'], ['r', 'R'], ['t', 'T'], ['y', 'Y'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['`', '^', '['], ['+', '*', ']'], ['\u00e7', '\u00c7', '}']], 344 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00f1', '\u00d1'], ['\u00b4', '\u00a8', '{'], ['Enter', 'Enter']], 345 | [['Shift', 'Shift'], ['<', '>'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', ';'], ['.', ':'], ['-', '_'], ['Shift', 'Shift']], 346 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 347 | ], 'lang': ['es'] }; 348 | 349 | this.VKI_layout['\u062f\u0631\u06cc'] = { 350 | 'name': 'Dari', 'keys': [ 351 | [['\u200D', '\u00F7', '~'], ['\u06F1', '!', '`'], ['\u06F2', '\u066C', '@'], ['\u06F3', '\u066B', '#'], ['\u06F4', '\u060B', '$'], ['\u06F5', '\u066A', '%'], ['\u06F6', '\u00D7', '^'], ['\u06F7', '\u060C', '&'], ['\u06F8', '*', '\u2022'], ['\u06F9', ')', '\u200E'], ['\u06F0', '(', '\u200F'], ['-', '\u0640', '_'], ['=', '+'], ['Bksp', 'Bksp']], 352 | [['Tab', 'Tab'], ['\u0636', '\u0652', '\u00B0'], ['\u0635', '\u064C'], ['\u062B', '\u064D', '\u20AC'], ['\u0642', '\u064B', '\uFD3E'], ['\u0641', '\u064F', '\uFD3F'], ['\u063A', '\u0650', '\u0656'], ['\u0639', '\u064E', '\u0659'], ['\u0647', '\u0651', '\u0655'], ['\u062E', ']', '\''], ['\u062D', '[', '"'], ['\u062C', '}', '\u0681'], ['\u0686', '{', '\u0685'], ['\\', '|', '?']], 353 | [['Caps', 'Caps'], ['\u0634', '\u0624', '\u069A'], ['\u0633', '\u0626', '\u06CD'], ['\u06CC', '\u064A', '\u0649'], ['\u0628', '\u0625', '\u06D0'], ['\u0644', '\u0623', '\u06B7'], ['\u0627', '\u0622', '\u0671'], ['\u062A', '\u0629', '\u067C'], ['\u0646', '\u00BB', '\u06BC'], ['\u0645', '\u00AB', '\u06BA'], ['\u06A9', ':', ';'], ['\u06AF', '\u061B', '\u06AB'], ['Enter', 'Enter']], 354 | [['Shift', 'Shift'], ['\u0638', '\u0643', '\u06D2'], ['\u0637', '\u0653', '\u0691'], ['\u0632', '\u0698', '\u0696'], ['\u0631', '\u0670', '\u0693'], ['\u0630', '\u200C', '\u0688'], ['\u062F', '\u0654', '\u0689'], ['\u067E', '\u0621', '\u0679'], ['\u0648', '>', ','], ['.', '<', '\u06C7'], ['/', '\u061F', '\u06C9'], ['Shift', 'Shift']], 355 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 356 | ], 'lang': ['fa-AF'] }; 357 | 358 | this.VKI_layout['\u0641\u0627\u0631\u0633\u06cc'] = { 359 | 'name': 'Farsi', 'keys': [ 360 | [['\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']], 361 | [['Tab', 'Tab'], ['\u0636', '\u064e'], ['\u0635', '\u064b'], ['\u062b', '\u064f'], ['\u0642', '\u064c'], ['\u0641', '\u0644'], ['\u063a', '\u0625'], ['\u0639', '\u2018'], ['\u0647', '\u00f7'], ['\u062e', '\u00d7'], ['\u062d', '\u061b'], ['\u062c', '<'], ['\u0686', '>'], ['\u0698', '|']], 362 | [['Caps', 'Caps'], ['\u0634', '\u0650'], ['\u0633', '\u064d'], ['\u064a', ']'], ['\u0628', '['], ['\u0644', '\u0644'], ['\u0627', '\u0623'], ['\u062a', '\u0640'], ['\u0646', '\u060c'], ['\u0645', '\\'], ['\u06af', ':'], ['\u0643', '"'], ['Enter', 'Enter']], 363 | [['Shift', 'Shift'], ['\u0638', '~'], ['\u0637', '\u0652'], ['\u0632', '}'], ['\u0631', '{'], ['\u0630', '\u0644'], ['\u062f', '\u0622'], ['\u0626', '\u0621'], ['\u0648', ','], ['.', '.'], ['/', '\u061f'], ['Shift', 'Shift']], 364 | [[' ', ' ', ' ', ' '], ['Alt', 'Alt']] 365 | ], 'lang': ['fa'] }; 366 | 367 | this.VKI_layout['F\u00f8royskt'] = { 368 | 'name': 'Faeroese', 'keys': [ 369 | [['\u00BD', '\u00A7'], ['1', '!'], ['2', '"', '@'], ['3', '#', '\u00A3'], ['4', '\u00A4', '$'], ['5', '%', '\u20AC'], ['6', '&'], ['7', '/', '{'], ['8', '(', '['], ['9', ')', ']'], ['0', '=', '}'], ['+', '?'], ['\u00B4', '`', '|'], ['Bksp', 'Bksp']], 370 | [['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'], ['\u00F0', '\u00D0', '~'], ['\'', '*']], 371 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00E6', '\u00C6'], ['\u00F8', '\u00D8', '^'], ['Enter', 'Enter']], 372 | [['Shift', 'Shift'], ['<', '>', '\\'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M', '\u00B5'], [',', ';'], ['.', ':'], ['-', '_'], ['Shift', 'Shift']], 373 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 374 | ], 'lang': ['fo'] }; 375 | 376 | this.VKI_layout['Fran\u00e7ais'] = { 377 | 'name': 'French', 'keys': [ 378 | [['\u00b2', '\u00b3'], ['&', '1'], ['\u00e9', '2', '~'], ['"', '3', '#'], ['\'', '4', '{'], ['(', '5', '['], ['-', '6', '|'], ['\u00e8', '7', '`'], ['_', '8', '\\'], ['\u00e7', '9', '^'], ['\u00e0', '0', '@'], [')', '\u00b0', ']'], ['=', '+', '}'], ['Bksp', 'Bksp']], 379 | [['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'], ['*', '\u03bc']], 380 | [['Caps', 'Caps'], ['q', 'Q'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['m', 'M'], ['\u00f9', '%'], ['Enter', 'Enter']], 381 | [['Shift', 'Shift'], ['<', '>'], ['w', 'W'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], [',', '?'], [';', '.'], [':', '/'], ['!', '\u00a7'], ['Shift', 'Shift']], 382 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 383 | ], 'lang': ['fr'] }; 384 | 385 | this.VKI_layout['Gaeilge'] = { 386 | 'name': 'Irish / Gaelic', 'keys': [ 387 | [['`', '\u00AC', '\u00A6', '\u00A6'], ['1', '!'], ['2', '"'], ['3', '\u00A3'], ['4', '$', '\u20AC'], ['5', '%'], ['6', '^'], ['7', '&'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 388 | [['Tab', 'Tab'], ['q', 'Q'], ['w', 'W'], ['e', 'E', '\u00E9', '\u00C9'], ['r', 'R'], ['t', 'T'], ['y', 'Y', '\u00FD', '\u00DD'], ['u', 'U', '\u00FA', '\u00DA'], ['i', 'I', '\u00ED', '\u00CD'], ['o', 'O', '\u00F3', '\u00D3'], ['p', 'P'], ['[', '{'], [']', '}'], ['#', '~']], 389 | [['Caps', 'Caps'], ['a', 'A', '\u00E1', '\u00C1'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], [';', ':'], ['\'', '@', '\u00B4', '`'], ['Enter', 'Enter']], 390 | [['Shift', 'Shift'], ['\\', '|'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', '<'], ['.', '>'], ['/', '?'], ['Shift', 'Shift']], 391 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 392 | ], 'lang': ['ga', 'gd'] }; 393 | 394 | this.VKI_layout['\u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0'] = { 395 | 'name': 'Gujarati', 'keys': [ 396 | [[''], ['1', '\u0A8D', '\u0AE7'], ['2', '\u0AC5', '\u0AE8'], ['3', '\u0ACD\u0AB0', '\u0AE9'], ['4', '\u0AB0\u0ACD', '\u0AEA'], ['5', '\u0A9C\u0ACD\u0A9E', '\u0AEB'], ['6', '\u0AA4\u0ACD\u0AB0', '\u0AEC'], ['7', '\u0A95\u0ACD\u0AB7', '\u0AED'], ['8', '\u0AB6\u0ACD\u0AB0', '\u0AEE'], ['9', '(', '\u0AEF'], ['0', ')', '\u0AE6'], ['-', '\u0A83'], ['\u0AC3', '\u0A8B', '\u0AC4', '\u0AE0'], ['Bksp', 'Bksp']], 397 | [['Tab', 'Tab'], ['\u0ACC', '\u0A94'], ['\u0AC8', '\u0A90'], ['\u0ABE', '\u0A86'], ['\u0AC0', '\u0A88'], ['\u0AC2', '\u0A8A'], ['\u0AAC', '\u0AAD'], ['\u0AB9', '\u0A99'], ['\u0A97', '\u0A98'], ['\u0AA6', '\u0AA7'], ['\u0A9C', '\u0A9D'], ['\u0AA1', '\u0AA2'], ['\u0ABC', '\u0A9E'], ['\u0AC9', '\u0A91']], 398 | [['Caps', 'Caps'], ['\u0ACB', '\u0A93'], ['\u0AC7', '\u0A8F'], ['\u0ACD', '\u0A85'], ['\u0ABF', '\u0A87'], ['\u0AC1', '\u0A89'], ['\u0AAA', '\u0AAB'], ['\u0AB0'], ['\u0A95', '\u0A96'], ['\u0AA4', '\u0AA5'], ['\u0A9A', '\u0A9B'], ['\u0A9F', '\u0AA0'], ['Enter', 'Enter']], 399 | [['Shift', 'Shift'], [''], ['\u0A82', '\u0A81', '', '\u0AD0'], ['\u0AAE', '\u0AA3'], ['\u0AA8'], ['\u0AB5'], ['\u0AB2', '\u0AB3'], ['\u0AB8', '\u0AB6'], [',', '\u0AB7'], ['.', '\u0964', '\u0965', '\u0ABD'], ['\u0AAF'], ['Shift', 'Shift']], 400 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 401 | ], 'lang': ['gu'] }; 402 | 403 | this.VKI_layout['\u05e2\u05d1\u05e8\u05d9\u05ea'] = { 404 | 'name': 'Hebrew', 'keys': [ 405 | [['~', '`'], ['1', '!'], ['2', '@'], ['3', '#'], ['4' , '$', '\u20aa'], ['5' , '%'], ['6', '^'], ['7', '&'], ['8', '*'], ['9', ')'], ['0', '('], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 406 | [['Tab', 'Tab'], ['/', 'Q'], ['\'', 'W'], ['\u05e7', 'E', '\u20ac'], ['\u05e8', 'R'], ['\u05d0', 'T'], ['\u05d8', 'Y'], ['\u05d5', 'U', '\u05f0'], ['\u05df', 'I'], ['\u05dd', 'O'], ['\u05e4', 'P'], ['\\', '|'], ['Enter', 'Enter']], 407 | [['Caps', 'Caps'], ['\u05e9', 'A'], ['\u05d3', 'S'], ['\u05d2', 'D'], ['\u05db', 'F'], ['\u05e2', 'G'], ['\u05d9', 'H', '\u05f2'], ['\u05d7', 'J', '\u05f1'], ['\u05dc', 'K'], ['\u05da', 'L'], ['\u05e3', ':'], [',' , '"'], [']', '}'], ['[', '{']], 408 | [['Shift', 'Shift'], ['\u05d6', 'Z'], ['\u05e1', 'X'], ['\u05d1', 'C'], ['\u05d4', 'V'], ['\u05e0', 'B'], ['\u05de', 'N'], ['\u05e6', 'M'], ['\u05ea', '>'], ['\u05e5', '<'], ['.', '?'], ['Shift', 'Shift']], 409 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 410 | ], 'lang': ['he'] }; 411 | 412 | this.VKI_layout['\u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940'] = { 413 | 'name': 'Devanagari', 'keys': [ 414 | [['\u094A', '\u0912'], ['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', '\u0944', '\u0960'], ['Bksp', 'Bksp']], 415 | [['Tab', 'Tab'], ['\u094C', '\u0914'], ['\u0948', '\u0910'], ['\u093E', '\u0906'], ['\u0940', '\u0908', '\u0963', '\u0961'], ['\u0942', '\u090A'], ['\u092C', '\u092D'], ['\u0939', '\u0919'], ['\u0917', '\u0918', '\u095A'], ['\u0926', '\u0927'], ['\u091C', '\u091D', '\u095B'], ['\u0921', '\u0922', '\u095C', '\u095D'], ['\u093C', '\u091E'], ['\u0949', '\u0911']], 416 | [['Caps', 'Caps'], ['\u094B', '\u0913'], ['\u0947', '\u090F'], ['\u094D', '\u0905'], ['\u093F', '\u0907', '\u0962', '\u090C'], ['\u0941', '\u0909'], ['\u092A', '\u092B', '', '\u095E'], ['\u0930', '\u0931'], ['\u0915', '\u0916', '\u0958', '\u0959'], ['\u0924', '\u0925'], ['\u091A', '\u091B', '\u0952'], ['\u091F', '\u0920', '', '\u0951'], ['Enter', 'Enter']], 417 | [['Shift', 'Shift'], ['\u0946', '\u090E', '\u0953'], ['\u0902', '\u0901', '', '\u0950'], ['\u092E', '\u0923', '\u0954'], ['\u0928', '\u0929'], ['\u0935', '\u0934'], ['\u0932', '\u0933'], ['\u0938', '\u0936'], [',', '\u0937', '\u0970'], ['.', '\u0964', '\u0965', '\u093D'], ['\u092F', '\u095F'], ['Shift', 'Shift']], 418 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 419 | ], 'lang': ['hi-Deva'] }; 420 | 421 | this.VKI_layout['\u0939\u093f\u0902\u0926\u0940'] = { 422 | 'name': 'Hindi', 'keys': [ 423 | [['\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']], 424 | [['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', ']', '}'], ['\u0949', '\u0911', '\\', '|']], 425 | [['Caps', 'Caps'], ['\u094B', '\u0913'], ['\u0947', '\u090F'], ['\u094D', '\u0905'], ['\u093F', '\u0907'], ['\u0941', '\u0909'], ['\u092A', '\u092B'], ['\u0930', '\u0931'], ['\u0915', '\u0916'], ['\u0924', '\u0925'], ['\u091A', '\u091B', ';', ':'], ['\u091F', '\u0920', '\'', '"'], ['Enter', 'Enter']], 426 | [['Shift', 'Shift'], [''], ['\u0902', '\u0901', '', '\u0950'], ['\u092E', '\u0923'], ['\u0928'], ['\u0935'], ['\u0932', '\u0933'], ['\u0938', '\u0936'], [',', '\u0937', ',', '<'], ['.', '\u0964', '.', '>'], ['\u092F', '\u095F', '/', '?'], ['Shift', 'Shift']], 427 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 428 | ], 'lang': ['hi'] }; 429 | 430 | this.VKI_layout['Hrvatski'] = { 431 | 'name': 'Croatian', 'keys': this.VKI_layout['Bosanski'].keys.slice(0), 'lang': ['hr'] 432 | }; 433 | 434 | this.VKI_layout['\u0540\u0561\u0575\u0565\u0580\u0565\u0576 \u0561\u0580\u0565\u0582\u0574\u0578\u0582\u057f\u0584'] = { 435 | 'name': 'Western Armenian', 'keys': [ 436 | [['\u055D', '\u055C'], [':', '1'], ['\u0571', '\u0541'], ['\u0575', '\u0545'], ['\u055B', '3'], [',', '4'], ['-', '9'], ['.', '\u0587'], ['\u00AB', '('], ['\u00BB', ')'], ['\u0585', '\u0555'], ['\u057C', '\u054C'], ['\u056A', '\u053A'], ['Bksp', 'Bksp']], 437 | [['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']], 438 | [['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']], 439 | [['Shift', 'Shift'], ['\u0566', '\u0536'], ['\u0581', '\u0551'], ['\u0563', '\u0533'], ['\u0582', '\u0552'], ['\u057A', '\u054A'], ['\u0576', '\u0546'], ['\u0574', '\u0544'], ['\u0577', '\u0547'], ['\u0572', '\u0542'], ['\u056E', '\u053E'], ['Shift', 'Shift']], 440 | [[' ', ' ']] 441 | ], 'lang': ['hy-arevmda'] }; 442 | 443 | this.VKI_layout['\u0540\u0561\u0575\u0565\u0580\u0565\u0576 \u0561\u0580\u0565\u0582\u0565\u056c\u0584'] = { 444 | 'name': 'Eastern Armenian', 'keys': [ 445 | [['\u055D', '\u055C'], [':', '1'], ['\u0571', '\u0541'], ['\u0575', '\u0545'], ['\u055B', '3'], [',', '4'], ['-', '9'], ['.', '\u0587'], ['\u00AB', '('], ['\u00BB', ')'], ['\u0585', '\u0555'], ['\u057C', '\u054C'], ['\u056A', '\u053A'], ['Bksp', 'Bksp']], 446 | [['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']], 447 | [['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']], 448 | [['Shift', 'Shift'], ['\u0566', '\u0536'], ['\u0581', '\u0551'], ['\u0563', '\u0533'], ['\u057E', '\u054E'], ['\u0562', '\u0532'], ['\u0576', '\u0546'], ['\u0574', '\u0544'], ['\u0577', '\u0547'], ['\u0572', '\u0542'], ['\u056E', '\u053E'], ['Shift', 'Shift']], 449 | [[' ', ' ']] 450 | ], 'lang': ['hy'] }; 451 | 452 | this.VKI_layout['\u00cdslenska'] = { 453 | 'name': 'Icelandic', 'keys': [ 454 | [['\u00B0', '\u00A8', '\u00B0'], ['1', '!'], ['2', '"'], ['3', '#'], ['4', '$'], ['5', '%', '\u20AC'], ['6', '&'], ['7', '/', '{'], ['8', '(', '['], ['9', ')', ']'], ['0', '=', '}'], ['\u00F6', '\u00D6', '\\'], ['-', '_'], ['Bksp', 'Bksp']], 455 | [['Tab', 'Tab'], ['q', 'Q', '@'], ['w', 'W'], ['e', 'E', '\u20AC'], ['r', 'R'], ['t', 'T'], ['y', 'Y'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['\u00F0', '\u00D0'], ['\'', '?', '~'], ['+', '*', '`']], 456 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00E6', '\u00C6'], ['\u00B4', '\'', '^'], ['Enter', 'Enter']], 457 | [['Shift', 'Shift'], ['<', '>', '|'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M', '\u00B5'], [',', ';'], ['.', ':'], ['\u00FE', '\u00DE'], ['Shift', 'Shift']], 458 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 459 | ], 'lang': ['is'] }; 460 | 461 | this.VKI_layout['Italiano'] = { 462 | 'name': 'Italian', 'keys': [ 463 | [['\\', '|'], ['1', '!'], ['2', '"'], ['3', '\u00a3'], ['4', '$', '\u20ac'], ['5', '%'], ['6', '&'], ['7', '/'], ['8', '('], ['9', ')'], ['0', '='], ['\'', '?'], ['\u00ec', '^'], ['Bksp', 'Bksp']], 464 | [['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', '[', '{'], ['+', '*', ']', '}'], ['\u00f9', '\u00a7']], 465 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00f2', '\u00e7', '@'], ['\u00e0', '\u00b0', '#'], ['Enter', 'Enter']], 466 | [['Shift', 'Shift'], ['<', '>'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', ';'], ['.', ':'], ['-', '_'], ['Shift', 'Shift']], 467 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 468 | ], 'lang': ['it'] }; 469 | 470 | this.VKI_layout['\u65e5\u672c\u8a9e'] = { 471 | 'name': 'Japanese Hiragana/Katakana', 'keys': [ 472 | [['\uff5e'], ['\u306c', '\u30cc'], ['\u3075', '\u30d5'], ['\u3042', '\u30a2', '\u3041', '\u30a1'], ['\u3046', '\u30a6', '\u3045', '\u30a5'], ['\u3048', '\u30a8', '\u3047', '\u30a7'], ['\u304a', '\u30aa', '\u3049', '\u30a9'], ['\u3084', '\u30e4', '\u3083', '\u30e3'], ['\u3086', '\u30e6', '\u3085', '\u30e5'], ['\u3088', '\u30e8', '\u3087', '\u30e7'], ['\u308f', '\u30ef', '\u3092', '\u30f2'], ['\u307b', '\u30db', '\u30fc', '\uff1d'], ['\u3078', '\u30d8' , '\uff3e', '\uff5e'], ['Bksp', 'Bksp']], 473 | [['Tab', 'Tab'], ['\u305f', '\u30bf'], ['\u3066', '\u30c6'], ['\u3044', '\u30a4', '\u3043', '\u30a3'], ['\u3059', '\u30b9'], ['\u304b', '\u30ab'], ['\u3093', '\u30f3'], ['\u306a', '\u30ca'], ['\u306b', '\u30cb'], ['\u3089', '\u30e9'], ['\u305b', '\u30bb'], ['\u3001', '\u3001', '\uff20', '\u2018'], ['\u3002', '\u3002', '\u300c', '\uff5b'], ['\uffe5', '', '', '\uff0a'], ['\u309B', '"', '\uffe5', '\uff5c']], 474 | [['Caps', 'Caps'], ['\u3061', '\u30c1'], ['\u3068', '\u30c8'], ['\u3057', '\u30b7'], ['\u306f', '\u30cf'], ['\u304d', '\u30ad'], ['\u304f', '\u30af'], ['\u307e', '\u30de'], ['\u306e', '\u30ce'], ['\u308c', '\u30ec', '\uff1b', '\uff0b'], ['\u3051', '\u30b1', '\uff1a', '\u30f6'], ['\u3080', '\u30e0', '\u300d', '\uff5d'], ['Enter', 'Enter']], 475 | [['Shift', 'Shift'], ['\u3064', '\u30c4'], ['\u3055', '\u30b5'], ['\u305d', '\u30bd'], ['\u3072', '\u30d2'], ['\u3053', '\u30b3'], ['\u307f', '\u30df'], ['\u3082', '\u30e2'], ['\u306d', '\u30cd', '\u3001', '\uff1c'], ['\u308b', '\u30eb', '\u3002', '\uff1e'], ['\u3081', '\u30e1', '\u30fb', '\uff1f'], ['\u308d', '\u30ed', '', '\uff3f'], ['Shift', 'Shift']], 476 | [['AltLk', 'AltLk'], [' ', ' ', ' ', ' '], ['Alt', 'Alt']] 477 | ], 'lang': ['ja'] }; 478 | 479 | this.VKI_layout['\u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8'] = { 480 | 'name': 'Georgian', 'keys': [ 481 | [['\u201E', '\u201C'], ['!', '1'], ['?', '2'], ['\u2116', '3'], ['\u00A7', '4'], ['%', '5'], [':', '6'], ['.', '7'], [';', '8'], [',', '9'], ['/', '0'], ['\u2013', '-'], ['=', '+'], ['Bksp', 'Bksp']], 482 | [['Tab', 'Tab'], ['\u10E6', '\u10E6'], ['\u10EF', '\u10EF'], ['\u10E3', '\u10E3'], ['\u10D9', '\u10D9'], ['\u10D4', '\u10D4', '\u10F1'], ['\u10DC', '\u10DC'], ['\u10D2', '\u10D2'], ['\u10E8', '\u10E8'], ['\u10EC', '\u10EC'], ['\u10D6', '\u10D6'], ['\u10EE', '\u10EE', '\u10F4'], ['\u10EA', '\u10EA'], ['(', ')']], 483 | [['Caps', 'Caps'], ['\u10E4', '\u10E4', '\u10F6'], ['\u10EB', '\u10EB'], ['\u10D5', '\u10D5', '\u10F3'], ['\u10D7', '\u10D7'], ['\u10D0', '\u10D0'], ['\u10DE', '\u10DE'], ['\u10E0', '\u10E0'], ['\u10DD', '\u10DD'], ['\u10DA', '\u10DA'], ['\u10D3', '\u10D3'], ['\u10DF', '\u10DF'], ['Enter', 'Enter']], 484 | [['Shift', 'Shift'], ['\u10ED', '\u10ED'], ['\u10E9', '\u10E9'], ['\u10E7', '\u10E7'], ['\u10E1', '\u10E1'], ['\u10DB', '\u10DB'], ['\u10D8', '\u10D8', '\u10F2'], ['\u10E2', '\u10E2'], ['\u10E5', '\u10E5'], ['\u10D1', '\u10D1'], ['\u10F0', '\u10F0', '\u10F5'], ['Shift', 'Shift']], 485 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 486 | ], 'lang': ['ka'] }; 487 | 488 | this.VKI_layout['\u049a\u0430\u0437\u0430\u049b\u0448\u0430'] = { 489 | 'name': 'Kazakh', 'keys': [ 490 | [['(', ')'], ['"', '!'], ['\u04d9', '\u04d8'], ['\u0456', '\u0406'], ['\u04a3', '\u04a2'], ['\u0493', '\u0492'], [',', ';'], ['.', ':'], ['\u04af', '\u04ae'], ['\u04b1', '\u04b0'], ['\u049b', '\u049a'], ['\u04e9', '\u04e8'], ['\u04bb', '\u04ba'], ['Bksp', 'Bksp']], 491 | [['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'], ['\\', '/']], 492 | [['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']], 493 | [['Shift', 'Shift'], ['\\', '|'], ['\u044F', '\u042F'], ['\u0447', '\u0427'], ['\u0441', '\u0421'], ['\u043C', '\u041C'], ['\u0438', '\u0418'], ['\u0442', '\u0422'], ['\u044C', '\u042C'], ['\u0431', '\u0411'], ['\u044E', '\u042E'], ['\u2116', '?'], ['Shift', 'Shift']], 494 | [[' ', ' ']] 495 | ], 'lang': ['kk'] }; 496 | 497 | this.VKI_layout['\u1797\u17b6\u179f\u17b6\u1781\u17d2\u1798\u17c2\u179a'] = { 498 | 'name': 'Khmer', 'keys': [ 499 | [['\u00AB', '\u00BB','\u200D'], ['\u17E1', '!','\u200C','\u17F1'], ['\u17E2', '\u17D7', '@', '\u17F2'], ['\u17E3', '"', '\u17D1', '\u17F3'], ['\u17E4', '\u17DB', '$', '\u17F4'], ['\u17E5', '%' ,'\u20AC', '\u17F5'], ['\u17E6', '\u17CD', '\u17D9', '\u17F6'], ['\u17E7', '\u17D0', '\u17DA', '\u17F7'], ['\u17E8', '\u17CF', '*', '\u17F8'], ['\u17E9', '(', '{', '\u17F9'], ['\u17E0', ')', '}', '\u17F0'], ['\u17A5', '\u17CC', 'x'], ['\u17B2', '=', '\u17CE'], ['Bksp', 'Bksp']], 500 | [['Tab', 'Tab'], ['\u1786', '\u1788', '\u17DC', '\u19E0'], ['\u17B9', '\u17BA', '\u17DD', '\u19E1'], ['\u17C1', '\u17C2', '\u17AF', '\u19E2'], ['\u179A', '\u17AC', '\u17AB', '\u19E3'], ['\u178F', '\u1791', '\u17A8', '\u19E4'], ['\u1799', '\u17BD', '\u1799\u17BE\u1784', '\u19E5'], ['\u17BB', '\u17BC', '', '\u19E6'], ['\u17B7', '\u17B8', '\u17A6', '\u19E7'], ['\u17C4', '\u17C5', '\u17B1', '\u19E8'], ['\u1795', '\u1797', '\u17B0', '\u19E9'], ['\u17C0', '\u17BF', '\u17A9', '\u19EA'], ['\u17AA', '\u17A7', '\u17B3', '\u19EB'], ['\u17AE', '\u17AD', '\\']], 501 | [['Caps', 'Caps'], ['\u17B6', '\u17B6\u17C6', '\u17B5', '\u19EC'], ['\u179F', '\u17C3', '', '\u19ED'], ['\u178A', '\u178C', '\u17D3', '\u19EE'], ['\u1790', '\u1792', '', '\u19EF'], ['\u1784', '\u17A2', '\u17A4', '\u19F0'], ['\u17A0', '\u17C7', '\u17A3', '\u19F1'], ['\u17D2', '\u1789', '\u17B4', '\u19F2'], ['\u1780', '\u1782', '\u179D', '\u19F3'], ['\u179B', '\u17A1', '\u17D8', '\u19F4'], ['\u17BE', '\u17C4\u17C7', '\u17D6', '\u19F5'], ['\u17CB', '\u17C9', '\u17C8', '\u19F6'], ['Enter', 'Enter']], 502 | [['Shift', 'Shift'], ['\u178B', '\u178D', '|', '\u19F7'], ['\u1781', '\u1783', '\u1781\u17D2\u1789\u17BB\u17C6', '\u19F8'], ['\u1785', '\u1787', '-', '\u19F9'], ['\u179C', '\u17C1\u17C7', '+', '\u19FA'], ['\u1794', '\u1796', '\u179E', '\u19FB'], ['\u1793', '\u178E', '[', '\u19FC'], ['\u1798', '\u17C6', ']', '\u19FD'], ['\u17BB\u17C6', '\u17BB\u17C7', ',', '\u19FE'], ['\u17D4', '\u17D5', '.', '\u19FF'], ['\u17CA', '?', '/'], ['Shift', 'Shift']], 503 | [['\u200B', ' ', '\u00A0', ' '], ['AltGr', 'AltGr']] 504 | ], 'lang': ['km'] }; 505 | 506 | this.VKI_layout['\u0c95\u0ca8\u0ccd\u0ca8\u0ca1'] = { 507 | 'name': 'Kannada', 'keys': [ 508 | [['\u0CCA', '\u0C92'], ['1', '', '\u0CE7'], ['2', '', '\u0CE8'], ['3', '\u0CCD\u0CB0', '\u0CE9'], ['4', '\u0CB0\u0CCD', '\u0CEA'], ['5', '\u0C9C\u0CCD\u0C9E', '\u0CEB'], ['6', '\u0CA4\u0CCD\u0CB0', '\u0CEC'], ['7', '\u0C95\u0CCD\u0CB7', '\u0CED'], ['8', '\u0CB6\u0CCD\u0CB0', '\u0CEE'], ['9', '(', '\u0CEF'], ['0', ')', '\u0CE6'], ['-', '\u0C83'], ['\u0CC3', '\u0C8B', '\u0CC4', '\u0CE0'], ['Bksp', 'Bksp']], 509 | [['Tab', 'Tab'], ['\u0CCC', '\u0C94'], ['\u0CC8', '\u0C90', '\u0CD6'], ['\u0CBE', '\u0C86'], ['\u0CC0', '\u0C88', '', '\u0CE1'], ['\u0CC2', '\u0C8A'], ['\u0CAC', '\u0CAD'], ['\u0CB9', '\u0C99'], ['\u0C97', '\u0C98'], ['\u0CA6', '\u0CA7'], ['\u0C9C', '\u0C9D'], ['\u0CA1', '\u0CA2'], ['Enter', 'Enter']], 510 | [['Caps', 'Caps'], ['\u0CCB', '\u0C93'], ['\u0CC7', '\u0C8F', '\u0CD5'], ['\u0CCD', '\u0C85'], ['\u0CBF', '\u0C87', '', '\u0C8C'], ['\u0CC1', '\u0C89'], ['\u0CAA', '\u0CAB', '', '\u0CDE'], ['\u0CB0', '\u0CB1'], ['\u0C95', '\u0C96'], ['\u0CA4', '\u0CA5'], ['\u0C9A', '\u0C9B'], ['\u0C9F', '\u0CA0'], ['', '\u0C9E']], 511 | [['Shift', 'Shift'], ['\u0CC6', '\u0C8F'], ['\u0C82'], ['\u0CAE', '\u0CA3'], ['\u0CA8'], ['\u0CB5'], ['\u0CB2', '\u0CB3'], ['\u0CB8', '\u0CB6'], [',', '\u0CB7'], ['.', '|'], ['\u0CAF'], ['Shift', 'Shift']], 512 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 513 | ], 'lang': ['kn'] }; 514 | 515 | this.VKI_layout['\ud55c\uad6d\uc5b4'] = { 516 | 'name': 'Korean', 'keys': [ 517 | [['`', '~', '`', '~'], ['1', '!', '1', '!'], ['2', '@', '2', '@'], ['3', '#', '3', '#'], ['4', '$', '4', '$'], ['5', '%', '5', '%'], ['6', '^', '6', '^'], ['7', '&', '7', '&'], ['8', '*', '8', '*'], ['9', ')', '9', ')'], ['0', '(', '0', '('], ['-', '_', '-', '_'], ['=', '+', '=', '+'], ['\u20A9', '|', '\u20A9', '|'], ['Bksp', 'Bksp']], 518 | [['Tab', 'Tab'], ['\u1107', '\u1108', 'q', 'Q'], ['\u110C', '\u110D', 'w', 'W'], ['\u1103', '\u1104', 'e', 'E'], ['\u1100', '\u1101', 'r', 'R'], ['\u1109', '\u110A', 't', 'T'], ['\u116D', '', 'y', 'Y'], ['\u1167', '', 'u', 'U'], ['\u1163', '', 'i', 'I'], ['\u1162', '\u1164', 'o', 'O'], ['\u1166', '\u1168', 'p', 'P'], ['[', '{', '[', '{'], [']', '}', ']', '}']], 519 | [['Caps', 'Caps'], ['\u1106', '', 'a', 'A'], ['\u1102', '', 's', 'S'], ['\u110B', '', 'd', 'D'], ['\u1105', '', 'f', 'F'], ['\u1112', '', 'g', 'G'], ['\u1169', '', 'h', 'H'], ['\u1165', '', 'j', 'J'], ['\u1161', '', 'k', 'K'], ['\u1175', '', 'l', 'L'], [';', ':', ';', ':'], ['\'', '"', '\'', '"'], ['Enter', 'Enter']], 520 | [['Shift', 'Shift'], ['\u110F', '', 'z', 'Z'], ['\u1110', '', 'x', 'X'], ['\u110E', '', 'c', 'C'], ['\u1111', '', 'v', 'V'], ['\u1172', '', 'b', 'B'], ['\u116E', '', 'n', 'N'], ['\u1173', '', 'm', 'M'], [',', '<', ',', '<'], ['.', '>', '.', '>'], ['/', '?', '/', '?'], ['Shift', 'Shift']], 521 | [[' ', ' ', ' ', ' '], ['Kor', 'Alt']] 522 | ], 'lang': ['ko'] }; 523 | 524 | this.VKI_layout['Kurd\u00ee'] = { 525 | 'name': 'Kurdish', 'keys': [ 526 | [['\u20ac', '~'], ['\u0661', '!'], ['\u0662', '@'], ['\u0663', '#'], ['\u0664', '$'], ['\u0665', '%'], ['\u0666', '^'], ['\u0667', '&'], ['\u0668', '*'], ['\u0669', '('], ['\u0660', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 527 | [['Tab', 'Tab'], ['\u0642', '`'], ['\u0648', '\u0648\u0648'], ['\u06d5', '\u064a'], ['\u0631', '\u0695'], ['\u062a', '\u0637'], ['\u06cc', '\u06ce'], ['\u0626', '\u0621'], ['\u062d', '\u0639'], ['\u06c6', '\u0624'], ['\u067e', '\u062b'], ['[', '{'], [']', '}'], ['\\', '|']], 528 | [['Caps', 'Caps'], ['\u0627', '\u0622'], ['\u0633', '\u0634'], ['\u062f', '\u0630'], ['\u0641', '\u0625'], ['\u06af', '\u063a'], ['\u0647', '\u200c'], ['\u0698', '\u0623'], ['\u06a9', '\u0643'], ['\u0644', '\u06b5'], ['\u061b', ':'], ['\'', '"'], ['Enter', 'Enter']], 529 | [['Shift', 'Shift'], ['\u0632', '\u0636'], ['\u062e', '\u0635'], ['\u062c', '\u0686'], ['\u06a4', '\u0638'], ['\u0628', '\u0649'], ['\u0646', '\u0629'], ['\u0645', '\u0640'], ['\u060c', '<'], ['.', '>'], ['/', '\u061f'], ['Shift', 'Shift']], 530 | [[' ', ' ']] 531 | ], 'lang': ['ku'] }; 532 | 533 | this.VKI_layout['\u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430'] = { 534 | 'name': 'Kyrgyz', 'keys': [ 535 | [['\u0451', '\u0401'], ['1', '!'], ['2', '"'], ['3', '\u2116'], ['4', ';'], ['5', '%'], ['6', ':'], ['7', '?'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 536 | [['Tab', 'Tab'], ['\u0439', '\u0419'], ['\u0446', '\u0426'], ['\u0443', '\u0423', '\u04AF', '\u04AE'], ['\u043A', '\u041A'], ['\u0435', '\u0415'], ['\u043D', '\u041D', '\u04A3', '\u04A2'], ['\u0433', '\u0413'], ['\u0448', '\u0428'], ['\u0449', '\u0429'], ['\u0437', '\u0417'], ['\u0445', '\u0425'], ['\u044A', '\u042A'], ['\\', '/']], 537 | [['Caps', 'Caps'], ['\u0444', '\u0424'], ['\u044B', '\u042B'], ['\u0432', '\u0412'], ['\u0430', '\u0410'], ['\u043F', '\u041F'], ['\u0440', '\u0420'], ['\u043E', '\u041E', '\u04E9', '\u04E8'], ['\u043B', '\u041B'], ['\u0434', '\u0414'], ['\u0436', '\u0416'], ['\u044D', '\u042D'], ['Enter', 'Enter']], 538 | [['Shift', 'Shift'], ['\u044F', '\u042F'], ['\u0447', '\u0427'], ['\u0441', '\u0421'], ['\u043C', '\u041C'], ['\u0438', '\u0418'], ['\u0442', '\u0422'], ['\u044C', '\u042C'], ['\u0431', '\u0411'], ['\u044E', '\u042E'], ['.', ','], ['Shift', 'Shift']], 539 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 540 | ], 'lang': ['ky'] }; 541 | 542 | this.VKI_layout['Latvie\u0161u'] = { 543 | 'name': 'Latvian', 'keys': [ 544 | [['\u00AD', '?'], ['1', '!', '\u00AB'], ['2', '\u00AB', '', '@'], ['3', '\u00BB', '', '#'], ['4', '$', '\u20AC', '$'], ['5', '%', '"', '~'], ['6', '/', '\u2019', '^'], ['7', '&', '', '\u00B1'], ['8', '\u00D7', ':'], ['9', '('], ['0', ')'], ['-', '_', '\u2013', '\u2014'], ['f', 'F', '=', ';'], ['Bksp', 'Bksp']], 545 | [['Tab', 'Tab'], ['\u016B', '\u016A', 'q', 'Q'], ['g', 'G', '\u0123', '\u0122'], ['j', 'J'], ['r', 'R', '\u0157', '\u0156'], ['m', 'M', 'w', 'W'], ['v', 'V', 'y', 'Y'], ['n', 'N'], ['z', 'Z'], ['\u0113', '\u0112'], ['\u010D', '\u010C'], ['\u017E', '\u017D', '[', '{'], ['h', 'H', ']', '}'], ['\u0137', '\u0136']], 546 | [['Caps', 'Caps'], ['\u0161', '\u0160'], ['u', 'U'], ['s', 'S'], ['i', 'I'], ['l', 'L'], ['d', 'D'], ['a', 'A'], ['t', 'T'], ['e', 'E', '\u20AC'], ['c', 'C'], ['\u00B4', '\u00B0', '\u00B4', '\u00A8'], ['Enter', 'Enter']], 547 | [['Shift', 'Shift'], ['\u0146', '\u0145'], ['b', 'B', 'x', 'X'], ['\u012B', '\u012A'], ['k', 'K', '\u0137', '\u0136'], ['p', 'P'], ['o', 'O', '\u00F5', '\u00D5'], ['\u0101', '\u0100'], [',', ';', '<'], ['.', ':', '>'], ['\u013C', '\u013B'], ['Shift', 'Shift']], 548 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 549 | ], 'lang': ['lv'] }; 550 | 551 | this.VKI_layout['Lietuvi\u0173'] = { 552 | 'name': 'Lithuanian', 'keys': [ 553 | [['`', '~'], ['\u0105', '\u0104'], ['\u010D', '\u010C'], ['\u0119', '\u0118'], ['\u0117', '\u0116'], ['\u012F', '\u012E'], ['\u0161', '\u0160'], ['\u0173', '\u0172'], ['\u016B', '\u016A'], ['\u201E', '('], ['\u201C', ')'], ['-', '_'], ['\u017E', '\u017D'], ['Bksp', 'Bksp']], 554 | [['Tab', 'Tab'], ['q', 'Q'], ['w', 'W'], ['e', 'E'], ['r', 'R'], ['t', 'T'], ['y', 'Y'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['[', '{'], [']', '}'], ['\\', '|']], 555 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], [';', ':'], ['\'', '"'], ['Enter', 'Enter']], 556 | [['Shift', 'Shift'], ['\u2013', '\u20AC'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', '<'], ['.', '>'], ['/', '?'], ['Shift', 'Shift']], 557 | [[' ', ' ']] 558 | ], 'lang': ['lt'] }; 559 | 560 | this.VKI_layout['Magyar'] = { 561 | 'name': 'Hungarian', 'keys': [ 562 | [['0', '\u00a7'], ['1', '\'', '~'], ['2', '"', '\u02c7'], ['3', '+', '\u02c6'], ['4', '!', '\u02d8'], ['5', '%', '\u00b0'], ['6', '/', '\u02db'], ['7', '=', '`'], ['8', '(', '\u02d9'], ['9', ')', '\u00b4'], ['\u00f6', '\u00d6', '\u02dd'], ['\u00fc', '\u00dc', '\u00a8'], ['\u00f3', '\u00d3', '\u00b8'], ['Bksp', 'Bksp']], 563 | [['Tab', 'Tab'], ['q', 'Q', '\\'], ['w', 'W', '|'], ['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'], ['\u0171', '\u0170', '\u00a4']], 564 | [['Caps', 'Caps'], ['a', 'A', '\u00e4'], ['s', 'S', '\u0111'], ['d', 'D', '\u0110'], ['f', 'F', '['], ['g', 'G', ']'], ['h', 'H'], ['j', 'J', '\u00ed'], ['k', 'K', '\u0141'], ['l', 'L', '\u0142'], ['\u00e9', '\u00c9', '$'], ['\u00e1', '\u00c1', '\u00df'], ['Enter', 'Enter']], 565 | [['Shift', 'Shift'], ['\u00ed', '\u00cd', '<'], ['y', 'Y', '>'], ['x', 'X', '#'], ['c', 'C', '&'], ['v', 'V', '@'], ['b', 'B', '{'], ['n', 'N', '}'], ['m', 'M', '<'], [',', '?', ';'], ['.', ':', '>'], ['-', '_', '*'], ['Shift', 'Shift']], 566 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 567 | ], 'lang': ['hu'] }; 568 | 569 | this.VKI_layout['Malti'] = { 570 | 'name': 'Maltese 48', 'keys': [ 571 | [['\u010B', '\u010A', '`'], ['1', '!'], ['2', '"'], ['3', '\u20ac', '\u00A3'], ['4', '$'], ['5', '%'], ['6', '^'], ['7', '&'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 572 | [['Tab', 'Tab'], ['q', 'Q'], ['w', 'W'], ['e', 'E', '\u00E8', '\u00C8'], ['r', 'R'], ['t', 'T'], ['y', 'Y'], ['u', 'U', '\u00F9', '\u00D9'], ['i', 'I', '\u00EC', '\u00cc'], ['o', 'O', '\u00F2', '\u00D2'], ['p', 'P'], ['\u0121', '\u0120', '[', '{'], ['\u0127', '\u0126', ']', '}'], ['#', '\u017e']], 573 | [['Caps', 'Caps'], ['a', 'A', '\u00E0', '\u00C0'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], [';', ':'], ['\'', '@'], ['Enter', 'Enter']], 574 | [['Shift', 'Shift'], ['\u017c', '\u017b', '\\', '|'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', '<'], ['.', '>'], ['/', '?', '', '`'], ['Shift', 'Shift']], 575 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 576 | ], 'lang': ['mt'] }; 577 | 578 | this.VKI_layout['\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438'] = { 579 | 'name': 'Macedonian Cyrillic', 'keys': [ 580 | [['`', '~'], ['1', '!'], ['2', '\u201E'], ['3', '\u201C'], ['4', '\u2019'], ['5', '%'], ['6', '\u2018'], ['7', '&'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 581 | [['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'], ['\u0436', '\u0416']], 582 | [['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'], ['Enter', 'Enter']], 583 | [['Shift', 'Shift'], ['\u0451', '\u0401'], ['\u0437', '\u0417'], ['\u045F', '\u040F'], ['\u0446', '\u0426'], ['\u0432', '\u0412', '@'], ['\u0431', '\u0411', '{'], ['\u043D', '\u041D', '}'], ['\u043C', '\u041C', '\u00A7'], [',', ';'], ['.', ':'], ['/', '?'], ['Shift', 'Shift']], 584 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 585 | ], 'lang': ['mk'] }; 586 | 587 | this.VKI_layout['\u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02'] = { 588 | 'name': 'Malayalam', 'keys': [ 589 | [['\u0D4A', '\u0D12'], ['1', '', '\u0D67'], ['2', '', '\u0D68'], ['3', '\u0D4D\u0D30', '\u0D69'], ['4', '', '\u0D6A'], ['5', '', '\u0D6B'], ['6', '', '\u0D6C'], ['7', '\u0D15\u0D4D\u0D37', '\u0D6D'], ['8', '', '\u0D6E'], ['9', '(', '\u0D6F'], ['0', ')', '\u0D66'], ['-', '\u0D03'], ['\u0D43', '\u0D0B', '', '\u0D60'], ['Bksp', 'Bksp']], 590 | [['Tab', 'Tab'], ['\u0D4C', '\u0D14', '\u0D57'], ['\u0D48', '\u0D10'], ['\u0D3E', '\u0D06'], ['\u0D40', '\u0D08', '', '\u0D61'], ['\u0D42', '\u0D0A'], ['\u0D2C', '\u0D2D'], ['\u0D39', '\u0D19'], ['\u0D17', '\u0D18'], ['\u0D26', '\u0D27'], ['\u0D1C', '\u0D1D'], ['\u0D21', '\u0D22'], ['', '\u0D1E']], 591 | [['Caps', 'Caps'], ['\u0D4B', '\u0D13'], ['\u0D47', '\u0D0F'], ['\u0D4D', '\u0D05', '', '\u0D0C'], ['\u0D3F', '\u0D07'], ['\u0D41', '\u0D09'], ['\u0D2A', '\u0D2B'], ['\u0D30', '\u0D31'], ['\u0D15', '\u0D16'], ['\u0D24', '\u0D25'], ['\u0D1A', '\u0D1B'], ['\u0D1F', '\u0D20'], ['Enter', 'Enter']], 592 | [['Shift', 'Shift'], ['\u0D46', '\u0D0F'], ['\u0D02'], ['\u0D2E', '\u0D23'], ['\u0D28'], ['\u0D35', '\u0D34'], ['\u0D32', '\u0D33'], ['\u0D38', '\u0D36'], [',', '\u0D37'], ['.'], ['\u0D2F'], ['Shift', 'Shift']], 593 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 594 | ], 'lang': ['ml'] }; 595 | 596 | this.VKI_layout['Misc. Symbols'] = { 597 | 'name': 'Misc. Symbols', 'keys': [ 598 | [['\u2605', '\u2606', '\u260e', '\u260f'], ['\u2648', '\u2673', '\u2659', '\u2630'], ['\u2649', '\u2674', '\u2658', '\u2631'], ['\u264a', '\u2675', '\u2657', '\u2632'], ['\u264b', '\u2676', '\u2656', '\u2633'], ['\u264c', '\u2677', '\u2655', '\u2634'], ['\u264d', '\u2678', '\u2654', '\u2635'], ['\u264e', '\u2679', '\u265f', '\u2636'], ['\u264f', '\u267a', '\u265e', '\u2637'], ['\u2650', '\u267b', '\u265d', '\u2686'], ['\u2651', '\u267c', '\u265c', '\u2687'], ['\u2652', '\u267d', '\u265b', '\u2688'], ['\u2653', '\u2672', '\u265a', '\u2689'], ['Bksp', 'Bksp']], 599 | [['\u263f', '\u2680', '\u268a', '\u26a2'], ['\u2640', '\u2681', '\u268b', '\u26a3'], ['\u2641', '\u2682', '\u268c', '\u26a4'], ['\u2642', '\u2683', '\u268d', '\u26a5'], ['\u2643', '\u2684', '\u268e', '\u26a6'], ['\u2644', '\u2685', '\u268f', '\u26a7'], ['\u2645', '\u2620', '\u26ff', '\u26a8'], ['\u2646', '\u2622', '\u2692', '\u26a9'], ['\u2647', '\u2623', '\u2693', '\u26b2'], ['\u2669', '\u266d', '\u2694', '\u26ac'], ['\u266a', '\u266e', '\u2695', '\u26ad'], ['\u266b', '\u266f', '\u2696', '\u26ae'], ['\u266c', '\u2607', '\u2697', '\u26af'], ['\u26f9', '\u2608', '\u2698', '\u26b0'], ['\u267f', '\u262e', '\u2638', '\u2609']], 600 | [['Tab', 'Tab'], ['\u261e', '\u261c', '\u261d', '\u261f'], ['\u261b', '\u261a', '\u2618', '\u2619'], ['\u2602', '\u2614', '\u26f1', '\u26d9'], ['\u2615', '\u2668', '\u26fe', '\u26d8'], ['\u263a', '\u2639', '\u263b', '\u26dc'], ['\u2617', '\u2616', '\u26ca', '\u26c9'], ['\u2660', '\u2663', '\u2665', '\u2666'], ['\u2664', '\u2667', '\u2661', '\u2662'], ['\u26c2', '\u26c0', '\u26c3', '\u26c1'], ['\u2624', '\u2625', '\u269a', '\u26b1'], ['\u2610', '\u2611', '\u2612', '\u2613'], ['\u2628', '\u2626', '\u2627', '\u2629'], ['\u262a', '\u262b', '\u262c', '\u262d'], ['\u26fa', '\u26fb', '\u26fc', '\u26fd']], 601 | [['Caps', 'Caps'], ['\u262f', '\u2670', '\u2671', '\u267e'], ['\u263c', '\u2699', '\u263d', '\u263e'], ['\u26c4', '\u2603', '\u26c7', '\u26c6'], ['\u26a0', '\u26a1', '\u2621', '\u26d4'], ['\u26e4', '\u26e5', '\u26e6', '\u26e7'], ['\u260a', '\u260b', '\u260c', '\u260d'], ['\u269c', '\u269b', '\u269d', '\u2604'], ['\u26b3', '\u26b4', '\u26b5', '\u26b6'], ['\u26b7', '\u26bf', '\u26b8', '\u26f8'], ['\u26b9', '\u26ba', '\u26bb', '\u26bc'], ['\u26bd', '\u26be', '\u269f', '\u269e'], ['Enter', 'Enter']], 602 | [['Shift', 'Shift'], ['\u2600', '\u2601', '\u26c5', '\u26c8'], ['\u2691', '\u2690', '\u26ab', '\u26aa'], ['\u26cb', '\u26cc', '\u26cd', '\u26ce'], ['\u26cf', '\u26d0', '\u26d1', '\u26d2'], ['\u26d3', '\u26d5', '\u26d6', '\u26d7'], ['\u26da', '\u26db', '\u26dd', '\u26de'], ['\u26df', '\u26e0', '\u26e1', '\u26e2'], ['\u26e3', '\u26e8', '\u26e9', '\u26ea'], ['\u26eb', '\u26ec', '\u26ed', '\u26ee'], ['\u26ef', '\u26f0', '\u26f2', '\u26f3'], ['\u26f4', '\u26f5', '\u26f6', '\u26f7'], ['Shift', 'Shift']], 603 | [['AltLk', 'AltLk'], [' ', ' ', ' ', ' '], ['Alt', 'Alt']] 604 | ]}; 605 | 606 | this.VKI_layout['\u041c\u043e\u043d\u0433\u043e\u043b'] = { 607 | 'name': 'Mongolian Cyrillic', 'keys': [ 608 | [['=', '+'], ['\u2116', '1'], ['-', '2'], ['"', '3'], ['\u20AE', '4'], [':', '5'], ['.', '6'], ['_', '7'], [',', '8'], ['%', '9'], ['?', '0'], ['\u0435', '\u0415'], ['\u0449', '\u0429'], ['Bksp', 'Bksp']], 609 | [['Tab', 'Tab'], ['\u0444', '\u0424'], ['\u0446', '\u0426'], ['\u0443', '\u0423'], ['\u0436', '\u0416'], ['\u044d', '\u042d'], ['\u043D', '\u041D'], ['\u0433', '\u0413'], ['\u0448', '\u0428'], ['\u04af', '\u04AE'], ['\u0437', '\u0417'], ['\u043A', '\u041a'], ['\u044A', '\u042A'], ['\\', '|']], 610 | [['Caps', 'Caps'], ['\u0439', '\u0419'], ['\u044B', '\u042B'], ['\u0431', '\u0411'], ['\u04e9', '\u04e8'], ['\u0430', '\u0410'], ['\u0445', '\u0425'], ['\u0440', '\u0420'], ['\u043e', '\u041e'], ['\u043B', '\u041b'], ['\u0434', '\u0414'], ['\u043f', '\u041f'], ['Enter', 'Enter']], 611 | [['Shift', 'Shift'], ['\u044F', '\u042F'], ['\u0447', '\u0427'], ['\u0451', '\u0401'], ['\u0441', '\u0421'], ['\u043c', '\u041c'], ['\u0438', '\u0418'], ['\u0442', '\u0422'], ['\u044c', '\u042c'], ['\u0432', '\u0412'], ['\u044e', '\u042e'], ['Shift', 'Shift']], 612 | [[' ', ' ']] 613 | ], 'lang': ['mn'] }; 614 | 615 | this.VKI_layout['\u092e\u0930\u093e\u0920\u0940'] = { 616 | 'name': 'Marathi', 'keys': [ 617 | [['', '', '`', '~'], ['\u0967', '\u090D', '1', '!'], ['\u0968', '\u0945', '2', '@'], ['\u0969', '\u094D\u0930', '3', '#'], ['\u096A', '\u0930\u094D', '4', '$'], ['\u096B', '\u091C\u094D\u091E', '5', '%'], ['\u096C', '\u0924\u094D\u0930', '6', '^'], ['\u096D', '\u0915\u094D\u0937', '7', '&'], ['\u096E', '\u0936\u094D\u0930', '8', '*'], ['\u096F', '(', '9', '('], ['\u0966', ')', '0', ')'], ['-', '\u0903', '-', '_'], ['\u0943', '\u090B', '=', '+'], ['Bksp', 'Bksp']], 618 | [['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', ']', '}'], ['\u0949', '\u0911', '\\', '|']], 619 | [['Caps', 'Caps'], ['\u094B', '\u0913'], ['\u0947', '\u090F'], ['\u094D', '\u0905'], ['\u093F', '\u0907'], ['\u0941', '\u0909'], ['\u092A', '\u092B'], ['\u0930', '\u0931'], ['\u0915', '\u0916'], ['\u0924', '\u0925'], ['\u091A', '\u091B', ';', ':'], ['\u091F', '\u0920', '\'', '"'], ['Enter', 'Enter']], 620 | [['Shift', 'Shift'], [''], ['\u0902', '\u0901', '', '\u0950'], ['\u092E', '\u0923'], ['\u0928'], ['\u0935'], ['\u0932', '\u0933'], ['\u0938', '\u0936'], [',', '\u0937', ',', '<'], ['.', '\u0964', '.', '>'], ['\u092F', '\u095F', '/', '?'], ['Shift', 'Shift']], 621 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 622 | ], 'lang': ['mr'] }; 623 | 624 | this.VKI_layout['\u1019\u103c\u1014\u103a\u1019\u102c\u1018\u102c\u101e\u102c'] = { 625 | 'name': 'Burmese', 'keys': [ 626 | [['\u1039`', '~'], ['\u1041', '\u100D'], ['\u1042', '\u100E'], ['\u1043', '\u100B'], ['\u1044', '\u1000\u103B\u1015\u103A'], ['\u1045', '%'], ['\u1046', '/'], ['\u1047', '\u101B'], ['\u1048', '\u1002'], ['\u1049', '('], ['\u1040', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 627 | [['Tab', 'Tab'], ['\u1006', '\u1029'], ['\u1010', '\u1040'], ['\u1014', '\u103F'], ['\u1019', '\u1023'], ['\u1021', '\u1024'], ['\u1015', '\u104C'], ['\u1000', '\u1009'], ['\u1004', '\u104D'], ['\u101E', '\u1025'], ['\u1005', '\u100F'], ['\u101F', '\u1027'], ['\u2018', '\u2019'], ['\u104F', '\u100B\u1039\u100C']], 628 | [['Caps', 'Caps'], ['\u200B\u1031', '\u1017'], ['\u200B\u103B', '\u200B\u103E'], ['\u200B\u102D', '\u200B\u102E'], ['\u200B\u103A', '\u1004\u103A\u1039\u200B'], ['\u200B\u102B', '\u200B\u103D'], ['\u200B\u1037', '\u200B\u1036'], ['\u200B\u103C', '\u200B\u1032'], ['\u200B\u102F', '\u200B\u102F'], ['\u200B\u1030', '\u200B\u1030'], ['\u200B\u1038', '\u200B\u102B\u103A'], ['\u1012', '\u1013'], ['Enter', 'Enter']], 629 | [['Shift', 'Shift'], ['\u1016', '\u1007'], ['\u1011', '\u100C'], ['\u1001', '\u1003'], ['\u101C', '\u1020'], ['\u1018', '\u1026'], ['\u100A', '\u1008'], ['\u200B\u102C', '\u102A'], ['\u101A', '\u101B'], ['.', '\u101B'], ['\u104B', '\u104A'], ['Shift', 'Shift']], 630 | [[' ', ' ']] 631 | ], 'lang': ['my'] }; 632 | 633 | this.VKI_layout['Nederlands'] = { 634 | 'name': 'Dutch', 'keys': [ 635 | [['@', '\u00a7', '\u00ac'], ['1', '!', '\u00b9'], ['2', '"', '\u00b2'], ['3', '#', '\u00b3'], ['4', '$', '\u00bc'], ['5', '%', '\u00bd'], ['6', '&', '\u00be'], ['7', '_', '\u00a3'], ['8', '(', '{'], ['9', ')', '}'], ['0', '\''], ['/', '?', '\\'], ['\u00b0', '~', '\u00b8'], ['Bksp', 'Bksp']], 636 | [['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', '^'], ['*', '|'], ['<', '>']], 637 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S', '\u00df'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['+', '\u00b1'], ['\u00b4', '`'], ['Enter', 'Enter']], 638 | [['Shift', 'Shift'], [']', '[', '\u00a6'], ['z', 'Z', '\u00ab'], ['x', 'X', '\u00bb'], ['c', 'C', '\u00a2'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M', '\u00b5'], [',', ';'], ['.', ':', '\u00b7'], ['-', '='], ['Shift', 'Shift']], 639 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 640 | ], 'lang': ['nl'] }; 641 | 642 | this.VKI_layout['Norsk'] = { 643 | 'name': 'Norwegian', 'keys': [ 644 | [['|', '\u00a7'], ['1', '!'], ['2', '"', '@'], ['3', '#', '\u00a3'], ['4', '\u00a4', '$'], ['5', '%'], ['6', '&'], ['7', '/', '{'], ['8', '(', '['], ['9', ')', ']'], ['0', '=', '}'], ['+', '?'], ['\\', '`', '\u00b4'], ['Bksp', 'Bksp']], 645 | [['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', '^', '~'], ['\'', '*']], 646 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00f8', '\u00d8'], ['\u00e6', '\u00c6'], ['Enter', 'Enter']], 647 | [['Shift', 'Shift'], ['<', '>'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M', '\u03bc', '\u039c'], [',', ';'], ['.', ':'], ['-', '_'], ['Shift', 'Shift']], 648 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 649 | ], 'lang': ['no', 'nb', 'nn'] }; 650 | 651 | this.VKI_layout['\u067e\u069a\u062a\u0648'] = { 652 | 'name': 'Pashto', 'keys': [ 653 | [['\u200d', '\u00f7', '`'], ['\u06f1', '!', '`'], ['\u06f2', '\u066c', '@'], ['\u06f3', '\u066b', '\u066b'], ['\u06f4', '\u00a4', '\u00a3'], ['\u06f5', '\u066a', '%'], ['\u06f6', '\u00d7', '^'], ['\u06f7', '\u00ab', '&'], ['\u06f8', '\u00bb', '*'], ['\u06f9', '(', '\ufdf2'], ['\u06f0', ')', '\ufefb'], ['-', '\u0640', '_'], ['=', '+', '\ufe87', '\u00f7'], ['Bksp', 'Bksp']], 654 | [['Tab', 'Tab'], ['\u0636', '\u0652', '\u06d5'], ['\u0635', '\u064c', '\u0653'], ['\u062b', '\u064d', '\u20ac'], ['\u0642', '\u064b', '\ufef7'], ['\u0641', '\u064f', '\ufef5'], ['\u063a', '\u0650', '\''], ['\u0639', '\u064e', '\ufe84'], ['\u0647', '\u0651', '\u0670'], ['\u062e', '\u0681', '\''], ['\u062d', '\u0685', '"'], ['\u062c', ']', '}'], ['\u0686', '[', '{'], ['\\', '\u066d', '|']], 655 | [['Caps', 'Caps'], ['\u0634', '\u069a', '\ufbb0'], ['\u0633', '\u06cd', '\u06d2'], ['\u06cc', '\u064a', '\u06d2'], ['\u0628', '\u067e', '\u06ba'], ['\u0644', '\u0623', '\u06b7'], ['\u0627', '\u0622', '\u0671'], ['\u062a', '\u067c', '\u0679'], ['\u0646', '\u06bc', '<'], ['\u0645', '\u0629', '>'], ['\u06a9', ':', '\u0643'], ['\u06af', '\u061b', '\u06ab'], ['Enter', 'Enter']], 656 | [['Shift', 'Shift'], ['\u0638', '\u0626', '?'], ['\u0637', '\u06d0', ';'], ['\u0632', '\u0698', '\u0655'], ['\u0631', '\u0621', '\u0654'], ['\u0630', '\u200c', '\u0625'], ['\u062f', '\u0689', '\u0688'], ['\u0693', '\u0624', '\u0691'], ['\u0648', '\u060c', ','], ['\u0696', '.', '\u06c7'], ['/', '\u061f', '\u06c9'], ['Shift', 'Shift', '\u064d']], 657 | [[' ', ' ', ' ', ' '], ['Alt', 'Alt']] 658 | ], 'lang': ['ps'] }; 659 | 660 | this.VKI_layout['\u0a2a\u0a70\u0a1c\u0a3e\u0a2c\u0a40'] = { 661 | 'name': 'Punjabi (Gurmukhi)', 'keys': [ 662 | [[''], ['1', '\u0A4D\u0A35', '\u0A67', '\u0A67'], ['2', '\u0A4D\u0A2F', '\u0A68', '\u0A68'], ['3', '\u0A4D\u0A30', '\u0A69', '\u0A69'], ['4', '\u0A71', '\u0A6A', '\u0A6A'], ['5', '', '\u0A6B', '\u0A6B'], ['6', '', '\u0A6C', '\u0A6C'], ['7', '', '\u0A6D', '\u0A6D'], ['8', '', '\u0A6E', '\u0A6E'], ['9', '(', '\u0A6F', '\u0A6F'], ['0', ')', '\u0A66', '\u0A66'], ['-'], [''], ['Bksp', 'Bksp']], 663 | [['Tab', 'Tab'], ['\u0A4C', '\u0A14'], ['\u0A48', '\u0A10'], ['\u0A3E', '\u0A06'], ['\u0A40', '\u0A08'], ['\u0A42', '\u0A0A'], ['\u0A2C', '\u0A2D'], ['\u0A39', '\u0A19'], ['\u0A17', '\u0A18', '\u0A5A', '\u0A5A'], ['\u0A26', '\u0A27'], ['\u0A1C', '\u0A1D', '\u0A5B', '\u0A5B'], ['\u0A21', '\u0A22', '\u0A5C', '\u0A5C'], ['Enter', 'Enter']], 664 | [['Caps', 'Caps'], ['\u0A4B', '\u0A13'], ['\u0A47', '\u0A0F'], ['\u0A4D', '\u0A05'], ['\u0A3F', '\u0A07'], ['\u0A41', '\u0A09'], ['\u0A2A', '\u0A2B', '\u0A5E', '\u0A5E'], ['\u0A30'], ['\u0A15', '\u0A16', '\u0A59', '\u0A59'], ['\u0A24', '\u0A25'], ['\u0A1A', '\u0A1B'], ['\u0A1F', '\u0A20'], ['\u0A3C', '\u0A1E']], 665 | [['Shift', 'Shift'], [''], ['\u0A02', '\u0A02'], ['\u0A2E', '\u0A23'], ['\u0A28'], ['\u0A35', '\u0A72', '\u0A73', '\u0A73'], ['\u0A32', '\u0A33'], ['\u0A38', '\u0A36'], [','], ['.', '|', '\u0965', '\u0965'], ['\u0A2F'], ['Shift', 'Shift']], 666 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 667 | ], 'lang': ['pa'] }; 668 | 669 | this.VKI_layout['\u62fc\u97f3 (Pinyin)'] = { 670 | 'name': 'Pinyin', 'keys': [ 671 | [['`', '~', '\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']], 672 | [['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']], 673 | [['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']], 674 | [['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']], 675 | [['AltLk', 'AltLk'], [' ', ' ', ' ', ' '], ['Alt', 'Alt']] 676 | ], 'lang': ['zh-Latn'] }; 677 | 678 | this.VKI_layout['Polski'] = { 679 | 'name': 'Polish (214)', 'keys': [ 680 | [['\u02DB', '\u00B7'], ['1', '!', '~'], ['2', '"', '\u02C7'], ['3', '#', '^'], ['4', '\u00A4', '\u02D8'], ['5', '%', '\u00B0'], ['6', '&', '\u02DB'], ['7', '/', '`'], ['8', '(', '\u00B7'], ['9', ')', '\u00B4'], ['0', '=', '\u02DD'], ['+', '?', '\u00A8'], ['\'', '*', '\u00B8'], ['Bksp', 'Bksp']], 681 | [['Tab', 'Tab'], ['q', 'Q', '\\'], ['w', 'W', '\u00A6'], ['e', 'E'], ['r', 'R'], ['t', 'T'], ['z', 'Z'], ['u', 'U', '\u20AC'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['\u017C', '\u0144', '\u00F7'], ['\u015B', '\u0107', '\u00D7'], ['\u00F3', '\u017A']], 682 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S', '\u0111'], ['d', 'D', '\u0110'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u0142', '\u0141', '$'], ['\u0105', '\u0119', '\u00DF'], ['Enter', 'Enter']], 683 | [['Shift', 'Shift'], ['<', '>'], ['y', 'Y'], ['x', 'X'], ['c', 'C'], ['v', 'V', '@'], ['b', 'B', '{'], ['n', 'N', '}'], ['m', 'M', '\u00A7'], [',', ';', '<'], ['.', ':', '>'], ['-', '_'], ['Shift', 'Shift']], 684 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 685 | ]}; 686 | 687 | this.VKI_layout['Polski Programisty'] = { 688 | 'name': 'Polish Programmers', 'keys': [ 689 | [['`', '~'], ['1', '!'], ['2', '@'], ['3', '#'], ['4', '$'], ['5', '%'], ['6', '^'], ['7', '&'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 690 | [['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'], ['[', '{'], [']', '}'], ['\\', '|']], 691 | [['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']], 692 | [['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']], 693 | [[' ', ' ', ' ', ' '], ['Alt', 'Alt']] 694 | ], 'lang': ['pl'] }; 695 | 696 | this.VKI_layout['Portugu\u00eas Brasileiro'] = { 697 | 'name': 'Portuguese (Brazil)', 'keys': [ 698 | [['\'', '"'], ['1', '!', '\u00b9'], ['2', '@', '\u00b2'], ['3', '#', '\u00b3'], ['4', '$', '\u00a3'], ['5', '%', '\u00a2'], ['6', '\u00a8', '\u00ac'], ['7', '&'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+', '\u00a7'], ['Bksp', 'Bksp']], 699 | [['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']], 700 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00e7', '\u00c7'], ['~', '^'], [']', '}', '\u00ba'], ['/', '?']], 701 | [['Shift', 'Shift'], ['\\', '|'], ['z', 'Z'], ['x', 'X'], ['c', 'C', '\u20a2'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', '<'], ['.', '>'], [':', ':'], ['Shift', 'Shift']], 702 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 703 | ], 'lang': ['pt-BR'] }; 704 | 705 | this.VKI_layout['Portugu\u00eas'] = { 706 | 'name': 'Portuguese', 'keys': [ 707 | [['\\', '|'], ['1', '!'], ['2', '"', '@'], ['3', '#', '\u00a3'], ['4', '$', '\u00a7'], ['5', '%'], ['6', '&'], ['7', '/', '{'], ['8', '(', '['], ['9', ')', ']'], ['0', '=', '}'], ['\'', '?'], ['\u00ab', '\u00bb'], ['Bksp', 'Bksp']], 708 | [['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', '`'], ['~', '^']], 709 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00e7', '\u00c7'], ['\u00ba', '\u00aa'], ['Enter', 'Enter']], 710 | [['Shift', 'Shift'], ['<', '>', '\\'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', ';'], ['.', ':'], ['-', '_'], ['Shift', 'Shift']], 711 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 712 | ], 'lang': ['pt'] }; 713 | 714 | this.VKI_layout['Rom\u00e2n\u0103'] = { 715 | 'name': 'Romanian', 'keys': [ 716 | [['\u201E', '\u201D', '`', '~'], ['1', '!', '~'], ['2', '@', '\u02C7'], ['3', '#', '^'], ['4', '$', '\u02D8'], ['5', '%', '\u00B0'], ['6', '^', '\u02DB'], ['7', '&', '`'], ['8', '*', '\u02D9'], ['9', '(', '\u00B4'], ['0', ')', '\u02DD'], ['-', '_', '\u00A8'], ['=', '+', '\u00B8', '\u00B1'], ['Bksp', 'Bksp']], 717 | [['Tab', 'Tab'], ['q', 'Q'], ['w', 'W'], ['e', 'E', '\u20AC'], ['r', 'R'], ['t', 'T'], ['y', 'Y'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P', '\u00A7'], ['\u0103', '\u0102', '[', '{'], ['\u00EE', '\u00CE', ']', '}'], ['\u00E2', '\u00C2', '\\', '|']], 718 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S', '\u00df'], ['d', 'D', '\u00f0', '\u00D0'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L', '\u0142', '\u0141'], [(this.VKI_isIElt8) ? '\u015F' : '\u0219', (this.VKI_isIElt8) ? '\u015E' : '\u0218', ';', ':'], [(this.VKI_isIElt8) ? '\u0163' : '\u021B', (this.VKI_isIElt8) ? '\u0162' : '\u021A', '\'', '"'], ['Enter', 'Enter']], 719 | [['Shift', 'Shift'], ['\\', '|'], ['z', 'Z'], ['x', 'X'], ['c', 'C', '\u00A9'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', ';', '<', '\u00AB'], ['.', ':', '>', '\u00BB'], ['/', '?'], ['Shift', 'Shift']], 720 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 721 | ], 'lang': ['ro'] }; 722 | 723 | this.VKI_layout['\u0420\u0443\u0441\u0441\u043a\u0438\u0439'] = { 724 | 'name': 'Russian', 'keys': [ 725 | [['\u0451', '\u0401'], ['1', '!'], ['2', '"'], ['3', '\u2116'], ['4', ';'], ['5', '%'], ['6', ':'], ['7', '?'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 726 | [['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'], ['\\', '/']], 727 | [['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']], 728 | [['Shift', 'Shift'], ['/', '|'], ['\u044F', '\u042F'], ['\u0447', '\u0427'], ['\u0441', '\u0421'], ['\u043C', '\u041C'], ['\u0438', '\u0418'], ['\u0442', '\u0422'], ['\u044C', '\u042C'], ['\u0431', '\u0411'], ['\u044E', '\u042E'], ['.', ','], ['Shift', 'Shift']], 729 | [[' ', ' ']] 730 | ], 'lang': ['ru'] }; 731 | 732 | this.VKI_layout['Schweizerdeutsch'] = { 733 | 'name': 'Swiss German', 'keys': [ 734 | [['\u00A7', '\u00B0'], ['1', '+', '\u00A6'], ['2', '"', '@'], ['3', '*', '#'], ['4', '\u00E7', '\u00B0'], ['5', '%', '\u00A7'], ['6', '&', '\u00AC'], ['7', '/', '|'], ['8', '(', '\u00A2'], ['9', ')'], ['0', '='], ['\'', '?', '\u00B4'], ['^', '`', '~'], ['Bksp', 'Bksp']], 735 | [['Tab', 'Tab'], ['q', 'Q'], ['w', 'W'], ['e', 'E', '\u20AC'], ['r', 'R'], ['t', 'T'], ['z', 'Z'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['\u00FC', '\u00E8', '['], ['\u00A8', '!', ']'], ['$', '\u00A3', '}']], 736 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00F6', '\u00E9'], ['\u00E4', '\u00E0', '{'], ['Enter', 'Enter']], 737 | [['Shift', 'Shift'], ['<', '>', '\\'], ['y', 'Y'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', ';'], ['.', ':'], ['-', '_'], ['Shift', 'Shift']], 738 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 739 | ], 'lang': ['de-CH'] }; 740 | 741 | this.VKI_layout['Shqip'] = { 742 | 'name': 'Albanian', 'keys': [ 743 | [['\\', '|'], ['1', '!', '~'], ['2', '"', '\u02C7'], ['3', '#', '^'], ['4', '$', '\u02D8'], ['5', '%', '\u00B0'], ['6', '^', '\u02DB'], ['7', '&', '`'], ['8', '*', '\u02D9'], ['9', '(', '\u00B4'], ['0', ')', '\u02DD'], ['-', '_', '\u00A8'], ['=', '+', '\u00B8'], ['Bksp', 'Bksp']], 744 | [['Tab', 'Tab'], ['q', 'Q', '\\'], ['w', 'W', '|'], ['e', 'E'], ['r', 'R'], ['t', 'T'], ['z', 'Z'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['\u00E7', '\u00C7', '\u00F7'], ['[', '{', '\u00DF'], [']', '}', '\u00A4']], 745 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S', '\u0111'], ['d', 'D', '\u0110'], ['f', 'F', '['], ['g', 'G', ']'], ['h', 'H'], ['j', 'J'], ['k', 'K', '\u0142'], ['l', 'L', '\u0141'], ['\u00EB', '\u00CB', '$'], ['@', '\'', '\u00D7'], ['Enter', 'Enter']], 746 | [['Shift', 'Shift'], ['<', '>'], ['y', 'Y'], ['x', 'X'], ['c', 'C'], ['v', 'V', '@'], ['b', 'B', '{'], ['n', 'N', '}'], ['m', 'M', '\u00A7'], [',', ';', '<'], ['.', ':', '>'], ['/', '?'], ['Shift', 'Shift']], 747 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 748 | ], 'lang': ['sq'] }; 749 | 750 | this.VKI_layout['Sloven\u010dina'] = { 751 | 'name': 'Slovak', 'keys': [ 752 | [[';', '\u00b0'], ['+', '1', '~'], ['\u013E', '2', '\u02C7'], ['\u0161', '3', '^'], ['\u010D', '4', '\u02D8'], ['\u0165', '5', '\u00B0'], ['\u017E', '6', '\u02DB'], ['\u00FD', '7', '`'], ['\u00E1', '8', '\u02D9'], ['\u00ED', '9', '\u00B4'], ['\u00E9', '0', '\u02DD'], ['=', '%', '\u00A8'], ['\u00B4', '\u02c7', '\u00B8'], ['Bksp', 'Bksp']], 753 | [['Tab', 'Tab'], ['q', 'Q', '\\'], ['w', 'W', '|'], ['e', 'E', '\u20AC'], ['r', 'R'], ['t', 'T'], ['z', 'Z'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P', '\''], ['\u00FA', '/', '\u00F7'], ['\u00E4', '(', '\u00D7'], ['\u0148', ')', '\u00A4']], 754 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S', '\u0111'], ['d', 'D', '\u0110'], ['f', 'F', '['], ['g', 'G', ']'], ['h', 'H'], ['j', 'J'], ['k', 'K', '\u0142'], ['l', 'L', '\u0141'], ['\u00F4', '"', '$'], ['\u00A7', '!', '\u00DF'], ['Enter', 'Enter']], 755 | [['Shift', 'Shift'], ['&', '*', '<'], ['y', 'Y', '>'], ['x', 'X', '#'], ['c', 'C', '&'], ['v', 'V', '@'], ['b', 'B', '{'], ['n', 'N', '}'], ['m', 'M'], [',', '?', '<'], ['.', ':', '>'], ['-', '_', '*', ], ['Shift', 'Shift']], 756 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 757 | ], 'lang': ['sk'] }; 758 | 759 | this.VKI_layout['Sloven\u0161\u010dina'] = { 760 | 'name': 'Slovenian', 'keys': this.VKI_layout['Bosanski'].keys.slice(0), 'lang': ['sl'] 761 | }; 762 | 763 | this.VKI_layout['\u0441\u0440\u043f\u0441\u043a\u0438'] = { 764 | 'name': 'Serbian Cyrillic', 'keys': [ 765 | [['`', '~'], ['1', '!'], ['2', '"'], ['3', '#'], ['4', '$'], ['5', '%'], ['6', '&'], ['7', '/'], ['8', '('], ['9', ')'], ['0', '='], ['\'', '?'], ['+', '*'], ['Bksp', 'Bksp']], 766 | [['Tab', 'Tab'], ['\u0459', '\u0409'], ['\u045a', '\u040a'], ['\u0435', '\u0415', '\u20ac'], ['\u0440', '\u0420'], ['\u0442', '\u0422'], ['\u0437', '\u0417'], ['\u0443', '\u0423'], ['\u0438', '\u0418'], ['\u043e', '\u041e'], ['\u043f', '\u041f'], ['\u0448', '\u0428'], ['\u0452', '\u0402'], ['\u0436', '\u0416']], 767 | [['Caps', 'Caps'], ['\u0430', '\u0410'], ['\u0441', '\u0421'], ['\u0434', '\u0414'], ['\u0444', '\u0424'], ['\u0433', '\u0413'], ['\u0445', '\u0425'], ['\u0458', '\u0408'], ['\u043a', '\u041a'], ['\u043b', '\u041b'], ['\u0447', '\u0427'], ['\u045b', '\u040b'], ['Enter', 'Enter']], 768 | [['Shift', 'Shift'], ['<', '>'], ['\u0455', '\u0405'], ['\u045f', '\u040f'], ['\u0446', '\u0426'], ['\u0432', '\u0412'], ['\u0431', '\u0411'], ['\u043d', '\u041d'], ['\u043c', '\u041c'], [',', ';', '<'], ['.', ':', '>'], ['-', '_', '\u00a9'], ['Shift', 'Shift']], 769 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 770 | ], 'lang': ['sr-Cyrl'] }; 771 | 772 | this.VKI_layout['Srpski'] = { 773 | 'name': 'Serbian Latin', 'keys': this.VKI_layout['Bosanski'].keys.slice(0), 'lang': ['sr'] 774 | }; 775 | 776 | this.VKI_layout['Suomi'] = { 777 | 'name': 'Finnish', 'keys': [ 778 | [['\u00a7', '\u00BD'], ['1', '!'], ['2', '"', '@'], ['3', '#', '\u00A3'], ['4', '\u00A4', '$'], ['5', '%', '\u20AC'], ['6', '&'], ['7', '/', '{'], ['8', '(', '['], ['9', ')', ']'], ['0', '=', '}'], ['+', '?', '\\'], ['\u00B4', '`'], ['Bksp', 'Bksp']], 779 | [['Tab', 'Tab'], ['q', 'Q', '\u00E2', '\u00C2'], ['w', 'W'], ['e', 'E', '\u20AC'], ['r', 'R'], ['t', 'T', '\u0167', '\u0166'], ['y', 'Y'], ['u', 'U'], ['i', 'I', '\u00ef', '\u00CF'], ['o', 'O', '\u00f5', '\u00D5'], ['p', 'P'], ['\u00E5', '\u00C5'], ['\u00A8', '^', '~'], ['\'', '*']], 780 | [['Caps', 'Caps'], ['a', 'A', '\u00E1', '\u00C1'], ['s', 'S', '\u0161', '\u0160'], ['d', 'D', '\u0111', '\u0110'], ['f', 'F', '\u01e5', '\u01E4'], ['g', 'G', '\u01E7', '\u01E6'], ['h', 'H', '\u021F', '\u021e'], ['j', 'J'], ['k', 'K', '\u01e9', '\u01E8'], ['l', 'L'], ['\u00F6', '\u00D6', '\u00F8', '\u00D8'], ['\u00E4', '\u00C4', '\u00E6', '\u00C6'], ['Enter', 'Enter']], 781 | [['Shift', 'Shift'], ['<', '>', '|'], ['z', 'Z', '\u017E', '\u017D'], ['x', 'X'], ['c', 'C', '\u010d', '\u010C'], ['v', 'V', '\u01EF', '\u01EE'], ['b', 'B', '\u0292', '\u01B7'], ['n', 'N', '\u014B', '\u014A'], ['m', 'M', '\u00B5'], [',', ';'], ['.', ':'], ['-', '_'], ['Shift', 'Shift']], 782 | [['Alt', 'Alt'], [' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 783 | ], 'lang': ['fi'] }; 784 | 785 | this.VKI_layout['Svenska'] = { 786 | 'name': 'Swedish', 'keys': [ 787 | [['\u00a7', '\u00bd'], ['1', '!'], ['2', '"', '@'], ['3', '#', '\u00a3'], ['4', '\u00a4', '$'], ['5', '%', '\u20ac'], ['6', '&'], ['7', '/', '{'], ['8', '(', '['], ['9', ')', ']'], ['0', '=', '}'], ['+', '?', '\\'], ['\u00b4', '`'], ['Bksp', 'Bksp']], 788 | [['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', '^', '~'], ['\'', '*']], 789 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00f6', '\u00d6'], ['\u00e4', '\u00c4'], ['Enter', 'Enter']], 790 | [['Shift', 'Shift'], ['<', '>', '|'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M', '\u03bc', '\u039c'], [',', ';'], ['.', ':'], ['-', '_'], ['Shift', 'Shift']], 791 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 792 | ], 'lang': ['sv'] }; 793 | 794 | this.VKI_layout['Swiss Fran\u00e7ais'] = { 795 | 'name': 'Swiss French', 'keys': [ 796 | [['\u00A7', '\u00B0'], ['1', '+', '\u00A6'], ['2', '"', '@'], ['3', '*', '#'], ['4', '\u00E7', '\u00B0'], ['5', '%', '\u00A7'], ['6', '&', '\u00AC'], ['7', '/', '|'], ['8', '(', '\u00A2'], ['9', ')'], ['0', '='], ['\'', '?', '\u00B4'], ['^', '`', '~'], ['Bksp', 'Bksp']], 797 | [['Tab', 'Tab'], ['q', 'Q'], ['w', 'W'], ['e', 'E', '\u20AC'], ['r', 'R'], ['t', 'T'], ['z', 'Z'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['\u00E8', '\u00FC', '['], ['\u00A8', '!', ']'], ['$', '\u00A3', '}']], 798 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u00E9', '\u00F6'], ['\u00E0', '\u00E4', '{'], ['Enter', 'Enter']], 799 | [['Shift', 'Shift'], ['<', '>', '\\'], ['y', 'Y'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', ';'], ['.', ':'], ['-', '_'], ['Shift', 'Shift']], 800 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 801 | ], 'lang': ['fr-CH'] }; 802 | 803 | this.VKI_layout['\u0723\u0718\u072a\u071d\u071d\u0710'] = { 804 | 'name': 'Syriac', 'keys': [ 805 | [['\u070f', '\u032e', '\u0651', '\u0651'], ['1', '!', '\u0701', '\u0701'], ['2', '\u030a', '\u0702', '\u0702'], ['3', '\u0325', '\u0703', '\u0703'], ['4', '\u0749', '\u0704', '\u0704'], ['5', '\u2670', '\u0705', '\u0705'], ['6', '\u2671', '\u0708', '\u0708'], ['7', '\u070a', '\u0709', '\u0709'], ['8', '\u00bb', '\u070B', '\u070B'], ['9', ')', '\u070C', '\u070C'], ['0', '(', '\u070D', '\u070D'], ['-', '\u00ab', '\u250C', '\u250C'], ['=', '+', '\u2510', '\u2510'], ['Bksp', 'Bksp']], 806 | [['Tab', 'Tab'], ['\u0714', '\u0730', '\u064E', '\u064E'], ['\u0728', '\u0733', '\u064B', '\u064B'], ['\u0716', '\u0736', '\u064F', '\u064F'], ['\u0729', '\u073A', '\u064C', '\u064C'], ['\u0726', '\u073D', '\u0653', '\u0653'], ['\u071c', '\u0740', '\u0654', '\u0654'], ['\u0725', '\u0741', '\u0747', '\u0747'], ['\u0717', '\u0308', '\u0743', '\u0743'], ['\u071e', '\u0304', '\u0745', '\u0745'], ['\u071a', '\u0307', '\u032D', '\u032D'], ['\u0713', '\u0303'], ['\u0715', '\u074A'], ['\u0706', ':']], 807 | [['Caps', 'Caps'], ['\u072b', '\u0731', '\u0650', '\u0650'], ['\u0723', '\u0734', '\u064d', '\u064d'], ['\u071d', '\u0737'], ['\u0712', '\u073b', '\u0621', '\u0621'], ['\u0720', '\u073e', '\u0655', '\u0655'], ['\u0710', '\u0711', '\u0670', '\u0670'], ['\u072c', '\u0640', '\u0748', '\u0748'], ['\u0722', '\u0324', '\u0744', '\u0744'], ['\u0721', '\u0331', '\u0746', '\u0746'], ['\u071f', '\u0323'], ['\u071b', '\u0330'], ['Enter', 'Enter']], 808 | [['Shift', 'Shift'], [']', '\u0732'], ['[', '\u0735', '\u0652', '\u0652'], ['\u0724', '\u0738'], ['\u072a', '\u073c', '\u200D'], ['\u0727', '\u073f', '\u200C'], ['\u0700', '\u0739', '\u200E'], ['.', '\u0742', '\u200F'], ['\u0718', '\u060c'], ['\u0719', '\u061b'], ['\u0707', '\u061F'], ['Shift', 'Shift']], 809 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 810 | ], 'lang': ['syc'] }; 811 | 812 | this.VKI_layout['\u0ba4\u0bae\u0bbf\u0bb4\u0bcd'] = { 813 | 'name': 'Tamil', 'keys': [ 814 | [['\u0BCA', '\u0B92'], ['1', '', '\u0BE7'], ['2', '', '\u0BE8'], ['3', '', '\u0BE9'], ['4', '', '\u0BEA'], ['5', '', '\u0BEB'], ['6', '\u0BA4\u0BCD\u0BB0', '\u0BEC'], ['7', '\u0B95\u0BCD\u0BB7', '\u0BED'], ['8', '\u0BB7\u0BCD\u0BB0', '\u0BEE'], ['9', '', '\u0BEF'], ['0', '', '\u0BF0'], ['-', '\u0B83', '\u0BF1'], ['', '', '\u0BF2'], ['Bksp', 'Bksp']], 815 | [['Tab', 'Tab'], ['\u0BCC', '\u0B94'], ['\u0BC8', '\u0B90'], ['\u0BBE', '\u0B86'], ['\u0BC0', '\u0B88'], ['\u0BC2', '\u0B8A'], ['\u0BAA', '\u0BAA'], ['\u0BB9', '\u0B99'], ['\u0B95', '\u0B95'], ['\u0BA4', '\u0BA4'], ['\u0B9C', '\u0B9A'], ['\u0B9F', '\u0B9F'], ['\u0B9E']], 816 | [['Caps', 'Caps'], ['\u0BCB', '\u0B93'], ['\u0BC7', '\u0B8F'], ['\u0BCD', '\u0B85'], ['\u0BBF', '\u0B87'], ['\u0BC1', '\u0B89'], ['\u0BAA', '\u0BAA'], ['\u0BB0', '\u0BB1'], ['\u0B95', '\u0B95'], ['\u0BA4', '\u0BA4'], ['\u0B9A', '\u0B9A'], ['\u0B9F', '\u0B9F'], ['Enter', 'Enter']], 817 | [['Shift', 'Shift'], ['\u0BC6', '\u0B8E'], [''], ['\u0BAE', '\u0BA3'], ['\u0BA8', '\u0BA9'], ['\u0BB5', '\u0BB4'], ['\u0BB2', '\u0BB3'], ['\u0BB8', '\u0BB7'], [',', '\u0BB7'], ['.', '\u0BB8\u0BCD\u0BB0\u0BC0'], ['\u0BAF', '\u0BAF'], ['Shift', 'Shift']], 818 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 819 | ], 'lang': ['ta'] }; 820 | 821 | this.VKI_layout['\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41'] = { 822 | 'name': 'Telugu', 'keys': [ 823 | [['\u0C4A', '\u0C12'], ['1', '', '\u0C67'], ['2', '', '\u0C68'], ['3', '\u0C4D\u0C30', '\u0C69'], ['4', '', '\u0C6A'], ['5', '\u0C1C\u0C4D\u0C1E', '\u0C6B'], ['6', '\u0C24\u0C4D\u0C30', '\u0C6C'], ['7', '\u0C15\u0C4D\u0C37', '\u0C6D'], ['8', '\u0C36\u0C4D\u0C30', '\u0C6E'], ['9', '(', '\u0C6F'], ['0', ')', '\u0C66'], ['-', '\u0C03'], ['\u0C43', '\u0C0B', '\u0C44'], ['Bksp', 'Bksp']], 824 | [['Tab', 'Tab'], ['\u0C4C', '\u0C14'], ['\u0C48', '\u0C10', '\u0C56'], ['\u0C3E', '\u0C06'], ['\u0C40', '\u0C08', '', '\u0C61'], ['\u0C42', '\u0C0A'], ['\u0C2C'], ['\u0C39', '\u0C19'], ['\u0C17', '\u0C18'], ['\u0C26', '\u0C27'], ['\u0C1C', '\u0C1D'], ['\u0C21', '\u0C22'], ['', '\u0C1E']], 825 | [['Caps', 'Caps'], ['\u0C4B', '\u0C13'], ['\u0C47', '\u0C0F', '\u0C55'], ['\u0C4D', '\u0C05'], ['\u0C3F', '\u0C07', '', '\u0C0C'], ['\u0C41', '\u0C09'], ['\u0C2A', '\u0C2B'], ['\u0C30', '\u0C31'], ['\u0C15', '\u0C16'], ['\u0C24', '\u0C25'], ['\u0C1A', '\u0C1B'], ['\u0C1F', '\u0C25'], ['Enter', 'Enter']], 826 | [['Shift', 'Shift'], ['\u0C46', '\u0C0E'], ['\u0C02', '\u0C01'], ['\u0C2E', '\u0C23'], ['\u0C28', '\u0C28'], ['\u0C35'], ['\u0C32', '\u0C33'], ['\u0C38', '\u0C36'], [',', '\u0C37'], ['.'], ['\u0C2F'], ['Shift', 'Shift']], 827 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 828 | ], 'lang': ['te'] }; 829 | 830 | this.VKI_layout['Ti\u1ebfng Vi\u1ec7t'] = { 831 | 'name': 'Vietnamese', 'keys': [ 832 | [['`', '~', '`', '~'], ['\u0103', '\u0102', '1', '!'], ['\u00E2', '\u00C2', '2', '@'], ['\u00EA', '\u00CA', '3', '#'], ['\u00F4', '\u00D4', '4', '$'], ['\u0300', '\u0300', '5', '%'], ['\u0309', '\u0309', '6', '^'], ['\u0303', '\u0303', '7', '&'], ['\u0301', '\u0301', '8', '*'], ['\u0323', '\u0323', '9', '('], ['\u0111', '\u0110', '0', ')'], ['-', '_', '-', '_'], ['\u20AB', '+', '=', '+'], ['Bksp', 'Bksp']], 833 | [['Tab', 'Tab'], ['q', 'Q', 'q', 'Q'], ['w', 'W', 'w', 'W'], ['e', 'E', 'e', 'E'], ['r', 'R', 'r', 'R'], ['t', 'T', 't', 'T'], ['y', 'Y', 'y', 'Y'], ['u', 'U', 'u', 'U'], ['i', 'I', 'i', 'I'], ['o', 'O', 'o', 'O'], ['p', 'P', 'p', 'P'], ['\u01B0', '\u01AF', '[', '{'], ['\u01A1', '\u01A0', ']', '}'], ['\\', '|', '\\', '|']], 834 | [['Caps', 'Caps'], ['a', 'A', 'a', 'A'], ['s', 'S', 's', 'S'], ['d', 'D', 'd', 'D'], ['f', 'F', 'f', 'F'], ['g', 'G', 'g', 'G'], ['h', 'H', 'h', 'H'], ['j', 'J', 'j', 'J'], ['k', 'K', 'k', 'K'], ['l', 'L', 'l', 'L'], [';', ':', ';', ':'], ['\'', '"', '\'', '"'], ['Enter', 'Enter']], 835 | [['Shift', 'Shift'], ['z', 'Z', 'z', 'Z'], ['x', 'X', 'x', 'X'], ['c', 'C', 'c', 'C'], ['v', 'V', 'v', 'V'], ['b', 'B', 'b', 'B'], ['n', 'N', 'n', 'N'], ['m', 'M', 'm', 'M'], [',', '<', ',', '<'], ['.', '>', '.', '>'], ['/', '?', '/', '?'], ['Shift', 'Shift']], 836 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 837 | ], 'lang': ['vi'] }; 838 | 839 | this.VKI_layout['\u0e44\u0e17\u0e22 Kedmanee'] = { 840 | 'name': 'Thai Kedmanee', 'keys': [ 841 | [['_', '%'], ['\u0E45', '+'], ['/', '\u0E51'], ['-', '\u0E52'], ['\u0E20', '\u0E53'], ['\u0E16', '\u0E54'], ['\u0E38', '\u0E39'], ['\u0E36', '\u0E3F'], ['\u0E04', '\u0E55'], ['\u0E15', '\u0E56'], ['\u0E08', '\u0E57'], ['\u0E02', '\u0E58'], ['\u0E0A', '\u0E59'], ['Bksp', 'Bksp']], 842 | [['Tab', 'Tab'], ['\u0E46', '\u0E50'], ['\u0E44', '"'], ['\u0E33', '\u0E0E'], ['\u0E1E', '\u0E11'], ['\u0E30', '\u0E18'], ['\u0E31', '\u0E4D'], ['\u0E35', '\u0E4A'], ['\u0E23', '\u0E13'], ['\u0E19', '\u0E2F'], ['\u0E22', '\u0E0D'], ['\u0E1A', '\u0E10'], ['\u0E25', ','], ['\u0E03', '\u0E05']], 843 | [['Caps', 'Caps'], ['\u0E1F', '\u0E24'], ['\u0E2B', '\u0E06'], ['\u0E01', '\u0E0F'], ['\u0E14', '\u0E42'], ['\u0E40', '\u0E0C'], ['\u0E49', '\u0E47'], ['\u0E48', '\u0E4B'], ['\u0E32', '\u0E29'], ['\u0E2A', '\u0E28'], ['\u0E27', '\u0E0B'], ['\u0E07', '.'], ['Enter', 'Enter']], 844 | [['Shift', 'Shift'], ['\u0E1C', '('], ['\u0E1B', ')'], ['\u0E41', '\u0E09'], ['\u0E2D', '\u0E2E'], ['\u0E34', '\u0E3A'], ['\u0E37', '\u0E4C'], ['\u0E17', '?'], ['\u0E21', '\u0E12'], ['\u0E43', '\u0E2C'], ['\u0E1D', '\u0E26'], ['Shift', 'Shift']], 845 | [[' ', ' ']] 846 | ], 'lang': ['th'] }; 847 | 848 | this.VKI_layout['\u0e44\u0e17\u0e22 Pattachote'] = { 849 | 'name': 'Thai Pattachote', 'keys': [ 850 | [['_', '\u0E3F'], ['=', '+'], ['\u0E52', '"'], ['\u0E53', '/'], ['\u0E54', ','], ['\u0E55', '?'], ['\u0E39', '\u0E38'], ['\u0E57', '_'], ['\u0E58', '.'], ['\u0E59', '('], ['\u0E50', ')'], ['\u0E51', '-'], ['\u0E56', '%'], ['Bksp', 'Bksp']], 851 | [['Tab', 'Tab'], ['\u0E47', '\u0E4A'], ['\u0E15', '\u0E24'], ['\u0E22', '\u0E46'], ['\u0E2D', '\u0E0D'], ['\u0E23', '\u0E29'], ['\u0E48', '\u0E36'], ['\u0E14', '\u0E1D'], ['\u0E21', '\u0E0B'], ['\u0E27', '\u0E16'], ['\u0E41', '\u0E12'], ['\u0E43', '\u0E2F'], ['\u0E0C', '\u0E26'], ['\uF8C7', '\u0E4D']], 852 | [['Caps', 'Caps'], ['\u0E49', '\u0E4B'], ['\u0E17', '\u0E18'], ['\u0E07', '\u0E33'], ['\u0E01', '\u0E13'], ['\u0E31', '\u0E4C'], ['\u0E35', '\u0E37'], ['\u0E32', '\u0E1C'], ['\u0E19', '\u0E0A'], ['\u0E40', '\u0E42'], ['\u0E44', '\u0E06'], ['\u0E02', '\u0E11'], ['Enter', 'Enter']], 853 | [['Shift', 'Shift'], ['\u0E1A', '\u0E0E'], ['\u0E1B', '\u0E0F'], ['\u0E25', '\u0E10'], ['\u0E2B', '\u0E20'], ['\u0E34', '\u0E31'], ['\u0E04', '\u0E28'], ['\u0E2A', '\u0E2E'], ['\u0E30', '\u0E1F'], ['\u0E08', '\u0E09'], ['\u0E1E', '\u0E2C'], ['Shift', 'Shift']], 854 | [[' ', ' ']] 855 | ]}; 856 | 857 | this.VKI_layout['\u0422\u0430\u0442\u0430\u0440\u0447\u0430'] = { 858 | 'name': 'Tatar', 'keys': [ 859 | [['\u04BB', '\u04BA', '\u0451', '\u0401'], ['1', '!'], ['2', '"', '@'], ['3', '\u2116', '#'], ['4', ';', '$'], ['5', '%'], ['6', ':'], ['7', '?', '['], ['8', '*', ']'], ['9', '(', '{'], ['0', ')', '}'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 860 | [['Tab', 'Tab'], ['\u0439', '\u0419'], ['\u04E9', '\u04E8', '\u0446', '\u0426'], ['\u0443', '\u0423'], ['\u043A', '\u041A'], ['\u0435', '\u0415'], ['\u043D', '\u041D'], ['\u0433', '\u0413'], ['\u0448', '\u0428'], ['\u04D9', '\u04D8', '\u0449', '\u0429'], ['\u0437', '\u0417'], ['\u0445', '\u0425'], ['\u04AF', '\u04AE', '\u044A', '\u042A'], ['\\', '/']], 861 | [['Caps', 'Caps'], ['\u0444', '\u0424'], ['\u044B', '\u042B'], ['\u0432', '\u0412'], ['\u0430', '\u0410'], ['\u043F', '\u041F'], ['\u0440', '\u0420'], ['\u043E', '\u041E'], ['\u043B', '\u041B'], ['\u0434', '\u0414'], ['\u04A3', '\u04A2', '\u0436', '\u0416'], ['\u044D', '\u042D', '\''], ['Enter', 'Enter']], 862 | [['Shift', 'Shift'], ['\u0491', '\u0490'], ['\u044F', '\u042F'], ['\u0447', '\u0427'], ['\u0441', '\u0421'], ['\u043C', '\u041C'], ['\u0438', '\u0418'], ['\u0442', '\u0422'], ['\u0497', '\u0496', '\u044C', '\u042C'], ['\u0431', '\u0411', '<'], ['\u044E', '\u042E', '>'], ['.', ','], ['Shift', 'Shift']], 863 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 864 | ], 'lang': ['tt'] }; 865 | 866 | this.VKI_layout['T\u00fcrk\u00e7e F'] = { 867 | 'name': 'Turkish F', 'keys': [ 868 | [['+', '*', '\u00ac'], ['1', '!', '\u00b9', '\u00a1'], ['2', '"', '\u00b2'], ['3', '^', '#', '\u00b3'], ['4', '$', '\u00bc', '\u00a4'], ['5', '%', '\u00bd'], ['6', '&', '\u00be'], ['7', '\'', '{'], ['8', '(', '['], ['9', ')', ']'], ['0', '=', '}'], ['/', '?', '\\', '\u00bf'], ['-', '_', '|'], ['Bksp', 'Bksp']], 869 | [['Tab', 'Tab'], ['f', 'F', '@'], ['g', 'G'], ['\u011f', '\u011e'], ['\u0131', 'I', '\u00b6', '\u00ae'], ['o', 'O'], ['d', 'D', '\u00a5'], ['r', 'R'], ['n', 'N'], ['h', 'H', '\u00f8', '\u00d8'], ['p', 'P', '\u00a3'], ['q', 'Q', '\u00a8'], ['w', 'W', '~'], ['x', 'X', '`']], 870 | [['Caps', 'Caps'], ['u', 'U', '\u00e6', '\u00c6'], ['i', '\u0130', '\u00df', '\u00a7'], ['e', 'E', '\u20ac'], ['a', 'A', ' ', '\u00aa'], ['\u00fc', '\u00dc'], ['t', 'T'], ['k', 'K'], ['m', 'M'], ['l', 'L'], ['y', 'Y', '\u00b4'], ['\u015f', '\u015e'], ['Enter', 'Enter']], 871 | [['Shift', 'Shift'], ['<', '>', '|', '\u00a6'], ['j', 'J', '\u00ab', '<'], ['\u00f6', '\u00d6', '\u00bb', '>'], ['v', 'V', '\u00a2', '\u00a9'], ['c', 'C'], ['\u00e7', '\u00c7'], ['z', 'Z'], ['s', 'S', '\u00b5', '\u00ba'], ['b', 'B', '\u00d7'], ['.', ':', '\u00f7'], [',', ';', '-'], ['Shift', 'Shift']], 872 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 873 | ]}; 874 | 875 | this.VKI_layout['T\u00fcrk\u00e7e Q'] = { 876 | 'name': 'Turkish Q', 'keys': [ 877 | [['"', '\u00e9', '<'], ['1', '!', '>'], ['2', '\'', '\u00a3'], ['3', '^', '#'], ['4', '+', '$'], ['5', '%', '\u00bd'], ['6', '&'], ['7', '/', '{'], ['8', '(', '['], ['9', ')', ']'], ['0', '=', '}'], ['*', '?', '\\'], ['-', '_', '|'], ['Bksp', 'Bksp']], 878 | [['Tab', 'Tab'], ['q', 'Q', '@'], ['w', 'W'], ['e', 'E', '\u20ac'], ['r', 'R'], ['t', 'T'], ['y', 'Y'], ['u', 'U'], ['\u0131', 'I', 'i', '\u0130'], ['o', 'O'], ['p', 'P'], ['\u011f', '\u011e', '\u00a8'], ['\u00fc', '\u00dc', '~'], [',', ';', '`']], 879 | [['Caps', 'Caps'], ['a', 'A', '\u00e6', '\u00c6'], ['s', 'S', '\u00df'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], ['\u015f', '\u015e', '\u00b4'], ['i', '\u0130'], ['Enter', 'Enter']], 880 | [['Shift', 'Shift'], ['<', '>', '|'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], ['\u00f6', '\u00d6'], ['\u00e7', '\u00c7'], ['.', ':'], ['Shift', 'Shift']], 881 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 882 | ], 'lang': ['tr'] }; 883 | 884 | this.VKI_layout['\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430'] = { 885 | 'name': 'Ukrainian', 'keys': [ 886 | [['\u00b4', '~'], ['1', '!'], ['2', '"'], ['3', '\u2116'], ['4', ';'], ['5', '%'], ['6', ':'], ['7', '?'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 887 | [['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']], 888 | [['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']], 889 | [['Shift', 'Shift'], ['\u044F', '\u042F'], ['\u0447', '\u0427'], ['\u0441', '\u0421'], ['\u043C', '\u041C'], ['\u0438', '\u0418'], ['\u0442', '\u0422'], ['\u044C', '\u042C'], ['\u0431', '\u0411'], ['\u044E', '\u042E'], ['.', ','], ['Shift', 'Shift']], 890 | [[' ', ' ']] 891 | ], 'lang': ['uk'] }; 892 | 893 | this.VKI_layout['United Kingdom'] = { 894 | 'name': 'United Kingdom', 'keys': [ 895 | [['`', '\u00ac', '\u00a6'], ['1', '!'], ['2', '"'], ['3', '\u00a3'], ['4', '$', '\u20ac'], ['5', '%'], ['6', '^'], ['7', '&'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 896 | [['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'], ['[', '{'], [']', '}'], ['#', '~']], 897 | [['Caps', 'Caps'], ['a', 'A', '\u00e1', '\u00c1'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], [';', ':'], ['\'', '@'], ['Enter', 'Enter']], 898 | [['Shift', 'Shift'], ['\\', '|'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', '<'], ['.', '>'], ['/', '?'], ['Shift', 'Shift']], 899 | [[' ', ' ', ' ', ' '], ['AltGr', 'AltGr']] 900 | ], 'lang': ['en-gb'] }; 901 | 902 | this.VKI_layout['\u0627\u0631\u062f\u0648'] = { 903 | 'name': 'Urdu', 'keys': [ 904 | [['`', '~'], ['1', '!'], ['2', '@'], ['3', '#'], ['4', '$'], ['5', '\u066A'], ['6', '^'], ['7', '\u06D6'], ['8', '\u066D'], ['9', ')'], ['0', '('], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 905 | [['Tab', 'Tab'], ['\u0637', '\u0638'], ['\u0635', '\u0636'], ['\u06be', '\u0630'], ['\u062f', '\u0688'], ['\u0679', '\u062B'], ['\u067e', '\u0651'], ['\u062a', '\u06C3'], ['\u0628', '\u0640'], ['\u062c', '\u0686'], ['\u062d', '\u062E'], [']', '}'], ['[', '{'], ['\\', '|']], 906 | [['Caps', 'Caps'], ['\u0645', '\u0698'], ['\u0648', '\u0632'], ['\u0631', '\u0691'], ['\u0646', '\u06BA'], ['\u0644', '\u06C2'], ['\u06c1', '\u0621'], ['\u0627', '\u0622'], ['\u06A9', '\u06AF'], ['\u06CC', '\u064A'], ['\u061b', ':'], ['\'', '"'], ['Enter', 'Enter']], 907 | [['Shift', 'Shift'], ['\u0642', '\u200D'], ['\u0641', '\u200C'], ['\u06D2', '\u06D3'], ['\u0633', '\u200E'], ['\u0634', '\u0624'], ['\u063a', '\u0626'], ['\u0639', '\u200F'], ['\u060C', '>'], ['\u06D4', '<'], ['/', '\u061F'], ['Shift', 'Shift']], 908 | [[' ', ' ']] 909 | ], 'lang': ['ur'] }; 910 | 911 | this.VKI_layout['\u0627\u0631\u062f\u0648 Phonetic'] = { 912 | 'name': 'Urdu Phonetic', 'keys': [ 913 | [['\u064D', '\u064B', '~'], ['\u06F1', '1', '!'], ['\u06F2', '2', '@'], ['\u06F3', '3', '#'], ['\u06F4', '4', '$'], ['\u06F5', '5', '\u066A'], ['\u06F6', '6', '^'], ['\u06F7', '7', '&'], ['\u06F8', '8', '*'], ['\u06F9', '9', '('], ['\u06F0', '0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 914 | [['Tab', 'Tab'], ['\u0642', '\u0652'], ['\u0648', '\u0651', '\u0602'], ['\u0639', '\u0670', '\u0656'], ['\u0631', '\u0691', '\u0613'], ['\u062A', '\u0679', '\u0614'], ['\u06D2', '\u064E', '\u0601'], ['\u0621', '\u0626', '\u0654'], ['\u06CC', '\u0650', '\u0611'], ['\u06C1', '\u06C3'], ['\u067E', '\u064F', '\u0657'], ['[', '{'], [']', '}'], ['\\', '|']], 915 | [['Caps', 'Caps'], ['\u0627', '\u0622', '\uFDF2'], ['\u0633', '\u0635', '\u0610'], ['\u062F', '\u0688', '\uFDFA'], ['\u0641'], ['\u06AF', '\u063A'], ['\u062D', '\u06BE', '\u0612'], ['\u062C', '\u0636', '\uFDFB'], ['\u06A9', '\u062E'], ['\u0644'], ['\u061B', ':'], ['\'', '"'], ['Enter', 'Enter']], 916 | [['Shift', 'Shift'], ['\u0632', '\u0630', '\u060F'], ['\u0634', '\u0698', '\u060E'], ['\u0686', '\u062B', '\u0603'], ['\u0637', '\u0638'], ['\u0628', '', '\uFDFD'], ['\u0646', '\u06BA', '\u0600'], ['\u0645', '\u0658'], ['\u060C', '', '<'], ['\u06D4', '\u066B', '>'], ['/', '\u061F'], ['Shift', 'Shift']], 917 | [[' ', ' ', ' ', ' '], ['Alt', 'Alt']] 918 | ]}; 919 | 920 | this.VKI_layout['US Standard'] = { 921 | 'name': 'US Standard', 'keys': [ 922 | [['`', '~'], ['1', '!'], ['2', '@'], ['3', '#'], ['4', '$'], ['5', '%'], ['6', '^'], ['7', '&'], ['8', '*'], ['9', '('], ['0', ')'], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 923 | [['Tab', 'Tab'], ['q', 'Q'], ['w', 'W'], ['e', 'E'], ['r', 'R'], ['t', 'T'], ['y', 'Y'], ['u', 'U'], ['i', 'I'], ['o', 'O'], ['p', 'P'], ['[', '{'], [']', '}'], ['\\', '|']], 924 | [['Caps', 'Caps'], ['a', 'A'], ['s', 'S'], ['d', 'D'], ['f', 'F'], ['g', 'G'], ['h', 'H'], ['j', 'J'], ['k', 'K'], ['l', 'L'], [';', ':'], ['\'', '"'], ['Enter', 'Enter']], 925 | [['Shift', 'Shift'], ['z', 'Z'], ['x', 'X'], ['c', 'C'], ['v', 'V'], ['b', 'B'], ['n', 'N'], ['m', 'M'], [',', '<'], ['.', '>'], ['/', '?'], ['Shift', 'Shift']], 926 | [[' ', ' ']] 927 | ], 'lang': ['en-us'] }; 928 | 929 | this.VKI_layout['US International'] = { 930 | 'name': 'US International', 'keys': [ 931 | [['`', '~'], ['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']], 932 | [['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']], 933 | [['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']], 934 | [['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']], 935 | [[' ', ' ', ' ', ' '], ['Alt', 'Alt']] 936 | ], 'lang': ['en'] }; 937 | 938 | this.VKI_layout['\u040e\u0437\u0431\u0435\u043a\u0447\u0430'] = { 939 | 'name': 'Uzbek Cyrillic', 'keys': [ 940 | [['\u0451', '\u0401'], ['1', '!'], ['2', '"'], ['3', '\u2116'], ['4', ';'], ['5', '%'], ['6', ':'], ['7', '?'], ['8', '*'], ['9', '('], ['0', ')'], ['\u0493', '\u0492'], ['\u04B3', '\u04B2'], ['Bksp', 'Bksp']], 941 | [['Tab', 'Tab'], ['\u0439', '\u0419'], ['\u0446', '\u0426'], ['\u0443', '\u0423'], ['\u043A', '\u041A'], ['\u0435', '\u0415'], ['\u043D', '\u041D'], ['\u0433', '\u0413'], ['\u0448', '\u0428'], ['\u045E', '\u040E'], ['\u0437', '\u0417'], ['\u0445', '\u0425'], ['\u044A', '\u042A'], ['\\', '/']], 942 | [['Caps', 'Caps'], ['\u0444', '\u0424'], ['\u049B', '\u049A'], ['\u0432', '\u0412'], ['\u0430', '\u0410'], ['\u043F', '\u041F'], ['\u0440', '\u0420'], ['\u043E', '\u041E'], ['\u043B', '\u041B'], ['\u0434', '\u0414'], ['\u0436', '\u0416'], ['\u044D', '\u042D'], ['Enter', 'Enter']], 943 | [['Shift', 'Shift'], ['\u044F', '\u042F'], ['\u0447', '\u0427'], ['\u0441', '\u0421'], ['\u043C', '\u041C'], ['\u0438', '\u0418'], ['\u0442', '\u0422'], ['\u044C', '\u042C'], ['\u0431', '\u0411'], ['\u044E', '\u042E'], ['.', ','], ['Shift', 'Shift']], 944 | [[' ', ' ']] 945 | ], 'lang': ['uz'] }; 946 | 947 | this.VKI_layout['\u05d9\u05d9\u05b4\u05d3\u05d9\u05e9'] = { // from https://www.yv.org/uyip/hebyidkbd.txt https://uyip.org/keyboards.html 948 | 'name': 'Yiddish', 'keys': [ 949 | [[';', '~', '\u05B0'], ['1', '!', '\u05B1'], ['2', '@', '\u05B2'], ['3', '#', '\u05B3'], ['4', '$', '\u05B4'], ['5', '%', '\u05B5'], ['6', '^', '\u05B6'], ['7', '*', '\u05B7'], ['8', '&', '\u05B8'], ['9', '(', '\u05C2'], ['0', ')', '\u05C1'], ['-', '_', '\u05B9'], ['=', '+', '\u05BC'], ['Bksp', 'Bksp']], 950 | [['Tab', 'Tab'], ['/', '\u201F', '\u201F'], ['\'', '\u201E', '\u201E'], ['\u05E7', '`', '`'], ['\u05E8', '\uFB2F', '\uFB2F'], ['\u05D0', '\uFB2E', '\uFB2E'], ['\u05D8', '\u05F0', '\u05F0'], ['\u05D5', '\uFB35', '\uFB35'], ['\u05DF', '\uFB4B', '\uFB4B'], ['\u05DD', '\uFB4E', '\uFB4E'], ['\u05E4', '\uFB44', '\uFB44'], ['[', '{', '\u05BD'], [']', '}', '\u05BF'], ['\\', '|', '\u05BB']], 951 | [['Caps', 'Caps'], ['\u05E9', '\uFB2A', '\uFB2A'], ['\u05D3', '\uFB2B', '\uFB2B'], ['\u05D2'], ['\u05DB', '\uFB3B', '\uFB3B'], ['\u05E2', '\u05F1', '\u05F1'], ['\u05D9', '\uFB1D', '\uFB1D'], ['\u05D7', '\uFF1F', '\uFF1F'], ['\u05DC', '\u05F2', '\u05F2'], ['\u05DA'], ['\u05E3', ':', '\u05C3'], [',', '"', '\u05C0'], ['Enter', 'Enter']], 952 | [['Shift', 'Shift'], ['\u05D6', '\u2260', '\u2260'], ['\u05E1', '\uFB4C', '\uFB4C'], ['\u05D1', '\uFB31', '\uFB31'], ['\u05D4', '\u05BE', '\u05BE'], ['\u05E0', '\u2013', '\u2013'], ['\u05DE', '\u2014', '\u2014'], ['\u05E6', '\uFB4A', '\uFB4A'], ['\u05EA', '<', '\u05F3'], ['\u05E5', '>', '\u05F4'], ['.', '?', '\u20AA'], ['Shift', 'Shift']], 953 | [[' ', ' '], ['Alt', 'Alt']] 954 | ], 'lang': ['yi'] }; 955 | 956 | this.VKI_layout['\u05d9\u05d9\u05b4\u05d3\u05d9\u05e9 \u05dc\u05e2\u05d1\u05d8'] = { // from https://jidysz.net/ 957 | 'name': 'Yiddish (Yidish Lebt)', 'keys': [ 958 | [[';', '~'], ['1', '!', '\u05B2', '\u05B2'], ['2', '@', '\u05B3', '\u05B3'], ['3', '#', '\u05B1', '\u05B1'], ['4', '$', '\u05B4', '\u05B4'], ['5', '%', '\u05B5', '\u05B5'], ['6', '^', '\u05B7', '\u05B7'], ['7', '&', '\u05B8', '\u05B8'], ['8', '*', '\u05BB', '\u05BB'], ['9', ')', '\u05B6', '\u05B6'], ['0', '(', '\u05B0', '\u05B0'], ['-', '_', '\u05BF', '\u05BF'], ['=', '+', '\u05B9', '\u05B9'], ['Bksp', 'Bksp']], 959 | [['Tab', 'Tab'], ['/', '', '\u05F4', '\u05F4'], ['\'', '', '\u05F3', '\u05F3'], ['\u05E7', '', '\u20AC'], ['\u05E8'], ['\u05D0', '', '\u05D0\u05B7', '\uFB2E'], ['\u05D8', '', '\u05D0\u05B8', '\uFB2F'], ['\u05D5', '\u05D5\u05B9', '\u05D5\u05BC', '\uFB35'], ['\u05DF', '', '\u05D5\u05D5', '\u05F0'], ['\u05DD', '', '\u05BC'], ['\u05E4', '', '\u05E4\u05BC', '\uFB44'], [']', '}', '\u201E', '\u201D'], ['[', '{', '\u201A', '\u2019'], ['\\', '|', '\u05BE', '\u05BE']], 960 | [['Caps', 'Caps'], ['\u05E9', '\u05E9\u05C1', '\u05E9\u05C2', '\uFB2B'], ['\u05D3', '', '\u20AA'], ['\u05D2', '\u201E'], ['\u05DB', '', '\u05DB\u05BC', '\uFB3B'], ['\u05E2', '', '', '\uFB20'], ['\u05D9', '', '\u05D9\u05B4', '\uFB1D'], ['\u05D7', '', '\u05F2\u05B7', '\uFB1F'], ['\u05DC', '\u05DC\u05B9', '\u05D5\u05D9', '\u05F1'], ['\u05DA', '', '', '\u05F2'], ['\u05E3', ':', '\u05E4\u05BF', '\uFB4E'], [',', '"', ';', '\u05B2'], ['Enter', 'Enter']], 961 | [['Shift', 'Shift'], ['\u05D6', '', '\u2013', '\u2013'], ['\u05E1', '', '\u2014', '\u2014'], ['\u05D1', '\u05DC\u05B9', '\u05D1\u05BF', '\uFB4C'], ['\u05D4', '', '\u201D', '\u201C'], ['\u05E0', '', '\u059C', '\u059E'], ['\u05DE', '', '\u2019', '\u2018'], ['\u05E6', '', '\u05E9\u05C1', '\uFB2A'], ['\u05EA', '>', '\u05EA\u05BC', '\uFB4A'], ['\u05E5', '<'], ['.', '?', '\u2026'], ['Shift', 'Shift']], 962 | [[' ', ' ', ' ', ' '], ['Alt', 'Alt']] 963 | ], 'lang': ['yi'] }; 964 | 965 | this.VKI_layout['\u4e2d\u6587\u6ce8\u97f3\u7b26\u53f7'] = { 966 | 'name': 'Chinese Bopomofo IME', 'keys': [ 967 | [['\u20AC', '~'], ['\u3105', '!'], ['\u3109', '@'], ['\u02C7', '#'], ['\u02CB', '$'], ['\u3113', '%'], ['\u02CA', '^'], ['\u02D9', '&'], ['\u311A', '*'], ['\u311E', ')'], ['\u3122', '('], ['\u3126', '_'], ['=', '+'], ['Bksp', 'Bksp']], 968 | [['Tab', 'Tab'], ['\u3106', 'q'], ['\u310A', 'w'], ['\u310D', 'e'], ['\u3110', 'r'], ['\u3114', 't'], ['\u3117', 'y'], ['\u3127', 'u'], ['\u311B', 'i'], ['\u311F', 'o'], ['\u3123', 'p'], ['[', '{'], [']', '}'], ['\\', '|']], 969 | [['Caps', 'Caps'], ['\u3107', 'a'], ['\u310B', 's'], ['\u310E', 'd'], ['\u3111', 'f'], ['\u3115', 'g'], ['\u3118', 'h'], ['\u3128', 'j'], ['\u311C', 'k'], ['\u3120', 'l'], ['\u3124', ':'], ['\'', '"'], ['Enter', 'Enter']], 970 | [['Shift', 'Shift'], ['\u3108', 'z'], ['\u310C', 'x'], ['\u310F', 'c'], ['\u3112', 'v'], ['\u3116', 'b'], ['\u3119', 'n'], ['\u3129', 'm'], ['\u311D', '<'], ['\u3121', '>'], ['\u3125', '?'], ['Shift', 'Shift']], 971 | [[' ', ' ']] 972 | ], 'lang': ['zh-Bopo'] }; 973 | 974 | this.VKI_layout['\u4e2d\u6587\u4ed3\u9889\u8f93\u5165\u6cd5'] = { 975 | 'name': 'Chinese Cangjie IME', 'keys': [ 976 | [['\u20AC', '~'], ['1', '!'], ['2', '@'], ['3', '#'], ['4', '$'], ['5', '%'], ['6', '^'], ['7', '&'], ['8', '*'], ['9', ')'], ['0', '('], ['-', '_'], ['=', '+'], ['Bksp', 'Bksp']], 977 | [['Tab', 'Tab'], ['\u624B', 'q'], ['\u7530', 'w'], ['\u6C34', 'e'], ['\u53E3', 'r'], ['\u5EFF', 't'], ['\u535C', 'y'], ['\u5C71', 'u'], ['\u6208', 'i'], ['\u4EBA', 'o'], ['\u5FC3', 'p'], ['[', '{'], [']', '}'], ['\\', '|']], 978 | [['Caps', 'Caps'], ['\u65E5', 'a'], ['\u5C38', 's'], ['\u6728', 'd'], ['\u706B', 'f'], ['\u571F', 'g'], ['\u7AF9', 'h'], ['\u5341', 'j'], ['\u5927', 'k'], ['\u4E2D', 'l'], [';', ':'], ['\'', '"'], ['Enter', 'Enter']], 979 | [['Shift', 'Shift'], ['\uFF3A', 'z'], ['\u96E3', 'x'], ['\u91D1', 'c'], ['\u5973', 'v'], ['\u6708', 'b'], ['\u5F13', 'n'], ['\u4E00', 'm'], [',', '<'], ['.', '>'], ['/', '?'], ['Shift', 'Shift']], 980 | [[' ', ' ']] 981 | ], 'lang': ['zh'] }; 982 | 983 | 984 | /* ***** Define Dead Keys ************************************** */ 985 | this.VKI_deadkey = {}; 986 | 987 | // - Lay out each dead key set as an object of property/value 988 | // pairs. The rows below are wrapped so uppercase letters are 989 | // below their lowercase equivalents. 990 | // 991 | // - The property name is the letter pressed after the diacritic. 992 | // The property value is the letter this key-combo will generate. 993 | // 994 | // - Note that if you have created a new keyboard layout and want 995 | // it included in the distributed script, PLEASE TELL ME if you 996 | // have added additional dead keys to the ones below. 997 | 998 | this.VKI_deadkey['"'] = this.VKI_deadkey['\u00a8'] = this.VKI_deadkey['\u309B'] = { // Umlaut / Diaeresis / Greek Dialytika / Hiragana/Katakana Voiced Sound Mark 999 | 'a': '\u00e4', 'e': '\u00eb', 'i': '\u00ef', 'o': '\u00f6', 'u': '\u00fc', 'y': '\u00ff', '\u03b9': '\u03ca', '\u03c5': '\u03cb', '\u016B': '\u01D6', '\u00FA': '\u01D8', '\u01D4': '\u01DA', '\u00F9': '\u01DC', 1000 | 'A': '\u00c4', 'E': '\u00cb', 'I': '\u00cf', 'O': '\u00d6', 'U': '\u00dc', 'Y': '\u0178', '\u0399': '\u03aa', '\u03a5': '\u03ab', '\u016A': '\u01D5', '\u00DA': '\u01D7', '\u01D3': '\u01D9', '\u00D9': '\u01DB', 1001 | '\u304b': '\u304c', '\u304d': '\u304e', '\u304f': '\u3050', '\u3051': '\u3052', '\u3053': '\u3054', '\u305f': '\u3060', '\u3061': '\u3062', '\u3064': '\u3065', '\u3066': '\u3067', '\u3068': '\u3069', 1002 | '\u3055': '\u3056', '\u3057': '\u3058', '\u3059': '\u305a', '\u305b': '\u305c', '\u305d': '\u305e', '\u306f': '\u3070', '\u3072': '\u3073', '\u3075': '\u3076', '\u3078': '\u3079', '\u307b': '\u307c', 1003 | '\u30ab': '\u30ac', '\u30ad': '\u30ae', '\u30af': '\u30b0', '\u30b1': '\u30b2', '\u30b3': '\u30b4', '\u30bf': '\u30c0', '\u30c1': '\u30c2', '\u30c4': '\u30c5', '\u30c6': '\u30c7', '\u30c8': '\u30c9', 1004 | '\u30b5': '\u30b6', '\u30b7': '\u30b8', '\u30b9': '\u30ba', '\u30bb': '\u30bc', '\u30bd': '\u30be', '\u30cf': '\u30d0', '\u30d2': '\u30d3', '\u30d5': '\u30d6', '\u30d8': '\u30d9', '\u30db': '\u30dc' 1005 | }; 1006 | this.VKI_deadkey['~'] = { // Tilde / Stroke 1007 | 'a': '\u00e3', 'l': '\u0142', 'n': '\u00f1', 'o': '\u00f5', 1008 | 'A': '\u00c3', 'L': '\u0141', 'N': '\u00d1', 'O': '\u00d5' 1009 | }; 1010 | this.VKI_deadkey['^'] = { // Circumflex 1011 | 'a': '\u00e2', 'e': '\u00ea', 'i': '\u00ee', 'o': '\u00f4', 'u': '\u00fb', 'w': '\u0175', 'y': '\u0177', 1012 | 'A': '\u00c2', 'E': '\u00ca', 'I': '\u00ce', 'O': '\u00d4', 'U': '\u00db', 'W': '\u0174', 'Y': '\u0176' 1013 | }; 1014 | this.VKI_deadkey['\u02c7'] = { // Baltic caron 1015 | 'c': '\u010D', 'd': '\u010f', 'e': '\u011b', 's': '\u0161', 'l': '\u013e', 'n': '\u0148', 'r': '\u0159', 't': '\u0165', 'u': '\u01d4', 'z': '\u017E', '\u00fc': '\u01da', 1016 | 'C': '\u010C', 'D': '\u010e', 'E': '\u011a', 'S': '\u0160', 'L': '\u013d', 'N': '\u0147', 'R': '\u0158', 'T': '\u0164', 'U': '\u01d3', 'Z': '\u017D', '\u00dc': '\u01d9' 1017 | }; 1018 | this.VKI_deadkey['\u02d8'] = { // Romanian and Turkish breve 1019 | 'a': '\u0103', 'g': '\u011f', 1020 | 'A': '\u0102', 'G': '\u011e' 1021 | }; 1022 | this.VKI_deadkey['-'] = this.VKI_deadkey['\u00af'] = { // Macron 1023 | 'a': '\u0101', 'e': '\u0113', 'i': '\u012b', 'o': '\u014d', 'u': '\u016B', 'y': '\u0233', '\u00fc': '\u01d6', 1024 | 'A': '\u0100', 'E': '\u0112', 'I': '\u012a', 'O': '\u014c', 'U': '\u016A', 'Y': '\u0232', '\u00dc': '\u01d5' 1025 | }; 1026 | this.VKI_deadkey['`'] = { // Grave 1027 | 'a': '\u00e0', 'e': '\u00e8', 'i': '\u00ec', 'o': '\u00f2', 'u': '\u00f9', '\u00fc': '\u01dc', 1028 | 'A': '\u00c0', 'E': '\u00c8', 'I': '\u00cc', 'O': '\u00d2', 'U': '\u00d9', '\u00dc': '\u01db' 1029 | }; 1030 | this.VKI_deadkey['\''] = this.VKI_deadkey['\u00b4'] = this.VKI_deadkey['\u0384'] = { // Acute / Greek Tonos 1031 | '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', 1032 | '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' 1033 | }; 1034 | this.VKI_deadkey['\u02dd'] = { // Hungarian Double Acute Accent 1035 | 'o': '\u0151', 'u': '\u0171', 1036 | 'O': '\u0150', 'U': '\u0170' 1037 | }; 1038 | this.VKI_deadkey['\u0385'] = { // Greek Dialytika + Tonos 1039 | '\u03b9': '\u0390', '\u03c5': '\u03b0' 1040 | }; 1041 | this.VKI_deadkey['\u00b0'] = this.VKI_deadkey['\u00ba'] = { // Ring 1042 | 'a': '\u00e5', 'u': '\u016f', 1043 | 'A': '\u00c5', 'U': '\u016e' 1044 | }; 1045 | this.VKI_deadkey['\u02DB'] = { // Ogonek 1046 | 'a': '\u0106', 'e': '\u0119', 'i': '\u012f', 'o': '\u01eb', 'u': '\u0173', 'y': '\u0177', 1047 | 'A': '\u0105', 'E': '\u0118', 'I': '\u012e', 'O': '\u01ea', 'U': '\u0172', 'Y': '\u0176' 1048 | }; 1049 | this.VKI_deadkey['\u02D9'] = { // Dot-above 1050 | 'c': '\u010B', 'e': '\u0117', 'g': '\u0121', 'z': '\u017C', 1051 | 'C': '\u010A', 'E': '\u0116', 'G': '\u0120', 'Z': '\u017B' 1052 | }; 1053 | this.VKI_deadkey['\u00B8'] = this.VKI_deadkey['\u201a'] = { // Cedilla 1054 | 'c': '\u00e7', 's': '\u015F', 1055 | 'C': '\u00c7', 'S': '\u015E' 1056 | }; 1057 | this.VKI_deadkey[','] = { // Comma 1058 | 's': (this.VKI_isIElt8) ? '\u015F' : '\u0219', 't': (this.VKI_isIElt8) ? '\u0163' : '\u021B', 1059 | 'S': (this.VKI_isIElt8) ? '\u015E' : '\u0218', 'T': (this.VKI_isIElt8) ? '\u0162' : '\u021A' 1060 | }; 1061 | this.VKI_deadkey['\u3002'] = { // Hiragana/Katakana Point 1062 | '\u306f': '\u3071', '\u3072': '\u3074', '\u3075': '\u3077', '\u3078': '\u307a', '\u307b': '\u307d', 1063 | '\u30cf': '\u30d1', '\u30d2': '\u30d4', '\u30d5': '\u30d7', '\u30d8': '\u30da', '\u30db': '\u30dd' 1064 | }; 1065 | 1066 | 1067 | /* ***** Define Symbols **************************************** */ 1068 | this.VKI_symbol = { 1069 | '\u00a0': "NB\nSP", '\u200b': "ZW\nSP", '\u200c': "ZW\nNJ", '\u200d': "ZW\nJ" 1070 | }; 1071 | 1072 | 1073 | /* ***** Layout Number Pad ************************************* */ 1074 | this.VKI_numpad = [ 1075 | [['$'], ['\u00a3'], ['\u20ac'], ['\u00a5']], 1076 | [['7'], ['8'], ['9'], ['/']], 1077 | [['4'], ['5'], ['6'], ['*']], 1078 | [['1'], ['2'], ['3'], ['=']], 1079 | [['0'], ['.'], ['+'], ['-']] 1080 | ]; 1081 | 1082 | 1083 | /* **************************************************************** 1084 | * Attach the keyboard to an element 1085 | * 1086 | */ 1087 | VKI_attach = function(elem) { 1088 | if (elem.getAttribute('VKI_attached')) return false; 1089 | if (self.VKI_imageURI) { 1090 | let keybut = document.createElement('img'); 1091 | keybut.src = self.VKI_path + self.VKI_imageURI; 1092 | keybut.alt = self.VKI_i18n['01']; 1093 | keybut.classList.add('keyboardInputInitiator'); 1094 | keybut.title = self.VKI_i18n['01']; 1095 | keybut.elem = elem; 1096 | keybut.addEventListener('click', function(e) { 1097 | e = e || event; 1098 | if (e.stopPropagation) { e.stopPropagation(); } else e.cancelBubble = true; 1099 | self.VKI_show(this.elem); 1100 | }, false); 1101 | elem.parentNode.insertBefore(keybut, (elem.dir == 'rtl') ? elem : elem.nextSibling); 1102 | } else { 1103 | elem.addEventListener('focus', function() { 1104 | if (self.VKI_target != this) { 1105 | if (self.VKI_target) self.VKI_close(); 1106 | self.VKI_show(this); 1107 | } 1108 | }, false); 1109 | elem.addEventListener('click', function() { 1110 | if (!self.VKI_target) self.VKI_show(this); 1111 | }, false); 1112 | } 1113 | elem.setAttribute('VKI_attached', 'true'); 1114 | elem.setAttribute('VKI_type', elem.type); 1115 | elem.setAttribute('inputmode', 'none'); 1116 | if (elem.classList.contains('keyboardInputNumbersOnly')) { 1117 | elem.setAttribute('VKI_numpadInput', 'true'); 1118 | elem.min = 0; 1119 | elem.step = 1; 1120 | } else if (elem.type == 'number') { 1121 | elem.setAttribute('VKI_numpadInput', 'true'); 1122 | } else elem.setAttribute('VKI_numpadInput', 'false'); 1123 | if (self.VKI_isIE) { 1124 | elem.onclick = elem.onselect = elem.onkeyup = function(e) { 1125 | if ((e || event).type != 'keyup' || !this.readOnly) 1126 | this.range = document.selection.createRange(); 1127 | }; 1128 | } 1129 | VKI_addListener(elem, 'click', function(e) { 1130 | if (self.VKI_target == this) { 1131 | e = e || event; 1132 | if (e.stopPropagation) { e.stopPropagation(); } else e.cancelBubble = true; 1133 | } return false; 1134 | }, false); 1135 | if (self.VKI_flashPassword && elem.getAttribute('VKI_type') == 'password') { 1136 | elem.setAttribute('autocomplete', 'new-password'); 1137 | elem.storeValue = elem.value; 1138 | elem.timeout = false; 1139 | elem.addEventListener('focus', function() { 1140 | if (typeof this.timeout !== 'number') 1141 | this.storeValue = this.value; 1142 | }, false); 1143 | elem.restorePassword = function() { 1144 | if (typeof this.timeout === 'number') { 1145 | this.type = 'password'; 1146 | this.value = this.storeValue; 1147 | clearTimeout(this.timeout); 1148 | this.timeout = false; 1149 | } 1150 | }; 1151 | if (elem.form) { 1152 | elem.form.addEventListener('submit', function(e) { 1153 | elem.restorePassword(); 1154 | }, false); 1155 | } 1156 | elem.addEventListener('beforeinput', function() { 1157 | elem.restorePassword(); 1158 | }, false); 1159 | elem.addEventListener('input', function() { 1160 | let selfPass = this; 1161 | if (this.value.length == this.storeValue.length + 1) { 1162 | this.storeValue = this.value; 1163 | this.value = this.value.replace(/.(?!$)/g, '•'); 1164 | setTimeout(function() { 1165 | selfPass.type = 'text'; 1166 | selfPass.setSelectionRange(selfPass.value.length, selfPass.value.length); 1167 | }, 0); 1168 | this.timeout = setTimeout(function() { 1169 | selfPass.type = 'password'; 1170 | selfPass.value = selfPass.storeValue; 1171 | selfPass.timeout = false; 1172 | }, self.VKI_flashPassword); 1173 | } else this.storeValue = this.value; 1174 | }, false); 1175 | } 1176 | if (elem.getAttribute('VKI_numpadInput') == 'true') { 1177 | elem.type = (elem.getAttribute('VKI_type') == 'password') ? 'password' : 'text'; 1178 | elem.addEventListener('beforeinput', function() { 1179 | if (this.getAttribute('VKI_type') != 'password') 1180 | this.storeValue = this.value; 1181 | }, false); 1182 | elem.addEventListener('input', function() { 1183 | let selfNumpadInput = this; 1184 | if (!this.value.match(new RegExp(this.pattern)) || 1185 | (this.max && parseFloat(this.value) > parseFloat(this.max)) || 1186 | (this.min && parseFloat(this.value) < parseFloat(this.min))) { 1187 | if (this.getAttribute('VKI_type') != 'password') 1188 | this.value = this.storeValue; 1189 | } 1190 | }, false); 1191 | } 1192 | if (self.VKI_isMoz) 1193 | elem.addEventListener('blur', function() { this.setAttribute('_scrollTop', this.scrollTop); }, false); 1194 | }; 1195 | 1196 | 1197 | /* ***** Find tagged input & textarea elements ***************** */ 1198 | function VKI_buildKeyboardInputs() { 1199 | let inputElems = [ 1200 | document.getElementsByTagName('input'), 1201 | document.getElementsByTagName('textarea') 1202 | ]; 1203 | for (let x = 0, elem; elem = inputElems[x++];) 1204 | for (let y = 0, ex; ex = elem[y++];) 1205 | if (ex.nodeName == 'TEXTAREA' || ex.type == 'text' || ex.type == 'number' || ex.type == 'password') 1206 | if (ex.classList.contains('keyboardInput')) VKI_attach(ex); 1207 | 1208 | VKI_addListener(document.documentElement, 'click', function(e) { self.VKI_close(); }, false); 1209 | } 1210 | 1211 | 1212 | /* **************************************************************** 1213 | * Common mouse event actions 1214 | * 1215 | */ 1216 | function VKI_mouseEvents(elem) { 1217 | if (elem.nodeName == 'TD') { 1218 | if (!elem.click) elem.click = function() { 1219 | let evt = this.ownerDocument.createEvent('MouseEvents'); 1220 | evt.initMouseEvent('click', true, true, this.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null); 1221 | this.dispatchEvent(evt); 1222 | }; 1223 | elem.VKI_clickless = 0; 1224 | VKI_addListener(elem, 'dblclick', function() { return false; }, false); 1225 | } 1226 | VKI_addListener(elem, 'mouseover', function() { 1227 | if (this.nodeName == 'TD' && self.VKI_clickless) { 1228 | let _self = this; 1229 | clearTimeout(this.VKI_clickless); 1230 | this.VKI_clickless = setTimeout(function() { _self.click(); }, self.VKI_clickless); 1231 | } 1232 | if (self.VKI_isIE) this.classList.add('hover'); 1233 | }, false); 1234 | VKI_addListener(elem, 'mouseout', function() { 1235 | if (this.nodeName == 'TD') clearTimeout(this.VKI_clickless); 1236 | if (self.VKI_isIE) this.classList.remove('hover', 'pressed'); 1237 | }, false); 1238 | VKI_addListener(elem, 'mousedown', function() { 1239 | if (this.nodeName == 'TD') clearTimeout(this.VKI_clickless); 1240 | if (self.VKI_isIE) this.classList.add('pressed'); 1241 | }, false); 1242 | VKI_addListener(elem, 'mouseup', function() { 1243 | if (this.nodeName == 'TD') clearTimeout(this.VKI_clickless); 1244 | if (self.VKI_isIE) this.classList.remove('pressed'); 1245 | }, false); 1246 | } 1247 | 1248 | 1249 | /* ***** Build the keyboard interface ************************** */ 1250 | this.VKI_keyboard = document.createElement('table'); 1251 | this.VKI_keyboard.id = 'keyboardInputMaster'; 1252 | this.VKI_keyboard.dir = 'ltr'; 1253 | this.VKI_keyboard.cellSpacing = '0'; 1254 | this.VKI_keyboard.reflow = function() { 1255 | this.style.width = '50px'; 1256 | let foo = this.offsetWidth; 1257 | this.style.width = ''; 1258 | }; 1259 | VKI_addListener(this.VKI_keyboard, 'click', function(e) { 1260 | e = e || event; 1261 | if (e.stopPropagation) { e.stopPropagation(); } else e.cancelBubble = true; 1262 | return false; 1263 | }, false); 1264 | 1265 | if (!this.VKI_layout[this.VKI_kt]) 1266 | return alert('No keyboard named "' + this.VKI_kt + '"'); 1267 | 1268 | this.VKI_langCode = {}; 1269 | let thead = document.createElement('thead'); 1270 | let thtr = document.createElement('tr'); 1271 | let thth = document.createElement('th'); 1272 | thth.colSpan = '2'; 1273 | 1274 | let kbSelect = document.createElement('div'); 1275 | kbSelect.id = 'keyboardInputSelect'; 1276 | kbSelect.title = this.VKI_i18n['02']; 1277 | VKI_addListener(kbSelect, 'click', function() { 1278 | let ol = this.getElementsByTagName('ol')[0]; 1279 | if (!ol.style.display) { 1280 | ol.style.display = 'block'; 1281 | let li = ol.getElementsByTagName('li'), scr = 0; 1282 | for (let x = 0; x < li.length; x++) { 1283 | if (VKI_kt == li[x].firstChild.nodeValue) { 1284 | li[x].classList.add('selected'); 1285 | scr = li[x].offsetTop - li[x].offsetHeight * 2; 1286 | } else li[x].classList.remove('selected'); 1287 | } setTimeout(function() { ol.scrollTop = scr; }, 0); 1288 | } else ol.style.display = ''; 1289 | }, false); 1290 | kbSelect.appendChild(document.createTextNode(this.VKI_kt)); 1291 | kbSelect.appendChild(document.createTextNode(this.VKI_isIElt8 ? ' \u2193' : ' \u25be')); 1292 | kbSelect.langCount = 0; 1293 | let ol = document.createElement('ol'); 1294 | for (ktype in this.VKI_layout) { 1295 | if (typeof this.VKI_layout[ktype] == 'object') { 1296 | if (!this.VKI_layout[ktype].lang) this.VKI_layout[ktype].lang = []; 1297 | for (let x = 0; x < this.VKI_layout[ktype].lang.length; x++) 1298 | this.VKI_langCode[this.VKI_layout[ktype].lang[x].toLowerCase().replace(/-/g, '_')] = ktype; 1299 | let li = document.createElement('li'); 1300 | li.title = this.VKI_layout[ktype].name; 1301 | VKI_addListener(li, 'click', function(e) { 1302 | e = e || event; 1303 | if (e.stopPropagation) { e.stopPropagation(); } else e.cancelBubble = true; 1304 | this.parentNode.style.display = ''; 1305 | self.VKI_kts = self.VKI_kt = kbSelect.firstChild.nodeValue = this.firstChild.nodeValue; 1306 | self.VKI_buildKeys(); 1307 | self.VKI_position(true); 1308 | }, false); 1309 | VKI_mouseEvents(li); 1310 | li.appendChild(document.createTextNode(ktype)); 1311 | ol.appendChild(li); 1312 | kbSelect.langCount++; 1313 | } 1314 | } kbSelect.appendChild(ol); 1315 | if (kbSelect.langCount > 1) thth.appendChild(kbSelect); 1316 | this.VKI_langCode.index = []; 1317 | for (prop in this.VKI_langCode) 1318 | if (prop != 'index' && typeof this.VKI_langCode[prop] == 'string') 1319 | this.VKI_langCode.index.push(prop); 1320 | this.VKI_langCode.index.sort(); 1321 | this.VKI_langCode.index.reverse(); 1322 | 1323 | if (this.VKI_numberPad) { 1324 | let numtogspan = document.createElement('span'); 1325 | numtogspan.id = 'keyboardInputNumpadToggle'; 1326 | numtogspan.appendChild(document.createTextNode('#')); 1327 | numtogspan.title = this.VKI_i18n['00']; 1328 | VKI_addListener(numtogspan, 'click', function() { 1329 | kbNumpad.style.display = (!kbNumpad.style.display) ? 'none' : ''; 1330 | kbNumpad.previousStyle = kbNumpad.style.display; 1331 | self.VKI_position(true); 1332 | }, false); 1333 | VKI_mouseEvents(numtogspan); 1334 | thth.appendChild(numtogspan); 1335 | } 1336 | 1337 | this.VKI_kbsize = function(e) { 1338 | self.VKI_size = Math.min(5, Math.max(1, self.VKI_size)); 1339 | self.VKI_keyboard.className = self.VKI_keyboard.className.replace(/\bkeyboardInputSize\d\b/, ''); 1340 | if (self.VKI_size != 2) self.VKI_keyboard.classList.add('keyboardInputSize' + self.VKI_size); 1341 | self.VKI_position(true); 1342 | if (self.VKI_isOpera) self.VKI_keyboard.reflow(); 1343 | }; 1344 | if (this.VKI_sizeAdj) { 1345 | let small = document.createElement('small'); 1346 | small.title = this.VKI_i18n['10']; 1347 | VKI_addListener(small, 'click', function() { 1348 | --self.VKI_size; 1349 | self.VKI_kbsize(); 1350 | }, false); 1351 | VKI_mouseEvents(small); 1352 | small.appendChild(document.createTextNode(this.VKI_isIElt8 ? '\u2193' : '\u21d3')); 1353 | thth.appendChild(small); 1354 | let big = document.createElement('big'); 1355 | big.title = this.VKI_i18n['11']; 1356 | VKI_addListener(big, 'click', function() { 1357 | ++self.VKI_size; 1358 | self.VKI_kbsize(); 1359 | }, false); 1360 | VKI_mouseEvents(big); 1361 | big.appendChild(document.createTextNode(this.VKI_isIElt8 ? '\u2191' : '\u21d1')); 1362 | thth.appendChild(big); 1363 | } 1364 | 1365 | let numbkspspan = document.createElement('span'); 1366 | numbkspspan.id = 'keyboardInputNumpadBksp'; 1367 | numbkspspan.appendChild(document.createTextNode('\u21E6')); 1368 | numbkspspan.title = this.VKI_i18n['12']; 1369 | VKI_addListener(numbkspspan, 'click', function() { self.VKI_backspace(); }, false); 1370 | VKI_mouseEvents(numbkspspan); 1371 | thth.appendChild(numbkspspan); 1372 | 1373 | let clrspan = document.createElement('span'); 1374 | clrspan.appendChild(document.createTextNode(this.VKI_i18n['07'])); 1375 | clrspan.title = this.VKI_i18n['08']; 1376 | VKI_addListener(clrspan, 'click', function() { 1377 | self.VKI_target.value = ''; 1378 | self.VKI_target.focus(); 1379 | return false; 1380 | }, false); 1381 | VKI_mouseEvents(clrspan); 1382 | thth.appendChild(clrspan); 1383 | 1384 | let strong = document.createElement('strong'); 1385 | strong.appendChild(document.createTextNode('X')); 1386 | strong.title = this.VKI_i18n['06']; 1387 | VKI_addListener(strong, 'click', function() { self.VKI_close(); }, false); 1388 | VKI_mouseEvents(strong); 1389 | thth.appendChild(strong); 1390 | 1391 | thtr.appendChild(thth); 1392 | thead.appendChild(thtr); 1393 | this.VKI_keyboard.appendChild(thead); 1394 | 1395 | let tbody = document.createElement('tbody'); 1396 | let tr = document.createElement('tr'); 1397 | let td = document.createElement('td'); 1398 | td.id = 'keyboardInputKeyboard'; 1399 | let div = document.createElement('div'); 1400 | 1401 | if (this.VKI_deadBox) { 1402 | let label = document.createElement('label'); 1403 | let checkbox = document.createElement('input'); 1404 | checkbox.type = 'checkbox'; 1405 | checkbox.title = this.VKI_i18n['03'] + ': ' + ((this.VKI_deadkeysOn) ? this.VKI_i18n['04'] : this.VKI_i18n['05']); 1406 | checkbox.defaultChecked = this.VKI_deadkeysOn; 1407 | VKI_addListener(checkbox, 'click', function() { 1408 | this.title = self.VKI_i18n['03'] + ': ' + ((this.checked) ? self.VKI_i18n['04'] : self.VKI_i18n['05']); 1409 | self.VKI_modify(''); 1410 | return true; 1411 | }, false); 1412 | label.appendChild(checkbox); 1413 | checkbox.checked = this.VKI_deadkeysOn; 1414 | div.appendChild(label); 1415 | this.VKI_deadkeysOn = checkbox; 1416 | } else this.VKI_deadkeysOn.checked = this.VKI_deadkeysOn; 1417 | 1418 | if (this.VKI_showVersion) { 1419 | let vr = document.createElement('var'); 1420 | vr.title = this.VKI_i18n['09'] + ' ' + this.VKI_version; 1421 | vr.appendChild(document.createTextNode('v' + this.VKI_version)); 1422 | div.appendChild(vr); 1423 | } td.appendChild(div); 1424 | tr.appendChild(td); 1425 | 1426 | let kbNumpad = document.createElement('td'); 1427 | kbNumpad.id = 'keyboardInputNumpad'; 1428 | if (!this.VKI_numberPadOn) { 1429 | kbNumpad.style.display = 'none'; 1430 | kbNumpad.previousStyle = 'none'; 1431 | } else kbNumpad.previousStyle = ''; 1432 | let ntable = document.createElement('table'); 1433 | ntable.cellSpacing = '0'; 1434 | let ntbody = document.createElement('tbody'); 1435 | for (let x = 0; x < this.VKI_numpad.length; x++) { 1436 | let ntr = document.createElement('tr'); 1437 | for (let y = 0; y < this.VKI_numpad[x].length; y++) { 1438 | let ntd = document.createElement('td'); 1439 | VKI_addListener(ntd, 'click', VKI_keyClick, false); 1440 | VKI_mouseEvents(ntd); 1441 | if (this.VKI_numpad[x][y][0].match(/\d/)) ntd.classList.add('digit'); 1442 | if (this.VKI_numpad[x][y][0] == '.') ntd.classList.add('decimal'); 1443 | if (this.VKI_numpad[x][y][0] == '-') ntd.classList.add('negative'); 1444 | ntd.appendChild(document.createTextNode(this.VKI_numpad[x][y][0])); 1445 | ntr.appendChild(ntd); 1446 | } ntbody.appendChild(ntr); 1447 | } ntable.appendChild(ntbody); 1448 | kbNumpad.appendChild(ntable); 1449 | tr.appendChild(kbNumpad); 1450 | tbody.appendChild(tr); 1451 | this.VKI_keyboard.appendChild(tbody); 1452 | 1453 | if (this.VKI_isIE6) { 1454 | this.VKI_iframe = document.createElement('iframe'); 1455 | this.VKI_iframe.style.position = 'absolute'; 1456 | this.VKI_iframe.style.border = '0 none'; 1457 | this.VKI_iframe.style.filter = 'mask()'; 1458 | this.VKI_iframe.style.zIndex = '999999'; 1459 | this.VKI_iframe.src = this.VKI_imageURI; 1460 | } 1461 | 1462 | 1463 | /* **************************************************************** 1464 | * Private table cell attachment function for generic characters 1465 | * 1466 | */ 1467 | function VKI_keyClick() { 1468 | let done = false, character = '\xa0'; 1469 | if (this.firstChild.nodeName.toLowerCase() != 'small') { 1470 | if ((character = this.firstChild.nodeValue) == '\xa0') return false; 1471 | } else character = this.firstChild.getAttribute('char'); 1472 | if (self.VKI_deadkeysOn.checked && self.VKI_dead) { 1473 | if (self.VKI_dead != character) { 1474 | if (character != ' ') { 1475 | if (self.VKI_deadkey[self.VKI_dead][character]) { 1476 | self.VKI_insert(self.VKI_deadkey[self.VKI_dead][character]); 1477 | done = true; 1478 | } 1479 | } else { 1480 | self.VKI_insert(self.VKI_dead); 1481 | done = true; 1482 | } 1483 | } else done = true; 1484 | } self.VKI_dead = false; 1485 | 1486 | if (!done) { 1487 | if (self.VKI_deadkeysOn.checked && self.VKI_deadkey[character]) { 1488 | self.VKI_dead = character; 1489 | this.classList.add('dead'); 1490 | if (self.VKI_shift) self.VKI_modify('Shift'); 1491 | if (self.VKI_altgr) self.VKI_modify('AltGr'); 1492 | } else self.VKI_insert(character); 1493 | } self.VKI_modify(''); 1494 | return false; 1495 | } 1496 | 1497 | 1498 | /* **************************************************************** 1499 | * Build or rebuild the keyboard keys 1500 | * 1501 | */ 1502 | this.VKI_buildKeys = function() { 1503 | this.VKI_shift = this.VKI_shiftlock = this.VKI_altgr = this.VKI_altgrlock = this.VKI_dead = false; 1504 | let container = this.VKI_keyboard.tBodies[0].getElementsByTagName('div')[0]; 1505 | let tables = container.getElementsByTagName('table'); 1506 | for (let x = tables.length - 1; x >= 0; x--) container.removeChild(tables[x]); 1507 | 1508 | let hasDeadKey = false; 1509 | for (let x = 0, lyt; lyt = this.VKI_layout[this.VKI_kt].keys[x++];) { 1510 | let table = document.createElement('table'); 1511 | table.cellSpacing = '0'; 1512 | if (lyt.length <= this.VKI_keyCenter) table.classList.add('keyboardInputCenter'); 1513 | let tbody = document.createElement('tbody'); 1514 | let tr = document.createElement('tr'); 1515 | for (let y = 0, lkey; lkey = lyt[y++];) { 1516 | let td = document.createElement('td'); 1517 | if (this.VKI_symbol[lkey[0]]) { 1518 | let text = this.VKI_symbol[lkey[0]].split("\n"); 1519 | let small = document.createElement('small'); 1520 | small.setAttribute('char', lkey[0]); 1521 | for (let z = 0; z < text.length; z++) { 1522 | if (z) small.appendChild(document.createElement('br')); 1523 | small.appendChild(document.createTextNode(text[z])); 1524 | } td.appendChild(small); 1525 | } else td.appendChild(document.createTextNode(lkey[0] || '\xa0')); 1526 | 1527 | if (this.VKI_deadkeysOn.checked) 1528 | for (key in this.VKI_deadkey) 1529 | if (key === lkey[0]) { td.classList.add('deadkey'); break; } 1530 | if (lyt.length > this.VKI_keyCenter && y == lyt.length) td.classList.add('last'); 1531 | if (lkey[0] == ' ' || lkey[1] == ' ') td.classList.add('space'); 1532 | 1533 | switch (lkey[1]) { 1534 | case 'Caps': case 'Shift': 1535 | case 'Alt': case 'AltGr': case 'AltLk': 1536 | VKI_addListener(td, 'click', (function(type) { return function() { self.VKI_modify(type); return false; }})(lkey[1]), false); 1537 | break; 1538 | case 'Tab': 1539 | VKI_addListener(td, 'click', function() { 1540 | if (self.VKI_activeTab) { 1541 | if (self.VKI_target.form) { 1542 | let target = self.VKI_target, elems = target.form.elements; 1543 | self.VKI_close(); 1544 | for (let z = 0, me = false, j = -1; z < elems.length; z++) { 1545 | if (j == -1 && elems[z].getAttribute('VKI_attached')) j = z; 1546 | if (me) { 1547 | if (self.VKI_activeTab == 1 && elems[z]) break; 1548 | if (elems[z].getAttribute('VKI_attached')) break; 1549 | } else if (elems[z] == target) me = true; 1550 | } if (z == elems.length) z = Math.max(j, 0); 1551 | if (elems[z].getAttribute('VKI_attached')) { 1552 | self.VKI_show(elems[z]); 1553 | } else elems[z].focus(); 1554 | } else self.VKI_target.focus(); 1555 | } else self.VKI_insert("\t"); 1556 | return false; 1557 | }, false); 1558 | break; 1559 | case 'Bksp': 1560 | td.title = this.VKI_i18n['12']; 1561 | VKI_addListener(td, 'click', function() { self.VKI_backspace(); }, false); 1562 | break; 1563 | case 'Enter': 1564 | VKI_addListener(td, 'click', function() { 1565 | if (self.VKI_target.nodeName != 'TEXTAREA') { 1566 | if (self.VKI_enterSubmit && self.VKI_target.form) { 1567 | for (let z = 0, subm = false; z < self.VKI_target.form.elements.length; z++) 1568 | if (self.VKI_target.form.elements[z].type == 'submit') subm = true; 1569 | if (!subm) self.VKI_target.form.submit(); 1570 | } 1571 | self.VKI_close(); 1572 | } else self.VKI_insert("\n"); 1573 | return true; 1574 | }, false); 1575 | break; 1576 | default: 1577 | VKI_addListener(td, 'click', VKI_keyClick, false); 1578 | 1579 | } VKI_mouseEvents(td); 1580 | tr.appendChild(td); 1581 | for (let z = 0; z < 4; z++) 1582 | if (this.VKI_deadkey[lkey[z] = lkey[z] || '']) hasDeadKey = true; 1583 | } tbody.appendChild(tr); 1584 | table.appendChild(tbody); 1585 | container.appendChild(table); 1586 | } 1587 | if (this.VKI_deadBox) 1588 | this.VKI_deadkeysOn.style.display = (hasDeadKey) ? 'inline' : 'none'; 1589 | if (this.VKI_isIE6) { 1590 | this.VKI_iframe.style.width = this.VKI_keyboard.offsetWidth + 'px'; 1591 | this.VKI_iframe.style.height = this.VKI_keyboard.offsetHeight + 'px'; 1592 | } 1593 | }; 1594 | 1595 | this.VKI_buildKeys(); 1596 | VKI_addListener(this.VKI_keyboard, 'selectstart', function() { return false; }, false); 1597 | this.VKI_keyboard.unselectable = 'on'; 1598 | if (this.VKI_isOpera) 1599 | VKI_addListener(this.VKI_keyboard, 'mousedown', function() { return false; }, false); 1600 | 1601 | 1602 | /* **************************************************************** 1603 | * Controls modifier keys 1604 | * 1605 | */ 1606 | this.VKI_modify = function(type) { 1607 | switch (type) { 1608 | case 'Alt': 1609 | case 'AltGr': this.VKI_altgr = !this.VKI_altgr; break; 1610 | case 'AltLk': this.VKI_altgr = 0; this.VKI_altgrlock = !this.VKI_altgrlock; break; 1611 | case 'Caps': this.VKI_shift = 0; this.VKI_shiftlock = !this.VKI_shiftlock; break; 1612 | case 'Shift': this.VKI_shift = !this.VKI_shift; break; 1613 | } 1614 | let vchar = 0; 1615 | if (!this.VKI_shift != !this.VKI_shiftlock) vchar += 1; 1616 | if (!this.VKI_altgr != !this.VKI_altgrlock) vchar += 2; 1617 | 1618 | let tables = this.VKI_keyboard.tBodies[0].getElementsByTagName('div')[0].getElementsByTagName('table'); 1619 | for (let x = 0; x < tables.length; x++) { 1620 | let tds = tables[x].getElementsByTagName('td'); 1621 | for (let y = 0; y < tds.length; y++) { 1622 | tds[y].className = ''; 1623 | let lkey = this.VKI_layout[this.VKI_kt].keys[x][y]; 1624 | 1625 | switch (lkey[1]) { 1626 | case 'Alt': 1627 | case 'AltGr': 1628 | if (this.VKI_altgr) tds[y].classList.add('pressed'); 1629 | break; 1630 | case 'AltLk': 1631 | if (this.VKI_altgrlock) tds[y].classList.add('pressed'); 1632 | break; 1633 | case 'Shift': 1634 | if (this.VKI_shift) tds[y].classList.add('pressed'); 1635 | break; 1636 | case 'Caps': 1637 | if (this.VKI_shiftlock) tds[y].classList.add('pressed'); 1638 | break; 1639 | case 'Tab': case 'Enter': case 'Bksp': break; 1640 | default: 1641 | if (type) { 1642 | tds[y].removeChild(tds[y].firstChild); 1643 | if (this.VKI_symbol[lkey[vchar]]) { 1644 | let text = this.VKI_symbol[lkey[vchar]].split("\n"); 1645 | let small = document.createElement('small'); 1646 | small.setAttribute('char', lkey[vchar]); 1647 | for (let z = 0; z < text.length; z++) { 1648 | if (z) small.appendChild(document.createElement('br')); 1649 | small.appendChild(document.createTextNode(text[z])); 1650 | } tds[y].appendChild(small); 1651 | } else tds[y].appendChild(document.createTextNode(lkey[vchar] || '\xa0')); 1652 | } 1653 | if (this.VKI_deadkeysOn.checked) { 1654 | let character = tds[y].firstChild.nodeValue || tds[y].firstChild.className; 1655 | if (this.VKI_dead) { 1656 | if (character == this.VKI_dead) tds[y].classList.add('pressed'); 1657 | if (this.VKI_deadkey[this.VKI_dead][character]) tds[y].classList.add('target'); 1658 | } 1659 | if (this.VKI_deadkey[character]) tds[y].classList.add('deadkey'); 1660 | } 1661 | } 1662 | 1663 | if (y == tds.length - 1 && tds.length > this.VKI_keyCenter) tds[y].classList.add('last'); 1664 | if (lkey[0] == ' ' || lkey[1] == ' ') tds[y].classList.add('space'); 1665 | } 1666 | } 1667 | }; 1668 | 1669 | 1670 | /* **************************************************************** 1671 | * Insert text at the cursor 1672 | * 1673 | */ 1674 | this.VKI_insert = function(text) { 1675 | this.VKI_target.dispatchEvent(new Event('beforeinput')); 1676 | this.VKI_target.focus(); 1677 | if (this.VKI_target.maxLength) this.VKI_target.maxlength = this.VKI_target.maxLength; 1678 | if (typeof this.VKI_target.maxlength == 'undefined' || 1679 | this.VKI_target.maxlength < 0 || 1680 | this.VKI_target.value.length < this.VKI_target.maxlength) { 1681 | if (this.VKI_target.setSelectionRange && !this.VKI_target.readOnly && !this.VKI_isIE) { 1682 | let rng = [this.VKI_target.selectionStart, this.VKI_target.selectionEnd]; 1683 | this.VKI_target.value = this.VKI_target.value.substr(0, rng[0]) + text + this.VKI_target.value.substr(rng[1]); 1684 | if (text == "\n" && this.VKI_isOpera) rng[0]++; 1685 | this.VKI_target.setSelectionRange(rng[0] + text.length, rng[0] + text.length); 1686 | } else if (this.VKI_target.createTextRange && !this.VKI_target.readOnly) { 1687 | try { 1688 | this.VKI_target.range.select(); 1689 | } catch(e) { this.VKI_target.range = document.selection.createRange(); } 1690 | this.VKI_target.range.text = text; 1691 | this.VKI_target.range.collapse(true); 1692 | this.VKI_target.range.select(); 1693 | } else this.VKI_target.value += text; 1694 | if (this.VKI_shift) this.VKI_modify('Shift'); 1695 | if (this.VKI_altgr) this.VKI_modify('AltGr'); 1696 | this.VKI_target.dispatchEvent(new Event('input')); 1697 | this.VKI_target.focus(); 1698 | } else if (this.VKI_target.createTextRange && this.VKI_target.range) 1699 | this.VKI_target.range.select(); 1700 | }; 1701 | 1702 | 1703 | /* **************************************************************** 1704 | * Delete a character behind the cursor 1705 | * 1706 | */ 1707 | this.VKI_backspace = function() { 1708 | self.VKI_target.focus(); 1709 | if (self.VKI_target.setSelectionRange && !self.VKI_target.readOnly) { 1710 | let rng = [self.VKI_target.selectionStart, self.VKI_target.selectionEnd]; 1711 | if (rng[0] < rng[1]) rng[0]++; 1712 | self.VKI_target.value = self.VKI_target.value.substr(0, rng[0] - 1) + self.VKI_target.value.substr(rng[1]); 1713 | self.VKI_target.setSelectionRange(rng[0] - 1, rng[0] - 1); 1714 | } else if (self.VKI_target.createTextRange && !self.VKI_target.readOnly) { 1715 | try { 1716 | self.VKI_target.range.select(); 1717 | } catch(e) { self.VKI_target.range = document.selection.createRange(); } 1718 | if (!self.VKI_target.range.text.length) self.VKI_target.range.moveStart('character', -1); 1719 | self.VKI_target.range.text = ''; 1720 | } else self.VKI_target.value = self.VKI_target.value.substr(0, self.VKI_target.value.length - 1); 1721 | if (self.VKI_shift) self.VKI_modify('Shift'); 1722 | if (self.VKI_altgr) self.VKI_modify('AltGr'); 1723 | self.VKI_target.focus(); 1724 | return true; 1725 | }; 1726 | 1727 | 1728 | /* **************************************************************** 1729 | * Show the keyboard interface 1730 | * 1731 | */ 1732 | this.VKI_show = function(elem) { 1733 | if (!this.VKI_target) { 1734 | this.VKI_target = elem; 1735 | if (this.VKI_langAdapt && this.VKI_target.lang) { 1736 | let chg = false, sub = [], lang = this.VKI_target.lang.toLowerCase().replace(/-/g, '_'); 1737 | for (let x = 0; !chg && x < this.VKI_langCode.index.length; x++) 1738 | if (lang.indexOf(this.VKI_langCode.index[x]) == 0) 1739 | chg = kbSelect.firstChild.nodeValue = this.VKI_kt = this.VKI_langCode[this.VKI_langCode.index[x]]; 1740 | if (chg) this.VKI_buildKeys(); 1741 | } 1742 | if (this.VKI_isIE) { 1743 | if (!this.VKI_target.range) { 1744 | this.VKI_target.range = this.VKI_target.createTextRange(); 1745 | this.VKI_target.range.moveStart('character', this.VKI_target.value.length); 1746 | } this.VKI_target.range.select(); 1747 | } 1748 | try { this.VKI_keyboard.parentNode.removeChild(this.VKI_keyboard); } catch (e) {} 1749 | if (this.VKI_target.getAttribute('VKI_type') == 'password') { 1750 | this.VKI_target.storeReadOnly = this.VKI_target.readOnly; 1751 | this.VKI_target.readOnly = 'readonly'; 1752 | if (this.VKI_clearPasswords) this.VKI_target.value = ''; 1753 | } 1754 | 1755 | if (this.VKI_target.getAttribute('VKI_numpadInput') == 'true') { 1756 | this.VKI_keyboard.classList.add('numpadOnly'); 1757 | kbNumpad.classList.add('showNegative', 'showDecimal'); 1758 | kbNumpad.previousStyle = kbNumpad.style.display; 1759 | kbNumpad.style.display = ''; 1760 | let noNeg = false; 1761 | this.VKI_target.pattern = '^[+-]?[0-9]*\\.?[0-9]*$'; 1762 | if (this.VKI_target.min && parseFloat(this.VKI_target.min) >= 0) { 1763 | this.VKI_target.pattern = '^\\+?[0-9]*\\.?[0-9]*$'; 1764 | kbNumpad.classList.remove('showNegative'); 1765 | noNeg = true; 1766 | } 1767 | if (this.VKI_target.step && !parseFloat(this.VKI_target.step).toString().match(/\./)) { 1768 | this.VKI_target.pattern = (noNeg) ? '^\\+?[0-9]*$' : '^[+-]?[0-9]*$'; 1769 | kbNumpad.classList.remove('showDecimal'); 1770 | } 1771 | } else { 1772 | this.VKI_keyboard.classList.remove('numpadOnly'); 1773 | kbNumpad.style.display = kbNumpad.previousStyle; 1774 | } 1775 | 1776 | let elemStep = this.VKI_target; 1777 | this.VKI_target.keyboardPosition = 'absolute'; 1778 | do { 1779 | if (VKI_getStyle(elemStep, 'position') == 'fixed') { 1780 | this.VKI_target.keyboardPosition = 'fixed'; 1781 | break; 1782 | } 1783 | } while (elemStep = elemStep.offsetParent); 1784 | 1785 | if (this.VKI_isIE6) document.body.appendChild(this.VKI_iframe); 1786 | document.body.appendChild(this.VKI_keyboard); 1787 | this.VKI_keyboard.style.position = this.VKI_target.keyboardPosition; 1788 | if (this.VKI_isOpera) this.VKI_keyboard.reflow(); 1789 | 1790 | this.VKI_position(true); 1791 | if (self.VKI_isMoz || self.VKI_isWebKit) this.VKI_position(true); 1792 | this.VKI_target.blur(); 1793 | this.VKI_target.focus(); 1794 | } else this.VKI_close(); 1795 | }; 1796 | 1797 | 1798 | /* **************************************************************** 1799 | * Position the keyboard 1800 | * 1801 | */ 1802 | this.VKI_position = function(force) { 1803 | if (self.VKI_target) { 1804 | let kPos = VKI_findPos(self.VKI_keyboard), wDim = VKI_innerDimensions(), sDis = VKI_scrollDist(); 1805 | let place = false, fudge = self.VKI_target.offsetHeight + 3; 1806 | if (force !== true) { 1807 | if (kPos[1] + self.VKI_keyboard.offsetHeight - sDis[1] - wDim[1] > 0) { 1808 | place = true; 1809 | fudge = -self.VKI_keyboard.offsetHeight - 3; 1810 | } else if (kPos[1] - sDis[1] < 0) place = true; 1811 | } 1812 | if (place || force === true) { 1813 | let iPos = VKI_findPos(self.VKI_target), scr = self.VKI_target; 1814 | while (scr = scr.parentNode) { 1815 | if (scr == document.body) break; 1816 | if (scr.scrollHeight > scr.offsetHeight || scr.scrollWidth > scr.offsetWidth) { 1817 | if (!scr.getAttribute('VKI_scrollListener')) { 1818 | scr.setAttribute('VKI_scrollListener', true); 1819 | VKI_addListener(scr, 'scroll', function() { self.VKI_position(true); }, false); 1820 | } // Check if the input is in view 1821 | let pPos = VKI_findPos(scr), oTop = iPos[1] - pPos[1], oLeft = iPos[0] - pPos[0]; 1822 | let top = oTop + self.VKI_target.offsetHeight; 1823 | let left = oLeft + self.VKI_target.offsetWidth; 1824 | let bottom = scr.offsetHeight - oTop - self.VKI_target.offsetHeight; 1825 | let right = scr.offsetWidth - oLeft - self.VKI_target.offsetWidth; 1826 | self.VKI_keyboard.style.display = (top < 0 || left < 0 || bottom < 0 || right < 0) ? 'none' : ''; 1827 | if (self.VKI_isIE6) self.VKI_iframe.style.display = (top < 0 || left < 0 || bottom < 0 || right < 0) ? 'none' : ''; 1828 | } 1829 | } 1830 | self.VKI_keyboard.style.top = iPos[1] + fudge + 'px'; 1831 | self.VKI_keyboard.style.left = Math.max(10, Math.min(wDim[0] - self.VKI_keyboard.offsetWidth - 25, iPos[0])) + 'px'; 1832 | if (self.VKI_isIE6) { 1833 | self.VKI_iframe.style.width = self.VKI_keyboard.offsetWidth + 'px'; 1834 | self.VKI_iframe.style.height = self.VKI_keyboard.offsetHeight + 'px'; 1835 | self.VKI_iframe.style.top = self.VKI_keyboard.style.top; 1836 | self.VKI_iframe.style.left = self.VKI_keyboard.style.left; 1837 | } 1838 | } 1839 | if (force === true) self.VKI_position(); 1840 | } 1841 | }; 1842 | 1843 | 1844 | /* **************************************************************** 1845 | * Close the keyboard interface 1846 | * 1847 | */ 1848 | this.VKI_close = VKI_close = function() { 1849 | if (this.VKI_target) { 1850 | if (this.VKI_target.getAttribute('VKI_type') == 'password') 1851 | this.VKI_target.readOnly = this.VKI_target.storeReadOnly; 1852 | if (this.VKI_target.getAttribute('VKI_numpadInput') == 'true') 1853 | this.VKI_target.pattern = '.*'; 1854 | try { 1855 | this.VKI_keyboard.parentNode.removeChild(this.VKI_keyboard); 1856 | if (this.VKI_isIE6) this.VKI_iframe.parentNode.removeChild(this.VKI_iframe); 1857 | } catch (e) {} 1858 | if (this.VKI_kt != this.VKI_kts) { 1859 | kbSelect.firstChild.nodeValue = this.VKI_kt = this.VKI_kts; 1860 | this.VKI_buildKeys(); 1861 | } kbSelect.getElementsByTagName('ol')[0].style.display = '';; 1862 | this.VKI_target.focus(); 1863 | if (this.VKI_isIE) { 1864 | setTimeout(function() { self.VKI_target = false; }, 0); 1865 | } else this.VKI_target = false; 1866 | } 1867 | }; 1868 | 1869 | 1870 | /* ***** Private functions *************************************** */ 1871 | function VKI_addListener(elem, type, func, cap) { 1872 | if (elem.addEventListener) { 1873 | elem.addEventListener(type, function(e) { func.call(elem, e); }, cap); 1874 | } else if (elem.attachEvent) 1875 | elem.attachEvent('on' + type, function() { func.call(elem); }); 1876 | } 1877 | 1878 | function VKI_findPos(obj) { 1879 | let curleft = curtop = 0, scr = obj; 1880 | while ((scr = scr.parentNode) && scr != document.body) { 1881 | curleft -= scr.scrollLeft || 0; 1882 | curtop -= scr.scrollTop || 0; 1883 | } 1884 | do { 1885 | curleft += obj.offsetLeft; 1886 | curtop += obj.offsetTop; 1887 | } while (obj = obj.offsetParent); 1888 | return [curleft, curtop]; 1889 | } 1890 | 1891 | function VKI_innerDimensions() { 1892 | if (self.innerHeight) { 1893 | return [self.innerWidth, self.innerHeight]; 1894 | } else if (document.documentElement && document.documentElement.clientHeight) { 1895 | return [document.documentElement.clientWidth, document.documentElement.clientHeight]; 1896 | } else if (document.body) 1897 | return [document.body.clientWidth, document.body.clientHeight]; 1898 | return [0, 0]; 1899 | } 1900 | 1901 | function VKI_scrollDist() { 1902 | let html = document.getElementsByTagName('html')[0]; 1903 | if (html.scrollTop && document.documentElement.scrollTop) { 1904 | return [html.scrollLeft, html.scrollTop]; 1905 | } else if (html.scrollTop || document.documentElement.scrollTop) { 1906 | return [html.scrollLeft + document.documentElement.scrollLeft, html.scrollTop + document.documentElement.scrollTop]; 1907 | } else if (document.body.scrollTop) 1908 | return [document.body.scrollLeft, document.body.scrollTop]; 1909 | return [0, 0]; 1910 | } 1911 | 1912 | function VKI_getStyle(obj, styleProp) { 1913 | let y; 1914 | if (obj.currentStyle) { 1915 | y = obj.currentStyle[styleProp]; 1916 | } else if (window.getComputedStyle) 1917 | y = window.getComputedStyle(obj, null)[styleProp]; 1918 | return y; 1919 | } 1920 | 1921 | VKI_addListener(window, 'resize', this.VKI_position, false); 1922 | VKI_addListener(window, 'scroll', this.VKI_position, false); 1923 | this.VKI_kbsize(); 1924 | VKI_addListener(window, 'load', VKI_buildKeyboardInputs, false); 1925 | // VKI_addListener(window, 'load', function() { 1926 | // setTimeout(VKI_buildKeyboardInputs, 5); 1927 | // }, false); 1928 | })(); --------------------------------------------------------------------------------