src/cm/media/js/lib/yui/yui_3.10.3/build/router/router.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 525 89ef5ed3c48b
permissions -rw-r--r--
add link to "privacy policy" in the header test
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('router', function (Y, NAME) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     9
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    10
/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    11
Provides URL-based routing using HTML5 `pushState()` or the location hash.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    12
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    13
@module app
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    14
@submodule router
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    15
@since 3.4.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    16
**/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    17
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    18
var HistoryHash = Y.HistoryHash,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    19
    QS          = Y.QueryString,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    20
    YArray      = Y.Array,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    21
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    22
    win = Y.config.win,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    23
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    24
    // Holds all the active router instances. This supports the static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    25
    // `dispatch()` method which causes all routers to dispatch.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    26
    instances = [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    27
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    28
    // We have to queue up pushState calls to avoid race conditions, since the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    29
    // popstate event doesn't actually provide any info on what URL it's
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    30
    // associated with.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    31
    saveQueue = [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    32
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    33
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    34
    Fired when the router is ready to begin dispatching to route handlers.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    35
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    36
    You shouldn't need to wait for this event unless you plan to implement some
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    37
    kind of custom dispatching logic. It's used internally in order to avoid
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    38
    dispatching to an initial route if a browser history change occurs first.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    39
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    40
    @event ready
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    41
    @param {Boolean} dispatched `true` if routes have already been dispatched
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    42
      (most likely due to a history change).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    43
    @fireOnce
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    44
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    45
    EVT_READY = 'ready';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    46
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    47
/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    48
Provides URL-based routing using HTML5 `pushState()` or the location hash.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    49
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    50
This makes it easy to wire up route handlers for different application states
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    51
while providing full back/forward navigation support and bookmarkable, shareable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    52
URLs.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    53
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    54
@class Router
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    55
@param {Object} [config] Config properties.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    56
    @param {Boolean} [config.html5] Overrides the default capability detection
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    57
        and forces this router to use (`true`) or not use (`false`) HTML5
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    58
        history.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    59
    @param {String} [config.root=''] Root path from which all routes should be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    60
        evaluated.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    61
    @param {Array} [config.routes=[]] Array of route definition objects.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    62
@constructor
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    63
@extends Base
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    64
@since 3.4.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    65
**/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    66
function Router() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    67
    Router.superclass.constructor.apply(this, arguments);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    68
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    69
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    70
Y.Router = Y.extend(Router, Y.Base, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    71
    // -- Protected Properties -------------------------------------------------
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    72
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    73
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    74
    Whether or not `_dispatch()` has been called since this router was
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    75
    instantiated.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    76
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    77
    @property _dispatched
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    78
    @type Boolean
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    79
    @default undefined
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    80
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    81
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    82
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    83
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    84
    Whether or not we're currently in the process of dispatching to routes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    85
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    86
    @property _dispatching
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    87
    @type Boolean
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    88
    @default undefined
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    89
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    90
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    91
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    92
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    93
    History event handle for the `history:change` or `hashchange` event
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    94
    subscription.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    95
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    96
    @property _historyEvents
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    97
    @type EventHandle
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    98
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    99
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   100
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   101
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   102
    Cached copy of the `html5` attribute for internal use.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   103
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   104
    @property _html5
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   105
    @type Boolean
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   106
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   107
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   108
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   109
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   110
    Whether or not the `ready` event has fired yet.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   111
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   112
    @property _ready
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   113
    @type Boolean
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   114
    @default undefined
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   115
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   116
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   117
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   118
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   119
    Regex used to match parameter placeholders in route paths.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   120
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   121
    Subpattern captures:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   122
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   123
      1. Parameter prefix character. Either a `:` for subpath parameters that
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   124
         should only match a single level of a path, or `*` for splat parameters
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   125
         that should match any number of path levels.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   126
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   127
      2. Parameter name, if specified, otherwise it is a wildcard match.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   128
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   129
    @property _regexPathParam
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   130
    @type RegExp
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   131
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   132
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   133
    _regexPathParam: /([:*])([\w\-]+)?/g,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   134
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   135
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   136
    Regex that matches and captures the query portion of a URL, minus the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   137
    preceding `?` character, and discarding the hash portion of the URL if any.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   138
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   139
    @property _regexUrlQuery
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   140
    @type RegExp
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   141
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   142
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   143
    _regexUrlQuery: /\?([^#]*).*$/,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   144
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   145
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   146
    Regex that matches everything before the path portion of a URL (the origin).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   147
    This will be used to strip this part of the URL from a string when we
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   148
    only want the path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   149
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   150
    @property _regexUrlOrigin
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   151
    @type RegExp
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
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   154
    _regexUrlOrigin: /^(?:[^\/#?:]+:\/\/|\/\/)[^\/]*/,
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
        var self = this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   159
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   160
        self._html5  = self.get('html5');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   161
        self._routes = [];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   162
        self._url    = self._getURL();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   163
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   164
        // Necessary because setters don't run on init.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   165
        self._setRoutes(config && config.routes ? config.routes :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   166
                self.get('routes'));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   167
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   168
        // Set up a history instance or hashchange listener.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   169
        if (self._html5) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   170
            self._history       = new Y.HistoryHTML5({force: true});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   171
            self._historyEvents =
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   172
                    Y.after('history:change', self._afterHistoryChange, self);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   173
        } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   174
            self._historyEvents =
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   175
                    Y.on('hashchange', self._afterHistoryChange, win, self);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   176
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   177
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   178
        // Fire a `ready` event once we're ready to route. We wait first for all
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   179
        // subclass initializers to finish, then for window.onload, and then an
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   180
        // additional 20ms to allow the browser to fire a useless initial
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   181
        // `popstate` event if it wants to (and Chrome always wants to).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   182
        self.publish(EVT_READY, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   183
            defaultFn  : self._defReadyFn,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   184
            fireOnce   : true,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   185
            preventable: false
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   186
        });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   187
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   188
        self.once('initializedChange', function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   189
            Y.once('load', function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   190
                setTimeout(function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   191
                    self.fire(EVT_READY, {dispatched: !!self._dispatched});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   192
                }, 20);
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
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   196
        // Store this router in the collection of all active router instances.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   197
        instances.push(this);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   198
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   199
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   200
    destructor: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   201
        var instanceIndex = YArray.indexOf(instances, this);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   202
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   203
        // Remove this router from the collection of active router instances.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   204
        if (instanceIndex > -1) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   205
            instances.splice(instanceIndex, 1);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   206
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   207
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   208
        if (this._historyEvents) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   209
            this._historyEvents.detach();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   210
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   211
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   212
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   213
    // -- Public Methods -------------------------------------------------------
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   214
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   215
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   216
    Dispatches to the first route handler that matches the current URL, if any.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   217
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   218
    If `dispatch()` is called before the `ready` event has fired, it will
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   219
    automatically wait for the `ready` event before dispatching. Otherwise it
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   220
    will dispatch immediately.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   221
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   222
    @method dispatch
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   223
    @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   224
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   225
    dispatch: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   226
        this.once(EVT_READY, function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   227
            this._ready = true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   228
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   229
            if (!this.upgrade()) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   230
                this._dispatch(this._getPath(), this._getURL());
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   231
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   232
        });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   233
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   234
        return this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   235
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   236
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   237
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   238
    Gets the current route path, relative to the `root` (if any).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   239
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   240
    @method getPath
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   241
    @return {String} Current route path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   242
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   243
    getPath: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   244
        return this._getPath();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   245
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   246
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   247
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   248
    Returns `true` if this router has at least one route that matches the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   249
    specified URL, `false` otherwise.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   250
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   251
    This method enforces the same-origin security constraint on the specified
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   252
    `url`; any URL which is not from the same origin as the current URL will
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   253
    always return `false`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   254
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   255
    @method hasRoute
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   256
    @param {String} url URL to match.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   257
    @return {Boolean} `true` if there's at least one matching route, `false`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   258
      otherwise.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   259
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   260
    hasRoute: function (url) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   261
        var path;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   262
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   263
        if (!this._hasSameOrigin(url)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   264
            return false;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   265
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   266
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   267
        if (!this._html5) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   268
            url = this._upgradeURL(url);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   269
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   270
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   271
        path = this.removeQuery(this.removeRoot(url));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   272
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   273
        return !!this.match(path).length;
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
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   277
    Returns an array of route objects that match the specified URL path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   278
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   279
    This method is called internally to determine which routes match the current
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   280
    path whenever the URL changes. You may override it if you want to customize
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   281
    the route matching logic, although this usually shouldn't be necessary.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   282
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   283
    Each returned route object has the following properties:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   284
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   285
      * `callback`: A function or a string representing the name of a function
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   286
        this router that should be executed when the route is triggered.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   287
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   288
      * `keys`: An array of strings representing the named parameters defined in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   289
        the route's path specification, if any.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   290
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   291
      * `path`: The route's path specification, which may be either a string or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   292
        a regex.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   293
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   294
      * `regex`: A regular expression version of the route's path specification.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   295
        This regex is used to determine whether the route matches a given path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   296
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   297
    @example
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   298
        router.route('/foo', function () {});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   299
        router.match('/foo');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   300
        // => [{callback: ..., keys: [], path: '/foo', regex: ...}]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   301
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   302
    @method match
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   303
    @param {String} path URL path to match.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   304
    @return {Object[]} Array of route objects that match the specified path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   305
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   306
    match: function (path) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   307
        return YArray.filter(this._routes, function (route) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   308
            return path.search(route.regex) > -1;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   309
        });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   310
    },
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
    Removes the `root` URL from the front of _url_ (if it's there) and returns
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   314
    the result. The returned path will always have a leading `/`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   315
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   316
    @method removeRoot
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   317
    @param {String} url URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   318
    @return {String} Rootless path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   319
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   320
    removeRoot: function (url) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   321
        var root = this.get('root');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   322
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   323
        // Strip out the non-path part of the URL, if any (e.g.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   324
        // "http://foo.com"), so that we're left with just the path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   325
        url = url.replace(this._regexUrlOrigin, '');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   326
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   327
        if (root && url.indexOf(root) === 0) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   328
            url = url.substring(root.length);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   329
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   330
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   331
        return url.charAt(0) === '/' ? url : '/' + url;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   332
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   333
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   334
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   335
    Removes a query string from the end of the _url_ (if one exists) and returns
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   336
    the result.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   337
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   338
    @method removeQuery
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   339
    @param {String} url URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   340
    @return {String} Queryless path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   341
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   342
    removeQuery: function (url) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   343
        return url.replace(/\?.*$/, '');
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
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   347
    Replaces the current browser history entry with a new one, and dispatches to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   348
    the first matching route handler, if any.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   349
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   350
    Behind the scenes, this method uses HTML5 `pushState()` in browsers that
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   351
    support it (or the location hash in older browsers and IE) to change the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   352
    URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   353
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   354
    The specified URL must share the same origin (i.e., protocol, host, and
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   355
    port) as the current page, or an error will occur.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   356
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   357
    @example
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   358
        // Starting URL: http://example.com/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   359
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   360
        router.replace('/path/');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   361
        // New URL: http://example.com/path/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   362
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   363
        router.replace('/path?foo=bar');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   364
        // New URL: http://example.com/path?foo=bar
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   365
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   366
        router.replace('/');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   367
        // New URL: http://example.com/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   368
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   369
    @method replace
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   370
    @param {String} [url] URL to set. This URL needs to be of the same origin as
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   371
      the current URL. This can be a URL relative to the router's `root`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   372
      attribute. If no URL is specified, the page's current URL will be used.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   373
    @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   374
    @see save()
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   375
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   376
    replace: function (url) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   377
        return this._queue(url, true);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   378
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   379
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   380
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   381
    Adds a route handler for the specified URL _path_.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   382
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   383
    The _path_ parameter may be either a string or a regular expression. If it's
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   384
    a string, it may contain named parameters: `:param` will match any single
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   385
    part of a URL path (not including `/` characters), and `*param` will match
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   386
    any number of parts of a URL path (including `/` characters). These named
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   387
    parameters will be made available as keys on the `req.params` object that's
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   388
    passed to route handlers.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   389
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   390
    If the _path_ parameter is a regex, all pattern matches will be made
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   391
    available as numbered keys on `req.params`, starting with `0` for the full
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   392
    match, then `1` for the first subpattern match, and so on.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   393
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   394
    Here's a set of sample routes along with URL paths that they match:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   395
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   396
      * Route: `/photos/:tag/:page`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   397
        * URL: `/photos/kittens/1`, params: `{tag: 'kittens', page: '1'}`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   398
        * URL: `/photos/puppies/2`, params: `{tag: 'puppies', page: '2'}`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   399
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   400
      * Route: `/file/*path`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   401
        * URL: `/file/foo/bar/baz.txt`, params: `{path: 'foo/bar/baz.txt'}`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   402
        * URL: `/file/foo`, params: `{path: 'foo'}`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   403
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   404
    **Middleware**: Routes also support an arbitrary number of callback
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   405
    functions. This allows you to easily reuse parts of your route-handling code
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   406
    with different route. This method is liberal in how it processes the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   407
    specified `callbacks`, you can specify them as separate arguments, or as
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   408
    arrays, or both.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   409
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   410
    If multiple route match a given URL, they will be executed in the order they
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   411
    were added. The first route that was added will be the first to be executed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   412
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   413
    **Passing Control**: Invoking the `next()` function within a route callback
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   414
    will pass control to the next callback function (if any) or route handler
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   415
    (if any). If a value is passed to `next()`, it's assumed to be an error,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   416
    therefore stopping the dispatch chain, unless that value is: `"route"`,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   417
    which is special case and dispatching will skip to the next route handler.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   418
    This allows middleware to skip any remaining middleware for a particular
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   419
    route.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   420
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   421
    @example
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   422
        router.route('/photos/:tag/:page', function (req, res, next) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   423
        });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   424
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   425
        // Using middleware.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   426
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   427
        router.findUser = function (req, res, next) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   428
            req.user = this.get('users').findById(req.params.user);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   429
            next();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   430
        };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   431
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   432
        router.route('/users/:user', 'findUser', function (req, res, next) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   433
            // The `findUser` middleware puts the `user` object on the `req`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   434
        });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   435
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   436
    @method route
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   437
    @param {String|RegExp} path Path to match. May be a string or a regular
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   438
      expression.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   439
    @param {Array|Function|String} callbacks* Callback functions to call
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   440
        whenever this route is triggered. These can be specified as separate
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   441
        arguments, or in arrays, or both. If a callback is specified as a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   442
        string, the named function will be called on this router instance.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   443
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   444
      @param {Object} callbacks.req Request object containing information about
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   445
          the request. It contains the following properties.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   446
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   447
        @param {Array|Object} callbacks.req.params Captured parameters matched by
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   448
          the route path specification. If a string path was used and contained
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   449
          named parameters, then this will be a key/value hash mapping parameter
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   450
          names to their matched values. If a regex path was used, this will be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   451
          an array of subpattern matches starting at index 0 for the full match,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   452
          then 1 for the first subpattern match, and so on.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   453
        @param {String} callbacks.req.path The current URL path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   454
        @param {Number} callbacks.req.pendingCallbacks Number of remaining
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   455
          callbacks the route handler has after this one in the dispatch chain.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   456
        @param {Number} callbacks.req.pendingRoutes Number of matching routes
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   457
          after this one in the dispatch chain.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   458
        @param {Object} callbacks.req.query Query hash representing the URL
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   459
          query string, if any. Parameter names are keys, and are mapped to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   460
          parameter values.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   461
        @param {String} callbacks.req.url The full URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   462
        @param {String} callbacks.req.src What initiated the dispatch. In an
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   463
          HTML5 browser, when the back/forward buttons are used, this property
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   464
          will have a value of "popstate".
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   465
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   466
      @param {Object} callbacks.res Response object containing methods and
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   467
          information that relate to responding to a request. It contains the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   468
          following properties.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   469
        @param {Object} callbacks.res.req Reference to the request object.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   470
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   471
      @param {Function} callbacks.next Function to pass control to the next
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   472
          callback or the next matching route if no more callbacks (middleware)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   473
          exist for the current route handler. If you don't call this function,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   474
          then no further callbacks or route handlers will be executed, even if
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   475
          there are more that match. If you do call this function, then the next
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   476
          callback (if any) or matching route handler (if any) will be called.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   477
          All of these functions will receive the same `req` and `res` objects
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   478
          that were passed to this route (so you can use these objects to pass
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   479
          data along to subsequent callbacks and routes).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   480
        @param {String} [callbacks.next.err] Optional error which will stop the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   481
          dispatch chaining for this `req`, unless the value is `"route"`, which
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   482
          is special cased to jump skip past any callbacks for the current route
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   483
          and pass control the next route handler.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   484
    @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   485
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   486
    route: function (path, callbacks) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   487
        callbacks = YArray.flatten(YArray(arguments, 1, true));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   488
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   489
        var keys = [];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   490
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   491
        this._routes.push({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   492
            callbacks: callbacks,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   493
            keys     : keys,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   494
            path     : path,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   495
            regex    : this._getRegex(path, keys),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   496
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   497
            // For back-compat.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   498
            callback: callbacks[0]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   499
        });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   500
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   501
        return this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   502
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   503
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   504
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   505
    Saves a new browser history entry and dispatches to the first matching route
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   506
    handler, if any.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   507
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   508
    Behind the scenes, this method uses HTML5 `pushState()` in browsers that
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   509
    support it (or the location hash in older browsers and IE) to change the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   510
    URL and create a history entry.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   511
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   512
    The specified URL must share the same origin (i.e., protocol, host, and
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   513
    port) as the current page, or an error will occur.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   514
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   515
    @example
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   516
        // Starting URL: http://example.com/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   517
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   518
        router.save('/path/');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   519
        // New URL: http://example.com/path/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   520
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   521
        router.save('/path?foo=bar');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   522
        // New URL: http://example.com/path?foo=bar
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   523
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   524
        router.save('/');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   525
        // New URL: http://example.com/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   526
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   527
    @method save
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   528
    @param {String} [url] URL to set. This URL needs to be of the same origin as
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   529
      the current URL. This can be a URL relative to the router's `root`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   530
      attribute. If no URL is specified, the page's current URL will be used.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   531
    @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   532
    @see replace()
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   533
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   534
    save: function (url) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   535
        return this._queue(url);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   536
    },
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
    Upgrades a hash-based URL to an HTML5 URL if necessary. In non-HTML5
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   540
    browsers, this method is a noop.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   541
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   542
    @method upgrade
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   543
    @return {Boolean} `true` if the URL was upgraded, `false` otherwise.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   544
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   545
    upgrade: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   546
        if (!this._html5) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   547
            return false;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   548
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   549
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   550
        // Get the resolve hash path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   551
        var hashPath = this._getHashPath();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   552
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   553
        if (hashPath) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   554
            // This is an HTML5 browser and we have a hash-based path in the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   555
            // URL, so we need to upgrade the URL to a non-hash URL. This
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   556
            // will trigger a `history:change` event, which will in turn
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   557
            // trigger a dispatch.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   558
            this.once(EVT_READY, function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   559
                this.replace(hashPath);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   560
            });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   561
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   562
            return true;
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
        return false;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   566
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   567
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   568
    // -- Protected Methods ----------------------------------------------------
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   569
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   570
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   571
    Wrapper around `decodeURIComponent` that also converts `+` chars into
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   572
    spaces.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   573
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   574
    @method _decode
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   575
    @param {String} string String to decode.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   576
    @return {String} Decoded string.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   577
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   578
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   579
    _decode: function (string) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   580
        return decodeURIComponent(string.replace(/\+/g, ' '));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   581
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   582
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   583
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   584
    Shifts the topmost `_save()` call off the queue and executes it. Does
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   585
    nothing if the queue is empty.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   586
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   587
    @method _dequeue
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   588
    @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   589
    @see _queue
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   590
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   591
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   592
    _dequeue: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   593
        var self = this,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   594
            fn;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   595
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   596
        // If window.onload hasn't yet fired, wait until it has before
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   597
        // dequeueing. This will ensure that we don't call pushState() before an
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   598
        // initial popstate event has fired.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   599
        if (!YUI.Env.windowLoaded) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   600
            Y.once('load', function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   601
                self._dequeue();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   602
            });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   603
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   604
            return this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   605
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   606
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   607
        fn = saveQueue.shift();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   608
        return fn ? fn() : this;
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
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   612
    Dispatches to the first route handler that matches the specified _path_.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   613
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   614
    If called before the `ready` event has fired, the dispatch will be aborted.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   615
    This ensures normalized behavior between Chrome (which fires a `popstate`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   616
    event on every pageview) and other browsers (which do not).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   617
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   618
    @method _dispatch
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   619
    @param {String} path URL path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   620
    @param {String} url Full URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   621
    @param {String} src What initiated the dispatch.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   622
    @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   623
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   624
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   625
    _dispatch: function (path, url, src) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   626
        var self      = this,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   627
            decode    = self._decode,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   628
            routes    = self.match(path),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   629
            callbacks = [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   630
            matches, req, res;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   631
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   632
        self._dispatching = self._dispatched = true;
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 (!routes || !routes.length) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   635
            self._dispatching = false;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   636
            return self;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   637
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   638
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   639
        req = self._getRequest(path, url, src);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   640
        res = self._getResponse(req);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   641
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   642
        req.next = function (err) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   643
            var callback, name, route;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   644
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   645
            if (err) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   646
                // Special case "route" to skip to the next route handler
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   647
                // avoiding any additional callbacks for the current route.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   648
                if (err === 'route') {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   649
                    callbacks = [];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   650
                    req.next();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   651
                } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   652
                    Y.error(err);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   653
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   654
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   655
            } else if ((callback = callbacks.shift())) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   656
                if (typeof callback === 'string') {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   657
                    name     = callback;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   658
                    callback = self[name];
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 (!callback) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   661
                        Y.error('Router: Callback not found: ' + name, null, 'router');
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
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   665
                // Allow access to the number of remaining callbacks for the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   666
                // route.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   667
                req.pendingCallbacks = callbacks.length;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   668
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   669
                callback.call(self, req, res, req.next);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   670
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   671
            } else if ((route = routes.shift())) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   672
                // Make a copy of this route's `callbacks` so the original array
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   673
                // is preserved.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   674
                callbacks = route.callbacks.concat();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   675
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   676
                // Decode each of the path matches so that the any URL-encoded
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   677
                // path segments are decoded in the `req.params` object.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   678
                matches = YArray.map(route.regex.exec(path) || [], decode);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   679
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   680
                // Use named keys for parameter names if the route path contains
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   681
                // named keys. Otherwise, use numerical match indices.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   682
                if (matches.length === route.keys.length + 1) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   683
                    req.params = YArray.hash(route.keys, matches.slice(1));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   684
                } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   685
                    req.params = matches.concat();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   686
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   687
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   688
                // Allow access to the number of remaining routes for this
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   689
                // request.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   690
                req.pendingRoutes = routes.length;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   691
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   692
                // Execute this route's `callbacks`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   693
                req.next();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   694
            }
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
        req.next();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   698
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   699
        self._dispatching = false;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   700
        return self._dequeue();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   701
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   702
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   703
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   704
    Returns the resolved path from the hash fragment, or an empty string if the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   705
    hash is not path-like.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   706
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   707
    @method _getHashPath
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   708
    @param {String} [hash] Hash fragment to resolve into a path. By default this
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   709
        will be the hash from the current URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   710
    @return {String} Current hash path, or an empty string if the hash is empty.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   711
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   712
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   713
    _getHashPath: function (hash) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   714
        hash || (hash = HistoryHash.getHash());
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   715
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   716
        // Make sure the `hash` is path-like.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   717
        if (hash && hash.charAt(0) === '/') {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   718
            return this._joinURL(hash);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   719
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   720
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   721
        return '';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   722
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   723
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   724
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   725
    Gets the location origin (i.e., protocol, host, and port) as a URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   726
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   727
    @example
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   728
        http://example.com
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   729
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   730
    @method _getOrigin
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   731
    @return {String} Location origin (i.e., protocol, host, and port).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   732
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   733
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   734
    _getOrigin: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   735
        var location = Y.getLocation();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   736
        return location.origin || (location.protocol + '//' + location.host);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   737
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   738
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   739
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   740
    Gets the current route path, relative to the `root` (if any).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   741
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   742
    @method _getPath
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   743
    @return {String} Current route path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   744
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   745
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   746
    _getPath: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   747
        var path = (!this._html5 && this._getHashPath()) ||
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   748
                Y.getLocation().pathname;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   749
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   750
        return this.removeQuery(this.removeRoot(path));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   751
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   752
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   753
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   754
    Returns the current path root after popping off the last path segment,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   755
    making it useful for resolving other URL paths against.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   756
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   757
    The path root will always begin and end with a '/'.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   758
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   759
    @method _getPathRoot
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   760
    @return {String} The URL's path root.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   761
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   762
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   763
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   764
    _getPathRoot: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   765
        var slash = '/',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   766
            path  = Y.getLocation().pathname,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   767
            segments;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   768
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   769
        if (path.charAt(path.length - 1) === slash) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   770
            return path;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   771
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   772
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   773
        segments = path.split(slash);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   774
        segments.pop();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   775
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   776
        return segments.join(slash) + slash;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   777
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   778
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   779
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   780
    Gets the current route query string.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   781
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   782
    @method _getQuery
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   783
    @return {String} Current route query string.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   784
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   785
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   786
    _getQuery: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   787
        var location = Y.getLocation(),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   788
            hash, matches;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   789
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   790
        if (this._html5) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   791
            return location.search.substring(1);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   792
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   793
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   794
        hash    = HistoryHash.getHash();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   795
        matches = hash.match(this._regexUrlQuery);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   796
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   797
        return hash && matches ? matches[1] : location.search.substring(1);
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
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   801
    Creates a regular expression from the given route specification. If _path_
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   802
    is already a regex, it will be returned unmodified.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   803
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   804
    @method _getRegex
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   805
    @param {String|RegExp} path Route path specification.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   806
    @param {Array} keys Array reference to which route parameter names will be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   807
      added.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   808
    @return {RegExp} Route regex.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   809
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   810
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   811
    _getRegex: function (path, keys) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   812
        if (path instanceof RegExp) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   813
            return path;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   814
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   815
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   816
        // Special case for catchall paths.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   817
        if (path === '*') {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   818
            return (/.*/);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   819
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   820
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   821
        path = path.replace(this._regexPathParam, function (match, operator, key) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   822
            // Only `*` operators are supported for key-less matches to allowing
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   823
            // in-path wildcards like: '/foo/*'.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   824
            if (!key) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   825
                return operator === '*' ? '.*' : match;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   826
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   827
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   828
            keys.push(key);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   829
            return operator === '*' ? '(.*?)' : '([^/#?]*)';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   830
        });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   831
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   832
        return new RegExp('^' + path + '$');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   833
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   834
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   835
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   836
    Gets a request object that can be passed to a route handler.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   837
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   838
    @method _getRequest
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   839
    @param {String} path Current path being dispatched.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   840
    @param {String} url Current full URL being dispatched.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   841
    @param {String} src What initiated the dispatch.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   842
    @return {Object} Request object.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   843
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   844
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   845
    _getRequest: function (path, url, src) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   846
        return {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   847
            path : path,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   848
            query: this._parseQuery(this._getQuery()),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   849
            url  : url,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   850
            src  : src
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   851
        };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   852
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   853
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   854
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   855
    Gets a response object that can be passed to a route handler.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   856
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   857
    @method _getResponse
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   858
    @param {Object} req Request object.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   859
    @return {Object} Response Object.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   860
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   861
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   862
    _getResponse: function (req) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   863
        // For backwards compatibility, the response object is a function that
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   864
        // calls `next()` on the request object and returns the result.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   865
        var res = function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   866
            return req.next.apply(this, arguments);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   867
        };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   868
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   869
        res.req = req;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   870
        return res;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   871
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   872
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   873
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   874
    Getter for the `routes` attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   875
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   876
    @method _getRoutes
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   877
    @return {Object[]} Array of route objects.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   878
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   879
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   880
    _getRoutes: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   881
        return this._routes.concat();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   882
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   883
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   884
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   885
    Gets the current full URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   886
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   887
    @method _getURL
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   888
    @return {String} URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   889
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   890
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   891
    _getURL: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   892
        var url = Y.getLocation().toString();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   893
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   894
        if (!this._html5) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   895
            url = this._upgradeURL(url);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   896
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   897
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   898
        return url;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   899
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   900
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   901
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   902
    Returns `true` when the specified `url` is from the same origin as the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   903
    current URL; i.e., the protocol, host, and port of the URLs are the same.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   904
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   905
    All host or path relative URLs are of the same origin. A scheme-relative URL
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   906
    is first prefixed with the current scheme before being evaluated.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   907
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   908
    @method _hasSameOrigin
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   909
    @param {String} url URL to compare origin with the current URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   910
    @return {Boolean} Whether the URL has the same origin of the current URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   911
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   912
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   913
    _hasSameOrigin: function (url) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   914
        var origin = ((url && url.match(this._regexUrlOrigin)) || [])[0];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   915
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   916
        // Prepend current scheme to scheme-relative URLs.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   917
        if (origin && origin.indexOf('//') === 0) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   918
            origin = Y.getLocation().protocol + origin;
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
        return !origin || origin === this._getOrigin();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   922
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   923
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   924
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   925
    Joins the `root` URL to the specified _url_, normalizing leading/trailing
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   926
    `/` characters.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   927
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   928
    @example
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   929
        router.set('root', '/foo');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   930
        router._joinURL('bar');  // => '/foo/bar'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   931
        router._joinURL('/bar'); // => '/foo/bar'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   932
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   933
        router.set('root', '/foo/');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   934
        router._joinURL('bar');  // => '/foo/bar'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   935
        router._joinURL('/bar'); // => '/foo/bar'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   936
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   937
    @method _joinURL
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   938
    @param {String} url URL to append to the `root` URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   939
    @return {String} Joined URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   940
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   941
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   942
    _joinURL: function (url) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   943
        var root = this.get('root');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   944
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   945
        // Causes `url` to _always_ begin with a "/".
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   946
        url = this.removeRoot(url);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   947
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   948
        if (url.charAt(0) === '/') {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   949
            url = url.substring(1);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   950
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   951
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   952
        return root && root.charAt(root.length - 1) === '/' ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   953
                root + url :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   954
                root + '/' + url;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   955
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   956
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   957
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   958
    Returns a normalized path, ridding it of any '..' segments and properly
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   959
    handling leading and trailing slashes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   960
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   961
    @method _normalizePath
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   962
    @param {String} path URL path to normalize.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   963
    @return {String} Normalized path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   964
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   965
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   966
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   967
    _normalizePath: function (path) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   968
        var dots  = '..',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   969
            slash = '/',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   970
            i, len, normalized, segments, segment, stack;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   971
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   972
        if (!path || path === slash) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   973
            return slash;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   974
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   975
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   976
        segments = path.split(slash);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   977
        stack    = [];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   978
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   979
        for (i = 0, len = segments.length; i < len; ++i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   980
            segment = segments[i];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   981
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   982
            if (segment === dots) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   983
                stack.pop();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   984
            } else if (segment) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   985
                stack.push(segment);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   986
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   987
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   988
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   989
        normalized = slash + stack.join(slash);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   990
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   991
        // Append trailing slash if necessary.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   992
        if (normalized !== slash && path.charAt(path.length - 1) === slash) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   993
            normalized += slash;
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
        return normalized;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   997
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   998
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   999
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1000
    Parses a URL query string into a key/value hash. If `Y.QueryString.parse` is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1001
    available, this method will be an alias to that.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1002
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1003
    @method _parseQuery
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1004
    @param {String} query Query string to parse.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1005
    @return {Object} Hash of key/value pairs for query parameters.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1006
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1007
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1008
    _parseQuery: QS && QS.parse ? QS.parse : function (query) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1009
        var decode = this._decode,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1010
            params = query.split('&'),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1011
            i      = 0,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1012
            len    = params.length,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1013
            result = {},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1014
            param;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1015
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1016
        for (; i < len; ++i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1017
            param = params[i].split('=');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1018
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1019
            if (param[0]) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1020
                result[decode(param[0])] = decode(param[1] || '');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1021
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1022
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1023
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1024
        return result;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1025
    },
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
    Queues up a `_save()` call to run after all previously-queued calls have
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1029
    finished.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1030
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1031
    This is necessary because if we make multiple `_save()` calls before the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1032
    first call gets dispatched, then both calls will dispatch to the last call's
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1033
    URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1034
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1035
    All arguments passed to `_queue()` will be passed on to `_save()` when the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1036
    queued function is executed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1037
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1038
    @method _queue
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1039
    @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1040
    @see _dequeue
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1041
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1042
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1043
    _queue: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1044
        var args = arguments,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1045
            self = this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1046
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1047
        saveQueue.push(function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1048
            if (self._html5) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1049
                if (Y.UA.ios && Y.UA.ios < 5) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1050
                    // iOS <5 has buggy HTML5 history support, and needs to be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1051
                    // synchronous.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1052
                    self._save.apply(self, args);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1053
                } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1054
                    // Wrapped in a timeout to ensure that _save() calls are
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1055
                    // always processed asynchronously. This ensures consistency
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1056
                    // between HTML5- and hash-based history.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1057
                    setTimeout(function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1058
                        self._save.apply(self, args);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1059
                    }, 1);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1060
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1061
            } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1062
                self._dispatching = true; // otherwise we'll dequeue too quickly
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1063
                self._save.apply(self, args);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1064
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1065
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1066
            return self;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1067
        });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1068
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1069
        return !this._dispatching ? this._dequeue() : this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1070
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1071
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1072
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1073
    Returns the normalized result of resolving the `path` against the current
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1074
    path. Falsy values for `path` will return just the current path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1075
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1076
    @method _resolvePath
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1077
    @param {String} path URL path to resolve.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1078
    @return {String} Resolved path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1079
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1080
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1081
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1082
    _resolvePath: function (path) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1083
        if (!path) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1084
            return Y.getLocation().pathname;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1085
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1086
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1087
        if (path.charAt(0) !== '/') {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1088
            path = this._getPathRoot() + path;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1089
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1090
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1091
        return this._normalizePath(path);
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
    Resolves the specified URL against the current URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1096
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1097
    This method resolves URLs like a browser does and will always return an
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1098
    absolute URL. When the specified URL is already absolute, it is assumed to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1099
    be fully resolved and is simply returned as is. Scheme-relative URLs are
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1100
    prefixed with the current protocol. Relative URLs are giving the current
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1101
    URL's origin and are resolved and normalized against the current path root.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1102
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1103
    @method _resolveURL
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1104
    @param {String} url URL to resolve.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1105
    @return {String} Resolved URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1106
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1107
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1108
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1109
    _resolveURL: function (url) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1110
        var parts    = url && url.match(this._regexURL),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1111
            origin, path, query, hash, resolved;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1112
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1113
        if (!parts) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1114
            return Y.getLocation().toString();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1115
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1116
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1117
        origin = parts[1];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1118
        path   = parts[2];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1119
        query  = parts[3];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1120
        hash   = parts[4];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1121
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1122
        // Absolute and scheme-relative URLs are assumed to be fully-resolved.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1123
        if (origin) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1124
            // Prepend the current scheme for scheme-relative URLs.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1125
            if (origin.indexOf('//') === 0) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1126
                origin = Y.getLocation().protocol + origin;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1127
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1128
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1129
            return origin + (path || '/') + (query || '') + (hash || '');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1130
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1131
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1132
        // Will default to the current origin and current path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1133
        resolved = this._getOrigin() + this._resolvePath(path);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1134
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1135
        // A path or query for the specified URL trumps the current URL's.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1136
        if (path || query) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1137
            return resolved + (query || '') + (hash || '');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1138
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1139
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1140
        query = this._getQuery();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1141
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1142
        return resolved + (query ? ('?' + query) : '') + (hash || '');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1143
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1144
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1145
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1146
    Saves a history entry using either `pushState()` or the location hash.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1147
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1148
    This method enforces the same-origin security constraint; attempting to save
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1149
    a `url` that is not from the same origin as the current URL will result in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1150
    an error.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1151
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1152
    @method _save
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1153
    @param {String} [url] URL for the history entry.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1154
    @param {Boolean} [replace=false] If `true`, the current history entry will
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1155
      be replaced instead of a new one being added.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1156
    @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1157
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1158
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1159
    _save: function (url, replace) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1160
        var urlIsString = typeof url === 'string',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1161
            currentPath, root, hash;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1162
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1163
        // Perform same-origin check on the specified URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1164
        if (urlIsString && !this._hasSameOrigin(url)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1165
            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
  1166
            return this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1167
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1168
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1169
        // Joins the `url` with the `root`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1170
        if (urlIsString) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1171
            url = this._joinURL(url);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1172
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1173
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1174
        // Force _ready to true to ensure that the history change is handled
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1175
        // even if _save is called before the `ready` event fires.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1176
        this._ready = true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1177
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1178
        if (this._html5) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1179
            this._history[replace ? 'replace' : 'add'](null, {url: url});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1180
        } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1181
            currentPath = Y.getLocation().pathname;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1182
            root        = this.get('root');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1183
            hash        = HistoryHash.getHash();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1184
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1185
            if (!urlIsString) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1186
                url = hash;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1187
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1188
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1189
            // Determine if the `root` already exists in the current location's
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1190
            // `pathname`, and if it does then we can exclude it from the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1191
            // hash-based path. No need to duplicate the info in the URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1192
            if (root === currentPath || root === this._getPathRoot()) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1193
                url = this.removeRoot(url);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1194
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1195
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1196
            // The `hashchange` event only fires when the new hash is actually
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1197
            // different. This makes sure we'll always dequeue and dispatch
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1198
            // _all_ router instances, mimicking the HTML5 behavior.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1199
            if (url === hash) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1200
                Y.Router.dispatch();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1201
            } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1202
                HistoryHash[replace ? 'replaceHash' : 'setHash'](url);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1203
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1204
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1205
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1206
        return this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1207
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1208
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1209
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1210
    Setter for the `routes` attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1211
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1212
    @method _setRoutes
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1213
    @param {Object[]} routes Array of route objects.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1214
    @return {Object[]} Array of route objects.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1215
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1216
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1217
    _setRoutes: function (routes) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1218
        this._routes = [];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1219
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1220
        YArray.each(routes, function (route) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1221
            // Makes sure to check `callback` for back-compat.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1222
            var callbacks = route.callbacks || route.callback;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1223
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1224
            this.route(route.path, callbacks);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1225
        }, this);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1226
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1227
        return this._routes.concat();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1228
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1229
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1230
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1231
    Upgrades a hash-based URL to a full-path URL, if necessary.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1232
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1233
    The specified `url` will be upgraded if its of the same origin as the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1234
    current URL and has a path-like hash. URLs that don't need upgrading will be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1235
    returned as-is.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1236
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1237
    @example
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1238
        app._upgradeURL('http://example.com/#/foo/'); // => 'http://example.com/foo/';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1239
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1240
    @method _upgradeURL
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1241
    @param {String} url The URL to upgrade from hash-based to full-path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1242
    @return {String} The upgraded URL, or the specified URL untouched.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1243
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1244
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1245
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1246
    _upgradeURL: function (url) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1247
        // We should not try to upgrade paths for external URLs.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1248
        if (!this._hasSameOrigin(url)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1249
            return url;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1250
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1251
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1252
        var hash       = (url.match(/#(.*)$/) || [])[1] || '',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1253
            hashPrefix = Y.HistoryHash.hashPrefix,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1254
            hashPath;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1255
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1256
        // Strip any hash prefix, like hash-bangs.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1257
        if (hashPrefix && hash.indexOf(hashPrefix) === 0) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1258
            hash = hash.replace(hashPrefix, '');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1259
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1260
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1261
        // If the hash looks like a URL path, assume it is, and upgrade it!
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1262
        if (hash) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1263
            hashPath = this._getHashPath(hash);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1264
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1265
            if (hashPath) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1266
                return this._resolveURL(hashPath);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1267
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1268
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1269
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1270
        return url;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1271
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1272
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1273
    // -- Protected Event Handlers ---------------------------------------------
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1274
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1275
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1276
    Handles `history:change` and `hashchange` events.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1277
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1278
    @method _afterHistoryChange
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1279
    @param {EventFacade} e
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1280
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1281
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1282
    _afterHistoryChange: function (e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1283
        var self       = this,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1284
            src        = e.src,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1285
            prevURL    = self._url,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1286
            currentURL = self._getURL();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1287
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1288
        self._url = currentURL;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1289
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1290
        // Handles the awkwardness that is the `popstate` event. HTML5 browsers
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1291
        // fire `popstate` right before they fire `hashchange`, and Chrome fires
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1292
        // `popstate` on page load. If this router is not ready or the previous
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1293
        // and current URLs only differ by their hash, then we want to ignore
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1294
        // this `popstate` event.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1295
        if (src === 'popstate' &&
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1296
                (!self._ready || prevURL.replace(/#.*$/, '') === currentURL.replace(/#.*$/, ''))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1297
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1298
            return;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1299
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1300
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1301
        self._dispatch(self._getPath(), currentURL, src);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1302
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1303
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1304
    // -- Default Event Handlers -----------------------------------------------
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1305
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1306
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1307
    Default handler for the `ready` event.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1308
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1309
    @method _defReadyFn
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1310
    @param {EventFacade} e
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1311
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1312
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1313
    _defReadyFn: function (e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1314
        this._ready = true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1315
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1316
}, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1317
    // -- Static Properties ----------------------------------------------------
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1318
    NAME: 'router',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1319
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1320
    ATTRS: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1321
        /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1322
        Whether or not this browser is capable of using HTML5 history.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1323
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1324
        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
  1325
        HTML5 browsers, but please don't do this unless you understand the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1326
        consequences.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1327
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1328
        @attribute html5
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1329
        @type Boolean
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1330
        @initOnly
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1331
        **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1332
        html5: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1333
            // Android versions lower than 3.0 are buggy and don't update
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1334
            // window.location after a pushState() call, so we fall back to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1335
            // hash-based history for them.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1336
            //
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1337
            // See http://code.google.com/p/android/issues/detail?id=17471
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1338
            valueFn: function () { return Y.Router.html5; },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1339
            writeOnce: 'initOnly'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1340
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1341
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1342
        /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1343
        Absolute root path from which all routes should be evaluated.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1344
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1345
        For example, if your router is running on a page at
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1346
        `http://example.com/myapp/` and you add a route with the path `/`, your
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1347
        route will never execute, because the path will always be preceded by
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1348
        `/myapp`. Setting `root` to `/myapp` would cause all routes to be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1349
        evaluated relative to that root URL, so the `/` route would then execute
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1350
        when the user browses to `http://example.com/myapp/`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1351
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1352
        @attribute root
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1353
        @type String
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1354
        @default `''`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1355
        **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1356
        root: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1357
            value: ''
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1358
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1359
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1360
        /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1361
        Array of route objects.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1362
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1363
        Each item in the array must be an object with the following properties:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1364
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1365
          * `path`: String or regex representing the path to match. See the docs
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1366
            for the `route()` method for more details.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1367
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1368
          * `callbacks`: Function or a string representing the name of a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1369
            function on this router instance that should be called when the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1370
            route is triggered. An array of functions and/or strings may also be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1371
            provided. See the docs for the `route()` method for more details.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1372
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1373
        This attribute is intended to be used to set routes at init time, or to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1374
        completely reset all routes after init. To add routes after init without
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1375
        resetting all existing routes, use the `route()` method.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1376
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1377
        @attribute routes
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1378
        @type Object[]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1379
        @default `[]`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1380
        @see route
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1381
        **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1382
        routes: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1383
            value : [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1384
            getter: '_getRoutes',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1385
            setter: '_setRoutes'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1386
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1387
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1388
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1389
    // Used as the default value for the `html5` attribute, and for testing.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1390
    html5: Y.HistoryBase.html5 && (!Y.UA.android || Y.UA.android >= 3),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1391
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1392
    // To make this testable.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1393
    _instances: instances,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1394
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1395
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1396
    Dispatches to the first route handler that matches the specified `path` for
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1397
    all active router instances.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1398
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1399
    This provides a mechanism to cause all active router instances to dispatch
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1400
    to their route handlers without needing to change the URL or fire the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1401
    `history:change` or `hashchange` event.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1402
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1403
    @method dispatch
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1404
    @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1405
    @since 3.6.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1406
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1407
    dispatch: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1408
        var i, len, router;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1409
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1410
        for (i = 0, len = instances.length; i < len; i += 1) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1411
            router = instances[i];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1412
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1413
            if (router) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1414
                router._dispatch(router._getPath(), router._getURL());
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1415
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1416
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1417
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1418
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1419
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1420
/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1421
The `Controller` class was deprecated in YUI 3.5.0 and is now an alias for the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1422
`Router` class. Use that class instead. This alias will be removed in a future
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1423
version of YUI.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1424
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1425
@class Controller
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1426
@constructor
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1427
@extends Base
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1428
@deprecated Use `Router` instead.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1429
@see Router
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1430
**/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1431
Y.Controller = Y.Router;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1432
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1433
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1434
}, '3.10.3', {"optional": ["querystring-parse"], "requires": ["array-extras", "base-build", "history"]});