summaryrefslogtreecommitdiff
path: root/plugins/contextmenu
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/contextmenu')
-rw-r--r--plugins/contextmenu/contextmenu.js595
-rw-r--r--plugins/contextmenu/contextmenu.php315
-rw-r--r--plugins/contextmenu/jquery.contextMenu.js21
l---------plugins/contextmenu/jquery.mousewheel.js1
-rw-r--r--plugins/contextmenu/localization/ca_ES.inc12
-rw-r--r--plugins/contextmenu/localization/cs_CZ.inc12
-rw-r--r--plugins/contextmenu/localization/da_DK.inc12
-rw-r--r--plugins/contextmenu/localization/de_CH.inc12
-rw-r--r--plugins/contextmenu/localization/de_DE.inc12
-rw-r--r--plugins/contextmenu/localization/en_GB.inc12
-rw-r--r--plugins/contextmenu/localization/en_US.inc12
-rw-r--r--plugins/contextmenu/localization/es_ES.inc12
-rw-r--r--plugins/contextmenu/localization/fr_FR.inc12
-rw-r--r--plugins/contextmenu/localization/gl_ES.inc12
-rw-r--r--plugins/contextmenu/localization/hu_HU.inc12
-rw-r--r--plugins/contextmenu/localization/it_IT.inc12
-rw-r--r--plugins/contextmenu/localization/nl_NL.inc12
-rw-r--r--plugins/contextmenu/localization/pl_PL.inc12
-rw-r--r--plugins/contextmenu/localization/pt_BR.inc12
-rw-r--r--plugins/contextmenu/localization/ro_RO.inc12
-rw-r--r--plugins/contextmenu/localization/ru_RU.inc12
-rw-r--r--plugins/contextmenu/localization/sv_SE.inc12
-rw-r--r--plugins/contextmenu/localization/tr_TR.inc12
-rw-r--r--plugins/contextmenu/localization/uk_UA.inc12
-rw-r--r--plugins/contextmenu/localization/zh_TW.inc12
-rw-r--r--plugins/contextmenu/package.xml90
-rw-r--r--plugins/contextmenu/skins/classic/contexticons.gifbin0 -> 2238 bytes
-rw-r--r--plugins/contextmenu/skins/classic/contexticons.pngbin0 -> 4261 bytes
-rw-r--r--plugins/contextmenu/skins/classic/contextmenu.css357
-rw-r--r--plugins/contextmenu/skins/classic/folders.gifbin0 -> 2430 bytes
-rw-r--r--plugins/contextmenu/skins/classic/folders.pngbin0 -> 4771 bytes
-rw-r--r--plugins/contextmenu/skins/classic/ie6hacks.css54
-rw-r--r--plugins/contextmenu/skins/classic/messageactions.gifbin0 -> 1567 bytes
-rw-r--r--plugins/contextmenu/skins/classic/messageactions.pngbin0 -> 2578 bytes
-rw-r--r--plugins/contextmenu/skins/larry/contexticons.pngbin0 -> 5728 bytes
-rw-r--r--plugins/contextmenu/skins/larry/contextmenu.css425
-rw-r--r--plugins/contextmenu/skins/larry/folders.pngbin0 -> 3901 bytes
-rw-r--r--plugins/contextmenu/skins/larry/ie6hacks.css3
-rw-r--r--plugins/contextmenu/skins/larry/messageactions.pngbin0 -> 1698 bytes
39 files changed, 2113 insertions, 0 deletions
diff --git a/plugins/contextmenu/contextmenu.js b/plugins/contextmenu/contextmenu.js
new file mode 100644
index 000000000..6d83f1fbe
--- /dev/null
+++ b/plugins/contextmenu/contextmenu.js
@@ -0,0 +1,595 @@
+/**
+ * ContextMenu plugin script
+ */
+
+rcube_webmail.prototype.contextmenu_command_handlers = new Object();
+rcube_webmail.prototype.contextmenu_disable_multi = new Array('#reply','#reply-all','#reply-list','#forward-inline','#print','#edit','#viewsource','#download','#open','#edit');
+
+function rcm_contextmenu_update() {
+ //if (!rcmail.env.flag_for_deletion && rcmail.env.trash_mailbox && rcmail.env.mailbox != rcmail.env.trash_mailbox)
+ // $("#rcm_delete").html('<span>' + rcmail.gettext('movemessagetotrash') + '</span>');
+ //else
+ // $("#rcm_delete").html('<span>' + rcmail.gettext('deletemessage') + '</span>');
+}
+
+function rcm_contextmenu_init(row) {
+ $("#" + row).contextMenu({
+ menu: 'rcmContextMenu',
+ submenu_delay: 400
+ },
+ function(command, el, pos) {
+ var matches = String($(el).attr('id')).match(/rcmrow([a-z0-9\-_=]+)/i);
+ if ($(el) && matches) {
+ var prev_uid = rcmail.env.uid;
+ if (rcmail.message_list.selection.length <= 1 || !rcmail.message_list.in_selection(matches[1]))
+ rcmail.env.uid = matches[1];
+
+ // fix command string in IE
+ if (command.indexOf("#") > 0)
+ command = command.substr(command.indexOf("#") + 1);
+
+ // enable the required command
+ cmd = (command == 'read' || command == 'unread' || command == 'flagged' || command == 'unflagged') ? 'mark' : command;
+ var prev_command = rcmail.commands[cmd];
+ rcmail.enable_command(cmd, true);
+
+ // process external commands
+ if (typeof rcmail.contextmenu_command_handlers[command] == 'function') {
+ rcmail.contextmenu_command_handlers[command](command, el, pos);
+ }
+ else if (typeof rcmail.contextmenu_command_handlers[command] == 'string') {
+ window[rcmail.contextmenu_command_handlers[command]](command, el, pos);
+ }
+ else {
+ switch (command) {
+ case 'read':
+ case 'unread':
+ case 'flagged':
+ case 'unflagged':
+ rcmail.command('mark', command, $(el));
+ break;
+ case 'reply':
+ case 'reply-all':
+ case 'reply-list':
+ case 'forward-inline':
+ case 'forward-attachment':
+ case 'print':
+ case 'download':
+ case 'viewsource':
+ rcmail.command(command, '', $(el));
+ break;
+ case 'edit':
+ rcmail.command(command, 'new', $(el));
+ break;
+ case 'open':
+ rcmail.command(command, '', rcube_find_object('rcm_open'));
+ rcmail.sourcewin = window.open(rcube_find_object('rcm_open').href);
+ if (rcmail.sourcewin)
+ window.setTimeout(function() { rcmail.sourcewin.focus(); }, 20);
+
+ rcube_find_object('rcm_open').href = '#open';
+ break;
+ case 'delete':
+ case 'moveto':
+ if (command == 'moveto' && rcmail.env.rcm_destfolder == rcmail.env.mailbox)
+ return;
+
+ var prev_sel = null;
+
+ // also select childs of (collapsed) threads
+ if (rcmail.env.uid) {
+ if (!rcmail.message_list.in_selection(rcmail.env.uid)) {
+ prev_sel = rcmail.message_list.get_selection();
+ rcmail.message_list.select_row(rcmail.env.uid);
+ }
+
+ if (rcmail.message_list.rows[rcmail.env.uid].has_children && !rcmail.message_list.rows[rcmail.env.uid].expanded)
+ rcmail.message_list.select_childs(rcmail.env.uid);
+
+ rcmail.env.uid = null;
+ }
+
+ rcmail.command(command, rcmail.env.rcm_destfolder, $(el));
+
+ if (prev_sel) {
+ rcmail.message_list.clear_selection();
+
+ for (var i in prev_sel)
+ rcmail.message_list.select_row(prev_sel[i], CONTROL_KEY);
+ }
+
+ delete rcmail.env.rcm_destfolder;
+ break;
+ }
+ }
+
+ rcmail.enable_command(cmd, prev_command);
+ rcmail.env.uid = prev_uid;
+ }
+ });
+}
+
+function rcm_set_dest_folder(folder) {
+ rcmail.env.rcm_destfolder = folder;
+}
+
+function rcm_contextmenu_register_command(command, callback, label, pos, sep, multi, newSub, menu, liclass) {
+ if (!menu)
+ menu = $('#rcmContextMenu');
+
+ if (!liclass)
+ liclass = command;
+
+ if (typeof label != 'string') {
+ var menuItem = label.children('li');
+ }
+ else {
+ var menuItem = $('<li>').addClass(liclass);
+ $('<a>').attr('href', '#' + command).addClass('active').html('<span>' + rcmail.gettext(label) + '</span>').appendTo(menuItem);
+ }
+
+ rcmail.contextmenu_command_handlers[command] = callback;
+
+ if (pos && menu.children('li.' + pos) && newSub) {
+ subMenu = menu.children('li.' + pos);
+ subMenu.addClass('submenu');
+
+ var mainLink = null;
+ if (subMenu.children('a') && !subMenu.hasClass('sublink')) {
+ subMenu.addClass('sublink');
+
+ var mainLink = $('<li>').addClass(pos);
+ subMenu.children('a').clone().appendTo(mainLink)
+ subMenu.children('a').addClass('mainlink');
+ }
+
+ var newMenu = $('<ul>').addClass('toolbarmenu').appendTo(subMenu);
+
+ if (mainLink)
+ newMenu.append(mainLink);
+
+ newMenu.append(menuItem);
+ }
+ else if (pos && menu.children('li.' + pos)) {
+ menu.children('li.' + pos).before(menuItem);
+ }
+ else {
+ menu.append(menuItem);
+ }
+
+ if (sep == 'before')
+ menuItem.addClass('separator_above');
+ else if (sep == 'after')
+ menuItem.addClass('separator_below');
+
+ if (!multi)
+ rcmail.contextmenu_disable_multi[rcmail.contextmenu_disable_multi.length] = '#' + command;
+}
+
+function rcm_foldermenu_init() {
+ $("#mailboxlist li").contextMenu({
+ menu: 'rcmFolderMenu'
+ },
+ function(command, el, pos) {
+ var matches = String($(el).children('a').attr('onclick')).match(/.*rcmail.command\(["']list["'],\s*["']([^"']*)["'],\s*this\).*/i);
+ if ($(el) && matches) {
+ var mailbox = matches[1];
+ var messagecount = 0;
+
+ if (command == 'readfolder' || command == 'expunge' || command == 'purge') {
+ if (mailbox == rcmail.env.mailbox) {
+ messagecount = rcmail.env.messagecount;
+ }
+ else if (rcmail.env.unread_counts[mailbox] == 0) {
+ var lock = rcmail.set_busy(true, 'loading');
+
+ querystring = '_mbox=' + urlencode(mailbox);
+ querystring += (querystring ? '&' : '') + '_remote=1';
+ var url = rcmail.env.comm_path + '&_action=' + 'plugin.contextmenu.messagecount' + '&' + querystring
+
+ // send request
+ console.log('HTTP POST: ' + url);
+
+ jQuery.ajax({
+ url: url,
+ dataType: "json",
+ success: function(response) { messagecount = response.env.messagecount; },
+ async: false
+ });
+
+ rcmail.set_busy(false, null, lock);
+ }
+
+ if (rcmail.env.unread_counts[mailbox] == 0 && messagecount == 0) {
+ rcmail.display_message(rcmail.get_label('nomessagesfound'), 'notice');
+ return false;
+ }
+ }
+
+ // fix command string in IE
+ if (command.indexOf("#") > 0)
+ command = command.substr(command.indexOf("#") + 1);
+
+ // enable the required command
+ var prev_command = rcmail.commands[command];
+ rcmail.enable_command(command, true);
+
+ // process external commands
+ if (typeof rcmail.contextmenu_command_handlers[command] == 'function') {
+ rcmail.contextmenu_command_handlers[command](command, el, pos);
+ }
+ else if (typeof rcmail.contextmenu_command_handlers[command] == 'string') {
+ window[rcmail.contextmenu_command_handlers[command]](command, el, pos);
+ }
+ else {
+ switch (command) {
+ case 'readfolder':
+ var lock = rcmail.set_busy(true, 'loading');
+ rcmail.http_request('plugin.contextmenu.readfolder', '_mbox=' + urlencode(mailbox) + '&_cur=' + rcmail.env.mailbox + '&_oact=' + rcmail.env.action, lock);
+ break;
+ case 'expunge':
+ rcmail.expunge_mailbox(mailbox);
+ break;
+ case 'purge':
+ rcmail.purge_mailbox(mailbox);
+ break;
+ case 'collapseall':
+ case 'expandall':
+ targetdiv = (command == 'collapseall') ? 'expanded' : 'collapsed';
+ $("#mailboxlist div." + targetdiv).each( function() {
+ var el = $(this);
+ var matches = String($(el).attr('onclick')).match(/.*rcmail.command\(["']collapse-folder["'],\s*["']([^"']*)["']\).*/i);
+ rcmail.collapse_folder(matches[1]);
+ });
+ break;
+ case 'openfolder':
+ rcube_find_object('rcm_openfolder').href = '?_task=mail&_mbox='+urlencode(mailbox);
+ rcmail.sourcewin = window.open(rcube_find_object('rcm_openfolder').href);
+ if (rcmail.sourcewin)
+ window.setTimeout(function() { rcmail.sourcewin.focus(); }, 20);
+
+ rcube_find_object('rcm_openfolder').href = '#openfolder';
+ break;
+ }
+ }
+
+ rcmail.enable_command(command, prev_command);
+ }
+ });
+}
+
+function rcm_update_options(el) {
+ if (el.hasClass('message')) {
+ $('#rcmContextMenu').disableContextMenuItems('#reply-list');
+ var matches = String($(el).attr('id')).match(/rcmrow([a-z0-9\-_=]+)/i);
+ if ($(el) && matches) {
+ if (rcmail.message_list.selection.length > 1 && rcmail.message_list.in_selection(matches[1])) {
+ $('#rcmContextMenu').disableContextMenuItems(rcmail.contextmenu_disable_multi.join(','));
+ }
+ else {
+ $('#rcmContextMenu').enableContextMenuItems(rcmail.contextmenu_disable_multi.join(','));
+
+ var msg = rcmail.env.messages[matches[1]];
+ if (!msg.ml)
+ $('#rcmContextMenu').disableContextMenuItems('#reply-list');
+ }
+ }
+ }
+ else if (el.hasClass('mailbox')) {
+ $('#rcmFolderMenu').disableContextMenuItems('#readfolder,#purge,#collapseall,#expandall');
+ var matches = String($(el).children('a').attr('onclick')).match(/.*rcmail.command\(["']list["'],\s*["']([^"']*)["'],\s*this\).*/i);
+ if ($(el) && matches) {
+ var mailbox = matches[1];
+
+ if (rcmail.env.unread_counts[mailbox] > 0)
+ $('#rcmFolderMenu').enableContextMenuItems('#readfolder');
+
+ if (mailbox == rcmail.env.trash_mailbox || mailbox == rcmail.env.junk_mailbox
+ || mailbox.match('^' + RegExp.escape(rcmail.env.trash_mailbox) + RegExp.escape(rcmail.env.delimiter))
+ || mailbox.match('^' + RegExp.escape(rcmail.env.junk_mailbox) + RegExp.escape(rcmail.env.delimiter)))
+ $('#rcmFolderMenu').enableContextMenuItems('#purge');
+
+ if ($("#mailboxlist div.expanded").length > 0)
+ $('#rcmFolderMenu').enableContextMenuItems('#collapseall');
+
+ if ($("#mailboxlist div.collapsed").length > 0)
+ $('#rcmFolderMenu').enableContextMenuItems('#expandall');
+ }
+ }
+ else if (el.hasClass('addressbook') || el.hasClass('contactgroup')) {
+ $('#rcmGroupMenu').disableContextMenuItems('#group-create,#group-rename,#group-delete');
+
+ if ($(el).hasClass('contactgroup') && $(el).children('a').attr('rel')) {
+ var matches = $(el).children('a').attr('rel').match(/([A-Z0-9\-_]+):?([A-Z0-9\-_]+)?/i);
+
+ if (!rcmail.env.address_sources[matches[1]].readonly) {
+ if (!rcmail.name_input)
+ $('#rcmGroupMenu').enableContextMenuItems('#group-rename');
+
+ $('#rcmGroupMenu').enableContextMenuItems('#group-delete');
+ }
+ }
+ else if ($(el).hasClass('addressbook')) {
+ var source = $(el).children('a').attr('rel');
+
+ if (!rcmail.env.address_sources[source].readonly)
+ $('#rcmGroupMenu').enableContextMenuItems('#group-create')
+ }
+ }
+ else if (rcmail.env.task == 'addressbook') {
+ var matches = String($(el).attr('id')).match(/rcmrow([a-z0-9\-_=]+)/i);
+ if ($(el) && matches) {
+ if (rcmail.contact_list.selection.length > 1 && rcmail.contact_list.in_selection(matches[1]))
+ $('#rcmAddressMenu').disableContextMenuItems(rcmail.contextmenu_disable_multi.join(','));
+ else
+ $('#rcmAddressMenu').enableContextMenuItems(rcmail.contextmenu_disable_multi.join(','));
+
+ if (rcmail.env.group && rcmail.contact_list.in_selection(matches[1]))
+ $('#rcmAddressMenu').enableContextMenuItems('#group-remove-selected');
+ else
+ $('#rcmAddressMenu').disableContextMenuItems('#group-remove-selected');
+
+ var ab_src = rcmail.env.source ? rcmail.env.source : matches[1].split('-', 2)[1];
+
+ if (rcmail.env.address_sources[ab_src].readonly)
+ $('#rcmAddressMenu').disableContextMenuItems('#edit,#delete,#group-remove-selected');
+ }
+ }
+}
+
+function rcm_addressmenu_init(row) {
+ $("tr[id=" + row + "]").contextMenu({
+ menu: 'rcmAddressMenu'
+ },
+ function(command, el, pos) {
+ var matches = String($(el).attr('id')).match(/rcmrow([a-z0-9\-_=]+)/i);
+ if ($(el) && matches) {
+ var prev_cid = rcmail.env.cid;
+ if (rcmail.contact_list.selection.length <= 1 || !rcmail.contact_list.in_selection(matches[1]))
+ rcmail.env.cid = matches[1];
+
+ // fix command string in IE
+ if (command.indexOf("#") > 0)
+ command = command.substr(command.indexOf("#") + 1);
+
+ // enable the required command
+ cmd = command;
+ var prev_command = rcmail.commands[cmd];
+ rcmail.enable_command(cmd, true);
+
+ // process external commands
+ if (typeof rcmail.contextmenu_command_handlers[command] == 'function') {
+ rcmail.contextmenu_command_handlers[command](command, el, pos);
+ }
+ else if (typeof rcmail.contextmenu_command_handlers[command] == 'string') {
+ window[rcmail.contextmenu_command_handlers[command]](command, el, pos);
+ }
+ else {
+ switch (command) {
+ case 'edit':
+ rcmail.contact_list.select(rcmail.env.cid);
+ clearTimeout(rcmail.preview_timer)
+ rcmail.command(command, '', $(el));
+ break;
+ case 'compose':
+ case 'delete':
+ case 'moveto':
+ case 'group-remove-selected':
+ var ab_src = rcmail.env.source ? rcmail.env.source : matches[1].split('-', 2)[1];
+
+ if (command == 'moveto') {
+ // check for valid taget
+ if (rcmail.env.rcm_destbook == ab_src || (rcmail.env.rcm_destgroup && rcmail.env.contactfolders['G' + rcmail.env.rcm_destsource + rcmail.env.rcm_destgroup].id == rcmail.env.group))
+ return;
+ }
+
+ var prev_sel = null;
+
+ if (rcmail.env.cid) {
+ if (!rcmail.contact_list.in_selection(rcmail.env.cid)) {
+ prev_sel = rcmail.contact_list.get_selection();
+ rcmail.contact_list.select(rcmail.env.cid);
+ }
+ else if (rcmail.contact_list.get_single_selection() == rcmail.env.cid) {
+ rcmail.env.cid = null;
+ }
+ else {
+ prev_sel = rcmail.contact_list.get_selection();
+ rcmail.contact_list.select(rcmail.env.cid);
+ }
+ }
+
+ if (command == 'delete')
+ rcmail.env.cid = null;
+
+ rcmail.drag_active = true;
+ if (rcmail.env.rcm_destgroup)
+ rcmail.command(command, rcmail.env.contactfolders['G' + rcmail.env.rcm_destsource + rcmail.env.rcm_destgroup], $(el));
+ else
+ rcmail.command(command, rcmail.env.contactfolders[rcmail.env.rcm_destsource], $(el));
+ rcmail.drag_active = false;
+
+ if (prev_sel) {
+ rcmail.contact_list.clear_selection();
+
+ for (var i in prev_sel)
+ rcmail.contact_list.select_row(prev_sel[i], CONTROL_KEY);
+ }
+
+ rcmail.env.rcm_destbook = null;
+ rcmail.env.rcm_destsource = null;
+ rcmail.env.rcm_destgroup = null;
+ break;
+ }
+ }
+
+ rcmail.enable_command(cmd, prev_command);
+ rcmail.env.cid = prev_cid;
+ }
+ });
+}
+
+function rcm_set_dest_book(obj, source, group) {
+ rcmail.env.rcm_destbook = obj;
+ rcmail.env.rcm_destsource = source;
+ rcmail.env.rcm_destgroup = group;
+}
+
+function rcm_groupmenu_init(li) {
+ $(li).contextMenu({
+ menu: 'rcmGroupMenu'
+ },
+ function(command, el, pos) {
+ var matches = $(el).children('a').attr('rel').match(/([A-Z0-9\-_]+):?([A-Z0-9\-_]+)?/i);
+ if ($(el) && matches) {
+ prev_group = rcmail.env.group;
+ prev_source = rcmail.env.source;
+
+ cur_source = matches[1];
+ if (matches[2])
+ cur_id = matches[2];
+ else
+ cur_id = rcmail.env.group;
+
+ rcmail.env.group = cur_id
+ rcmail.env.source = cur_source;
+
+ // fix command string in IE
+ if (command.indexOf("#") > 0)
+ command = command.substr(command.indexOf("#") + 1);
+
+ // enable the required command
+ var prev_command = rcmail.commands[command];
+ rcmail.enable_command(command, true);
+
+ // process external commands
+ if (typeof rcmail.contextmenu_command_handlers[command] == 'function') {
+ rcmail.contextmenu_command_handlers[command](command, el, pos);
+ }
+ else if (typeof rcmail.contextmenu_command_handlers[command] == 'string') {
+ window[rcmail.contextmenu_command_handlers[command]](command, el, pos);
+ }
+ else {
+ switch (command) {
+ case 'group-create':
+ rcmail.command(command, '', $(el).children('a'));
+ break;
+ case 'group-rename':
+ rcmail.command(command, '', $(el).children('a'));
+
+ // callback requires target is selected
+ rcmail.enable_command('listgroup', true);
+ rcmail.env.group = prev_group;
+ rcmail.env.source = prev_source
+ prev_group = cur_id;
+ prev_source = cur_source;
+ rcmail.command('listgroup', {'source': prev_source,'id': prev_group}, $(el).children('a'));
+ rcmail.enable_command('listgroup', false);
+ break;
+ case 'group-delete':
+ rcmail.command(command, '', $(el).children('a'));
+ break;
+ }
+ }
+
+ rcmail.enable_command(command, prev_command);
+ rcmail.env.group = prev_group;
+ rcmail.env.source = prev_source;
+ }
+ });
+}
+
+function rcm_groupmenu_update(action, props) {
+ var gid = props.source + props.id;
+ gid = gid.replace(rcmail.identifier_expr, '_');
+
+ switch (action) {
+ case 'insert':
+ var link = $('<a>')
+ .attr('id', 'rcm_contextgrps_G' + gid)
+ .attr('href', '#moveto')
+ .addClass('active')
+ .attr('onclick', "rcm_set_dest_book('G" + gid + "', '" + props.source + "','" + props.id + "')")
+ .html('<span>' + props.name + '</span>');
+
+ var li = $('<li>').addClass('contactgroup').append(link);
+
+ var sibling = $('#rcm_contextaddr_' + props.source);
+ $('a[id^="rcm_contextgrps_G"]').each(function(i, elem) {
+ if (props.name.toUpperCase().trim() >= $(this).text().toUpperCase().trim())
+ sibling = $(elem).parent();
+ else
+ return false;
+ });
+
+ $(li).insertAfter($(sibling));
+
+ rcm_groupmenu_init(props.li);
+ break;
+ case 'update':
+ if ($('#rcm_contextgrps_G' + gid).length) {
+ if (props.newid) {
+ var new_gid = props.source + props.newid;
+ new_gid = new_gid.replace(rcmail.identifier_expr, '_');
+
+ var link = $('<a>')
+ .attr('id', 'rcm_contextgrps_G' + new_gid)
+ .attr('href', '#moveto')
+ .addClass('active')
+ .attr('onclick', "rcm_set_dest_book('G" + new_gid + "', '" + props.source + "','" + props.newid + "')")
+ .html('<span>' + props.name + '</span>');
+
+ $('#rcm_contextgrps_G' + gid).replaceWith(link);
+ }
+ else {
+ $('#rcm_contextgrps_G' + gid).html('<span>' + props.name + '</span>');
+ }
+
+ row = $('#rcm_contextgrps_G' + gid).parent().clone(true);
+ $('#rcm_contextgrps_G' + gid).parent().remove();
+
+ var sibling = $('#rcm_contextaddr_' + props.source);
+ $('a[id^="rcm_contextgrps_G"]').each(function(i, elem) {
+ if (props.name.toUpperCase().trim() >= $(this).text().toUpperCase().trim())
+ sibling = $(elem).parent();
+ else
+ return false;
+ });
+
+ $(row).insertAfter($(sibling));
+ }
+
+ break;
+ case 'remove':
+ if ($('#rcm_contextgrps_G' + gid).length)
+ $('#rcm_contextgrps_G' + gid).remove();
+
+ break;
+ }
+}
+
+$(document).ready(function() {
+ if (window.rcmail) {
+ // init message list menu
+ if ($('#rcmContextMenu').length > 0) {
+ rcmail.addEventListener('listupdate', function(props) { rcm_contextmenu_update(); } );
+ rcmail.addEventListener('insertrow', function(props) { rcm_contextmenu_init(props.row.id); } );
+ }
+
+ // init folder list menu
+ if ($('#rcmFolderMenu').length > 0)
+ rcmail.add_onload('rcm_foldermenu_init();');
+
+ // init contact list menu
+ if ($('#rcmAddressMenu').length > 0)
+ rcmail.addEventListener('insertrow', function(props) { rcm_addressmenu_init(props.row.id); } );
+
+ // init group list menu
+ if ($('#rcmGroupMenu').length > 0) {
+ rcmail.add_onload('rcm_groupmenu_init("#directorylist li");');
+ rcmail.addEventListener('group_insert', function(props) { rcm_groupmenu_update('insert', props); } );
+ rcmail.addEventListener('group_update', function(props) { rcm_groupmenu_update('update', props); } );
+ rcmail.addEventListener('group_delete', function(props) { rcm_groupmenu_update('remove', props); } );
+ }
+ }
+}); \ No newline at end of file
diff --git a/plugins/contextmenu/contextmenu.php b/plugins/contextmenu/contextmenu.php
new file mode 100644
index 000000000..aa29aa8d5
--- /dev/null
+++ b/plugins/contextmenu/contextmenu.php
@@ -0,0 +1,315 @@
+<?php
+
+/**
+ * ContextMenu
+ *
+ * Plugin to add a context menu to the message list
+ *
+ * @version @package_version@
+ * @author Philip Weir
+ */
+class contextmenu extends rcube_plugin
+{
+ public $task = 'mail|addressbook';
+
+ function init()
+ {
+ $rcmail = rcube::get_instance();
+ if ($rcmail->task == 'mail' && ($rcmail->action == '' || $rcmail->action == 'show'))
+ $this->add_hook('render_mailboxlist', array($this, 'show_mailbox_menu'));
+ elseif ($rcmail->task == 'addressbook' && $rcmail->action == '')
+ $this->add_hook('addressbooks_list', array($this, 'show_addressbook_menu'));
+
+ $this->register_action('plugin.contextmenu.messagecount', array($this, 'messagecount'));
+ $this->register_action('plugin.contextmenu.readfolder', array($this, 'readfolder'));
+ }
+
+ public function messagecount()
+ {
+ $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_GET);
+ $this->api->output->set_env('messagecount', rcube::get_instance()->storage->count($mbox));
+ $this->api->output->send();
+ }
+
+ public function readfolder()
+ {
+ $storage = rcube::get_instance()->storage;
+ $cbox = rcube_utils::get_input_value('_cur', rcube_utils::INPUT_GET);
+ $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_GET);
+ $oact = rcube_utils::get_input_value('_oact', rcube_utils::INPUT_GET);
+
+ $uids = $storage->search_once($mbox, 'ALL UNSEEN', true);
+
+ if ($uids->is_empty())
+ return false;
+
+ $storage->set_flag($uids->get(), 'SEEN', $mbox);
+
+ if ($cbox == $mbox && $oact == '')
+ $this->api->output->command('toggle_read_status', 'read', $uids->get());
+
+ rcmail_send_unread_count($mbox, true);
+ $this->api->output->send();
+ }
+
+ public function show_mailbox_menu($args)
+ {
+ $rcmail = rcube::get_instance();
+ $this->add_texts('localization/');
+ $rcmail->output->add_label('nomessagesfound');
+ $this->include_script('jquery.contextMenu.js');
+ $this->include_script('jquery.mousewheel.js');
+ $this->include_script('contextmenu.js');
+
+ $this->include_stylesheet($this->local_skin_path() . '/contextmenu.css');
+ if ($rcmail->output->browser->ie && $rcmail->output->browser->ver == 6)
+ $this->include_stylesheet($this->local_skin_path() . '/ie6hacks.css');
+
+ $out = '';
+
+ // message list menu
+ if ($rcmail->action == '') {
+ $li = '';
+
+ $li .= html::tag('li', array('class' => 'conmentitle'), html::span(null, rcmail::Q($this->gettext('markmessages'))));
+ $li .= html::tag('li', array('class' => 'markmessage read'), html::a(array('href' => "#read", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('markread')))));
+ $li .= html::tag('li', array('class' => 'markmessage unread'), html::a(array('href' => "#unread", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('markunread')))));
+ $li .= html::tag('li', array('class' => 'markmessage flagged'), html::a(array('href' => "#flagged", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('markflagged')))));
+ $li .= html::tag('li', array('class' => 'markmessage unflagged separator_below'), html::a(array('href' => "#unflagged", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('markunflagged')))));
+ $li .= html::tag('li', array('class' => 'reply'), html::a(array('href' => "#reply", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('replytomessage')))));
+
+ $lis = '';
+ $lis .= html::tag('li', array('class' => 'replyall'), html::a(array('href' => "#reply-all", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('replytoallmessage')))));
+ $lis .= html::tag('li', array('class' => 'replylist'), html::a(array('href' => "#reply-list", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('replylist')))));
+ $li .= html::tag('li', array('class' => 'submenu replyacts'), html::a(array('href' => "#reply-all", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('replyall')))) . html::tag('ul', array('class' => 'popupmenu toolbarmenu replyacts'), $lis));
+
+ $lis = '';
+ $lis .= html::tag('li', array('class' => 'forwardinline'), html::a(array('href' => "#forward-inline", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('forwardinline')))));
+ $lis .= html::tag('li', array('class' => 'forwardattachment'), html::a(array('href' => "#forward-attachment", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('forwardattachment')))));
+ $li .= html::tag('li', array('class' => 'submenu forwardacts'), html::a(array('href' => "#forward-inline", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('forward')))) . html::tag('ul', array('class' => 'popupmenu toolbarmenu forwardacts'), $lis));
+
+ //$rcmail = rcmail::get_instance();
+ //if (!$rcmail->config->get('flag_for_deletion', false) && $rcmail->config->get('trash_mbox') && $_SESSION['mbox'] != $rcmail->config->get('trash_mbox'))
+ // $li .= html::tag('li', array('class' => 'delete separator_below'), html::a(array('href' => "#delete", 'id' => 'rcm_delete', 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('movemessagetotrash')))));
+ //else
+ $li .= html::tag('li', array('class' => 'delete separator_below'), html::a(array('href' => "#delete", 'id' => 'rcm_delete', 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('deletemessage')))));
+
+ $li .= html::tag('li', array('class' => 'submenu moveto'), html::span(null, rcmail::Q($this->gettext('moveto'))) . $this->_gen_folder_list($args['list'], '#moveto'));
+
+ $lis = '';
+ $lis .= html::tag('li', array('class' => 'print'), html::a(array('href' => "#print", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('printmessage')))));
+ $lis .= html::tag('li', array('class' => 'save'), html::a(array('href' => "#download", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('emlsave')))));
+ $lis .= html::tag('li', array('class' => 'edit'), html::a(array('href' => "#edit", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('editasnew')))));
+ $lis .= html::tag('li', array('class' => 'source separator_below'), html::a(array('href' => "#viewsource", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('viewsource')))));
+ $lis .= html::tag('li', array('class' => 'open'), html::a(array('href' => "#open", 'id' => 'rcm_open', 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('openinextwin')))));
+ $li .= html::tag('li', array('class' => 'submenu moreacts'), html::span(null, rcmail::Q($this->gettext('moreactions'))) . html::tag('ul', array('class' => 'popupmenu toolbarmenu moreacts'), $lis));
+
+ $out .= html::tag('ul', array('id' => 'rcmContextMenu', 'class' => 'popupmenu toolbarmenu'), $li);
+ }
+
+ // folder list menu
+ $li = '';
+
+ $li .= html::tag('li', array('class' => 'readfolder separator_below'), html::a(array('href' => "#readfolder", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('markreadfolder')))));
+
+ $li .= html::tag('li', array('class' => 'expunge'), html::a(array('href' => "#expunge", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('compact')))));
+ $li .= html::tag('li', array('class' => 'purge separator_below'), html::a(array('href' => "#purge", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('empty')))));
+
+ $li .= html::tag('li', array('class' => 'collapseall'), html::a(array('href' => "#collapseall", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('collapseall')))));
+ $li .= html::tag('li', array('class' => 'expandall separator_below'), html::a(array('href' => "#expandall", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('expandall')))));
+
+ $li .= html::tag('li', array('class' => 'openfolder'), html::a(array('href' => "#openfolder", 'id' => 'rcm_openfolder', 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('openinextwin')))));
+
+ $out .= html::tag('ul', array('id' => 'rcmFolderMenu', 'class' => 'popupmenu toolbarmenu'), $li);
+
+ $this->api->output->add_footer(html::div(null , $out));
+
+ if ($rcmail->action == 'show')
+ $this->api->output->set_env('delimiter', $rcmail->storage->get_hierarchy_delimiter());
+ }
+
+ public function show_addressbook_menu($args)
+ {
+ $rcmail = rcube::get_instance();
+ $this->add_texts('localization/');
+ $this->include_script('jquery.contextMenu.js');
+ $this->include_script('jquery.mousewheel.js');
+ $this->include_stylesheet($this->local_skin_path() . '/contextmenu.css');
+ $this->include_script('contextmenu.js');
+ $out = '';
+
+ // contact list menu
+ $li = '';
+
+ $li .= html::tag('li', array('class' => 'composeto separator_below'), html::a(array('href' => "#compose", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('composeto')))));
+
+ $li .= html::tag('li', array('class' => 'editcontact'), html::a(array('href' => "#edit", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('editcontact')))));
+ $li .= html::tag('li', array('class' => 'deletecontact'), html::a(array('href' => "#delete", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('deletecontact')))));
+ $li .= html::tag('li', array('class' => 'removefromgroup'), html::a(array('href' => "#group-remove-selected", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('groupremoveselected')))));
+
+ if ($lis = $this->_gen_addressbooks_list($args['sources'], '#moveto'))
+ $li .= html::tag('li', array('class' => 'submenu separator_above'), html::span(null, rcmail::Q($this->gettext('copyto'))) . $lis);
+
+ $out .= html::tag('ul', array('id' => 'rcmAddressMenu', 'class' => 'popupmenu toolbarmenu'), $li);
+
+ // contact group menu
+ $li = '';
+
+ $li .= html::tag('li', array('class' => 'groupcreate'), html::a(array('href' => "#group-create", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('newcontactgroup')))));
+ $li .= html::tag('li', array('class' => 'grouprename'), html::a(array('href' => "#group-rename", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('grouprename')))));
+ $li .= html::tag('li', array('class' => 'groupdelete'), html::a(array('href' => "#group-delete", 'class' => 'active'), html::span(null, rcmail::Q($this->gettext('groupdelete')))));
+
+ $out .= html::tag('ul', array('id' => 'rcmGroupMenu', 'class' => 'popupmenu toolbarmenu'), $li);
+
+ $this->api->output->add_footer(html::div(null , $out));
+ }
+
+ // based on rcmail->render_folder_tree_html()
+ private function _gen_folder_list($arrFolders, $command, $nestLevel = 0, &$folderTotal = 0)
+ {
+ $rcmail = rcube::get_instance();
+
+ $maxlength = 35;
+ $realnames = false;
+
+ $out = '';
+ foreach ($arrFolders as $key => $folder) {
+ $title = null;
+
+ if (($folder_class = $rcmail->folder_classname($folder['id'])) && !$realnames) {
+ $foldername = $rcmail->gettext($folder_class);
+ }
+ else {
+ $foldername = $folder['name'];
+
+ // shorten the folder name to a given length
+ if ($maxlength && $maxlength > 1) {
+ $fname = abbreviate_string($foldername, $maxlength);
+
+ if ($fname != $foldername)
+ $title = $foldername;
+
+ $foldername = $fname;
+ }
+ }
+
+ // make folder name safe for ids and class names
+ $folder_id = asciiwords($folder['id'], true, '_');
+ $classes = array();
+
+ // set special class for Sent, Drafts, Trash and Junk
+ if ($folder['id'] == $rcmail->config->get('sent_mbox'))
+ $classes[] = 'sent';
+ else if ($folder['id'] == $rcmail->config->get('drafts_mbox'))
+ $classes[] = 'drafts';
+ else if ($folder['id'] == $rcmail->config->get('trash_mbox'))
+ $classes[] = 'trash';
+ else if ($folder['id'] == $rcmail->config->get('junk_mbox'))
+ $classes[] = 'junk';
+ else if ($folder['id'] == 'INBOX')
+ $classes[] = 'inbox';
+ else
+ $classes[] = '_'.asciiwords($folder_class ? $folder_class : strtolower($folder['id']), true);
+
+ if ($folder['virtual'])
+ $classes[] = 'virtual';
+
+ if ($nestLevel > 0)
+ $classes[] = 'subfolder';
+
+ $out .= html::tag('li', array('class' => join(' ', $classes)), html::a(array('href' => $command, 'onclick' => "rcm_set_dest_folder('". rcmail::JQ($folder['id']) ."')", 'class' => 'active', 'title' => $title), html::span(null, str_repeat('&nbsp;&nbsp;', $nestLevel) . rcmail::Q($foldername))));
+
+ if (!empty($folder['folders']))
+ $out .= $this->_gen_folder_list($folder['folders'], $command, $nestLevel+1, $folderTotal);
+
+ $folderTotal++;
+ }
+
+ if ($nestLevel == 0) {
+ if ($folderTotal > 5) {
+ $out = html::tag('ul', array('class' => 'toolbarmenu folders scrollable'), $out);
+ $out = html::tag('div', array('class' => 'scroll_up_pas'), '') . $out . html::tag('div', array('class' => 'scroll_down_act'), '');
+ $out = html::tag('div', array('class' => 'popupmenu'), $out);
+ }
+ else {
+ $out = html::tag('ul', array('class' => 'popupmenu toolbarmenu folders'), $out);
+ }
+ }
+
+ return $out;
+ }
+
+ // based on rcmail_directory_list()
+ private function _gen_addressbooks_list($arrBooks, $command)
+ {
+ $rcmail = rcube::get_instance();
+ $groupTotal = 0;
+ $maxlength = 35;
+ $maxlength_grp = 33;
+ $out = '';
+
+ // address books
+ foreach ($arrBooks as $j => $source) {
+ $title = null;
+ $id = $source['id'] ? $source['id'] : $j;
+ $bookname = !empty($source['name']) ? rcmail::Q($source['name']) : rcmail::Q($id);
+
+ // shorten the address book name to a given length
+ if ($maxlength && $maxlength > 1) {
+ $bname = abbreviate_string($bookname, $maxlength);
+
+ if ($bname != $bookname)
+ $title = $bookname;
+
+ $bookname = $bname;
+ }
+
+ if ($source['readonly'])
+ $out .= html::tag('li', array('id' => 'rcm_contextaddr_' . $id, 'class' => 'addressbook disabled'), html::a(array('href' => $command, 'id' => 'rcm_contextgrps_'. rcmail::JQ($id), 'onclick' => "rcm_set_dest_book('" . rcmail::JQ($id) ."', '" . rcmail::JQ($id) ."', null)", 'class' => 'active', 'title' => $title), html::span(null, rcmail::Q($bookname))));
+ else
+ $out .= html::tag('li', array('id' => 'rcm_contextaddr_' . $id, 'class' => 'addressbook'), html::a(array('href' => $command, 'id' => 'rcm_contextgrps_'. rcmail::JQ($id), 'onclick' => "rcm_set_dest_book('" . rcmail::JQ($id) ."', '" . rcmail::JQ($id) ."', null)", 'class' => 'active', 'title' => $title), html::span(null, rcmail::Q($bookname))));
+
+ // contact groups
+ if ($source['groups']) {
+ $groups = $rcmail->get_address_book($source['id'])->list_groups();
+ foreach ($groups as $group) {
+ $title = null;
+ $gid = 'G' . rcube_utils::html_identifier($id . $group['ID']);
+ $groupname = !empty($group['name']) ? rcmail::Q($group['name']) : rcmail::Q($gid);
+
+ // shorten the address book name to a given length
+ if ($maxlength_grp && $maxlength_grp > 1) {
+ $gname = abbreviate_string($groupname, $maxlength_grp);
+
+ if ($gname != $groupname)
+ $title = $groupname;
+
+ $groupname = $gname;
+ }
+
+ if ($source['readonly'])
+ $out .= html::tag('li', array('class' => 'contactgroup disabled'), html::a(array('href' => $command, 'id' => 'rcm_contextgrps_'. rcmail::JQ($gid), 'onclick' => "rcm_set_dest_book('" . rcmail::JQ($gid) . "', '" . rcmail::JQ($id) . "', '" . rcmail::JQ($group['ID']) ."')", 'class' => 'active', 'title' => $title), html::span(null, rcmail::Q($groupname))));
+ else
+ $out .= html::tag('li', array('class' => 'contactgroup'), html::a(array('href' => $command, 'id' => 'rcm_contextgrps_'. rcmail::JQ($gid), 'onclick' => "rcm_set_dest_book('" . rcmail::JQ($gid) . "', '" . rcmail::JQ($id) . "', '" . rcmail::JQ($group['ID']) ."')", 'class' => 'active', 'title' => $title), html::span(null, rcmail::Q($groupname))));
+
+ $groupTotal++;
+ }
+ }
+
+ $groupTotal++;
+ }
+
+ if ($groupTotal > 5) {
+ $out = html::tag('ul', array('id' => 'rcm_contextgrps', 'class' => 'toolbarmenu folders scrollable'), $out);
+ $out = html::tag('div', array('class' => 'scroll_up_pas'), '') . $out . html::tag('div', array('class' => 'scroll_down_act'), '');
+ $out = html::tag('div', array('class' => 'popupmenu'), $out);
+ }
+ else {
+ $out = html::tag('ul', array('id' => 'rcm_contextgrps', 'class' => 'popupmenu toolbarmenu folders'), $out);
+ }
+
+ return $out;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/jquery.contextMenu.js b/plugins/contextmenu/jquery.contextMenu.js
new file mode 100644
index 000000000..eaf33e5af
--- /dev/null
+++ b/plugins/contextmenu/jquery.contextMenu.js
@@ -0,0 +1,21 @@
+// jQuery Context Menu Plugin
+//
+// Version 1.01
+//
+// Cory S.N. LaViska
+// A Beautiful Site (http://abeautifulsite.net/)
+//
+// More info: http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/
+//
+// Terms of Use
+//
+// This plugin is dual-licensed under the GNU General Public License
+// and the MIT License and is copyright A Beautiful Site, LLC.
+//
+// Modified by Philip Weir:
+// Added highlighting of selected row and submenu support
+// Added sub menu functions
+// Added bind to contextmenu event
+// Adjust menu position for screen boundaries
+// Shrunk with Google Closure Compiler (Simple Optimizations)
+jQuery&&function(){$.extend($.fn,{contextMenu:function(a,e){if(void 0==a.menu)return!1;void 0==a.inSpeed&&(a.inSpeed=150);void 0==a.outSpeed&&(a.outSpeed=75);0==a.inSpeed&&(a.inSpeed=-1);0==a.outSpeed&&(a.outSpeed=-1);$(this).each(function(){var b=$(this),l=$(b).offset();$("#"+a.menu).addClass("contextMenu");$(this).mousedown(function(m){$(this).mouseup(function(g){var d=$(this);$(this).unbind("mouseup");if(2==m.button){$(".contextRow").removeClass("contextRow");$(".contextMenu").hide();d.addClass("contextRow"); rcm_update_options(d);var f=$("#"+a.menu);$(this).submenu_render(f);if($(b).hasClass("disabled"))return!1;var c={},h,j;self.innerHeight?(c.pageYOffset=self.pageYOffset,c.pageXOffset=self.pageXOffset,c.innerHeight=self.innerHeight,c.innerWidth=self.innerWidth):document.documentElement&&document.documentElement.clientHeight?(c.pageYOffset=document.documentElement.scrollTop,c.pageXOffset=document.documentElement.scrollLeft,c.innerHeight=document.documentElement.clientHeight,c.innerWidth=document.documentElement.clientWidth): document.body&&(c.pageYOffset=document.body.scrollTop,c.pageXOffset=document.body.scrollLeft,c.innerHeight=document.body.clientHeight,c.innerWidth=document.body.clientWidth);g.pageX?h=g.pageX:h=g.clientX+c.scrollLeft;g.pageY?j=g.pageY:j=g.clientY+c.scrollTop;h+$(f).width()+10>$(document).width()&&0<$(document).width()-$(f).width()-10&&(h=$(document).width()-$(f).width()-10);j+$(f).height()+10>$(document).height()&&0<$(document).height()-$(f).height()-10&&(j=$(document).height()-$(f).height()-10); $(document).unbind("click",$(this).document_click);$("#"+a.menu+" li ul").hide();$("#"+a.menu+" li div").hide();$(f).css({top:j,left:h}).fadeIn(a.inSpeed);$(document).bind("keypress",{menu:f},$(this).menu_keypress);$("#"+a.menu).find("a").unbind("click");$("#"+a.menu).find("li a:not(.disabled)").click(function(){$(document).unbind("click",$(this).document_click).unbind("keypress",$(this).menu_keypress);$(".contextMenu").hide();d.removeClass("contextRow");e&&e($(this).attr("href").substr(1),$(d),{x:h- l.left,y:j-l.top,docX:h,docY:j});return!1});setTimeout(function(){$(document).bind("click",{menu:f,o:a},$(this).document_click);$("iframe").load(function(){(this.contentDocument?this.contentDocument:this.contentWindow?this.contentWindow.document:null).onclick=function(){$(document).click()}});$("iframe").contents().mouseup(function(){$(document).click()})},0)}rcmail.drag_active||(g.cancelBubble=!0,g.stopPropagation&&g.stopPropagation())})});var d,k;$("#"+a.menu).children("li").mouseenter(function(){if($(this).hasClass("submenu")){if($(this).hasClass("submenu")&& !d&&!$(this).children("*:not(a, span)").is(":visible")){window.clearTimeout(k);k=null;var b=this;d=window.setTimeout(function(){$("#"+a.menu).children("li.submenu").children("div.popupmenu").children("ul.scrollable").scrollTop(0);$("#"+a.menu).children("li.submenu").children("div.popupmenu").children("div.scroll_up_act").addClass("scroll_up_pas").removeClass("scroll_up_act");$("#"+a.menu).children("li.submenu").children("div.popupmenu").children("div.scroll_down_pas").addClass("scroll_down_act").removeClass("scroll_down_pas"); $("#"+a.menu).children("li.submenu").children("*:not(a, span)").hide();doc_height=$(document).height();$(b).children("*:not(a, span)").css({left:$("#"+a.menu).width()-2,top:0});$(b).children("*:not(a, span)").show();$(b).children("*:not(a, span)").offset().left+$(b).children("*:not(a, span)").width()+10>$(document).width()&&0<$(document).width()-$(b).children("*:not(a, span)").width()-$("#"+a.menu).width()&&$(b).children("*:not(a, span)").css({left:-1*$(b).children("*:not(a, span)").width()});y=-1* ($(b).children("*:not(a, span)").offset().top+$(b).children("*:not(a, span)").height()+10-doc_height);0>y&&0<$(b).children("*:not(a, span)").offset().top+y&&$(b).children("*:not(a, span)").css({top:y});$(b).children("div.popupmenu").length&&$(b).children("div.popupmenu").children().show();d=null},a.submenu_delay)}}else k=window.setTimeout(function(){$("#"+a.menu).children("li.submenu").children("*:not(a, span)").hide();k=null},a.submenu_delay)});$("#"+a.menu).children("li.submenu").mouseleave(function(){window.clearTimeout(d); d=null});$(this).mouseleave(function(){window.clearTimeout(d);d=null});$("#"+a.menu).each(function(){$(this).attr("unselectable","on");$(this).css("user-select","none");$(this).on("selectstart",!1)});$(b).add($("ul.contextMenu")).bind("contextmenu",function(){return!1})});return $(this)},disableContextMenuItems:function(a){if(void 0==a)return $(this).find("a").addClass("disabled"),$(this);$(this).each(function(){if(void 0!=a)for(var e=a.split(","),b=0;b<e.length;b++)$(this).find('a[href="'+e[b]+'"]').addClass("disabled")}); return $(this)},enableContextMenuItems:function(a){if(void 0==a)return $(this).find("a.disabled").removeClass("disabled"),$(this);$(this).each(function(){if(void 0!=a)for(var e=a.split(","),b=0;b<e.length;b++)$(this).find('a[href="'+e[b]+'"]').removeClass("disabled")});return $(this)},disableContextMenu:function(){$(this).each(function(){$(this).addClass("disabled")});return $(this)},enableContextMenu:function(){$(this).each(function(){$(this).removeClass("disabled")});return $(this)},destroyContextMenu:function(){$(this).each(function(){$(this).unbind("mousedown").unbind("mouseup")}); return $(this)},submenu_render:function(a){$(a).show();$(a).children("li.submenu").children().show();$(a).children("li.submenu").children("div.popupmenu").each(function(){ul_overflow=$(this).children("ul").css("overflow");$(this).children("ul").css({overflow:"visible"});$(this).children("div").css({width:$(this).children("ul").width()+"px"});$(this).css({width:$(this).children("ul").width()+"px"});$(this).children("ul").css({overflow:ul_overflow});$(this).children("div").click(function(a){var b=$(this).parent().children("ul"); $(this).hasClass("scroll_up_act")?($(b).scrollTop($(b).scrollTop()-18),$(this).parent().children("div.scroll_down_pas").addClass("scroll_down_act"),$(this).parent().children("div.scroll_down_pas").removeClass("scroll_down_pas"),0==$(b).scrollTop()&&($(this).removeClass("scroll_up_act"),$(this).addClass("scroll_up_pas"))):$(this).hasClass("scroll_down_act")&&($(b).scrollTop($(b).scrollTop()+18),$(this).parent().children("div.scroll_up_pas").addClass("scroll_up_act"),$(this).parent().children("div.scroll_up_pas").removeClass("scroll_up_pas"), $(b).prop("scrollHeight")-$(b).scrollTop()==$(b).outerHeight()&&($(this).removeClass("scroll_down_act"),$(this).addClass("scroll_down_pas")));a.cancelBubble=!0;a.stopPropagation&&a.stopPropagation()});$(this).children("ul").mousewheel($(this).submenu_mousewheel)});$(a).children("li.submenu").children("*:not(a, span)").hide();$(a).hide()},submenu_mousewheel:function(a,e){0<e?$(this).parent().children("div.scroll_up_act").click():0>e&&$(this).parent().children("div.scroll_down_act").click()},menu_keypress:function(a){switch(a.keyCode){case 13:$(a.data.menu).find("li a.hover").trigger("click"); break;case 27:$(document).trigger("click")}},document_click:function(a){$(document).unbind("click",$(this).document_click).unbind("keypress",$(this).menu_keypress);$(".contextRow").removeClass("contextRow");$(a.data.menu).fadeOut(a.data.o.outSpeed);return!1}})}(jQuery); \ No newline at end of file
diff --git a/plugins/contextmenu/jquery.mousewheel.js b/plugins/contextmenu/jquery.mousewheel.js
new file mode 120000
index 000000000..d86864a6a
--- /dev/null
+++ b/plugins/contextmenu/jquery.mousewheel.js
@@ -0,0 +1 @@
+../../../javascript/jquery-mousewheel/jquery.mousewheel.min.js \ No newline at end of file
diff --git a/plugins/contextmenu/localization/ca_ES.inc b/plugins/contextmenu/localization/ca_ES.inc
new file mode 100644
index 000000000..61081b6c8
--- /dev/null
+++ b/plugins/contextmenu/localization/ca_ES.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Daniel López */
+
+$labels = array();
+$labels['markreadfolder'] = 'Marca tot com a llegit';
+$labels['collapseall'] = 'Compacta totes les carpetes';
+$labels['expandall'] = 'Expandeix totes les carpetes';
+$labels['copyto'] = 'Copia a ...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/cs_CZ.inc b/plugins/contextmenu/localization/cs_CZ.inc
new file mode 100644
index 000000000..1dc4400db
--- /dev/null
+++ b/plugins/contextmenu/localization/cs_CZ.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Martin Frajdl */
+
+$labels = array();
+$labels['markreadfolder'] = 'Oznacit vše jako přečtené';
+$labels['collapseall'] = 'Sbalit všechny složky';
+$labels['expandall'] = 'Rozbalit všechny složky';
+$labels['copyto'] = 'Kopírovat do...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/da_DK.inc b/plugins/contextmenu/localization/da_DK.inc
new file mode 100644
index 000000000..5b9c04f39
--- /dev/null
+++ b/plugins/contextmenu/localization/da_DK.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Johannes Hessellund */
+
+$labels = array();
+$labels['markreadfolder'] = 'Markér alle som læst';
+$labels['collapseall'] = 'Fold alle mapper sammen';
+$labels['expandall'] = 'Udfold alle mapper';
+$labels['copyto'] = 'Kopier til...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/de_CH.inc b/plugins/contextmenu/localization/de_CH.inc
new file mode 100644
index 000000000..fbfa57078
--- /dev/null
+++ b/plugins/contextmenu/localization/de_CH.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Mike Constabel */
+
+$labels = array();
+$labels['markreadfolder'] = 'Alle als gelesen markieren';
+$labels['collapseall'] = 'Alle Unterordner einklappen';
+$labels['expandall'] = 'Alle Unterordner ausklappen';
+$labels['copyto'] = 'Kopieren nach ...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/de_DE.inc b/plugins/contextmenu/localization/de_DE.inc
new file mode 100644
index 000000000..fbfa57078
--- /dev/null
+++ b/plugins/contextmenu/localization/de_DE.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Mike Constabel */
+
+$labels = array();
+$labels['markreadfolder'] = 'Alle als gelesen markieren';
+$labels['collapseall'] = 'Alle Unterordner einklappen';
+$labels['expandall'] = 'Alle Unterordner ausklappen';
+$labels['copyto'] = 'Kopieren nach ...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/en_GB.inc b/plugins/contextmenu/localization/en_GB.inc
new file mode 100644
index 000000000..d9cc7f9d7
--- /dev/null
+++ b/plugins/contextmenu/localization/en_GB.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Philip Weir */
+
+$labels = array();
+$labels['markreadfolder'] = 'Mark all as read';
+$labels['collapseall'] = 'Collapse all folders';
+$labels['expandall'] = 'Expand all folders';
+$labels['copyto'] = 'Copy to...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/en_US.inc b/plugins/contextmenu/localization/en_US.inc
new file mode 100644
index 000000000..d9cc7f9d7
--- /dev/null
+++ b/plugins/contextmenu/localization/en_US.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Philip Weir */
+
+$labels = array();
+$labels['markreadfolder'] = 'Mark all as read';
+$labels['collapseall'] = 'Collapse all folders';
+$labels['expandall'] = 'Expand all folders';
+$labels['copyto'] = 'Copy to...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/es_ES.inc b/plugins/contextmenu/localization/es_ES.inc
new file mode 100644
index 000000000..253106be6
--- /dev/null
+++ b/plugins/contextmenu/localization/es_ES.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Daniel López */
+
+$labels = array();
+$labels['markreadfolder'] = 'Marcar todo como leído';
+$labels['collapseall'] = 'Compactar todas las carpetas';
+$labels['expandall'] = 'Expandir todas las carpetas';
+$labels['copyto'] = 'Copiar a...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/fr_FR.inc b/plugins/contextmenu/localization/fr_FR.inc
new file mode 100644
index 000000000..6da00f498
--- /dev/null
+++ b/plugins/contextmenu/localization/fr_FR.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: */
+
+$labels = array();
+$labels['markreadfolder'] = 'Marquer tout comme lu';
+$labels['collapseall'] = 'Reduire les dossiers';
+$labels['expandall'] = 'Developper les dossiers';
+$labels['copyto'] = 'Copier vers...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/gl_ES.inc b/plugins/contextmenu/localization/gl_ES.inc
new file mode 100644
index 000000000..33f2de1d6
--- /dev/null
+++ b/plugins/contextmenu/localization/gl_ES.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: David Garabana Barro */
+
+$labels = array();
+$labels['markreadfolder'] = 'Marcar todas coma lidas';
+$labels['collapseall'] = 'Pechar tódolos cartafoles';
+$labels['expandall'] = 'Abrir tódolos cartafoles';
+$labels['copyto'] = 'Copiar a...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/hu_HU.inc b/plugins/contextmenu/localization/hu_HU.inc
new file mode 100644
index 000000000..699aa8df9
--- /dev/null
+++ b/plugins/contextmenu/localization/hu_HU.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Németh János */
+
+$labels = array();
+$labels['markreadfolder'] = 'Összes megjelölése olvasottként';
+$labels['collapseall'] = 'Összes összecsukása';
+$labels['expandall'] = 'Összes kibontása';
+$labels['copyto'] = 'Másolás...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/it_IT.inc b/plugins/contextmenu/localization/it_IT.inc
new file mode 100644
index 000000000..7e68214c5
--- /dev/null
+++ b/plugins/contextmenu/localization/it_IT.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Massimiliano Adamo */
+
+$labels = array();
+$labels['markreadfolder'] = 'Marca tutto come letto';
+$labels['collapseall'] = 'Compatta tutte le cartelle';
+$labels['expandall'] = 'Espandi tutte le cartelle';
+$labels['copyto'] = 'Copia su...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/nl_NL.inc b/plugins/contextmenu/localization/nl_NL.inc
new file mode 100644
index 000000000..57f3562d0
--- /dev/null
+++ b/plugins/contextmenu/localization/nl_NL.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Wouter Kevenaar */
+
+$labels = array();
+$labels['markreadfolder'] = 'Alles markeren als gelezen';
+$labels['collapseall'] = 'Alle mappen inklappen';
+$labels['expandall'] = 'Alle mappen uitklappen';
+$labels['copyto'] = 'Kopiëren naar...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/pl_PL.inc b/plugins/contextmenu/localization/pl_PL.inc
new file mode 100644
index 000000000..7cc2cd4b9
--- /dev/null
+++ b/plugins/contextmenu/localization/pl_PL.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Michał Jałocha */
+
+$labels = array();
+$labels['markreadfolder'] = 'Oznacz wszystkie jako przeczytane';
+$labels['collapseall'] = 'Zwiń wszystkie foldery';
+$labels['expandall'] = 'Rozwiń wszystkie foldery';
+$labels['copyto'] = 'Kopiuj do...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/pt_BR.inc b/plugins/contextmenu/localization/pt_BR.inc
new file mode 100644
index 000000000..60b0e7284
--- /dev/null
+++ b/plugins/contextmenu/localization/pt_BR.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Alexandre Gorges */
+
+$labels = array();
+$labels['markreadfolder'] = 'Marcar todas como lidas';
+$labels['collapseall'] = 'Recolher todas as pastas';
+$labels['expandall'] = 'Expandir todas as pastas';
+$labels['copyto'] = 'Copiar para...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/ro_RO.inc b/plugins/contextmenu/localization/ro_RO.inc
new file mode 100644
index 000000000..3ac7559ab
--- /dev/null
+++ b/plugins/contextmenu/localization/ro_RO.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Ovidiu Bica */
+
+$labels = array();
+$labels['markreadfolder'] = 'Marchează mesajele ca citite';
+$labels['collapseall'] = 'Ascunde toate folderele';
+$labels['expandall'] = 'Afişează toate folderele';
+$labels['copyto'] = 'Copiaza in';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/ru_RU.inc b/plugins/contextmenu/localization/ru_RU.inc
new file mode 100644
index 000000000..3a3d85df6
--- /dev/null
+++ b/plugins/contextmenu/localization/ru_RU.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Sergey Basov */
+
+$labels = array();
+$labels['markreadfolder'] = 'Отметить все как прочитанные';
+$labels['collapseall'] = 'Свернуть все папки';
+$labels['expandall'] = 'Развернуть все папки';
+$labels['copyto'] = 'Копировать в...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/sv_SE.inc b/plugins/contextmenu/localization/sv_SE.inc
new file mode 100644
index 000000000..92f3c13a0
--- /dev/null
+++ b/plugins/contextmenu/localization/sv_SE.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Jonas Nasholm */
+
+$labels = array();
+$labels['markreadfolder'] = 'Märk allt som läst';
+$labels['collapseall'] = 'Dölj alla kataloger';
+$labels['expandall'] = 'Visa alla kataloger';
+$labels['copyto'] = 'Kopiera till...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/tr_TR.inc b/plugins/contextmenu/localization/tr_TR.inc
new file mode 100644
index 000000000..62f7acf93
--- /dev/null
+++ b/plugins/contextmenu/localization/tr_TR.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Mustafa Icer */
+
+$labels = array();
+$labels['markreadfolder'] = 'Tüm mesajları okunumuş olarak işaretle';
+$labels['collapseall'] = 'Tüm alt klasörleri kapat';
+$labels['expandall'] = 'Tüm alt klasörleri aç';
+$labels['copyto'] = '... kopyala';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/uk_UA.inc b/plugins/contextmenu/localization/uk_UA.inc
new file mode 100644
index 000000000..67ddb234c
--- /dev/null
+++ b/plugins/contextmenu/localization/uk_UA.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: Sergey Basov */
+
+$labels = array();
+$labels['markreadfolder'] = 'Відмітити все як прочитане';
+$labels['collapseall'] = 'Згорнути усі папки';
+$labels['expandall'] = 'Розгорнути усі папки';
+$labels['copyto'] = 'Копіювати до...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/localization/zh_TW.inc b/plugins/contextmenu/localization/zh_TW.inc
new file mode 100644
index 000000000..bd33d27b8
--- /dev/null
+++ b/plugins/contextmenu/localization/zh_TW.inc
@@ -0,0 +1,12 @@
+<?php
+/* Author: thomasysliu */
+
+$labels = array();
+$labels['markreadfolder'] = '標示為已讀取';
+$labels['collapseall'] = '全部收起';
+$labels['expandall'] = '全部展開';
+$labels['copyto'] = '複製到...';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/contextmenu/package.xml b/plugins/contextmenu/package.xml
new file mode 100644
index 000000000..c65375ae9
--- /dev/null
+++ b/plugins/contextmenu/package.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+ http://pear.php.net/dtd/tasks-1.0.xsd
+ http://pear.php.net/dtd/package-2.0
+ http://pear.php.net/dtd/package-2.0.xsd">
+ <name>contextmenu</name>
+ <uri>http://github.com/JohnDoh/Roundcube-Plugin-Context-Menu/</uri>
+ <summary>Adds context menus with common tasks to various parts of Roundcube</summary>
+ <description>Adds context menus to the message list, folder list and address book. Menu includes the abilities mark messages as read/unread, delete, reply and forward.</description>
+ <lead>
+ <name>Philip Weir</name>
+ <user>JohnDoh</user>
+ <email>roundcube@tehinterweb.co.uk</email>
+ <active>yes</active>
+ </lead>
+ <date>2013-02-24</date>
+ <time>10:50:37</time>
+ <version>
+ <release>1.10</release>
+ <api>1.10</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.gnu.org/licenses/gpl.html">GNU GPLv3+</license>
+ <notes>-</notes>
+ <contents>
+ <dir baseinstalldir="/" name="/">
+ <file name="contextmenu.php" role="php">
+ <tasks:replace from="@name@" to="name" type="package-info"/>
+ <tasks:replace from="@package_version@" to="version" type="package-info"/>
+ </file>
+ <file name="contextmenu.js" role="data">
+ <tasks:replace from="@name@" to="name" type="package-info"/>
+ <tasks:replace from="@package_version@" to="version" type="package-info"/>
+ </file>
+ <file name="CHANGELOG" role="data"/>
+ <file name="README.md" role="data"/>
+ <file name="jquery.contextMenu.js" role="data"/>
+ <file name="jquery.mousewheel.js" role="data"/>
+ <file name="localization/ca_ES.inc" role="data"/>
+ <file name="localization/cs_CZ.inc" role="data"/>
+ <file name="localization/da_DK.inc" role="data"/>
+ <file name="localization/de_CH.inc" role="data"/>
+ <file name="localization/de_DE.inc" role="data"/>
+ <file name="localization/en_GB.inc" role="data"/>
+ <file name="localization/en_US.inc" role="data"/>
+ <file name="localization/es_ES.inc" role="data"/>
+ <file name="localization/fr_FR.inc" role="data"/>
+ <file name="localization/gl_ES.inc" role="data"/>
+ <file name="localization/hu_HU.inc" role="data"/>
+ <file name="localization/it_IT.inc" role="data"/>
+ <file name="localization/nl_NL.inc" role="data"/>
+ <file name="localization/pl_PL.inc" role="data"/>
+ <file name="localization/pt_BR.inc" role="data"/>
+ <file name="localization/ro_RO.inc" role="data"/>
+ <file name="localization/ru_RU.inc" role="data"/>
+ <file name="localization/sv_SE.inc" role="data"/>
+ <file name="localization/tr_TR.inc" role="data"/>
+ <file name="localization/uk_UA.inc" role="data"/>
+ <file name="localization/zh_TW.inc" role="data"/>
+ <file name="skins/classic/contexticons.gif" role="data"/>
+ <file name="skins/classic/contexticons.png" role="data"/>
+ <file name="skins/classic/contextmenu.css" role="data"/>
+ <file name="skins/classic/folders.gif" role="data"/>
+ <file name="skins/classic/folders.png" role="data"/>
+ <file name="skins/classic/ie6hacks.css" role="data"/>
+ <file name="skins/classic/messageactions.gif" role="data"/>
+ <file name="skins/classic/messageactions.png" role="data"/>
+ <file name="skins/larry/contexticons.png" role="data"/>
+ <file name="skins/larry/contextmenu.css" role="data"/>
+ <file name="skins/larry/folders.png" role="data"/>
+ <file name="skins/larry/ie6hacks.css" role="data"/>
+ <file name="skins/larry/messageactions.png" role="data"/>
+ </dir>
+ <!-- / -->
+ </contents>
+ <dependencies>
+ <required>
+ <php>
+ <min>5.2.1</min>
+ </php>
+ <pearinstaller>
+ <min>1.7.0</min>
+ </pearinstaller>
+ </required>
+ </dependencies>
+ <phprelease/>
+</package>
diff --git a/plugins/contextmenu/skins/classic/contexticons.gif b/plugins/contextmenu/skins/classic/contexticons.gif
new file mode 100644
index 000000000..e1a77ea28
--- /dev/null
+++ b/plugins/contextmenu/skins/classic/contexticons.gif
Binary files differ
diff --git a/plugins/contextmenu/skins/classic/contexticons.png b/plugins/contextmenu/skins/classic/contexticons.png
new file mode 100644
index 000000000..fb0a7299c
--- /dev/null
+++ b/plugins/contextmenu/skins/classic/contexticons.png
Binary files differ
diff --git a/plugins/contextmenu/skins/classic/contextmenu.css b/plugins/contextmenu/skins/classic/contextmenu.css
new file mode 100644
index 000000000..704878818
--- /dev/null
+++ b/plugins/contextmenu/skins/classic/contextmenu.css
@@ -0,0 +1,357 @@
+/**
+ * ContextMenu plugin styles
+ */
+
+.contextRow td,
+#mailboxlist li.contextRow,
+#directorylistbox li.contextRow
+{
+ background-color: #EEEEEE;
+}
+
+#mailboxlist li.selected,
+#directorylistbox li.selected
+{
+ background-color: #929292;
+}
+
+#rcmContextMenu,
+#rcmFolderMenu,
+#rcmAddressMenu,
+#rcmGroupMenu
+{
+ padding-top: 3px;
+ min-width: 220px;
+}
+
+#rcmContextMenu li,
+#rcmFolderMenu li,
+#rcmAddressMenu li,
+#rcmGroupMenu li
+{
+ margin: 0;
+}
+
+#rcmContextMenu li ul,
+#rcmContextMenu li div,
+#rcmFolderMenu li ul,
+#rcmFolderMenu li div,
+#rcmAddressMenu li ul,
+#rcmAddressMenu li div,
+#rcmGroupMenu li ul,
+#rcmGroupMenu li div
+{
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: auto;
+ display: none;
+ background-color: #F9F9F9;
+ border: 1px solid #CCC;
+ padding: 1px;
+ z-index: 901;
+}
+
+#rcmContextMenu li.conmentitle,
+#rcmContextMenu li.submenu,
+#rcmFolderMenu li.conmentitle,
+#rcmFolderMenu li.submenu,
+#rcmAddressMenu li.conmentitle,
+#rcmAddressMenu li.submenu,
+#rcmGroupMenu li.conmentitle,
+#rcmGroupMenu li.submenu
+{
+ padding: 2px 8px 3px 27px;
+ cursor: default;
+}
+
+#rcmContextMenu li.sublink,
+#rcmFolderMenu li.sublink,
+#rcmAddressMenu li.sublink,
+#rcmGroupMenu li.sublink
+{
+ padding: 0;
+}
+
+#rcmContextMenu li.submenu,
+#rcmFolderMenu li.submenu,
+#rcmAddressMenu li.submenu,
+#rcmGroupMenu li.submenu
+{
+ position: relative;
+ cursor: pointer;
+ background: url(contexticons.png) no-repeat right 0;
+ padding-right: 15px;
+}
+
+#rcmContextMenu li.replyacts,
+#rcmContextMenu li.forwardacts,
+#rcmAddressMenu li.exportacts
+{
+ padding: 0 8px 0 0;
+}
+
+#rcmContextMenu li.markmessage a,
+#rcmAddressMenu li.contactgroup a
+{
+ text-indent: 8px;
+}
+
+#rcmContextMenu li.submenu:hover,
+#rcmContextMenu li.sublink:hover a.mainlink,
+#rcmFolderMenu li.submenu:hover,
+#rcmFolderMenu li.sublink:hover a.mainlink,
+#rcmAddressMenu li.submenu:hover,
+#rcmAddressMenu li.sublink:hover a.mainlink,
+#rcmGroupMenu li.submenu:hover,
+#rcmGroupMenu li.sublink:hover a.mainlink
+{
+ color: #fff;
+ background-color: #CC0000;
+}
+
+#rcmContextMenu li a,
+#rcmFolderMenu li a,
+#rcmAddressMenu li a,
+#rcmGroupMenu li a
+{
+ background: url(contexticons.png) no-repeat 7px 20px;
+}
+
+#rcmContextMenu li a.active:hover,
+#rcmFolderMenu li a.active:hover,
+#rcmAddressMenu li a.active:hover,
+#rcmGroupMenu li a.active:hover
+{
+ color: #fff;
+ background-color: #CC0000;
+}
+
+#rcmContextMenu a.disabled,
+#rcmFolderMenu a.disabled,
+#rcmAddressMenu a.disabled,
+#rcmGroupMenu a.disabled
+{
+ color: #AAA;
+ cursor: default;
+}
+
+#rcmContextMenu a.disabled:hover,
+#rcmFolderMenu a.disabled:hover,
+#rcmAddressMenu a.disabled:hover,
+#rcmGroupMenu a.disabled:hover
+{
+ color: #AAA;
+ background-color: transparent
+}
+
+#rcmContextMenu .read a
+{
+ background-position: 7px -85px;
+}
+
+#rcmFolderMenu .readfolder a
+{
+ background-position: 7px -85px;
+}
+
+#rcmContextMenu .unread a
+{
+ background-position: 7px -136px;
+}
+#rcmContextMenu .flagged a
+{
+ background-position: 7px -170px;
+}
+
+#rcmContextMenu .unflagged a
+{
+ background-position: 7px -153px;
+}
+
+#rcmContextMenu .reply a, #rcmContextMenu .replyall a, #rcmContextMenu .replylist a
+{
+ background-position: 7px -119px;
+}
+
+#rcmContextMenu .forwardinline a, #rcmContextMenu .forwardattachment a
+{
+ background-position: 7px -102px;
+}
+
+#rcmContextMenu .delete a,
+#rcmAddressMenu .deletecontact a
+{
+ background-position: 7px -187px;
+}
+
+#rcmFolderMenu .expunge a
+{
+ background-position: 7px -255px;
+}
+
+#rcmFolderMenu .purge a
+{
+ background-position: 7px -272px;
+}
+
+#rcmFolderMenu .collapseall a
+{
+ background-position: 7px -204px;
+}
+
+#rcmFolderMenu .expandall a
+{
+ background-position: 7px -220px;
+}
+
+#rcmContextMenu ul.moreacts li a
+{
+ background: url(messageactions.png) no-repeat 5px 20px;
+}
+
+#rcmContextMenu ul.moreacts li.print a
+{
+ background-position: 5px 1px;
+}
+
+#rcmContextMenu ul.moreacts li.source a
+{
+ background-position: 5px -35px;
+}
+
+#rcmContextMenu ul.moreacts li.save a
+{
+ background-position: 5px -17px;
+}
+
+#rcmContextMenu ul.moreacts li.open a
+{
+ background-position: 5px -53px;
+}
+
+#rcmFolderMenu .openfolder a
+{
+ background: url(messageactions.png) no-repeat 6px -53px;
+}
+
+#rcmContextMenu ul.moreacts li.edit a
+{
+ background-position: 5px -71px;
+}
+
+#rcmAddressMenu .editcontact a
+{
+ background: url(messageactions.png) no-repeat 6px -71px;
+}
+
+#rcmAddressMenu .composeto a
+{
+ background-position: 8px -238px;
+}
+
+#rcmContextMenu ul.folders li a,
+#rcmAddressMenu ul.folders li a
+{
+ background: url(folders.png) 5px 1px no-repeat;
+}
+
+#rcmContextMenu ul.folders li.inbox a
+{
+ background-position: 5px -17px;
+}
+
+#rcmContextMenu ul.folders li.drafts a
+{
+ background-position: 5px -36px;
+}
+
+#rcmContextMenu ul.folders li.sent a
+{
+ background-position: 5px -54px;
+}
+
+#rcmContextMenu ul.folders li.junk a
+{
+ background-position: 5px -73px;
+}
+
+#rcmContextMenu ul.folders li.trash a
+{
+ background-position: 5px -90px;
+}
+
+#rcmAddressMenu ul.folders li.addressbook a
+{
+ background-position: 5px -108px;
+}
+
+#rcmAddressMenu ul.folders li.contactgroup a
+{
+ background-position: 5px -144px;
+}
+
+#rcmContextMenu div.popupmenu,
+#rcmFolderMenu div.popupmenu,
+#rcmAddressMenu div.popupmenu
+{
+ height: 129px;
+ padding: 0;
+}
+
+#rcmContextMenu ul.scrollable,
+#rcmFolderMenu ul.scrollable,
+#rcmAddressMenu ul.scrollable
+{
+ top: 15px;
+ height: 100px;
+ overflow: hidden;
+ border-top: 0;
+ border-bottom: 0;
+ margin: 0;
+}
+
+#rcmContextMenu li div,
+#rcmFolderMenu li div,
+#rcmAddressMenu li div
+{
+ height: 12px;
+ overflow: hidden;
+ background: url(contexticons.png) #F9F9F9 no-repeat center 20px;
+}
+
+#rcmContextMenu li div.scroll_up_act,
+#rcmFolderMenu li div.scroll_up_act,
+#rcmAddressMenu li div.scroll_up_act
+{
+ background-position: center -17px;
+ border-bottom: 0;
+}
+
+#rcmContextMenu li div.scroll_up_pas,
+#rcmFolderMenu li div.scroll_up_pas,
+#rcmAddressMenu li div.scroll_up_pas
+{
+ background-position: center -34px;
+ border-bottom: 0;
+ cursor: default;
+}
+
+#rcmContextMenu li div.scroll_down_act,
+#rcmFolderMenu li div.scroll_down_act,
+#rcmAddressMenu li div.scroll_down_act
+{
+ top: 117px;
+ background-position: center -51px;
+ border-top: 0;
+}
+
+#rcmContextMenu li div.scroll_down_pas,
+#rcmFolderMenu li div.scroll_down_pas,
+#rcmAddressMenu li div.scroll_down_pas
+{
+ top: 117px;
+ background-position: center -68px;
+ border-top: 0;
+ cursor: default;
+} \ No newline at end of file
diff --git a/plugins/contextmenu/skins/classic/folders.gif b/plugins/contextmenu/skins/classic/folders.gif
new file mode 100644
index 000000000..0fccb2c18
--- /dev/null
+++ b/plugins/contextmenu/skins/classic/folders.gif
Binary files differ
diff --git a/plugins/contextmenu/skins/classic/folders.png b/plugins/contextmenu/skins/classic/folders.png
new file mode 100644
index 000000000..5013318f8
--- /dev/null
+++ b/plugins/contextmenu/skins/classic/folders.png
Binary files differ
diff --git a/plugins/contextmenu/skins/classic/ie6hacks.css b/plugins/contextmenu/skins/classic/ie6hacks.css
new file mode 100644
index 000000000..909915176
--- /dev/null
+++ b/plugins/contextmenu/skins/classic/ie6hacks.css
@@ -0,0 +1,54 @@
+/**
+ * ContextMenu plugin styles (IE6 hacks)
+ */
+
+#rcmContextMenu,
+#rcmFolderMenu,
+#rcmAddressMenu,
+#rcmGroupMenu
+{
+ width: 220px;
+}
+
+#rcmContextMenu li.submenu,
+#rcmFolderMenu li.submenu,
+#rcmAddressMenu li.submenu,
+#rcmGroupMenu li.submenu
+{
+ background-image: url(contexticons.gif);
+}
+
+#rcmContextMenu li a,
+#rcmFolderMenu li a,
+#rcmAddressMenu li a,
+#rcmGroupMenu li a
+{
+ background-image: url(contexticons.gif);
+}
+
+#rcmContextMenu ul.moreacts li a
+{
+ background-image: url(messageactions.gif);
+}
+
+#rcmFolderMenu .openfolder a
+{
+ background-image: url(messageactions.gif);
+}
+
+#rcmAddressMenu .editcontact a
+{
+ background-image: url(messageactions.gif);
+}
+
+#rcmContextMenu ul.folders li a,
+#rcmAddressMenu ul.folders li a
+{
+ background-image: url(folders.gif);
+}
+
+#rcmContextMenu li div,
+#rcmAddressMenu li div
+{
+ background-image: url(contexticons.gif);
+} \ No newline at end of file
diff --git a/plugins/contextmenu/skins/classic/messageactions.gif b/plugins/contextmenu/skins/classic/messageactions.gif
new file mode 100644
index 000000000..d2d647bed
--- /dev/null
+++ b/plugins/contextmenu/skins/classic/messageactions.gif
Binary files differ
diff --git a/plugins/contextmenu/skins/classic/messageactions.png b/plugins/contextmenu/skins/classic/messageactions.png
new file mode 100644
index 000000000..e9447f211
--- /dev/null
+++ b/plugins/contextmenu/skins/classic/messageactions.png
Binary files differ
diff --git a/plugins/contextmenu/skins/larry/contexticons.png b/plugins/contextmenu/skins/larry/contexticons.png
new file mode 100644
index 000000000..dbbfa4de1
--- /dev/null
+++ b/plugins/contextmenu/skins/larry/contexticons.png
Binary files differ
diff --git a/plugins/contextmenu/skins/larry/contextmenu.css b/plugins/contextmenu/skins/larry/contextmenu.css
new file mode 100644
index 000000000..d0b84ded3
--- /dev/null
+++ b/plugins/contextmenu/skins/larry/contextmenu.css
@@ -0,0 +1,425 @@
+/**
+ * ContextMenu plugin styles
+ */
+
+.records-table tbody tr.contextRow td
+{
+ background-color: #F2F2F2;
+}
+
+#mailboxlist li.contextRow,
+#directorylist li.contextRow,
+#addresslist .contextRow
+{
+ background-color: #C7E3EF;
+}
+
+#rcmContextMenu,
+#rcmFolderMenu,
+#rcmAddressMenu,
+#rcmGroupMenu
+{
+ padding-top: 3px;
+ min-width: 220px;
+}
+
+#rcmContextMenu li,
+#rcmFolderMenu li,
+#rcmAddressMenu li,
+#rcmGroupMenu li
+{
+ margin: 0;
+}
+
+#rcmContextMenu li ul,
+#rcmContextMenu li div,
+#rcmFolderMenu li ul,
+#rcmFolderMenu li div,
+#rcmAddressMenu li ul,
+#rcmAddressMenu li div,
+#rcmGroupMenu li ul,
+#rcmGroupMenu li div
+{
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: auto;
+ display: none;
+ background-color: #444;
+ border: 1px solid #999;
+ padding: 1px;
+ z-index: 901;
+ border-radius: 4px;
+ box-shadow: 0 2px 6px 0 #333;
+ -moz-box-shadow: 0 2px 6px 0 #333;
+ -webkit-box-shadow: 0 2px 6px 0 #333;
+ -o-box-shadow: 0 2px 6px 0 #333;
+}
+
+#rcmContextMenu li.conmentitle,
+#rcmContextMenu li.submenu,
+#rcmFolderMenu li.conmentitle,
+#rcmFolderMenu li.submenu,
+#rcmAddressMenu li.conmentitle,
+#rcmAddressMenu li.submenu,
+#rcmGroupMenu li.conmentitle,
+#rcmGroupMenu li.submenu
+{
+ padding: 0;
+ cursor: default;
+}
+
+#rcmContextMenu li.conmentitle span,
+#rcmContextMenu li.submenu span,
+#rcmFolderMenu li.conmentitle span,
+#rcmFolderMenu li.submenu span,
+#rcmAddressMenu li.conmentitle span,
+#rcmAddressMenu li.submenu span,
+#rcmGroupMenu li.conmentitle span,
+#rcmGroupMenu li.submenu span
+{
+ display: block;
+ padding: 6px 10px 6px 29px;
+}
+
+#rcmContextMenu li.sublink,
+#rcmFolderMenu li.sublink,
+#rcmAddressMenu li.sublink,
+#rcmGroupMenu li.sublink
+{
+ padding: 0;
+}
+
+#rcmContextMenu li.submenu,
+#rcmFolderMenu li.submenu,
+#rcmAddressMenu li.submenu,
+#rcmGroupMenu li.submenu
+{
+ position: relative;
+}
+
+#rcmContextMenu li.submenu span,
+#rcmFolderMenu li.submenu span,
+#rcmAddressMenu li.submenu span,
+#rcmGroupMenu li.submenu span
+{
+ cursor: pointer;
+ background: url(contexticons.png) no-repeat right -188px;
+ padding-right: 18px;
+}
+
+#rcmContextMenu li.markmessage a span,
+#rcmAddressMenu li.contactgroup a span
+{
+ text-indent: 15px;
+}
+
+#rcmContextMenu li.submenu:hover,
+#rcmContextMenu li.sublink:hover a.mainlink,
+#rcmFolderMenu li.submenu:hover,
+#rcmFolderMenu li.sublink:hover a.mainlink,
+#rcmAddressMenu li.submenu:hover,
+#rcmAddressMenu li.sublink:hover a.mainlink,
+#rcmGroupMenu li.submenu:hover,
+#rcmGroupMenu li.sublink:hover a.mainlink
+{
+ background-color: #00aad6;
+ background: -moz-linear-gradient(top, #00aad6 0%, #008fc9 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#00aad6), color-stop(100%,#008fc9));
+ background: -o-linear-gradient(top, #00aad6 0%, #008fc9 100%);
+ background: -ms-linear-gradient(top, #00aad6 0%, #008fc9 100%);
+ background: linear-gradient(top, #00aad6 0%, #008fc9 100%);
+}
+
+#rcmContextMenu li a,
+#rcmFolderMenu li a,
+#rcmAddressMenu li a,
+#rcmGroupMenu li a
+{
+ padding: 0;
+ margin-left: 0;
+}
+
+
+#rcmContextMenu li a span,
+#rcmFolderMenu li a span,
+#rcmAddressMenu li a span,
+#rcmGroupMenu li a span
+{
+ display: block;
+ background: url(contexticons.png) no-repeat 7px 20px;
+ padding: 6px 10px 6px 29px;
+ cursor: pointer;
+}
+
+#rcmContextMenu li a.active:hover,
+#rcmFolderMenu li a.active:hover,
+#rcmAddressMenu li a.active:hover,
+#rcmGroupMenu li a.active:hover
+{
+ background-color: #00aad6;
+ background: -moz-linear-gradient(top, #00aad6 0%, #008fc9 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#00aad6), color-stop(100%,#008fc9));
+ background: -o-linear-gradient(top, #00aad6 0%, #008fc9 100%);
+ background: -ms-linear-gradient(top, #00aad6 0%, #008fc9 100%);
+ background: linear-gradient(top, #00aad6 0%, #008fc9 100%);
+}
+
+#rcmContextMenu a.disabled,
+#rcmFolderMenu a.disabled,
+#rcmAddressMenu a.disabled,
+#rcmGroupMenu a.disabled
+{
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
+#rcmContextMenu li a.disabled span,
+#rcmFolderMenu li a.disabled span,
+#rcmAddressMenu li a.disabled span,
+#rcmGroupMenu li a.disabled span
+{
+ cursor: default;
+}
+
+#rcmContextMenu li a.disabled:hover,
+#rcmFolderMenu li a.disabled:hover,
+#rcmAddressMenu li a.disabled:hover,
+#rcmGroupMenu li a.disabled:hover
+{
+ background-color: #444444;
+ background: -moz-linear-gradient(top, #444444 0%, #444444 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#444444), color-stop(100%,#444444));
+ background: -o-linear-gradient(top, #444444 0%, #444444 100%);
+ background: -ms-linear-gradient(top, #444444 0%, #444444 100%);
+ background: linear-gradient(top, #444444 0%, #444444 100%);
+}
+
+#rcmContextMenu .read a span
+{
+ background-position: 5px -24px;
+}
+
+#rcmFolderMenu .readfolder a span
+{
+ background-position: 5px -24px;
+}
+
+#rcmContextMenu .unread a span
+{
+ background-position: 5px 0px;
+}
+#rcmContextMenu .flagged a span
+{
+ background-position: 5px -46px;
+}
+
+#rcmContextMenu .unflagged a span
+{
+ background-position: 5px -72px;
+}
+
+#rcmContextMenu .reply a span
+{
+ background-position: 5px -120px;
+}
+
+#rcmContextMenu .replyall a span, #rcmContextMenu .replylist a span
+{
+ background-position: 5px -144px;
+}
+
+#rcmContextMenu .forwardinline a span, #rcmContextMenu .forwardattachment a span
+{
+ background-position: 5px -167px;
+}
+
+#rcmContextMenu .delete a span,
+#rcmAddressMenu .deletecontact a span
+{
+ background-position: 5px -94px;
+}
+
+#rcmFolderMenu .expunge a span
+{
+ background-position: 5px 66px;
+}
+
+#rcmFolderMenu .purge a span
+{
+ background-position: 5px 66px;
+}
+
+#rcmFolderMenu .collapseall a span
+{
+ background-position: 5px -323px;
+}
+
+#rcmFolderMenu .expandall a span
+{
+ background-position: 5px -302px;
+}
+
+#rcmContextMenu ul.moreacts li a span
+{
+ background: url(messageactions.png) no-repeat 5px 30px;
+}
+
+#rcmContextMenu ul.moreacts li.print a span
+{
+ background-position: 5px -48px;
+}
+
+#rcmContextMenu ul.moreacts li.source a span
+{
+ background-position: 5px -72px;
+}
+
+#rcmContextMenu ul.moreacts li.save a span
+{
+ background-position: 5px -24px;
+}
+
+#rcmContextMenu ul.moreacts li.open a span
+{
+ background-position: 5px -96px;
+}
+
+#rcmFolderMenu .openfolder a span
+{
+ background: url(messageactions.png) no-repeat 5px -96px;
+}
+
+#rcmContextMenu ul.moreacts li.edit a span
+{
+ background-position: 5px 0px;
+}
+
+#rcmAddressMenu .editcontact a span
+{
+ background: url(messageactions.png) no-repeat 5px 0px;
+}
+
+#rcmAddressMenu .composeto a span
+{
+ background-position: 5px -279px;
+}
+
+#rcmAddressMenu .removefromgroup a span
+{
+ background-position: 5px -344px;
+}
+
+#rcmContextMenu ul.folders li a span,
+#rcmAddressMenu ul.folders li a span
+{
+ background: url(folders.png) 5px 3px no-repeat;
+}
+
+#rcmContextMenu ul.folders li.subfolder a span
+{
+ background-position: 5px -39px;
+}
+
+
+#rcmContextMenu ul.folders li.inbox a span
+{
+ background-position: 5px -61px;
+}
+
+#rcmContextMenu ul.folders li.drafts a span
+{
+ background-position: 5px -84px;
+}
+
+#rcmContextMenu ul.folders li.sent a span
+{
+ background-position: 5px -106px;
+}
+
+#rcmContextMenu ul.folders li.junk a span
+{
+ background-position: 5px -132px;
+}
+
+#rcmContextMenu ul.folders li.trash a span
+{
+ background-position: 5px -159px;
+}
+
+#rcmAddressMenu ul.folders li.addressbook a span
+{
+ background-position: 5px -183px;
+}
+
+#rcmAddressMenu ul.folders li.contactgroup a span
+{
+ background-position: 5px -209px;
+}
+
+#rcmContextMenu div.popupmenu,
+#rcmFolderMenu div.popupmenu,
+#rcmAddressMenu div.popupmenu
+{
+ height: 129px;
+ padding: 0;
+}
+
+#rcmContextMenu ul.scrollable,
+#rcmFolderMenu ul.scrollable,
+#rcmAddressMenu ul.scrollable
+{
+ top: 15px;
+ height: 100px;
+ overflow: hidden;
+ border-top: 0;
+ border-bottom: 0;
+ margin: 0;
+}
+
+#rcmContextMenu li div,
+#rcmFolderMenu li div,
+#rcmAddressMenu li div
+{
+ height: 12px;
+ overflow: hidden;
+ background: url(contexticons.png) #444 no-repeat center 20px;
+}
+
+#rcmContextMenu li div.scroll_up_act,
+#rcmFolderMenu li div.scroll_up_act,
+#rcmAddressMenu li div.scroll_up_act
+{
+ background-position: center -216px;
+ border-bottom: 0;
+ cursor: pointer;
+}
+
+#rcmContextMenu li div.scroll_up_pas,
+#rcmFolderMenu li div.scroll_up_pas,
+#rcmAddressMenu li div.scroll_up_pas
+{
+ background-position: center -233px;
+ border-bottom: 0;
+ cursor: default;
+}
+
+#rcmContextMenu li div.scroll_down_act,
+#rcmFolderMenu li div.scroll_down_act,
+#rcmAddressMenu li div.scroll_down_act
+{
+ top: 117px;
+ background-position: center -251px;
+ border-top: 0;
+ cursor: pointer;
+}
+
+#rcmContextMenu li div.scroll_down_pas,
+#rcmFolderMenu li div.scroll_down_pas,
+#rcmAddressMenu li div.scroll_down_pas
+{
+ top: 117px;
+ background-position: center -270px;
+ border-top: 0;
+ cursor: default;
+} \ No newline at end of file
diff --git a/plugins/contextmenu/skins/larry/folders.png b/plugins/contextmenu/skins/larry/folders.png
new file mode 100644
index 000000000..ce6f3e3db
--- /dev/null
+++ b/plugins/contextmenu/skins/larry/folders.png
Binary files differ
diff --git a/plugins/contextmenu/skins/larry/ie6hacks.css b/plugins/contextmenu/skins/larry/ie6hacks.css
new file mode 100644
index 000000000..effc427f9
--- /dev/null
+++ b/plugins/contextmenu/skins/larry/ie6hacks.css
@@ -0,0 +1,3 @@
+/**
+ * ContextMenu plugin styles (IE6 hacks)
+ */
diff --git a/plugins/contextmenu/skins/larry/messageactions.png b/plugins/contextmenu/skins/larry/messageactions.png
new file mode 100644
index 000000000..156c23970
--- /dev/null
+++ b/plugins/contextmenu/skins/larry/messageactions.png
Binary files differ