'use strict'; oml.ui.mainMenu = function() { var ui = oml.user.ui, findState = oml.getFindState(ui.find), fromMenu = false, that = Ox.MainMenu({ extras: oml.readOnly ? [ oml.$ui.loadingIcon = oml.ui.loadingIcon() ] : [ oml.$ui.updateButton = oml.ui.updateButton(), oml.$ui.transferButton = oml.ui.transferButton(), oml.$ui.peersButton = oml.ui.peersButton(), oml.$ui.loadingIcon = oml.ui.loadingIcon() ], menus: [ { id: 'appMenu', title: '', items: [ { id: 'about', title: Ox._('About Open Media Library') }, {}, { id: 'faq', title: Ox._('Frequently Asked Questions') }, { id: 'terms', title: Ox._('Terms and Conditions') }, { id: 'development', title: Ox._('Software Development') }, { id: 'contact', title: Ox._('Send Feedback') }, ].concat(oml.readOnly ? [] : [ {}, { id: 'update', title: Ox._('Software Update...') }, {}, { id: 'quit', title: Ox._('Quit Open Media Library'), keyboard: 'control q' } ]) }, { id: 'userMenu', title: Ox._('User'), items: [ { id: 'preferences', title: Ox._('Preferences...'), keyboard: 'control ,' }, ].concat(oml.readOnly ? [] : [ {}, { id: 'peers', title: Ox._('Peers...') }, { id: 'transfers', title: Ox._('Transfers...') } ]) }, getListMenu(), getEditMenu(), { id: 'viewMenu', title: Ox._('View'), items: [ { id: 'section', title: Ox._('Section'), items: [ { group: 'section', min: 1, max: 1, items: [ { id: 'books', title: Ox._('Books'), checked: true }, { id: 'music', title: Ox._('Music'), disabled: true }, { id: 'movies', title: Ox._('Movies'), disabled: true } ] } ] }, {}, { id: 'listviewSubmenu', title: Ox._('Books'), items: [ { group: 'listview', min: 1, max: 1, items: [ { id: 'list', title: Ox._('List'), checked: ui.listView == 'list' }, { id: 'grid', title: Ox._('Grid'), checked: ui.listView == 'grid' } ] } ] }, { id: 'itemviewSubmenu', title: Ox._('Book'), items: [ { group: 'itemview', min: 1, max: 1, items: [ { id: 'info', title: Ox._('Info'), checked: ui.itemView == 'info', disabled: !ui.item }, { id: 'book', title: Ox._('Reader'), checked: ui.itemView == 'book', disabled: !ui.item } ] } ] }, { id: 'iconsSubmenu', title: 'Icons', items: [ { group: 'icons', min: 1, max: 1, items: [ { id: 'cover', title: Ox._('Cover'), checked: ui.icons == 'cover' }, { id: 'preview', title: Ox._('Preview'), checked: ui.icons == 'preview' } ] }, {}, { id: 'showiconinfo', title: 'Show Icon Info', checked: ui.showIconInfo }, {}, { group: 'iconinfo', min: 1, max: 1, items: [ { id: 'extension', title: Ox._('Show Extension'), checked: ui.iconInfo == 'extension', disabled: !ui.showIconInfo }, { id: 'size', title: Ox._('Show Size'), checked: ui.iconInfo == 'size', disabled: !ui.showIconInfo } ] } ] }, {}, { id: 'showsidebar', title: Ox._((ui.showSidebar ? 'Hide' : 'Show') + ' Sidebar'), keyboard: 'shift s' }, { id: 'showpeers', title: Ox._((ui.showPeers ? 'Hide' : 'Show') + ' Peers'), keyboard: 'shift p', disabled: !ui.showSidebar }, { id: 'showinfo', title: Ox._((ui.showInfo ? 'Hide' : 'Show') + ' Info'), keyboard: 'shift i', disabled: !ui.showSidebar }, { id: 'showfilters', title: Ox._((ui.showFilters ? 'Hide' : 'Show') + ' Filters'), keyboard: 'shift f', disabled: !!ui.item }, { id: 'showbrowser', title: Ox._((ui.showBrowser ? 'Hide': 'Show') + ' Browser'), keyboard: 'shift b', disabled: !ui.item }, { id: 'showannotations', title: Ox._((ui.showAnnotations ? 'Hide' : 'Show') + ' Annotations'), keyboard: 'shift a', disabled: !ui.item }, {}, { id: 'preview', title: Ox._('Show Preview'), keyboard: 'space', disabled: !!ui.item || !ui.listSelection.length }, { id: 'fullscreen', title: Ox._('Enter Fullscreen'), keyboard: 'shift alt f', disabled: !ui.item || ui.itemView == 'info' } ] }, { id: 'sortMenu', title: Ox._('Sort'), items: [ { id: 'sortitems', title: Ox._('Sort Books by'), items: [ { group: 'sort', title: Ox._('Sort Books by'), min: 1, max: 1, items: oml.config.sortKeys.map(function(key) { return { id: key.id, title: Ox._(key.title), checked: key.id == ui.listSort[0].key }; }) } ] }, { id: 'orderitems', title: Ox._('Order Books'), items: [ { group: 'order', min: 1, max: 1, items: [ { id: 'ascending', title: Ox._('Ascending'), checked: ui.listSort[0].operator == '+' }, { id: 'descending', title: Ox._('Descending'), checked: ui.listSort[0].operator == '-' } ], } ] }, { id: 'advancedsort', title: Ox._('Advanced Sort'), keyboard: 'shift control s', disabled: true }, ].concat(oml.readOnly ? [] : [ {}, { id: 'sorttitles', title: Ox._('Sort Titles...') }, { id: 'sortnames', title: Ox._('Sort Names...') } ]) }, getFindMenu(), { id: 'helpMenu', title: Ox._('Help'), items: [ { id: 'help', title: Ox._('Help...'), keyboard: 'control ?' }, {}, { id: 'documentation', title: Ox._('API Documentation...'), keyboard: 'shift control ?' } ] }, { id: 'debugMenu', title: Ox._('Debug'), items: [ { id: 'debugmode', title: Ox._(( oml.localStorage('enableDebugMode') ? 'Disable' : 'Enable' ) + ' Debug Mode'), }, { id: 'eventlogging', title: Ox._(( oml.localStorage('enableEventLogging') ? 'Disable' : 'Enable' ) + ' Event Logging'), }, {}, { id: 'changelog', title: Ox._('Change Log...') }, { id: 'errorlog', title: Ox._('Error Log...') } ] } ] }) .bindEvent({ change: function(data) { var id = data.id, value = Ox.isBoolean(data.checked) ? data.checked : data.checked[0].id; if (id == 'listview') { oml.UI.set({listView: value}); } else if (id == 'itemview') { oml.UI.set({itemView: value}); } else if (id == 'icons') { oml.UI.set({icons: value}); } else if (id == 'icons') { oml.UI.set({icons: value}); } else if (id == 'showiconinfo') { oml.UI.set({showIconInfo: value}); } else if (id == 'iconinfo') { oml.UI.set({iconInfo: value}); } else if (id == 'sort') { oml.UI.set({ listSort: [{ key: value, operator: oml.getSortOperator(value) }] }); } else if (id == 'order') { oml.UI.set({ listSort: [{ key: ui.listSort[0].key, operator: value == 'ascending' ? '+' : '-' }] }); } else if (id == 'findin') { oml.$ui.findInSelect.value(value); if (ui._findState.key == 'advanced') { // ... } else { oml.$ui.findInput.focusInput(true); } } else if (id == 'find') { if (value) { oml.$ui.findSelect.value(value); if (ui._findState.key == 'advanced') { // fixme: autocomplete function doesn't get updated oml.$ui.findInput.options({placeholder: ''}); } else { oml.$ui.findInput.focusInput(true); } } } else { Ox.print('MAIN MENU DOES NOT YET HANDLE', id, data); } }, click: function(data) { var id = data.id; if (Ox.contains([ 'about', 'faq', 'terms', 'development', 'contact', 'update' ], id)) { oml.UI.set({page: id}); } else if (id == 'quit') { oml.api.quit(); } else if (id == 'preferences') { oml.UI.set({page: 'preferences'}); } else if (id == 'peers') { oml.UI.set({page: 'peers'}); } else if (id == 'transfers') { oml.UI.set({page: 'transfers'}); } else if (id == 'alllibraries') { if (!ui._list) { oml.UI.set({item: ''}); } else { oml.UI.set({find: { conditions: [], operator: '&' }}); } } else if (id == 'thislibrary') { if (Ox.endsWith(ui._list, ':')) { oml.UI.set({item: ''}); } else { oml.UI.set({find: { conditions: [{ key: 'list', operator: '==', value: ui._list.split(':')[0] + ':' }], operator: '&' }}); } } else if (id == 'thislist') { oml.UI.set({item: ''}); } else if (Ox.contains([ 'newlist', 'newlistfromselection', 'newsmartlist', 'newsmartlistfromresults' ], id)) { oml.addList(Ox.contains(id, 'smart'), Ox.contains(id, 'from')); } else if (id == 'duplicatelist') { oml.addList(ui._list); } else if (id == 'delete') { var listData = oml.getListData(); if (listData.editable && listData.type == 'static') { oml.doHistory('delete', ui.listSelection, ui._list, function() { oml.UI.set({listSelection: []}); oml.reloadLists(); }); } } else if (id == 'deletefromlibrary') { oml.ui.deleteItemsDialog().open(); } else if (id == 'editlist') { oml.ui.listDialog().open() } else if (id == 'deletelist') { oml.ui.deleteListDialog().open(); } else if (id == 'import') { oml.UI.set({page: 'import'}); } else if (id == 'export') { oml.UI.set({page: 'export'}); } else if (id == 'selectall') { oml.$ui.list.selectAll(); } else if (id == 'selectnone') { oml.UI.set({listSelection: []}); } else if (id == 'invertselection') { oml.$ui.list.invertSelection(); } else if (id == 'download') { if (oml.readOnly) { document.location.href = '/' + ui.listSelection[0] + '/get/' } else { oml.api.addListItems({ items: ui.listSelection.filter(function(id) { return oml.$ui.list.value(id, 'mediastate') == 'unavailable'; }), list: ':' }, function(result) { Ox.Request.clearCache(); // FIXME: reload? }); } } else if (Ox.contains(['cut', 'cutadd'], id)) { var action = data.id == 'cut' ? 'copy' : 'add'; fromMenu = true; oml.clipboard[action](ui.listSelection, 'item'); oml.doHistory('cut', ui.listSelection, ui._list, function() { oml.UI.set({listSelection: []}); oml.reloadLists(); }); } else if (Ox.contains(['copy', 'copyadd'], id)) { var action = data.id == 'copy' ? 'copy' : 'add'; fromMenu = true; oml.clipboard[action](ui.listSelection, 'item'); } else if (id == 'paste') { var items = oml.clipboard.paste(); oml.doHistory('paste', items, ui._list, function() { oml.UI.set({listSelection: items}); oml.reloadLists(); }); } else if (data.id == 'clearclipboard') { oml.clipboard.clear(); } else if (data.id == 'delete') { oml.doHistory('delete', ui.listSelection, ui._list, function() { oml.UI.set({listSelection: []}); oml.reloadLists(); }); } else if (data.id == 'editmetadata') { oml.$ui.editDialog = oml.ui.editDialog().open(); } else if (data.id == 'undo') { fromMenu = true; oml.undoHistory(); } else if (data.id == 'redo') { fromMenu = true; oml.redoHistory(); } else if (id == 'clearhistory') { fromMenu = true; oml.history.clear(); } else if (id == 'showsidebar') { oml.UI.set({showSidebar: !ui.showSidebar}); } else if (id == 'showpeers') { oml.UI.set({showPeers: !ui.showPeers}); } else if (id == 'showinfo') { oml.UI.set({showInfo: !ui.showInfo}); } else if (id == 'showfilters') { oml.UI.set({showFilters: !ui.showFilters}); } else if (id == 'showbrowser') { oml.UI.set({showBrowser: !ui.showBrowser}); } else if (id == 'showannotations') { oml.UI.set({showAnnotations: !ui.showAnnotations}); } else if (id == 'preview') { that.setItemTitle( 'preview', data.title == Ox._('Show Preview') ? Ox._('Hide Preview') : Ox._('Show Preview') ); oml.$ui.list[ data.title == Ox._('Show Preview') ? 'openPreview' : 'closePreview' ](); } else if (id == 'fullscreen') { Ox.Fullscreen.enter(oml.$ui.viewer[0]); } else if (id == 'debugmode') { if (oml.localStorage('enableDebugMode')) { oml.localStorage['delete']('enableDebugMode'); } else { oml.localStorage('enableDebugMode', true); } window.location.reload(); } else if (id == 'sortnames') { (oml.$ui.namesDialog || ( oml.$ui.namesDialog = oml.ui.namesDialog() )).open(); } else if (id == 'sorttitles') { (oml.$ui.titlesDialog || ( oml.$ui.titlesDialog = oml.ui.titlesDialog() )).open(); } else if (id == 'advancedfind') { oml.$ui.findDialog = oml.ui.findDialog().open(); } else if (id == 'help') { oml.UI.set({page: 'help'}); } else if (id == 'documentation') { oml.UI.set({page: 'documentation'}); } else { Ox.print('MAIN MENU DOES NOT YET HANDLE', id); } }, oml_find: function() { that.replaceMenu('listMenu', getListMenu()); that.replaceMenu('editMenu', getEditMenu()); that.replaceMenu('findMenu', getFindMenu()); }, oml_iconinfo: function(data) { // ... }, oml_icons: function(data) { that.checkItem('viewMenu_iconsSubmenu_' + data.value); }, oml_item: function(data) { if (!!data.value != !!data.previousValue) { that[data.value ? 'enableItem' : 'disableItem']('info'); that[data.value ? 'enableItem' : 'disableItem']('book'); that[data.value ? 'disableItem' : 'enableItem']('showfilters'); that[data.value ? 'enableItem' : 'disableItem']('showbrowser'); that[data.value ? 'enableItem' : 'disableItem']('showannotations'); } }, oml_itemview: function(data) { that.checkItem('viewMenu_itemviewSubmenu_' + data.value); that[data.value == 'book' ? 'enableItem' : 'disableItem']('fullscreen'); }, oml_listselection: function(data) { that.replaceMenu('listMenu', getListMenu()); that.replaceMenu('editMenu', getEditMenu()); that[!ui.item && data.value.length ? 'enableItem' : 'disableItem']('preview'); }, oml_listsort: function(data) { that.checkItem('sortMenu_sortitems_' + data.value[0].key); that.checkItem('sortMenu_orderitems_' + ( data.value[0].operator == '+' ? 'ascending' : 'descending') ); }, oml_listview: function(data) { that.checkItem('viewMenu_listviewSubmenu_' + data.value); }, oml_showannotations: function(data) { that.setItemTitle('showannotations', Ox._((data.value ? 'Hide' : 'Show') + ' Annotations')); }, oml_showbrowser: function(data) { that.setItemTitle('showbrowser', Ox._((data.value ? 'Hide' : 'Show') + ' Browser')); }, oml_showfilters: function(data) { that.setItemTitle('showfilters', Ox._((data.value ? 'Hide' : 'Show') + ' Filters')); }, oml_showiconinfo: function(data) { var action = data.value ? 'enableItem' : 'disableItem'; that[action]('viewMenu_iconsSubmenu_extension'); that[action]('viewMenu_iconsSubmenu_size'); }, oml_showpeers: function(data) { that.setItemTitle('showpeers', Ox._((data.value ? 'Hide' : 'Show') + ' Peers')); }, oml_showinfo: function(data) { that.setItemTitle('showinfo', Ox._((data.value ? 'Hide' : 'Show') + ' Info')); }, oml_showsidebar: function(data) { that.setItemTitle('showsidebar', Ox._((data.value ? 'Hide' : 'Show') + ' Sidebar')); that[data.value ? 'enableItem' : 'disableItem']('showinfo'); that[data.value ? 'enableItem' : 'disableItem']('showpeers'); }, }); Ox.Event.bind({ key_alt_shift_f: function() { if (ui.item && ui.itemView == 'book') { Ox.Fullscreen.enter(oml.$ui.viewer.find('iframe')[0]); } }, key_backtick: function() { changeFocus(1); }, key_control_comma: function() { if (!oml.hasDialogOrScreen()) { oml.UI.set({page: 'preferences'}); } }, key_control_e: function() { if ( !oml.hasDialogOrScreen() && ui.listSelection.length && !oml.getListData().user ) { oml.$ui.editDialog = oml.ui.editDialog().open() } }, key_control_f: function() { if (!oml.hasDialogOrScreen()) { if (ui._findState.key != 'advanced') { setTimeout(function() { oml.$ui.findInput.focusInput(true); }); } else { oml.$ui.findDialog = oml.ui.findDialog().open(); } } }, key_control_m: function() { if (!oml.hasDialogOrScreen() && !that.isSelected()) { that.options('menus')[0].element.trigger('click'); } }, key_control_shift_f: function() { if (!oml.hasDialogOrScreen()) { oml.$ui.findDialog = oml.ui.findDialog().open(); } }, key_control_slash: function() { if (!oml.hasDialogOrScreen()) { oml.UI.set({page: 'documentation'}); } }, key_control_shift_w: function() { if (!oml.hasDialogOrScreen()) { oml.UI.set({ find: oml.config.user.ui.find, item: '' }); } }, key_control_shift_z: function() { oml.redoHistory(); }, key_control_slash: function() { if (!oml.hasDialogOrScreen()) { oml.UI.set({page: 'help'}); } }, key_control_w: function() { if (!oml.hasDialogOrScreen()) { oml.UI.set({item: ''}); } }, key_control_z: function() { oml.undoHistory(); }, key_shift_a: function() { ui.item && oml.UI.set({showAnnotations: !ui.showAnnotations}); }, key_shift_b: function() { ui.item && oml.UI.set({showBrowser: !ui.showBrowser}); }, key_shift_f: function() { !ui.item && oml.UI.set({showFilters: !ui.showFilters}); }, key_shift_p: function(event, name, target) { // FIXME: event triggers twice if (target.hasClass('OxFocus')) { ui.showSidebar && oml.UI.set({showPeers: !ui.showPeers}); } }, key_shift_i: function(event, name, target) { // FIXME: event triggers twice if (target.hasClass('OxFocus')) { ui.showSidebar && oml.UI.set({showInfo: !ui.showInfo}); } }, key_shift_s: function() { oml.UI.set({showSidebar: !ui.showSidebar}); } }); setTimeout(oml.updateDebugMenu); function getEditMenu() { var listData = oml.getListData(), isLocal = listData.user === '' && listData.type != 'smart', selectionItems = ui.listSelection.length, availableItems = isLocal ? selectionItems : oml.$ui.list ? ui.listSelection.filter(function(id) { return oml.$ui.list.value(id, 'mediastate') == 'available'; }).length : 0, unavailableItems = selectionItems - availableItems, selectionItemName = ( selectionItems > 1 ? Ox.formatNumber(selectionItems) + ' ' : '' ) + Ox._(selectionItems == 1 ? 'Book' : 'Books'), downloadItemName = ( selectionItems > 1 && unavailableItems ? Ox.formatNumber(unavailableItems) + ' ' + ( availableItems ? ' of ' + Ox.formatNumber(selectionItems) + ' ' : '' ) : '') + Ox._(selectionItems == 1 ? 'Book' : 'Books'), editItemName = ( selectionItems > 1 && availableItems ? Ox.formatNumber(availableItems) + ' ' + ( unavailableItems ? ' of ' + Ox.formatNumber(selectionItems) + ' ' : '' ) : '') + Ox._(selectionItems == 1 ? 'Book' : 'Books'), clipboardItems = oml.clipboard.items(), clipboardType = oml.clipboard.type(), clipboardItemName = !clipboardItems ? '' : ( clipboardItems > 1 ? Ox.formatNumber(clipboardItems) + ' ' : '' ) + Ox._(clipboardItems == 1 ? 'Book' : 'Books'), canSelect = !ui.item, canDownload = !!unavailableItems || (oml.readOnly && selectionItems == 1), canCopy = canSelect && selectionItems, canCut = canCopy && listData.editable, canPaste = listData.editable && clipboardItems, canAdd = canCopy && clipboardItems && clipboardType == 'book', canDelete = !!availableItems, canEdit = !!availableItems, historyItems = oml.history.items(), undoText = oml.history.undoText(), redoText = oml.history.redoText(); if (!isLocal && !oml.$ui.list) { oml._updateEditMenu = true; } return { id: 'editMenu', title: Ox._('Edit'), items: [].concat(oml.readOnly ? [] : [ { id: 'import', title: Ox._(oml.user.importing ? 'Importing Books...' : 'Import Books...') // FIXME }, { id: 'export', title: Ox._(oml.user.exporting ? 'Exporting Books...' : 'Export Books...') // FIXME }, {}, ]).concat([ { id: 'selectall', title: Ox._('Select All'), disabled: !canSelect, keyboard: 'control a' }, { id: 'selectnone', title: Ox._('Select None'), disabled: !canSelect, keyboard: 'shift control a' }, { id: 'invertselection', title: Ox._('Invert Selection'), disabled: !canSelect, keyboard: 'alt control a' }, {}, { id: 'download', title: Ox._('Download {0}', [downloadItemName]), disabled: !canDownload, keyboard: 'control d' }, ]).concat(oml.readOnly ? [] : [ { id: 'cut', title: Ox._('Cut {0}', [selectionItemName]), disabled: !canCut, keyboard: 'control x' }, { id: 'cutadd', title: Ox._('Cut and Add to Clipboard'), disabled: !canCut || !canAdd, keyboard: 'shift control x' }, { id: 'copy', title: Ox._('Copy {0}', [selectionItemName]), disabled: !canCopy, keyboard: 'control c' }, { id: 'copyadd', title: Ox._('Copy and Add to Clipboard'), disabled: !canCopy || !canAdd, keyboard: 'shift control c' }, { id: 'paste', title: !clipboardItems ? Ox._('Paste') : Ox._('Paste {0}', [clipboardItemName]), disabled: !canPaste, keyboard: 'control v' }, { id: 'clearclipboard', title: Ox._('Clear Clipboard'), disabled: !clipboardItems }, {}, { id: 'delete', title: Ox._('Delete {0} from List', [selectionItemName]), disabled: !canCut, keyboard: 'delete' }, { id: 'deletefromlibrary', title: Ox._('Delete {0} from Library...', [editItemName]), disabled: !canDelete, keyboard: 'control delete' }, {}, { id: 'editmetadata', title: Ox._('Edit Metadata for {0}', [editItemName]), disabled: !canEdit || ui.item, keyboard: 'control e' }, {}, { id: 'undo', title: undoText ? Ox._('Undo {0}', [undoText]) : Ox._('Undo'), disabled: !undoText, keyboard: 'control z' }, { id: 'redo', title: redoText ? Ox._('Redo {0}', [redoText]) : Ox._('Redo'), disabled: !redoText, keyboard: 'shift control z' }, { id: 'clearhistory', title: Ox._('Clear History'), disabled: !historyItems, } ]) }; } function getFindMenu() { var isLibraries = !ui._list, isLibrary = Ox.endsWith(ui._list, ':'), isList = !isLibraries && !isLibrary; return { id: 'findMenu', title: Ox._('Find'), items: [ { id: 'findlists', title: Ox._('Find In'), items: [ { group: 'findin', min: 1, max: 1, items: [ {id: 'all', title: Ox._('All Libraries'), checked: isLibraries} ].concat(!isLibraries ? [ {id: 'user', title: Ox._('This Library'), checked: isLibrary} ] : []).concat(isList ? [ {id: 'list', title: Ox._('This List'), checked: isList} ] : []) } ] }, { id: 'finditems', title: Ox._('Find'), items: [ { group: 'find', min: 1, max: 1, items: oml.config.findKeys.map(function(key) { var checked = key.id == findState.key; return { id: key.id, title: Ox._(key.title), checked: checked, keyboard: checked ? 'control f' : '' }; }) }, ] }, { id: 'advancedfind', title: Ox._('Advanced Find'), keyboard: 'shift control f' } ] }; } function getListMenu() { var isLibraries = !ui._list, isLibrary = Ox.endsWith(ui._list, ':'), isList = !isLibraries && !isLibrary, isOwnList = ui._list[0] == ':', isInbox = ui._list == ':Inbox'; if (oml.readOnly) { return { id: 'listMenu', title: Ox._('List'), items: [] }; } return { id: 'listMenu', title: Ox._('List'), items: [].concat(!isLibraries || ui.item ? [ { id: 'alllibraries', title: Ox._('All Libraries'), keyboard: 'shift control w' } ] : []).concat(isList || (isLibrary && ui.item) ? [ { id: 'thislibrary', title: Ox._('This Library'), keyboard: isLibrary ? 'control w' : '' } ] : []).concat(isList && ui.item ? [ { id: 'thislist', title: Ox._('This List'), keyboard: isList ? 'control w' : '' } ] : []).concat(!isLibraries || ui.item ? [ {}, ] : []).concat([ { id: 'newlist', title: Ox._('New List...'), keyboard: 'control n' }, { id: 'newlistfromselection', title: Ox._('New List from Selection...'), keyboard: 'shift control n', disabled: !ui.listSelection.length }, { id: 'newsmartlist', title: Ox._('New Smart List...'), keyboard: 'alt control n' }, { id: 'newsmartlistfromresults', title: Ox._('New Smart List from Results...'), keyboard: 'shift alt control n' }, {}, { id: 'duplicatelist', title: Ox._('Duplicate List...'), disabled: !isList }, { id: 'editlist', title: Ox._('Edit List...'), keyboard: 'return', disabled: !isList || !isOwnList || isInbox }, { id: 'deletelist', title: Ox._('Delete List...'), keyboard: 'delete', disabled: !isList || !isOwnList || isInbox } ]) }; } oml.clipboard.bindEvent(function(data, event) { if (Ox.contains(['add', 'copy', 'clear'], event)) { that.replaceMenu('editMenu', getEditMenu()); } if (Ox.contains(['add', 'copy', 'paste'], event) && !fromMenu) { that.highlightMenu('editMenu'); } fromMenu = false; }); oml.history.bindEvent(function(data, event) { that.replaceMenu('editMenu', getEditMenu()); if (Ox.contains(['undo', 'redo'], event) && !fromMenu) { that.highlightMenu('editMenu'); } fromMenu = false; }); that.updateElement = function(menu) { ( menu ? Ox.makeArray(menu) : ['listMenu', 'editMenu', 'findMenu'] ).forEach(function(menu) { that.replaceMenu( menu, menu == 'listMenu' ? getListMenu() : menu == 'editMenu' ? getEditMenu() : getFindMenu() ); }); return that; }; return that; };