src/cm/media/js/lib/yui/yui3-3.15.0/build/widget-buttons/widget-buttons.js
author gibus
Mon, 10 Mar 2014 15:19:48 +0100
changeset 602 e16a97fb364a
permissions -rw-r--r--
Use YUI 3.15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('widget-buttons', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
Provides header/body/footer button support for Widgets that use the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
`WidgetStdMod` extension.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
@module widget-buttons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
@since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
var YArray  = Y.Array,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
    YLang   = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
    YObject = Y.Object,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
    ButtonPlugin = Y.Plugin.Button,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
    Widget       = Y.Widget,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
    WidgetStdMod = Y.WidgetStdMod,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
    getClassName = Y.ClassNameManager.getClassName,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
    isArray      = YLang.isArray,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
    isNumber     = YLang.isNumber,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
    isString     = YLang.isString,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
    isValue      = YLang.isValue;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
// Utility to determine if an object is a Y.Node instance, even if it was
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
// created in a different YUI sandbox.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
function isNode(node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
    return !!node.getDOMNode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
Provides header/body/footer button support for Widgets that use the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
`WidgetStdMod` extension.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
This Widget extension makes it easy to declaratively configure a widget's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
buttons. It adds a `buttons` attribute along with button- accessor and mutator
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
methods. All button nodes have the `Y.Plugin.Button` plugin applied.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
This extension also includes `HTML_PARSER` support to seed a widget's `buttons`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
from those which already exist in its DOM.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
@class WidgetButtons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
@extensionfor Widget
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
@since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
function WidgetButtons() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
    // Has to be setup before the `initializer()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
    this._buttonsHandles = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
WidgetButtons.ATTRS = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
    Collection containing a widget's buttons.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
    The collection is an Object which contains an Array of `Y.Node`s for every
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
    `WidgetStdMod` section (header, body, footer) which has one or more buttons.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
    All button nodes have the `Y.Plugin.Button` plugin applied.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
    This attribute is very flexible in the values it will accept. `buttons` can
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
    be specified as a single Array, or an Object of Arrays keyed to a particular
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
    section.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
    All specified values will be normalized to this type of structure:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
        {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
            header: [...],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
            footer: [...]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
    A button can be specified as a `Y.Node`, config Object, or String name for a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
    predefined button on the `BUTTONS` prototype property. When a config Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
    is provided, it will be merged with any defaults provided by a button with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
    the same `name` defined on the `BUTTONS` property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
    See `addButton()` for the detailed list of configuration properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
    For convenience, a widget's buttons will always persist and remain rendered
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
    after header/body/footer content updates. Buttons should be removed by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
    updating this attribute or using the `removeButton()` method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
    @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
        {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
            // Uses predefined "close" button by string name.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
            header: ['close'],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
            footer: [
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
                {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
                    name  : 'cancel',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
                    label : 'Cancel',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
                    action: 'hide'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
                },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
                {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
                    name     : 'okay',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
                    label    : 'Okay',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
                    isDefault: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
                    events: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
                        click: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
                            this.hide();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
            ]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
    @attribute buttons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
    @default {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
    @since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
    buttons: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
        getter: '_getButtons',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
        setter: '_setButtons',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
        value : {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
    The current default button as configured through this widget's `buttons`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
    A button can be configured as the default button in the following ways:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
      * As a config Object with an `isDefault` property:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
        `{label: 'Okay', isDefault: true}`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
      * As a Node with a `data-default` attribute:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
        `<button data-default="true">Okay</button>`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
    This attribute is **read-only**; anytime there are changes to this widget's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
    `buttons`, the `defaultButton` will be updated if needed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
    **Note:** If two or more buttons are configured to be the default button,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
    the last one wins.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
    @attribute defaultButton
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
    @type Node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
    @default null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
    @readOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
    defaultButton: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
        readOnly: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
        value   : null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
CSS classes used by `WidgetButtons`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
@property CLASS_NAMES
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
@type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
WidgetButtons.CLASS_NAMES = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
    button : getClassName('button'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
    buttons: Widget.getClassName('buttons'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
    primary: getClassName('button', 'primary')
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
WidgetButtons.HTML_PARSER = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
    buttons: function (srcNode) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
        return this._parseButtons(srcNode);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
The list of button configuration properties which are specific to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
`WidgetButtons` and should not be passed to `Y.Plugin.Button.createNode()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
@property NON_BUTTON_NODE_CFG
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
@type Array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
WidgetButtons.NON_BUTTON_NODE_CFG = [
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
    'action', 'classNames', 'context', 'events', 'isDefault', 'section'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
WidgetButtons.prototype = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
    // -- Public Properties ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
    Collection of predefined buttons mapped by name -> config.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
    These button configurations will serve as defaults for any button added to a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
    widget's buttons which have the same `name`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
    See `addButton()` for a list of possible configuration values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
    @property BUTTONS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
    @default {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
    @see addButton()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
    BUTTONS: {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
    The HTML template to use when creating the node which wraps all buttons of a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
    section. By default it will have the CSS class: "yui3-widget-buttons".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
    @property BUTTONS_TEMPLATE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
    @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
    @default "<span />"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
    BUTTONS_TEMPLATE: '<span />',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
    The default section to render buttons in when no section is specified.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
    @property DEFAULT_BUTTONS_SECTION
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
    @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
    @default Y.WidgetStdMod.FOOTER
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
    DEFAULT_BUTTONS_SECTION: WidgetStdMod.FOOTER,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
    // -- Protected Properties -------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
    A map of button node `_yuid` -> event-handle for all button nodes which were
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
    created by this widget.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
    @property _buttonsHandles
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
    A map of this widget's `buttons`, both name -> button and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
    section:name -> button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
    @property _buttonsMap
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
    Internal reference to this widget's default button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
    @property _defaultButton
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
    @type Node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
    // -- Lifecycle Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
    initializer: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
        // Require `Y.WidgetStdMod`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
        if (!this._stdModNode) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
            Y.error('WidgetStdMod must be added to a Widget before WidgetButtons.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
        // Creates button mappings and sets the `defaultButton`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
        this._mapButtons(this.get('buttons'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
        this._updateDefaultButton();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
        // Bound with `Y.bind()` to make more extensible.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
        this.after({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
            buttonsChange      : Y.bind('_afterButtonsChange', this),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
            defaultButtonChange: Y.bind('_afterDefaultButtonChange', this)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
        Y.after(this._bindUIButtons, this, 'bindUI');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
        Y.after(this._syncUIButtons, this, 'syncUI');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
    destructor: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
        // Detach all event subscriptions this widget added to its `buttons`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
        YObject.each(this._buttonsHandles, function (handle) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
            handle.detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
        delete this._buttonsHandles;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
        delete this._buttonsMap;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
        delete this._defaultButton;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
    // -- Public Methods -------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
    Adds a button to this widget.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
    The new button node will have the `Y.Plugin.Button` plugin applied, be added
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
    to this widget's `buttons`, and rendered in the specified `section` at the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
    specified `index` (or end of the section when no `index` is provided). If
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
    the section does not exist, it will be created.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
    This fires the `buttonsChange` event and adds the following properties to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
    the event facade:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
      * `button`: The button node or config object to add.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
      * `section`: The `WidgetStdMod` section (header/body/footer) where the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
        button will be added.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
      * `index`: The index at which the button will be in the section.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
      * `src`: "add"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
    **Note:** The `index` argument will be passed to the Array `splice()`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
    method, therefore a negative value will insert the `button` that many items
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
    from the end. The `index` property on the `buttonsChange` event facade is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
    the index at which the `button` was added.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
    @method addButton
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
    @param {Node|Object|String} button The button to add. This can be a `Y.Node`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
        instance, config Object, or String name for a predefined button on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
        `BUTTONS` prototype property. When a config Object is provided, it will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
        be merged with any defaults provided by any `srcNode` and/or a button
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
        with the same `name` defined on the `BUTTONS` property. The following
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
        are the possible configuration properties beyond what Node plugins
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
        accept by default:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
      @param {Function|String} [button.action] The default handler that should
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
        be called when the button is clicked. A String name of a Function that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
        exists on the `context` object can also be provided. **Note:**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
        Specifying a set of `events` will override this setting.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
      @param {String|String[]} [button.classNames] Additional CSS classes to add
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
        to the button node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
      @param {Object} [button.context=this] Context which any `events` or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
        `action` should be called with. Defaults to `this`, the widget.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
        **Note:** `e.target` will access the button node in the event handlers.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
      @param {Boolean} [button.disabled=false] Whether the button should be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
        disabled.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
      @param {String|Object} [button.events="click"] Event name, or set of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
        events and handlers to bind to the button node. **See:** `Y.Node.on()`,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
        this value is passed as the first argument to `on()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
      @param {Boolean} [button.isDefault=false] Whether the button is the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
        default button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
      @param {String} [button.label] The visible text/value displayed in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
        button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
      @param {String} [button.name] A name which can later be used to reference
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
        this button. If a button is defined on the `BUTTONS` property with this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
        same name, its configuration properties will be merged in as defaults.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
      @param {String} [button.section] The `WidgetStdMod` section (header, body,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
        footer) where the button should be added.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
      @param {Node} [button.srcNode] An existing Node to use for the button,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
        default values will be seeded from this node, but are overriden by any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
        values specified in the config object. By default a new &lt;button&gt;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
        node will be created.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
      @param {String} [button.template] A specific template to use when creating
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
        a new button node (e.g. "&lt;a /&gt;"). **Note:** Specifying a `srcNode`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
        will overide this.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
    @param {String} [section="footer"] The `WidgetStdMod` section
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
        (header/body/footer) where the button should be added. This takes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
        precedence over the `button.section` configuration property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
    @param {Number} [index] The index at which the button should be inserted. If
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
        not specified, the button will be added to the end of the section. This
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
        value is passed to the Array `splice()` method, therefore a negative
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
        value will insert the `button` that many items from the end.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
    @see Plugin.Button.createNode()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
    @since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
    addButton: function (button, section, index) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
        var buttons = this.get('buttons'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
            sectionButtons, atIndex;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
        // Makes sure we have the full config object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
        if (!isNode(button)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
            button = this._mergeButtonConfig(button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
            section || (section = button.section);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
        section || (section = this.DEFAULT_BUTTONS_SECTION);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
        sectionButtons = buttons[section] || (buttons[section] = []);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
        isNumber(index) || (index = sectionButtons.length);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
        // Insert new button at the correct position.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
        sectionButtons.splice(index, 0, button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
        // Determine the index at which the `button` now exists in the array.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
        atIndex = YArray.indexOf(sectionButtons, button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
        this.set('buttons', buttons, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
            button : button,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
            section: section,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
            index  : atIndex,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
            src    : 'add'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
    Returns a button node from this widget's `buttons`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
    @method getButton
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
    @param {Number|String} name The string name or index of the button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
    @param {String} [section="footer"] The `WidgetStdMod` section
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
        (header/body/footer) where the button exists. Only applicable when
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
        looking for a button by numerical index, or by name but scoped to a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
        particular section.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
    @return {Node} The button node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
    getButton: function (name, section) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
        if (!isValue(name)) { return; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
        var map = this._buttonsMap,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
            buttons;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
        section || (section = this.DEFAULT_BUTTONS_SECTION);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
        // Supports `getButton(1, 'header')` signature.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
        if (isNumber(name)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
            buttons = this.get('buttons');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
            return buttons[section] && buttons[section][name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
        // Looks up button by name or section:name.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
        return arguments.length > 1 ? map[section + ':' + name] : map[name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
    Removes a button from this widget.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
    The button will be removed from this widget's `buttons` and its DOM. Any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
    event subscriptions on the button which were created by this widget will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
    detached. If the content section becomes empty after removing the button
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
    node, then the section will also be removed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
    This fires the `buttonsChange` event and adds the following properties to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
    the event facade:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
      * `button`: The button node to remove.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
      * `section`: The `WidgetStdMod` section (header/body/footer) where the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
        button should be removed from.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
      * `index`: The index at which the button exists in the section.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
      * `src`: "remove"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
    @method removeButton
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
    @param {Node|Number|String} button The button to remove. This can be a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
        `Y.Node` instance, index, or String name of a button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
    @param {String} [section="footer"] The `WidgetStdMod` section
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
        (header/body/footer) where the button exists. Only applicable when
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
        removing a button by numerical index, or by name but scoped to a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
        particular section.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
    removeButton: function (button, section) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
        if (!isValue(button)) { return this; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
        var buttons = this.get('buttons'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
            index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
        // Shortcut if `button` is already an index which is needed for slicing.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
        if (isNumber(button)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
            section || (section = this.DEFAULT_BUTTONS_SECTION);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
            index  = button;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
            button = buttons[section][index];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
            // Supports `button` being the string name.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
            if (isString(button)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
                // `getButton()` is called this way because its behavior is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
                // different based on the number of arguments.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
                button = this.getButton.apply(this, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
            // Determines the `section` and `index` at which the button exists.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
            YObject.some(buttons, function (sectionButtons, currentSection) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
                index = YArray.indexOf(sectionButtons, button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
                if (index > -1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
                    section = currentSection;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
                    return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
        // Button was found at an appropriate index.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
        if (button && index > -1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
            // Remove button from `section` array.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
            buttons[section].splice(index, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
            this.set('buttons', buttons, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
                button : button,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
                section: section,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
                index  : index,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
                src    : 'remove'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
    // -- Protected Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
    Binds UI event listeners. This method is inserted via AOP, and will execute
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   500
    after `bindUI()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   501
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
    @method _bindUIButtons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
    @since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
    _bindUIButtons: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
        // Event handlers are bound with `bind()` to make them more extensible.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
        var afterContentChange = Y.bind('_afterContentChangeButtons', this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
        this.after({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
            visibleChange      : Y.bind('_afterVisibleChangeButtons', this),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
            headerContentChange: afterContentChange,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
            bodyContentChange  : afterContentChange,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
            footerContentChange: afterContentChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
    Returns a button node based on the specified `button` node or configuration.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
    The button node will either be created via `Y.Plugin.Button.createNode()`,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
    or when `button` is specified as a node already, it will by `plug()`ed with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
    `Y.Plugin.Button`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
    @method _createButton
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
    @param {Node|Object} button Button node or configuration object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
    @return {Node} The button node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
    _createButton: function (button) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
        var config, buttonConfig, nonButtonNodeCfg,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
            i, len, action, context, handle;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
        // Makes sure the exiting `Y.Node` instance is from this YUI sandbox and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
        // is plugged with `Y.Plugin.Button`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
        if (isNode(button)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
            return Y.one(button.getDOMNode()).plug(ButtonPlugin);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
        // Merge `button` config with defaults and back-compat.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
        config = Y.merge({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
            context: this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
            events : 'click',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
            label  : button.value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
        }, button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
        buttonConfig     = Y.merge(config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
        nonButtonNodeCfg = WidgetButtons.NON_BUTTON_NODE_CFG;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
        // Remove all non-button Node config props.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
        for (i = 0, len = nonButtonNodeCfg.length; i < len; i += 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
            delete buttonConfig[nonButtonNodeCfg[i]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
        // Create the button node using the button Node-only config.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
        button = ButtonPlugin.createNode(buttonConfig);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   559
        context = config.context;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   560
        action  = config.action;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   561
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
        // Supports `action` as a String name of a Function on the `context`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
        // object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
        if (isString(action)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
            action = Y.bind(action, context);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
        // Supports all types of crazy configs for event subscriptions and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   569
        // stores a reference to the returned `EventHandle`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   570
        handle = button.on(config.events, action, context);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   571
        this._buttonsHandles[Y.stamp(button, true)] = handle;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   572
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   573
        // Tags the button with the configured `name` and `isDefault` settings.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   574
        button.setData('name', this._getButtonName(config));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   575
        button.setData('default', this._getButtonDefault(config));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   576
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   577
        // Add any CSS classnames to the button node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   578
        YArray.each(YArray(config.classNames), button.addClass, button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   579
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   580
        return button;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   581
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   582
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   583
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   584
    Returns the buttons container for the specified `section`, passing a truthy
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   585
    value for `create` will create the node if it does not already exist.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   586
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   587
    **Note:** It is up to the caller to properly insert the returned container
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   588
    node into the content section.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   589
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   590
    @method _getButtonContainer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   591
    @param {String} section The `WidgetStdMod` section (header/body/footer).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   592
    @param {Boolean} create Whether the buttons container should be created if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   593
        it does not already exist.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   594
    @return {Node} The buttons container node for the specified `section`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   595
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   596
    @see BUTTONS_TEMPLATE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   597
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   598
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   599
    _getButtonContainer: function (section, create) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   600
        var sectionClassName = WidgetStdMod.SECTION_CLASS_NAMES[section],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   601
            buttonsClassName = WidgetButtons.CLASS_NAMES.buttons,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   602
            contentBox       = this.get('contentBox'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   603
            containerSelector, container;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   604
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   605
        // Search for an existing buttons container within the section.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   606
        containerSelector = '.' + sectionClassName + ' .' + buttonsClassName;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   607
        container         = contentBox.one(containerSelector);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   608
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   609
        // Create the `container` if it doesn't already exist.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   610
        if (!container && create) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   611
            container = Y.Node.create(this.BUTTONS_TEMPLATE);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   612
            container.addClass(buttonsClassName);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   613
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   614
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   615
        return container;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   616
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   617
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   618
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   619
    Returns whether or not the specified `button` is configured to be the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   620
    default button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   621
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   622
    When a button node is specified, the button's `getData()` method will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   623
    used to determine if the button is configured to be the default. When a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   624
    button config object is specified, the `isDefault` prop will determine
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   625
    whether the button is the default.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   626
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   627
    **Note:** `<button data-default="true"></button>` is supported via the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   628
    `button.getData('default')` API call.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   629
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   630
    @method _getButtonDefault
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   631
    @param {Node|Object} button The button node or configuration object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   632
    @return {Boolean} Whether the button is configured to be the default button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   633
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   634
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   635
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   636
    _getButtonDefault: function (button) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   637
        var isDefault = isNode(button) ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   638
                button.getData('default') : button.isDefault;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   639
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   640
        if (isString(isDefault)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   641
            return isDefault.toLowerCase() === 'true';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   642
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   643
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   644
        return !!isDefault;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   645
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   646
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   647
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   648
    Returns the name of the specified `button`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   649
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   650
    When a button node is specified, the button's `getData('name')` method is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   651
    preferred, but will fallback to `get('name')`, and the result will determine
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   652
    the button's name. When a button config object is specified, the `name` prop
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   653
    will determine the button's name.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   654
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   655
    **Note:** `<button data-name="foo"></button>` is supported via the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   656
    `button.getData('name')` API call.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   657
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   658
    @method _getButtonName
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   659
    @param {Node|Object} button The button node or configuration object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   660
    @return {String} The name of the button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   661
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   662
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   663
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   664
    _getButtonName: function (button) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   665
        var name;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   666
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   667
        if (isNode(button)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   668
            name = button.getData('name') || button.get('name');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   669
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   670
            name = button && (button.name || button.type);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   671
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   672
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   673
        return name;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   674
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   675
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   676
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   677
    Getter for the `buttons` attribute. A copy of the `buttons` object is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   678
    returned so the stored state cannot be modified by the callers of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   679
    `get('buttons')`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   680
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   681
    This will recreate a copy of the `buttons` object, and each section array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   682
    (the button nodes are *not* copied/cloned.)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   683
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   684
    @method _getButtons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   685
    @param {Object} buttons The widget's current `buttons` state.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   686
    @return {Object} A copy of the widget's current `buttons` state.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   687
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   688
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   689
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   690
    _getButtons: function (buttons) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   691
        var buttonsCopy = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   692
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   693
        // Creates a new copy of the `buttons` object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   694
        YObject.each(buttons, function (sectionButtons, section) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   695
            // Creates of copy of the array of button nodes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   696
            buttonsCopy[section] = sectionButtons.concat();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   697
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   698
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   699
        return buttonsCopy;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   700
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   701
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   702
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   703
    Adds the specified `button` to the buttons map (both name -> button and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   704
    section:name -> button), and sets the button as the default if it is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   705
    configured as the default button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   706
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   707
    **Note:** If two or more buttons are configured with the same `name` and/or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   708
    configured to be the default button, the last one wins.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   709
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   710
    @method _mapButton
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   711
    @param {Node} button The button node to map.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   712
    @param {String} section The `WidgetStdMod` section (header/body/footer).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   713
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   714
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   715
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   716
    _mapButton: function (button, section) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   717
        var map       = this._buttonsMap,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   718
            name      = this._getButtonName(button),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   719
            isDefault = this._getButtonDefault(button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   720
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   721
        if (name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   722
            // name -> button
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   723
            map[name] = button;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   724
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   725
            // section:name -> button
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   726
            map[section + ':' + name] = button;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   727
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   728
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   729
        isDefault && (this._defaultButton = button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   730
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   731
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   732
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   733
    Adds the specified `buttons` to the buttons map (both name -> button and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   734
    section:name -> button), and set the a button as the default if one is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   735
    configured as the default button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   736
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   737
    **Note:** This will clear all previous button mappings and null-out any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   738
    previous default button! If two or more buttons are configured with the same
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   739
    `name` and/or configured to be the default button, the last one wins.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   740
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   741
    @method _mapButtons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   742
    @param {Node[]} buttons The button nodes to map.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   743
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   744
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   745
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   746
    _mapButtons: function (buttons) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   747
        this._buttonsMap    = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   748
        this._defaultButton = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   749
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   750
        YObject.each(buttons, function (sectionButtons, section) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   751
            var i, len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   752
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   753
            for (i = 0, len = sectionButtons.length; i < len; i += 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   754
                this._mapButton(sectionButtons[i], section);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   755
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   756
        }, this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   757
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   758
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   759
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   760
    Returns a copy of the specified `config` object merged with any defaults
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   761
    provided by a `srcNode` and/or a predefined configuration for a button
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   762
    with the same `name` on the `BUTTONS` property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   763
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   764
    @method _mergeButtonConfig
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   765
    @param {Object|String} config Button configuration object, or string name.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   766
    @return {Object} A copy of the button configuration object merged with any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   767
        defaults.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   768
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   769
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   770
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   771
    _mergeButtonConfig: function (config) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   772
        var buttonConfig, defConfig, name, button, tagName, label;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   773
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   774
        // Makes sure `config` is an Object and a copy of the specified value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   775
        config = isString(config) ? {name: config} : Y.merge(config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   776
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   777
        // Seeds default values from the button node, if there is one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   778
        if (config.srcNode) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   779
            button  = config.srcNode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   780
            tagName = button.get('tagName').toLowerCase();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   781
            label   = button.get(tagName === 'input' ? 'value' : 'text');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   782
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   783
            // Makes sure the button's current values override any defaults.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   784
            buttonConfig = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   785
                disabled : !!button.get('disabled'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   786
                isDefault: this._getButtonDefault(button),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   787
                name     : this._getButtonName(button)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   788
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   789
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   790
            // Label should only be considered when not an empty string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   791
            label && (buttonConfig.label = label);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   792
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   793
            // Merge `config` with `buttonConfig` values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   794
            Y.mix(config, buttonConfig, false, null, 0, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   795
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   796
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   797
        name      = this._getButtonName(config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   798
        defConfig = this.BUTTONS && this.BUTTONS[name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   799
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   800
        // Merge `config` with predefined default values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   801
        if (defConfig) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   802
            Y.mix(config, defConfig, false, null, 0, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   803
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   804
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   805
        return config;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   806
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   807
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   808
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   809
    `HTML_PARSER` implementation for the `buttons` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   810
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   811
    **Note:** To determine a button node's name its `data-name` and `name`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   812
    attributes are examined. Whether the button should be the default is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   813
    determined by its `data-default` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   814
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   815
    @method _parseButtons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   816
    @param {Node} srcNode This widget's srcNode to search for buttons.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   817
    @return {null|Object} `buttons` Config object parsed from this widget's DOM.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   818
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   819
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   820
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   821
    _parseButtons: function (srcNode) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   822
        var buttonSelector = '.' + WidgetButtons.CLASS_NAMES.button,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   823
            sections       = ['header', 'body', 'footer'],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   824
            buttonsConfig  = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   825
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   826
        YArray.each(sections, function (section) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   827
            var container = this._getButtonContainer(section),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   828
                buttons   = container && container.all(buttonSelector),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   829
                sectionButtons;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   830
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   831
            if (!buttons || buttons.isEmpty()) { return; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   832
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   833
            sectionButtons = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   834
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   835
            // Creates a button config object for every button node found and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   836
            // adds it to the section. This way each button configuration can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   837
            // merged with any defaults provided by predefined `BUTTONS`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   838
            buttons.each(function (button) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   839
                sectionButtons.push({srcNode: button});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   840
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   841
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   842
            buttonsConfig || (buttonsConfig = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   843
            buttonsConfig[section] = sectionButtons;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   844
        }, this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   845
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   846
        return buttonsConfig;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   847
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   848
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   849
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   850
    Setter for the `buttons` attribute. This processes the specified `config`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   851
    and returns a new `buttons` object which is stored as the new state; leaving
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   852
    the original, specified `config` unmodified.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   853
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   854
    The button nodes will either be created via `Y.Plugin.Button.createNode()`,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   855
    or when a button is already a Node already, it will by `plug()`ed with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   856
    `Y.Plugin.Button`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   857
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   858
    @method _setButtons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   859
    @param {Array|Object} config The `buttons` configuration to process.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   860
    @return {Object} The processed `buttons` object which represents the new
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   861
        state.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   862
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   863
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   864
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   865
    _setButtons: function (config) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   866
        var defSection = this.DEFAULT_BUTTONS_SECTION,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   867
            buttons    = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   868
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   869
        function processButtons(buttonConfigs, currentSection) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   870
            if (!isArray(buttonConfigs)) { return; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   871
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   872
            var i, len, button, section;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   873
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   874
            for (i = 0, len = buttonConfigs.length; i < len; i += 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   875
                button  = buttonConfigs[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   876
                section = currentSection;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   877
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   878
                if (!isNode(button)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   879
                    button = this._mergeButtonConfig(button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   880
                    section || (section = button.section);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   881
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   882
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   883
                // Always passes through `_createButton()` to make sure the node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   884
                // is decorated as a button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   885
                button = this._createButton(button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   886
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   887
                // Use provided `section` or fallback to the default section.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   888
                section || (section = defSection);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   889
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   890
                // Add button to the array of buttons for the specified section.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   891
                (buttons[section] || (buttons[section] = [])).push(button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   892
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   893
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   894
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   895
        // Handle `config` being either an Array or Object of Arrays.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   896
        if (isArray(config)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   897
            processButtons.call(this, config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   898
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   899
            YObject.each(config, processButtons, this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   900
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   901
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   902
        return buttons;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   903
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   904
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   905
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   906
    Syncs this widget's current button-related state to its DOM. This method is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   907
    inserted via AOP, and will execute after `syncUI()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   908
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   909
    @method _syncUIButtons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   910
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   911
    @since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   912
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   913
    _syncUIButtons: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   914
        this._uiSetButtons(this.get('buttons'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   915
        this._uiSetDefaultButton(this.get('defaultButton'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   916
        this._uiSetVisibleButtons(this.get('visible'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   917
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   918
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   919
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   920
    Inserts the specified `button` node into this widget's DOM at the specified
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   921
    `section` and `index` and updates the section content.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   922
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   923
    The section and button container nodes will be created if they do not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   924
    already exist.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   925
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   926
    @method _uiInsertButton
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   927
    @param {Node} button The button node to insert into this widget's DOM.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   928
    @param {String} section The `WidgetStdMod` section (header/body/footer).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   929
    @param {Number} index Index at which the `button` should be positioned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   930
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   931
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   932
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   933
    _uiInsertButton: function (button, section, index) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   934
        var buttonsClassName = WidgetButtons.CLASS_NAMES.button,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   935
            buttonContainer  = this._getButtonContainer(section, true),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   936
            sectionButtons   = buttonContainer.all('.' + buttonsClassName);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   937
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   938
        // Inserts the button node at the correct index.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   939
        buttonContainer.insertBefore(button, sectionButtons.item(index));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   940
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   941
        // Adds the button container to the section content.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   942
        this.setStdModContent(section, buttonContainer, 'after');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   943
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   944
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   945
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   946
    Removes the button node from this widget's DOM and detaches any event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   947
    subscriptions on the button that were created by this widget. The section
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   948
    content will be updated unless `{preserveContent: true}` is passed in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   949
    `options`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   950
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   951
    By default the button container node will be removed when this removes the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   952
    last button of the specified `section`; and if no other content remains in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   953
    the section node, it will also be removed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   954
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   955
    @method _uiRemoveButton
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   956
    @param {Node} button The button to remove and destroy.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   957
    @param {String} section The `WidgetStdMod` section (header/body/footer).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   958
    @param {Object} [options] Additional options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   959
      @param {Boolean} [options.preserveContent=false] Whether the section
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   960
        content should be updated.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   961
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   962
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   963
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   964
    _uiRemoveButton: function (button, section, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   965
        var yuid    = Y.stamp(button, this),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   966
            handles = this._buttonsHandles,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   967
            handle  = handles[yuid],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   968
            buttonContainer, buttonClassName;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   969
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   970
        if (handle) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   971
            handle.detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   972
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   973
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   974
        delete handles[yuid];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   975
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   976
        button.remove();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   977
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   978
        options || (options = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   979
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   980
        // Remove the button container and section nodes if needed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   981
        if (!options.preserveContent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   982
            buttonContainer = this._getButtonContainer(section);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   983
            buttonClassName = WidgetButtons.CLASS_NAMES.button;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   984
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   985
            // Only matters if we have a button container which is empty.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   986
            if (buttonContainer &&
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   987
                    buttonContainer.all('.' + buttonClassName).isEmpty()) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   988
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   989
                buttonContainer.remove();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   990
                this._updateContentButtons(section);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   991
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   992
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   993
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   994
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   995
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   996
    Sets the current `buttons` state to this widget's DOM by rendering the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   997
    specified collection of `buttons` and updates the contents of each section
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   998
    as needed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   999
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1000
    Button nodes which already exist in the DOM will remain intact, or will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1001
    moved if they should be in a new position. Old button nodes which are no
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1002
    longer represented in the specified `buttons` collection will be removed,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1003
    and any event subscriptions on the button which were created by this widget
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1004
    will be detached.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1005
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1006
    If the button nodes in this widget's DOM actually change, then each content
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1007
    section will be updated (or removed) appropriately.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1008
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1009
    @method _uiSetButtons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1010
    @param {Object} buttons The current `buttons` state to visually represent.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1011
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1012
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1013
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1014
    _uiSetButtons: function (buttons) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1015
        var buttonClassName = WidgetButtons.CLASS_NAMES.button,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1016
            sections        = ['header', 'body', 'footer'];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1017
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1018
        YArray.each(sections, function (section) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1019
            var sectionButtons  = buttons[section] || [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1020
                numButtons      = sectionButtons.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1021
                buttonContainer = this._getButtonContainer(section, numButtons),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1022
                buttonsUpdated  = false,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1023
                oldNodes, i, button, buttonIndex;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1024
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1025
            // When there's no button container, there are no new buttons or old
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1026
            // buttons that we have to deal with for this section.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1027
            if (!buttonContainer) { return; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1028
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1029
            oldNodes = buttonContainer.all('.' + buttonClassName);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1030
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1031
            for (i = 0; i < numButtons; i += 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1032
                button      = sectionButtons[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1033
                buttonIndex = oldNodes.indexOf(button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1034
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1035
                // Buttons already rendered in the Widget should remain there or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1036
                // moved to their new index. New buttons will be added to the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1037
                // current `buttonContainer`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1038
                if (buttonIndex > -1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1039
                    // Remove button from existing buttons nodeList since its in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1040
                    // the DOM already.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1041
                    oldNodes.splice(buttonIndex, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1042
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1043
                    // Check that the button is at the right position, if not,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1044
                    // move it to its new position.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1045
                    if (buttonIndex !== i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1046
                        // Using `i + 1` because the button should be at index
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1047
                        // `i`; it's inserted before the node which comes after.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1048
                        buttonContainer.insertBefore(button, i + 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1049
                        buttonsUpdated = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1050
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1051
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1052
                    buttonContainer.appendChild(button);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1053
                    buttonsUpdated = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1054
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1055
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1056
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1057
            // Safely removes the old button nodes which are no longer part of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1058
            // this widget's `buttons`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1059
            oldNodes.each(function (button) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1060
                this._uiRemoveButton(button, section, {preserveContent: true});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1061
                buttonsUpdated = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1062
            }, this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1063
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1064
            // Remove leftover empty button containers and updated the StdMod
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1065
            // content area.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1066
            if (numButtons === 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1067
                buttonContainer.remove();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1068
                this._updateContentButtons(section);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1069
                return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1070
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1071
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1072
            // Adds the button container to the section content.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1073
            if (buttonsUpdated) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1074
                this.setStdModContent(section, buttonContainer, 'after');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1075
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1076
        }, this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1077
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1078
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1079
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1080
    Adds the "yui3-button-primary" CSS class to the new `defaultButton` and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1081
    removes it from the old default button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1082
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1083
    @method _uiSetDefaultButton
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1084
    @param {Node} newButton The new `defaultButton`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1085
    @param {Node} oldButton The old `defaultButton`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1086
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1087
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1088
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1089
    _uiSetDefaultButton: function (newButton, oldButton) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1090
        var primaryClassName = WidgetButtons.CLASS_NAMES.primary;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1091
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1092
        if (newButton) { newButton.addClass(primaryClassName); }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1093
        if (oldButton) { oldButton.removeClass(primaryClassName); }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1094
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1095
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1096
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1097
    Focuses this widget's `defaultButton` if there is one and this widget is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1098
    visible.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1099
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1100
    @method _uiSetVisibleButtons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1101
    @param {Boolean} visible Whether this widget is visible.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1102
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1103
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1104
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1105
    _uiSetVisibleButtons: function (visible) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1106
        if (!visible) { return; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1107
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1108
        var defaultButton = this.get('defaultButton');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1109
        if (defaultButton) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1110
            defaultButton.focus();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1111
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1112
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1113
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1114
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1115
    Removes the specified `button` from the buttons map (both name -> button and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1116
    section:name -> button), and nulls-out the `defaultButton` if it is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1117
    currently the default button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1118
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1119
    @method _unMapButton
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1120
    @param {Node} button The button node to remove from the buttons map.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1121
    @param {String} section The `WidgetStdMod` section (header/body/footer).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1122
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1123
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1124
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1125
    _unMapButton: function (button, section) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1126
        var map  = this._buttonsMap,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1127
            name = this._getButtonName(button),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1128
            sectionName;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1129
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1130
        // Only delete the map entry if the specified `button` is mapped to it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1131
        if (name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1132
            // name -> button
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1133
            if (map[name] === button) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1134
                delete map[name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1135
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1136
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1137
            // section:name -> button
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1138
            sectionName = section + ':' + name;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1139
            if (map[sectionName] === button) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1140
                delete map[sectionName];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1141
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1142
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1143
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1144
        // Clear the default button if its the specified `button`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1145
        if (this._defaultButton === button) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1146
            this._defaultButton = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1147
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1148
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1149
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1150
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1151
    Updates the `defaultButton` attribute if it needs to be updated by comparing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1152
    its current value with the protected `_defaultButton` property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1153
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1154
    @method _updateDefaultButton
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1155
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1156
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1157
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1158
    _updateDefaultButton: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1159
        var defaultButton = this._defaultButton;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1160
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1161
        if (this.get('defaultButton') !== defaultButton) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1162
            this._set('defaultButton', defaultButton);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1163
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1164
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1165
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1166
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1167
    Updates the content attribute which corresponds to the specified `section`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1168
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1169
    The method updates the section's content to its current `childNodes`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1170
    (text and/or HTMLElement), or will null-out its contents if the section is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1171
    empty. It also specifies a `src` of `buttons` on the change event facade.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1172
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1173
    @method _updateContentButtons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1174
    @param {String} section The `WidgetStdMod` section (header/body/footer) to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1175
        update.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1176
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1177
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1178
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1179
    _updateContentButtons: function (section) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1180
        // `childNodes` return text nodes and HTMLElements.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1181
        var sectionContent = this.getStdModNode(section).get('childNodes');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1182
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1183
        // Updates the section to its current contents, or null if it is empty.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1184
        this.set(section + 'Content', sectionContent.isEmpty() ? null :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1185
            sectionContent, {src: 'buttons'});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1186
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1187
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1188
    // -- Protected Event Handlers ---------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1189
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1190
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1191
    Handles this widget's `buttonsChange` event which fires anytime the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1192
    `buttons` attribute is modified.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1193
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1194
    **Note:** This method special-cases the `buttons` modifications caused by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1195
    `addButton()` and `removeButton()`, both of which set the `src` property on
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1196
    the event facade to "add" and "remove" respectively.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1197
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1198
    @method _afterButtonsChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1199
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1200
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1201
    @since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1202
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1203
    _afterButtonsChange: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1204
        var buttons = e.newVal,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1205
            section = e.section,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1206
            index   = e.index,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1207
            src     = e.src,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1208
            button;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1209
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1210
        // Special cases `addButton()` to only set and insert the new button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1211
        if (src === 'add') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1212
            // Make sure we have the button node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1213
            button = buttons[section][index];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1214
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1215
            this._mapButton(button, section);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1216
            this._updateDefaultButton();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1217
            this._uiInsertButton(button, section, index);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1218
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1219
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1220
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1221
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1222
        // Special cases `removeButton()` to only remove the specified button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1223
        if (src === 'remove') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1224
            // Button node already exists on the event facade.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1225
            button = e.button;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1226
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1227
            this._unMapButton(button, section);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1228
            this._updateDefaultButton();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1229
            this._uiRemoveButton(button, section);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1230
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1231
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1232
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1233
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1234
        this._mapButtons(buttons);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1235
        this._updateDefaultButton();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1236
        this._uiSetButtons(buttons);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1237
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1238
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1239
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1240
    Handles this widget's `headerContentChange`, `bodyContentChange`,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1241
    `footerContentChange` events by making sure the `buttons` remain rendered
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1242
    after changes to the content areas.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1243
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1244
    These events are very chatty, so extra caution is taken to avoid doing extra
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1245
    work or getting into an infinite loop.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1246
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1247
    @method _afterContentChangeButtons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1248
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1249
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1250
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1251
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1252
    _afterContentChangeButtons: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1253
        var src     = e.src,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1254
            pos     = e.stdModPosition,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1255
            replace = !pos || pos === WidgetStdMod.REPLACE;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1256
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1257
        // Only do work when absolutely necessary.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1258
        if (replace && src !== 'buttons' && src !== Widget.UI_SRC) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1259
            this._uiSetButtons(this.get('buttons'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1260
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1261
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1262
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1263
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1264
    Handles this widget's `defaultButtonChange` event by adding the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1265
    "yui3-button-primary" CSS class to the new `defaultButton` and removing it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1266
    from the old default button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1267
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1268
    @method _afterDefaultButtonChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1269
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1270
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1271
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1272
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1273
    _afterDefaultButtonChange: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1274
        this._uiSetDefaultButton(e.newVal, e.prevVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1275
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1276
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1277
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1278
    Handles this widget's `visibleChange` event by focusing the `defaultButton`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1279
    if there is one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1280
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1281
    @method _afterVisibleChangeButtons
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1282
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1283
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1284
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1285
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1286
    _afterVisibleChangeButtons: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1287
        this._uiSetVisibleButtons(e.newVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1288
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1289
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1290
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1291
Y.WidgetButtons = WidgetButtons;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1292
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1293
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1294
}, '@VERSION@', {"requires": ["button-plugin", "cssbutton", "widget-stdmod"]});