From 6204390af16bcf50f82da61a1aefc2ad0c0adf94 Mon Sep 17 00:00:00 2001 From: thomascube <thomas@roundcube.net> Date: Mon, 01 May 2006 10:47:27 -0400 Subject: [PATCH] Applied patch for requesting receipts by Salvatore Ansani --- program/js/app.js | 194 ++++++++++++++++++++++++++++++++++++------------ 1 files changed, 146 insertions(+), 48 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index 715bad0..0a57469 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -7,12 +7,12 @@ | Licensed under the GNU GPL | | | +-----------------------------------------------------------------------+ - | Author: Thomas Bruederli <roundcube@gmail.com> | + | Authors: Thomas Bruederli <roundcube@gmail.com> | + | Charles McNulty <charles@charlesmcnulty.com> | +-----------------------------------------------------------------------+ $Id$ */ - // Constants var CONTROL_KEY = 1; var SHIFT_KEY = 2; @@ -28,6 +28,7 @@ this.gui_objects = new Object(); this.commands = new Object(); this.selection = new Array(); + this.last_selected = 0; // create public reference to myself rcube_webmail_client = this; @@ -121,7 +122,7 @@ } // enable mail commands - this.enable_command('list', 'compose', 'add-contact', true); + this.enable_command('list', 'compose', 'add-contact', 'search', 'reset-search', true); if (this.env.action=='show') { @@ -231,11 +232,11 @@ this.enable_command('logout', true); // disable browser's contextmenus - document.oncontextmenu = function(){ return false; } + // document.oncontextmenu = function(){ return false; } // load body click event document.onmousedown = function(){ return rcube_webmail_client.reset_click(); }; - document.onkeydown = function(e){ return rcube_webmail_client.use_arrow_keys(e, msg_list_frame); }; + document.onkeydown = function(e){ return rcube_webmail_client.key_pressed(e, msg_list_frame); }; // flag object as complete @@ -248,7 +249,7 @@ // start interval for keep-alive/recent_check signal if (this.kepp_alive_interval && this.task=='mail' && this.gui_objects.messagelist) this.kepp_alive_int = setInterval(this.ref+'.check_for_recent()', this.kepp_alive_interval); - else + else if (this.task!='login') this.kepp_alive_int = setInterval(this.ref+'.send_keep_alive()', this.kepp_alive_interval); }; @@ -265,46 +266,51 @@ this.in_message_list = true; e.cancelBubble = true; - if (e.stopPropagation) e.stopPropagation(); }; - // reset last clicked if user clicks on anything other than the message table - this.use_arrow_keys = function(e, msg_list_frame) { + this.key_pressed = function(e, msg_list_frame) { if (this.in_message_list != true) return true; - var keyCode = document.layers ? e.which : document.all ? event.keyCode : document.getElementById ? e.keyCode : 0; var mod_key = this.get_modifier(e); + switch (keyCode) { + case 40: + case 38: + return this.use_arrow_key(keyCode, mod_key, msg_list_frame); + break; + case 46: + return this.use_delete_key(keyCode, mod_key, msg_list_frame); + break; + default: + return true; + } + } + + this.use_arrow_key = function(keyCode, mod_key, msg_list_frame) { var scroll_to = 0; - - var last_selected_row = this.list_rows[this.last_selected]; - if (keyCode == 40) { // down arrow key pressed - var new_row = last_selected_row.obj.nextSibling; - while (new_row && new_row.nodeType != 1) { - new_row = new_row.nextSibling; - } + new_row = this.get_next_row(); if (!new_row) return false; scroll_to = (Number(new_row.offsetTop) + Number(new_row.offsetHeight)) - Number(msg_list_frame.offsetHeight); } else if (keyCode == 38) { // up arrow key pressed - var new_row = last_selected_row.obj.previousSibling; - while (new_row && new_row.nodeType != 1) { - new_row = new_row.previousSibling; - } + new_row = this.get_prev_row(); if (!new_row) return false; scroll_to = new_row.offsetTop; - } else {return false}; + } else {return true;} - if (mod_key != CONTROL_KEY) - this.select_row(new_row.uid,mod_key); + this.select_row(new_row.uid,mod_key,true); if (((Number(new_row.offsetTop)) < (Number(msg_list_frame.scrollTop))) || ((Number(new_row.offsetTop) + Number(new_row.offsetHeight)) > (Number(msg_list_frame.scrollTop) + Number(msg_list_frame.offsetHeight)))) { msg_list_frame.scrollTop = scroll_to; } - return false; }; + + this.use_delete_key = function(keyCode, mod_key, msg_list_frame){ + this.command('delete','',this); + return false; + } // get all message rows from HTML table and init each row this.init_messagelist = function(msg_list) @@ -574,7 +580,11 @@ // misc list commands case 'list': if (this.task=='mail') + { + if (this.env.search_request<0 || (this.env.search_request && props != this.env.mailbox)) + this.reset_qsearch(); this.list_mailbox(props); + } else if (this.task=='addressbook') this.list_contacts(); break; @@ -831,14 +841,17 @@ } else if (props) url += '&_to='+props; - + // don't know if this is necessary... url = url.replace(/&_framed=1/, ""); this.set_busy(true); // need parent in case we are coming from the contact frame - parent.window.location.href = url; + if (this.env.framed) + parent.location.href = url; + else + location.href = url; break; case 'send': @@ -904,6 +917,22 @@ this.add_contact(props); break; + // mail quicksearch + case 'search': + if (!props && this.gui_objects.qsearchbox) + props = this.gui_objects.qsearchbox.value; + if (props) + this.qsearch(escape(props), this.env.mailbox); + break; + + // reset quicksearch + case 'reset-search': + var s = this.env.search_request; + this.reset_qsearch(); + + if (s) + this.list_mailbox(this.env.mailbox); + break; // ldap search case 'ldappublicsearch': @@ -1073,7 +1102,7 @@ if (!this.in_selection_before) { var mod_key = this.get_modifier(e); - this.select_row(id,mod_key); + this.select_row(id,mod_key,false); } if (this.selection.length) @@ -1090,6 +1119,7 @@ // onmouseup-handler of message list row this.click_row = function(e, id) { + var mod_key = this.get_modifier(e); // don't do anything (another action processed before) if (this.dont_select) @@ -1099,15 +1129,14 @@ } // unselects currently selected row - if (!this.drag_active && this.in_selection_before==id) { - var mod_key = this.get_modifier(e); - this.select_row(id,mod_key); - } + if (!this.drag_active && this.in_selection_before==id) + this.select_row(id,mod_key,false); + this.drag_start = false; this.in_selection_before = false; // row was double clicked - if (this.task=='mail' && this.list_rows && this.list_rows[id].clicked) + if (this.task=='mail' && this.list_rows && this.list_rows[id].clicked && !mod_key) { this.show_message(id); return false; @@ -1175,6 +1204,25 @@ /********* (message) list functionality *********/ /*********************************************************/ + // get next and previous rows that are not hidden + this.get_next_row = function(){ + var last_selected_row = this.list_rows[this.last_selected]; + var new_row = last_selected_row.obj.nextSibling; + while (new_row && (new_row.nodeType != 1 || new_row.style.display == 'none')) { + new_row = new_row.nextSibling; + } + return new_row; + } + + this.get_prev_row = function(){ + var last_selected_row = this.list_rows[this.last_selected]; + var new_row = last_selected_row.obj.previousSibling; + while (new_row && (new_row.nodeType != 1 || new_row.style.display == 'none')) { + new_row = new_row.previousSibling; + } + return new_row; + } + // highlight/unhighlight a row this.highlight_row = function(id, multiple) { @@ -1193,7 +1241,7 @@ if (!this.in_selection(id)) // select row { this.selection[this.selection.length] = id; - this.set_classname(this.list_rows[id].obj, 'selected', true); + this.set_classname(this.list_rows[id].obj, 'selected', true); } else // unselect row { @@ -1221,7 +1269,7 @@ // selects or unselects the proper row depending on the modifier key pressed - this.select_row = function(id,mod_key) { + this.select_row = function(id,mod_key,with_arrow) { if (!mod_key) { this.shift_start = id; this.highlight_row(id, false); @@ -1232,7 +1280,8 @@ break; } case CONTROL_KEY: { this.shift_start = id; - this.highlight_row(id, true); + if (!with_arrow) + this.highlight_row(id, true); break; } case CONTROL_SHIFT_KEY: { @@ -1245,7 +1294,9 @@ } } } - this.last_selected = id; + if (this.last_selected != 0) { this.set_classname(this.list_rows[this.last_selected].obj, 'focused', false);} + this.last_selected = id; + this.set_classname(this.list_rows[id].obj, 'focused', true); }; this.shift_select = function(id, control) { @@ -1350,6 +1401,7 @@ // list messages of a specific mailbox this.list_mailbox = function(mbox, page, sort) { + this.last_selected = 0; var add_url = ''; var target = window; @@ -1368,6 +1420,10 @@ this.env.current_page = page; this.clear_selection(); } + + // also send search request to get the right messages + if (this.env.search_request) + add_url += '&_search='+this.env.search_request; if (this.env.mailbox!=mbox) this.select_mailbox(mbox); @@ -1484,6 +1540,10 @@ if (this.message_rows[id].obj) this.message_rows[id].obj.style.display = 'none'; } + next_row = this.get_next_row(); + prev_row = this.get_prev_row(); + new_row = (next_row) ? next_row : prev_row; + this.select_row(new_row.uid,false,false); } var lock = false; @@ -1524,6 +1584,10 @@ this.message_rows[id].obj.style.display = 'none'; } } + next_row = this.get_next_row(); + prev_row = this.get_prev_row(); + new_row = (next_row) ? next_row : prev_row; + this.select_row(new_row.uid,false,false); // send request to server this.http_request('delete', '_uid='+a_uids.join(',')+'&_mbox='+escape(this.env.mailbox)+'&_from='+(this.env.action ? this.env.action : '')); @@ -1803,6 +1867,26 @@ this.http_request('addcontact', '_address='+value); }; + // send remote request to search mail + this.qsearch = function(value, mbox) + { + if (value && mbox) + { + this.clear_message_list(); + this.set_busy(true, 'searching'); + this.http_request('search', '_search='+value+'&_mbox='+mbox, true); + } + }; + + // reset quick-search form + this.reset_qsearch = function() + { + if (this.gui_objects.qsearchbox) + this.gui_objects.qsearchbox.value = ''; + + this.env.search_request = null; + }; + /*********************************************************/ /********* keyboard live-search methods *********/ @@ -2658,7 +2742,7 @@ { if (!this.gui_objects.mailboxlist) return false; - + var item, reg, text_obj; mbox = String(mbox).toLowerCase().replace(this.mbox_expression, ''); item = document.getElementById('rcmbx'+mbox); @@ -2681,10 +2765,10 @@ } // set unread count to window title - if ((set_title || mbox==this.env.mailbox) && document.title) + reg = /^\([0-9]+\)\s+/i; + if (set_title && count && document.title) { var doc_title = String(document.title); - reg = /^\([0-9]+\)\s+/i; if (count && doc_title.match(reg)) document.title = doc_title.replace(reg, '('+count+') '); @@ -2692,6 +2776,11 @@ document.title = '('+count+') '+doc_title; else document.title = doc_title.replace(reg, ''); + } + // remove unread count from window title + else if (document.title) + { + document.title = document.title.replace(reg, ''); } }; @@ -2930,6 +3019,8 @@ }; +/* deprecated methods + // check if Shift-key is pressed on event this.check_shiftkey = function(e) { @@ -2959,22 +3050,29 @@ else return false; } +*/ - -// returns modifier key (constants defined at top of file) + // returns modifier key (constants defined at top of file) this.get_modifier = function(e) { var opcode = 0; - if (e = e || window.event) - { + e = e || window.event; + + if (bw.mac && e) + { + opcode += (e.metaKey && CONTROL_KEY) + (e.shiftKey && SHIFT_KEY); + return opcode; + } + if (e) + { opcode += (e.ctrlKey && CONTROL_KEY) + (e.shiftKey && SHIFT_KEY); - return opcode; - } + return opcode; + } if (e.cancelBubble) - { + { e.cancelBubble = true; e.returnValue = false; - } + } else if (e.preventDefault) e.preventDefault(); } -- Gitblit v1.9.1