| | |
| | | } |
| | | |
| | | // enable general commands |
| | | this.enable_command('close', 'logout', 'mail', 'addressbook', 'settings', 'save-pref', 'compose', 'undo', 'about', 'switch-task', true); |
| | | this.enable_command('close', 'logout', 'mail', 'addressbook', 'settings', 'save-pref', |
| | | 'compose', 'undo', 'about', 'switch-task', 'menu-open', 'menu-save', true); |
| | | |
| | | if (this.env.permaurl) |
| | | this.enable_command('permaurl', 'extwin', true); |
| | |
| | | this.gui_objects.messagelist.parentNode.onmousedown = function(e){ return p.click_on_list(e); }; |
| | | |
| | | this.message_list.init(); |
| | | this.enable_command('toggle_status', 'toggle_flag', 'menu-open', 'menu-save', 'sort', true); |
| | | this.enable_command('toggle_status', 'toggle_flag', 'sort', true); |
| | | |
| | | // load messages |
| | | this.command('list'); |
| | |
| | | |
| | | this.env.message_commands = ['show', 'reply', 'reply-all', 'reply-list', |
| | | 'moveto', 'copy', 'delete', 'open', 'mark', 'edit', 'viewsource', |
| | | 'print', 'load-attachment', 'show-headers', 'hide-headers', 'download', |
| | | 'forward', 'forward-inline', 'forward-attachment']; |
| | | 'print', 'load-attachment', 'download-attachment', 'show-headers', 'hide-headers', 'download', |
| | | 'forward', 'forward-inline', 'forward-attachment', 'change-format']; |
| | | |
| | | if (this.env.action == 'show' || this.env.action == 'preview') { |
| | | this.enable_command(this.env.message_commands, this.env.uid); |
| | |
| | | } |
| | | |
| | | // detect browser capabilities |
| | | if (!this.is_framed()) |
| | | if (!this.is_framed() && !this.env.extwin) |
| | | this.browser_capabilities_check(); |
| | | |
| | | break; |
| | |
| | | |
| | | case 'extwin': |
| | | if (this.env.action == 'compose') { |
| | | var prevstate = this.env.compose_extwin; |
| | | $("input[name='_action']", this.gui_objects.messageform).val('compose'); |
| | | this.gui_objects.messageform.action = this.url('mail/compose', { _id: this.env.compose_id, _extwin: 1 }); |
| | | this.gui_objects.messageform.target = this.open_window('', 1100, 900); |
| | | this.gui_objects.messageform.submit(); |
| | | var form = this.gui_objects.messageform; |
| | | |
| | | $("input[name='_action']", form).val('compose'); |
| | | form.action = this.url('mail/compose', { _id: this.env.compose_id, _extwin: 1 }); |
| | | form.target = this.open_window('', 1100, 900); |
| | | form.submit(); |
| | | } |
| | | else { |
| | | this.open_window(this.env.permaurl, 900, 900); |
| | | } |
| | | break; |
| | | |
| | | case 'change-format': |
| | | url = this.env.permaurl + '&_format=' + props; |
| | | |
| | | if (this.env.action == 'preview') |
| | | url = url.replace(/_action=show/, '_action=preview') + '&_framed=1'; |
| | | if (this.env.extwin) |
| | | url += '&_extwin=1'; |
| | | |
| | | location.href = url; |
| | | break; |
| | | |
| | | case 'menu-open': |
| | | if (props && props.menu == 'attachmentmenu') { |
| | | var mimetype = this.env.attachments[props.id]; |
| | | this.enable_command('open-attachment', mimetype && this.env.mimetypes && $.inArray(mimetype, this.env.mimetypes) >= 0); |
| | | } |
| | | |
| | | case 'menu-save': |
| | | this.triggerEvent(command, {props:props}); |
| | | return false; |
| | |
| | | break; |
| | | |
| | | case 'load-attachment': |
| | | var qstring = '_mbox='+urlencode(this.env.mailbox)+'&_uid='+this.env.uid+'&_part='+props.part; |
| | | case 'open-attachment': |
| | | case 'download-attachment': |
| | | var qstring = '_mbox='+urlencode(this.env.mailbox)+'&_uid='+this.env.uid+'&_part='+props, |
| | | mimetype = this.env.attachments[props]; |
| | | |
| | | // open attachment in frame if it's of a supported mimetype |
| | | if (this.env.uid && props.mimetype && this.env.mimetypes && $.inArray(props.mimetype, this.env.mimetypes) >= 0) { |
| | | var attachment_win = window.open(this.env.comm_path+'&_action=get&'+qstring+'&_frame=1', 'rcubemailattachment'+this.env.uid+props.part); |
| | | if (command != 'download-attachment' && mimetype && this.env.mimetypes && $.inArray(mimetype, this.env.mimetypes) >= 0) { |
| | | var attachment_win = window.open(this.env.comm_path+'&_action=get&'+qstring+'&_frame=1', this.html_identifier('rcubemailattachment'+this.env.uid+props)); |
| | | if (attachment_win) { |
| | | setTimeout(function(){ attachment_win.focus(); }, 10); |
| | | break; |
| | |
| | | |
| | | case 'nextmessage': |
| | | if (this.env.next_uid) |
| | | this.show_message(this.env.next_uid, false, this.env.action=='preview'); |
| | | this.show_message(this.env.next_uid, false, this.env.action == 'preview'); |
| | | break; |
| | | |
| | | case 'lastmessage': |
| | |
| | | // Reset the auto-save timer |
| | | clearTimeout(this.save_timer); |
| | | |
| | | // compose form did not change |
| | | if (this.cmp_hash == this.compose_field_hash()) { |
| | | // compose form did not change (and draft wasn't saved already) |
| | | if (this.env.draft_id && this.cmp_hash == this.compose_field_hash()) { |
| | | this.auto_save_start(); |
| | | break; |
| | | } |
| | |
| | | if (!url) |
| | | url = this.env.comm_path; |
| | | |
| | | return url.replace(/_task=[a-z]+/, '_task='+task); |
| | | return url.replace(/_task=[a-z0-9_-]+/i, '_task='+task); |
| | | }; |
| | | |
| | | this.reload = function(delay) |
| | |
| | | l = (screen.width - w) / 2 + (screen.left || 0), |
| | | t = Math.max(0, (screen.height - h) / 2 + (screen.top || 0) - 20), |
| | | wname = 'rcmextwin' + new Date().getTime(), |
| | | extwin = window.open(url + '&_extwin=1', wname, |
| | | extwin = window.open(url + (url.match(/\?/) ? '&' : '?') + '_extwin=1', wname, |
| | | 'width='+w+',height='+h+',top='+t+',left='+l+',resizable=yes,toolbar=no,status=no,location=no'); |
| | | |
| | | // write loading... message to empty windows |
| | |
| | | input_message = $("[name='_message']").get(0), |
| | | html_mode = $("input[name='_is_html']").val() == '1', |
| | | ac_fields = ['cc', 'bcc', 'replyto', 'followupto'], |
| | | ac_props; |
| | | ac_props, opener_rc = this.opener(); |
| | | |
| | | // close compose step in opener |
| | | if (window.opener && !window.opener.closed && opener.rcmail && opener.rcmail.env.action == 'compose') { |
| | | if (opener_rc && opener_rc.env.action == 'compose') { |
| | | setTimeout(function(){ opener.history.back(); }, 100); |
| | | this.env.opened_extwin = true; |
| | | } |
| | |
| | | |
| | | this.set_draft_id = function(id) |
| | | { |
| | | var rc; |
| | | |
| | | if (!this.env.draft_id && id && (rc = this.opener())) { |
| | | // refresh the drafts folder in opener window |
| | | if (rc.env.task == 'mail' && rc.env.action == '' && rc.env.mailbox == this.env.drafts_mailbox) |
| | | rc.command('checkmail'); |
| | | } |
| | | |
| | | this.env.draft_id = id; |
| | | $("input[name='_draft_saveid']").val(id); |
| | | }; |
| | | |
| | |
| | | sig = this.env.signatures[sig].text; |
| | | sig = sig.replace(/\r\n/g, '\n'); |
| | | |
| | | p = this.env.sig_above ? message.indexOf(sig) : message.lastIndexOf(sig); |
| | | p = this.env.top_posting ? message.indexOf(sig) : message.lastIndexOf(sig); |
| | | if (p >= 0) |
| | | message = message.substring(0, p) + message.substring(p+sig.length, message.length); |
| | | } |
| | |
| | | sig = this.env.signatures[id].text; |
| | | sig = sig.replace(/\r\n/g, '\n'); |
| | | |
| | | if (this.env.sig_above) { |
| | | if (this.env.top_posting) { |
| | | if (p >= 0) { // in place of removed signature |
| | | message = message.substring(0, p) + sig + message.substring(p, message.length); |
| | | cursor_pos = p - 1; |
| | |
| | | sigElem = doc.createElement('div'); |
| | | sigElem.setAttribute('id', '_rc_sig'); |
| | | |
| | | if (this.env.sig_above) { |
| | | if (this.env.top_posting) { |
| | | // if no existing sig and top posting then insert at caret pos |
| | | editor.getWin().focus(); // correct focus in IE & Chrome |
| | | |
| | |
| | | this.env.search_id = null; |
| | | }; |
| | | |
| | | this.sent_successfully = function(type, msg) |
| | | this.sent_successfully = function(type, msg, target) |
| | | { |
| | | this.display_message(msg, type); |
| | | |
| | | if (this.env.extwin) { |
| | | var rc = this.opener(); |
| | | this.lock_form(this.gui_objects.messageform); |
| | | if (window.opener && !window.opener.closed && opener.rcmail) |
| | | opener.rcmail.display_message(msg, type); |
| | | if (rc) { |
| | | rc.display_message(msg, type); |
| | | // refresh the folder where sent message was saved |
| | | if (target && rc.env.task == 'mail' && rc.env.action == '' && rc.env.mailbox == target) |
| | | rc.command('checkmail'); |
| | | } |
| | | setTimeout(function(){ window.close() }, 1000); |
| | | } |
| | | else { |
| | |
| | | delete m[k].labels[i]; |
| | | } |
| | | else { |
| | | msg = m[k].labels[i].msg; |
| | | o = m[k].labels[i].msg; |
| | | m[k].obj.html(o); |
| | | } |
| | | m[k].obj.html(msg); |
| | | } |
| | | } |
| | | } |
| | |
| | | var base = this.env.comm_path, k, param = {}; |
| | | |
| | | // overwrite task name |
| | | if (query._action.match(/([a-z]+)\/([a-z0-9-_.]+)/)) { |
| | | if (query._action.match(/([a-z0-9_-]+)\/([a-z0-9-_.]+)/)) { |
| | | query._action = RegExp.$2; |
| | | base = base.replace(/\_task=[a-z]+/, '_task='+RegExp.$1); |
| | | base = base.replace(/\_task=[a-z0-9_-]+/, '_task='+RegExp.$1); |
| | | } |
| | | |
| | | // remove undefined values |
| | |
| | | if (location_url && this.env.action != 'compose') // don't redirect on compose screen, contents might get lost (#1488926) |
| | | this.redirect(location_url); |
| | | |
| | | // 403 Forbidden response (CSRF prevention) - reload the page. |
| | | // In case there's a new valid session it will be used, otherwise |
| | | // login form will be presented (#1488960). |
| | | if (request.status == 403) { |
| | | (this.is_framed() ? parent : window).location.reload(); |
| | | return; |
| | | } |
| | | |
| | | // re-send keep-alive requests after 30 seconds |
| | | if (action == 'keep-alive') |
| | | setTimeout(function(){ ref.keep_alive(); ref.start_keepalive(); }, 30000); |
| | |
| | | /********* helper methods *********/ |
| | | /********************************************************/ |
| | | |
| | | // get window.opener.rcmail if available |
| | | this.opener = function() |
| | | { |
| | | // catch Error: Permission denied to access property rcmail |
| | | try { |
| | | if (window.opener && !opener.closed && opener.rcmail) |
| | | return opener.rcmail; |
| | | } |
| | | catch (e) {} |
| | | }; |
| | | |
| | | // check if we're in show mode or if we have a unique selection |
| | | // and return the message uid |
| | | this.get_single_uid = function() |
| | |
| | | return 1; |
| | | } |
| | | |
| | | // this will detect any pdf plugin including PDF.js in Firefox |
| | | var obj = document.createElement('OBJECT'); |
| | | obj.onload = function() { rcmail.env.browser_capabilities.pdf = 1; }; |
| | | obj.onerror = function() { rcmail.env.browser_capabilities.pdf = 0; }; |
| | | obj.style.display = 'none'; |
| | | obj.type = 'application/pdf'; |
| | | obj.data = 'program/resources/blank.pdf'; |
| | | document.body.appendChild(obj); |
| | | |
| | | return 0; |
| | | }; |
| | | |