// vim: et:ts=4:sw=4:sts=4:ft=javascript 'use strict'; /*@ Ox.MainMenu MainMenu Object () -> MainMenu Object (options) -> MainMenu Object (options, self) -> MainMenu Object options Options object extras extra menus menus submenus size can be small, medium, large self shared private variable @*/ Ox.MainMenu = function(options, self) { self = self || {}; var that = Ox.Bar({}, self) .defaults({ extras: [], menus: [], size: 'medium' }) .options(options || {}) .addClass('OxMainMenu Ox' + Ox.toTitleCase(self.options.size)) // fixme: bar should accept small/medium/large ... like toolbar .click(click) .mousemove(mousemove); self.focused = false; self.selected = -1; that.menus = []; that.titles = []; that.layer = $('
').addClass('OxLayer'); self.options.menus.forEach(function(menu, position) { addMenu(menu, position); }); if (self.options.extras.length) { that.extras = $('
') .addClass('OxExtras') .appendTo(that.$element); self.options.extras.forEach(function(extra) { extra.css({ float: 'left' // fixme: need class! }).appendTo(that.extras); }); } function addMenu(menu, position) { that.titles[position] = $('
') .addClass('OxTitle') .html(menu.title) .data('position', position); if (position == 0) { if (that.titles.length == 1) { that.titles[position].appendTo(that.$element); } else { that.titles[position].insertBefore(that.titles[1]); } } else { that.titles[position].insertAfter(that.titles[position - 1]) } that.menus[position] = Ox.Menu(Ox.extend(menu, { element: that.titles[position], mainmenu: that, size: self.options.size })) .bindEvent({ hide: onHideMenu }); } function click(event) { var $target = $(event.target), position = typeof $target.data('position') != 'undefined' ? $target.data('position') : -1; clickTitle(position); } function clickTitle(position) { var selected = self.selected; if (self.selected > -1) { that.menus[self.selected].hideMenu(); } if (position > -1) { if (position != selected) { self.focused = true; self.selected = position; that.titles[self.selected].addClass('OxSelected'); that.menus[self.selected].showMenu(); } } } function mousemove(event) { var $target = $(event.target), focused, position = typeof $target.data('position') != 'undefined' ? $target.data('position') : -1; if (self.focused && position != self.selected) { if (position > -1) { clickTitle(position); } else { focused = self.focused; that.menus[self.selected].hideMenu(); self.focused = focused; } } } function onHideMenu() { if (self.selected > -1) { that.titles[self.selected].removeClass('OxSelected'); self.selected = -1; } self.focused = false; } function removeMenu(position) { that.titles[position].remove(); that.menus[position].remove(); } self.setOption = function(key, value) { }; that.addMenuAfter = function(id) { }; that.addMenuBefore = function(id) { }; /*@ checkItem checkItem @*/ that.checkItem = function(id) { var ids = id.split('_'), item = that.getItem(id); if (item) { if (item.options('group')) { item.options('menu').checkItem(ids[ids.length - 1]); } else { item.options({checked: true}); } } return that; }; /*@ disableItem disableItem @*/ that.disableItem = function(id) { var item = that.getItem(id); item && item.options({disabled: true}); return that; }; /*@ enableItem enableItem @*/ that.enableItem = function(id) { var item = that.getItem(id); item && item.options({disabled: false}); return that; }; /*@ getItem getItem @*/ that.getItem = function(id) { var ids = id.split('_'), item; if (ids.length == 1) { Ox.forEach(that.menus, function(menu) { item = menu.getItem(id); return !item; }); } else { item = that.getMenu(ids.shift()).getItem(ids.join('_')); } Ox.Log('Menu', 'getItem', id, item); return item; }; /*@ getMenu getMenu @*/ that.getMenu = function(id) { var ids = id.split('_'), menu; if (ids.length == 1) { Ox.forEach(that.menus, function(v) { if (v.options('id') == id) { menu = v; return false; } }); } else { menu = that.getMenu(ids.shift()).getSubmenu(ids.join('_')); } return menu; }; that.removeMenu = function() { }; that.replaceMenu = function(id, menu) { var position = Ox.getIndexById(self.options.menus, id); self.options.menus[position] = menu; removeMenu(position); addMenu(menu, position); }; /*@ selectNextMenu selectNextMenu @*/ that.selectNextMenu = function() { if (self.selected < self.options.menus.length - 1) { clickTitle(self.selected + 1); } return that; }; /*@ selectPreviousMenu selectPreviousMenu @*/ that.selectPreviousMenu = function() { if (self.selected) { clickTitle(self.selected - 1); } return that; }; that.setItemTitle = function(id, title) { var item = that.getItem(id); item && item.options({title: title}); return that; }; /*@ uncheckItem uncheckItem @*/ that.uncheckItem = function(id) { var item = that.getItem(id); item && item.options({checked: false}); return that; }; return that; };