source: trunk/expressoMail1_2/js/shortcut.js @ 631

Revision 631, 13.4 KB checked in by niltonneto, 15 years ago (diff)

Correção referente ao scroll da lista de mensagens, através das teclas de atalho, conforme
preferencia de altura de linha, do usuário.

  • Property svn:eol-style set to native
Line 
1/**
2 * http://www.openjs.com/scripts/events/keyboard_shortcuts/
3 * Version : 2.01.A
4 * By Binny V A
5 * License : BSD
6 */
7shortcut = {
8        'all_shortcuts':{},//All the shortcuts are stored in this array
9        'add': function(shortcut_combination,callback,opt) {
10                //Provide a set of default options
11                var default_options = {
12                        'type':'keydown',
13                        'propagate':false,
14                        'disable_in_input':false,
15                        'target':document,
16                        'keycode':false
17                }
18                if(!opt) opt = default_options;
19                else {
20                        for(var dfo in default_options) {
21                                if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
22                        }
23                }
24
25                var ele = opt.target
26                if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
27                var ths = this;
28                shortcut_combination = shortcut_combination.toLowerCase();
29
30                //The function to be called at keypress
31                var func = function(e) {
32                        e = e || window.event;
33                       
34                        if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
35                                var element;
36                                if(e.target) element=e.target;
37                                else if(e.srcElement) element=e.srcElement;
38                                if(element.nodeType==3) element=element.parentNode;
39
40                                if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
41                        }
42       
43                        //Find Which key is pressed
44                        if (e.keyCode) code = e.keyCode;
45                        else if (e.which) code = e.which;
46                        var character = String.fromCharCode(code).toLowerCase();
47                       
48                        if(code == 188) character=","; //If the user presses , when the type is onkeydown
49                        if(code == 190) character="."; //If the user presses , when the type is onkeydown
50       
51                        var keys = shortcut_combination.split("+");
52                        //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
53                        var kp = 0;
54                       
55                        //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
56                        var shift_nums = {
57                                "`":"~",
58                                "1":"!",
59                                "2":"@",
60                                "3":"#",
61                                "4":"$",
62                                "5":"%",
63                                "6":"^",
64                                "7":"&",
65                                "8":"*",
66                                "9":"(",
67                                "0":")",
68                                "-":"_",
69                                "=":"+",
70                                ";":":",
71                                "'":"\"",
72                                ",":"<",
73                                ".":">",
74                                "/":"?",
75                                "\\":"|"
76                        }
77                        //Special Keys - and their codes
78                        var special_keys = {
79                                'esc':27,
80                                'escape':27,
81                                'tab':9,
82                                'space':32,
83                                'return':13,
84                                'enter':13,
85                                'backspace':8,
86       
87                                'scrolllock':145,
88                                'scroll_lock':145,
89                                'scroll':145,
90                                'capslock':20,
91                                'caps_lock':20,
92                                'caps':20,
93                                'numlock':144,
94                                'num_lock':144,
95                                'num':144,
96                               
97                                'pause':19,
98                                'break':19,
99                               
100                                'insert':45,
101                                'home':36,
102                                'delete':46,
103                                'end':35,
104                               
105                                'pageup':33,
106                                'page_up':33,
107                                'pu':33,
108       
109                                'pagedown':34,
110                                'page_down':34,
111                                'pd':34,
112       
113                                'left':37,
114                                'up':38,
115                                'right':39,
116                                'down':40,
117       
118                                'f1':112,
119                                'f2':113,
120                                'f3':114,
121                                'f4':115,
122                                'f5':116,
123                                'f6':117,
124                                'f7':118,
125                                'f8':119,
126                                'f9':120,
127                                'f10':121,
128                                'f11':122,
129                                'f12':123
130                        }
131       
132                        var modifiers = {
133                                shift: { wanted:false, pressed:false},
134                                ctrl : { wanted:false, pressed:false},
135                                alt  : { wanted:false, pressed:false},
136                                meta : { wanted:false, pressed:false}   //Meta is Mac specific
137                        };
138                       
139                        if(e.ctrlKey)   modifiers.ctrl.pressed = true;
140                        if(e.shiftKey)  modifiers.shift.pressed = true;
141                        if(e.altKey)    modifiers.alt.pressed = true;
142                        if(e.metaKey)   modifiers.meta.pressed = true;
143                       
144                        for(var i=0; k=keys[i],i<keys.length; i++) {
145                                //Modifiers
146                                if(k == 'ctrl' || k == 'control') {
147                                        kp++;
148                                        modifiers.ctrl.wanted = true;
149
150                                } else if(k == 'shift') {
151                                        kp++;
152                                        modifiers.shift.wanted = true;
153
154                                } else if(k == 'alt') {
155                                        kp++;
156                                        modifiers.alt.wanted = true;
157                                } else if(k == 'meta') {
158                                        kp++;
159                                        modifiers.meta.wanted = true;
160                                } else if(k.length > 1) { //If it is a special key
161                                        if(special_keys[k] == code) kp++;
162                                       
163                                } else if(opt['keycode']) {
164                                        if(opt['keycode'] == code) kp++;
165
166                                } else { //The special keys did not match
167                                        if(character == k) kp++;
168                                        else {
169                                                if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
170                                                        character = shift_nums[character];
171                                                        if(character == k) kp++;
172                                                }
173                                        }
174                                }
175                        }
176
177                        if(kp == keys.length &&
178                                                modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
179                                                modifiers.shift.pressed == modifiers.shift.wanted &&
180                                                modifiers.alt.pressed == modifiers.alt.wanted &&
181                                                modifiers.meta.pressed == modifiers.meta.wanted) {
182                                callback(e);
183       
184                                if(!opt['propagate']) { //Stop the event
185                                        //e.cancelBubble is supported by IE - this will kill the bubbling process.
186                                        e.cancelBubble = true;
187                                        e.returnValue = false;
188       
189                                        //e.stopPropagation works in Firefox.
190                                        if (e.stopPropagation) {
191                                                e.stopPropagation();
192                                                e.preventDefault();
193                                        }
194                                        return false;
195                                }
196                        }
197                }
198                this.all_shortcuts[shortcut_combination] = {
199                        'callback':func,
200                        'target':ele,
201                        'event': opt['type']
202                };
203                //Attach the function with the event
204                if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
205                else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
206                else ele['on'+opt['type']] = func;
207        },
208
209        //Remove the shortcut - just specify the shortcut and I will remove the binding
210        'remove':function(shortcut_combination) {
211                shortcut_combination = shortcut_combination.toLowerCase();
212                var binding = this.all_shortcuts[shortcut_combination];
213                delete(this.all_shortcuts[shortcut_combination])
214                if(!binding) return;
215                var type = binding['event'];
216                var ele = binding['target'];
217                var callback = binding['callback'];
218
219                if(ele.detachEvent) ele.detachEvent('on'+type, callback);
220                else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
221                else ele['on'+type] = false;
222        }
223}
224
225/* ExpressMail Functions */
226var shift_up_count = 0;
227var shift_down_count = 0;
228shortcut.add("N",function(){ new_message("new","null"); },{'disable_in_input':true});
229
230shortcut.add("Esc",function(){
231        var window_closed = false;
232        for(var window in arrayJSWin)
233        {
234                if (arrayJSWin[window].visible)
235                {
236                        arrayJSWin[window].close();
237                        window_closed = true;
238                }
239        }
240        if (!window_closed)
241                delete_border(get_msg_id(), 'false');
242},{'disable_in_input':false});
243
244shortcut.add("I",function(){ exec_msg_action('print'); },{'disable_in_input':true});
245shortcut.add("E",function(){ exec_msg_action('forward'); },{'disable_in_input':true});
246shortcut.add("R",function(){ exec_msg_action('reply'); },{'disable_in_input':true});
247shortcut.add("Delete",function(){
248        if ( Element('border_id_0').className==='menu-sel' )
249        {
250                var selected_shortcut_msgs = '';
251                var current_folder = get_current_folder();
252                var tbody_box = Element('tbody_box');
253                all_messages = Element('tbody_box').childNodes;
254               
255                for (var i=0; i < all_messages.length; i++)
256                {
257                        if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
258                        {
259                                selected_shortcut_msgs += all_messages[i].id + ',';
260                        }
261                }
262               
263                selected_shortcut_msgs = selected_shortcut_msgs.substring(0,(selected_shortcut_msgs.length-1));
264                delete_msgs(current_folder, selected_shortcut_msgs, 'null');
265        }
266        else
267                exec_msg_action('delete');
268}
269,{'disable_in_input':true});
270
271shortcut.add("Ctrl+Up",function(){ exec_msg_action('previous'); select_msg('null', 'up', true);},{'disable_in_input':true});
272shortcut.add("Ctrl+Down",function(){ exec_msg_action('next'); select_msg('null', 'down', true);},{'disable_in_input':true});
273
274if (is_ie)
275{
276        shortcut.add("down",function(){ select_msg('null', 'down'); },{'disable_in_input':false});
277        shortcut.add("up",function(){ select_msg('null', 'up'); },{'disable_in_input':false}); 
278       
279        shortcut.add("Shift+down",function(){
280                if ( Element('border_id_0').className==='menu-sel' )
281                {
282                        if (shift_up_count > 0)
283                                unselect_top_msg();
284                        else
285                                select_bottom_msg();
286                }
287        },{'disable_in_input':true, 'propagate':false});
288       
289        shortcut.add("Shift+up",function(){
290                if ( Element('border_id_0').className==='menu-sel' )
291                {
292                        if (shift_down_count > 0)
293                                unselect_bottom_msg();
294                        else
295                                select_top_msg();
296                }
297        },{'disable_in_input':true, 'propagate':false});
298}
299else
300{
301        shortcut.add("down",function(){ select_msg('null', 'down');},{'type':'keypress', 'disable_in_input':false});
302        shortcut.add("up",function(){ select_msg('null', 'up'); },{'type':'keypress', 'disable_in_input':false});
303       
304        shortcut.add("Shift+down",function(){
305                if ( Element('border_id_0').className==='menu-sel' )
306                {
307                        if (shift_up_count > 0)
308                                unselect_top_msg();
309                        else
310                                select_bottom_msg();
311                }
312        },{'type':'keypress','disable_in_input':true, 'propagate':false});
313       
314        shortcut.add("Shift+up",function(){
315                if ( Element('border_id_0').className==='menu-sel' )
316                {
317                        if (shift_down_count > 0)
318                                unselect_bottom_msg();
319                        else
320                                select_top_msg();
321                }
322        },{'type':'keypress', 'disable_in_input':true, 'propagate':false});
323}
324
325shortcut.add("return",function(){
326        if ( Element('border_id_0').className==='menu-sel' )
327        {
328                all_messages = Element('tbody_box').childNodes;
329                for (var i=0; i < all_messages.length; i++)
330                {
331                        if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
332                        {
333                                Element("td_who_" + all_messages[i].id).onclick();
334                                return;
335                        }
336                }
337        }
338}
339,{'disable_in_input':true});
340
341shortcut.add("f9",function(){
342        Element("em_refresh_button").onclick();
343        return;
344},{'disable_in_input':true});
345
346function exec_msg_action(action)
347{
348        var msg_id = get_msg_id();
349        if (msg_id)
350        {
351                var msg_id = 'msg_opt_' + action + '_' + msg_id;
352                try {Element(msg_id).onclick();}
353                catch(e){/*alert(e);*/}
354        }
355        return;
356}
357
358function get_msg_id()
359{
360        children = Element('border_tr').childNodes;
361       
362        for (var i=0; i<children.length; i++)
363        {
364                if ( (children[i].nodeName==='TD') && (children[i].className==='menu-sel') && children[i].id != 'border_id_0')
365                {
366                        var border_selected = children[i];
367                        var msg_id = border_selected.id.replace("border_id_","");
368                        return msg_id;
369                }
370        }
371        return false;
372}
373
374function select_msg(msg_number, keyboard_action, force_msg_selection)
375{
376        //Select msg, even if the focus isn't the border_id_0
377        if ( (Element('border_id_0').className != 'menu-sel') && (!force_msg_selection) )
378                return;
379
380        shift_up_count = 0;
381        shift_down_count = 0;
382
383        if (msg_number != 'null')
384        {
385                unselect_all_msgs();
386                add_className(Element(msg_number), 'selected_shortcut_msg')
387        }
388        else
389        {
390                all_messages = Element('tbody_box').childNodes;
391                if (keyboard_action == 'down')
392                {
393                        // Ultimo elemento ja esta selecionado
394                        if ( exist_className(all_messages[all_messages.length-1], 'selected_shortcut_msg') )
395                        {
396                                unselect_all_msgs();
397                                add_className(all_messages[all_messages.length-1], 'selected_shortcut_msg')
398                                return false;
399                        }
400                       
401                        for (var i=all_messages.length-1; i >=0; i--)
402                        {
403                                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
404                                {
405                                        add_className(all_messages[i+1], 'selected_shortcut_msg')
406                                        var mailPos = i;
407                                        break;
408                                }
409                        }
410                        for (; i>=0; i--)
411                        {
412                                remove_className(all_messages[i], 'selected_shortcut_msg');
413                        }
414                var scrollMain = Element('divScrollMain_0');
415//              var selection_size = all_messages[1].offsetTop;
416                var selection_size = parseInt(preferences.line_height) + 10;
417               
418                if ((mailPos) && (parseInt(scrollMain.style.height.substr(0,scrollMain.style.height.length-2)) + scrollMain.scrollTop < all_messages[mailPos].offsetTop + selection_size))
419                        scrollMain.scrollTop += selection_size;
420                }
421                else
422                {
423                        if ( exist_className(all_messages[0], 'selected_shortcut_msg') )
424                        {
425                                unselect_all_msgs();
426                                add_className(all_messages[0], 'selected_shortcut_msg')
427                                return false;
428                        }
429                       
430                        for (var i=0; i < all_messages.length; i++)
431                        {
432                                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
433                                {
434                                        add_className(all_messages[i-1], 'selected_shortcut_msg')
435                                        var mailPos = i;
436                                        break;
437                                }
438                        }
439                        for (; i< all_messages.length; i++)
440                        {
441                                remove_className(all_messages[i], 'selected_shortcut_msg')
442                        }
443                var scrollMain = Element('divScrollMain_0');
444                var selection_size = 30;
445                if (all_messages[mailPos].offsetTop <= scrollMain.scrollTop)
446                        scrollMain.scrollTop -= selection_size;
447                }
448                        return true;
449                }
450        }
451
452function select_bottom_msg()
453{
454        all_messages = Element('tbody_box').childNodes;
455       
456        if ( exist_className(all_messages[all_messages.length-1], 'selected_shortcut_msg') )
457                return;
458       
459        for (var i=all_messages.length-1; i >=0; i--)
460        {
461                if ( (exist_className(all_messages[i], 'selected_shortcut_msg')) && (i+1 <= all_messages.length-1) )
462                {
463                        shift_down_count++;
464                        add_className(all_messages[i+1], 'selected_shortcut_msg');
465                        break;
466                }
467        }
468}
469
470function select_top_msg()
471{
472        all_messages = Element('tbody_box').childNodes;
473               
474        if ( exist_className(all_messages[0], 'selected_shortcut_msg') )
475                return;
476       
477        for (var i=0; i <=all_messages.length-1; i++)
478        {
479                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
480                {
481                        shift_up_count++;
482                        add_className(all_messages[i-1], 'selected_shortcut_msg');
483                        break;
484                }
485        }
486}
487
488function unselect_bottom_msg()
489{
490        all_messages = Element('tbody_box').childNodes;
491        for (var i=all_messages.length-1; i >=0; i--)
492        {
493                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
494                {
495                        shift_down_count--;
496                        remove_className(all_messages[i], 'selected_shortcut_msg');
497                        break;
498                }
499        }
500}
501
502function unselect_top_msg()
503{
504        all_messages = Element('tbody_box').childNodes;
505        for (var i=0; i <=all_messages.length-1; i++)
506        {
507                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
508                {
509                        shift_up_count--;
510                        remove_className(all_messages[i], 'selected_shortcut_msg');
511                        break;
512                }
513        }
514}
515
516function unselect_all_msgs()
517{
518        all_messages = Element('tbody_box').childNodes;
519        for (var i=0; i <=all_messages.length-1; i++)
520        {
521                remove_className(all_messages[i], 'selected_shortcut_msg');
522        }
523}
Note: See TracBrowser for help on using the repository browser.