| | |
| | | parent.rcmail.env.frame_lock = null; |
| | | } |
| | | |
| | | // Makes that reference to document.activeElement do not throw |
| | | // "unspecified error" in IE9 (#1489008) |
| | | if (this.env.framed && bw.ie) |
| | | document.documentElement.focus(); |
| | | |
| | | // enable general commands |
| | | this.enable_command('close', 'logout', 'mail', 'addressbook', 'settings', 'save-pref', 'compose', 'undo', 'about', 'switch-task', true); |
| | | |
| | |
| | | } |
| | | |
| | | // detect browser capabilities |
| | | if (!this.is_framed()) |
| | | if (!this.is_framed() && !this.env.extwin) |
| | | this.browser_capabilities_check(); |
| | | |
| | | break; |
| | |
| | | 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.target = this.open_window('', 1100); |
| | | this.gui_objects.messageform.submit(); |
| | | } |
| | | else { |
| | | this.open_window(this.env.permaurl, 900, 900); |
| | | this.open_window(this.env.permaurl, 900); |
| | | } |
| | | break; |
| | | |
| | |
| | | |
| | | // start timer for message preview (wait for double click) |
| | | if (selected && this.env.contentframe && !list.multi_selecting && !this.dummy_select) |
| | | this.preview_timer = setTimeout(function(){ ref.msglist_get_preview(); }, 200); |
| | | this.preview_timer = setTimeout(function() { ref.msglist_get_preview(); }, this.dblclick_time); |
| | | else if (this.env.contentframe) |
| | | this.show_contentframe(false); |
| | | }; |
| | |
| | | |
| | | var win = this.get_frame_window(this.env.contentframe); |
| | | |
| | | if (win && win.location.href.indexOf(this.env.blankpage)>=0) { |
| | | 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); |
| | | |
| | | this.preview_timer = setTimeout(function() { ref.msglist_get_preview(); }, this.dblclick_time); |
| | | } |
| | | }; |
| | | |
| | |
| | | { |
| | | if (this.preview_timer) |
| | | clearTimeout(this.preview_timer); |
| | | |
| | | if (this.preview_read_timer) |
| | | clearTimeout(this.preview_read_timer); |
| | | |
| | | var uid = list.get_single_selection(); |
| | | |
| | | if (uid && this.env.mailbox == this.env.drafts_mailbox) |
| | | this.open_compose_step({ _draft_uid: uid, _mbox: this.env.mailbox }); |
| | | else if (uid) |
| | |
| | | return 0; |
| | | }; |
| | | |
| | | this.open_window = function(url, width, height) |
| | | this.open_window = function(url, width) |
| | | { |
| | | var w = Math.min(width, screen.width - 10), |
| | | h = Math.min(height, screen.height - 100), |
| | | l = (screen.width - w) / 2 + (screen.left || 0), |
| | | t = Math.max(0, (screen.height - h) / 2 + (screen.top || 0) - 20), |
| | | var win = this.is_framed() ? parent.window : window, |
| | | page = $(win), |
| | | page_width = page.width(), |
| | | page_height = bw.mz ? $('body', win).height() : page.height(), |
| | | w = Math.min(width, page_width), |
| | | h = page_height, // always use same height |
| | | l = (win.screenLeft || win.screenX) + 20, |
| | | t = (win.screenTop || win.screenY) + 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 |
| | |
| | | |
| | | // focus window, delayed to bring to front |
| | | window.setTimeout(function() { extwin.focus(); }, 10); |
| | | // position window with setTimeout for Chrome (#1488931) |
| | | window.setTimeout(function() { extwin.moveTo(l,t); }, bw.chrome ? 100 : 10); |
| | | |
| | | return wname; |
| | | }; |
| | |
| | | else |
| | | html = cols[c]; |
| | | |
| | | col.innerHTML = html; |
| | | if (html) |
| | | col.innerHTML = html; |
| | | |
| | | row.appendChild(col); |
| | | } |
| | |
| | | } |
| | | else { |
| | | if (!preview && this.env.message_extwin && !this.env.extwin) |
| | | this.open_window(this.env.comm_path+url, 1000, 1200); |
| | | this.open_window(this.env.comm_path+url, 1000); |
| | | else |
| | | this.location_href(this.env.comm_path+url, target, true); |
| | | |
| | |
| | | |
| | | // open new compose window |
| | | if (this.env.compose_extwin && !this.env.extwin) { |
| | | this.open_window(url, 1150, 900); |
| | | this.open_window(url, 1150); |
| | | } |
| | | else { |
| | | this.redirect(url); |
| | | window.resizeTo(Math.max(1150, $(window).width()), Math.max(900, $(window).height())); |
| | | if (this.env.extwin) |
| | | window.resizeTo(Math.max(1150, $(window).width()), $(window).height()+24); |
| | | } |
| | | }; |
| | | |
| | |
| | | |
| | | this.compose_add_recipient = function(field) |
| | | { |
| | | var recipients = [], input = $('#_'+field); |
| | | var recipients = [], input = $('#_'+field), delim = this.env.recipients_delimiter; |
| | | |
| | | if (this.contact_list && this.contact_list.selection.length) { |
| | | for (var id, n=0; n < this.contact_list.selection.length; n++) { |
| | |
| | | } |
| | | |
| | | if (recipients.length && input.length) { |
| | | var oldval = input.val(); |
| | | input.val((oldval ? oldval + this.env.recipients_delimiter : '') + recipients.join(this.env.recipients_delimiter)); |
| | | var oldval = input.val(), rx = new RegExp(RegExp.escape(delim) + '\\s*$'); |
| | | if (oldval && !rx.test(oldval)) |
| | | oldval += delim + ' '; |
| | | input.val(oldval + recipients.join(delim + ' ') + delim + ' '); |
| | | this.triggerEvent('add-recipient', { field:field, recipients:recipients }); |
| | | } |
| | | }; |
| | |
| | | |
| | | 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 opener_rc = this.opener(); |
| | | var rc = this.opener(); |
| | | this.lock_form(this.gui_objects.messageform); |
| | | if (opener_rc) |
| | | opener_rc.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 { |
| | |
| | | var n, id, sid, ref = this, writable = false, |
| | | source = this.env.source ? this.env.address_sources[this.env.source] : null; |
| | | |
| | | // we don't have dblclick handler here, so use 200 instead of this.dblclick_time |
| | | if (id = list.get_single_selection()) |
| | | this.preview_timer = setTimeout(function(){ ref.load_contact(id, 'show'); }, 200); |
| | | else if (this.env.contentframe) |
| | |
| | | for (c in cols) { |
| | | col = document.createElement('td'); |
| | | col.className = String(c).toLowerCase(); |
| | | col.innerHTML = cols[c]; |
| | | if (cols[c]) |
| | | col.innerHTML = cols[c]; |
| | | row.appendChild(col); |
| | | } |
| | | |
| | |
| | | |
| | | for (c=0, len=repl.length; c < len; c++) { |
| | | cell = document.createElement('td'); |
| | | cell.innerHTML = repl[c].html; |
| | | cell.innerHTML = repl[c].html || ''; |
| | | if (repl[c].id) cell.id = repl[c].id; |
| | | if (repl[c].className) cell.className = repl[c].className; |
| | | tr.appendChild(cell); |
| | | } |
| | | th.appendChild(tr); |
| | | thead.parentNode.replaceChild(th, thead); |
| | | thead = th; |
| | | list.thead = thead = th; |
| | | } |
| | | |
| | | for (n=0, len=this.env.coltypes.length; n<len; n++) { |
| | |
| | | url: ref.url(ref.env.filedrop.action||'upload', { _id:ref.env.compose_id||ref.env.cid||'', _uploadid:ts, _remote:1 }), |
| | | contentType: formdata ? false : 'multipart/form-data; boundary=' + boundary, |
| | | processData: false, |
| | | timeout: 0, // disable default timeout set in ajaxSetup() |
| | | data: formdata || multipart, |
| | | headers: {'X-Roundcube-Request': ref.env.request_token}, |
| | | beforeSend: function(xhr, s) { if (!formdata && xhr.sendAsBinary) xhr.send = xhr.sendAsBinary; }, |
| | | xhr: function() { var xhr = jQuery.ajaxSettings.xhr(); if (!formdata && xhr.sendAsBinary) xhr.send = xhr.sendAsBinary; return xhr; }, |
| | | success: function(data){ ref.http_response(data); }, |
| | | error: function(o, status, err) { ref.http_error(o, status, err, null, 'attachment'); } |
| | | }); |
| | |
| | | multipart += '; filename="' + (f.name_bin || file.name) + '"' + crlf; |
| | | multipart += 'Content-Length: ' + file.size + crlf; |
| | | multipart += 'Content-Type: ' + file.type + crlf + crlf; |
| | | multipart += e.target.result + crlf; |
| | | multipart += reader.result + crlf; |
| | | multipart += dashdash + boundary + crlf; |
| | | |
| | | if (j == last) // we're done, submit the data |