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

Revision 2017, 14.3 KB checked in by valmir.sena, 14 years ago (diff)

Ticket #912 - Adicao de Teclas de Atalho M e O no expressoMail

  • Property svn:eol-style set to native
RevLine 
[128]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                }
[1390]24               
[128]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 */
[139]226var shift_up_count = 0;
227var shift_down_count = 0;
[1390]228var selMessageShortcut = "";
229
[128]230shortcut.add("N",function(){ new_message("new","null"); },{'disable_in_input':true});
[139]231
232shortcut.add("Esc",function(){
233        var window_closed = false;
234        for(var window in arrayJSWin)
235        {
236                if (arrayJSWin[window].visible)
237                {
238                        arrayJSWin[window].close();
239                        window_closed = true;
240                }
241        }
242        if (!window_closed)
243                delete_border(get_msg_id(), 'false');
244},{'disable_in_input':false});
245
[1497]246shortcut.add("I",function(){ print_all(); },{'disable_in_input':true});
[128]247shortcut.add("E",function(){ exec_msg_action('forward'); },{'disable_in_input':true});
248shortcut.add("R",function(){ exec_msg_action('reply'); },{'disable_in_input':true});
[2017]249shortcut.add("O",function(){ show_head_option(); },{'disable_in_input':true});
250shortcut.add("M",function(){ show_address_full(); },{'disable_in_input':true});
[1390]251
[128]252shortcut.add("Delete",function(){
[1390]253       
254        var selected_shortcut_msgs = '';
255        var tbody_box = Element('tbody_box');
256        all_messages = Element('tbody_box').childNodes;
257       
258        for ( var i=0; i < all_messages.length; i++ )
[128]259        {
[1390]260                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
[163]261                {
[1390]262                        selected_shortcut_msgs += all_messages[i].id + ',';
263                       
264                        if( all_messages[i].nextSibling )
265                                selMessageShortcut = all_messages[i].nextSibling.id + "-" + "down";
266                        else if(all_messages[i].previousSibling)
267                                selMessageShortcut = all_messages[i].previousSibling.id + "-" + "up";
[163]268                }
[1390]269        }
270        selected_shortcut_msgs = selected_shortcut_msgs.substring(0,(selected_shortcut_msgs.length-1));
271       
272        if ( Element('border_id_0').className==='menu-sel' )
273        {
[689]274                proxy_mensagens.delete_msgs(current_folder, selected_shortcut_msgs, 'null');
[128]275        }
276        else
[1390]277        {
[128]278                exec_msg_action('delete');
[1390]279                select_msg(selMessageShortcut.substring(0, selMessageShortcut.indexOf("-")),
280                                   selMessageShortcut.substring(selMessageShortcut.indexOf("-")), true );
281        }
[128]282}
283,{'disable_in_input':true});
284
[163]285shortcut.add("Ctrl+Up",function(){ exec_msg_action('previous'); select_msg('null', 'up', true);},{'disable_in_input':true});
286shortcut.add("Ctrl+Down",function(){ exec_msg_action('next'); select_msg('null', 'down', true);},{'disable_in_input':true});
[536]287
288if (is_ie)
289{
[139]290        shortcut.add("down",function(){ select_msg('null', 'down'); },{'disable_in_input':false});
[350]291        shortcut.add("up",function(){ select_msg('null', 'up'); },{'disable_in_input':false}); 
[536]292       
[139]293        shortcut.add("Shift+down",function(){
[536]294                if ( Element('border_id_0').className==='menu-sel' )
295                {
296                        if (shift_up_count > 0)
297                                unselect_top_msg();
298                        else
299                                select_bottom_msg();
300                }
301        },{'disable_in_input':true, 'propagate':false});
302       
[139]303        shortcut.add("Shift+up",function(){
[536]304                if ( Element('border_id_0').className==='menu-sel' )
305                {
306                        if (shift_down_count > 0)
307                                unselect_bottom_msg();
308                        else
309                                select_top_msg();
310                }
311        },{'disable_in_input':true, 'propagate':false});
[139]312}
[536]313else
314{
[163]315        shortcut.add("down",function(){ select_msg('null', 'down');},{'type':'keypress', 'disable_in_input':false});
[1390]316        shortcut.add("up",function(){ select_msg('null', 'up');},{'type':'keypress', 'disable_in_input':false});
[536]317       
318        shortcut.add("Shift+down",function(){
319                if ( Element('border_id_0').className==='menu-sel' )
320                {
321                        if (shift_up_count > 0)
322                                unselect_top_msg();
323                        else
324                                select_bottom_msg();
325                }
326        },{'type':'keypress','disable_in_input':true, 'propagate':false});
327       
328        shortcut.add("Shift+up",function(){
329                if ( Element('border_id_0').className==='menu-sel' )
330                {
331                        if (shift_down_count > 0)
332                                unselect_bottom_msg();
333                        else
334                                select_top_msg();
335                }
336        },{'type':'keypress', 'disable_in_input':true, 'propagate':false});
[139]337}
[128]338
339shortcut.add("return",function(){
340        if ( Element('border_id_0').className==='menu-sel' )
341        {
342                all_messages = Element('tbody_box').childNodes;
343                for (var i=0; i < all_messages.length; i++)
344                {
[163]345                        if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
[128]346                        {
347                                Element("td_who_" + all_messages[i].id).onclick();
348                                return;
349                        }
350                }
351        }
352}
353,{'disable_in_input':true});
354
[139]355shortcut.add("f9",function(){
356        Element("em_refresh_button").onclick();
357        return;
358},{'disable_in_input':true});
[128]359
360function exec_msg_action(action)
361{
362        var msg_id = get_msg_id();
363        if (msg_id)
364        {
365                var msg_id = 'msg_opt_' + action + '_' + msg_id;
366                try {Element(msg_id).onclick();}
367                catch(e){/*alert(e);*/}
368        }
369        return;
370}
371
[2017]372function show_head_option()
373{
374        var msg_id = get_msg_id();
375               
376        if (msg_id)
377        {
378                var msg_id = 'option_hide_more_' + msg_id;
379                try {Element(msg_id).onclick();}
380                catch(e){/*alert(e);*/}
381        }
382        return;
383}
384
385function show_address_full()
386{
387        var toaddress = Element('div_toaddress_' + get_msg_id());
388        if ( '' == toaddress.style.display )
389        {
390                show_div_address_full(get_msg_id(),'to')
391                show_div_address_full(get_msg_id(),'cc')
392        }
393        else
394        {
395                Element('div_toaddress_full_' + get_msg_id()).style.display='none';
396                Element('div_toaddress_' + get_msg_id()).style.display='';
397                Element('div_ccaddress_full_'+ get_msg_id()).style.display='none';
398                Element('div_ccaddress_'+ get_msg_id()).style.display='';
399        }
400
401        return;
402}
403
[128]404function get_msg_id()
405{
406        children = Element('border_tr').childNodes;
407       
408        for (var i=0; i<children.length; i++)
409        {
410                if ( (children[i].nodeName==='TD') && (children[i].className==='menu-sel') && children[i].id != 'border_id_0')
411                {
412                        var border_selected = children[i];
413                        var msg_id = border_selected.id.replace("border_id_","");
414                        return msg_id;
415                }
416        }
417        return false;
418}
419
[163]420function select_msg(msg_number, keyboard_action, force_msg_selection)
[128]421{
[163]422        //Select msg, even if the focus isn't the border_id_0
423        if ( (Element('border_id_0').className != 'menu-sel') && (!force_msg_selection) )
[139]424                return;
[350]425
[139]426        shift_up_count = 0;
427        shift_down_count = 0;
428
[128]429        if (msg_number != 'null')
430        {
[163]431                unselect_all_msgs();
432                add_className(Element(msg_number), 'selected_shortcut_msg')
[128]433        }
434        else
435        {
[1403]436                var scrollMain = Element('divScrollMain_0');
437                var selection_size = parseInt(preferences.line_height) + 10;
438
[1390]439                if( keyboard_action == 'down')
[128]440                {
[139]441                        for (var i=all_messages.length-1; i >=0; i--)
[128]442                        {
[163]443                                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
[128]444                                {
[163]445                                        add_className(all_messages[i+1], 'selected_shortcut_msg')
[350]446                                        var mailPos = i;
[139]447                                        break;
[128]448                                }
[139]449                        }
[1390]450                       
[139]451                        for (; i>=0; i--)
452                        {
[1390]453                                if( all_messages[i].nextSibling )
454                                        remove_className(all_messages[i], 'selected_shortcut_msg');
[139]455                        }
[1403]456                        if ((mailPos) && (parseInt(scrollMain.style.height.substr(0,scrollMain.style.height.length-2)) + scrollMain.scrollTop) < (all_messages[mailPos].offsetTop + selection_size))
457                                scrollMain.scrollTop += selection_size;
458
[139]459                }
[1390]460                else if( keyboard_action == 'up')
[139]461                {
462                        for (var i=0; i < all_messages.length; i++)
463                        {
[163]464                                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
[128]465                                {
[1390]466                                        if( all_messages[i].previousSibling )
467                                        {
468                                                add_className(all_messages[i-1], 'selected_shortcut_msg')
469                                                var mailPos = i;
470                                                break;
471                                        }
[139]472                                }
[128]473                        }
[1390]474                       
[139]475                        for (; i< all_messages.length; i++)
476                        {
[163]477                                remove_className(all_messages[i], 'selected_shortcut_msg')
[139]478                        }
[1403]479                if (typeof(all_messages[mailPos]) != 'undefined' && all_messages[mailPos].offsetTop <= scrollMain.scrollTop)
480                        scrollMain.scrollTop -= selection_size+10;
[350]481                }
[1390]482
483                return true;
[128]484        }
[1390]485}
[139]486
487function select_bottom_msg()
488{
489        all_messages = Element('tbody_box').childNodes;
490       
[163]491        if ( exist_className(all_messages[all_messages.length-1], 'selected_shortcut_msg') )
[139]492                return;
493       
494        for (var i=all_messages.length-1; i >=0; i--)
495        {
[163]496                if ( (exist_className(all_messages[i], 'selected_shortcut_msg')) && (i+1 <= all_messages.length-1) )
[139]497                {
498                        shift_down_count++;
[163]499                        add_className(all_messages[i+1], 'selected_shortcut_msg');
[139]500                        break;
501                }
502        }
503}
504
505function select_top_msg()
506{
507        all_messages = Element('tbody_box').childNodes;
[350]508               
[163]509        if ( exist_className(all_messages[0], 'selected_shortcut_msg') )
[139]510                return;
511       
512        for (var i=0; i <=all_messages.length-1; i++)
513        {
[163]514                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
[139]515                {
516                        shift_up_count++;
[163]517                        add_className(all_messages[i-1], 'selected_shortcut_msg');
[139]518                        break;
519                }
520        }
521}
522
523function unselect_bottom_msg()
524{
525        all_messages = Element('tbody_box').childNodes;
526        for (var i=all_messages.length-1; i >=0; i--)
527        {
[163]528                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
[139]529                {
530                        shift_down_count--;
[163]531                        remove_className(all_messages[i], 'selected_shortcut_msg');
[139]532                        break;
533                }
534        }
535}
536
537function unselect_top_msg()
538{
539        all_messages = Element('tbody_box').childNodes;
540        for (var i=0; i <=all_messages.length-1; i++)
541        {
[163]542                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
[139]543                {
544                        shift_up_count--;
[163]545                        remove_className(all_messages[i], 'selected_shortcut_msg');
[139]546                        break;
547                }
548        }
[163]549}
550
551function unselect_all_msgs()
552{
553        all_messages = Element('tbody_box').childNodes;
554        for (var i=0; i <=all_messages.length-1; i++)
555        {
556                remove_className(all_messages[i], 'selected_shortcut_msg');
557        }
[631]558}
Note: See TracBrowser for help on using the repository browser.