From 32077b1685410b4b5251ca6eade8e6c6a59ecf63 Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Tue, 13 Mar 2012 05:09:47 -0400 Subject: [PATCH] - Fix js errors (spellcheck-related) when switching editor mode in identity screen --- program/js/app.js | 383 ++++++++++++++++++++++++++++++++--------------------- 1 files changed, 230 insertions(+), 153 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index b6c7d1d..3b2a148 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -3,9 +3,12 @@ | Roundcube Webmail Client Script | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2011, The Roundcube Dev Team | + | Copyright (C) 2005-2012, The Roundcube Dev Team | | Copyright (C) 2011, Kolab Systems AG | - | Licensed under the GNU GPL | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | | | +-----------------------------------------------------------------------+ | Authors: Thomas Bruederli <roundcube@gmail.com> | @@ -30,6 +33,7 @@ this.command_handlers = {}; this.onloads = []; this.messages = {}; + this.group2expand = {}; // create protected reference to myself this.ref = 'rcmail'; @@ -132,7 +136,7 @@ this.task = this.env.task; // check browser - if (!bw.dom || !bw.xmlhttp_test()) { + if (!bw.dom || !bw.xmlhttp_test() || (bw.mz && bw.vendver < 1.9)) { this.goto_url('error', '_code=0x199'); return; } @@ -246,19 +250,20 @@ } } else if (this.env.action == 'compose') { - this.env.compose_commands = ['send-attachment', 'remove-attachment', 'send', 'cancel', 'toggle-editor']; + this.env.compose_commands = ['send-attachment', 'remove-attachment', 'send', 'cancel', 'toggle-editor', 'list-adresses']; if (this.env.drafts_mailbox) this.env.compose_commands.push('savedraft') this.enable_command(this.env.compose_commands, 'identities', true); + // add more commands (not enabled) + $.merge(this.env.compose_commands, ['add-recipient', 'firstpage', 'previouspage', 'nextpage', 'lastpage']); + if (this.env.spellcheck) { - this.env.spellcheck.spelling_state_observer = function(s){ ref.set_spellcheck_state(s); }; + this.env.spellcheck.spelling_state_observer = function(s) { ref.spellcheck_state(); }; this.env.compose_commands.push('spellcheck') - this.set_spellcheck_state('ready'); - if ($("input[name='_is_html']").val() == '1') - this.display_spellcheck_controls(false); + this.enable_command('spellcheck', true); } document.onmouseup = function(e){ return p.doc_mouse_up(e); }; @@ -278,6 +283,20 @@ this.env.unread_counts = {}; this.gui_objects.folderlist = this.gui_objects.mailboxlist; this.http_request('getunread', ''); + } + + // init address book widget + if (this.gui_objects.contactslist) { + this.contact_list = new rcube_list_widget(this.gui_objects.contactslist, + { multiselect:true, draggable:false, keyboard:false }); + this.contact_list.addEventListener('select', function(o){ ref.compose_recipient_select(o); }); + this.contact_list.addEventListener('dblclick', function(o){ ref.compose_add_recipient('to'); }); + this.contact_list.init(); + } + + if (this.gui_objects.addressbookslist) { + this.gui_objects.folderlist = this.gui_objects.addressbookslist; + this.enable_command('list-adresses', true); } // ask user to send MDN @@ -354,8 +373,11 @@ this.enable_command('add', this.env.identities_level < 2); } else if (this.env.action == 'edit-identity' || this.env.action == 'add-identity') { - this.enable_command('add', this.env.identities_level < 2); - this.enable_command('save', 'delete', 'edit', 'toggle-editor', true); + this.enable_command('save', 'edit', 'toggle-editor', true); + this.enable_command('delete', this.env.identities_level < 2); + + if (this.env.action == 'add-identity') + $("input[type='text']").first().select(); } else if (this.env.action == 'folders') { this.enable_command('subscribe', 'unsubscribe', 'create-folder', 'rename-folder', true); @@ -407,6 +429,7 @@ // display 'loading' message on form submit, lock submit button $('form').submit(function () { $('input[type=submit]', this).prop('disabled', true); + rcmail.clear_messages(); rcmail.display_message('', 'loading'); }); @@ -873,13 +896,18 @@ break; case 'spellcheck': - if (window.tinyMCE && tinyMCE.get(this.env.composebody)) { - tinyMCE.execCommand('mceSpellCheck', true); + if (this.spellcheck_state()) { + this.stop_spellchecking(); } - else if (this.env.spellcheck && this.env.spellcheck.spellCheck && this.spellcheck_ready) { - this.env.spellcheck.spellCheck(); - this.set_spellcheck_state('checking'); + else { + if (window.tinyMCE && tinyMCE.get(this.env.composebody)) { + tinyMCE.execCommand('mceSpellCheck', true); + } + else if (this.env.spellcheck && this.env.spellcheck.spellCheck) { + this.env.spellcheck.spellCheck(); + } } + this.spellcheck_state(); break; case 'savedraft': @@ -931,12 +959,21 @@ case 'send-attachment': // Reset the auto-save timer self.clearTimeout(this.save_timer); - - this.upload_file(props) + + this.upload_file(props || this.gui_objects.uploadform); break; case 'insert-sig': this.change_identity($("[name='_from']")[0], true); + break; + + case 'list-adresses': + this.list_contacts(props); + this.enable_command('add-recipient', false); + break; + + case 'add-recipient': + this.compose_add_recipient(props); break; case 'reply-all': @@ -1043,7 +1080,7 @@ break; case 'upload-photo': - this.upload_contact_photo(props); + this.upload_contact_photo(props || this.gui_objects.uploadform); break; case 'delete-photo': @@ -1364,7 +1401,7 @@ if (this.folder_auto_timer) window.clearTimeout(this.folder_auto_timer); - this.folder_auto_expand = k; + this.folder_auto_expand = this.env.mailboxes[k].id; this.folder_auto_timer = window.setTimeout(function() { rcmail.command('collapse-folder', rcmail.folder_auto_expand); rcmail.drag_start(null); @@ -1411,8 +1448,9 @@ div.removeClass('expanded').addClass('collapsed'); this.env.collapsed_folders = this.env.collapsed_folders+'&'+urlencode(name)+'&'; - // select parent folder if one of its childs is currently selected - if (this.env.mailbox.indexOf(name + this.env.delimiter) == 0) + // select the folder if one of its childs is currently selected + // don't select if it's virtual (#1488346) + if (this.env.mailbox.indexOf(name + this.env.delimiter) == 0 && !$(li).hasClass('virtual')) this.command('list', name); } else @@ -1586,6 +1624,7 @@ { if (this.env.messages[row.uid]) this.env.messages[row.uid].expanded = row.expanded; + $(row.obj)[row.expanded?'addClass':'removeClass']('expanded'); }; this.msglist_set_coltypes = function(list) @@ -1704,11 +1743,12 @@ flags: flags.extra_flags }); - var c, n, col, html, tree = '', expando = '', + var c, n, col, html, css_class, + tree = '', expando = '', list = this.message_list, rows = list.rows, message = this.env.messages[uid], - css_class = 'message' + row_class = 'message' + (!flags.seen ? ' unread' : '') + (flags.deleted ? ' deleted' : '') + (flags.flagged ? ' flagged' : '') @@ -1718,7 +1758,6 @@ row = document.createElement('tr'); row.id = 'rcmrow'+uid; - row.className = css_class; // message status icons css_class = 'msgicon'; @@ -1755,6 +1794,8 @@ } else message.expanded = true; + + row_class += ' thread expanded'; } else if (message.has_children) { if (message.expanded === undefined && (this.env.autoexpand_threads == 1 || (this.env.autoexpand_threads == 2 && message.unread_children))) { @@ -1762,10 +1803,12 @@ } expando = '<div id="rcmexpando' + uid + '" class="' + (message.expanded ? 'expanded' : 'collapsed') + '"> </div>'; + row_class += ' thread' + (message.expanded? ' expanded' : ''); } } tree += '<span id="msgicn'+uid+'" class="'+css_class+'"> </span>'; + row.className = row_class; // build subject link if (!bw.ie && cols.subject) { @@ -1970,10 +2013,10 @@ if (page > 0 && page <= this.env.pagecount) { this.env.current_page = page; - if (this.task == 'mail') - this.list_mailbox(this.env.mailbox, page); - else if (this.task == 'addressbook') + if (this.task == 'addressbook' || this.contact_list) this.list_contacts(this.env.source, this.env.group, page); + else if (this.task == 'mail') + this.list_mailbox(this.env.mailbox, page); } }; @@ -2958,6 +3001,38 @@ obj[bw.ie || bw.safari || bw.chrome ? 'keydown' : 'keypress'](function(e) { return ref.ksearch_keydown(e, this, props); }) .attr('autocomplete', 'off'); }; + + this.compose_recipient_select = function(list) + { + this.enable_command('add-recipient', list.selection.length > 0); + }; + + this.compose_add_recipient = function(field) + { + var recipients = [], input = $('#_'+field); + + if (this.contact_list && this.contact_list.selection.length) { + for (var id, n=0; n < this.contact_list.selection.length; n++) { + id = this.contact_list.selection[n]; + if (id && this.env.contactdata[id]) { + recipients.push(this.env.contactdata[id]); + + // group is added, expand it + if (id.charAt(0) == 'E' && this.env.contactdata[id].indexOf('@') < 0 && input.length) { + var gid = id.substr(1); + this.group2expand[gid] = { name:this.env.contactdata[id], input:input.get(0) }; + this.http_request('group-expand', '_source='+urlencode(this.env.source)+'&_gid='+urlencode(gid), false); + } + } + } + } + + if (recipients.length && input.length) { + var oldval = input.val(); + input.val((oldval ? oldval + this.env.recipients_delimiter : '') + recipients.join(this.env.recipients_delimiter)); + this.triggerEvent('add-recipient', { field:field, recipients:recipients }); + } + }; // checks the input fields before sending a message this.check_compose_input = function(cmd) @@ -3044,8 +3119,9 @@ this.toggle_editor = function(props) { + this.stop_spellchecking(); + if (props.mode == 'html') { - this.display_spellcheck_controls(false); this.plain2html($('#'+props.id).val(), props.id); tinyMCE.execCommand('mceAddControl', false, props.id); @@ -3056,8 +3132,6 @@ } else { var thisMCE = tinyMCE.get(props.id), existingHtml; - if (thisMCE.plugins.spellchecker && thisMCE.plugins.spellchecker.active) - thisMCE.execCommand('mceSpellCheck', false); if (existingHtml = thisMCE.getContent()) { if (!confirm(this.get_label('editorwarning'))) { @@ -3066,7 +3140,6 @@ this.html2plain(existingHtml, props.id); } tinyMCE.execCommand('mceRemoveControl', false, props.id); - this.display_spellcheck_controls(true); } return true; @@ -3075,43 +3148,53 @@ this.stop_spellchecking = function() { var ed; + if (window.tinyMCE && (ed = tinyMCE.get(this.env.composebody))) { - if (ed.plugins.spellchecker && ed.plugins.spellchecker.active) + if (ed.plugins && ed.plugins.spellchecker && ed.plugins.spellchecker.active) ed.execCommand('mceSpellCheck'); } - else if ((ed = this.env.spellcheck) && !this.spellcheck_ready) { - $(ed.spell_span).trigger('click'); - this.set_spellcheck_state('ready'); + else if (ed = this.env.spellcheck) { + if (ed.state && ed.state != 'ready' && ed.state != 'no_error_found') + $(ed.spell_span).trigger('click'); } + + this.spellcheck_state(); }; - this.display_spellcheck_controls = function(vis) + this.spellcheck_state = function() { - if (this.env.spellcheck) { - // stop spellchecking process - if (!vis) - this.stop_spellchecking(); + var ed, active; - $(this.env.spellcheck.spell_container).css('visibility', vis ? 'visible' : 'hidden'); - } - }; + if (window.tinyMCE && (ed = tinyMCE.get(this.env.composebody)) && ed.plugins && ed.plugins.spellchecker) + active = ed.plugins.spellchecker.active; + else if ((ed = this.env.spellcheck) && ed.state) + active = ed.state != 'ready' && ed.state != 'no_error_found'; - this.set_spellcheck_state = function(s) - { - this.spellcheck_ready = (s == 'ready' || s == 'no_error_found'); - this.enable_command('spellcheck', this.spellcheck_ready); + if (rcmail.buttons.spellcheck) + $('#'+rcmail.buttons.spellcheck[0].id)[active ? 'addClass' : 'removeClass']('selected'); + + return active; }; // get selected language this.spellcheck_lang = function() { var ed; - if (window.tinyMCE && (ed = tinyMCE.get(this.env.composebody)) && ed.plugins.spellchecker) { + + if (window.tinyMCE && (ed = tinyMCE.get(this.env.composebody)) && ed.plugins && ed.plugins.spellchecker) return ed.plugins.spellchecker.selectedLang; - } - else if (this.env.spellcheck) { + else if (this.env.spellcheck) return GOOGIE_CUR_LANG; - } + }; + + this.spellcheck_lang_set = function(lang) + { + var ed; + + if (window.tinyMCE && (ed = tinyMCE.get(this.env.composebody)) && ed.plugins) + ed.plugins.spellchecker.selectedLang = lang; + else if (this.env.spellcheck) + this.env.spellcheck.setCurrentLanguage(lang); }; // resume spellchecking, highlight provided mispellings without new ajax request @@ -3130,6 +3213,8 @@ sp.prepare(false, true); sp.processData(data); } + + this.spellcheck_state(); } this.set_draft_id = function(id) @@ -3357,10 +3442,10 @@ ts = frame_name.replace(/^rcmupload/, ''); if (this.env.loadingicon) - content = '<img src="'+this.env.loadingicon+'" alt="" />'+content; + content = '<img src="'+this.env.loadingicon+'" alt="" class="uploading" />'+content; if (this.env.cancelicon) - content = '<a title="'+this.get_label('cancel')+'" onclick="return rcmail.cancel_attachment_upload(\''+ts+'\', \''+frame_name+'\');" href="#cancelupload"><img src="'+this.env.cancelicon+'" alt="" /></a>'+content; - this.add2attachment_list(ts, { name:'', html:content, complete:false }); + content = '<a title="'+this.get_label('cancel')+'" onclick="return rcmail.cancel_attachment_upload(\''+ts+'\', \''+frame_name+'\');" href="#cancelupload" class="cancelupload"><img src="'+this.env.cancelicon+'" alt="" /></a>'+content; + this.add2attachment_list(ts, { name:'', html:content, classname:'uploading', complete:false }); // upload progress support if (this.env.upload_progress_time) { @@ -3380,7 +3465,7 @@ if (!this.gui_objects.attachmentlist) return false; - var indicator, li = $('<li>').attr('id', name).html(att.html); + var indicator, li = $('<li>').attr('id', name).addClass(att.classname).html(att.html); // replace indicator's li if (upload_id && (indicator = document.getElementById(upload_id))) { @@ -3630,8 +3715,7 @@ // insert all members of a group if (typeof this.env.contacts[id] === 'object' && this.env.contacts[id].id) { insert += this.env.contacts[id].name + this.env.recipients_delimiter; - this.group2expand = $.extend({}, this.env.contacts[id]); - this.group2expand.input = this.ksearch_input; + this.group2expand[this.env.contacts[id].id] = $.extend({ input: this.ksearch_input }, this.env.contacts[id]); this.http_request('mail/group-expand', '_source='+urlencode(this.env.contacts[id].source)+'&_gid='+urlencode(this.env.contacts[id].id), false); } else if (typeof this.env.contacts[id] === 'string') { @@ -3652,10 +3736,10 @@ this.replace_group_recipients = function(id, recipients) { - if (this.group2expand && this.group2expand.id == id) { - this.group2expand.input.value = this.group2expand.input.value.replace(this.group2expand.name, recipients); - this.triggerEvent('autocomplete_insert', { field:this.group2expand.input, insert:recipients }); - this.group2expand = null; + if (this.group2expand[id]) { + this.group2expand[id].input.value = this.group2expand[id].input.value.replace(this.group2expand[id].name, recipients); + this.triggerEvent('autocomplete_insert', { field:this.group2expand[id].input, insert:recipients }); + this.group2expand[id] = null; } }; @@ -3994,7 +4078,7 @@ if (this.env.search_request) url += '&_search='+this.env.search_request; - this.http_request('list', url, lock); + this.http_request(this.env.task == 'mail' ? 'list-contacts' : 'list', url, lock); }; this.list_contacts_clear = function() @@ -4200,7 +4284,6 @@ yearRange: '-100:+10', showOtherMonths: true, selectOtherMonths: true, - monthNamesShort: this.env.month_names, onSelect: function(dateText) { $(this).focus().val(dateText) } }); $('input.datepicker').datepicker(); @@ -4583,7 +4666,7 @@ { var n, buttons = this.buttons['upload-photo']; for (n=0; buttons && n < buttons.length; n++) - $('#'+buttons[n].id).html(this.get_label(id == '-del-' ? 'addphoto' : 'replacephoto')); + $('a#'+buttons[n].id).html(this.get_label(id == '-del-' ? 'addphoto' : 'replacephoto')); $('#ff_photo').val(id); this.enable_command('upload-photo', this.env.coltypes.photo ? true : false); @@ -4735,14 +4818,16 @@ this.identity_select = function(list) { var id; - if (id = list.get_single_selection()) + if (id = list.get_single_selection()) { + this.enable_command('delete', list.rowcount > 1 && this.env.identities_level < 2); this.load_identity(id, 'edit-identity'); + } }; // load identity record this.load_identity = function(id, action) { - if (action=='edit-identity' && (!id || id==this.env.iid)) + if (action == 'edit-identity' && (!id || id == this.env.iid)) return false; var add_url = '', target = window; @@ -4753,7 +4838,7 @@ document.getElementById(this.env.contentframe).style.visibility = 'inherit'; } - if (action && (id || action=='add-identity')) { + if (action && (id || action == 'add-identity')) { this.set_busy(true); this.location_href(this.env.comm_path+'&_action='+action+'&_iid='+id+add_url, target); } @@ -4763,7 +4848,7 @@ this.delete_identity = function(id) { - // exit if no mailbox specified or if selection is empty + // exit if no identity is specified or if selection is empty var selection = this.identity_list.get_selection(); if (!(selection.length || this.env.iid)) return; @@ -4771,10 +4856,27 @@ if (!id) id = this.env.iid ? this.env.iid : selection[0]; - // append token to request - this.goto_url('delete-identity', '_iid='+id+'&_token='+this.env.request_token, true); + // submit request with appended token + if (confirm(this.get_label('deleteidentityconfirm'))) + this.goto_url('delete-identity', '_iid='+id+'&_token='+this.env.request_token, true); return true; + }; + + this.update_identity_row = function(id, name, add) + { + var row, col, list = this.identity_list, + rid = this.html_identifier(id); + + if (list.rows[rid] && (row = list.rows[rid].obj)) { + $(row.cells[0]).html(name); + } + else if (add) { + row = $('<tr>').attr('id', 'rcmrow'+rid).get(0); + col = $('<td>').addClass('mail').html(name).appendTo(row); + list.insert_row(row); + list.select(rid); + } }; @@ -4895,7 +4997,7 @@ if (!this.gui_objects.subscriptionlist) return false; - var row, n, i, tmp, folders, rowid, list = [], slist = [], + var row, n, i, tmp, tmp_name, folders, rowid, list = [], slist = [], tbody = this.gui_objects.subscriptionlist.tBodies[0], refrow = $('tr', tbody).get(1), id = 'rcmrow'+((new Date).getTime()); @@ -4931,8 +5033,12 @@ for (n in folders) { // protected folder if (folders[n][2]) { + tmp_name = folders[n][0] + this.env.delimiter; + // prefix namespace cannot have subfolders (#1488349) + if (tmp_name == this.env.prefix_ns) + continue; slist.push(folders[n][0]); - tmp = folders[n][0]+this.env.delimiter; + tmp = tmp_name; } // protected folder's child else if (tmp && folders[n][0].indexOf(tmp) == 0) @@ -5400,6 +5506,8 @@ obj.click(function() { return ref.hide_message(obj); }); } + this.triggerEvent('message', { message:msg, type:type, timeout:timeout, object:obj }); + if (timeout > 0) window.setTimeout(function() { ref.hide_message(id, type == 'loading'); }, timeout); return id; @@ -5448,6 +5556,23 @@ } } } + }; + + // remove all messages immediately + this.clear_messages = function() + { + // pass command to parent window + if (this.is_framed()) + return parent.rcmail.clear_messages(); + + var k, n, m = this.messages; + + for (k in m) + for (n in m[k].elements) + if (m[k].obj) + m[k].obj.hide(); + + this.messages = {}; }; // mark a mailbox as selected and set environment variable @@ -5578,12 +5703,11 @@ // replace content of quota display this.set_quota = function(content) { - if (content && this.gui_objects.quotadisplay) { - if (typeof content === 'object' && content.type == 'image') - this.percent_indicator(this.gui_objects.quotadisplay, content); - else - $(this.gui_objects.quotadisplay).html(content); - } + if (this.gui_objects.quotadisplay && content && content.type == 'text') + $(this.gui_objects.quotadisplay).html(content.percent+'%').attr('title', content.title); + + this.triggerEvent('setquota', content); + this.env.quota_content = content; }; // update the mailboxlist @@ -5624,7 +5748,7 @@ } if (mycount && text_obj.length) - text_obj.html(' ('+mycount+')'); + text_obj.html(this.env.unreadwrap.replace(/%[sd]/, mycount)); else if (text_obj.length) text_obj.remove(); @@ -5655,16 +5779,6 @@ this.set_pagetitle(new_title); } - }; - - this.toggle_prefer_html = function(checkbox) - { - $('#rcmfd_show_images').prop('disabled', !checkbox.checked).val(0); - }; - - this.toggle_preview_pane = function(checkbox) - { - $('#rcmfd_preview_pane_mark_read').prop('disabled', !checkbox.checked); }; // display fetched raw headers @@ -5702,69 +5816,6 @@ elem.onclick = function() { rcmail.load_headers(elem); }; }; - // percent (quota) indicator - this.percent_indicator = function(obj, data) - { - if (!data || !obj) - return false; - - var limit_high = 80, - limit_mid = 55, - width = data.width ? data.width : this.env.indicator_width ? this.env.indicator_width : 100, - height = data.height ? data.height : this.env.indicator_height ? this.env.indicator_height : 14, - quota = data.percent ? Math.abs(parseInt(data.percent)) : 0, - quota_width = parseInt(quota / 100 * width), - pos = $(obj).position(); - - // workarounds for Opera and Webkit bugs - pos.top = Math.max(0, pos.top); - pos.left = Math.max(0, pos.left); - - this.env.indicator_width = width; - this.env.indicator_height = height; - - // overlimit - if (quota_width > width) { - quota_width = width; - quota = 100; - } - - if (data.title) - data.title = this.get_label('quota') + ': ' + data.title; - - // main div - var main = $('<div>'); - main.css({position: 'absolute', top: pos.top, left: pos.left, - width: width + 'px', height: height + 'px', zIndex: 100, lineHeight: height + 'px'}) - .attr('title', data.title).addClass('quota_text').html(quota + '%'); - // used bar - var bar1 = $('<div>'); - bar1.css({position: 'absolute', top: pos.top + 1, left: pos.left + 1, - width: quota_width + 'px', height: height + 'px', zIndex: 99}); - // background - var bar2 = $('<div>'); - bar2.css({position: 'absolute', top: pos.top + 1, left: pos.left + 1, - width: width + 'px', height: height + 'px', zIndex: 98}) - .addClass('quota_bg'); - - if (quota >= limit_high) { - main.addClass(' quota_text_high'); - bar1.addClass('quota_high'); - } - else if(quota >= limit_mid) { - main.addClass(' quota_text_mid'); - bar1.addClass('quota_mid'); - } - else { - main.addClass(' quota_text_low'); - bar1.addClass('quota_low'); - } - - // replace quota image - $(obj).html('').append(bar1).append(bar2).append(main); - // update #quotaimg title - $('#quotaimg').attr('title', data.title); - }; /********************************************************/ /********* html to text conversion functions *********/ @@ -6022,7 +6073,7 @@ this.enable_command('purge', this.purge_mailbox_test()); this.enable_command('expand-all', 'expand-unread', 'collapse-all', this.env.threading && this.env.messagecount); - if (response.action == 'list' || response.action == 'search') { + if ((response.action == 'list' || response.action == 'search') && this.message_list) { this.msglist_select(this.message_list); this.triggerEvent('listupdate', { folder:this.env.mailbox, rowcount:this.message_list.rowcount }); } @@ -6234,6 +6285,32 @@ } }; + this.mailto_handler_uri = function() + { + return location.href.split('?')[0] + '?_task=mail&_action=compose&_to=%s'; + }; + + this.register_protocol_handler = function(name) + { + try { + window.navigator.registerProtocolHandler('mailto', this.mailto_handler_uri(), name); + } + catch(e) {}; + }; + + this.check_protocol_handler = function(name, elem) + { + var nav = window.navigator; + if (!nav + || (typeof nav.registerProtocolHandler != 'function') + || ((typeof nav.isProtocolHandlerRegistered == 'function') + && nav.isProtocolHandlerRegistered('mailto', this.mailto_handler_uri()) == 'registered') + ) + $(elem).addClass('disabled'); + else + $(elem).click(function() { rcmail.register_protocol_handler(name); return false; }); + }; + } // end object rcube_webmail -- Gitblit v1.9.1