diff options
author | thomascube <thomas@roundcube.net> | 2011-12-12 17:23:19 +0000 |
---|---|---|
committer | thomascube <thomas@roundcube.net> | 2011-12-12 17:23:19 +0000 |
commit | c7dcb30025c184c1e02a2e859b2f10f874c479f6 (patch) | |
tree | 20f35fd1dcb4f9d0372d6a8d4df044fd5f437294 /skins/larry/ui.js | |
parent | 312ad9d51e9fdc05897cf983683903e791dce6c5 (diff) |
More from Larry...
Diffstat (limited to 'skins/larry/ui.js')
-rw-r--r-- | skins/larry/ui.js | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/skins/larry/ui.js b/skins/larry/ui.js new file mode 100644 index 000000000..274b71b78 --- /dev/null +++ b/skins/larry/ui.js @@ -0,0 +1,271 @@ +/** + * Roundcube functions for default skin interface + */ + + +function rcube_mail_ui() +{ + var popups = {}; + var popupconfig = { + forwardmenu: { editable:1 }, + searchmenu: { editable:1, callback:searchmenu }, + listoptions: { editable:1 }, + dragmessagemenu: { sticky:1 }, + groupmenu: { above:1 }, + mailboxmenu: { above:1 }, + composeoptionsmenu: { editable:1, overlap:1 }, + // toggle: #1486823, #1486930 + 'attachment-form': { editable:1, above:1, toggle:!bw.ie&&!bw.linux }, + 'upload-form': { editable:1, toggle:!bw.ie&&!bw.linux } + }; + + var me = this; + + // export public methods + this.init = init; + this.show_popup = show_popup; + this.set_searchmod = set_searchmod; + + /** + * + */ + function init() + { + if (rcmail.env.task == 'mail') { + rcmail.addEventListener('menu-open', function(){ show_popup('listoptions'); }); + rcmail.addEventListener('menu-save', save_listoptions); +// rcmail.addEventListener('aftersend-attachment', 'uploadmenu', rcmail_ui); +// rcmail.addEventListener('aftertoggle-editor', 'resize_compose_body_ev', rcmail_ui); + rcmail.gui_object('message_dragmenu', 'dragmessagemenu'); + $('#mailpreviewtoggle').click(function(e){ toggle_preview_pane(e); return false }); + + if (rcmail.env.action == 'show' || rcmail.env.action == 'preview') { + init_messageview(); + } + } + + $(document.body).bind('mouseup', function(e){ + var config, obj, target = e.target; + for (var id in popups) { + obj = popups[id]; + config = popupconfig[id]; + if (obj.is(':visible') + && target.id != id+'link' + && !config.toggle + && (!config.editable || !target_overlaps(target, obj.get(0))) + && (!config.sticky || !rcube_mouse_is_over(e, obj.get(0))) + ) { + var myid = id+''; + window.setTimeout(function(){ show_popupmenu(myid, false) }, 10); + } + } + }) + .bind('keyup', function(e){ + if (e.keyCode == 27) { + for (var id in popups) { + if (popups[id].is(':visible')) + show_popup(id, false); + } + } + }); + } + + /** + * Adjust UI objects of the mail view screen + */ + function init_messageview() + { + $('#messagecontent').css('top', ($('#messageheader').outerHeight() + 10) + 'px'); + $('#message-objects div a').addClass('button'); + + if (!$('#attachment-list li').length) { + $('#messagecontent div.rightcol').hide(); + $('#messagecontent .leftcol').css('margin-right', '0'); + } + } + + /** + * Trigger for popup menus + */ + function show_popup(popup, show, config) + { + // auto-register menu object + if (config || !popupconfig[popup]) + popupconfig[popup] = $.extend(popupconfig[popup] || {}, config); + + var visible = show_popupmenu(popup, show), + config = popupconfig[popup]; + if (typeof config.callback == 'function') + config.callback(visible); + } + + /** + * Show/hide a specific popup menu + */ + function show_popupmenu(popup, show) + { + var obj = popups[popup], + config = popupconfig[popup], + ref = $('#'+popup+'link'), + above = config.above; + + if (!obj) { + obj = popups[popup] = $('#'+popup); + obj.appendTo(document.body); // move them to top for proper absolute positioning + } + + if (!obj || !obj.length) + return false; + + if (typeof show == 'undefined') + show = obj.is(':visible') ? false : true; + else if (config.toggle && show && obj.is(':visible')) + show = false; + + if (show && ref) { + var parent = ref.parent(), + win = $(window), + pos; + + if (parent.hasClass('dropbutton')) + ref = parent; + + pos = ref.offset(); + ref.offsetHeight = ref.outerHeight(); + if (!above && pos.top + ref.offsetHeight + obj.height() > win.height()) + above = true; + if (pos.left + obj.width() > win.width()) + pos.left = win.width() - obj.width() - 12; + + obj.css({ left:pos.left, top:(pos.top + (above ? -obj.height() : ref.offsetHeight)) }); + } + + obj[show?'show':'hide'](); + + // hide drop-down elements on buggy browsers + if (bw.ie6 && config.overlap) { + $('select').css('visibility', show?'hidden':'inherit'); + $('select', obj).css('visibility', 'inherit'); + } + + return show; + } + + /** + * + */ + function target_overlaps(target, elem) + { + while (target.parentNode) { + if (target.parentNode == elem) + return true; + target = target.parentNode; + } + return false; + } + + + function toggle_preview_pane(e) + { + var button = $(e.target); + var visible = !button.hasClass('enabled'); + + button.removeClass().addClass(visible ? 'enabled' : 'closed'); + +// rcmail.command('save-pref', { name:'preview_pane', value:(visible?1:0) }); + } + + + /**** popup callbacks ****/ + + function searchmenu(show) + { + if (show && rcmail.env.search_mods) { + var n, all, + obj = popups['searchmenu'], + list = $('input:checkbox[name="s_mods[]"]', obj), + mbox = rcmail.env.mailbox, + mods = rcmail.env.search_mods; + + if (rcmail.env.task == 'mail') { + mods = mods[mbox] ? mods[mbox] : mods['*']; + all = 'text'; + } + else { + all = '*'; + } + + if (mods[all]) + list.map(function() { + this.checked = true; + this.disabled = this.value != all; + }); + else { + list.prop('disabled', false).prop('checked', false); + for (n in mods) + $('#s_mod_' + n).prop('checked', true); + } + } + } + + + function save_listoptions() + { + show_popupmenu('listoptions', false); + + var sort = $('input[name="sort_col"]:checked').val(), + ord = $('input[name="sort_ord"]:checked').val(), + thread = $('input[name="view"]:checked').val(), + cols = $('input[name="list_col[]"]:checked') + .map(function(){ return this.value; }).get(); + + rcmail.set_list_options(cols, sort, ord, thread == 'thread' ? 1 : 0); + } + + + function set_searchmod(elem) + { + var all, m, task = rcmail.env.task, + mods = rcmail.env.search_mods, + mbox = rcmail.env.mailbox; + + if (!mods) + mods = {}; + + if (task == 'mail') { + if (!mods[mbox]) + mods[mbox] = rcube_clone_object(mods['*']); + m = mods[mbox]; + all = 'text'; + } + else { //addressbook + m = mods; + all = '*'; + } + + if (!elem.checked) + delete(m[elem.value]); + else + m[elem.value] = 1; + + // mark all fields + if (elem.value != all) + 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; + } + }); + } +} + |