Upgrade eslint-plugin-compat to 3.8.0
[phpmyadmin.git] / js / keyhandler.js
blob9ef352fb003f9db97b89fde3ccb02ebc484942d5
2 // global var that holds: 0- if ctrl key is not pressed 1- if ctrl key is pressed
3 var ctrlKeyHistory = 0;
5 /**
6   * Allows moving around inputs/select by Ctrl+arrows
7   *
8   * @param object   event data
9   */
10 function onKeyDownArrowsHandler (event) {
11     var e = event || window.event;
13     var o = (e.srcElement || e.target);
14     if (!o) {
15         return;
16     }
17     if (o.tagName !== 'TEXTAREA' && o.tagName !== 'INPUT' && o.tagName !== 'SELECT') {
18         return;
19     }
20     if ((e.which !== 17) && (e.which !== 37) && (e.which !== 38) && (e.which !== 39) && (e.which !== 40)) {
21         return;
22     }
23     if (!o.id) {
24         return;
25     }
27     if (e.type === 'keyup') {
28         if (e.which === 17) {
29             ctrlKeyHistory = 0;
30         }
31         return;
32     } else if (e.type === 'keydown') {
33         if (e.which === 17) {
34             ctrlKeyHistory = 1;
35         }
36     }
38     if (ctrlKeyHistory !== 1) {
39         return;
40     }
42     e.preventDefault();
44     var pos = o.id.split('_');
45     if (pos[0] !== 'field' || typeof pos[2] === 'undefined') {
46         return;
47     }
49     var x = pos[2];
50     var y = pos[1];
52     switch (e.keyCode) {
53     case 38:
54         // up
55         y--;
56         break;
57     case 40:
58         // down
59         y++;
60         break;
61     case 37:
62         // left
63         x--;
64         break;
65     case 39:
66         // right
67         x++;
68         break;
69     default:
70         return;
71     }
73     // eslint-disable-next-line compat/compat
74     var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox/') > -1;
76     var id = 'field_' + y + '_' + x;
78     var nO = document.getElementById(id);
79     if (! nO) {
80         id = 'field_' + y + '_' + x + '_0';
81         nO = document.getElementById(id);
82     }
84     // skip non existent fields
85     if (! nO) {
86         return;
87     }
89     // for firefox select tag
90     var lvalue = o.selectedIndex;
91     var nOvalue = nO.selectedIndex;
93     nO.focus();
95     if (isFirefox) {
96         var ffcheck = 0;
97         var ffversion;
98         for (ffversion = 3 ; ffversion < 25 ; ffversion++) {
99             var isFirefoxV24 = navigator.userAgent.toLowerCase().indexOf('firefox/' + ffversion) > -1;
100             if (isFirefoxV24) {
101                 ffcheck = 1;
102                 break;
103             }
104         }
105         if (ffcheck === 1) {
106             if (e.which === 38 || e.which === 37) {
107                 nOvalue++;
108             } else if (e.which === 40 || e.which === 39) {
109                 nOvalue--;
110             }
111             nO.selectedIndex = nOvalue;
112         } else {
113             if (e.which === 38 || e.which === 37) {
114                 lvalue++;
115             } else if (e.which === 40 || e.which === 39) {
116                 lvalue--;
117             }
118             o.selectedIndex = lvalue;
119         }
120     }
122     if (nO.tagName !== 'SELECT') {
123         nO.select();
124     }
125     e.returnValue = false;
128 AJAX.registerTeardown('keyhandler.js', function () {
129     $(document).off('keydown keyup', '#table_columns');
130     $(document).off('keydown keyup', 'table.insertRowTable');
133 AJAX.registerOnload('keyhandler.js', function () {
134     $(document).on('keydown keyup', '#table_columns', function (event) {
135         onKeyDownArrowsHandler(event.originalEvent);
136     });
137     $(document).on('keydown keyup', 'table.insertRowTable', function (event) {
138         onKeyDownArrowsHandler(event.originalEvent);
139     });