diff options
author | alecpl <alec@alec.pl> | 2010-04-15 11:28:15 +0000 |
---|---|---|
committer | alecpl <alec@alec.pl> | 2010-04-15 11:28:15 +0000 |
commit | da8f11ce163ffe3f88a359ae613aa144b16c73fc (patch) | |
tree | 73a8f9c733d73c53e1b75362a155834f68bcac0c /program | |
parent | 8a79f224c28a10fc2edc5a1ab1ebc608058bda34 (diff) |
- Fix messages list scrolling in FF3.6 (#1486472)
- Fix quicksearch input focus (#1486637)
- Small code cleanup + improvements
Diffstat (limited to 'program')
-rw-r--r-- | program/js/app.js | 326 | ||||
-rw-r--r-- | program/js/list.js | 4 | ||||
-rw-r--r-- | program/steps/mail/func.inc | 1 |
3 files changed, 152 insertions, 179 deletions
diff --git a/program/js/app.js b/program/js/app.js index 57a1a8ee9..9c5df7661 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -55,7 +55,8 @@ function rcube_webmail() this.env.blankpage = 'program/blank.gif'; // set jQuery ajax options - jQuery.ajaxSetup({ cache:false, + jQuery.ajaxSetup({ + cache:false, error:function(request, status, err){ ref.http_error(request, status, err); }, beforeSend:function(xmlhttp){ xmlhttp.setRequestHeader('X-RoundCube-Request', ref.env.request_token); } }); @@ -131,8 +132,7 @@ function rcube_webmail() this.task = this.env.task; // check browser - if (!bw.dom || !bw.xmlhttp_test()) - { + if (!bw.dom || !bw.xmlhttp_test()) { this.goto_url('error', '_code=0x199'); return; } @@ -176,69 +176,64 @@ function rcube_webmail() this.message_list.addEventListener('dragmove', function(e){ p.drag_move(e); }); this.message_list.addEventListener('dragend', function(e){ p.drag_end(e); }); this.message_list.addEventListener('expandcollapse', function(e){ p.msglist_expand(e); }); + document.onmouseup = function(e){ return p.doc_mouse_up(e); }; + this.gui_objects.messagelist.parentNode.onmousedown = function(e){ return p.click_on_list(e); }; this.set_message_coltypes(this.env.coltypes); this.message_list.init(); this.enable_command('toggle_status', 'toggle_flag', 'menu-open', 'menu-save', true); - if (this.gui_objects.mailcontframe) - this.gui_objects.mailcontframe.onmousedown = function(e){ return p.click_on_list(e); }; - else - this.message_list.focus(); - // load messages if (this.env.messagecount) this.command('list'); } - if (this.env.search_text != null && document.getElementById('quicksearchbox') != null) - document.getElementById('quicksearchbox').value = this.env.search_text; - - if (this.env.action=='show' || this.env.action=='preview') - { + if (this.gui_objects.qsearchbox) { + if (this.env.search_text != null) { + this.gui_objects.qsearchbox.value = this.env.search_text; + } + $(this.gui_objects.qsearchbox).focusin(function() { rcmail.message_list.blur(); }); + } + + if (this.env.trash_mailbox && this.env.mailbox != this.env.trash_mailbox) + this.set_alttext('delete', 'movemessagetotrash'); + + if (this.env.action=='show' || this.env.action=='preview') { this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'copy', 'delete', 'open', 'mark', 'edit', 'viewsource', 'download', 'print', 'load-attachment', 'load-headers', true); - if (this.env.next_uid) - { + if (this.env.next_uid) { this.enable_command('nextmessage', true); this.enable_command('lastmessage', true); } - if (this.env.prev_uid) - { + if (this.env.prev_uid) { this.enable_command('previousmessage', true); this.enable_command('firstmessage', true); } - if (this.env.blockedobjects) - { + if (this.env.blockedobjects) { if (this.gui_objects.remoteobjectsmsg) this.gui_objects.remoteobjectsmsg.style.display = 'block'; this.enable_command('load-images', 'always-load', true); } - } - if (this.env.trash_mailbox && this.env.mailbox != this.env.trash_mailbox) - this.set_alttext('delete', 'movemessagetotrash'); - - // make preview/message frame visible - if (this.env.action == 'preview' && this.env.framed && parent.rcmail) - { - this.enable_command('compose', 'add-contact', false); - parent.rcmail.show_contentframe(true); + // make preview/message frame visible + if (this.env.action == 'preview' && this.env.framed && parent.rcmail) { + this.enable_command('compose', 'add-contact', false); + parent.rcmail.show_contentframe(true); + } } - - if (this.env.action=='compose') - { + else if (this.env.action == 'compose') { this.enable_command('add-attachment', 'send-attachment', 'remove-attachment', 'send', true); - if (this.env.spellcheck) - { + + if (this.env.spellcheck) { this.env.spellcheck.spelling_state_observer = function(s){ ref.set_spellcheck_state(s); }; this.set_spellcheck_state('ready'); if ($("input[name='_is_html']").val() == '1') this.display_spellcheck_controls(false); } + if (this.env.drafts_mailbox) this.enable_command('savedraft', true); @@ -247,38 +242,35 @@ function rcube_webmail() // init message compose form this.init_messageform(); } + // show printing dialog + else if (this.env.action == 'print') + window.print(); if (this.env.messagecount) { this.enable_command('select-all', 'select-none', 'expunge', true); this.enable_command('expand-all', 'expand-unread', 'collapse-all', this.env.threading); - } + } if (this.purge_mailbox_test()) this.enable_command('purge', true); this.set_page_buttons(); - // show printing dialog - if (this.env.action=='print') - window.print(); - // get unread count for each mailbox - if (this.gui_objects.mailboxlist) - { + if (this.gui_objects.mailboxlist) { this.env.unread_counts = {}; this.gui_objects.folderlist = this.gui_objects.mailboxlist; this.http_request('getunread', ''); - } + } // ask user to send MDN - if (this.env.mdn_request && this.env.uid) - { + if (this.env.mdn_request && this.env.uid) { var mdnurl = '_uid='+this.env.uid+'&_mbox='+urlencode(this.env.mailbox); if (confirm(this.get_label('mdnrequest'))) this.http_post('sendmdn', mdnurl); else this.http_post('mark', mdnurl+'&_flag=mdnsent'); - } + } break; @@ -302,15 +294,11 @@ function rcube_webmail() if (this.env.cid) this.contact_list.highlight_row(this.env.cid); - if (this.gui_objects.contactslist.parentNode) - { - this.gui_objects.contactslist.parentNode.onmousedown = function(e){ return p.click_on_list(e); }; - document.onmouseup = function(e){ return p.doc_mouse_up(e); }; + this.gui_objects.contactslist.parentNode.onmousedown = function(e){ return p.click_on_list(e); }; + document.onmouseup = function(e){ return p.doc_mouse_up(e); }; + if (this.gui_objects.qsearchbox) { + $(this.gui_objects.qsearchbox).focusin(function() { rcmail.contact_list.blur(); }); } - else - this.contact_list.focus(); - - //this.gui_objects.folderlist = this.gui_objects.contactslist; } this.set_page_buttons(); @@ -405,8 +393,7 @@ function rcube_webmail() // execute all foreign onload scripts // @deprecated - for (var i=0; i<this.onloads.length; i++) - { + for (var i=0; i<this.onloads.length; i++) { if (typeof(this.onloads[i]) == 'string') eval(this.onloads[i]); else if (typeof(this.onloads[i]) == 'function') @@ -500,8 +487,7 @@ function rcube_webmail() case 'open': var uid; - if (uid = this.get_single_uid()) - { + if (uid = this.get_single_uid()) { obj.href = '?_task='+this.env.task+'&_action=show&_mbox='+urlencode(this.env.mailbox)+'&_uid='+uid; return true; } @@ -509,8 +495,7 @@ function rcube_webmail() // misc list commands case 'list': - if (this.task=='mail') - { + if (this.task=='mail') { if (this.env.search_request<0 || (props != '' && (this.env.search_request && props != this.env.mailbox))) this.reset_qsearch(); @@ -518,15 +503,14 @@ function rcube_webmail() if (this.env.trash_mailbox) this.set_alttext('delete', this.env.mailbox != this.env.trash_mailbox ? 'movemessagetotrash' : 'deletemessage'); - } - else if (this.task=='addressbook') - { + } + else if (this.task=='addressbook') { if (this.env.search_request<0 || (this.env.search_request && props != this.env.source)) this.reset_qsearch(); this.list_contacts(props); this.enable_command('add', 'import', (this.env.address_sources && !this.env.address_sources[this.env.source].readonly)); - } + } break; @@ -585,33 +569,29 @@ function rcube_webmail() // common commands used in multiple tasks case 'show': - if (this.task=='mail') - { + if (this.task=='mail') { var uid = this.get_single_uid(); - if (uid && (!this.env.uid || uid != this.env.uid)) - { + if (uid && (!this.env.uid || uid != this.env.uid)) { if (this.env.mailbox == this.env.drafts_mailbox) this.goto_url('compose', '_draft_uid='+uid+'&_mbox='+urlencode(this.env.mailbox), true); else this.show_message(uid); - } } - else if (this.task=='addressbook') - { + } + else if (this.task=='addressbook') { var cid = props ? props : this.get_single_cid(); if (cid && !(this.env.action=='show' && cid==this.env.cid)) this.load_contact(cid, 'show'); - } + } break; case 'add': if (this.task=='addressbook') this.load_contact(0, 'add'); - else if (this.task=='settings') - { + else if (this.task=='settings') { this.identity_list.clear_selection(); this.load_identity(0, 'add-identity'); - } + } break; case 'edit': @@ -700,16 +680,16 @@ function rcube_webmail() var uid; var flag = 'read'; - if (props._row.uid) - { + if (props._row.uid) { uid = props._row.uid; // toggle read/unread if (this.message_list.rows[uid].deleted) { flag = 'undelete'; - } else if (!this.message_list.rows[uid].unread) - flag = 'unread'; } + else if (!this.message_list.rows[uid].unread) + flag = 'unread'; + } this.mark_message(flag, uid); break; @@ -721,8 +701,7 @@ function rcube_webmail() var uid; var flag = 'flagged'; - if (props._row.uid) - { + if (props._row.uid) { uid = props._row.uid; // toggle flagged/unflagged if (this.message_list.rows[uid].flagged) @@ -747,17 +726,15 @@ function rcube_webmail() var qstring = '_mbox='+urlencode(this.env.mailbox)+'&_uid='+this.env.uid+'&_part='+props.part; // open attachment in frame if it's of a supported mimetype - if (this.env.uid && props.mimetype && jQuery.inArray(props.mimetype, this.mimetypes)>=0) - { + if (this.env.uid && props.mimetype && jQuery.inArray(props.mimetype, this.mimetypes)>=0) { if (props.mimetype == 'text/html') qstring += '&_safe=1'; this.attachment_win = window.open(this.env.comm_path+'&_action=get&'+qstring+'&_frame=1', 'rcubemailattachment'); - if (this.attachment_win) - { + if (this.attachment_win) { window.setTimeout(function(){ ref.attachment_win.focus(); }, 10); break; - } } + } this.goto_url('get', qstring+'&_download=1', false); break; @@ -817,12 +794,10 @@ function rcube_webmail() case 'compose': var url = this.env.comm_path+'&_action=compose'; - if (this.task=='mail') - { + if (this.task=='mail') { url += '&_mbox='+urlencode(this.env.mailbox); - if (this.env.mailbox==this.env.drafts_mailbox) - { + if (this.env.mailbox==this.env.drafts_mailbox) { var uid; if (uid = this.get_single_uid()) url += '&_draft_uid='+uid; @@ -831,36 +806,33 @@ function rcube_webmail() url += '&_to='+urlencode(props); } // modify url if we're in addressbook - else if (this.task=='addressbook') - { + else if (this.task=='addressbook') { // switch to mail compose step directly - if (props && props.indexOf('@') > 0) - { + if (props && props.indexOf('@') > 0) { url = this.get_task_url('mail', url); this.redirect(url + '&_to='+urlencode(props)); break; - } + } // use contact_id passed as command parameter var a_cids = new Array(); if (props) a_cids[a_cids.length] = props; // get selected contacts - else if (this.contact_list) - { + else if (this.contact_list) { var selection = this.contact_list.get_selection(); for (var n=0; n<selection.length; n++) a_cids[a_cids.length] = selection[n]; - } + } if (a_cids.length) this.http_request('mailto', '_cid='+urlencode(a_cids.join(','))+'&_source='+urlencode(this.env.source), true); break; - } + } // don't know if this is necessary... - url = url.replace(/&_framed=1/, ""); + url = url.replace(/&_framed=1/, ''); this.redirect(url); break; @@ -1199,47 +1171,6 @@ function rcube_webmail() /********* event handling methods *********/ /*********************************************************/ - this.doc_mouse_up = function(e) - { - var model, list, li; - - if (this.message_list) { - if (!rcube_mouse_is_over(e, this.message_list.list)) - this.message_list.blur(); - list = this.message_list; - model = this.env.mailboxes; - } - else if (this.contact_list) { - if (!rcube_mouse_is_over(e, this.contact_list.list)) - this.contact_list.blur(); - list = this.contact_list; - model = this.env.contactfolders; - } - else if (this.ksearch_value) { - this.ksearch_blur(); - } - - // handle mouse release when dragging - if (this.drag_active && model && this.env.last_folder_target) { - var target = model[this.env.last_folder_target]; - - $(this.get_folder_li(this.env.last_folder_target)).removeClass('droptarget'); - this.env.last_folder_target = null; - list.draglayer.hide(); - - if (!this.drag_menu(e, target)) - this.command('moveto', target); - } - - // reset 'pressed' buttons - if (this.buttons_sel) { - for (var id in this.buttons_sel) - if (typeof id != 'function') - this.button_out(this.buttons_sel[id], id); - this.buttons_sel = {}; - } - }; - this.drag_menu = function(e, target) { var modkey = rcube_event.get_modifier(e); @@ -1351,7 +1282,7 @@ function rcube_webmail() && this.check_droptarget(k)) { li = this.get_folder_li(k); - div = $(li.getElementsByTagName("div")[0]); + div = $(li.getElementsByTagName('div')[0]); // if the folder is collapsed, expand it after 1sec and restart the drag & drop process. if (div.hasClass('collapsed')) { @@ -1360,7 +1291,7 @@ function rcube_webmail() this.folder_auto_expand = k; this.folder_auto_timer = window.setTimeout(function() { - rcmail.command("collapse-folder", rcmail.folder_auto_expand); + rcmail.command('collapse-folder', rcmail.folder_auto_expand); rcmail.drag_start(null); }, 1000); } else if (this.folder_auto_timer) { @@ -1382,46 +1313,87 @@ function rcube_webmail() }; this.collapse_folder = function(id) - { - var div; - if ((li = this.get_folder_li(id)) && - (div = $(li.getElementsByTagName("div")[0])) && - (div.hasClass('collapsed') || div.hasClass('expanded'))) - { - var ul = $(li.getElementsByTagName("ul")[0]); - if (div.hasClass('collapsed')) - { - ul.show(); - div.removeClass('collapsed').addClass('expanded'); - var reg = new RegExp('&'+urlencode(id)+'&'); - this.set_env('collapsed_folders', this.env.collapsed_folders.replace(reg, '')); - } + { + var li = this.get_folder_li(id); + var div = $(li.getElementsByTagName('div')[0]); + + if (!div || (!div.hasClass('collapsed') && !div.hasClass('expanded'))) + return; + + var ul = $(li.getElementsByTagName('ul')[0]); + if (div.hasClass('collapsed')) { + ul.show(); + div.removeClass('collapsed').addClass('expanded'); + var reg = new RegExp('&'+urlencode(id)+'&'); + this.set_env('collapsed_folders', this.env.collapsed_folders.replace(reg, '')); + } + else { + ul.hide(); + div.removeClass('expanded').addClass('collapsed'); + this.set_env('collapsed_folders', this.env.collapsed_folders+'&'+urlencode(id)+'&'); + + // select parent folder if one of its childs is currently selected + if (this.env.mailbox.indexOf(id + this.env.delimiter) == 0) + this.command('list', id); + } + + // Work around a bug in IE6 and IE7, see #1485309 + if (bw.ie6 || bw.ie7) { + var siblings = li.nextSibling ? li.nextSibling.getElementsByTagName('ul') : null; + if (siblings && siblings.length && (li = siblings[0]) && li.style && li.style.display != 'none') { + li.style.display = 'none'; + li.style.display = ''; + } + } + + this.http_post('save-pref', '_name=collapsed_folders&_value='+urlencode(this.env.collapsed_folders)); + this.set_unread_count_display(id, false); + }; + + this.doc_mouse_up = function(e) + { + var model, list, li; + + if (this.message_list) { + if (!rcube_mouse_is_over(e, this.message_list.list.parentNode)) + this.message_list.blur(); else - { - ul.hide(); - div.removeClass('expanded').addClass('collapsed'); - this.set_env('collapsed_folders', this.env.collapsed_folders+'&'+urlencode(id)+'&'); + this.message_list.focus(); + list = this.message_list; + model = this.env.mailboxes; + } + else if (this.contact_list) { + if (!rcube_mouse_is_over(e, this.contact_list.list.parentNode)) + this.contact_list.blur(); + else + this.contact_list.focus(); + list = this.contact_list; + model = this.env.contactfolders; + } + else if (this.ksearch_value) { + this.ksearch_blur(); + } - // select parent folder if one of its childs is currently selected - if (this.env.mailbox.indexOf(id + this.env.delimiter) == 0) - this.command('list', id); - } + // handle mouse release when dragging + if (this.drag_active && model && this.env.last_folder_target) { + var target = model[this.env.last_folder_target]; + + $(this.get_folder_li(this.env.last_folder_target)).removeClass('droptarget'); + this.env.last_folder_target = null; + list.draglayer.hide(); - // Work around a bug in IE6 and IE7, see #1485309 - if ((bw.ie6 || bw.ie7) && - li.nextSibling && - (li.nextSibling.getElementsByTagName("ul").length>0) && - li.nextSibling.getElementsByTagName("ul")[0].style && - (li.nextSibling.getElementsByTagName("ul")[0].style.display!='none')) - { - li.nextSibling.getElementsByTagName("ul")[0].style.display = 'none'; - li.nextSibling.getElementsByTagName("ul")[0].style.display = ''; - } + if (!this.drag_menu(e, target)) + this.command('moveto', target); + } - this.http_post('save-pref', '_name=collapsed_folders&_value='+urlencode(this.env.collapsed_folders)); - this.set_unread_count_display(id, false); - } + // reset 'pressed' buttons + if (this.buttons_sel) { + for (var id in this.buttons_sel) + if (typeof id != 'function') + this.button_out(this.buttons_sel[id], id); + this.buttons_sel = {}; } + }; this.click_on_list = function(e) { @@ -1433,7 +1405,7 @@ function rcube_webmail() else if (this.contact_list) this.contact_list.focus(); - return rcube_event.get_button(e) == 2 ? true : rcube_event.cancel(e); + return true; }; this.msglist_select = function(list) diff --git a/program/js/list.js b/program/js/list.js index ad640fb65..3e7bc6226 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -1159,6 +1159,8 @@ drag_mouse_up: function(e) this.draglayer.hide(); } + if (this.drag_active) + this.focus(); this.drag_active = false; rcube_event.remove_listener({event:'mousemove', object:this, method:'drag_mouse_move'}); @@ -1168,7 +1170,7 @@ drag_mouse_up: function(e) $('div.iframe-dragdrop-fix').each(function() { this.parentNode.removeChild(this); }); this.triggerEvent('dragend'); - + return rcube_event.cancel(e); }, diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 1cac61566..ad4ca2257 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -175,7 +175,6 @@ function rcmail_message_list($attrib) $message_count = $IMAP->messagecount(NULL, $IMAP->threading ? 'THREADS' : 'ALL'); // set client env - $OUTPUT->add_gui_object('mailcontframe', 'mailcontframe'); $OUTPUT->add_gui_object('messagelist', $attrib['id']); $OUTPUT->set_env('autoexpand_threads', intval($CONFIG['autoexpand_threads'])); $OUTPUT->set_env('messagecount', $message_count); |