1 (function($, rf) {
  2     rf.ui = rf.ui || {};
  3 
  4     var defaultOptions = {
  5         mode : "server",
  6         cssRoot : "ddm",
  7         cssClasses : {}
  8     }
  9 
 10     // constructor definition
 11 
 12     rf.ui.MenuItem = function(componentId, options) {
 13         this.options = {};
 14         $.extend(this.options, defaultOptions, options || {});
 15         $super.constructor.call(this, componentId);
 16         $.extend(this.options.cssClasses, buildCssClasses.call(this, this.options.cssRoot));
 17         this.attachToDom(componentId);
 18         this.element = $(rf.getDomElement(componentId));
 19         rf.Event.bindById(this.id, 'click', this.__clickHandler, this);
 20         rf.Event.bindById(this.id, 'mouseenter', this.select, this);
 21         rf.Event.bindById(this.id, 'mouseleave', this.unselect, this);
 22         this.selected = false;
 23     };
 24 
 25     var buildCssClasses = function(cssRoot) {
 26         var cssClasses = {
 27             itemCss : "rf-" +cssRoot+ "-itm",
 28             selectItemCss : "rf-" +cssRoot+ "-itm-sel",
 29             unselectItemCss : "rf-" +cssRoot+ "-itm-unsel",
 30             labelCss: "rf-" +cssRoot+ "-lbl"
 31         }
 32         return cssClasses;
 33     }
 34 
 35     rf.BaseComponent.extend(rf.ui.MenuItem);
 36 
 37     // define super class link
 38     var $super = rf.ui.MenuItem.$super;
 39 
 40     $.extend(rf.ui.MenuItem.prototype, (function() {
 41 
 42         return {
 43             name : "MenuItem",
 44             select : function() {
 45                 this.element.removeClass(this.options.cssClasses.unselectItemCss);
 46                 this.element.addClass(this.options.cssClasses.selectItemCss);
 47                 this.selected = true;
 48             },
 49             unselect : function() {
 50                 this.element.removeClass(this.options.cssClasses.selectItemCss);
 51                 this.element.addClass(this.options.cssClasses.unselectItemCss);
 52                 this.selected = false;
 53             },
 54             activate : function() {
 55                 this.invokeEvent('click', rf.getDomElement(this.id));
 56             },
 57 
 58             isSelected : function() {
 59                 return this.selected;
 60             },
 61 
 62             __clickHandler : function(e) {
 63                 if ($(e.target).is(":input:not(:button):not(:reset):not(:submit)")) {
 64                     return;
 65                 }
 66 
 67                 var parentMenu = this.__getParentMenu();
 68                 if (parentMenu) {
 69                     parentMenu.processItem(this.element);
 70                 }
 71                 
 72                 var item = rf.getDomElement(this.id);
 73                 var params = this.options.params;
 74                 var form = this.__getParentForm(item);
 75                 var itemId = {};
 76                 itemId[item.id] = item.id;
 77                 $.extend(itemId, params || {});
 78                 e.form = form;
 79                 e.itemId = itemId;
 80                 this.options.onClickHandler.call(this, e);
 81             },
 82 
 83             __getParentForm : function(item) {
 84                 return $($(item).parents("form").get(0));
 85             },
 86 
 87             __getParentMenu : function() {
 88                 var menu = this.element.parents('div.' + this.options.cssClasses.labelCss);
 89                 if (menu && menu.length > 0)
 90                     return rf.component(menu);
 91                 else
 92                     return null;
 93             }
 94         };
 95     })());
 96 
 97 })(RichFaces.jQuery, RichFaces);