| | |
| | | /** |
| | | * Roundcube functions for default skin interface |
| | | * |
| | | * @licstart The following is the entire license notice for the |
| | | * JavaScript code in this file. |
| | | * |
| | | * Copyright (c) 2006-2014, The Roundcube Dev Team |
| | | * |
| | | * The JavaScript code in this page is free software: you can redistribute it |
| | | * and/or modify it under the terms of the GNU General Public License |
| | | * as published by the Free Software Foundation, either version 3 of |
| | | * the License, or (at your option) any later version. |
| | | * |
| | | * @licend The above is the entire license notice |
| | | * for the JavaScript code in this file. |
| | | */ |
| | | |
| | | /** |
| | |
| | | searchmenu: {id:'searchmenu', editable:1}, |
| | | messagemenu: {id:'messagemenu'}, |
| | | attachmentmenu: {id:'attachmentmenu'}, |
| | | listmenu: {id:'listmenu', editable:1}, |
| | | dragmenu: {id:'dragmenu', sticky:1}, |
| | | groupmenu: {id:'groupoptionsmenu', above:1}, |
| | | mailboxmenu: {id:'mailboxoptionsmenu', above:1}, |
| | | composemenu: {id:'composeoptionsmenu', editable:1, overlap:1}, |
| | | spellmenu: {id:'spellmenu'}, |
| | | responsesmenu: {id:'responsesmenu'}, |
| | | // toggle: #1486823, #1486930 |
| | | uploadmenu: {id:'attachment-form', editable:1, above:1, toggle:!bw.ie&&!bw.linux }, |
| | | uploadform: {id:'upload-form', editable:1, toggle:!bw.ie&&!bw.linux } |
| | |
| | | var n, all, |
| | | list = $('input:checkbox[name="s_mods[]"]', obj), |
| | | mbox = rcmail.env.mailbox, |
| | | mods = rcmail.env.search_mods; |
| | | mods = rcmail.env.search_mods, |
| | | scope = rcmail.env.search_scope || 'base'; |
| | | |
| | | if (rcmail.env.task == 'mail') { |
| | | mods = mods[mbox] ? mods[mbox] : mods['*']; |
| | | all = 'text'; |
| | | $('input:radio[name="s_scope"]').prop('checked', false).filter('#s_scope_'+scope).prop('checked', true); |
| | | } |
| | | else { |
| | | all = '*'; |
| | |
| | | { |
| | | var all, m, task = rcmail.env.task, |
| | | mods = rcmail.env.search_mods, |
| | | mbox = rcmail.env.mailbox; |
| | | mbox = rcmail.env.mailbox, |
| | | scope = $('input[name="s_scope"]:checked').val(); |
| | | |
| | | if (scope == 'all') |
| | | mbox = '*'; |
| | | |
| | | if (!mods) |
| | | mods = {}; |
| | |
| | | m[elem.value] = 1; |
| | | |
| | | // mark all fields |
| | | if (elem.value != all) |
| | | return; |
| | | if (elem.value == all) { |
| | | $('input:checkbox[name="s_mods[]"]').map(function() { |
| | | if (this == elem) |
| | | return; |
| | | |
| | | $('input:checkbox[name="s_mods[]"]').map(function() { |
| | | if (this == elem) |
| | | return; |
| | | |
| | | this.checked = true; |
| | | if (elem.checked) { |
| | | this.disabled = true; |
| | | delete m[this.value]; |
| | | } |
| | | else { |
| | | this.disabled = false; |
| | | m[this.value] = 1; |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | listmenu: function(show) |
| | | { |
| | | var obj = this.popups.listmenu.obj, |
| | | ref = rcube_find_object('listmenulink'); |
| | | |
| | | if (typeof show == 'undefined') |
| | | show = obj.is(':visible') ? false : true; |
| | | |
| | | if (show && ref) { |
| | | var pos = $(ref).offset(), |
| | | menuwidth = obj.width(), |
| | | pagewidth = $(document).width(); |
| | | |
| | | if (pagewidth - pos.left < menuwidth && pos.left > menuwidth) |
| | | pos.left = pos.left - menuwidth; |
| | | |
| | | obj.css({ left:pos.left, top:(pos.top + ref.offsetHeight + 2)}); |
| | | |
| | | // set form values |
| | | $('input[name="sort_col"][value="'+rcmail.env.sort_col+'"]').prop('checked', true); |
| | | $('input[name="sort_ord"][value="DESC"]').prop('checked', rcmail.env.sort_order == 'DESC'); |
| | | $('input[name="sort_ord"][value="ASC"]').prop('checked', rcmail.env.sort_order != 'DESC'); |
| | | $('input[name="view"][value="thread"]').prop('checked', rcmail.env.threading ? true : false); |
| | | $('input[name="view"][value="list"]').prop('checked', rcmail.env.threading ? false : true); |
| | | |
| | | // set checkboxes |
| | | $('input[name="list_col[]"]').each(function() { |
| | | $(this).prop('checked', jQuery.inArray(this.value, rcmail.env.coltypes) != -1); |
| | | this.checked = true; |
| | | if (elem.checked) { |
| | | this.disabled = true; |
| | | delete m[this.value]; |
| | | } |
| | | else { |
| | | this.disabled = false; |
| | | m[this.value] = 1; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | obj[show?'show':'hide'](); |
| | | |
| | | if (show) { |
| | | var maxheight=0; |
| | | $('#listmenu fieldset').each(function() { |
| | | var height = $(this).height(); |
| | | if (height > maxheight) { |
| | | maxheight = height; |
| | | } |
| | | }); |
| | | $('#listmenu fieldset').css("min-height", maxheight+"px") |
| | | .height(maxheight); |
| | | }; |
| | | rcmail.set_searchmods(m); |
| | | }, |
| | | |
| | | open_listmenu: function() |
| | | show_listmenu: function(p) |
| | | { |
| | | this.listmenu(); |
| | | var self = this, buttons = {}, $dialog = $('#listmenu'); |
| | | |
| | | // close the dialog |
| | | if ($dialog.is(':visible')) { |
| | | $dialog.dialog('close', p.originalEvent); |
| | | return; |
| | | } |
| | | |
| | | // set form values |
| | | $('input[name="sort_col"][value="'+rcmail.env.sort_col+'"]').prop('checked', true); |
| | | $('input[name="sort_ord"][value="DESC"]').prop('checked', rcmail.env.sort_order == 'DESC'); |
| | | $('input[name="sort_ord"][value="ASC"]').prop('checked', rcmail.env.sort_order != 'DESC'); |
| | | $('input[name="view"][value="thread"]').prop('checked', rcmail.env.threading ? true : false); |
| | | $('input[name="view"][value="list"]').prop('checked', rcmail.env.threading ? false : true); |
| | | |
| | | // set checkboxes |
| | | $('input[name="list_col[]"]').each(function() { |
| | | $(this).prop('checked', $.inArray(this.value, rcmail.env.listcols) != -1); |
| | | }); |
| | | |
| | | buttons[rcmail.gettext('save')] = function(e) { |
| | | $dialog.dialog('close', e); |
| | | self.save_listmenu(); |
| | | }; |
| | | |
| | | $dialog.dialog({ |
| | | modal: true, |
| | | resizable: false, |
| | | closeOnEscape: true, |
| | | title: null, |
| | | open: function(e) { |
| | | var maxheight = 0; |
| | | $('#listmenu fieldset').each(function() { |
| | | var height = $(this).height(); |
| | | if (height > maxheight) { |
| | | maxheight = height; |
| | | } |
| | | }).css("min-height", maxheight+"px").height(maxheight); |
| | | |
| | | setTimeout(function() { $dialog.find('a, input:not(:disabled)').not('[aria-disabled=true]').first().focus(); }, 100); |
| | | }, |
| | | close: function(e) { |
| | | $dialog.dialog('destroy').hide(); |
| | | if (e.originalEvent && rcube_event.is_keyboard(e.originalEvent)) |
| | | $('#listmenulink').focus(); |
| | | }, |
| | | buttons: buttons, |
| | | minWidth: 500, |
| | | width: $dialog.width()+20 |
| | | }).show(); |
| | | }, |
| | | |
| | | save_listmenu: function() |
| | | { |
| | | this.listmenu(); |
| | | |
| | | var sort = $('input[name="sort_col"]:checked').val(), |
| | | ord = $('input[name="sort_ord"]:checked').val(), |
| | | thread = $('input[name="view"]:checked').val(), |
| | |
| | | this.show_popupmenu('spellmenu', show); |
| | | }, |
| | | |
| | | show_attachmentmenu: function(elem) |
| | | show_attachmentmenu: function(elem, event) |
| | | { |
| | | var id = elem.parentNode.id.replace(/^attach/, ''); |
| | | |
| | |
| | | }); |
| | | |
| | | this.popups.attachmentmenu.link = elem; |
| | | rcmail.command('menu-open', {menu: 'attachmentmenu', id: id}); |
| | | rcmail.command('menu-open', {menu: 'attachmentmenu', id: id}, elem, event); |
| | | }, |
| | | |
| | | menu_open: function(p) |
| | | { |
| | | if (p && p.props && p.props.menu == 'attachmentmenu') |
| | | this.show_popup('attachmentmenu'); |
| | | else |
| | | this.open_listmenu(); |
| | | if (p && p.name == 'messagelistmenu') |
| | | this.show_listmenu(); |
| | | }, |
| | | |
| | | menu_save: function(prop) |
| | | body_mouseup: function(e) |
| | | { |
| | | this.save_listmenu(); |
| | | }, |
| | | var target = e.target; ref = this; |
| | | |
| | | body_mouseup: function(evt, p) |
| | | { |
| | | var i, target = rcube_event.get_target(evt); |
| | | |
| | | for (i in this.popups) { |
| | | if (this.popups[i].obj.is(':visible') && target != rcube_find_object(i+'link') |
| | | && !this.popups[i].toggle |
| | | && (!this.popups[i].editable || !this.target_overlaps(target, this.popups[i].id)) |
| | | && (!this.popups[i].sticky || !rcube_mouse_is_over(evt, rcube_find_object(this.popups[i].id))) |
| | | $.each(this.popups, function(i, popup) { |
| | | if (popup.obj.is(':visible') && target != rcube_find_object(i + 'link') |
| | | && !popup.toggle |
| | | && target != popup.obj.get(0) // check if scroll bar was clicked (#1489832) |
| | | && (!popup.editable || !ref.target_overlaps(target, popup.id)) |
| | | && (!popup.sticky || !rcube_mouse_is_over(e, rcube_find_object(popup.id))) |
| | | && !$(target).is('.folder-selector-link') && !$(target).children('.folder-selector-link').length |
| | | ) { |
| | | window.setTimeout('rcmail_ui.show_popup("'+i+'",false);', 50); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | target_overlaps: function (target, elementid) |
| | |
| | | return false; |
| | | }, |
| | | |
| | | body_keydown: function(evt, p) |
| | | body_keydown: function(e) |
| | | { |
| | | if (rcube_event.get_keycode(evt) == 27) { |
| | | if (e.keyCode == 27) { |
| | | for (var k in this.popups) { |
| | | if (this.popups[k].obj.is(':visible')) |
| | | this.show_popup(k, false); |
| | |
| | | resize_compose_body: function() |
| | | { |
| | | var div = $('#compose-div .boxlistcontent'), |
| | | w = div.width() - 2, h = div.height(), |
| | | w = div.width() - 6, |
| | | h = div.height() - 2, |
| | | x = bw.ie || bw.opera ? 4 : 0; |
| | | |
| | | $('#compose-body_tbl').width((w+3)+'px').height(''); |
| | | $('#compose-body_ifr').width((w+3)+'px').height((h-54)+'px'); |
| | | $('#compose-body').width((w-x)+'px').height(h+'px'); |
| | | $('#googie_edit_layer').height(h+'px'); |
| | | $('#compose-body_ifr').width(w + 6).height(h - 1 - $('div.mce-toolbar').height()); |
| | | $('#compose-body').width(w-x).height(h); |
| | | $('#googie_edit_layer').width(w).height(h); |
| | | }, |
| | | |
| | | resize_compose_body_ev: function() |
| | |
| | | var label = rcmail.gettext(p.status ? 'replylist' : 'replyall'); |
| | | $('a.button.replyAll').attr('title', label); |
| | | } |
| | | }, |
| | | |
| | | folder_search_init: function(container) |
| | | { |
| | | // animation to unfold list search box |
| | | $('.boxtitle a.search', container).click(function(e) { |
| | | var title = $('.boxtitle', container), |
| | | box = $('.listsearchbox', container), |
| | | dir = box.is(':visible') ? -1 : 1, |
| | | height = 24 + ($('select', box).length ? 24 : 0); |
| | | |
| | | box.slideToggle({ |
| | | duration: 160, |
| | | progress: function(animation, progress) { |
| | | if (dir < 0) progress = 1 - progress; |
| | | $('.boxlistcontent', container).css('top', (title.outerHeight() + height * progress) + 'px'); |
| | | }, |
| | | complete: function() { |
| | | box.toggleClass('expanded'); |
| | | if (box.is(':visible')) { |
| | | box.find('input[type=text]').focus(); |
| | | } |
| | | else { |
| | | $('a.reset', box).click(); |
| | | } |
| | | // TODO: save state in cookie |
| | | } |
| | | }); |
| | | |
| | | return false; |
| | | }); |
| | | } |
| | | |
| | | }; |
| | |
| | | |
| | | /** |
| | | * Scroller |
| | | * |
| | | * @deprecated Use treelist widget |
| | | */ |
| | | function rcmail_scroller(list, top, bottom) |
| | | { |
| | |
| | | // this==iframe |
| | | try { |
| | | var doc = this.contentDocument ? this.contentDocument : this.contentWindow ? this.contentWindow.document : null; |
| | | rcube_event.add_listener({ element: doc, object:rcmail_ui, method:'body_mouseup', event:'mouseup' }); |
| | | $(doc).mouseup(function(e) { rcmail_ui.body_mouseup(e); }); |
| | | } |
| | | catch (e) { |
| | | // catch possible "Permission denied" error in IE |
| | |
| | | function update_quota(data) |
| | | { |
| | | percent_indicator(rcmail.gui_objects.quotadisplay, data); |
| | | |
| | | if (data.table) { |
| | | var menu = $('#quotamenu'); |
| | | |
| | | if (!menu.length) |
| | | menu = $('<div id="quotamenu" class="popupmenu">').appendTo($('body')); |
| | | |
| | | menu.html(data.table); |
| | | $('#quotaimg').css('cursor', 'pointer').off('click').on('click', function(e) { |
| | | return rcmail.command('menu-open', 'quotamenu', e.target, e); |
| | | }); |
| | | } |
| | | }; |
| | | |
| | | // percent (quota) indicator |
| | |
| | | }; |
| | | |
| | | // Optional parameters used by TinyMCE |
| | | var rcmail_editor_settings = { |
| | | skin: "default", // "default", "o2k7" |
| | | skin_variant: "" // "", "silver", "black" |
| | | }; |
| | | var rcmail_editor_settings = {}; |
| | | |
| | | var rcmail_ui; |
| | | |
| | | function rcube_init_mail_ui() |
| | | { |
| | | rcmail_ui = new rcube_mail_ui(); |
| | | rcube_event.add_listener({ object:rcmail_ui, method:'body_mouseup', event:'mouseup' }); |
| | | rcube_event.add_listener({ object:rcmail_ui, method:'body_keydown', event:'keydown' }); |
| | | |
| | | $(document.body).mouseup(function(e) { rcmail_ui.body_mouseup(e); }) |
| | | .mousedown(function(e) { rcmail_ui.body_keydown(e); }); |
| | | |
| | | rcmail.addEventListener('init', function() { |
| | | if (rcmail.env.quota_content) |
| | |
| | | rcmail.addEventListener('setquota', update_quota); |
| | | |
| | | $('iframe').load(iframe_events) |
| | | .contents().mouseup(function(e){rcmail_ui.body_mouseup(e)}); |
| | | .contents().mouseup(function(e) { rcmail_ui.body_mouseup(e); }); |
| | | |
| | | if (rcmail.env.task == 'mail') { |
| | | rcmail.addEventListener('enable-command', 'enable_command', rcmail_ui); |
| | | rcmail.addEventListener('menu-open', 'menu_open', rcmail_ui); |
| | | rcmail.addEventListener('menu-save', 'menu_save', rcmail_ui); |
| | | rcmail.addEventListener('aftersend-attachment', 'uploadmenu', rcmail_ui); |
| | | rcmail.addEventListener('aftertoggle-editor', 'resize_compose_body_ev', rcmail_ui); |
| | | rcmail.gui_object('dragmenu', 'dragmenu'); |
| | | rcmail.addEventListener('enable-command', 'enable_command', rcmail_ui) |
| | | .addEventListener('menu-open', 'menu_open', rcmail_ui) |
| | | .addEventListener('aftersend-attachment', 'uploadmenu', rcmail_ui) |
| | | .addEventListener('aftertoggle-editor', 'resize_compose_body_ev', rcmail_ui) |
| | | .gui_object('dragmenu', 'dragmenu'); |
| | | |
| | | if (rcmail.gui_objects.mailboxlist) { |
| | | rcmail.treelist.addEventListener('expand', rcube_render_mailboxlist); |
| | | rcmail.addEventListener('responseaftermark', rcube_render_mailboxlist); |
| | | rcmail.addEventListener('responseaftergetunread', rcube_render_mailboxlist); |
| | | rcmail.addEventListener('responseaftercheck-recent', rcube_render_mailboxlist); |
| | | rcmail.addEventListener('responseafterrefresh', rcube_render_mailboxlist); |
| | | rcmail.addEventListener('afterimport-messages', function(){ rcmail_ui.show_popup('uploadform', false); }); |
| | | rcmail.addEventListener('responseaftermark', rcube_render_mailboxlist) |
| | | .addEventListener('responseaftergetunread', rcube_render_mailboxlist) |
| | | .addEventListener('responseaftercheck-recent', rcube_render_mailboxlist) |
| | | .addEventListener('responseafterrefresh', rcube_render_mailboxlist) |
| | | .addEventListener('afterimport-messages', function(){ rcmail_ui.show_popup('uploadform', false); }); |
| | | } |
| | | |
| | | // fix message list header on window resize (#1490213) |
| | | if (bw.ie && rcmail.message_list) |
| | | $(window).resize(function() { |
| | | setTimeout(function() { rcmail.message_list.resize(); }, 10); |
| | | }); |
| | | |
| | | if (rcmail.env.action == 'compose') |
| | | rcmail_ui.init_compose_form(); |
| | | else if (rcmail.env.action == 'show' || rcmail.env.action == 'preview') |
| | | // add menu link for each attachment |
| | | $('#attachment-list > li[id^="attach"]').each(function() { |
| | | $(this).append($('<a class="drop"></a>').click(function() { rcmail_ui.show_attachmentmenu(this); })); |
| | | $(this).append($('<a class="drop"></a>').bind('click keypress', function(e) { |
| | | if (e.type != 'keypress' || e.which == 13) { |
| | | rcmail_ui.show_attachmentmenu(this, e); |
| | | return false; |
| | | } |
| | | })); |
| | | }); |
| | | } |
| | | else if (rcmail.env.task == 'addressbook') { |
| | | rcmail.addEventListener('afterupload-photo', function(){ rcmail_ui.show_popup('uploadform', false); }); |
| | | |
| | | rcmail.gui_object('dragmenu', 'dragmenu'); |
| | | rcmail.addEventListener('afterupload-photo', function(){ rcmail_ui.show_popup('uploadform', false); }) |
| | | .gui_object('dragmenu', 'dragmenu'); |
| | | } |
| | | else if (rcmail.env.task == 'settings') { |
| | | if (rcmail.gui_objects.subscriptionlist) |
| | | new rcmail_scroller('#folderlist-content', '#folderlist-title', '#folderlist-footer'); |
| | | if (rcmail.env.action == 'folders') { |
| | | rcmail_ui.folder_search_init($('#folder-manager')); |
| | | } |
| | | } |
| | | }); |
| | | } |