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

Revision 6910, 18.4 KB checked in by cristiano, 12 years ago (diff)

Ticket #2987 - Inconsistência excluindo com tela modal aberta - teclas de atalho

  • 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    'disabled': false,
10        'add': function(shortcut_combination,callback,opt) {
11                //Provide a set of default options
12                var default_options = {
13                        'type':'keydown',
14                        'propagate':false,
15                        'disable_in_input':false,
16                        'target':document,
17                        'keycode':false
18                }
19                if(!opt) opt = default_options;
20                else {
21                        for(var dfo in default_options) {
22                                if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
23                        }
24                }
25               
26                var ele = opt.target;
27                if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
28                var ths = this;
29                shortcut_combination = shortcut_combination.toLowerCase();
30
31                //The function to be called at keypress
32                var func = function(e) {
33                        e = e || window.event;
34                       
35                        if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
36                                var element;
37                                if(e.target) element=e.target;
38                                else if(e.srcElement) element=e.srcElement;
39                                if(element.nodeType==3) element=element.parentNode;
40               
41                                if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
42                        }
43         
44            if(shortcut.disabled === true)
45                return;
46
47
48                        //Find Which key is pressed
49                        if (e.keyCode) code = e.keyCode;
50                        else if (e.which) code = e.which;
51                        var character = String.fromCharCode(code).toLowerCase();
52                       
53                        if(code == 188) character=","; //If the user presses , when the type is onkeydown
54                        if(code == 190) character="."; //If the user presses , when the type is onkeydown
55       
56                        var keys = shortcut_combination.split("+");
57                        //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
58                        var kp = 0;
59                       
60                        //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
61                        var shift_nums = {
62                                "`":"~",
63                                "1":"!",
64                                "2":"@",
65                                "3":"#",
66                                "4":"$",
67                                "5":"%",
68                                "6":"^",
69                                "7":"&",
70                                "8":"*",
71                                "9":"(",
72                                "0":")",
73                                "-":"_",
74                                "=":"+",
75                                ";":":",
76                                "'":"\"",
77                                ",":"<",
78                                ".":">",
79                                "/":"?",
80                                "\\":"|"
81                        }
82                        //Special Keys - and their codes
83                        var special_keys = {
84                                'esc':27,
85                                'escape':27,
86                                'tab':9,
87                                'space':32,
88                                'return':13,
89                                'enter':13,
90                                'backspace':8,
91       
92                                'scrolllock':145,
93                                'scroll_lock':145,
94                                'scroll':145,
95                                'capslock':20,
96                                'caps_lock':20,
97                                'caps':20,
98                                'numlock':144,
99                                'num_lock':144,
100                                'num':144,
101                               
102                                'pause':19,
103                                'break':19,
104                               
105                                'insert':45,
106                                'home':36,
107                                'delete':46,
108                                'end':35,
109                               
110                                'pageup':33,
111                                'page_up':33,
112                                'pu':33,
113       
114                                'pagedown':34,
115                                'page_down':34,
116                                'pd':34,
117       
118                                'left':37,
119                                'up':38,
120                                'right':39,
121                                'down':40,
122       
123                                'f1':112,
124                                'f2':113,
125                                'f3':114,
126                                'f4':115,
127                                'f5':116,
128                                'f6':117,
129                                'f7':118,
130                                'f8':119,
131                                'f9':120,
132                                'f10':121,
133                                'f11':122,
134                                'f12':123
135                        }
136       
137                        var modifiers = {
138                                shift: {wanted:false, pressed:false},
139                                ctrl : {wanted:false, pressed:false},
140                                alt  : {wanted:false, pressed:false},
141                                meta : {wanted:false, pressed:false}    //Meta is Mac specific
142                        };
143                       
144                        if(e.ctrlKey)   modifiers.ctrl.pressed = true;
145                        if(e.shiftKey)  modifiers.shift.pressed = true;
146                        if(e.altKey)    modifiers.alt.pressed = true;
147                        if(e.metaKey)   modifiers.meta.pressed = true;
148                       
149                        for(var i=0; k=keys[i],i<keys.length; i++) {
150                                //Modifiers
151                                if(k == 'ctrl' || k == 'control') {
152                                        kp++;
153                                        modifiers.ctrl.wanted = true;
154
155                                } else if(k == 'shift') {
156                                        kp++;
157                                        modifiers.shift.wanted = true;
158
159                                } else if(k == 'alt') {
160                                        kp++;
161                                        modifiers.alt.wanted = true;
162                                } else if(k == 'meta') {
163                                        kp++;
164                                        modifiers.meta.wanted = true;
165                                } else if(k.length > 1) { //If it is a special key
166                                        if(special_keys[k] == code) kp++;
167                                       
168                                } else if(opt['keycode']) {
169                                        if(opt['keycode'] == code) kp++;
170
171                                } else { //The special keys did not match
172                                        if(character == k) kp++;
173                                        else {
174                                                if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
175                                                        character = shift_nums[character];
176                                                        if(character == k) kp++;
177                                                }
178                                        }
179                                }
180                        }
181
182                        if(kp == keys.length &&
183                                                modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
184                                                modifiers.shift.pressed == modifiers.shift.wanted &&
185                                                modifiers.alt.pressed == modifiers.alt.wanted &&
186                                                modifiers.meta.pressed == modifiers.meta.wanted) {
187                                callback(e);
188       
189                                if(!opt['propagate']) { //Stop the event
190                                        //e.cancelBubble is supported by IE - this will kill the bubbling process.
191                                        if ( Element('border_id_0') && Element('border_id_0').className != 'menu-sel' ){
192                                                return false;
193                                        }
194                                        e.cancelBubble = true;
195                                        e.returnValue = false;
196       
197                                       
198                                        //e.stopPropagation works in Firefox.
199                                        if (e.stopPropagation) {
200                                        if ( Element('border_id_0') && Element('border_id_0').className != 'menu-sel' ){
201                                                return false;
202                                        }
203                                               
204                                                e.stopPropagation();
205                                                e.preventDefault();
206                                        }
207                                        return false;
208                                }
209                               
210                        }
211                }
212                this.all_shortcuts[shortcut_combination] = {
213                        'callback':func,
214                        'target':ele,
215                        'event': opt['type']
216                };
217                //Attach the function with the event
218                if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
219                else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
220                else ele['on'+opt['type']] = func;
221        },
222
223        //Remove the shortcut - just specify the shortcut and I will remove the binding
224        'remove':function(shortcut_combination) {
225                shortcut_combination = shortcut_combination.toLowerCase();
226                var binding = this.all_shortcuts[shortcut_combination];
227                delete(this.all_shortcuts[shortcut_combination])
228                if(!binding) return;
229                var type = binding['event'];
230                var ele = binding['target'];
231                var callback = binding['callback'];
232
233                if(ele.detachEvent) ele.detachEvent('on'+type, callback);
234                else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
235                else ele['on'+type] = false;
236        }
237}
238
239/* ExpressMail Functions */
240
241var shift_up_count = 0;
242var shift_down_count = 0;
243var selMessageShortcut = "";
244
245shortcut.add("N",function(e)
246{
247        // avoids problem related at ticket #1011
248        e.preventDefault();
249        var search_in_focus = false;
250        var search_win = document.getElementById( 'QuickCatalogSearch_window_QuickCatalogSearch' );
251        if ( search_win && search_win.style.visibility != 'hidden' )
252                search_in_focus = true;
253
254        if ( ! search_in_focus )
255                new_message("new","null");
256},{'disable_in_input':true});
257
258shortcut.add("Esc",function(){
259        var window_closed = false;
260        var search_win = document.getElementById( 'window_QuickCatalogSearch' );
261       
262        for(var window in arrayJSWin)
263        {
264                if (arrayJSWin[window].visible)
265                {
266                    window_closed = true;
267                    if(search_win.style.visibility == 'hidden'){
268                        arrayJSWin[window].close();
269                    }
270                }
271        }
272        if((search_win) && (search_win.style.visibility == 'visible')){
273            search_win.style.visibility = 'hidden';
274            win.close();
275       }       
276
277        if (!window_closed)
278                delete_border(get_msg_id(), 'false');
279},{'disable_in_input':false});
280
281shortcut.add("I",function(){print_all();},{'disable_in_input':true});
282shortcut.add("E",function(e){ if(e.preventDefault) e.preventDefault(); else event.returnValue = false; exec_msg_action('forward');},{'disable_in_input':true});
283shortcut.add("R",function(e){ if(e.preventDefault) e.preventDefault(); else event.returnValue = false; exec_msg_action('reply');},{'disable_in_input':true});
284shortcut.add("T",function(e){ if(e.preventDefault) e.preventDefault(); else event.returnValue = false; var msg_id = get_msg_id(); if(msg_id) new_message("reply_to_all_with_history",msg_id);},{'disable_in_input':true});
285shortcut.add("O",function(e){ if(e.preventDefault) e.preventDefault(); else event.returnValue = false; show_head_option();},{'disable_in_input':true});
286shortcut.add("M",function(e){ if(e.preventDefault) e.preventDefault(); else event.returnValue = false; show_address_full();},{'disable_in_input':true});
287
288shortcut.add("Delete",function(){
289       
290       
291        var selected_shortcut_msgs = '';
292        var tbody_box = Element('tbody_box');
293        all_messages = Element('tbody_box').childNodes;
294       
295        for ( var i=0; i < all_messages.length; i++ )
296        {
297                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
298                {
299                        selected_shortcut_msgs += all_messages[i].id + ',';
300                       
301                        if( all_messages[i].nextSibling )
302                                selMessageShortcut = all_messages[i].nextSibling.id + "-" + "down";
303                        else if(all_messages[i].previousSibling)
304                                selMessageShortcut = all_messages[i].previousSibling.id + "-" + "up";
305                }
306        }
307       
308        selected_shortcut_msgs = selected_shortcut_msgs.substring(0,(selected_shortcut_msgs.length-1));
309       
310        if ( Element('border_id_0').className === 'menu-sel' )
311        {
312                proxy_mensagens.delete_msgs(current_folder, selected_shortcut_msgs, 'null');
313        }
314        else
315        {
316                exec_msg_action('delete');
317                select_msg(selMessageShortcut.substring(0, selMessageShortcut.indexOf("-")),
318                                   selMessageShortcut.substring(selMessageShortcut.indexOf("-")), true );
319               
320                proxy_mensagens.delete_msgs(current_folder, selected_shortcut_msgs, 'null');
321        }
322       
323}
324,{'disable_in_input':true});
325
326shortcut.add("Ctrl+Up",function(){exec_msg_action('previous');/*select_msg('null', 'up');*/},{'disable_in_input':true});
327shortcut.add("Ctrl+Down",function(){exec_msg_action('next');/*select_msg('null', 'down');*/},{'disable_in_input':true});
328
329if (is_ie || is_webkit)
330{
331//**********************
332shortcut.add('up', function(e)
333        {
334               
335                var search_in_focus = false;
336                var search_win = document.getElementById( 'window_QuickCatalogSearch' );
337                if ( search_win && search_win.style.visibility == 'visible' )
338                        search_in_focus = true;
339
340                if ( !search_in_focus && currentTab == 0 )
341                    select_msg('null', 'up');
342                // Ao usuario pressionar o 'up' em uma outra aba, não pode ser removido o 'up'.
343                                else{}
344                   // shortcut.remove('up');
345                                e.stopPropagation();
346                                e.preventDefault();
347        },{'disable_in_input':false});
348
349
350        shortcut.add('down', function(e)
351        {
352                var search_in_focus = false;
353                var search_win = document.getElementById( 'window_QuickCatalogSearch' );
354                if ( search_win && search_win.style.visibility == 'visible' )
355                        search_in_focus = true;
356
357                if ( !search_in_focus && currentTab == 0 )
358                    select_msg('null', 'down');
359                                // Ao usuario pressionar o 'down' em uma outra aba, não pode ser removido o 'down'.
360                else{}
361                   // shortcut.remove('down');
362                                e.stopPropagation();
363                                e.preventDefault();
364        },{'disable_in_input':false});
365
366//****************
367
368        shortcut.add("Shift+down",function(){
369                if ( Element('border_id_0').className==='menu-sel' )
370                {
371                        if (shift_up_count > 0)
372                                unselect_top_msg();
373                        else
374                                select_bottom_msg();
375                }
376        },{'disable_in_input':true, 'propagate':false});
377       
378        shortcut.add("Shift+up",function(){
379                if ( Element('border_id_0').className==='menu-sel' )
380                {
381                        if (shift_down_count > 0)
382                                unselect_bottom_msg();
383                        else
384                                select_top_msg();
385                }
386        },{'disable_in_input':true, 'propagate':false});
387}
388else
389{
390        shortcut.add("Up",function(){
391                if (currentTab == 0)
392                  select_msg('null', 'up');
393        },{'disable_in_input':false});
394       
395        shortcut.add("Down",function(){
396
397                if (currentTab == 0)
398                  select_msg('null', 'down');
399               
400        },{'disable_in_input':false});
401       
402        shortcut.add("Shift+down",function(){
403                if ( Element('border_id_0').className==='menu-sel' )
404                {
405                        if (shift_up_count > 0)
406                                unselect_top_msg();
407                        else
408                                select_bottom_msg();
409                }
410        },{'type':'keypress','disable_in_input':true, 'propagate':false});
411       
412        shortcut.add("Shift+up",function(){
413                if ( Element('border_id_0').className==='menu-sel' )
414                {
415                        if (shift_down_count > 0)
416                                unselect_bottom_msg();
417                        else
418                                select_top_msg();
419                }
420        },{'type':'keypress', 'disable_in_input':true, 'propagate':false});
421}
422
423shortcut.add("return",function(){
424        if ( Element('border_id_0').className==='menu-sel' )
425        {
426                all_messages = Element('tbody_box').childNodes;
427                for (var i=0; i < all_messages.length; i++)
428                {
429                        if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
430                        {
431                                Element("td_from_" + all_messages[i].id).onclick();
432                                return;
433                        }
434                }
435        }
436},{'disable_in_input':true});
437
438shortcut.add("f9",function(){
439        Element("em_refresh_button").onclick();
440        return;
441},{'disable_in_input':true});
442
443function exec_msg_action(action)
444{
445        var msg_id = get_msg_id();
446        if (msg_id)
447        {
448                var msg_id = 'msg_opt_' + action + '_' + msg_id;
449                try {Element(msg_id).onclick();}
450                catch(e){/*alert(e);*/}
451        }
452        return;
453}
454
455function show_head_option()
456{
457        var msg_id = get_msg_id();
458    if (msg_id) {
459                var msg_id = 'option_hide_more_' + msg_id;
460                try {Element(msg_id).onclick();}
461                catch(e){/*alert(e);*/}
462    }
463        return;
464}
465
466function show_address_full()
467{
468        var toaddress = Element('div_toaddress_' + get_msg_id());       
469        var ccaddress = Element('div_ccaddress_' + get_msg_id());
470       
471        if(toaddress &&  '' == toaddress.style.display) {
472                show_div_address_full(get_msg_id(),'to');
473        }
474        else {
475                if(toaddress)
476                        toaddress.style.display = '';
477                var toaddress_full = Element('div_toaddress_full_' + get_msg_id());
478                if(toaddress_full)
479                        toaddress_full.style.display = 'none';
480        }               
481        if(ccaddress &&  '' == ccaddress.style.display) {
482                show_div_address_full(get_msg_id(),'cc');
483        }
484        else {
485                if(ccaddress)
486                        ccaddress.style.display = '';
487                var ccaddress_full = Element('div_ccaddress_full_' + get_msg_id());
488                if(ccaddress_full)
489                        ccaddress_full.style.display = 'none';
490        }
491        return;
492}
493
494function get_msg_id()
495{
496        children = Element('border_tr').childNodes;
497       
498        for (var i=0; i<children.length; i++)
499        {
500                if ( (children[i].nodeName==='TD') && (children[i].className==='menu-sel') && children[i].id != 'border_id_0')
501                {
502                        var border_selected = children[i];
503                        var msg_id = border_selected.id.replace("border_id_","");
504                        return msg_id;
505                }
506        }
507        return false;
508}
509
510function select_msg(msg_number, keyboard_action, force_msg_selection)
511{
512    /*
513          ** Se caso for limpado toda a caixa de email,
514          ** é adicionado um novo atalho de seleção.
515          ** main.js on function refrash and line 629.
516        */
517       
518        if(keyboard_action == "reload_msg"){
519           if( $("#tbody_box .selected_shortcut_msg").length == 0 )
520                $("#tbody_box tr:first").addClass("selected_shortcut_msg");     
521        }
522       
523        shift_up_count = 0;
524        shift_down_count = 0;
525
526        if (msg_number != 'null') {
527       
528                if(Element(msg_number)){
529                        unselect_all_msgs();
530                        add_className(Element(msg_number), 'selected_shortcut_msg');
531                }
532               
533        } else {
534                var scrollMain = Element('divScrollMain_0');
535                var selection_size = parseInt(preferences.line_height) + 10;
536               
537                        if( keyboard_action == 'down') {
538                       
539                                if(!Element("chk_box_select_all_messages").checked){
540                                       
541                                        $("#divScrollMain_0").find("#tbody_box").find("tr").each(function(){
542                                       
543                                                if($(this).hasClass("selected_shortcut_msg") && $(this).next().length){
544                                                        $(this).next().addClass("selected_shortcut_msg");
545                                                        $(this).removeClass("selected_shortcut_msg");
546                                                        return false;
547                                                }
548                                               
549                                        });
550                                       
551                                } else {
552                               
553                                        $("#divScrollMain_0").find("#tbody_box").find("tr").each(function(){
554                                               
555                                                if($(this).hasClass("current_selected") && $(this).next().length){
556                                                        $(this).removeClass("current_selected");
557                                                        $(this).removeClass("selected_shortcut_msg");
558                                                        $(this).next().addClass("current_selected");
559                                                        $(this).next().addClass("selected_shortcut_msg");
560                                                        return false;
561                                                }
562                                       
563                                        });
564                                        $("#divScrollMain_0").find("#tbody_box").find("tr").each(function(){
565                                                                if(!$(this).hasClass("current_selected"))
566                                                                        $(this).removeClass("selected_shortcut_msg");
567                                        });
568                                }
569                       
570                        } else if( keyboard_action == 'up') {
571                       
572                                if(!Element("chk_box_select_all_messages").checked){
573                               
574                                        $("#divScrollMain_0").find("#tbody_box").find("tr").each(function(){
575                                       
576                                                if($(this).hasClass("selected_shortcut_msg") && $(this).prev().length){
577                                                                $(this).prev().addClass("selected_shortcut_msg");
578                                                                $(this).removeClass("selected_shortcut_msg");
579                                                                return false;
580                                                }
581                                               
582                                        });
583                                       
584                                } else {
585                                       
586                                        $("#divScrollMain_0").find("#tbody_box").find("tr").each(function(){
587                                               
588                                                if($(this).hasClass("current_selected") && $(this).prev().length){
589                                                        $(this).removeClass("current_selected");
590                                                        $(this).removeClass("selected_shortcut_msg");
591                                                        $(this).prev().addClass("current_selected");
592                                                        $(this).prev().addClass("selected_shortcut_msg");
593                                                        return false;
594                                                }
595                                       
596                                        });
597                                        $("#divScrollMain_0").find("#tbody_box").find("tr").each(function(){
598                                                                if(!$(this).hasClass("current_selected"))
599                                                                        $(this).removeClass("selected_shortcut_msg");
600                                        });
601                               
602                                }
603                 
604                        }
605                return true;
606        }
607}
608
609function select_bottom_msg()
610{
611        all_messages = Element('tbody_box').childNodes;
612       
613        if ( exist_className(all_messages[all_messages.length-1], 'selected_shortcut_msg') )
614                return;
615       
616        for (var i=all_messages.length-1; i >=0; i--)
617        {
618                if ( (exist_className(all_messages[i], 'selected_shortcut_msg')) && (i+1 <= all_messages.length-1) )
619                {
620                        shift_down_count++;
621                        add_className(all_messages[i+1], 'selected_shortcut_msg');
622                        break;
623                }
624        }
625}
626
627function select_top_msg()
628{
629        all_messages = Element('tbody_box').childNodes;
630               
631        if ( exist_className(all_messages[0], 'selected_shortcut_msg') )
632                return;
633       
634        for (var i=0; i <=all_messages.length-1; i++)
635        {
636                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
637                {
638                        shift_up_count++;
639                        add_className(all_messages[i-1], 'selected_shortcut_msg');
640                        break;
641                }
642        }
643}
644
645function unselect_bottom_msg()
646{
647        all_messages = Element('tbody_box').childNodes;
648        for (var i=all_messages.length-1; i >=0; i--)
649        {
650                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
651                {
652                        shift_down_count--;
653                        remove_className(all_messages[i], 'selected_shortcut_msg');
654                        break;
655                }
656        }
657}
658
659function unselect_top_msg()
660{
661        all_messages = Element('tbody_box').childNodes;
662        for (var i=0; i <=all_messages.length-1; i++)
663        {
664                if ( exist_className(all_messages[i], 'selected_shortcut_msg') )
665                {
666                        shift_up_count--;
667                        remove_className(all_messages[i], 'selected_shortcut_msg');
668                        break;
669                }
670        }
671}
672
673function unselect_all_msgs()
674{
675        all_messages = Element('tbody_box').childNodes;
676        for (var i=0; i <=all_messages.length-1; i++)
677        {
678                remove_className(all_messages[i], 'selected_shortcut_msg');
679        }
680}
Note: See TracBrowser for help on using the repository browser.