/** * This is a base class for working with a button to launch a popover * @type {Class} */ MD.Input.Select = new Class({ Extends: MD.Input.Base ,Implements: [MD.Spin] ,options: { popover: { // some selectors are in a popover, each selector has its own popover properties, that are merged with these options destroyOnHide: true ,destroyContent: false ,className: '' ,position: 'bottomRight' ,edge: 'topRight' ,closeButton: false ,exclusive: false ,clickOutsideToClose: true } ,button: { text: 'Make Selection...' ,className: '' ,dropdown: true } ,dataFormat: { // this states where to look for values to use from the data, within the multi value label: 'text' ,value: 'value' ,title: 'label' ,selected: 'selected' } ,popoverPointToButton: true ,popoverAutoWidthToButton: true // each implementation should manage this ,autoUpdateButtonText: true ,autoClosePopover: true ,className: '' } ,initialize: function(options) { this.setOptions(options); this.options.popover.className = 'Select ' + this.options.popover.className; this.parent(this.options); } ,_setup: function() { this._buildButton(); this.parent(); } ,destroy: function() { if (this._button) { this._button.destroy(); } if (this._popover) { this._popover.destroy(); } } ,clear: function() { this.getButton().setText(this.options.button.text); return this; } ,_buildPopover: function() { if (this._popover && this._popover.html) { return this._popover; } if (this.options.popoverPointToButton) { this.options.popover.pointTo = this._button.toElement(); } this._popover = new MD.Popover(this.options.popover); this._setupPopoverEvents(); } ,_getPopoverContent: function() {return this.options.popover.content;} ,_buildButton: function() { var classNames = this._getBaseClassName(); classNames += ' '+this.options.className; classNames += ' '+this.options.button.className; if (this.options.button.dropdown) { classNames += ' Select'; classNames += ' Dropdown'; } this.options.button.className = classNames; this._button = new MD.Input.Button(this.options.button); } ,getButton: function() { if (!this._button) { this._buildButton(); } return this._button; } ,getPopover: function() { return this._popover; } ,_setupEventHandlers: function() { this.parent(); this._button.addEvent('click', function(e) { if (e) { e.stop(); } if (this._popover && this._popover.isActive()) { this._popover.hide(); } else { this._buildPopover(); if (this.options.popoverAutoWidthToButton) { var buttonDimensions = this._button.toElement().getDimensions(true); this._popover.options.minWidth = buttonDimensions.width; } this._popover.setContent(this._getPopoverContent()); this._popover.show(); } }.bind(this)); } // used to set events each time a popover is created ,_setupPopoverEvents: function() { this.getPopover().addEvent('show:after', function() { this.fireEvent('show:after', this); }.bind(this)); } ,open: function() { this._button.fireEvent('click'); return this; } ,close: function() { var popover = this.getPopover(); if (popover) { popover.hide(); } return this; } ,isOpen: function() { var popover = this.getPopover(); return popover && popover.isActive(); } ,setButtonText: function(text) { this._button.setText(text); } ,getButtonText: function() { return this._button.getText(); } ,activate: function() { this._button.activate(); return this; } ,deactivate: function() { this._button.deactivate(); return this; } ,enable: function() { this._button.enable(); return this; } ,disable: function() { this._button.disable(); return this; } ,toElement: function() { return this.getButton().toElement(); } });