| | |
| | | var n; |
| | | this.task = this.env.task; |
| | | |
| | | // check browser |
| | | if (this.env.server_error != 409 && (!bw.dom || !bw.xmlhttp_test() || (bw.mz && bw.vendver < 1.9) || (bw.ie && bw.vendver < 7))) { |
| | | // check browser capabilities (never use version checks here) |
| | | if (this.env.server_error != 409 && (!bw.dom || !bw.xmlhttp_test())) { |
| | | this.goto_url('error', '_code=0x199'); |
| | | return; |
| | | } |
| | |
| | | } |
| | | |
| | | // check input before leaving compose step |
| | | if (this.task == 'mail' && this.env.action == 'compose' && $.inArray(command, this.env.compose_commands) < 0 && !this.env.server_error) { |
| | | if (this.task == 'mail' && this.env.action == 'compose' && !this.env.server_error && command != 'save-pref' |
| | | && $.inArray(command, this.env.compose_commands) < 0 |
| | | ) { |
| | | if (!this.env.is_sent && this.cmp_hash != this.compose_field_hash() && !confirm(this.get_label('notsentwarning'))) |
| | | return false; |
| | | |
| | |
| | | |
| | | case 'open': |
| | | if (uid = this.get_single_uid()) { |
| | | obj.href = this.url('show', {_mbox: this.get_message_mailbox(uid), _uid: uid}); |
| | | obj.href = this.url('show', this.params_from_uid(uid)); |
| | | return true; |
| | | } |
| | | break; |
| | |
| | | break; |
| | | } |
| | | |
| | | this.goto_url('get', qstring+'&_download=1', false); |
| | | this.goto_url('get', qstring+'&_download=1', false, true); |
| | | break; |
| | | |
| | | case 'select-all': |
| | |
| | | this.gui_objects.messagepartframe.contentWindow.print(); |
| | | } |
| | | else if (uid = this.get_single_uid()) { |
| | | url = '&_action=print&_uid='+uid+'&_mbox='+urlencode(this.get_message_mailbox(uid))+(this.env.safemode ? '&_safe=1' : ''); |
| | | if (this.open_window(this.env.comm_path + url, true, true)) { |
| | | url = this.url('print', this.params_from_uid(uid, {_safe: this.env.safemode ? 1 : 0})); |
| | | if (this.open_window(url, true, true)) { |
| | | if (this.env.action != 'show') |
| | | this.mark_message('read', uid); |
| | | } |
| | |
| | | |
| | | case 'viewsource': |
| | | if (uid = this.get_single_uid()) |
| | | this.open_window(this.env.comm_path+'&_action=viewsource&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox), true, true); |
| | | this.open_window(this.url('viewsource', this.params_from_uid(uid)), true, true); |
| | | break; |
| | | |
| | | case 'download': |
| | | if (this.env.action == 'get') { |
| | | location.href = location.href.replace(/_frame=/, '_download='); |
| | | location.href = this.secure_url(location.href.replace(/_frame=/, '_download=')); |
| | | } |
| | | else if (uid = this.get_single_uid()) { |
| | | this.goto_url('viewsource', { _uid: uid, _mbox: this.get_message_mailbox(uid), _save: 1 }); |
| | | this.goto_url('viewsource', this.params_from_uid(uid, {_save: 1}), false, true); |
| | | } |
| | | break; |
| | | |
| | |
| | | |
| | | case 'export': |
| | | if (this.contact_list.rowcount > 0) { |
| | | this.goto_url('export', { _source: this.env.source, _gid: this.env.group, _search: this.env.search_request }); |
| | | this.goto_url('export', { _source: this.env.source, _gid: this.env.group, _search: this.env.search_request }, false, true); |
| | | } |
| | | break; |
| | | |
| | | case 'export-selected': |
| | | if (this.contact_list.rowcount > 0) { |
| | | this.goto_url('export', { _source: this.env.source, _gid: this.env.group, _cid: this.contact_list.get_selection().join(',') }); |
| | | this.goto_url('export', { _source: this.env.source, _gid: this.env.group, _cid: this.contact_list.get_selection().join(',') }, false, true); |
| | | } |
| | | break; |
| | | |
| | |
| | | if (task == 'mail') |
| | | url += '&_mbox=INBOX'; |
| | | else if (task == 'logout' && !this.env.server_error) { |
| | | url += '&_token=' + this.env.request_token; |
| | | url = this.secure_url(url); |
| | | this.clear_compose_data(); |
| | | } |
| | | |
| | |
| | | |
| | | return url + '?' + name + '=' + value; |
| | | }; |
| | | |
| | | // append CSRF protection token to the given url |
| | | this.secure_url = function(url) |
| | | { |
| | | return this.add_url(url, '_token', this.env.request_token); |
| | | }, |
| | | |
| | | this.is_framed = function() |
| | | { |
| | |
| | | |
| | | // select the folder if one of its childs is currently selected |
| | | // don't select if it's virtual (#1488346) |
| | | if (!node.virtual && this.env.mailbox && this.env.mailbox.startsWith(name + this.env.delimiter)) |
| | | this.command('list', name); |
| | | if (!node.virtual && this.env.mailbox && this.env.mailbox.startsWith(node.id + this.env.delimiter)) |
| | | this.command('list', node.id); |
| | | } |
| | | else { |
| | | var reg = new RegExp('&'+urlencode(node.id)+'&'); |
| | |
| | | return; |
| | | |
| | | var win, target = window, |
| | | url = { |
| | | _uid: id, |
| | | _mbox: this.get_message_mailbox(id), |
| | | // add browser capabilities, so we can properly handle attachments |
| | | _caps: this.browser_capabilities() |
| | | }; |
| | | url = this.params_from_uid(id, {_caps: this.browser_capabilities()}); |
| | | |
| | | if (preview && (win = this.get_frame_window(this.env.contentframe))) { |
| | | target = win; |
| | |
| | | // removes messages that doesn't exists from list selection array |
| | | this.update_selection = function() |
| | | { |
| | | var selected = this.message_list.selection, |
| | | rows = this.message_list.rows, |
| | | var list = this.message_list, |
| | | selected = list.selection, |
| | | rows = list.rows, |
| | | i, selection = []; |
| | | |
| | | for (i in selected) |
| | | if (rows[selected[i]]) |
| | | selection.push(selected[i]); |
| | | |
| | | this.message_list.selection = selection; |
| | | list.selection = selection; |
| | | |
| | | // reset preview frame, if currently previewed message is not selected (has been removed) |
| | | try { |
| | | var win = this.get_frame_window(this.env.contentframe), |
| | | id = win.rcmail.env.uid; |
| | | |
| | | if (id && $.inArray(id, selection) < 0) |
| | | if (id && !list.in_selection(id)) |
| | | this.show_contentframe(false); |
| | | } |
| | | catch (e) {}; |
| | |
| | | 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 + ' '); |
| | | input.val(oldval + recipients.join(delim + ' ') + delim + ' ').change(); |
| | | this.triggerEvent('add-recipient', { field:field, recipients:recipients }); |
| | | } |
| | | |
| | |
| | | if (show) { |
| | | // truncate stack down to the one containing the ref link |
| | | for (var i = this.menu_stack.length - 1; stack && i >= 0; i--) { |
| | | if (!$(ref).parents('#'+this.menu_stack[i]).length) |
| | | if (!$(ref).parents('#'+this.menu_stack[i]).length && $(event.target).parent().attr('role') != 'menuitem') |
| | | this.hide_menu(this.menu_stack[i], event); |
| | | } |
| | | if (stack && this.menu_stack.length) { |
| | |
| | | } |
| | | }; |
| | | |
| | | this.goto_url = function(action, query, lock) |
| | | this.goto_url = function(action, query, lock, secure) |
| | | { |
| | | this.redirect(this.url(action, query), lock); |
| | | var url = this.url(action, query) |
| | | if (secure) url = this.secure_url(url); |
| | | this.redirect(url, lock); |
| | | }; |
| | | |
| | | this.location_href = function(url, target, frame) |
| | |
| | | } |
| | | |
| | | this.enable_command('set-listmode', this.env.threads && !is_multifolder); |
| | | if (list.rowcount > 0) |
| | | if (list.rowcount > 0 && !$(document.activeElement).is('input,textarea')) |
| | | list.focus(); |
| | | this.msglist_select(list); |
| | | |
| | | // trigger 'select' so all dependent actions update its state |
| | | // e.g. plugins use this event to activate buttons (#1490647) |
| | | list.triggerEvent('select'); |
| | | } |
| | | |
| | | if (response.action != 'getunread') |
| | |
| | | this.enable_command('search-create', this.env.source == ''); |
| | | this.enable_command('search-delete', this.env.search_id); |
| | | this.update_group_commands(); |
| | | if (this.contact_list.rowcount > 0) |
| | | if (this.contact_list.rowcount > 0 && !$(document.activeElement).is('input,textarea')) |
| | | this.contact_list.focus(); |
| | | this.triggerEvent('listupdate', { folder:this.env.source, rowcount:this.contact_list.rowcount }); |
| | | } |
| | |
| | | // html5 file-drop API |
| | | this.document_drag_hover = function(e, over) |
| | | { |
| | | e.preventDefault(); |
| | | // don't e.preventDefault() here to not block text dragging on the page (#1490619) |
| | | $(this.gui_objects.filedrop)[(over?'addClass':'removeClass')]('active'); |
| | | }; |
| | | |
| | |
| | | var submit_data = function() { |
| | | var multiple = files.length > 1, |
| | | ts = new Date().getTime(), |
| | | content = '<span>' + (multiple ? ref.get_label('uploadingmany') : files[0].name) + '</span>'; |
| | | // jQuery way to escape filename (#1490530) |
| | | content = $('<span>').text(multiple ? ref.get_label('uploadingmany') : files[0].name).html(); |
| | | |
| | | // add to attachments list |
| | | if (!ref.add2attachment_list(ts, { name:'', html:content, classname:'uploading', complete:false })) |
| | |
| | | // get the IMP mailbox of the message with the given UID |
| | | this.get_message_mailbox = function(uid) |
| | | { |
| | | var msg = this.env.messages ? this.env.messages[uid] : {}; |
| | | var msg = (this.env.messages && uid ? this.env.messages[uid] : null) || {}; |
| | | return msg.mbox || this.env.mailbox; |
| | | }; |
| | | |
| | | // build request parameters from single message id (maybe with mailbox name) |
| | | this.params_from_uid = function(uid, params) |
| | | { |
| | | if (!params) |
| | | params = {}; |
| | | |
| | | params._uid = String(uid).split('-')[0]; |
| | | params._mbox = this.get_message_mailbox(uid); |
| | | |
| | | return params; |
| | | }; |
| | | |
| | | // gets cursor position |
| | |
| | | if (!this.env.browser_capabilities) |
| | | this.env.browser_capabilities = {}; |
| | | |
| | | if (this.env.browser_capabilities.pdf === undefined) |
| | | this.env.browser_capabilities.pdf = this.pdf_support_check(); |
| | | |
| | | if (this.env.browser_capabilities.flash === undefined) |
| | | this.env.browser_capabilities.flash = this.flash_support_check(); |
| | | |
| | | if (this.env.browser_capabilities.tif === undefined) |
| | | this.tif_support_check(); |
| | | $.each(['pdf', 'flash', 'tif'], function() { |
| | | if (ref.env.browser_capabilities[this] === undefined) |
| | | ref.env.browser_capabilities[this] = ref[this + '_support_check'](); |
| | | }); |
| | | }; |
| | | |
| | | // Returns browser capabilities string |
| | |
| | | |
| | | this.tif_support_check = function() |
| | | { |
| | | var img = new Image(); |
| | | window.setTimeout(function() { |
| | | var img = new Image(); |
| | | img.onload = function() { ref.env.browser_capabilities.tif = 1; }; |
| | | img.onerror = function() { ref.env.browser_capabilities.tif = 0; }; |
| | | img.src = ref.assets_path('program/resources/blank.tif'); |
| | | }, 10); |
| | | |
| | | img.onload = function() { ref.env.browser_capabilities.tif = 1; }; |
| | | img.onerror = function() { ref.env.browser_capabilities.tif = 0; }; |
| | | img.src = this.assets_path('program/resources/blank.tif'); |
| | | return 0; |
| | | }; |
| | | |
| | | this.pdf_support_check = function() |
| | |
| | | return 1; |
| | | } |
| | | |
| | | window.setTimeout(function() { |
| | | $('<object>').css({position: 'absolute', left: '-10000px'}) |
| | | .attr({data: ref.assets_path('program/resources/dummy.pdf'), width: 1, height: 1, type: 'application/pdf'}) |
| | | .load(function() { ref.env.browser_capabilities.pdf = 1; }) |
| | | .error(function() { ref.env.browser_capabilities.pdf = 0; }) |
| | | .appendTo($('body')); |
| | | }, 10); |
| | | |
| | | return 0; |
| | | }; |
| | | |