1 /**
  2  * @fileOverview ComboBox menu constroller.
  3  * @author yiminghe@gmail.com
  4  */
  5 KISSY.add("combobox/menu", function (S, Event, Menu, ComboBoxMenuRender) {
  6 
  7     var ComboBoxMenu,
  8 
  9         window = S.Env.host;
 10 
 11     /**
 12      * @name Menu
 13      * @memberOf ComboBox
 14      * @extends Menu.PopupMenu
 15      * @class
 16      * DropDown menu for comboBox input.
 17      * xclass: 'combobox-menu'.
 18      */
 19     ComboBoxMenu = Menu.PopupMenu.extend(
 20         /**
 21          * @lends ComboBox.Menu#
 22          */
 23         {
 24             /**
 25              * Bind event once after menu initialize and before menu shows.
 26              * Bind only one time!
 27              * @protected
 28              */
 29             bindUI:function () {
 30                 var self = this;
 31 
 32                 self.on("click", function (e) {
 33                     var item = e.target;
 34                     var combobox = self.get("parent");
 35                     // stop valuechange event
 36                     combobox._stopNotify = 1;
 37                     combobox._selectItem(item);
 38                     combobox.set("collapsed", true);
 39                     setTimeout(
 40                         function () {
 41                             combobox._stopNotify = 0;
 42                         },
 43                         // valuechange interval
 44                         50
 45                     );
 46                 });
 47 
 48                 Event.on(window, "resize", reAlign, self);
 49 
 50                 var el = self.get("el");
 51                 var contentEl = self.get("contentEl");
 52 
 53                 el.on("focusin", clearDismissTimer, self);
 54 
 55                 el.on("focusout", delayHide, self);
 56 
 57                 contentEl.on("mouseover", function () {
 58                     var combobox = self.get("parent");
 59                     // trigger el focus
 60                     combobox.get("input")[0].focus();
 61                     // prevent menu from hiding
 62                     clearDismissTimer.call(self);
 63                 });
 64             },
 65 
 66             _clearDismissTimer:clearDismissTimer,
 67 
 68             _delayHide:delayHide,
 69 
 70             destructor:function () {
 71                 var self = this;
 72                 Event.remove(window, "resize", reAlign, self);
 73             }
 74         }, {
 75             ATTRS:{
 76                 head:{
 77                     view:1
 78                 },
 79                 foot:{
 80                     view:1
 81                 },
 82                 xrender:{
 83                     value:ComboBoxMenuRender
 84                 }
 85             }
 86         }, {
 87             xclass:'combobox-menu',
 88             priority:40
 89         });
 90 
 91 
 92     // # ---------------------- private start
 93 
 94     function clearDismissTimer() {
 95         var self = this;
 96         if (self._dismissTimer) {
 97             clearTimeout(self._dismissTimer);
 98             self._dismissTimer = null;
 99         }
100     }
101 
102     function delayHide() {
103         var self = this;
104         self._dismissTimer = setTimeout(function () {
105             self.get("parent").set("collapsed", true);
106         }, 30);
107     }
108 
109     var reAlign = S.buffer(function () {
110         var self = this;
111         if (self.get("visible")) {
112             self.get("parent")._onWindowResize();
113         }
114     }, 50);
115 
116     // # ---------------------- private end
117 
118     return ComboBoxMenu;
119 }, {
120     requires:['event', 'menu', './menuRender']
121 });
122 /**
123  * 2012-03-26 yiminghe@gmail.com
124  *  - refer http://www.w3.org/TR/wai-aria-practices/#combobox
125  **/