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