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