From ed5d29f4b3c57235594931d33dde7cccaf7cd58b Mon Sep 17 00:00:00 2001 From: thomascube <thomas@roundcube.net> Date: Thu, 25 May 2006 14:25:04 -0400 Subject: [PATCH] Finalized GoogieSpell integration --- program/js/app.js | 233 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 172 insertions(+), 61 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index cd5eb96..98a30d3 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -29,6 +29,7 @@ this.commands = new Object(); this.selection = new Array(); this.last_selected = 0; + this.in_message_list = false; // create public reference to myself rcube_webmail_client = this; @@ -141,7 +142,11 @@ } if (this.env.action=='compose') + { this.enable_command('add-attachment', 'send-attachment', 'send', true); + if (this.env.spellcheck) + this.enable_command('spellcheck', true); + } if (this.env.messagecount) this.enable_command('select-all', 'select-none', 'sort', 'expunge', true); @@ -254,15 +259,29 @@ }; // reset last clicked if user clicks on anything other than the message table - this.reset_click = function() - { - this.in_message_list = false; - }; + this.reset_click = function() { + this.in_message_list = false; + for (var n=0; n<this.selection.length; n++) { + id = this.selection[n]; + if (this.list_rows[id].obj) { + this.set_classname(this.list_rows[id].obj, 'selected', false); + this.set_classname(this.list_rows[id].obj, 'unfocused', true); + } + } + }; this.click_on_list = function(e) { if (!e) e = window.event; + + for (var n=0; n<this.selection.length; n++) { + id = this.selection[n]; + if (this.list_rows[id].obj) { + this.set_classname(this.list_rows[id].obj, 'selected', true); + this.set_classname(this.list_rows[id].obj, 'unfocused', false); + } + } this.in_message_list = true; e.cancelBubble = true; @@ -274,6 +293,9 @@ 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 13: + this.command('show','',this); + break; case 40: case 38: return this.use_arrow_key(keyCode, mod_key, msg_list_frame); @@ -284,6 +306,7 @@ default: return true; } + return true; } this.use_arrow_key = function(keyCode, mod_key, msg_list_frame) { @@ -324,8 +347,12 @@ for(var r=0; r<msg_list.tBodies[0].childNodes.length; r++) { row = msg_list.tBodies[0].childNodes[r]; + while (row && (row.nodeType != 1 || row.style.display == 'none')) { + row = row.nextSibling; + r++; + } //row = msg_list.tBodies[0].rows[r]; - this.init_message_row(row); + if (row) this.init_message_row(row); } } @@ -852,7 +879,12 @@ parent.location.href = url; else location.href = url; - break; + break; + + case 'spellcheck': + if (this.env.spellcheck && this.env.spellcheck.spellCheck) + this.env.spellcheck.spellCheck(this.env.spellcheck.check_link); + break; case 'send': if (!this.gui_objects.messageform) @@ -985,7 +1017,7 @@ // set command enabled or disabled this.enable_command = function() { - var args = this.enable_command.arguments; + var args = arguments; if(!args.length) return -1; var command; @@ -997,6 +1029,7 @@ this.commands[command] = enable; this.set_button(command, (enable ? 'act' : 'pas')); } + return true; }; @@ -1099,7 +1132,7 @@ return false; // selects currently unselected row - if (!this.in_selection_before) + if (!this.in_selection_before && !this.list_rows[id].clicked) { var mod_key = this.get_modifier(e); this.select_row(id,mod_key,false); @@ -1129,14 +1162,14 @@ } // unselects currently selected row - if (!this.drag_active && this.in_selection_before==id) + if (!this.drag_active && this.in_selection_before==id && !this.list_rows[id].clicked) 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 && !mod_key) + if (this.task=='mail' && this.list_rows && this.list_rows[id].clicked && this.in_selection(id)) { this.show_message(id); return false; @@ -1206,6 +1239,7 @@ // get next and previous rows that are not hidden this.get_next_row = function(){ + if (!this.list_rows) return false; 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')) { @@ -1215,6 +1249,7 @@ } this.get_prev_row = function(){ + if (!this.list_rows) return false; 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')) { @@ -1241,7 +1276,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 { @@ -1250,6 +1285,7 @@ var a_post = this.selection.slice(p+1, this.selection.length); this.selection = a_pre.concat(a_post); this.set_classname(this.list_rows[id].obj, 'selected', false); + this.set_classname(this.list_rows[id].obj, 'unfocused', false); } selected = (this.selection.length==1); } @@ -1322,9 +1358,10 @@ this.clear_selection = function() { for(var n=0; n<this.selection.length; n++) - if (this.list_rows[this.selection[n]]) + if (this.list_rows[this.selection[n]]) { this.set_classname(this.list_rows[this.selection[n]].obj, 'selected', false); - + this.set_classname(this.list_rows[this.selection[n]].obj, 'unfocused', false); + } this.selection = new Array(); }; @@ -1349,9 +1386,11 @@ // reset selection first this.clear_selection(); - for (var n in this.list_rows) + for (var n in this.list_rows) { if (!filter || this.list_rows[n][filter]==true) - this.highlight_row(n, true); + this.highlight_row(n, true); + } + return true; }; @@ -1514,6 +1553,7 @@ // send request to server var url = '_mbox='+escape(mbox); this.http_request('purge', url+add_url, lock); + return true; }; @@ -1543,7 +1583,7 @@ 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); + if (new_row) this.select_row(new_row.uid,false,false); } var lock = false; @@ -1584,7 +1624,7 @@ 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); + if (new_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 : '')); @@ -1605,11 +1645,16 @@ this.permanently_remove_messages(); // if there isn't a defined trash mailbox and the config is set to flag for deletion else if (!this.env.trash_mailbox && this.env.flag_for_deletion) { - this.mark_message('delete'); - 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); + flag = 'delete'; + this.mark_message(flag); + if(this.env.action=="show"){ + this.command('nextmessage','',this); + } else if (this.selection.length == 1) { + next_row = this.get_next_row(); + prev_row = this.get_prev_row(); + new_row = (next_row) ? next_row : prev_row; + if (new_row) this.select_row(new_row.uid,false,false); + } // if there isn't a defined trash mailbox and the config is set NOT to flag for deletion }else if (!this.env.trash_mailbox && !this.env.flag_for_deletion) { this.permanently_remove_messages(); @@ -1643,11 +1688,9 @@ break; case 'delete': case 'undelete': - this.toggle_delete_status(flag,a_uids); + this.toggle_delete_status(a_uids); break; } - // send request to server - this.http_request('mark', '_uid='+a_uids.join(',')+'&_flag='+flag); }; // set class to read/unread @@ -1684,49 +1727,98 @@ this.message_rows[uid].icon.src = icn_src; } } + this.http_request('mark', '_uid='+a_uids.join(',')+'&_flag='+flag); } // mark all message rows as deleted/undeleted - this.toggle_delete_status = function(flag, a_uids) { + this.toggle_delete_status = function(a_uids) { if (this.env.read_when_deleted) { this.toggle_read_status('read',a_uids); } + // if deleting message from "view message" don't bother with delete icon + if (this.env.action == "show") + return false; - var icn_src; - for (var i=0; i<a_uids.length; i++) - { + if (a_uids.length==1){ + if(this.message_rows[a_uids[0]].classname.indexOf('deleted') < 0 ){ + this.flag_as_deleted(a_uids) + } else { + this.flag_as_undeleted(a_uids) + } + return true; + } + + var all_deleted = true; + + for (var i=0; i<a_uids.length; i++) { uid = a_uids[i]; - if (this.message_rows[uid]) - { - this.message_rows[uid].deleted = (flag=='undelete' ? false : true); - - if (this.message_rows[uid].classname.indexOf('deleted')<0 && this.message_rows[uid].deleted) - { - this.message_rows[uid].classname += ' deleted'; - this.set_classname(this.message_rows[uid].obj, 'deleted', true); - - if (this.env.deletedicon) - icn_src = this.env.deletedicon; - } - else if (!this.message_rows[uid].deleted) - { - this.message_rows[uid].classname = this.message_rows[uid].classname.replace(/\s*deleted/, ''); - this.set_classname(this.message_rows[uid].obj, 'deleted', false); - - if (this.message_rows[uid].unread && this.env.unreadicon) - icn_src = this.env.unreadicon; - else if (this.message_rows[uid].replied && this.env.repliedicon) - icn_src = this.env.repliedicon; - else if (this.env.messageicon) - icn_src = this.env.messageicon; - } - - if (this.message_rows[uid].icon && icn_src) - this.message_rows[uid].icon.src = icn_src; + if (this.message_rows[uid]) { + if (this.message_rows[uid].classname.indexOf('deleted')<0) { + all_deleted = false; + break; } } + } + + if (all_deleted) + this.flag_as_undeleted(a_uids); + else + this.flag_as_deleted(a_uids); + + return true; } + this.flag_as_undeleted = function(a_uids){ + // if deleting message from "view message" don't bother with delete icon + if (this.env.action == "show") + return false; + + var icn_src; + + for (var i=0; i<a_uids.length; i++) { + uid = a_uids[i]; + if (this.message_rows[uid]) { + this.message_rows[uid].deleted = false; + + if (this.message_rows[uid].classname.indexOf('deleted') > 0) { + this.message_rows[uid].classname = this.message_rows[uid].classname.replace(/\s*deleted/, ''); + this.set_classname(this.message_rows[uid].obj, 'deleted', false); + } + if (this.message_rows[uid].unread && this.env.unreadicon) + icn_src = this.env.unreadicon; + else if (this.message_rows[uid].replied && this.env.repliedicon) + icn_src = this.env.repliedicon; + else if (this.env.messageicon) + icn_src = this.env.messageicon; + if (this.message_rows[uid].icon && icn_src) + this.message_rows[uid].icon.src = icn_src; + } + } + this.http_request('mark', '_uid='+a_uids.join(',')+'&_flag=undelete'); + return true; + } + + this.flag_as_deleted = function(a_uids) { + // if deleting message from "view message" don't bother with delete icon + if (this.env.action == "show") + return false; + + for (var i=0; i<a_uids.length; i++) { + uid = a_uids[i]; + if (this.message_rows[uid]) { + this.message_rows[uid].deleted = true; + + if (this.message_rows[uid].classname.indexOf('deleted')<0) { + this.message_rows[uid].classname += ' deleted'; + this.set_classname(this.message_rows[uid].obj, 'deleted', true); + } + if (this.message_rows[uid].icon && this.env.deletedicon) + this.message_rows[uid].icon.src = this.env.deletedicon; + } + } + this.http_request('mark', '_uid='+a_uids.join(',')+'&_flag=delete'); + return true; + } /*********************************************************/ /********* message compose methods *********/ @@ -1840,6 +1932,7 @@ input_message.value = message; this.env.identity = id; + return true; }; @@ -1867,6 +1960,8 @@ // clear upload form if (!a && this.gui_objects.attachmentform && this.gui_objects.attachmentform!=this.gui_objects.messageform) this.gui_objects.attachmentform.reset(); + + return true; }; @@ -1916,6 +2011,7 @@ // set reference to the form object this.gui_objects.attachmentform = form; + return true; }; @@ -1929,6 +2025,7 @@ var li = document.createElement('LI'); li.innerHTML = name; this.gui_objects.attachmentlist.appendChild(li); + return true; }; @@ -1937,6 +2034,8 @@ { if (value) this.http_request('addcontact', '_address='+value); + + return true; }; // send remote request to search mail @@ -1948,6 +2047,7 @@ this.set_busy(true, 'searching'); this.http_request('search', '_search='+value+'&_mbox='+mbox, true); } + return true; }; // reset quick-search form @@ -1957,6 +2057,7 @@ this.gui_objects.qsearchbox.value = ''; this.env.search_request = null; + return true; }; @@ -1999,6 +2100,7 @@ highlight.removeAttribute('id'); //highlight.removeAttribute('class'); this.set_classname(highlight, 'selected', false); + this.set_classname(highlight, 'unfocused', false); } if (next) @@ -2258,6 +2360,7 @@ this.set_busy(true); target.location.href = this.env.comm_path+'&_action='+action+'&_cid='+cid+add_url; } + return true; }; @@ -2294,6 +2397,7 @@ // send request to server this.http_request('delete', '_cid='+a_cids.join(',')+'&_from='+(this.env.action ? this.env.action : '')); + return true; }; @@ -2304,10 +2408,11 @@ return false; var row = this.contact_rows[cid].obj; - for (var c=0; c<cols_arr.length; c++) + for (var c=0; c<cols_arr.length; c++){ if (row.cells[c]) row.cells[c].innerHTML = cols_arr[c]; - + } + return true; }; @@ -2328,6 +2433,8 @@ if (action == 'ldappublicsearch') target.location.href = this.env.comm_path+'&_action='+action+add_url; + + return true; }; // add ldap contacts to address book @@ -2365,7 +2472,7 @@ this.load_identity = function(id, action) { if (action=='edit-identity' && (!id || id==this.env.iid)) - return; + return false; var add_url = ''; var target = window; @@ -2381,6 +2488,7 @@ this.set_busy(true); target.location.href = this.env.comm_path+'&_action='+action+'&_iid='+id+add_url; } + return true; }; @@ -2405,9 +2513,10 @@ // if (this.env.framed && id) this.set_busy(true); - location.href = this.env.comm_path+'&_action=delete-identity&_iid='+id; + location.href = this.env.comm_path+'&_action=delete-identity&_iid='+id; // else if (id) // this.http_request('delete-identity', '_iid='+id); + return true; }; @@ -2730,8 +2839,10 @@ var current_li = document.getElementById('rcmbx'+s_current); var mbox_li = document.getElementById('rcmbx'+s_mbox); - if (current_li) + if (current_li) { this.set_classname(current_li, 'selected', false); + this.set_classname(current_li, 'unfocused', false); + } if (mbox_li) this.set_classname(mbox_li, 'selected', true); } -- Gitblit v1.9.1