src/cm/media/js/lib/yui/yui3-3.15.0/build/app-base/app-base-debug.js
author gibus
Mon, 10 Mar 2014 15:19:48 +0100
changeset 602 e16a97fb364a
permissions -rw-r--r--
Use YUI 3.15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('app-base', 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
The App Framework provides simple MVC-like building blocks (models, model lists,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
views, and URL-based routing) for writing single-page JavaScript applications.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
@main app
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
@module app
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
@since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
**/
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
Provides a top-level application component which manages navigation and views.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
@module app
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
@submodule app-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
// TODO: Better handling of lifecycle for registered views:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
//
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
//   * [!] Just redo basically everything with view management so there are no
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
//     pre-`activeViewChange` side effects and handle the rest of these things:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
//
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
//   * Seems like any view created via `createView` should listen for the view's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
//     `destroy` event and use that to remove it from the `_viewsInfoMap`. I
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
//     should look at what ModelList does for Models as a reference.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
//
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
//   * Should we have a companion `destroyView()` method? Maybe this wouldn't be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
//     needed if we have a `getView(name, create)` method, and already doing the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
//     above? We could do `app.getView('foo').destroy()` and it would be removed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
//     from the `_viewsInfoMap` as well.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
//
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
//   * Should we wait to call a view's `render()` method inside of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
//     `_attachView()` method?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
//
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
//   * Should named views support a collection of instances instead of just one?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
//
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
var Lang    = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
    YObject = Y.Object,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
    PjaxBase = Y.PjaxBase,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
    Router   = Y.Router,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
    View     = Y.View,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
    getClassName = Y.ClassNameManager.getClassName,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
    win = Y.config.win,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
    AppBase;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
Provides a top-level application component which manages navigation and views.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
This gives you a foundation and structure on which to build your application; it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
combines robust URL navigation with powerful routing and flexible view
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
management.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
@class App.Base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
@param {Object} [config] The following are configuration properties that can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
    specified _in addition_ to default attribute values and the non-attribute
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
    properties provided by `Y.Base`:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
  @param {Object} [config.views] Hash of view-name to metadata used to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
    declaratively describe an application's views and their relationship with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
    the app and other views. The views specified here will override any defaults
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
    provided by the `views` object on the `prototype`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
@constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
@extends Base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
@uses View
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
@uses Router
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
@uses PjaxBase
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
AppBase = Y.Base.create('app', Y.Base, [View, Router, PjaxBase], {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
    // -- Public Properties ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
    Hash of view-name to metadata used to declaratively describe an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
    application's views and their relationship with the app and its other views.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
    The view metadata is composed of Objects keyed to a view-name that can have
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
    any or all of the following properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
      * `type`: Function or a string representing the view constructor to use to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
        create view instances. If a string is used, the constructor function is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
        assumed to be on the `Y` object; e.g. `"SomeView"` -> `Y.SomeView`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
      * `preserve`: Boolean for whether the view instance should be retained. By
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
        default, the view instance will be destroyed when it is no longer the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
        `activeView`. If `true` the view instance will simply be `removed()`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
        from the DOM when it is no longer active. This is useful when the view
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
        is frequently used and may be expensive to re-create.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
      * `parent`: String to another named view in this hash that represents the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
        parent view within the application's view hierarchy; e.g. a `"photo"`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
        view could have `"album"` has its `parent` view. This parent/child
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
        relationship is a useful cue for things like transitions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
      * `instance`: Used internally to manage the current instance of this named
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
        view. This can be used if your view instance is created up-front, or if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
        you would rather manage the View lifecycle, but you probably should just
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
        let this be handled for you.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
    If `views` are specified at instantiation time, the metadata in the `views`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
    Object here will be used as defaults when creating the instance's `views`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
    Every `Y.App` instance gets its own copy of a `views` object so this Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
    on the prototype will not be polluted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
    @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
        // Imagine that `Y.UsersView` and `Y.UserView` have been defined.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
        var app = new Y.App({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
            views: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
                users: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
                    type    : Y.UsersView,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
                    preserve: true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
                },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
                user: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
                    type  : Y.UserView,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
                    parent: 'users'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
    @property views
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
    @default {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
    views: {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
    // -- Protected Properties -------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
    Map of view instance id (via `Y.stamp()`) to view-info object in `views`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
    This mapping is used to tie a specific view instance back to its metadata by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
    adding a reference to the the related view info on the `views` object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
    @property _viewInfoMap
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
    @default {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
    @since 3.5.0
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
    // -- Lifecycle Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
    initializer: function (config) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
        config || (config = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
        var views = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
        // Merges-in specified view metadata into local `views` object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
        function mergeViewConfig(view, name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
            views[name] = Y.merge(views[name], view);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
        // First, each view in the `views` prototype object gets its metadata
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
        // merged-in, providing the defaults.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
        YObject.each(this.views, mergeViewConfig);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
        // Then, each view in the specified `config.views` object gets its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
        // metadata merged-in.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
        YObject.each(config.views, mergeViewConfig);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
        // The resulting hodgepodge of metadata is then stored as the instance's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
        // `views` object, and no one's objects were harmed in the making.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
        this.views        = views;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
        this._viewInfoMap = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
        // Using `bind()` to aid extensibility.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
        this.after('activeViewChange', Y.bind('_afterActiveViewChange', this));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
        // PjaxBase will bind click events when `html5` is `true`, so this just
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
        // forces the binding when `serverRouting` and `html5` are both falsy.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
        if (!this.get('serverRouting')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
            this._pjaxBindUI();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
    // TODO: `destructor` to destroy the `activeView`?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
    // -- Public Methods -------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
    Creates and returns a new view instance using the provided `name` to look up
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
    the view info metadata defined in the `views` object. The passed-in `config`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
    object is passed to the view constructor function.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
    This function also maps a view instance back to its view info metadata.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
    @method createView
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
    @param {String} name The name of a view defined on the `views` object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
    @param {Object} [config] The configuration object passed to the view
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
      constructor function when creating the new view instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
    @return {View} The new view instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
    createView: function (name, config) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
        var viewInfo = this.getViewInfo(name),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
            type     = (viewInfo && viewInfo.type) || View,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
            ViewConstructor, view;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
        // Looks for a namespaced constructor function on `Y`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
        ViewConstructor = Lang.isString(type) ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
                YObject.getValue(Y, type.split('.')) : type;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
        // Create the view instance and map it with its metadata.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
        view = new ViewConstructor(config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
        this._viewInfoMap[Y.stamp(view, true)] = viewInfo;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
        return view;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
    Returns the metadata associated with a view instance or view name defined on
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
    the `views` object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
    @method getViewInfo
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
    @param {View|String} view View instance, or name of a view defined on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
      `views` object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
    @return {Object} The metadata for the view, or `undefined` if the view is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
      not registered.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
    getViewInfo: function (view) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
        if (Lang.isString(view)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
            return this.views[view];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
        return view && this._viewInfoMap[Y.stamp(view, true)];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
    Navigates to the specified URL if there is a route handler that matches. In
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
    browsers capable of using HTML5 history or when `serverRouting` is falsy,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
    the navigation will be enhanced by firing the `navigate` event and having
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
    the app handle the "request". When `serverRouting` is `true`, non-HTML5
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
    browsers will navigate to the new URL via a full page reload.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
    When there is a route handler for the specified URL and it is being
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
    navigated to, this method will return `true`, otherwise it will return
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
    `false`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
    **Note:** The specified URL _must_ be of the same origin as the current URL,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
    otherwise an error will be logged and navigation will not occur. This is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
    intended as both a security constraint and a purposely imposed limitation as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
    it does not make sense to tell the app to navigate to a URL on a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
    different scheme, host, or port.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
    @method navigate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
    @param {String} url The URL to navigate to. This must be of the same origin
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
      as the current URL.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
    @param {Object} [options] Additional options to configure the navigation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
      These are mixed into the `navigate` event facade.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
        @param {Boolean} [options.replace] Whether or not the current history
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
          entry will be replaced, or a new entry will be created. Will default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
          to `true` if the specified `url` is the same as the current URL.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
        @param {Boolean} [options.force] Whether the enhanced navigation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
          should occur even in browsers without HTML5 history. Will default to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
          `true` when `serverRouting` is falsy.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
    @see PjaxBase.navigate()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
    // Does not override `navigate()` but does use extra `options`.
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
    Renders this application by appending the `viewContainer` node to the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
    `container` node if it isn't already a child of the container, and the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
    `activeView` will be appended the view container, if it isn't already.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
    You should call this method at least once, usually after the initialization
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
    of your app instance so the proper DOM structure is setup and optionally
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
    append the container to the DOM if it's not there already.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
    You may override this method to customize the app's rendering, but you
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
    should expect that the `viewContainer`'s contents will be modified by the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
    app for the purpose of rendering the `activeView` when it changes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
    @method render
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
    @see View.render()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
    render: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
        var CLASS_NAMES         = Y.App.CLASS_NAMES,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
            container           = this.get('container'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
            viewContainer       = this.get('viewContainer'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
            activeView          = this.get('activeView'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
            activeViewContainer = activeView && activeView.get('container'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
            areSame             = container.compareTo(viewContainer);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
        container.addClass(CLASS_NAMES.app);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
        viewContainer.addClass(CLASS_NAMES.views);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
        // Prevents needless shuffling around of nodes and maintains DOM order.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
        if (activeView && !viewContainer.contains(activeViewContainer)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
            viewContainer.appendChild(activeViewContainer);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
        // Prevents needless shuffling around of nodes and maintains DOM order.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
        if (!container.contains(viewContainer) && !areSame) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
            container.appendChild(viewContainer);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
    Sets which view is active/visible for the application. This will set the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
    app's `activeView` attribute to the specified `view`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
    The `view` will be "attached" to this app, meaning it will be both rendered
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
    into this app's `viewContainer` node and all of its events will bubble to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
    the app. The previous `activeView` will be "detached" from this app.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
    When a string-name is provided for a view which has been registered on this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
    app's `views` object, the referenced metadata will be used and the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
    `activeView` will be set to either a preserved view instance, or a new
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
    instance of the registered view will be created using the specified `config`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
    object passed-into this method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
    A callback function can be specified as either the third or fourth argument,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
    and this function will be called after the new `view` becomes the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
    `activeView`, is rendered to the `viewContainer`, and is ready to use.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
    @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
        var app = new Y.App({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
            views: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
                usersView: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
                    // Imagine that `Y.UsersView` has been defined.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
                    type: Y.UsersView
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
            },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
            users: new Y.ModelList()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
        app.route('/users/', function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
            this.showView('usersView', {users: this.get('users')});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
        app.render();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
        app.navigate('/uses/'); // => Creates a new `Y.UsersView` and shows it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
    @method showView
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
    @param {String|View} view The name of a view defined in the `views` object,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
        or a view instance which should become this app's `activeView`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
    @param {Object} [config] Optional configuration to use when creating a new
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
        view instance. This config object can also be used to update an existing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
        or preserved view's attributes when `options.update` is `true`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
    @param {Object} [options] Optional object containing any of the following
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
        properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
      @param {Function} [options.callback] Optional callback function to call
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
        after new `activeView` is ready to use, the function will be passed:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
          @param {View} options.callback.view A reference to the new
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
            `activeView`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
      @param {Boolean} [options.prepend=false] Whether the `view` should be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
        prepended instead of appended to the `viewContainer`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
      @param {Boolean} [options.render] Whether the `view` should be rendered.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
        **Note:** If no value is specified, a view instance will only be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
        rendered if it's newly created by this method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
      @param {Boolean} [options.update=false] Whether an existing view should
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
        have its attributes updated by passing the `config` object to its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
        `setAttrs()` method. **Note:** This option does not have an effect if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
        the `view` instance is created as a result of calling this method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
    @param {Function} [callback] Optional callback Function to call after the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
        new `activeView` is ready to use. **Note:** this will override
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
        `options.callback` and it can be specified as either the third or fourth
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
        argument. The function will be passed the following:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
      @param {View} callback.view A reference to the new `activeView`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
    showView: function (view, config, options, callback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
        var viewInfo, created;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
        options || (options = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
        // Support the callback function being either the third or fourth arg.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
        if (callback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
            options = Y.merge(options, {callback: callback});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
        } else if (Lang.isFunction(options)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
            options = {callback: options};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
        if (Lang.isString(view)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
            viewInfo = this.getViewInfo(view);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
            // Use the preserved view instance, or create a new view.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
            // TODO: Maybe we can remove the strict check for `preserve` and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
            // assume we'll use a View instance if it is there, and just check
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
            // `preserve` when detaching?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
            if (viewInfo && viewInfo.preserve && viewInfo.instance) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
                view = viewInfo.instance;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
                // Make sure there's a mapping back to the view metadata.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
                this._viewInfoMap[Y.stamp(view, true)] = viewInfo;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
                // TODO: Add the app as a bubble target during construction, but
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
                // make sure to check that it isn't already in `bubbleTargets`!
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
                // This will allow the app to be notified for about _all_ of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
                // view's events. **Note:** This should _only_ happen if the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
                // view is created _after_ `activeViewChange`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
                view    = this.createView(view, config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
                created = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
        // Update the specified or preserved `view` when signaled to do so.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
        // There's no need to updated a view if it was _just_ created.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
        if (options.update && !created) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
            view.setAttrs(config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
        // TODO: Hold off on rendering the view until after it has been
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
        // "attached", and move the call to render into `_attachView()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
        // When a value is specified for `options.render`, prefer it because it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
        // represents the developer's intent. When no value is specified, the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
        // `view` will only be rendered if it was just created.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
        if ('render' in options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
            if (options.render) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
                view.render();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
        } else if (created) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
            view.render();
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
        return this._set('activeView', view, {options: options});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
    // -- Protected Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
    Helper method to attach the view instance to the application by making the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
    app a bubble target of the view, append the view to the `viewContainer`, and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
    assign it to the `instance` property of the associated view info metadata.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
    @method _attachView
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
    @param {View} view View to attach.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
    @param {Boolean} prepend=false Whether the view should be prepended instead
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
      of appended to the `viewContainer`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
    _attachView: function (view, prepend) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
        if (!view) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
        var viewInfo      = this.getViewInfo(view),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
            viewContainer = this.get('viewContainer');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
        // Bubble the view's events to this app.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
        view.addTarget(this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
        // Save the view instance in the `views` registry.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
        if (viewInfo) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
            viewInfo.instance = view;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
        // TODO: Attach events here for persevered Views?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
        // See related TODO in `_detachView`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
        // TODO: Actually render the view here so that it gets "attached" before
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
        // it gets rendered?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
        // Insert view into the DOM.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
        viewContainer[prepend ? 'prepend' : 'append'](view.get('container'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
    Overrides View's container destruction to deal with the `viewContainer` and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
    checks to make sure not to remove and purge the `<body>`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
    @method _destroyContainer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
    @see View._destroyContainer()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
    _destroyContainer: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
        var CLASS_NAMES   = Y.App.CLASS_NAMES,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
            container     = this.get('container'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
            viewContainer = this.get('viewContainer'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
            areSame       = container.compareTo(viewContainer);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
        // We do not want to remove or destroy the `<body>`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
        if (Y.one('body').compareTo(container)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
            // Just clean-up our events listeners.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
            this.detachEvents();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
            // Clean-up `yui3-app` CSS class on the `container`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
            container.removeClass(CLASS_NAMES.app);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
            if (areSame) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
                // Clean-up `yui3-app-views` CSS class on the `container`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
                container.removeClass(CLASS_NAMES.views);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   500
                // Destroy and purge the `viewContainer`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   501
                viewContainer.remove(true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
        // Remove and purge events from both containers.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
        viewContainer.remove(true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
        if (!areSame) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
            container.remove(true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
    Helper method to detach the view instance from the application by removing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
    the application as a bubble target of the view, and either just removing the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
    view if it is intended to be preserved, or destroying the instance
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
    completely.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
    @method _detachView
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
    @param {View} view View to detach.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
    _detachView: function (view) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
        if (!view) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
        var viewInfo = this.getViewInfo(view) || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
        if (viewInfo.preserve) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
            view.remove();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
            // TODO: Detach events here for preserved Views? It is possible that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
            // some event subscriptions are made on elements other than the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
            // View's `container`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
            view.destroy({remove: true});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
            // TODO: The following should probably happen automagically from
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
            // `destroy()` being called! Possibly `removeTarget()` as well.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
            // Remove from view to view-info map.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
            delete this._viewInfoMap[Y.stamp(view, true)];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
            // Remove from view-info instance property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
            if (view === viewInfo.instance) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
                delete viewInfo.instance;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
        view.removeTarget(this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
    Gets a request object that can be passed to a route handler.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   559
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   560
    This delegates to `Y.Router`'s `_getRequest()` method and adds a reference
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   561
    to this app instance at `req.app`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
    @method _getRequest
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
    @param {String} src What initiated the URL change and need for the request.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
    @return {Object} Request object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
    @see Router._getRequest
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   569
    _getRequest: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   570
        var req = Router.prototype._getRequest.apply(this, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   571
        req.app = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   572
        return req;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   573
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   574
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   575
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   576
    Getter for the `viewContainer` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   577
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   578
    @method _getViewContainer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   579
    @param {Node|null} value Current attribute value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   580
    @return {Node} View container node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   581
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   582
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   583
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   584
    _getViewContainer: function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   585
        // This wackiness is necessary to enable fully lazy creation of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   586
        // container node both when no container is specified and when one is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   587
        // specified via a valueFn.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   588
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   589
        if (!value && !this._viewContainer) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   590
            // Create a default container and set that as the new attribute
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   591
            // value. The `this._viewContainer` property prevents infinite
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   592
            // recursion.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   593
            value = this._viewContainer = this.create();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   594
            this._set('viewContainer', value);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   595
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   596
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   597
        return value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   598
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   599
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   600
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   601
    Provides the default value for the `html5` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   603
    The value returned is dependent on the value of the `serverRouting`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   604
    attribute. When `serverRouting` is explicit set to `false` (not just falsy),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   605
    the default value for `html5` will be set to `false` for *all* browsers.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   606
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   607
    When `serverRouting` is `true` or `undefined` the returned value will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   608
    dependent on the browser's capability of using HTML5 history.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   609
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   610
    @method _initHtml5
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   611
    @return {Boolean} Whether or not HTML5 history should be used.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   612
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   613
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   614
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   615
    _initHtml5: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   616
        // When `serverRouting` is explicitly set to `false` (not just falsy),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   617
        // forcing hash-based URLs in all browsers.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   618
        if (this.get('serverRouting') === false) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   619
            return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   620
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   621
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   622
        // Defaults to whether or not the browser supports HTML5 history.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   623
        return Router.html5;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   624
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   625
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   626
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   627
    Determines if the specified `view` is configured as a child of the specified
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   628
    `parent` view. This requires both views to be either named-views, or view
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   629
    instances created using configuration data that exists in the `views`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   630
    object, e.g. created by the `createView()` or `showView()` method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   631
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   632
    @method _isChildView
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   633
    @param {View|String} view The name of a view defined in the `views` object,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   634
      or a view instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   635
    @param {View|String} parent The name of a view defined in the `views`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   636
      object, or a view instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   637
    @return {Boolean} Whether the view is configured as a child of the parent.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   638
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   639
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   640
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   641
    _isChildView: function (view, parent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   642
        var viewInfo   = this.getViewInfo(view),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   643
            parentInfo = this.getViewInfo(parent);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   644
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   645
        if (viewInfo && parentInfo) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   646
            return this.getViewInfo(viewInfo.parent) === parentInfo;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   647
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   648
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   649
        return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   650
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   651
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   652
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   653
    Determines if the specified `view` is configured as the parent of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   654
    specified `child` view. This requires both views to be either named-views,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   655
    or view instances created using configuration data that exists in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   656
    `views` object, e.g. created by the `createView()` or `showView()` method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   657
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   658
    @method _isParentView
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   659
    @param {View|String} view The name of a view defined in the `views` object,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   660
      or a view instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   661
    @param {View|String} parent The name of a view defined in the `views`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   662
      object, or a view instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   663
    @return {Boolean} Whether the view is configured as the parent of the child.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   664
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   665
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   666
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   667
    _isParentView: function (view, child) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   668
        var viewInfo  = this.getViewInfo(view),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   669
            childInfo = this.getViewInfo(child);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   670
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   671
        if (viewInfo && childInfo) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   672
            return this.getViewInfo(childInfo.parent) === viewInfo;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   673
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   674
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   675
        return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   676
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   677
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   678
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   679
    Underlying implementation for `navigate()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   680
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   681
    @method _navigate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   682
    @param {String} url The fully-resolved URL that the app should dispatch to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   683
      its route handlers to fulfill the enhanced navigation "request", or use to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   684
      update `window.location` in non-HTML5 history capable browsers when
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   685
      `serverRouting` is `true`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   686
    @param {Object} [options] Additional options to configure the navigation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   687
      These are mixed into the `navigate` event facade.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   688
        @param {Boolean} [options.replace] Whether or not the current history
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   689
          entry will be replaced, or a new entry will be created. Will default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   690
          to `true` if the specified `url` is the same as the current URL.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   691
        @param {Boolean} [options.force] Whether the enhanced navigation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   692
          should occur even in browsers without HTML5 history. Will default to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   693
          `true` when `serverRouting` is falsy.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   694
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   695
    @see PjaxBase._navigate()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   696
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   697
    _navigate: function (url, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   698
        if (!this.get('serverRouting')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   699
            // Force navigation to be enhanced and handled by the app when
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   700
            // `serverRouting` is falsy because the server might not be able to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   701
            // properly handle the request.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   702
            options = Y.merge({force: true}, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   703
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   704
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   705
        return PjaxBase.prototype._navigate.call(this, url, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   706
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   707
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   708
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   709
    Will either save a history entry using `pushState()` or the location hash,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   710
    or gracefully-degrade to sending a request to the server causing a full-page
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   711
    reload.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   712
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   713
    Overrides Router's `_save()` method to preform graceful-degradation when the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   714
    app's `serverRouting` is `true` and `html5` is `false` by updating the full
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   715
    URL via standard assignment to `window.location` or by calling
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   716
    `window.location.replace()`; both of which will cause a request to the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   717
    server resulting in a full-page reload.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   718
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   719
    Otherwise this will just delegate off to Router's `_save()` method allowing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   720
    the client-side enhanced routing to occur.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   721
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   722
    @method _save
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   723
    @param {String} [url] URL for the history entry.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   724
    @param {Boolean} [replace=false] If `true`, the current history entry will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   725
      be replaced instead of a new one being added.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   726
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   727
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   728
    @see Router._save()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   729
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   730
    _save: function (url, replace) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   731
        var path;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   732
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   733
        // Forces full-path URLs to always be used by modifying
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   734
        // `window.location` in non-HTML5 history capable browsers.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   735
        if (this.get('serverRouting') && !this.get('html5')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   736
            // Perform same-origin check on the specified URL.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   737
            if (!this._hasSameOrigin(url)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   738
                Y.error('Security error: The new URL must be of the same origin as the current URL.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   739
                return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   740
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   741
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   742
            // Either replace the current history entry or create a new one
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   743
            // while navigating to the `url`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   744
            if (win) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   745
                // Results in the URL's full path starting with '/'.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   746
                path = this._joinURL(url || '');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   747
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   748
                if (replace) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   749
                    win.location.replace(path);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   750
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   751
                    win.location = path;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   752
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   753
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   754
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   755
            return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   756
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   757
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   758
        return Router.prototype._save.apply(this, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   759
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   760
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   761
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   762
    Performs the actual change of this app's `activeView` by attaching the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   763
    `newView` to this app, and detaching the `oldView` from this app using any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   764
    specified `options`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   765
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   766
    The `newView` is attached to the app by rendering it to the `viewContainer`,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   767
    and making this app a bubble target of its events.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   768
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   769
    The `oldView` is detached from the app by removing it from the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   770
    `viewContainer`, and removing this app as a bubble target for its events.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   771
    The `oldView` will either be preserved or properly destroyed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   772
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   773
    **Note:** The `activeView` attribute is read-only and can be changed by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   774
    calling the `showView()` method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   775
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   776
    @method _uiSetActiveView
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   777
    @param {View} newView The View which is now this app's `activeView`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   778
    @param {View} [oldView] The View which was this app's `activeView`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   779
    @param {Object} [options] Optional object containing any of the following
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   780
        properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   781
      @param {Function} [options.callback] Optional callback function to call
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   782
        after new `activeView` is ready to use, the function will be passed:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   783
          @param {View} options.callback.view A reference to the new
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   784
            `activeView`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   785
      @param {Boolean} [options.prepend=false] Whether the `view` should be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   786
        prepended instead of appended to the `viewContainer`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   787
      @param {Boolean} [options.render] Whether the `view` should be rendered.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   788
        **Note:** If no value is specified, a view instance will only be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   789
        rendered if it's newly created by this method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   790
      @param {Boolean} [options.update=false] Whether an existing view should
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   791
        have its attributes updated by passing the `config` object to its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   792
        `setAttrs()` method. **Note:** This option does not have an effect if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   793
        the `view` instance is created as a result of calling this method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   794
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   795
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   796
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   797
    _uiSetActiveView: function (newView, oldView, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   798
        options || (options = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   799
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   800
        var callback = options.callback,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   801
            isChild  = this._isChildView(newView, oldView),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   802
            isParent = !isChild && this._isParentView(newView, oldView),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   803
            prepend  = !!options.prepend || isParent;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   804
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   805
        // Prevent detaching (thus removing) the view we want to show. Also hard
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   806
        // to animate out and in, the same view.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   807
        if (newView === oldView) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   808
            return callback && callback.call(this, newView);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   809
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   810
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   811
        this._attachView(newView, prepend);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   812
        this._detachView(oldView);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   813
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   814
        if (callback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   815
            callback.call(this, newView);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   816
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   817
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   818
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   819
    // -- Protected Event Handlers ---------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   820
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   821
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   822
    Handles the application's `activeViewChange` event (which is fired when the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   823
    `activeView` attribute changes) by detaching the old view, attaching the new
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   824
    view.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   825
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   826
    The `activeView` attribute is read-only, so the public API to change its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   827
    value is through the `showView()` method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   828
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   829
    @method _afterActiveViewChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   830
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   831
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   832
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   833
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   834
    _afterActiveViewChange: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   835
        this._uiSetActiveView(e.newVal, e.prevVal, e.options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   836
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   837
}, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   838
    ATTRS: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   839
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   840
        The application's active/visible view.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   841
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   842
        This attribute is read-only, to set the `activeView` use the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   843
        `showView()` method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   844
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   845
        @attribute activeView
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   846
        @type View
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   847
        @default null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   848
        @readOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   849
        @see App.Base.showView()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   850
        @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   851
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   852
        activeView: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   853
            value   : null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   854
            readOnly: true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   855
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   856
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   857
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   858
        Container node which represents the application's bounding-box, into
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   859
        which this app's content will be rendered.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   860
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   861
        The container node serves as the host for all DOM events attached by the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   862
        app. Delegation is used to handle events on children of the container,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   863
        allowing the container's contents to be re-rendered at any time without
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   864
        losing event subscriptions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   865
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   866
        The default container is the `<body>` Node, but you can override this in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   867
        a subclass, or by passing in a custom `container` config value at
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   868
        instantiation time.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   869
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   870
        When `container` is overridden by a subclass or passed as a config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   871
        option at instantiation time, it may be provided as a selector string, a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   872
        DOM element, or a `Y.Node` instance. During initialization, this app's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   873
        `create()` method will be called to convert the container into a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   874
        `Y.Node` instance if it isn't one already and stamp it with the CSS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   875
        class: `"yui3-app"`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   876
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   877
        The container is not added to the page automatically. This allows you to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   878
        have full control over how and when your app is actually rendered to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   879
        the page.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   880
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   881
        @attribute container
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   882
        @type HTMLElement|Node|String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   883
        @default Y.one('body')
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   884
        @initOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   885
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   886
        container: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   887
            valueFn: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   888
                return Y.one('body');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   889
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   890
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   891
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   892
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   893
        Whether or not this browser is capable of using HTML5 history.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   894
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   895
        This value is dependent on the value of `serverRouting` and will default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   896
        accordingly.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   897
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   898
        Setting this to `false` will force the use of hash-based history even on
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   899
        HTML5 browsers, but please don't do this unless you understand the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   900
        consequences.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   901
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   902
        @attribute html5
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   903
        @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   904
        @initOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   905
        @see serverRouting
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   906
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   907
        html5: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   908
            valueFn: '_initHtml5'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   909
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   910
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   911
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   912
        CSS selector string used to filter link click events so that only the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   913
        links which match it will have the enhanced-navigation behavior of pjax
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   914
        applied.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   915
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   916
        When a link is clicked and that link matches this selector, navigating
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   917
        to the link's `href` URL using the enhanced, pjax, behavior will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   918
        attempted; and the browser's default way to navigate to new pages will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   919
        be the fallback.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   920
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   921
        By default this selector will match _all_ links on the page.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   922
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   923
        @attribute linkSelector
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   924
        @type String|Function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   925
        @default "a"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   926
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   927
        linkSelector: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   928
            value: 'a'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   929
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   930
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   931
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   932
        Whether or not this application's server is capable of properly routing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   933
        all requests and rendering the initial state in the HTML responses.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   934
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   935
        This can have three different values, each having particular
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   936
        implications on how the app will handle routing and navigation:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   937
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   938
          * `undefined`: The best form of URLs will be chosen based on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   939
            capabilities of the browser. Given no information about the server
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   940
            environmentm a balanced approach to routing and navigation is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   941
            chosen.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   942
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   943
            The server should be capable of handling full-path requests, since
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   944
            full-URLs will be generated by browsers using HTML5 history. If this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   945
            is a client-side-only app the server could handle full-URL requests
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   946
            by sending a redirect back to the root with a hash-based URL, e.g:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   947
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   948
                Request:     http://example.com/users/1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   949
                Redirect to: http://example.com/#/users/1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   950
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   951
          * `true`: The server is *fully* capable of properly handling requests
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   952
            to all full-path URLs the app can produce.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   953
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   954
            This is the best option for progressive-enhancement because it will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   955
            cause **all URLs to always have full-paths**, which means the server
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   956
            will be able to accurately handle all URLs this app produces. e.g.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   957
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   958
                http://example.com/users/1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   959
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   960
            To meet this strict full-URL requirement, browsers which are not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   961
            capable of using HTML5 history will make requests to the server
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   962
            resulting in full-page reloads.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   963
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   964
          * `false`: The server is *not* capable of properly handling requests
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   965
            to all full-path URLs the app can produce, therefore all routing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   966
            will be handled by this App instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   967
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   968
            Be aware that this will cause **all URLs to always be hash-based**,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   969
            even in browsers that are capable of using HTML5 history. e.g.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   970
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   971
                http://example.com/#/users/1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   972
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   973
            A single-page or client-side-only app where the server sends a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   974
            "shell" page with JavaScript to the client might have this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   975
            restriction. If you're setting this to `false`, read the following:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   976
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   977
        **Note:** When this is set to `false`, the server will *never* receive
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   978
        the full URL because browsers do not send the fragment-part to the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   979
        server, that is everything after and including the "#".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   980
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   981
        Consider the following example:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   982
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   983
            URL shown in browser: http://example.com/#/users/1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   984
            URL sent to server:   http://example.com/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   985
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   986
        You should feel bad about hurting our precious web if you forcefully set
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   987
        either `serverRouting` or `html5` to `false`, because you're basically
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   988
        punching the web in the face here with your lossy URLs! Please make sure
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   989
        you know what you're doing and that you understand the implications.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   990
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   991
        Ideally you should always prefer full-path URLs (not /#/foo/), and want
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   992
        full-page reloads when the client's browser is not capable of enhancing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   993
        the experience using the HTML5 history APIs. Setting this to `true` is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   994
        the best option for progressive-enhancement (and graceful-degradation).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   995
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   996
        @attribute serverRouting
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   997
        @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   998
        @default undefined
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   999
        @initOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1000
        @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1001
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1002
        serverRouting: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1003
            valueFn  : function () { return Y.App.serverRouting; },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1004
            writeOnce: 'initOnly'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1005
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1006
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1007
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1008
        The node into which this app's `views` will be rendered when they become
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1009
        the `activeView`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1010
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1011
        The view container node serves as the container to hold the app's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1012
        `activeView`. Each time the `activeView` is set via `showView()`, the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1013
        previous view will be removed from this node, and the new active view's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1014
        `container` node will be appended.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1015
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1016
        The default view container is a `<div>` Node, but you can override this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1017
        in a subclass, or by passing in a custom `viewContainer` config value at
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1018
        instantiation time. The `viewContainer` may be provided as a selector
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1019
        string, DOM element, or a `Y.Node` instance (having the `viewContainer`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1020
        and the `container` be the same node is also supported).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1021
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1022
        The app's `render()` method will stamp the view container with the CSS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1023
        class `"yui3-app-views"` and append it to the app's `container` node if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1024
        it isn't already, and any `activeView` will be appended to this node if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1025
        it isn't already.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1026
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1027
        @attribute viewContainer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1028
        @type HTMLElement|Node|String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1029
        @default Y.Node.create(this.containerTemplate)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1030
        @initOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1031
        @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1032
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1033
        viewContainer: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1034
            getter   : '_getViewContainer',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1035
            setter   : Y.one,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1036
            writeOnce: true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1037
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1038
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1039
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1040
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1041
    Properties that shouldn't be turned into ad-hoc attributes when passed to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1042
    App's constructor.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1043
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1044
    @property _NON_ATTRS_CFG
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1045
    @type Array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1046
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1047
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1048
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1049
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1050
    _NON_ATTRS_CFG: ['views']
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1051
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1052
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1053
// -- Namespace ----------------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1054
Y.namespace('App').Base = AppBase;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1055
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1056
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1057
Provides a top-level application component which manages navigation and views.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1058
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1059
This gives you a foundation and structure on which to build your application; it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1060
combines robust URL navigation with powerful routing and flexible view
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1061
management.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1062
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1063
`Y.App` is both a namespace and constructor function. The `Y.App` class is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1064
special in that any `Y.App` class extensions that are included in the YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1065
instance will be **auto-mixed** on to the `Y.App` class. Consider this example:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1066
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1067
    YUI().use('app-base', 'app-transitions', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1068
        // This will create two YUI Apps, `basicApp` will not have transitions,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1069
        // but `fancyApp` will have transitions support included and turn it on.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1070
        var basicApp = new Y.App.Base(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1071
            fancyApp = new Y.App({transitions: true});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1072
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1073
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1074
@class App
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1075
@param {Object} [config] The following are configuration properties that can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1076
    specified _in addition_ to default attribute values and the non-attribute
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1077
    properties provided by `Y.Base`:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1078
  @param {Object} [config.views] Hash of view-name to metadata used to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1079
    declaratively describe an application's views and their relationship with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1080
    the app and other views. The views specified here will override any defaults
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1081
    provided by the `views` object on the `prototype`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1082
@constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1083
@extends App.Base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1084
@uses App.Content
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1085
@uses App.Transitions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1086
@uses PjaxContent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1087
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1088
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1089
Y.App = Y.mix(Y.Base.create('app', AppBase, []), Y.App, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1090
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1091
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1092
CSS classes used by `Y.App`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1093
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1094
@property CLASS_NAMES
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1095
@type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1096
@default {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1097
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1098
@since 3.6.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1099
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1100
Y.App.CLASS_NAMES = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1101
    app  : getClassName('app'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1102
    views: getClassName('app', 'views')
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1103
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1104
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1105
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1106
Default `serverRouting` attribute value for all apps.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1107
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1108
@property serverRouting
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1109
@type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1110
@default undefined
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1111
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1112
@since 3.6.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1113
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1114
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1115
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1116
}, '@VERSION@', {"requires": ["classnamemanager", "pjax-base", "router", "view"]});