From c17dc6aa31aaa6e7f61bd25993be55354e428996 Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Sat, 20 Sep 2008 13:21:15 -0400 Subject: [PATCH] #1485385: fix missing close form tag --- program/js/app.js | 617 ++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 374 insertions(+), 243 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index d64b58c..d1341c7 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -122,6 +122,9 @@ // enable general commands this.enable_command('logout', 'mail', 'addressbook', 'settings', true); + if (this.env.permaurl) + this.enable_command('permaurl', true); + switch (this.task) { case 'mail': @@ -133,6 +136,7 @@ this.message_list.addEventListener('keypress', function(o){ p.msglist_keypress(o); }); this.message_list.addEventListener('select', function(o){ p.msglist_select(o); }); this.message_list.addEventListener('dragstart', function(o){ p.drag_active = true; if (p.preview_timer) clearTimeout(p.preview_timer); }); + this.message_list.addEventListener('dragmove', function(o, e){ p.drag_move(e); }); this.message_list.addEventListener('dragend', function(o){ p.drag_active = false; }); this.message_list.init(); @@ -158,7 +162,7 @@ if (this.env.action=='show' || this.env.action=='preview') { - this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', 'mark', 'viewsource', 'print', 'load-attachment', true); + this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', 'mark', 'viewsource', 'print', 'load-attachment', 'load-headers', true); if (this.env.next_uid) { this.enable_command('nextmessage', true); @@ -205,19 +209,10 @@ if (this.env.messagecount) this.enable_command('select-all', 'select-none', 'expunge', true); - if (this.env.messagecount - && (this.env.mailbox == this.env.trash_mailbox || this.env.mailbox == this.env.junk_mailbox - || this.env.mailbox.match('^' + RegExp.escape(this.env.trash_mailbox) + RegExp.escape(this.env.delimiter)) - || this.env.mailbox.match('^' + RegExp.escape(this.env.junk_mailbox) + RegExp.escape(this.env.delimiter)))) + if (this.purge_mailbox_test()) this.enable_command('purge', true); this.set_page_buttons(); - - // focus main window - if (this.env.framed && window.parent) - window.parent.focus(); - else - window.focus(); // init message compose form if (this.env.action=='compose') @@ -255,6 +250,7 @@ this.contact_list.addEventListener('keypress', function(o){ p.contactlist_keypress(o); }); this.contact_list.addEventListener('select', function(o){ p.contactlist_select(o); }); this.contact_list.addEventListener('dragstart', function(o){ p.drag_active = true; }); + this.contact_list.addEventListener('dragmove', function(o, e){ p.drag_move(e); }); this.contact_list.addEventListener('dragend', function(o){ p.drag_active = false; }); this.contact_list.init(); @@ -281,7 +277,10 @@ if ((this.env.action=='add' || this.env.action=='edit') && this.gui_objects.editform) this.enable_command('save', true); else - this.enable_command('search', 'reset-search', 'moveto', true); + this.enable_command('search', 'reset-search', 'moveto', 'import', true); + + if (this.contact_list && this.contact_list.rowcount > 0) + this.enable_command('export', true); this.enable_command('list', true); break; @@ -290,8 +289,10 @@ case 'settings': this.enable_command('preferences', 'identities', 'save', 'folders', true); - if (this.env.action=='identities' || this.env.action=='edit-identity' || this.env.action=='add-identity') - this.enable_command('edit', 'add', 'delete', true); + if (this.env.action=='identities' || this.env.action=='edit-identity' || this.env.action=='add-identity') { + this.enable_command('add', 'delete', this.env.multiple_identities); + this.enable_command('edit', true); + } if (this.env.action=='edit-identity' || this.env.action=='add-identity') this.enable_command('save', true); @@ -318,13 +319,19 @@ case 'login': var input_user = rcube_find_object('rcmloginuser'); var input_pass = rcube_find_object('rcmloginpwd'); + var input_tz = rcube_find_object('rcmlogintz'); + if (input_user) input_user.onkeyup = function(e){ return rcmail.login_user_keyup(e); }; if (input_user && input_user.value=='') input_user.focus(); else if (input_pass) input_pass.focus(); - + + // detect client timezone + if (input_tz) + input_tz.value = new Date().getTimezoneOffset() / -60; + this.enable_command('login', true); break; @@ -377,6 +384,7 @@ row.unread = this.env.messages[uid].unread ? true : false; row.replied = this.env.messages[uid].replied ? true : false; row.flagged = this.env.messages[uid].flagged ? true : false; + row.forwarded = this.env.messages[uid].forwarded ? true : false; } // set eventhandler to message icon @@ -502,7 +510,6 @@ return false; } - // process command switch (command) { @@ -522,6 +529,12 @@ this.switch_task(command); break; + case 'permaurl': + if (obj && obj.href && obj.target) + return true; + else if (this.env.permaurl) + parent.location.href = this.env.permaurl; + break; // misc list commands case 'list': @@ -543,6 +556,11 @@ this.list_contacts(props); this.enable_command('add', (this.env.address_sources && !this.env.address_sources[props].readonly)); } + break; + + + case 'load-headers': + this.load_headers(obj); break; @@ -740,7 +758,6 @@ if (props._row.uid) { uid = props._row.uid; - this.message_list.dont_select = true; // toggle flagged/unflagged if (this.message_list.rows[uid].flagged) flag = 'unflagged'; @@ -972,7 +989,7 @@ break; } - // reset quicksearch + // reset quicksearch case 'reset-search': var s = this.env.search_request; this.reset_qsearch(); @@ -981,6 +998,31 @@ this.list_mailbox(this.env.mailbox); else if (s && this.task == 'addressbook') this.list_contacts(this.env.source); + break; + + case 'import': + if (this.env.action == 'import' && this.gui_objects.importform) { + var file = document.getElementById('rcmimportfile'); + if (file && !file.value) { + alert(this.get_label('selectimportfile')); + break; + } + this.gui_objects.importform.submit(); + this.set_busy(true, 'importwait'); + this.lock_form(this.gui_objects.importform, true); + } + else + this.goto_url('import'); + break; + + case 'export': + if (this.contact_list.rowcount > 0) { + var add_url = (this.env.source ? '_source='+urlencode(this.env.source)+'&' : ''); + if (this.env.search_request) + add_url += '_search='+this.env.search_request; + + this.goto_url('export', add_url); + } break; // collapse/expand folder @@ -1127,27 +1169,43 @@ this.doc_mouse_up = function(e) - { - if (this.message_list) + { + var model, li; + + if (this.message_list) { this.message_list.blur(); - else if (this.contact_list) + model = this.env.mailboxes; + } + else if (this.contact_list) { this.contact_list.blur(); - }; - - this.focus_folder = function(id) - { - var li; - if (this.drag_active && this.check_droptarget(id) && (li = this.get_folder_li(id))) - this.set_classname(li, 'droptarget', true); + model = this.env.address_sources; } - - this.unfocus_folder = function(id) - { - var li; - if (this.drag_active && (li = this.get_folder_li(id))) - this.set_classname(li, 'droptarget', false); + + // handle mouse release when dragging + if (this.drag_active && model) { + for (var k in model) { + if ((li = this.get_folder_li(k)) && rcube_mouse_is_over(e, li.firstChild) && this.check_droptarget(k)) { + this.set_classname(li, 'droptarget', false); + this.command('moveto', model[k].id); + break; + } + } } + }; + this.drag_move = function(e) + { + var li; + var model = this.task == 'mail' ? this.env.mailboxes : this.env.address_sources; + + if (this.gui_objects.folderlist && model) { + for (var k in model) { + if (li = this.get_folder_li(k)) + this.set_classname(li, 'droptarget', (rcube_mouse_is_over(e, li.firstChild) && this.check_droptarget(k))); + } + } + }; + this.collapse_folder = function(id) { var div; @@ -1175,20 +1233,22 @@ 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) && + 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 = ''; + } + this.http_post('save-pref', '_name=collapsed_folders&_value='+escape(this.env.collapsed_folders)); this.set_unread_count_display(id, false); } } - - // onmouseup handler for folder list item - this.folder_mouse_up = function(id) - { - if (this.drag_active) - { - this.unfocus_folder(id); - this.command('moveto', id); - } - }; this.click_on_list = function(e) { @@ -1201,7 +1261,7 @@ if (mbox_li = this.get_folder_li()) this.set_classname(mbox_li, 'unfocused', true); - rcube_event.cancel(e); + return rcube_event.get_button(e) == 2 ? true : rcube_event.cancel(e); }; @@ -1252,6 +1312,8 @@ this.command('show'); else if (list.key_pressed == list.DELETE_KEY) this.command('delete'); + else if (list.key_pressed == list.BACKSPACE_KEY) + this.command('delete'); else list.shiftkey = false; }; @@ -1270,7 +1332,7 @@ this.check_droptarget = function(id) { if (this.task == 'mail') - return (id != this.env.mailbox); + return (this.env.mailboxes[id] && this.env.mailboxes[id].id != this.env.mailbox && !this.env.mailboxes[id].virtual); else if (this.task == 'addressbook') return (id != this.env.source && this.env.address_sources[id] && !this.env.address_sources[id].readonly); else if (this.task == 'settings') @@ -1281,7 +1343,6 @@ /*********************************************************/ /********* (message) list functionality *********/ /*********************************************************/ - // when user doble-clicks on a row this.show_message = function(id, safe, preview) @@ -1469,7 +1530,107 @@ return true; }; - + // test if purge command is allowed + this.purge_mailbox_test = function() + { + return (this.env.messagecount && (this.env.mailbox == this.env.trash_mailbox || this.env.mailbox == this.env.junk_mailbox + || this.env.mailbox.match('^' + RegExp.escape(this.env.trash_mailbox) + RegExp.escape(this.env.delimiter)) + || this.env.mailbox.match('^' + RegExp.escape(this.env.junk_mailbox) + RegExp.escape(this.env.delimiter)))); + }; + + // set message icon + this.set_message_icon = function(uid) + { + var icn_src; + var rows = this.message_list.rows; + + if (!rows[uid]) + return false; + + if (rows[uid].deleted && this.env.deletedicon) + icn_src = this.env.deletedicon; + else if (rows[uid].replied && this.env.repliedicon) + { + if (rows[uid].forwarded && this.env.forwardedrepliedicon) + icn_src = this.env.forwardedrepliedicon; + else + icn_src = this.env.repliedicon; + } + else if (rows[uid].forwarded && this.env.forwardedicon) + icn_src = this.env.forwardedicon; + else if (rows[uid].unread && this.env.unreadicon) + icn_src = this.env.unreadicon; + else if (this.env.messageicon) + icn_src = this.env.messageicon; + + if (icn_src && rows[uid].icon) + rows[uid].icon.src = icn_src; + + icn_src = ''; + + if (rows[uid].flagged && this.env.flaggedicon) + icn_src = this.env.flaggedicon; + else if (this.env.unflaggedicon) + icn_src = this.env.unflaggedicon; + + if (rows[uid].flagged_icon && icn_src) + rows[uid].flagged_icon.src = icn_src; + } + + // set message status + this.set_message_status = function(uid, flag, status) + { + var rows = this.message_list.rows; + + if (!rows[uid]) return false; + + if (flag == 'unread') + rows[uid].unread = status; + else if(flag == 'deleted') + rows[uid].deleted = status; + else if (flag == 'replied') + rows[uid].replied = status; + else if (flag == 'forwarded') + rows[uid].forwarded = status; + else if (flag == 'flagged') + rows[uid].flagged = status; + } + + // set message row status, class and icon + this.set_message = function(uid, flag, status) + { + var rows = this.message_list.rows; + + if (!rows[uid]) return false; + + if (flag) + this.set_message_status(uid, flag, status); + + if (rows[uid].unread && rows[uid].classname.indexOf('unread')<0) + { + rows[uid].classname += ' unread'; + this.set_classname(rows[uid].obj, 'unread', true); + } + else if (!rows[uid].unread && rows[uid].classname.indexOf('unread')>=0) + { + rows[uid].classname = rows[uid].classname.replace(/\s*unread/, ''); + this.set_classname(rows[uid].obj, 'unread', false); + } + + if (rows[uid].deleted && rows[uid].classname.indexOf('deleted')<0) + { + rows[uid].classname += ' deleted'; + this.set_classname(rows[uid].obj, 'deleted', true); + } + else if (!rows[uid].deleted && rows[uid].classname.indexOf('deleted')>=0) + { + rows[uid].classname = rows[uid].classname.replace(/\s*deleted/, ''); + this.set_classname(rows[uid].obj, 'deleted', false); + } + + this.set_message_icon(uid); + } + // move selected messages to the specified mailbox this.move_messages = function(mbox) { @@ -1568,20 +1729,9 @@ else { rows[id].deleted = true; - - if (rows[id].classname.indexOf('deleted')<0) - { - rows[id].classname += ' deleted'; - this.set_classname(rows[id].obj, 'deleted', true); - } if (this.env.read_when_deleted) - { - rows[id].classname = rows[id].classname.replace(/\s*unread/, ''); - this.set_classname(rows[id].obj, 'unread', false); - } - - if (rows[id].icon && this.env.deletedicon) - rows[id].icon.src = this.env.deletedicon; + rows[id].unread = false; + this.set_message(id); } } } @@ -1656,88 +1806,18 @@ this.toggle_read_status = function(flag, a_uids) { // mark all message rows as read/unread - var icn_src; - var rows = this.message_list.rows; for (var i=0; i<a_uids.length; i++) - { - uid = a_uids[i]; - if (rows[uid]) - { - rows[uid].unread = (flag=='unread' ? true : false); - - if (rows[uid].classname.indexOf('unread')<0 && rows[uid].unread) - { - rows[uid].classname += ' unread'; - this.set_classname(rows[uid].obj, 'unread', true); - - if (this.env.unreadicon) - icn_src = this.env.unreadicon; - } - else if (!rows[uid].unread) - { - rows[uid].classname = rows[uid].classname.replace(/\s*unread/, ''); - this.set_classname(rows[uid].obj, 'unread', false); - - if (this.env.messageicon) - icn_src = this.env.messageicon; - } - - if (rows[uid].icon && icn_src - && !(rows[uid].replied && this.env.repliedicon) - && !(rows[uid].deleted && this.env.deletedicon)) - rows[uid].icon.src = icn_src; - } - } + this.set_message(a_uids[i], 'unread', (flag=='unread' ? true : false)); this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag); }; - // set class to read/unread - this.mark_as_read_from_preview = function(uid) - { - var icn_src; - var rows = parent.rcmail.message_list.rows; - if(rows[uid].unread) - { - rows[uid].unread = false; - rows[uid].classname = rows[uid].classname.replace(/\s*unread/, ''); - parent.rcmail.set_classname(rows[uid].obj, 'unread', false); - - if (rows[uid].replied && parent.rcmail.env.repliedicon) - icn_src = parent.rcmail.env.repliedicon; - else if (rows[uid].deleted && parent.rcmail.env.deletedicon) - icn_src = parent.rcmail.env.deletedicon; - else if (parent.rcmail.env.messageicon) - icn_src = parent.rcmail.env.messageicon; - - if (rows[uid].icon && icn_src) - rows[uid].icon.src = icn_src; - } - } - - // set image to flagged or unflagged this.toggle_flagged_status = function(flag, a_uids) { // mark all message rows as flagged/unflagged - var icn_src; - var rows = this.message_list.rows; for (var i=0; i<a_uids.length; i++) - { - uid = a_uids[i]; - if (rows[uid]) - { - rows[uid].flagged = (flag=='flagged' ? true : false); - - if (rows[uid].flagged && this.env.flaggedicon) - icn_src = this.env.flaggedicon; - else if (this.env.unflaggedicon) - icn_src = this.env.unflaggedicon; - - if (rows[uid].flagged_icon && icn_src) - rows[uid].flagged_icon.src = icn_src; - } - } + this.set_message(a_uids[i], 'flagged', (flag=='flagged' ? true : false)); this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag); }; @@ -1749,7 +1829,7 @@ if (a_uids.length==1) { - if (!rows.length || (rows[a_uids[0]] && rows[a_uids[0]].classname.indexOf('deleted') < 0)) + if (!rows.length || (rows[a_uids[0]] && !rows[a_uids[0]].deleted)) this.flag_as_deleted(a_uids); else this.flag_as_undeleted(a_uids); @@ -1762,7 +1842,7 @@ { uid = a_uids[i]; if (rows[uid]) { - if (rows[uid].classname.indexOf('deleted')<0) + if (!rows[uid].deleted) { all_deleted = false; break; @@ -1781,31 +1861,8 @@ this.flag_as_undeleted = function(a_uids) { - var icn_src; - var rows = this.message_list ? this.message_list.rows : new Array(); - for (var i=0; i<a_uids.length; i++) - { - uid = a_uids[i]; - if (rows[uid]) { - rows[uid].deleted = false; - - if (rows[uid].classname.indexOf('deleted') > 0) - { - rows[uid].classname = rows[uid].classname.replace(/\s*deleted/, ''); - this.set_classname(rows[uid].obj, 'deleted', false); - } - if (rows[uid].unread && this.env.unreadicon) - icn_src = this.env.unreadicon; - else if (rows[uid].replied && this.env.repliedicon) - icn_src = this.env.repliedicon; - else if (this.env.messageicon) - icn_src = this.env.messageicon; - - if (rows[uid].icon && icn_src) - rows[uid].icon.src = icn_src; - } - } + this.set_message(a_uids[i], 'deleted', false); this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag=undelete'); return true; @@ -1823,22 +1880,7 @@ uid = a_uids[i]; if (rows[uid]) { - rows[uid].deleted = true; - - if (rows[uid].classname.indexOf('deleted')<0) - { - rows[uid].classname += ' deleted'; - this.set_classname(rows[uid].obj, 'deleted', true); - } - if (this.env.read_when_deleted) - { - rows[uid].classname = rows[uid].classname.replace(/\s*unread/, ''); - this.set_classname(rows[uid].obj, 'unread', false); - } - - if (rows[uid].icon && this.env.deletedicon) - rows[uid].icon.src = this.env.deletedicon; - + this.set_message(uid, 'deleted', true); if (rows[uid].unread) r_uids[r_uids.length] = uid; } @@ -1870,16 +1912,12 @@ { rows[uid].unread = false; rows[uid].read = true; - - rows[uid].classname = rows[uid].classname.replace(/\s*unread/, ''); - this.set_classname(rows[uid].obj, 'unread', false); - - if (rows[uid].icon) - rows[uid].icon.src = this.env.deletedicon; + this.set_message(uid); } } }; - + + /*********************************************************/ /********* login form methods *********/ /*********************************************************/ @@ -2272,7 +2310,6 @@ /********* keyboard live-search methods *********/ /*********************************************************/ - // handler for keyboard events on address-fields this.ksearch_keypress = function(e, obj) { @@ -2492,7 +2529,6 @@ /*********************************************************/ /********* address book methods *********/ /*********************************************************/ - this.contactlist_keypress = function(list) { @@ -2831,6 +2867,7 @@ if (this.env.folder && name != '') name = this.env.folder+this.env.delimiter+name; + this.set_busy(true, 'foldercreating'); this.http_post('create-folder', '_name='+urlencode(name), true); } else if (form.elements['_folder_name']) @@ -2905,6 +2942,7 @@ if (this.name_input.__parent) newname = this.name_input.__parent + this.env.delimiter + newname; + this.set_busy(true, 'folderrenaming'); this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.subscriptionrows[this.edit_folder][0])+'&_folder_newname='+urlencode(newname), true); } } @@ -2924,7 +2962,8 @@ if (folder && confirm(this.get_label('deletefolderconfirm'))) { - this.http_post('delete-folder', '_mboxes='+urlencode(folder)); + this.set_busy(true, 'folderdeleting'); + this.http_post('delete-folder', '_mboxes='+urlencode(folder), true); this.set_env('folder', null); if (this.gui_objects.createfolderhint) @@ -2967,12 +3006,12 @@ row.id = id; if (before && (before = this.get_folder_row_id(before))) - tbody.insertBefore(row, document.getElementById(before)); + tbody.insertBefore(row, document.getElementById(before)); else - tbody.appendChild(row); + tbody.appendChild(row); if (replace) - tbody.removeChild(replace); + tbody.removeChild(replace); } // add to folder/row-ID map @@ -3094,9 +3133,9 @@ { var cell, td; var new_row = document.createElement('TR'); - for(var n=0; n<row.childNodes.length; n++) + for(var n=0; n<row.cells.length; n++) { - cell = row.childNodes[n]; + cell = row.cells[n]; td = document.createElement('TD'); if (cell.className) @@ -3406,6 +3445,7 @@ this.env.messages[uid] = {deleted:flags.deleted?1:0, replied:flags.replied?1:0, unread:flags.unread?1:0, + forwarded:flags.forwarded?1:0, flagged:flags.flagged?1:0}; var row = document.createElement('TR'); @@ -3415,10 +3455,21 @@ if (this.message_list.in_selection(uid)) row.className += ' selected'; - var icon = flags.deleted && this.env.deletedicon ? this.env.deletedicon: - (flags.unread && this.env.unreadicon ? this.env.unreadicon : - (flags.replied && this.env.repliedicon ? this.env.repliedicon : this.env.messageicon)); - + var icon = this.env.messageicon; + if (flags.deleted && this.env.deletedicon) + icon = this.env.deletedicon; + else if (flags.replied && this.env.repliedicon) + { + if (flags.forwarded && this.env.forwardedrepliedicon) + icon = this.env.forwardedrepliedicon; + else + icon = this.env.repliedicon; + } + else if (flags.forwarded && this.env.forwardedicon) + icon = this.env.forwardedicon; + else if(flags.unread && this.env.unreadicon) + icon = this.env.unreadicon; + var col = document.createElement('TD'); col.className = 'icon'; col.innerHTML = icon ? '<img src="'+icon+'" alt="" />' : ''; @@ -3450,6 +3501,14 @@ row.appendChild(col); this.message_list.insert_row(row, attop); + + // remove 'old' row + if (attop && this.env.pagesize && this.message_list.rowcount > this.env.pagesize) + { + var uid = this.message_list.get_last_row(); + this.message_list.remove_row(uid); + this.message_list.clear_selection(uid); + } }; @@ -3545,12 +3604,6 @@ } }; - // update parent's mailboxlist (from preview) - this.set_unread_count_from_preview = function(mbox, count, set_title) - { - parent.rcmail.set_unread_count(mbox, count, set_title); - } - // add row to contacts list this.add_contact_row = function(cid, cols, select) { @@ -3578,19 +3631,28 @@ } this.contact_list.insert_row(row); + this.enable_command('export', (this.contact_list.rowcount > 0)); }; this.toggle_editor = function(checkbox, textAreaId) { var ischecked = checkbox.checked; + var composeElement = document.getElementById(textAreaId); + if (ischecked) { - tinyMCE.execCommand('mceAddControl', true, textAreaId); + var existingPlainText = composeElement.value; + var htmlText = "<pre>" + existingPlainText + "</pre>"; + composeElement.value = htmlText; + tinyMCE.execCommand('mceAddControl', true, textAreaId); } else { - tinyMCE.execCommand('mceRemoveControl', true, textAreaId); + var thisMCE = tinyMCE.get(textAreaId); + var existingHtml = thisMCE.getContent(); + this.html2plain(existingHtml, textAreaId); + tinyMCE.execCommand('mceRemoveControl', true, textAreaId); } }; @@ -3602,6 +3664,81 @@ addrbook_show_images.disabled = !checkbox.checked; } + + // display fetched raw headers + this.set_headers = function(content) + { + if (this.gui_objects.all_headers_row && this.gui_objects.all_headers_box && content) + { + var box = this.gui_objects.all_headers_box; + box.innerHTML = content; + box.style.display = 'block'; + + if (this.env.framed && parent.rcmail) + parent.rcmail.set_busy(false); + else + this.set_busy(false); + } + }; + + + // display all-headers row and fetch raw message headers + this.load_headers = function(elem) + { + if (!this.gui_objects.all_headers_row || !this.gui_objects.all_headers_box || !this.env.uid) + return; + + this.set_classname(elem, 'show-headers', false); + this.set_classname(elem, 'hide-headers', true); + this.gui_objects.all_headers_row.style.display = bw.ie ? 'block' : 'table-row'; + elem.onclick = function() { rcmail.hide_headers(elem); } + + // fetch headers only once + if (!this.gui_objects.all_headers_box.innerHTML) + { + this.display_message(this.get_label('loading'), 'loading', true); + this.http_post('headers', '_uid='+this.env.uid); + } + } + + + // hide all-headers row + this.hide_headers = function(elem) + { + if (!this.gui_objects.all_headers_row || !this.gui_objects.all_headers_box) + return; + + this.set_classname(elem, 'hide-headers', false); + this.set_classname(elem, 'show-headers', true); + this.gui_objects.all_headers_row.style.display = 'none'; + elem.onclick = function() { rcmail.load_headers(elem); } + } + + + /********************************************************/ + /********* html to text conversion functions *********/ + /********************************************************/ + + this.html2plain = function(htmlText, id) + { + var http_request = new rcube_http_request(); + var url = this.env.bin_path+'html2text.php'; + var rcmail = this; + + this.set_busy(true, 'converting'); + console.log('HTTP POST: '+url); + + http_request.onerror = function(o) { rcmail.http_error(o); }; + http_request.oncomplete = function(o) { rcmail.set_text_value(o, id); }; + http_request.POST(url, htmlText, 'application/octet-stream'); + } + + this.set_text_value = function(httpRequest, id) + { + this.set_busy(false); + document.getElementById(id).value = httpRequest.get_text(); + console.log(httpRequest.get_text()); + } /********************************************************/ @@ -3709,7 +3846,7 @@ } if (request_obj.__lock) - this.set_busy(false); + this.set_busy(false); console.log(request_obj.get_text()); @@ -3718,53 +3855,47 @@ eval(request_obj.get_text()); // process the response data according to the sent action - switch (request_obj.__action) - { - + switch (request_obj.__action) { case 'delete': - if (this.task == 'addressbook') - { - var uid = this.contact_list.get_selection(); - this.enable_command('compose', (uid && this.contact_list.rows[uid])); - this.enable_command('delete', 'edit', (uid && this.contact_list.rows[uid] && this.env.address_sources && !this.env.address_sources[this.env.source].readonly)); - break; - } + if (this.task == 'addressbook') { + var uid = this.contact_list.get_selection(); + this.enable_command('compose', (uid && this.contact_list.rows[uid])); + this.enable_command('delete', 'edit', (uid && this.contact_list.rows[uid] && this.env.address_sources && !this.env.address_sources[this.env.source].readonly)); + this.enable_command('export', (this.contact_list && this.contact_list.rowcount > 0)); + } + case 'moveto': - if (this.env.action=='show') + if (this.env.action == 'show') this.command('list'); else if (this.message_list) this.message_list.init(); - + break; + case 'purge': case 'expunge': - if (!this.env.messagecount && this.task == 'mail') - { - // clear preview pane content - if (this.env.contentframe) - this.show_contentframe(false); - // disable commands useless when mailbox is empty - this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', 'mark', 'viewsource', - 'print', 'load-attachment', 'purge', 'expunge', 'select-all', 'select-none', 'sort', false); - } - break; - - case 'list': - this.msglist_select(this.message_list); + if (!this.env.messagecount && this.task == 'mail') { + // clear preview pane content + if (this.env.contentframe) + this.show_contentframe(false); + // disable commands useless when mailbox is empty + this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', 'mark', 'viewsource', + 'print', 'load-attachment', 'purge', 'expunge', 'select-all', 'select-none', 'sort', false); + } + break; case 'check-recent': case 'getunread': - if (this.task == 'mail') - { - this.enable_command('show', 'expunge', 'select-all', 'select-none', 'sort', (this.env.messagecount > 0)); - var mailboxtest = (this.env.mailbox == this.env.trash_mailbox || this.env.mailbox == this.env.junk_mailbox - || this.env.mailbox.match('^' + RegExp.escape(this.env.trash_mailbox) + RegExp.escape(this.env.delimiter)) - || this.env.mailbox.match('^' + RegExp.escape(this.env.junk_mailbox) + RegExp.escape(this.env.delimiter))) ? true : false; - - this.enable_command('purge', (this.env.messagecount && mailboxtest)); - } - break; - - } + case 'list': + if (this.task == 'mail') { + if (this.message_list) + this.msglist_select(this.message_list); + this.enable_command('show', 'expunge', 'select-all', 'select-none', 'sort', (this.env.messagecount > 0)); + this.enable_command('purge', this.purge_mailbox_test()); + } + else if (this.task == 'addressbook') + this.enable_command('export', (this.contact_list && this.contact_list.rowcount > 0)); + break; + } request_obj.reset(); }; @@ -3773,13 +3904,14 @@ // handle HTTP request errors this.http_error = function(request_obj) { - //alert('Error sending request: '+request_obj.url); + //alert('Error sending request: '+request_obj.url+' => HTTP '+request_obj.xmlhttp.status); if (request_obj.__lock) this.set_busy(false); request_obj.reset(); request_obj.__lock = false; + this.display_message('Unknown Server Error!', 'error'); }; @@ -3944,7 +4076,7 @@ this.busy = true; this.xmlhttp.onreadystatechange = function(){ _ref.xmlhttp_onreadystatechange(); }; - this.xmlhttp.open('GET', url); + this.xmlhttp.open('GET', url, true); this.xmlhttp.setRequestHeader('X-RoundCube-Referer', bw.get_cookie('roundcube_sessid')); this.xmlhttp.send(null); }; @@ -4043,4 +4175,3 @@ window.setTimeout('if (window[\''+o+'\'] && window[\''+o+'\'].init) { '+o+'.init(); }', bw.win ? 500 : 200); } - -- Gitblit v1.9.1