src/cm/media/js/lib/yui/yui3-3.15.0/build/view/view.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 602 e16a97fb364a
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('view', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
Represents a logical piece of an application's user interface, and provides a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
lightweight, overridable API for rendering content and handling delegated DOM
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
events on a container element.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
@module app
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
@submodule view
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
@since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
Represents a logical piece of an application's user interface, and provides a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
lightweight, overridable API for rendering content and handling delegated DOM
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
events on a container element.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
The View class imposes little structure and provides only minimal functionality
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
of its own: it's basically just an overridable API interface that helps you
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
implement custom views.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
As of YUI 3.5.0, View allows ad-hoc attributes to be specified at instantiation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
time, so you don't need to subclass `Y.View` to add custom attributes. Just pass
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
them to the constructor:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
    var view = new Y.View({foo: 'bar'});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
    view.get('foo'); // => "bar"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
@class View
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
@constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
@extends Base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
@since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
function View() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
    View.superclass.constructor.apply(this, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
Y.View = Y.extend(View, Y.Base, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
    // -- Public Properties ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
    Template for this view's container.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
    @property containerTemplate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
    @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
    @default "<div/>"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
    containerTemplate: '<div/>',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
    Hash of CSS selectors mapped to events to delegate to elements matching
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
    those selectors.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
    CSS selectors are relative to the `container` element. Events are attached
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
    to the container, and delegation is used so that subscribers are only
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
    notified of events that occur on elements inside the container that match
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
    the specified selectors. This allows the container's contents to be re-
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
    rendered as needed without losing event subscriptions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
    Event handlers can be specified either as functions or as strings that map
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
    to function names on this view instance or its prototype.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
    The `this` object in event handlers will refer to this view instance. If
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
    you'd prefer `this` to be something else, use `Y.bind()` to bind a custom
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
    `this` object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
    @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
        var view = new Y.View({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
            events: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
                // Call `this.toggle()` whenever the element with the id
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
                // "toggle-button" is clicked.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
                '#toggle-button': {click: 'toggle'},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
                // Call `this.hoverOn()` when the mouse moves over any element
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
                // with the "hoverable" class, and `this.hoverOff()` when the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
                // mouse moves out of any element with the "hoverable" class.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
                '.hoverable': {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
                    mouseover: 'hoverOn',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
                    mouseout : 'hoverOff'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
    @property events
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
    @default {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
    events: {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
    Template for this view's contents.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
    This is a convenience property that has no default behavior of its own.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
    It's only provided as a convention to allow you to store whatever you
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
    consider to be a template, whether that's an HTML string, a `Y.Node`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
    instance, a Mustache template, or anything else your little heart
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
    desires.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
    How this template gets used is entirely up to you and your custom
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
    `render()` method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
    @property template
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
    @type mixed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
    @default ''
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
    template: '',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
    // -- Protected Properties -------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
    This tells `Y.Base` that it should create ad-hoc attributes for config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
    properties passed to View's constructor. This makes it possible to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
    instantiate a view and set a bunch of attributes without having to subclass
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
    `Y.View` and declare all those attributes first.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
    @property _allowAdHocAttrs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
    @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
    @default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
    _allowAdHocAttrs: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
    // -- Lifecycle Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
    initializer: function (config) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
        config || (config = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
        // Set instance properties specified in the config.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
        config.containerTemplate &&
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
            (this.containerTemplate = config.containerTemplate);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
        config.template && (this.template = config.template);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
        // Merge events from the config into events in `this.events`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
        this.events = config.events ? Y.merge(this.events, config.events) :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
            this.events;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
        // When the container node changes (or when it's set for the first
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
        // time), we'll attach events to it, but not until then. This allows the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
        // container to be created lazily the first time it's accessed rather
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
        // than always on init.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
        this.after('containerChange', this._afterContainerChange);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
    Destroys this View, detaching any DOM events and optionally also destroying
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
    its container node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
    By default, the container node will not be destroyed. Pass an _options_
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
    object with a truthy `remove` property to destroy the container as well.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
    @method destroy
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
        @param {Boolean} [options.remove=false] If `true`, this View's container
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
            will be removed from the DOM and destroyed as well.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
    destroy: function (options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
        // We also accept `delete` as a synonym for `remove`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
        if (options && (options.remove || options['delete'])) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
            // Attaching an event handler here because the `destroy` event is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
            // preventable. If we destroyed the container before calling the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
            // superclass's `destroy()` method and the event was prevented, the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
            // class would end up in a broken state.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
            this.onceAfter('destroy', function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
                this._destroyContainer();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
        return View.superclass.destroy.call(this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
    destructor: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
        this.detachEvents();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
        delete this._container;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
    // -- Public Methods -------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
    Attaches delegated event handlers to this view's container element. This
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
    method is called internally to subscribe to events configured in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
    `events` attribute when the view is initialized.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
    You may override this method to customize the event attaching logic.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
    @method attachEvents
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
    @param {Object} [events] Hash of events to attach. See the docs for the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
        `events` attribute for details on the format. If not specified, this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
        view's `events` property will be used.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
    @see detachEvents
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
    attachEvents: function (events) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
        var container = this.get('container'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
            owns      = Y.Object.owns,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
            handler, handlers, name, selector;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
        this.detachEvents();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
        events || (events = this.events);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
        for (selector in events) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
            if (!owns(events, selector)) { continue; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
            handlers = events[selector];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
            for (name in handlers) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
                if (!owns(handlers, name)) { continue; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
                handler = handlers[name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
                // TODO: Make this more robust by using lazy-binding:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
                // `handler = Y.bind(handler, this);`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
                if (typeof handler === 'string') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
                    handler = this[handler];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
                if (!handler) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
                    continue;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
                this._attachedViewEvents.push(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
                    container.delegate(name, handler, selector, this));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
    Creates and returns a container node for this view.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
    By default, the container is created from the HTML template specified in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
    `containerTemplate` property, and is _not_ added to the DOM automatically.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
    You may override this method to customize how the container node is created
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
    (such as by rendering it from a custom template format). Your method must
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
    return a `Y.Node` instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
    @method create
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
    @param {HTMLElement|Node|String} [container] Selector string, `Y.Node`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
        instance, or DOM element to use at the container node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
    @return {Node} Node instance of the created container node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
    create: function (container) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
        return container ? Y.one(container) :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
                Y.Node.create(this.containerTemplate);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
    Detaches DOM events that have previously been attached to the container by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
    `attachEvents()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
    @method detachEvents
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
    @see attachEvents
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
    detachEvents: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
        Y.Array.each(this._attachedViewEvents, function (handle) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
            if (handle) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
                handle.detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
        this._attachedViewEvents = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
    Removes this view's container element from the DOM (if it's in the DOM),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
    but doesn't destroy it or any event listeners attached to it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
    @method remove
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
    remove: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
        var container = this.get('container');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
        container && container.remove();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
    Renders this view.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
    This method is a noop by default. Override it to provide a custom
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
    implementation that renders this view's content and appends it to the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
    container element. Ideally your `render` method should also return `this` as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
    the end to allow chaining, but that's up to you.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
    Since there's no default renderer, you're free to render your view however
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
    you see fit, whether that means manipulating the DOM directly, dumping
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
    strings into `innerHTML`, or using a template language of some kind.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
    For basic templating needs, `Y.Node.create()` and `Y.Lang.sub()` may
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
    suffice, but there are no restrictions on what tools or techniques you can
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
    use to render your view. All you need to do is append something to the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
    container element at some point, and optionally append the container
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
    to the DOM if it's not there already.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
    @method render
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
    render: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
    // -- Protected Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
    Removes the `container` from the DOM and purges all its event listeners.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
    @method _destroyContainer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
    _destroyContainer: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
        var container = this.get('container');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
        container && container.remove(true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
    Getter for the `container` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
    @method _getContainer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
    @param {Node|null} value Current attribute value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
    @return {Node} Container node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
    _getContainer: function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
        // This wackiness is necessary to enable fully lazy creation of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
        // container node both when no container is specified and when one is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
        // specified via a valueFn.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
        if (!this._container) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
            if (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
                // Attach events to the container when it's specified via a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
                // valueFn, which won't fire the containerChange event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
                this._container = value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
                this.attachEvents();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
                // Create a default container and set that as the new attribute
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
                // value. The `this._container` property prevents infinite
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
                // recursion.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
                value = this._container = this.create();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
                this._set('container', value);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
        return value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
    // -- Protected Event Handlers ---------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
    Handles `containerChange` events. Detaches event handlers from the old
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
    container (if any) and attaches them to the new container.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
    Right now the `container` attr is initOnly so this event should only ever
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
    fire the first time the container is created, but in the future (once Y.App
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
    can handle it) we may allow runtime container changes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
    @method _afterContainerChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
    _afterContainerChange: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
        this.attachEvents(this.events);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
}, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
    NAME: 'view',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
    ATTRS: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
        Container node into which this view's content will be rendered.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
        The container node serves as the host for all DOM events attached by the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
        view. Delegation is used to handle events on children of the container,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
        allowing the container's contents to be re-rendered at any time without
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
        losing event subscriptions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
        The default container is a `<div>` Node, but you can override this in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
        a subclass, or by passing in a custom `container` config value at
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
        instantiation time. If you override the default container in a subclass
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
        using `ATTRS`, you must use the `valueFn` property. The view's constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
        will ignore any assignments using `value`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
        When `container` is overridden by a subclass or passed as a config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
        option at instantiation time, you can provide it as a selector string, a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
        DOM element, a `Y.Node` instance, or (if you are subclassing and modifying
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
        the attribute), a `valueFn` function that returns a `Y.Node` instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
        The value will be converted into a `Y.Node` instance if it isn't one
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
        already.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
        The container is not added to the page automatically. This allows you to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
        have full control over how and when your view is actually rendered to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
        the page.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
        @attribute container
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
        @type HTMLElement|Node|String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
        @default Y.Node.create(this.containerTemplate)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
        @writeOnce
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
        container: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
            getter   : '_getContainer',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
            setter   : Y.one,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
            writeOnce: true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
    Properties that shouldn't be turned into ad-hoc attributes when passed to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
    View's constructor.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
    @property _NON_ATTRS_CFG
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
    @type Array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
    _NON_ATTRS_CFG: [
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
        'containerTemplate',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
        'events',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
        'template'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
    ]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
}, '@VERSION@', {"requires": ["base-build", "node-event-delegate"]});