| | |
| | | this.load_identity(props, 'edit-identity'); |
| | | else if (this.task == 'mail' && (cid = this.get_single_uid())) { |
| | | url = { _mbox: this.env.mailbox }; |
| | | url[this.env.mailbox == this.env.drafts_mailbox ? '_draft_uid' : '_uid'] = cid; |
| | | url[this.env.mailbox == this.env.drafts_mailbox && props != 'new' ? '_draft_uid' : '_uid'] = cid; |
| | | this.goto_url('compose', url, true); |
| | | } |
| | | break; |
| | |
| | | break; |
| | | |
| | | case 'savedraft': |
| | | var form = this.gui_objects.messageform, msgid; |
| | | |
| | | // Reset the auto-save timer |
| | | clearTimeout(this.save_timer); |
| | | |
| | | // saving Drafts is disabled |
| | | if (!form) |
| | | break; |
| | | |
| | | // compose form did not change |
| | | if (this.cmp_hash == this.compose_field_hash()) { |
| | |
| | | // re-set keep-alive timeout |
| | | this.start_keepalive(); |
| | | |
| | | msgid = this.set_busy(true, 'savingmessage'); |
| | | |
| | | form.target = "savetarget"; |
| | | form._draft.value = '1'; |
| | | form.action = this.add_url(form.action, '_unlock', msgid); |
| | | form.submit(); |
| | | this.submit_messageform(true); |
| | | break; |
| | | |
| | | case 'send': |
| | | if (!this.gui_objects.messageform) |
| | | break; |
| | | |
| | | if (!props.nocheck && !this.check_compose_input(command)) |
| | | break; |
| | | |
| | | // Reset the auto-save timer |
| | | clearTimeout(this.save_timer); |
| | | |
| | | // all checks passed, send message |
| | | var lang = this.spellcheck_lang(), |
| | | form = this.gui_objects.messageform, |
| | | msgid = this.set_busy(true, 'sendingmessage'); |
| | | |
| | | form.target = 'savetarget'; |
| | | form._draft.value = ''; |
| | | form.action = this.add_url(form.action, '_unlock', msgid); |
| | | form.action = this.add_url(form.action, '_lang', lang); |
| | | form.submit(); |
| | | |
| | | this.submit_messageform(); |
| | | break; |
| | | |
| | | case 'send-attachment': |
| | |
| | | // do reply-list, when list is detected and popup menu wasn't used |
| | | url._all = (!props && this.commands['reply-list'] ? 'list' : 'all'); |
| | | else if (command == 'reply-list') |
| | | url._all = list; |
| | | url._all = 'list'; |
| | | |
| | | this.goto_url('compose', url, true); |
| | | } |
| | |
| | | |
| | | this.doc_mouse_up = function(e) |
| | | { |
| | | var model, list, li, id; |
| | | var model, list, id; |
| | | |
| | | // ignore event if jquery UI dialog is open |
| | | if ($(rcube_event.get_target(e)).closest('.ui-dialog, .ui-widget-overlay').length) |
| | | return; |
| | | |
| | | if (list = this.message_list) { |
| | | if (!rcube_mouse_is_over(e, list.list.parentNode)) |
| | | list.blur(); |
| | | else |
| | | list.focus(); |
| | | if (list = this.message_list) |
| | | model = this.env.mailboxes; |
| | | } |
| | | else if (list = this.contact_list) { |
| | | if (!rcube_mouse_is_over(e, list.list.parentNode)) |
| | | list.blur(); |
| | | else |
| | | list.focus(); |
| | | else if (list = this.contact_list) |
| | | model = this.env.contactfolders; |
| | | } |
| | | else if (this.ksearch_value) { |
| | | else if (this.ksearch_value) |
| | | this.ksearch_blur(); |
| | | } |
| | | |
| | | if (list && !rcube_mouse_is_over(e, list.list.parentNode)) |
| | | list.blur(); |
| | | |
| | | // handle mouse release when dragging |
| | | if (this.drag_active && model && this.env.last_folder_target) { |
| | |
| | | if (list.multi_selecting || !this.env.contentframe) |
| | | return; |
| | | |
| | | if (list.get_single_selection() && window.frames && window.frames[this.env.contentframe]) { |
| | | if (window.frames[this.env.contentframe].location.href.indexOf(this.env.blankpage)>=0) { |
| | | if (this.preview_timer) |
| | | clearTimeout(this.preview_timer); |
| | | if (this.preview_read_timer) |
| | | clearTimeout(this.preview_read_timer); |
| | | this.preview_timer = setTimeout(function(){ ref.msglist_get_preview(); }, 200); |
| | | } |
| | | if (list.get_single_selection()) |
| | | return; |
| | | |
| | | var win = this.get_frame_window(this.env.contentframe); |
| | | |
| | | if (win && win.location.href.indexOf(this.env.blankpage)>=0) { |
| | | if (this.preview_timer) |
| | | clearTimeout(this.preview_timer); |
| | | if (this.preview_read_timer) |
| | | clearTimeout(this.preview_read_timer); |
| | | this.preview_timer = setTimeout(function(){ ref.msglist_get_preview(); }, 200); |
| | | } |
| | | }; |
| | | |
| | |
| | | for (i=0; i<cols.length; i++) |
| | | if (cols[i].id && cols[i].id.match(/^rcm/)) { |
| | | name = cols[i].id.replace(/^rcm/, ''); |
| | | this.env.coltypes.push(name == 'to' ? 'from' : name); |
| | | this.env.coltypes.push(name); |
| | | } |
| | | |
| | | if ((found = $.inArray('flag', this.env.coltypes)) >= 0) |
| | |
| | | // make sure new columns are added at the end of the list |
| | | var i, idx, name, newcols = [], oldcols = this.env.coltypes; |
| | | for (i=0; i<oldcols.length; i++) { |
| | | name = oldcols[i] == 'to' ? 'from' : oldcols[i]; |
| | | name = oldcols[i]; |
| | | idx = $.inArray(name, cols); |
| | | if (idx != -1) { |
| | | newcols.push(name); |
| | |
| | | if (!id) |
| | | return; |
| | | |
| | | var target = window, |
| | | var win, target = window, |
| | | action = preview ? 'preview': 'show', |
| | | url = '&_action='+action+'&_uid='+id+'&_mbox='+urlencode(this.env.mailbox); |
| | | |
| | | if (preview && this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | | target = window.frames[this.env.contentframe]; |
| | | if (preview && (win = this.get_frame_window(this.env.contentframe))) { |
| | | target = win; |
| | | url += '&_framed=1'; |
| | | } |
| | | |
| | |
| | | |
| | | this.show_contentframe = function(show) |
| | | { |
| | | var frm, win; |
| | | if (this.env.contentframe && (frm = $('#'+this.env.contentframe)) && frm.length) { |
| | | if (!show && (win = window.frames[this.env.contentframe])) { |
| | | var frame, win, name = this.env.contentframe; |
| | | |
| | | if (name && (frame = this.get_frame_element(name))) { |
| | | if (!show && (win = this.get_frame_window(name))) { |
| | | if (win.location && win.location.href.indexOf(this.env.blankpage)<0) |
| | | win.location.href = this.env.blankpage; |
| | | } |
| | | else if (!bw.safari && !bw.konq) |
| | | frm[show ? 'show' : 'hide'](); |
| | | } |
| | | $(frame)[show ? 'show' : 'hide'](); |
| | | } |
| | | |
| | | if (!show && this.busy) |
| | | this.set_busy(false, null, this.env.frame_lock); |
| | | }; |
| | | |
| | | this.get_frame_element = function(id) |
| | | { |
| | | var frame; |
| | | |
| | | if (id && (frame = document.getElementById(id))) |
| | | return frame; |
| | | }; |
| | | |
| | | this.get_frame_window = function(id) |
| | | { |
| | | var frame = this.get_frame_element(id); |
| | | |
| | | if (frame && frame.name && window.frames) |
| | | return window.frames[frame.name]; |
| | | }; |
| | | |
| | | this.lock_frame = function() |
| | |
| | | // list messages of a specific mailbox |
| | | this.list_mailbox = function(mbox, page, sort, url) |
| | | { |
| | | var target = window; |
| | | var win, target = window; |
| | | |
| | | if (typeof url != 'object') |
| | | url = {}; |
| | |
| | | return; |
| | | } |
| | | |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | | target = window.frames[this.env.contentframe]; |
| | | if (win = this.get_frame_window(this.env.contentframe)) { |
| | | target = win; |
| | | url._framed = 1; |
| | | } |
| | | |
| | |
| | | // set a specific flag to one or more messages |
| | | this.mark_message = function(flag, uid) |
| | | { |
| | | var a_uids = [], r_uids = [], len, n, id, |
| | | selection = this.message_list ? this.message_list.get_selection() : []; |
| | | var a_uids = [], r_uids = [], len, n, id, selection, |
| | | list = this.message_list; |
| | | |
| | | if (uid) |
| | | a_uids[0] = uid; |
| | | else if (this.env.uid) |
| | | a_uids[0] = this.env.uid; |
| | | else if (this.message_list) { |
| | | else if (list) { |
| | | selection = list.get_selection(); |
| | | for (n=0, len=selection.length; n<len; n++) { |
| | | a_uids.push(selection[n]); |
| | | } |
| | | } |
| | | |
| | | if (!this.message_list) |
| | | if (!list) |
| | | r_uids = a_uids; |
| | | else |
| | | else { |
| | | list.focus(); |
| | | for (n=0, len=a_uids.length; n<len; n++) { |
| | | id = a_uids[n]; |
| | | if ((flag=='read' && this.message_list.rows[id].unread) |
| | | || (flag=='unread' && !this.message_list.rows[id].unread) |
| | | || (flag=='delete' && !this.message_list.rows[id].deleted) |
| | | || (flag=='undelete' && this.message_list.rows[id].deleted) |
| | | || (flag=='flagged' && !this.message_list.rows[id].flagged) |
| | | || (flag=='unflagged' && this.message_list.rows[id].flagged)) |
| | | if ((flag=='read' && list.rows[id].unread) |
| | | || (flag=='unread' && !list.rows[id].unread) |
| | | || (flag=='delete' && !list.rows[id].deleted) |
| | | || (flag=='undelete' && list.rows[id].deleted) |
| | | || (flag=='flagged' && !list.rows[id].flagged) |
| | | || (flag=='unflagged' && list.rows[id].flagged)) |
| | | { |
| | | r_uids.push(id); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // nothing to do |
| | | if (!r_uids.length && !this.select_all_mode) |
| | |
| | | .attr('autocomplete', 'off'); |
| | | }; |
| | | |
| | | this.submit_messageform = function(draft) |
| | | { |
| | | var form = this.gui_objects.messageform; |
| | | |
| | | if (!form) |
| | | return; |
| | | |
| | | // all checks passed, send message |
| | | var msgid = this.set_busy(true, draft ? 'savingmessage' : 'sendingmessage'), |
| | | lang = this.spellcheck_lang(), |
| | | files = []; |
| | | |
| | | // send files list |
| | | $('li', this.gui_objects.attachmentlist).each(function() { files.push(this.id.replace(/^rcmfile/, '')); }); |
| | | $('input[name="_attachments"]', form).val(files.join()); |
| | | |
| | | form.target = 'savetarget'; |
| | | form._draft.value = draft ? '1' : ''; |
| | | form.action = this.add_url(form.action, '_unlock', msgid); |
| | | form.action = this.add_url(form.action, '_lang', lang); |
| | | form.submit(); |
| | | }; |
| | | |
| | | this.compose_recipient_select = function(list) |
| | | { |
| | | this.enable_command('add-recipient', list.selection.length > 0); |
| | |
| | | input_message = $("[name='_message']"), |
| | | message = input_message.val(), |
| | | is_html = ($("input[name='_is_html']").val() == '1'), |
| | | sig = this.env.identity, |
| | | sig_separator = this.env.sig_above && (this.env.compose_mode == 'reply' || this.env.compose_mode == 'forward') ? '---' : '-- '; |
| | | sig = this.env.identity; |
| | | |
| | | // enable manual signature insert |
| | | if (this.env.signatures && this.env.signatures[id]) { |
| | |
| | | if (!is_html) { |
| | | // remove the 'old' signature |
| | | if (show_sig && sig && this.env.signatures && this.env.signatures[sig]) { |
| | | |
| | | sig = this.env.signatures[sig].is_html ? this.env.signatures[sig].plain_text : this.env.signatures[sig].text; |
| | | sig = this.env.signatures[sig].text; |
| | | sig = sig.replace(/\r\n/g, '\n'); |
| | | |
| | | if (!sig.match(/^--[ -]\n/m)) |
| | | sig = sig_separator + '\n' + sig; |
| | | |
| | | p = this.env.sig_above ? message.indexOf(sig) : message.lastIndexOf(sig); |
| | | if (p >= 0) |
| | |
| | | } |
| | | // add the new signature string |
| | | if (show_sig && this.env.signatures && this.env.signatures[id]) { |
| | | sig = this.env.signatures[id]['is_html'] ? this.env.signatures[id]['plain_text'] : this.env.signatures[id]['text']; |
| | | sig = this.env.signatures[id].text; |
| | | sig = sig.replace(/\r\n/g, '\n'); |
| | | |
| | | if (!sig.match(/^--[ -]\n/m)) |
| | | sig = sig_separator + '\n' + sig; |
| | | |
| | | if (this.env.sig_above) { |
| | | if (p >= 0) { // in place of removed signature |
| | |
| | | } |
| | | } |
| | | |
| | | if (this.env.signatures[id]) { |
| | | if (this.env.signatures[id].is_html) { |
| | | sig = this.env.signatures[id].text; |
| | | if (!this.env.signatures[id].plain_text.match(/^--[ -]\r?\n/m)) |
| | | sig = sig_separator + '<br />' + sig; |
| | | } |
| | | else { |
| | | sig = this.env.signatures[id].text; |
| | | if (!sig.match(/^--[ -]\r?\n/m)) |
| | | sig = sig_separator + '\n' + sig; |
| | | sig = '<pre>' + sig + '</pre>'; |
| | | } |
| | | |
| | | sigElem.innerHTML = sig; |
| | | } |
| | | if (this.env.signatures[id]) |
| | | sigElem.innerHTML = this.env.signatures[id].html; |
| | | } |
| | | |
| | | this.env.identity = id; |
| | |
| | | |
| | | // if a group is currently selected, and there is at least one contact selected |
| | | // thend we can enable the group-remove-selected command |
| | | this.enable_command('group-remove-selected', typeof this.env.group != 'undefined' && list.selection.length > 0); |
| | | |
| | | this.enable_command('group-remove-selected', this.env.group && list.selection.length > 0); |
| | | this.enable_command('compose', this.env.group || list.selection.length > 0); |
| | | this.enable_command('edit', id && writable); |
| | | this.enable_command('delete', list.selection.length && writable); |
| | |
| | | |
| | | this.list_contacts = function(src, group, page) |
| | | { |
| | | var folder, url = {}, |
| | | var win, folder, url = {}, |
| | | target = window; |
| | | |
| | | if (!src) |
| | |
| | | return; |
| | | } |
| | | |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | | target = window.frames[this.env.contentframe]; |
| | | if (win = this.get_frame_window(this.env.contentframe)) { |
| | | target = win; |
| | | url._framed = 1; |
| | | } |
| | | |
| | |
| | | // load contact record |
| | | this.load_contact = function(cid, action, framed) |
| | | { |
| | | var url = {}, target = window; |
| | | var win, url = {}, target = window; |
| | | |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | | if (win = this.get_frame_window(this.env.contentframe)) { |
| | | url._framed = 1; |
| | | target = window.frames[this.env.contentframe]; |
| | | target = win; |
| | | this.show_contentframe(true); |
| | | |
| | | // load dummy content |
| | |
| | | if (!this.gui_objects.contactslist) |
| | | return false; |
| | | |
| | | var c, list = this.contact_list, |
| | | var c, col, list = this.contact_list, |
| | | row = document.createElement('tr'); |
| | | |
| | | row.id = 'rcmrow'+this.html_identifier(cid); |
| | |
| | | // load advanced search page |
| | | this.advanced_search = function() |
| | | { |
| | | var url = {_form: 1, _action: 'search'}, target = window; |
| | | var win, url = {_form: 1, _action: 'search'}, target = window; |
| | | |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | | if (win = this.get_frame_window(this.env.contentframe)) { |
| | | url._framed = 1; |
| | | target = window.frames[this.env.contentframe]; |
| | | target = win; |
| | | this.contact_list.clear_selection(); |
| | | } |
| | | |
| | |
| | | // preferences section select and load options frame |
| | | this.section_select = function(list) |
| | | { |
| | | var id = list.get_single_selection(), target = window, |
| | | var win, id = list.get_single_selection(), target = window, |
| | | url = {_action: 'edit-prefs', _section: id}; |
| | | |
| | | if (id) { |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | | if (win = this.get_frame_window(this.env.contentframe)) { |
| | | url._framed = 1; |
| | | target = window.frames[this.env.contentframe]; |
| | | target = win; |
| | | } |
| | | this.location_href(url, target, true); |
| | | } |
| | |
| | | if (action == 'edit-identity' && (!id || id == this.env.iid)) |
| | | return false; |
| | | |
| | | var target = window, |
| | | var win, target = window, |
| | | url = {_action: action, _iid: id}; |
| | | |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | | if (win = this.get_frame_window(this.env.contentframe)) { |
| | | url._framed = 1; |
| | | target = window.frames[this.env.contentframe]; |
| | | document.getElementById(this.env.contentframe).style.visibility = 'inherit'; |
| | | target = win; |
| | | } |
| | | |
| | | if (action && (id || action == 'add-identity')) { |
| | |
| | | // when user select a folder in manager |
| | | this.show_folder = function(folder, path, force) |
| | | { |
| | | var target = window, |
| | | var win, target = window, |
| | | url = '&_action=edit-folder&_mbox='+urlencode(folder); |
| | | |
| | | if (path) |
| | | url += '&_path='+urlencode(path); |
| | | |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | | target = window.frames[this.env.contentframe]; |
| | | if (win = this.get_frame_window(this.env.contentframe)) { |
| | | target = win; |
| | | url += '&_framed=1'; |
| | | } |
| | | |
| | |
| | | } |
| | | }; |
| | | |
| | | // enable/disable buttons for page shifting |
| | | this.set_page_buttons = function() |
| | | { |
| | | this.enable_command('nextpage', 'lastpage', (this.env.pagecount > this.env.current_page)); |
| | | this.enable_command('previouspage', 'firstpage', (this.env.current_page > 1)); |
| | | }; |
| | | |
| | | // set event handlers on registered buttons |
| | | this.init_buttons = function() |
| | | { |
| | |
| | | if (typeof cmd !== 'string') |
| | | continue; |
| | | |
| | | for (var i=0; i< this.buttons[cmd].length; i++) { |
| | | for (var i=0; i<this.buttons[cmd].length; i++) { |
| | | init_button(cmd, this.buttons[cmd][i]); |
| | | } |
| | | } |
| | |
| | | button = a_buttons[n]; |
| | | obj = document.getElementById(button.id); |
| | | |
| | | if (!obj) |
| | | continue; |
| | | |
| | | // get default/passive setting of the button |
| | | if (obj && button.type == 'image' && !button.status) { |
| | | if (button.type == 'image' && !button.status) { |
| | | button.pas = obj._original_src ? obj._original_src : obj.src; |
| | | // respect PNG fix on IE browsers |
| | | if (obj.runtimeStyle && obj.runtimeStyle.filter && obj.runtimeStyle.filter.match(/src=['"]([^'"]+)['"]/)) |
| | | button.pas = RegExp.$1; |
| | | } |
| | | else if (obj && !button.status) |
| | | else if (!button.status) |
| | | button.pas = String(obj.className); |
| | | |
| | | // set image according to button state |
| | | if (obj && button.type == 'image' && button[state]) { |
| | | if (button.type == 'image' && button[state]) { |
| | | button.status = state; |
| | | obj.src = button[state]; |
| | | } |
| | | // set class name according to button state |
| | | else if (obj && button[state] !== undefined) { |
| | | else if (button[state] !== undefined) { |
| | | button.status = state; |
| | | obj.className = button[state]; |
| | | } |
| | | // disable/enable input buttons |
| | | if (obj && button.type=='input') { |
| | | if (button.type == 'input') { |
| | | button.status = state; |
| | | obj.disabled = !state; |
| | | } |
| | |
| | | this.messages = {}; |
| | | }; |
| | | |
| | | // enable/disable buttons for page shifting |
| | | this.set_page_buttons = function() |
| | | { |
| | | this.enable_command('nextpage', 'lastpage', (this.env.pagecount > this.env.current_page)); |
| | | this.enable_command('previouspage', 'firstpage', (this.env.current_page > 1)); |
| | | }; |
| | | |
| | | // mark a mailbox as selected and set environment variable |
| | | this.select_folder = function(name, prefix, encode) |
| | | { |
| | |
| | | |
| | | // for reordering column array (Konqueror workaround) |
| | | // and for setting some message list global variables |
| | | this.set_message_coltypes = function(coltypes, repl) |
| | | this.set_message_coltypes = function(coltypes, repl, smart_col) |
| | | { |
| | | var list = this.message_list, |
| | | thead = list ? list.list.tHead : null, |
| | |
| | | |
| | | for (n=0, len=this.env.coltypes.length; n<len; n++) { |
| | | col = this.env.coltypes[n]; |
| | | if ((cell = thead.rows[0].cells[n]) && (col=='from' || col=='to')) { |
| | | if ((cell = thead.rows[0].cells[n]) && (col == 'from' || col == 'to' || col == 'fromto')) { |
| | | cell.id = 'rcm'+col; |
| | | // if we have links for sorting, it's a bit more complicated... |
| | | if (cell.firstChild && cell.firstChild.tagName.toLowerCase()=='a') { |
| | |
| | | cell.onclick = function(){ return rcmail.command('sort', this.__col, this); }; |
| | | cell.__col = col; |
| | | } |
| | | cell.innerHTML = this.get_label(col); |
| | | cell.innerHTML = this.get_label(col == 'fromto' ? smart_col : col); |
| | | } |
| | | } |
| | | } |
| | |
| | | return 0; |
| | | }; |
| | | |
| | | // Cookie setter |
| | | this.set_cookie = function(name, value, expires) |
| | | { |
| | | setCookie(name, value, expires, this.env.cookie_path, this.env.cookie_domain, this.env.cookie_secure); |
| | | } |
| | | |
| | | } // end object rcube_webmail |
| | | |
| | | |
| | |
| | | } |
| | | }; |
| | | |
| | | rcube_webmail.prototype.get_cookie = getCookie; |
| | | |
| | | // copy event engine prototype |
| | | rcube_webmail.prototype.addEventListener = rcube_event_engine.prototype.addEventListener; |
| | | rcube_webmail.prototype.removeEventListener = rcube_event_engine.prototype.removeEventListener; |