src/cm/media/js/lib/yui/yui3-3.15.0/build/yui-base/yui-base.js
author ymh <ymh.work@gmail.com>
Fri, 14 Mar 2014 13:16:10 +0100
changeset 611 fa66f4bb1563
parent 602 e16a97fb364a
permissions -rw-r--r--
add some more custom config and put every thing in comment in the custom.yaml template
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
The YUI module contains the components required for building the YUI seed file.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
This includes the script loading mechanism, a simple queue, and the core
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
utilities for the library.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
@module yui
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
@main yui
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
@submodule yui-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
/*jshint eqeqeq: false*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
if (typeof YUI != 'undefined') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
    YUI._YUI = YUI;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
The YUI global namespace object. This is the constructor for all YUI instances.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
This is a self-instantiable factory function, meaning you don't need to precede
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
it with the `new` operator. You can invoke it directly like this:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
    YUI().use('*', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
        // Y is a new YUI instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
But it also works like this:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
    var Y = YUI();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
The `YUI` constructor accepts an optional config object, like this:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
    YUI({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
        debug: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
        combine: false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
    }).use('node', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
        // Y.Node is ready to use.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
See the API docs for the <a href="config.html">Config</a> class for the complete
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
list of supported configuration properties accepted by the YUI constuctor.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
If a global `YUI` object is already defined, the existing YUI object will not be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
overwritten, to ensure that defined namespaces are preserved.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
Each YUI instance has full custom event support, but only if the event system is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
available.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
@class YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
@uses EventTarget
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
@constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
@global
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
@param {Object} [config]* Zero or more optional configuration objects. Config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
    values are stored in the `Y.config` property. See the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
    <a href="config.html">Config</a> docs for the list of supported properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
    /*global YUI*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
    /*global YUI_config*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
    var YUI = function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
        var i = 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
            Y = this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
            args = arguments,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
            l = args.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
            instanceOf = function(o, type) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
                return (o && o.hasOwnProperty && (o instanceof type));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
            },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
            gconf = (typeof YUI_config !== 'undefined') && YUI_config;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
        if (!(instanceOf(Y, YUI))) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
            Y = new YUI();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
            // set up the core environment
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
            Y._init();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
            /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
            Master configuration that might span multiple contexts in a non-
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
            browser environment. It is applied first to all instances in all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
            contexts.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
            @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
                YUI.GlobalConfig = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
                    filter: 'debug'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
                };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
                YUI().use('node', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
                    // debug files used here
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
                });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
                YUI({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
                    filter: 'min'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
                }).use('node', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
                    // min files used here
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
                });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
            @property {Object} GlobalConfig
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
            @global
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
            @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
            **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
            if (YUI.GlobalConfig) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
                Y.applyConfig(YUI.GlobalConfig);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
            /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
            Page-level config applied to all YUI instances created on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
            current page. This is applied after `YUI.GlobalConfig` and before
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
            any instance-level configuration.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
            @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
                // Single global var to include before YUI seed file
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
                YUI_config = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
                    filter: 'debug'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
                };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
                YUI().use('node', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
                    // debug files used here
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
                });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
                YUI({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
                    filter: 'min'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
                }).use('node', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
                    // min files used here
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
                });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
            @property {Object} YUI_config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
            @global
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
            **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
            if (gconf) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
                Y.applyConfig(gconf);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
            // bind the specified additional modules for this instance
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
            if (!l) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
                Y._setup();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
        if (l) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
            // Each instance can accept one or more configuration objects.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
            // These are applied after YUI.GlobalConfig and YUI_Config,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
            // overriding values set in those config files if there is a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
            // matching property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
            for (; i < l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
                Y.applyConfig(args[i]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
            Y._setup();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
        Y.instanceOf = instanceOf;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
        return Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
(function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
    var proto, prop,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
        VERSION = '@VERSION@',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
        PERIOD = '.',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
        BASE = 'http://yui.yahooapis.com/',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
        /*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
            These CSS class names can't be generated by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
            getClassName since it is not available at the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
            time they are being used.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
        DOC_LABEL = 'yui3-js-enabled',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
        CSS_STAMP_EL = 'yui3-css-stamp',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
        NOOP = function() {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
        SLICE = Array.prototype.slice,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
        APPLY_TO_AUTH = { 'io.xdrReady': 1,   // the functions applyTo
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
                          'io.xdrResponse': 1,   // can call. this should
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
                          'SWF.eventHandler': 1 }, // be done at build time
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
        hasWin = (typeof window != 'undefined'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
        win = (hasWin) ? window : null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
        doc = (hasWin) ? win.document : null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
        docEl = doc && doc.documentElement,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
        docClass = docEl && docEl.className,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
        instances = {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
        time = new Date().getTime(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
        add = function(el, type, fn, capture) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
            if (el && el.addEventListener) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
                el.addEventListener(type, fn, capture);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
            } else if (el && el.attachEvent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
                el.attachEvent('on' + type, fn);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
        remove = function(el, type, fn, capture) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
            if (el && el.removeEventListener) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
                // this can throw an uncaught exception in FF
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
                try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
                    el.removeEventListener(type, fn, capture);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
                } catch (ex) {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
            } else if (el && el.detachEvent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
                el.detachEvent('on' + type, fn);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
        handleReady = function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
            YUI.Env.DOMReady = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
            if (hasWin) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
                remove(doc, 'DOMContentLoaded', handleReady);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
            }        
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
        handleLoad = function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
            YUI.Env.windowLoaded = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
            YUI.Env.DOMReady = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
            if (hasWin) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
                remove(window, 'load', handleLoad);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
        getLoader = function(Y, o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
            var loader = Y.Env._loader,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
                lCore = [ 'loader-base' ],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
                G_ENV = YUI.Env,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
                mods = G_ENV.mods;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
            if (loader) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
                //loader._config(Y.config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
                loader.ignoreRegistered = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
                loader.onEnd = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
                loader.data = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
                loader.required = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
                loader.loadType = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
                loader = new Y.Loader(Y.config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
                Y.Env._loader = loader;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
            if (mods && mods.loader) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
                lCore = [].concat(lCore, YUI.Env.loaderExtras);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
            YUI.Env.core = Y.Array.dedupe([].concat(YUI.Env.core, lCore));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
            return loader;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
        clobber = function(r, s) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
            for (var i in s) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
                if (s.hasOwnProperty(i)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
                    r[i] = s[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
        ALREADY_DONE = { success: true };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
//  Stamp the documentElement (HTML) with a class of "yui-loaded" to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
//  enable styles that need to key off of JS being enabled.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
if (docEl && docClass.indexOf(DOC_LABEL) == -1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
    if (docClass) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
        docClass += ' ';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
    docClass += DOC_LABEL;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
    docEl.className = docClass;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
if (VERSION.indexOf('@') > -1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
    VERSION = '3.5.0'; // dev time hack for cdn test
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
proto = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
    Applies a new configuration object to the config of this YUI instance. This
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
    will merge new group/module definitions, and will also update the loader
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
    cache if necessary. Updating `Y.config` directly will not update the cache.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
    @method applyConfig
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
    @param {Object} o the configuration object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
    @since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
    applyConfig: function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
        o = o || NOOP;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
        var attr,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
            name,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
            // detail,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
            config = this.config,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
            mods = config.modules,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
            groups = config.groups,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
            aliases = config.aliases,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
            loader = this.Env._loader;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
        for (name in o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
            if (o.hasOwnProperty(name)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
                attr = o[name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
                if (mods && name == 'modules') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
                    clobber(mods, attr);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
                } else if (aliases && name == 'aliases') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
                    clobber(aliases, attr);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
                } else if (groups && name == 'groups') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
                    clobber(groups, attr);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
                } else if (name == 'win') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
                    config[name] = (attr && attr.contentWindow) || attr;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
                    config.doc = config[name] ? config[name].document : null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
                } else if (name == '_yuid') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
                    // preserve the guid
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
                    config[name] = attr;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
        if (loader) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
            loader._config(o);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
    Old way to apply a config to this instance (calls `applyConfig` under the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
    hood).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
    @method _config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
    @param {Object} o The config to apply
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
    _config: function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
        this.applyConfig(o);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
    Initializes this YUI instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
    @method _init
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
    _init: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
        var filter, el,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
            Y = this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
            G_ENV = YUI.Env,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
            Env = Y.Env,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
            prop;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
        The version number of this YUI instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
        This value is typically updated by a script when a YUI release is built,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
        so it may not reflect the correct version number when YUI is run from
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
        the development source tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
        @property {String} version
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
        Y.version = VERSION;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
        if (!Env) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
            Y.Env = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
                core: ['get', 'features', 'intl-base', 'yui-log', 'yui-later'],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
                loaderExtras: ['loader-rollup', 'loader-yui3'],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
                mods: {}, // flat module map
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
                versions: {}, // version module map
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
                base: BASE,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
                cdn: BASE + VERSION + '/build/',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
                // bootstrapped: false,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
                _idx: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
                _used: {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
                _attached: {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
                _exported: {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
                _missed: [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
                _yidx: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
                _uidx: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
                _guidp: 'y',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
                _loaded: {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
                // serviced: {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
                // Regex in English:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
                // I'll start at the \b(yui).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
                // 1. Look in the test string for "yui" or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
                //    "yui-base" or "yui-davglass" or "yui-foobar" that comes after a word break.  That is, it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
                //    can't match "foyui" or "i_heart_yui". This can be anywhere in the string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
                // 2. After #1 must come a forward slash followed by the string matched in #1, so
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
                //    "yui-base/yui-base" or "yui-pants/yui-pants".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
                // 3. The second occurence of the #1 token can optionally be followed by "-debug" or "-min",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
                //    so "yui/yui-min", "yui/yui-debug", "yui-base/yui-base-debug". NOT "yui/yui-tshirt".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
                // 4. This is followed by ".js", so "yui/yui.js".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
                // 0. Going back to the beginning, now. If all that stuff in 1-4 comes after a "?" in the string,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
                //    then capture the junk between the LAST "&" and the string in 1-4.  So
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
                //    "blah?foo/yui/yui.js" will capture "foo/" and "blah?some/thing.js&3.3.0/build/yui-davglass/yui-davglass.js"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
                //    will capture "3.3.0/build/"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
                //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
                // Regex Exploded:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
                // (?:\?             Find a ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
                //   (?:[^&]*&)      followed by 0..n characters followed by an &
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
                //   *               in fact, find as many sets of characters followed by a & as you can
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
                //   ([^&]*)         capture the stuff after the last & in \1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
                // )?                but it's ok if all this ?junk&more_junk stuff isn't even there
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
                // \b(               after a word break find either the string
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
                //    yui(?:-\w+)?   "yui" optionally followed by a -, then more characters
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
                // )                 and store the yui-* string in \2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
                // \/\2              then comes a / followed by the yui-* string in \2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
                // (?:-(min|debug))? optionally followed by "-min" or "-debug"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
                // .js               and ending in ".js"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
                _BASE_RE: /(?:\?(?:[^&]*&)*([^&]*))?\b(yui(?:-\w+)?)\/\2(?:-(min|debug))?\.js/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
                parseBasePath: function(src, pattern) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
                    var match = src.match(pattern),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
                        path, filter;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
                    if (match) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
                        path = RegExp.leftContext || src.slice(0, src.indexOf(match[0]));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
                        // this is to set up the path to the loader.  The file
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
                        // filter for loader should match the yui include.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
                        filter = match[3];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
                        // extract correct path for mixed combo urls
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
                        // http://yuilibrary.com/projects/yui3/ticket/2528423
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
                        if (match[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
                            path += '?' + match[1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
                        path = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
                            filter: filter,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
                            path: path
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
                        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
                    return path;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
                },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
                getBase: G_ENV && G_ENV.getBase ||
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
                        function(pattern) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
                            var nodes = (doc && doc.getElementsByTagName('script')) || [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
                                path = Env.cdn, parsed,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
                                i, len, src;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
                            for (i = 0, len = nodes.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
                                src = nodes[i].src;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
                                if (src) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
                                    parsed = Y.Env.parseBasePath(src, pattern);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
                                    if (parsed) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
                                        filter = parsed.filter;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
                                        path = parsed.path;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
                                        break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
                                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
                                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
                            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
                            // use CDN default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
                            return path;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
            Env = Y.Env;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
            Env._loaded[VERSION] = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
            if (G_ENV && Y !== YUI) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
                Env._yidx = ++G_ENV._yidx;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
                Env._guidp = ('yui_' + VERSION + '_' +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
                             Env._yidx + '_' + time).replace(/[^a-z0-9_]+/g, '_');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
            } else if (YUI._YUI) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
                G_ENV = YUI._YUI.Env;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
                Env._yidx += G_ENV._yidx;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
                Env._uidx += G_ENV._uidx;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
                for (prop in G_ENV) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
                    if (!(prop in Env)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
                        Env[prop] = G_ENV[prop];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
                delete YUI._YUI;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
            Y.id = Y.stamp(Y);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
            instances[Y.id] = Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
        Y.constructor = YUI;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
        // configuration defaults
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
        Y.config = Y.config || {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
            bootstrap: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
            cacheUse: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
            debug: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
            doc: doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
            fetchCSS: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
            throwFail: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
            useBrowserConsole: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
            useNativeES5: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
            win: win,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
            global: Function('return this')()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
        //Register the CSS stamp element
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
        if (doc && !doc.getElementById(CSS_STAMP_EL)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
            el = doc.createElement('div');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
            el.innerHTML = '<div id="' + CSS_STAMP_EL + '" style="position: absolute !important; visibility: hidden !important"></div>';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
            YUI.Env.cssStampEl = el.firstChild;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
            if (doc.body) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
                doc.body.appendChild(YUI.Env.cssStampEl);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
                docEl.insertBefore(YUI.Env.cssStampEl, docEl.firstChild);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
        } else if (doc && doc.getElementById(CSS_STAMP_EL) && !YUI.Env.cssStampEl) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
            YUI.Env.cssStampEl = doc.getElementById(CSS_STAMP_EL);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
        Y.config.lang = Y.config.lang || 'en-US';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
        Y.config.base = YUI.config.base || Y.Env.getBase(Y.Env._BASE_RE);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   500
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   501
        if (!filter || (!('mindebug').indexOf(filter))) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
            filter = 'min';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
        filter = (filter) ? '-' + filter : filter;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
        Y.config.loaderPath = YUI.config.loaderPath || 'loader/loader' + filter + '.js';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
    Finishes the instance setup. Attaches whatever YUI modules were defined
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
    at the time that this instance was created.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
    @method _setup
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
    _setup: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
        var i, Y = this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
            core = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
            mods = YUI.Env.mods,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
            extras = Y.config.core || [].concat(YUI.Env.core); //Clone it..
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
        for (i = 0; i < extras.length; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
            if (mods[extras[i]]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
                core.push(extras[i]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
        Y._attach(['yui-base']);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
        Y._attach(core);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
        if (Y.Loader) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
            getLoader(Y);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
    Executes the named method on the specified YUI instance if that method is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
    whitelisted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
    @method applyTo
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
    @param {String} id YUI instance id.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
    @param {String} method Name of the method to execute. For example:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
        'Object.keys'.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
    @param {Array} args Arguments to apply to the method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
    @return {Mixed} Return value from the applied method, or `null` if the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
        specified instance was not found or the method was not whitelisted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
    applyTo: function(id, method, args) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
        if (!(method in APPLY_TO_AUTH)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
            this.log(method + ': applyTo not allowed', 'warn', 'yui');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
            return null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
        var instance = instances[id], nest, m, i;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
        if (instance) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
            nest = method.split('.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
            m = instance;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   559
            for (i = 0; i < nest.length; i = i + 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   560
                m = m[nest[i]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   561
                if (!m) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
                    this.log('applyTo not found: ' + method, 'warn', 'yui');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
            return m && m.apply(instance, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
        return null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   569
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   570
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   571
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   572
Registers a YUI module and makes it available for use in a `YUI().use()` call or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   573
as a dependency for other modules.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   574
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   575
The easiest way to create a first-class YUI module is to use
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   576
<a href="http://yui.github.com/shifter/">Shifter</a>, the YUI component build
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   577
tool.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   578
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   579
Shifter will automatically wrap your module code in a `YUI.add()` call along
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   580
with any configuration info required for the module.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   581
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   582
@example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   583
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   584
    YUI.add('davglass', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   585
        Y.davglass = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   586
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   587
    }, '3.4.0', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   588
        requires: ['harley-davidson', 'mt-dew']
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   589
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   590
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   591
@method add
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   592
@param {String} name Module name.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   593
@param {Function} fn Function containing module code. This function will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   594
    executed whenever the module is attached to a specific YUI instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   595
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   596
    @param {YUI} fn.Y The YUI instance to which this module is attached.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   597
    @param {String} fn.name Name of the module
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   598
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   599
@param {String} version Module version number. This is currently used only for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   600
    informational purposes, and is not used internally by YUI.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   601
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   602
@param {Object} [config] Module config.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   603
    @param {Array} [config.requires] Array of other module names that must be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   604
        attached before this module can be attached.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   605
    @param {Array} [config.optional] Array of optional module names that should
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   606
        be attached before this module is attached if they've already been
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   607
        loaded. If the `loadOptional` YUI option is `true`, optional modules
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   608
        that have not yet been loaded will be loaded just as if they were hard
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   609
        requirements.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   610
    @param {Array} [config.use] Array of module names that are included within
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   611
        or otherwise provided by this module, and which should be attached
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   612
        automatically when this module is attached. This makes it possible to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   613
        create "virtual rollup" modules that simply attach a collection of other
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   614
        modules or submodules.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   615
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   616
@return {YUI} This YUI instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   617
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   618
    add: function(name, fn, version, details) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   619
        details = details || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   620
        var env = YUI.Env,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   621
            mod = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   622
                name: name,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   623
                fn: fn,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   624
                version: version,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   625
                details: details
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   626
            },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   627
            //Instance hash so we don't apply it to the same instance twice
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   628
            applied = {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   629
            loader, inst,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   630
            i, versions = env.versions;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   631
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   632
        env.mods[name] = mod;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   633
        versions[version] = versions[version] || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   634
        versions[version][name] = mod;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   635
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   636
        for (i in instances) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   637
            if (instances.hasOwnProperty(i)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   638
                inst = instances[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   639
                if (!applied[inst.id]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   640
                    applied[inst.id] = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   641
                    loader = inst.Env._loader;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   642
                    if (loader) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   643
                        if (!loader.moduleInfo[name] || loader.moduleInfo[name].temp) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   644
                            loader.addModule(details, name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   645
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   646
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   647
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   648
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   649
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   650
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   651
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   652
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   653
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   654
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   655
    Executes the callback function associated with each required module,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   656
    attaching the module to this YUI instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   657
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   658
    @method _attach
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   659
    @param {Array} r The array of modules to attach
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   660
    @param {Boolean} [moot=false] If `true`, don't throw a warning if the module
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   661
        is not attached.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   662
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   663
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   664
    _attach: function(r, moot) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   665
        var i, name, mod, details, req, use, after,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   666
            mods = YUI.Env.mods,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   667
            aliases = YUI.Env.aliases,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   668
            Y = this, j,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   669
            cache = YUI.Env._renderedMods,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   670
            loader = Y.Env._loader,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   671
            done = Y.Env._attached,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   672
            exported = Y.Env._exported,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   673
            len = r.length, loader, def, go,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   674
            c = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   675
            modArgs, esCompat, reqlen,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   676
            condition,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   677
            __exports__, __imports__;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   678
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   679
        //Check for conditional modules (in a second+ instance) and add their requirements
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   680
        //TODO I hate this entire method, it needs to be fixed ASAP (3.5.0) ^davglass
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   681
        for (i = 0; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   682
            name = r[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   683
            mod = mods[name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   684
            c.push(name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   685
            if (loader && loader.conditions[name]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   686
                for (j in loader.conditions[name]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   687
                    if (loader.conditions[name].hasOwnProperty(j)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   688
                        def = loader.conditions[name][j];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   689
                        go = def && ((def.ua && Y.UA[def.ua]) || (def.test && def.test(Y)));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   690
                        if (go) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   691
                            c.push(def.name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   692
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   693
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   694
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   695
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   696
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   697
        r = c;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   698
        len = r.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   699
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   700
        for (i = 0; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   701
            if (!done[r[i]]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   702
                name = r[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   703
                mod = mods[name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   704
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   705
                if (aliases && aliases[name] && !mod) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   706
                    Y._attach(aliases[name]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   707
                    continue;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   708
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   709
                if (!mod) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   710
                    if (loader && loader.moduleInfo[name]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   711
                        mod = loader.moduleInfo[name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   712
                        moot = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   713
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   714
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   715
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   716
                    //if (!loader || !loader.moduleInfo[name]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   717
                    //if ((!loader || !loader.moduleInfo[name]) && !moot) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   718
                    if (!moot && name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   719
                        if ((name.indexOf('skin-') === -1) && (name.indexOf('css') === -1)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   720
                            Y.Env._missed.push(name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   721
                            Y.Env._missed = Y.Array.dedupe(Y.Env._missed);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   722
                            Y.message('NOT loaded: ' + name, 'warn', 'yui');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   723
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   724
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   725
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   726
                    done[name] = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   727
                    //Don't like this, but in case a mod was asked for once, then we fetch it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   728
                    //We need to remove it from the missed list ^davglass
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   729
                    for (j = 0; j < Y.Env._missed.length; j++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   730
                        if (Y.Env._missed[j] === name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   731
                            Y.message('Found: ' + name + ' (was reported as missing earlier)', 'warn', 'yui');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   732
                            Y.Env._missed.splice(j, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   733
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   734
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   735
                    /*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   736
                        If it's a temp module, we need to redo it's requirements if it's already loaded
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   737
                        since it may have been loaded by another instance and it's dependencies might
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   738
                        have been redefined inside the fetched file.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   739
                    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   740
                    if (loader && cache && cache[name] && cache[name].temp) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   741
                        loader.getRequires(cache[name]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   742
                        req = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   743
                        for (j in loader.moduleInfo[name].expanded_map) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   744
                            if (loader.moduleInfo[name].expanded_map.hasOwnProperty(j)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   745
                                req.push(j);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   746
                            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   747
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   748
                        Y._attach(req);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   749
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   750
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   751
                    details = mod.details;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   752
                    req = details.requires;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   753
                    esCompat = details.es;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   754
                    use = details.use;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   755
                    after = details.after;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   756
                    //Force Intl load if there is a language (Loader logic) @todo fix this shit
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   757
                    if (details.lang) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   758
                        req = req || [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   759
                        req.unshift('intl');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   760
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   761
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   762
                    if (req) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   763
                        reqlen = req.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   764
                        for (j = 0; j < reqlen; j++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   765
                            if (!done[req[j]]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   766
                                if (!Y._attach(req)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   767
                                    return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   768
                                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   769
                                break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   770
                            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   771
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   772
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   773
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   774
                    if (after) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   775
                        for (j = 0; j < after.length; j++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   776
                            if (!done[after[j]]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   777
                                if (!Y._attach(after, true)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   778
                                    return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   779
                                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   780
                                break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   781
                            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   782
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   783
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   784
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   785
                    if (mod.fn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   786
                        modArgs = [Y, name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   787
                        if (esCompat) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   788
                            __imports__ = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   789
                            __exports__ = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   790
                            // passing `exports` and `imports` onto the module function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   791
                            modArgs.push(__imports__, __exports__);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   792
                            if (req) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   793
                                reqlen = req.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   794
                                for (j = 0; j < reqlen; j++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   795
                                    __imports__[req[j]] = exported.hasOwnProperty(req[j]) ? exported[req[j]] : Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   796
                                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   797
                            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   798
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   799
                        if (Y.config.throwFail) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   800
                            __exports__ = mod.fn.apply(esCompat ? undefined : mod, modArgs);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   801
                        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   802
                            try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   803
                                __exports__ = mod.fn.apply(esCompat ? undefined : mod, modArgs);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   804
                            } catch (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   805
                                Y.error('Attach error: ' + name, e, name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   806
                                return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   807
                            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   808
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   809
                        if (esCompat) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   810
                            // store the `exports` in case others `es` modules requires it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   811
                            exported[name] = __exports__;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   812
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   813
                            // If an ES module is conditionally loaded and set
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   814
                            // to be used "instead" another module, replace the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   815
                            // trigger module's content with the conditionally
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   816
                            // loaded one so the values returned by require()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   817
                            // still makes sense
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   818
                            condition = mod.details.condition;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   819
                            if (condition && condition.when === 'instead') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   820
                                exported[condition.trigger] = __exports__;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   821
                            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   822
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   823
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   824
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   825
                    if (use) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   826
                        for (j = 0; j < use.length; j++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   827
                            if (!done[use[j]]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   828
                                if (!Y._attach(use)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   829
                                    return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   830
                                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   831
                                break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   832
                            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   833
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   834
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   835
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   836
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   837
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   838
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   839
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   840
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   841
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   842
        return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   843
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   844
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   845
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   846
    Delays the `use` callback until another event has taken place such as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   847
    `window.onload`, `domready`, `contentready`, or `available`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   848
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   849
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   850
    @method _delayCallback
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   851
    @param {Function} cb The original `use` callback.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   852
    @param {String|Object} until Either an event name ('load', 'domready', etc.)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   853
        or an object containing event/args keys for contentready/available.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   854
    @return {Function}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   855
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   856
    _delayCallback: function(cb, until) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   857
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   858
        var Y = this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   859
            mod = ['event-base'];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   860
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   861
        until = (Y.Lang.isObject(until) ? until : { event: until });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   862
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   863
        if (until.event === 'load') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   864
            mod.push('event-synthetic');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   865
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   866
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   867
        return function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   868
            var args = arguments;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   869
            Y._use(mod, function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   870
                Y.on(until.event, function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   871
                    args[1].delayUntil = until.event;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   872
                    cb.apply(Y, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   873
                }, until.args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   874
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   875
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   876
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   877
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   878
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   879
    Attaches one or more modules to this YUI instance. When this is executed,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   880
    the requirements of the desired modules are analyzed, and one of several
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   881
    things can happen:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   882
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   883
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   884
      * All required modules have already been loaded, and just need to be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   885
        attached to this YUI instance. In this case, the `use()` callback will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   886
        be executed synchronously after the modules are attached.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   887
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   888
      * One or more modules have not yet been loaded, or the Get utility is not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   889
        available, or the `bootstrap` config option is `false`. In this case,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   890
        a warning is issued indicating that modules are missing, but all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   891
        available modules will still be attached and the `use()` callback will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   892
        be executed synchronously.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   893
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   894
      * One or more modules are missing and the Loader is not available but the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   895
        Get utility is, and `bootstrap` is not `false`. In this case, the Get
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   896
        utility will be used to load the Loader, and we will then proceed to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   897
        the following state:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   898
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   899
      * One or more modules are missing and the Loader is available. In this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   900
        case, the Loader will be used to resolve the dependency tree for the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   901
        missing modules and load them and their dependencies. When the Loader is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   902
        finished loading modules, the `use()` callback will be executed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   903
        asynchronously.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   904
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   905
    @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   906
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   907
        // Loads and attaches dd and its dependencies.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   908
        YUI().use('dd', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   909
            // ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   910
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   911
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   912
        // Loads and attaches dd and node as well as all of their dependencies.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   913
        YUI().use(['dd', 'node'], function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   914
            // ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   915
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   916
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   917
        // Attaches all modules that have already been loaded.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   918
        YUI().use('*', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   919
            // ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   920
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   921
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   922
        // Attaches a gallery module.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   923
        YUI().use('gallery-yql', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   924
            // ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   925
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   926
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   927
        // Attaches a YUI 2in3 module.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   928
        YUI().use('yui2-datatable', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   929
            // ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   930
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   931
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   932
    @method use
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   933
    @param {String|Array} modules* One or more module names to attach.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   934
    @param {Function} [callback] Callback function to be executed once all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   935
        specified modules and their dependencies have been attached.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   936
    @param {YUI} callback.Y The YUI instance created for this sandbox.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   937
    @param {Object} callback.status Object containing `success`, `msg` and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   938
        `data` properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   939
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   940
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   941
    use: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   942
        var args = SLICE.call(arguments, 0),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   943
            callback = args[args.length - 1],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   944
            Y = this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   945
            i = 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   946
            name,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   947
            Env = Y.Env,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   948
            provisioned = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   949
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   950
        // The last argument supplied to use can be a load complete callback
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   951
        if (Y.Lang.isFunction(callback)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   952
            args.pop();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   953
            if (Y.config.delayUntil) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   954
                callback = Y._delayCallback(callback, Y.config.delayUntil);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   955
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   956
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   957
            callback = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   958
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   959
        if (Y.Lang.isArray(args[0])) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   960
            args = args[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   961
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   962
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   963
        if (Y.config.cacheUse) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   964
            while ((name = args[i++])) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   965
                if (!Env._attached[name]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   966
                    provisioned = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   967
                    break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   968
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   969
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   970
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   971
            if (provisioned) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   972
                if (args.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   973
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   974
                Y._notify(callback, ALREADY_DONE, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   975
                return Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   976
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   977
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   978
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   979
        if (Y._loading) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   980
            Y._useQueue = Y._useQueue || new Y.Queue();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   981
            Y._useQueue.add([args, callback]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   982
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   983
            Y._use(args, function(Y, response) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   984
                Y._notify(callback, response, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   985
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   986
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   987
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   988
        return Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   989
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   990
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   991
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   992
    Sugar for loading both legacy and ES6-based YUI modules.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   993
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   994
    @method require
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   995
    @param {String} [modules*] List of module names to import or a single
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   996
        module name.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   997
    @param {Function} callback Callback that gets called once all the modules
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   998
        were loaded. Each parameter of the callback is the export value of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   999
        corresponding module in the list. If the module is a legacy YUI module,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1000
        the YUI instance is used instead of the module exports.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1001
    @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1002
    ```
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1003
    YUI().require(['es6-set'], function (Y, imports) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1004
        var Set = imports.Set,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1005
            set = new Set();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1006
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1007
    ```
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1008
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1009
    require: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1010
        var args = SLICE.call(arguments),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1011
            callback;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1012
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1013
        if (typeof args[args.length - 1] === 'function') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1014
            callback = args.pop();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1015
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1016
            // only add the callback if one was provided
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1017
            // YUI().require('foo'); is valid
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1018
            args.push(function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1019
                var i, length = args.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1020
                    exported = Y.Env._exported,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1021
                    __imports__ = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1022
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1023
                // Get only the imports requested as arguments
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1024
                for (i = 0; i < length; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1025
                    if (exported.hasOwnProperty(args[i])) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1026
                        __imports__[args[i]] = exported[args[i]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1027
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1028
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1029
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1030
                // Using `undefined` because:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1031
                // - Using `Y.config.global` would force the value of `this` to be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1032
                //   the global object even in strict mode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1033
                // - Using `Y` goes against the goal of moving away from a shared
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1034
                //   object and start thinking in terms of imported and exported
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1035
                //   objects
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1036
                callback.call(undefined, Y, __imports__);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1037
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1038
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1039
        // Do not return the Y object. This makes it hard to follow this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1040
        // traditional pattern:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1041
        //   var Y = YUI().use(...);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1042
        // This is a good idea in the light of ES6 modules, to avoid working
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1043
        // in the global scope.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1044
        // This also leaves the door open for returning a promise, once the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1045
        // YUI loader is based on the ES6 loader which uses
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1046
        // loader.import(...).then(...)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1047
        this.use.apply(this, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1048
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1049
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1050
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1051
    Handles Loader notifications about attachment/load errors.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1052
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1053
    @method _notify
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1054
    @param {Function} callback Callback to pass to `Y.config.loadErrorFn`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1055
    @param {Object} response Response returned from Loader.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1056
    @param {Array} args Arguments passed from Loader.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1057
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1058
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1059
    _notify: function(callback, response, args) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1060
        if (!response.success && this.config.loadErrorFn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1061
            this.config.loadErrorFn.call(this, this, callback, response, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1062
        } else if (callback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1063
            if (this.Env._missed && this.Env._missed.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1064
                response.msg = 'Missing modules: ' + this.Env._missed.join();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1065
                response.success = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1066
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1067
            if (this.config.throwFail) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1068
                callback(this, response);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1069
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1070
                try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1071
                    callback(this, response);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1072
                } catch (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1073
                    this.error('use callback error', e, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1074
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1075
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1076
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1077
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1078
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1079
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1080
    Called from the `use` method queue to ensure that only one set of loading
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1081
    logic is performed at a time.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1082
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1083
    @method _use
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1084
    @param {String} args* One or more modules to attach.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1085
    @param {Function} [callback] Function to call once all required modules have
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1086
        been attached.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1087
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1088
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1089
    _use: function(args, callback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1090
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1091
        if (!this.Array) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1092
            this._attach(['yui-base']);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1093
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1094
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1095
        var len, loader, handleBoot,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1096
            Y = this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1097
            G_ENV = YUI.Env,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1098
            mods = G_ENV.mods,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1099
            Env = Y.Env,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1100
            used = Env._used,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1101
            aliases = G_ENV.aliases,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1102
            queue = G_ENV._loaderQueue,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1103
            firstArg = args[0],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1104
            YArray = Y.Array,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1105
            config = Y.config,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1106
            boot = config.bootstrap,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1107
            missing = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1108
            i,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1109
            r = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1110
            ret = true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1111
            fetchCSS = config.fetchCSS,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1112
            process = function(names, skip) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1113
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1114
                var i = 0, a = [], name, len, m, req, use;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1115
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1116
                if (!names.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1117
                    return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1118
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1119
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1120
                if (aliases) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1121
                    len = names.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1122
                    for (i = 0; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1123
                        if (aliases[names[i]] && !mods[names[i]]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1124
                            a = [].concat(a, aliases[names[i]]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1125
                        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1126
                            a.push(names[i]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1127
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1128
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1129
                    names = a;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1130
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1131
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1132
                len = names.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1133
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1134
                for (i = 0; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1135
                    name = names[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1136
                    if (!skip) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1137
                        r.push(name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1138
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1139
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1140
                    // only attach a module once
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1141
                    if (used[name]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1142
                        continue;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1143
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1144
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1145
                    m = mods[name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1146
                    req = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1147
                    use = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1148
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1149
                    if (m) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1150
                        used[name] = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1151
                        req = m.details.requires;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1152
                        use = m.details.use;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1153
                    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1154
                        // CSS files don't register themselves, see if it has
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1155
                        // been loaded
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1156
                        if (!G_ENV._loaded[VERSION][name]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1157
                            missing.push(name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1158
                        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1159
                            used[name] = true; // probably css
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1160
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1161
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1162
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1163
                    // make sure requirements are attached
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1164
                    if (req && req.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1165
                        process(req);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1166
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1167
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1168
                    // make sure we grab the submodule dependencies too
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1169
                    if (use && use.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1170
                        process(use, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1171
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1172
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1173
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1174
            },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1175
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1176
            handleLoader = function(fromLoader) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1177
                var response = fromLoader || {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1178
                        success: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1179
                        msg: 'not dynamic'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1180
                    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1181
                    redo, origMissing,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1182
                    ret = true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1183
                    data = response.data;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1184
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1185
                Y._loading = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1186
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1187
                if (data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1188
                    origMissing = missing;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1189
                    missing = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1190
                    r = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1191
                    process(data);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1192
                    redo = missing.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1193
                    if (redo) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1194
                        if ([].concat(missing).sort().join() ==
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1195
                                origMissing.sort().join()) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1196
                            redo = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1197
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1198
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1199
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1200
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1201
                if (redo && data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1202
                    Y._loading = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1203
                    Y._use(missing, function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1204
                        if (Y._attach(data)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1205
                            Y._notify(callback, response, data);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1206
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1207
                    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1208
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1209
                    if (data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1210
                        ret = Y._attach(data);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1211
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1212
                    if (ret) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1213
                        Y._notify(callback, response, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1214
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1215
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1216
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1217
                if (Y._useQueue && Y._useQueue.size() && !Y._loading) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1218
                    Y._use.apply(Y, Y._useQueue.next());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1219
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1220
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1221
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1222
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1223
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1224
        // YUI().use('*'); // bind everything available
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1225
        if (firstArg === '*') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1226
            args = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1227
            for (i in mods) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1228
                if (mods.hasOwnProperty(i)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1229
                    args.push(i);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1230
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1231
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1232
            ret = Y._attach(args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1233
            if (ret) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1234
                handleLoader();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1235
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1236
            return Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1237
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1238
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1239
        if ((mods.loader || mods['loader-base']) && !Y.Loader) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1240
            Y._attach(['loader' + ((!mods.loader) ? '-base' : '')]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1241
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1242
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1243
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1244
        // use loader to expand dependencies and sort the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1245
        // requirements if it is available.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1246
        if (boot && Y.Loader && args.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1247
            loader = getLoader(Y);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1248
            loader.require(args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1249
            loader.ignoreRegistered = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1250
            loader._boot = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1251
            loader.calculate(null, (fetchCSS) ? null : 'js');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1252
            args = loader.sorted;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1253
            loader._boot = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1254
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1255
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1256
        process(args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1257
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1258
        len = missing.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1259
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1260
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1261
        if (len) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1262
            missing = YArray.dedupe(missing);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1263
            len = missing.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1264
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1265
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1266
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1267
        // dynamic load
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1268
        if (boot && len && Y.Loader) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1269
            Y._loading = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1270
            loader = getLoader(Y);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1271
            loader.onEnd = handleLoader;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1272
            loader.context = Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1273
            loader.data = args;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1274
            loader.ignoreRegistered = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1275
            loader.require(missing);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1276
            loader.insert(null, (fetchCSS) ? null : 'js');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1277
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1278
        } else if (boot && len && Y.Get && !Env.bootstrapped) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1279
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1280
            Y._loading = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1281
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1282
            handleBoot = function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1283
                Y._loading = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1284
                queue.running = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1285
                Env.bootstrapped = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1286
                G_ENV._bootstrapping = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1287
                if (Y._attach(['loader'])) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1288
                    Y._use(args, callback);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1289
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1290
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1291
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1292
            if (G_ENV._bootstrapping) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1293
                queue.add(handleBoot);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1294
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1295
                G_ENV._bootstrapping = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1296
                Y.Get.script(config.base + config.loaderPath, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1297
                    onEnd: handleBoot
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1298
                });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1299
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1300
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1301
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1302
            ret = Y._attach(args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1303
            if (ret) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1304
                handleLoader();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1305
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1306
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1307
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1308
        return Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1309
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1310
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1311
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1312
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1313
    Utility method for safely creating namespaces if they don't already exist.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1314
    May be called statically on the YUI global object or as a method on a YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1315
    instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1316
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1317
    When called statically, a namespace will be created on the YUI global
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1318
    object:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1319
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1320
        // Create `YUI.your.namespace.here` as nested objects, preserving any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1321
        // objects that already exist instead of overwriting them.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1322
        YUI.namespace('your.namespace.here');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1323
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1324
    When called as a method on a YUI instance, a namespace will be created on
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1325
    that instance:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1326
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1327
        // Creates `Y.property.package`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1328
        Y.namespace('property.package');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1329
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1330
    Dots in the input string cause `namespace` to create nested objects for each
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1331
    token. If any part of the requested namespace already exists, the current
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1332
    object will be left in place and will not be overwritten. This allows
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1333
    multiple calls to `namespace` to preserve existing namespaced properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1334
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1335
    If the first token in the namespace string is "YAHOO", that token is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1336
    discarded. This is legacy behavior for backwards compatibility with YUI 2.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1337
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1338
    Be careful with namespace tokens. Reserved words may work in some browsers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1339
    and not others. For instance, the following will fail in some browsers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1340
    because the supported version of JavaScript reserves the word "long":
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1341
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1342
        Y.namespace('really.long.nested.namespace');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1343
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1344
    Note: If you pass multiple arguments to create multiple namespaces, only the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1345
    last one created is returned from this function.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1346
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1347
    @method namespace
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1348
    @param {String} namespace* One or more namespaces to create.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1349
    @return {Object} Reference to the last namespace object created.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1350
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1351
    namespace: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1352
        var a = arguments, o, i = 0, j, d, arg;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1353
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1354
        for (; i < a.length; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1355
            o = this; //Reset base object per argument or it will get reused from the last
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1356
            arg = a[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1357
            if (arg.indexOf(PERIOD) > -1) { //Skip this if no "." is present
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1358
                d = arg.split(PERIOD);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1359
                for (j = (d[0] == 'YAHOO') ? 1 : 0; j < d.length; j++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1360
                    o[d[j]] = o[d[j]] || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1361
                    o = o[d[j]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1362
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1363
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1364
                o[arg] = o[arg] || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1365
                o = o[arg]; //Reset base object to the new object so it's returned
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1366
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1367
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1368
        return o;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1369
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1370
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1371
    // this is replaced if the log module is included
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1372
    log: NOOP,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1373
    message: NOOP,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1374
    // this is replaced if the dump module is included
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1375
    dump: function (o) { return ''+o; },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1376
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1377
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1378
    Reports an error.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1379
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1380
    The reporting mechanism is controlled by the `throwFail` configuration
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1381
    attribute. If `throwFail` is falsy, the message is logged. If `throwFail` is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1382
    truthy, a JS exception is thrown.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1383
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1384
    If an `errorFn` is specified in the config it must return `true` to indicate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1385
    that the exception was handled and keep it from being thrown.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1387
    @method error
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1388
    @param {String} msg Error message.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1389
    @param {Error|String} [e] JavaScript error object or an error string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1390
    @param {String} [src] Source of the error (such as the name of the module in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1391
        which the error occurred).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1392
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1393
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1394
    error: function(msg, e, src) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1395
        //TODO Add check for window.onerror here
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1396
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1397
        var Y = this, ret;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1398
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1399
        if (Y.config.errorFn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1400
            ret = Y.config.errorFn.apply(Y, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1401
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1402
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1403
        if (!ret) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1404
            throw (e || new Error(msg));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1405
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1406
            Y.message(msg, 'error', ''+src); // don't scrub this one
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1407
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1408
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1409
        return Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1410
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1411
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1412
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1413
    Generates an id string that is unique among all YUI instances in this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1414
    execution context.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1415
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1416
    @method guid
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1417
    @param {String} [pre] Prefix.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1418
    @return {String} Unique id.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1419
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1420
    guid: function(pre) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1421
        var id = this.Env._guidp + '_' + (++this.Env._uidx);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1422
        return (pre) ? (pre + id) : id;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1423
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1424
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1425
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1426
    Returns a unique id associated with the given object and (if *readOnly* is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1427
    falsy) stamps the object with that id so it can be identified in the future.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1428
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1429
    Stamping an object involves adding a `_yuid` property to it that contains
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1430
    the object's id. One exception to this is that in Internet Explorer, DOM
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1431
    nodes have a `uniqueID` property that contains a browser-generated unique
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1432
    id, which will be used instead of a YUI-generated id when available.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1433
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1434
    @method stamp
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1435
    @param {Object} o Object to stamp.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1436
    @param {Boolean} readOnly If truthy and the given object has not already
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1437
        been stamped, the object will not be modified and `null` will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1438
        returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1439
    @return {String} Object's unique id, or `null` if *readOnly* was truthy and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1440
        the given object was not already stamped.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1441
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1442
    stamp: function(o, readOnly) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1443
        var uid;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1444
        if (!o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1445
            return o;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1446
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1447
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1448
        // IE generates its own unique ID for dom nodes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1449
        // The uniqueID property of a document node returns a new ID
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1450
        if (o.uniqueID && o.nodeType && o.nodeType !== 9) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1451
            uid = o.uniqueID;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1452
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1453
            uid = (typeof o === 'string') ? o : o._yuid;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1454
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1455
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1456
        if (!uid) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1457
            uid = this.guid();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1458
            if (!readOnly) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1459
                try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1460
                    o._yuid = uid;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1461
                } catch (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1462
                    uid = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1463
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1464
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1465
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1466
        return uid;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1467
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1468
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1469
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1470
    Destroys this YUI instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1471
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1472
    @method destroy
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1473
    @since 3.3.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1474
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1475
    destroy: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1476
        var Y = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1477
        if (Y.Event) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1478
            Y.Event._unload();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1479
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1480
        delete instances[Y.id];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1481
        delete Y.Env;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1482
        delete Y.config;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1483
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1484
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1485
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1486
    Safe `instanceof` wrapper that works around a memory leak in IE when the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1487
    object being tested is `window` or `document`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1488
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1489
    Unless you are testing objects that may be `window` or `document`, you
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1490
    should use the native `instanceof` operator instead of this method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1491
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1492
    @method instanceOf
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1493
    @param {Object} o Object to check.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1494
    @param {Object} type Class to check against.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1495
    @since 3.3.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1496
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1497
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1498
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1499
    YUI.prototype = proto;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1500
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1501
    // inheritance utilities are not available yet
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1502
    for (prop in proto) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1503
        if (proto.hasOwnProperty(prop)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1504
            YUI[prop] = proto[prop];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1505
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1506
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1507
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1508
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1509
    Applies a configuration to all YUI instances in this execution context.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1510
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1511
    The main use case for this method is in "mashups" where several third-party
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1512
    scripts need to write to a global YUI config, but cannot share a single
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1513
    centrally-managed config object. This way they can all call
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1514
    `YUI.applyConfig({})` instead of overwriting the single global config.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1515
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1516
    @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1517
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1518
        YUI.applyConfig({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1519
            modules: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1520
                davglass: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1521
                    fullpath: './davglass.js'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1522
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1523
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1524
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1525
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1526
        YUI.applyConfig({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1527
            modules: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1528
                foo: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1529
                    fullpath: './foo.js'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1530
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1531
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1532
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1533
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1534
        YUI().use('davglass', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1535
            // Module davglass will be available here.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1536
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1537
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1538
    @method applyConfig
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1539
    @param {Object} o Configuration object to apply.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1540
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1541
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1542
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1543
    YUI.applyConfig = function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1544
        if (!o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1545
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1546
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1547
        //If there is a GlobalConfig, apply it first to set the defaults
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1548
        if (YUI.GlobalConfig) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1549
            this.prototype.applyConfig.call(this, YUI.GlobalConfig);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1550
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1551
        //Apply this config to it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1552
        this.prototype.applyConfig.call(this, o);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1553
        //Reset GlobalConfig to the combined config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1554
        YUI.GlobalConfig = this.config;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1555
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1556
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1557
    // set up the environment
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1558
    YUI._init();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1559
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1560
    if (hasWin) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1561
        add(doc, 'DOMContentLoaded', handleReady);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1562
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1563
        // add a window load event at load time so we can capture
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1564
        // the case where it fires before dynamic loading is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1565
        // complete.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1566
        add(window, 'load', handleLoad);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1567
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1568
        handleReady();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1569
        handleLoad();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1570
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1571
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1572
    YUI.Env.add = add;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1573
    YUI.Env.remove = remove;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1574
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1575
    /*global exports*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1576
    // Support the CommonJS method for exporting our single global
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1577
    if (typeof exports == 'object') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1578
        exports.YUI = YUI;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1579
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1580
        * Set a method to be called when `Get.script` is called in Node.js
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1581
        * `Get` will open the file, then pass it's content and it's path
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1582
        * to this method before attaching it. Commonly used for code coverage
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1583
        * instrumentation. <strong>Calling this multiple times will only
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1584
        * attach the last hook method</strong>. This method is only
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1585
        * available in Node.js.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1586
        * @method setLoadHook
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1587
        * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1588
        * @param {Function} fn The function to set
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1589
        * @param {String} fn.data The content of the file
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1590
        * @param {String} fn.path The file path of the file
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1591
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1592
        YUI.setLoadHook = function(fn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1593
            YUI._getLoadHook = fn;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1594
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1595
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1596
        * Load hook for `Y.Get.script` in Node.js, see `YUI.setLoadHook`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1597
        * @method _getLoadHook
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1598
        * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1599
        * @param {String} data The content of the file
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1600
        * @param {String} path The file path of the file
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1601
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1602
        YUI._getLoadHook = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1603
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1604
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1605
    YUI.Env[VERSION] = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1606
}());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1607
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1608
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1609
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1610
Config object that contains all of the configuration options for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1611
this `YUI` instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1612
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1613
This object is supplied by the implementer when instantiating YUI. Some
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1614
properties have default values if they are not supplied by the implementer.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1615
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1616
This object should not be updated directly because some values are cached. Use
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1617
`applyConfig()` to update the config object on a YUI instance that has already
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1618
been configured.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1619
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1620
@class config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1621
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1622
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1623
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1624
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1625
If `true` (the default), YUI will "bootstrap" the YUI Loader and module metadata
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1626
if they're needed to load additional dependencies and aren't already available.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1627
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1628
Setting this to `false` will prevent YUI from automatically loading the Loader
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1629
and module metadata, so you will need to manually ensure that they're available
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1630
or handle dependency resolution yourself.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1631
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1632
@property {Boolean} bootstrap
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1633
@default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1634
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1635
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1636
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1637
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1638
@property {Object} filters
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1639
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1640
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1641
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1642
If `true`, YUI will use a combo handler to load multiple modules in as few
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1643
requests as possible.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1644
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1645
The YUI CDN (which YUI uses by default) supports combo handling, but other
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1646
servers may not. If the server from which you're loading YUI does not support
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1647
combo handling, set this to `false`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1648
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1649
Providing a value for the `base` config property will cause `combine` to default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1650
to `false` instead of `true`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1651
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1652
@property {Boolean} combine
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1653
@default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1654
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1655
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1656
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1657
Array of module names that should never be dynamically loaded.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1658
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1659
@property {String[]} ignore
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1660
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1661
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1662
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1663
Array of module names that should always be loaded when required, even if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1664
already present on the page.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1665
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1666
@property {String[]} force
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1667
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1668
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1669
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1670
DOM element or id that should be used as the insertion point for dynamically
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1671
added `<script>` and `<link>` nodes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1672
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1673
@property {HTMLElement|String} insertBefore
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1674
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1675
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1676
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1677
Object hash containing attributes to add to dynamically added `<script>` nodes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1678
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1679
@property {Object} jsAttributes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1680
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1681
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1682
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1683
Object hash containing attributes to add to dynamically added `<link>` nodes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1684
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1685
@property {Object} cssAttributes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1686
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1687
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1688
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1689
Timeout in milliseconds before a dynamic JS or CSS request will be considered a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1690
failure. If not set, no timeout will be enforced.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1691
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1692
@property {Number} timeout
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1693
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1694
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1695
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1696
Callback for the 'CSSComplete' event. When dynamically loading YUI components
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1697
with CSS, this property fires when the CSS is finished loading.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1698
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1699
This provides an opportunity to enhance the presentation of a loading page a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1700
little bit before the entire loading process is done.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1701
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1702
@property {Function} onCSS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1703
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1704
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1705
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1706
A hash of module definitions to add to the list of available YUI modules. These
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1707
modules can then be dynamically loaded via the `use()` method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1708
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1709
This is a hash in which keys are module names and values are objects containing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1710
module metadata.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1711
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1712
See `Loader.addModule()` for the supported module metadata fields. Also see
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1713
`groups`, which provides a way to configure the base and combo spec for a set of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1714
modules.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1715
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1716
@example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1717
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1718
    modules: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1719
        mymod1: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1720
            requires: ['node'],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1721
            fullpath: '/mymod1/mymod1.js'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1722
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1723
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1724
        mymod2: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1725
            requires: ['mymod1'],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1726
            fullpath: '/mymod2/mymod2.js'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1727
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1728
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1729
        mymod3: '/js/mymod3.js',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1730
        mycssmod: '/css/mycssmod.css'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1731
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1732
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1733
@property {Object} modules
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1734
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1735
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1736
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1737
Aliases are dynamic groups of modules that can be used as shortcuts.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1738
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1739
@example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1740
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1741
    YUI({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1742
        aliases: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1743
            davglass: [ 'node', 'yql', 'dd' ],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1744
            mine: [ 'davglass', 'autocomplete']
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1745
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1746
    }).use('mine', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1747
        // Node, YQL, DD & AutoComplete available here.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1748
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1749
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1750
@property {Object} aliases
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1751
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1752
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1753
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1754
A hash of module group definitions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1755
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1756
For each group you can specify a list of modules and the base path and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1757
combo spec to use when dynamically loading the modules.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1758
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1759
@example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1760
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1761
    groups: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1762
        yui2: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1763
            // specify whether or not this group has a combo service
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1764
            combine: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1765
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1766
            // The comboSeperator to use with this group's combo handler
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1767
            comboSep: ';',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1768
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1769
            // The maxURLLength for this server
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1770
            maxURLLength: 500,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1771
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1772
            // the base path for non-combo paths
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1773
            base: 'http://yui.yahooapis.com/2.8.0r4/build/',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1774
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1775
            // the path to the combo service
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1776
            comboBase: 'http://yui.yahooapis.com/combo?',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1777
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1778
            // a fragment to prepend to the path attribute when
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1779
            // when building combo urls
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1780
            root: '2.8.0r4/build/',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1781
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1782
            // the module definitions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1783
            modules:  {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1784
                yui2_yde: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1785
                    path: "yahoo-dom-event/yahoo-dom-event.js"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1786
                },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1787
                yui2_anim: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1788
                    path: "animation/animation.js",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1789
                    requires: ['yui2_yde']
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1790
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1791
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1792
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1793
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1794
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1795
@property {Object} groups
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1796
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1797
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1798
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1799
Path to the Loader JS file, relative to the `base` path.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1800
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1801
This is used to dynamically bootstrap the Loader when it's needed and isn't yet
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1802
available.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1803
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1804
@property {String} loaderPath
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1805
@default "loader/loader-min.js"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1806
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1807
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1808
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1809
If `true`, YUI will attempt to load CSS dependencies and skins. Set this to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1810
`false` to prevent YUI from loading any CSS, or set it to the string `"force"`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1811
to force CSS dependencies to be loaded even if their associated JS modules are
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1812
already loaded.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1813
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1814
@property {Boolean|String} fetchCSS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1815
@default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1816
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1817
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1818
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1819
Default gallery version used to build gallery module urls.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1820
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1821
@property {String} gallery
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1822
@since 3.1.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1823
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1824
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1825
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1826
Default YUI 2 version used to build YUI 2 module urls.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1827
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1828
This is used for intrinsic YUI 2 support via the 2in3 project. Also see the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1829
`2in3` config for pulling different revisions of the wrapped YUI 2 modules.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1830
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1831
@property {String} yui2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1832
@default "2.9.0"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1833
@since 3.1.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1834
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1835
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1836
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1837
Revision number of YUI 2in3 modules that should be used when loading YUI 2in3.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1838
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1839
@property {String} 2in3
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1840
@default "4"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1841
@since 3.1.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1842
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1843
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1844
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1845
Alternate console log function that should be used in environments without a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1846
supported native console. This function is executed with the YUI instance as its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1847
`this` object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1848
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1849
@property {Function} logFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1850
@since 3.1.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1851
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1852
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1853
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1854
The minimum log level to log messages for. Log levels are defined
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1855
incrementally. Messages greater than or equal to the level specified will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1856
be shown. All others will be discarded. The order of log levels in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1857
increasing priority is:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1858
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1859
    debug
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1860
    info
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1861
    warn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1862
    error
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1863
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1864
@property {String} logLevel
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1865
@default 'debug'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1866
@since 3.10.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1867
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1868
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1869
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1870
Callback to execute when `Y.error()` is called. It receives the error message
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1871
and a JavaScript error object if one was provided.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1872
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1873
This function is executed with the YUI instance as its `this` object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1874
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1875
Returning `true` from this function will prevent an exception from being thrown.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1876
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1877
@property {Function} errorFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1878
@param {String} errorFn.msg Error message
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1879
@param {Object} [errorFn.err] Error object (if one was provided).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1880
@since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1881
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1882
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1883
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1884
A callback to execute when Loader fails to load one or more resources.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1885
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1886
This could be because of a script load failure. It could also be because a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1887
module fails to register itself when the `requireRegistration` config is `true`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1888
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1889
If this function is defined, the `use()` callback will only be called when the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1890
loader succeeds. Otherwise, `use()` will always executes unless there was a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1891
JavaScript error when attaching a module.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1892
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1893
@property {Function} loadErrorFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1894
@since 3.3.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1895
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1896
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1897
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1898
If `true`, Loader will expect all loaded scripts to be first-class YUI modules
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1899
that register themselves with the YUI global, and will trigger a failure if a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1900
loaded script does not register a YUI module.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1901
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1902
@property {Boolean} requireRegistration
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1903
@default false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1904
@since 3.3.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1905
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1906
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1907
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1908
Cache serviced use() requests.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1909
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1910
@property {Boolean} cacheUse
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1911
@default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1912
@since 3.3.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1913
@deprecated No longer used.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1914
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1915
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1916
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1917
Whether or not YUI should use native ES5 functionality when available for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1918
features like `Y.Array.each()`, `Y.Object()`, etc.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1919
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1920
When `false`, YUI will always use its own fallback implementations instead of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1921
relying on ES5 functionality, even when ES5 functionality is available.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1922
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1923
@property {Boolean} useNativeES5
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1924
@default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1925
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1926
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1927
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1928
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1929
 * Leverage native JSON stringify if the browser has a native
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1930
 * implementation.  In general, this is a good idea.  See the Known Issues
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1931
 * section in the JSON user guide for caveats.  The default value is true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1932
 * for browsers with native JSON support.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1933
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1934
 * @property useNativeJSONStringify
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1935
 * @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1936
 * @default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1937
 * @since 3.8.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1938
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1939
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1940
 /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1941
 * Leverage native JSON parse if the browser has a native implementation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1942
 * In general, this is a good idea.  See the Known Issues section in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1943
 * JSON user guide for caveats.  The default value is true for browsers with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1944
 * native JSON support.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1945
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1946
 * @property useNativeJSONParse
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1947
 * @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1948
 * @default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1949
 * @since 3.8.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1950
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1951
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1952
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1953
Delay the `use` callback until a specific event has passed (`load`, `domready`, `contentready` or `available`)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1954
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1955
@property {Object|String} delayUntil
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1956
@since 3.6.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1957
@example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1958
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1959
You can use `load` or `domready` strings by default:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1960
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1961
    YUI({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1962
        delayUntil: 'domready'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1963
    }, function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1964
        // This will not execute until 'domeready' occurs.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1965
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1966
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1967
Or you can delay until a node is available (with `available` or `contentready`):
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1968
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1969
    YUI({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1970
        delayUntil: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1971
            event: 'available',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1972
            args : '#foo'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1973
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1974
    }, function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1975
        // This will not execute until a node matching the selector "#foo" is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1976
        // available in the DOM.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1977
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1978
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1979
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1980
YUI.add('yui-base', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1981
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1982
/*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1983
 * YUI stub
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1984
 * @module yui
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1985
 * @submodule yui-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1986
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1987
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1988
 * The YUI module contains the components required for building the YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1989
 * seed file.  This includes the script loading mechanism, a simple queue,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1990
 * and the core utilities for the library.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1991
 * @module yui
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1992
 * @submodule yui-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1993
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1994
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1995
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1996
 * Provides core language utilites and extensions used throughout YUI.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1997
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1998
 * @class Lang
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1999
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2000
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2001
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2002
var L = Y.Lang || (Y.Lang = {}),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2003
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2004
STRING_PROTO = String.prototype,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2005
TOSTRING     = Object.prototype.toString,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2006
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2007
TYPES = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2008
    'undefined'        : 'undefined',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2009
    'number'           : 'number',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2010
    'boolean'          : 'boolean',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2011
    'string'           : 'string',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2012
    '[object Function]': 'function',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2013
    '[object RegExp]'  : 'regexp',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2014
    '[object Array]'   : 'array',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2015
    '[object Date]'    : 'date',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2016
    '[object Error]'   : 'error'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2017
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2018
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2019
SUBREGEX         = /\{\s*([^|}]+?)\s*(?:\|([^}]*))?\s*\}/g,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2020
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2021
WHITESPACE       = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2022
WHITESPACE_CLASS = "[\x09-\x0D\x20\xA0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2023
TRIM_LEFT_REGEX  = new RegExp("^" + WHITESPACE_CLASS),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2024
TRIM_RIGHT_REGEX = new RegExp(WHITESPACE_CLASS + "$"),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2025
TRIMREGEX        = new RegExp(TRIM_LEFT_REGEX.source + "|" + TRIM_RIGHT_REGEX.source, "g"),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2026
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2027
NATIVE_FN_REGEX  = /\{\s*\[(?:native code|function)\]\s*\}/i;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2028
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2029
// -- Protected Methods --------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2030
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2031
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2032
Returns `true` if the given function appears to be implemented in native code,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2033
`false` otherwise. Will always return `false` -- even in ES5-capable browsers --
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2034
if the `useNativeES5` YUI config option is set to `false`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2035
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2036
This isn't guaranteed to be 100% accurate and won't work for anything other than
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2037
functions, but it can be useful for determining whether a function like
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2038
`Array.prototype.forEach` is native or a JS shim provided by another library.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2039
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2040
There's a great article by @kangax discussing certain flaws with this technique:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2041
<http://perfectionkills.com/detecting-built-in-host-methods/>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2042
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2043
While his points are valid, it's still possible to benefit from this function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2044
as long as it's used carefully and sparingly, and in such a way that false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2045
negatives have minimal consequences. It's used internally to avoid using
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2046
potentially broken non-native ES5 shims that have been added to the page by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2047
other libraries.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2048
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2049
@method _isNative
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2050
@param {Function} fn Function to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2051
@return {Boolean} `true` if _fn_ appears to be native, `false` otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2052
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2053
@protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2054
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2055
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2056
L._isNative = function (fn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2057
    return !!(Y.config.useNativeES5 && fn && NATIVE_FN_REGEX.test(fn));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2058
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2059
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2060
// -- Public Methods -----------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2061
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2062
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2063
 * Determines whether or not the provided item is an array.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2064
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2065
 * Returns `false` for array-like collections such as the function `arguments`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2066
 * collection or `HTMLElement` collections. Use `Y.Array.test()` if you want to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2067
 * test for an array-like collection.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2068
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2069
 * @method isArray
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2070
 * @param o The object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2071
 * @return {boolean} true if o is an array.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2072
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2073
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2074
L.isArray = L._isNative(Array.isArray) ? Array.isArray : function (o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2075
    return L.type(o) === 'array';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2076
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2077
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2078
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2079
 * Determines whether or not the provided item is a boolean.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2080
 * @method isBoolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2081
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2082
 * @param o The object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2083
 * @return {boolean} true if o is a boolean.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2084
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2085
L.isBoolean = function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2086
    return typeof o === 'boolean';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2087
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2088
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2089
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2090
 * Determines whether or not the supplied item is a date instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2091
 * @method isDate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2092
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2093
 * @param o The object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2094
 * @return {boolean} true if o is a date.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2095
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2096
L.isDate = function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2097
    return L.type(o) === 'date' && o.toString() !== 'Invalid Date' && !isNaN(o);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2098
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2099
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2100
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2101
 * <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2102
 * Determines whether or not the provided item is a function.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2103
 * Note: Internet Explorer thinks certain functions are objects:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2104
 * </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2105
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2106
 * <pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2107
 * var obj = document.createElement("object");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2108
 * Y.Lang.isFunction(obj.getAttribute) // reports false in IE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2109
 * &nbsp;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2110
 * var input = document.createElement("input"); // append to body
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2111
 * Y.Lang.isFunction(input.focus) // reports false in IE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2112
 * </pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2113
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2114
 * <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2115
 * You will have to implement additional tests if these functions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2116
 * matter to you.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2117
 * </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2118
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2119
 * @method isFunction
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2120
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2121
 * @param o The object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2122
 * @return {boolean} true if o is a function.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2123
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2124
L.isFunction = function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2125
    return L.type(o) === 'function';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2126
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2127
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2128
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2129
 * Determines whether or not the provided item is null.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2130
 * @method isNull
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2131
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2132
 * @param o The object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2133
 * @return {boolean} true if o is null.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2134
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2135
L.isNull = function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2136
    return o === null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2137
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2138
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2139
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2140
 * Determines whether or not the provided item is a legal number.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2141
 * @method isNumber
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2142
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2143
 * @param o The object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2144
 * @return {boolean} true if o is a number.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2145
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2146
L.isNumber = function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2147
    return typeof o === 'number' && isFinite(o);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2148
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2149
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2150
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2151
 * Determines whether or not the provided item is of type object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2152
 * or function. Note that arrays are also objects, so
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2153
 * <code>Y.Lang.isObject([]) === true</code>.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2154
 * @method isObject
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2155
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2156
 * @param o The object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2157
 * @param failfn {boolean} fail if the input is a function.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2158
 * @return {boolean} true if o is an object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2159
 * @see isPlainObject
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2160
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2161
L.isObject = function(o, failfn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2162
    var t = typeof o;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2163
    return (o && (t === 'object' ||
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2164
        (!failfn && (t === 'function' || L.isFunction(o))))) || false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2165
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2166
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2167
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2168
 * Determines whether or not the provided value is a regexp.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2169
 * @method isRegExp
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2170
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2171
 * @param value The value or object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2172
 * @return {boolean} true if value is a regexp.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2173
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2174
L.isRegExp = function(value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2175
    return L.type(value) === 'regexp';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2176
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2177
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2178
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2179
 * Determines whether or not the provided item is a string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2180
 * @method isString
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2181
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2182
 * @param o The object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2183
 * @return {boolean} true if o is a string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2184
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2185
L.isString = function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2186
    return typeof o === 'string';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2187
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2188
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2189
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2190
 * Determines whether or not the provided item is undefined.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2191
 * @method isUndefined
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2192
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2193
 * @param o The object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2194
 * @return {boolean} true if o is undefined.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2195
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2196
L.isUndefined = function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2197
    return typeof o === 'undefined';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2198
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2199
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2200
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2201
 * A convenience method for detecting a legitimate non-null value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2202
 * Returns false for null/undefined/NaN, true for other values,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2203
 * including 0/false/''
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2204
 * @method isValue
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2205
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2206
 * @param o The item to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2207
 * @return {boolean} true if it is not null/undefined/NaN || false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2208
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2209
L.isValue = function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2210
    var t = L.type(o);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2211
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2212
    switch (t) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2213
        case 'number':
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2214
            return isFinite(o);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2215
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2216
        case 'null': // fallthru
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2217
        case 'undefined':
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2218
            return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2219
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2220
        default:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2221
            return !!t;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2222
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2223
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2224
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2225
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2226
 * Returns the current time in milliseconds.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2227
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2228
 * @method now
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2229
 * @return {Number} Current time in milliseconds.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2230
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2231
 * @since 3.3.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2232
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2233
L.now = Date.now || function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2234
    return new Date().getTime();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2235
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2236
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2237
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2238
 * Performs `{placeholder}` substitution on a string. The object passed as the 
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2239
 * second parameter provides values to replace the `{placeholder}`s.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2240
 * `{placeholder}` token names must match property names of the object. For example,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2241
 * 
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2242
 *`var greeting = Y.Lang.sub("Hello, {who}!", { who: "World" });`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2243
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2244
 * `{placeholder}` tokens that are undefined on the object map will be left 
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2245
 * in tact (leaving unsightly `{placeholder}`'s in the output string). 
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2246
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2247
 * @method sub
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2248
 * @param {string} s String to be modified.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2249
 * @param {object} o Object containing replacement values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2250
 * @return {string} the substitute result.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2251
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2252
 * @since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2253
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2254
L.sub = function(s, o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2255
    return s.replace ? s.replace(SUBREGEX, function (match, key) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2256
        return L.isUndefined(o[key]) ? match : o[key];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2257
    }) : s;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2258
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2259
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2260
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2261
 * Returns a string without any leading or trailing whitespace.  If
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2262
 * the input is not a string, the input will be returned untouched.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2263
 * @method trim
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2264
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2265
 * @param s {string} the string to trim.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2266
 * @return {string} the trimmed string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2267
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2268
L.trim = L._isNative(STRING_PROTO.trim) && !WHITESPACE.trim() ? function(s) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2269
    return s && s.trim ? s.trim() : s;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2270
} : function (s) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2271
    try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2272
        return s.replace(TRIMREGEX, '');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2273
    } catch (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2274
        return s;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2275
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2276
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2277
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2278
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2279
 * Returns a string without any leading whitespace.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2280
 * @method trimLeft
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2281
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2282
 * @param s {string} the string to trim.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2283
 * @return {string} the trimmed string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2284
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2285
L.trimLeft = L._isNative(STRING_PROTO.trimLeft) && !WHITESPACE.trimLeft() ? function (s) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2286
    return s.trimLeft();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2287
} : function (s) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2288
    return s.replace(TRIM_LEFT_REGEX, '');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2289
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2290
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2291
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2292
 * Returns a string without any trailing whitespace.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2293
 * @method trimRight
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2294
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2295
 * @param s {string} the string to trim.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2296
 * @return {string} the trimmed string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2297
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2298
L.trimRight = L._isNative(STRING_PROTO.trimRight) && !WHITESPACE.trimRight() ? function (s) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2299
    return s.trimRight();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2300
} : function (s) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2301
    return s.replace(TRIM_RIGHT_REGEX, '');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2302
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2303
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2304
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2305
Returns one of the following strings, representing the type of the item passed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2306
in:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2307
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2308
 * "array"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2309
 * "boolean"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2310
 * "date"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2311
 * "error"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2312
 * "function"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2313
 * "null"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2314
 * "number"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2315
 * "object"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2316
 * "regexp"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2317
 * "string"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2318
 * "undefined"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2319
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2320
Known issues:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2321
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2322
 * `typeof HTMLElementCollection` returns function in Safari, but
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2323
    `Y.Lang.type()` reports "object", which could be a good thing --
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2324
    but it actually caused the logic in <code>Y.Lang.isObject</code> to fail.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2325
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2326
@method type
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2327
@param o the item to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2328
@return {string} the detected type.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2329
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2330
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2331
L.type = function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2332
    return TYPES[typeof o] || TYPES[TOSTRING.call(o)] || (o ? 'object' : 'null');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2333
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2334
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2335
@module yui
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2336
@submodule yui-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2337
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2338
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2339
var Lang   = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2340
    Native = Array.prototype,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2341
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2342
    hasOwn = Object.prototype.hasOwnProperty;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2343
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2344
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2345
Provides utility methods for working with arrays. Additional array helpers can
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2346
be found in the `collection` and `array-extras` modules.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2347
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2348
`Y.Array(thing)` returns a native array created from _thing_. Depending on
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2349
_thing_'s type, one of the following will happen:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2350
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2351
  * Arrays are returned unmodified unless a non-zero _startIndex_ is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2352
    specified.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2353
  * Array-like collections (see `Array.test()`) are converted to arrays.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2354
  * For everything else, a new array is created with _thing_ as the sole
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2355
    item.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2356
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2357
Note: elements that are also collections, such as `<form>` and `<select>`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2358
elements, are not automatically converted to arrays. To force a conversion,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2359
pass `true` as the value of the _force_ parameter.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2360
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2361
@class Array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2362
@constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2363
@param {Any} thing The thing to arrayify.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2364
@param {Number} [startIndex=0] If non-zero and _thing_ is an array or array-like
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2365
  collection, a subset of items starting at the specified index will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2366
  returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2367
@param {Boolean} [force=false] If `true`, _thing_ will be treated as an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2368
  array-like collection no matter what.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2369
@return {Array} A native array created from _thing_, according to the rules
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2370
  described above.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2371
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2372
function YArray(thing, startIndex, force) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2373
    var len, result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2374
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2375
    /*jshint expr: true*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2376
    startIndex || (startIndex = 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2377
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2378
    if (force || YArray.test(thing)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2379
        // IE throws when trying to slice HTMLElement collections.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2380
        try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2381
            return Native.slice.call(thing, startIndex);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2382
        } catch (ex) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2383
            result = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2384
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2385
            for (len = thing.length; startIndex < len; ++startIndex) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2386
                result.push(thing[startIndex]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2387
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2388
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2389
            return result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2390
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2391
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2392
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2393
    return [thing];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2394
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2395
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2396
Y.Array = YArray;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2397
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2398
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2399
Dedupes an array of strings, returning an array that's guaranteed to contain
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2400
only one copy of a given string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2401
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2402
This method differs from `Array.unique()` in that it's optimized for use only
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2403
with arrays consisting entirely of strings or entirely of numbers, whereas
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2404
`unique` may be used with other value types (but is slower).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2405
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2406
Using `dedupe()` with values other than strings or numbers, or with arrays
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2407
containing a mix of strings and numbers, may result in unexpected behavior.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2408
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2409
@method dedupe
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2410
@param {String[]|Number[]} array Array of strings or numbers to dedupe.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2411
@return {Array} Copy of _array_ containing no duplicate values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2412
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2413
@since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2414
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2415
YArray.dedupe = Lang._isNative(Object.create) ? function (array) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2416
    var hash    = Object.create(null),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2417
        results = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2418
        i, item, len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2419
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2420
    for (i = 0, len = array.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2421
        item = array[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2422
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2423
        if (!hash[item]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2424
            hash[item] = 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2425
            results.push(item);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2426
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2427
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2428
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2429
    return results;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2430
} : function (array) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2431
    var hash    = {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2432
        results = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2433
        i, item, len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2434
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2435
    for (i = 0, len = array.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2436
        item = array[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2437
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2438
        if (!hasOwn.call(hash, item)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2439
            hash[item] = 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2440
            results.push(item);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2441
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2442
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2443
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2444
    return results;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2445
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2446
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2447
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2448
Executes the supplied function on each item in the array. This method wraps
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2449
the native ES5 `Array.forEach()` method if available.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2450
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2451
@method each
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2452
@param {Array} array Array to iterate.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2453
@param {Function} fn Function to execute on each item in the array. The function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2454
  will receive the following arguments:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2455
    @param {Any} fn.item Current array item.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2456
    @param {Number} fn.index Current array index.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2457
    @param {Array} fn.array Array being iterated.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2458
@param {Object} [thisObj] `this` object to use when calling _fn_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2459
@return {YUI} The YUI instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2460
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2461
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2462
YArray.each = YArray.forEach = Lang._isNative(Native.forEach) ? function (array, fn, thisObj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2463
    Native.forEach.call(array || [], fn, thisObj || Y);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2464
    return Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2465
} : function (array, fn, thisObj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2466
    for (var i = 0, len = (array && array.length) || 0; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2467
        if (i in array) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2468
            fn.call(thisObj || Y, array[i], i, array);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2469
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2470
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2471
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2472
    return Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2473
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2474
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2475
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2476
Alias for `each()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2477
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2478
@method forEach
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2479
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2480
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2481
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2482
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2483
Returns an object using the first array as keys and the second as values. If
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2484
the second array is not provided, or if it doesn't contain the same number of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2485
values as the first array, then `true` will be used in place of the missing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2486
values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2487
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2488
@example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2489
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2490
    Y.Array.hash(['a', 'b', 'c'], ['foo', 'bar']);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2491
    // => {a: 'foo', b: 'bar', c: true}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2492
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2493
@method hash
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2494
@param {String[]} keys Array of strings to use as keys.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2495
@param {Array} [values] Array to use as values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2496
@return {Object} Hash using the first array as keys and the second as values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2497
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2498
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2499
YArray.hash = function (keys, values) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2500
    var hash = {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2501
        vlen = (values && values.length) || 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2502
        i, len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2503
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2504
    for (i = 0, len = keys.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2505
        if (i in keys) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2506
            hash[keys[i]] = vlen > i && i in values ? values[i] : true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2507
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2508
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2509
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2510
    return hash;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2511
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2512
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2513
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2514
Returns the index of the first item in the array that's equal (using a strict
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2515
equality check) to the specified _value_, or `-1` if the value isn't found.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2516
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2517
This method wraps the native ES5 `Array.indexOf()` method if available.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2518
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2519
@method indexOf
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2520
@param {Array} array Array to search.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2521
@param {Any} value Value to search for.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2522
@param {Number} [from=0] The index at which to begin the search.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2523
@return {Number} Index of the item strictly equal to _value_, or `-1` if not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2524
    found.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2525
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2526
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2527
YArray.indexOf = Lang._isNative(Native.indexOf) ? function (array, value, from) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2528
    return Native.indexOf.call(array, value, from);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2529
} : function (array, value, from) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2530
    // http://es5.github.com/#x15.4.4.14
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2531
    var len = array.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2532
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2533
    from = +from || 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2534
    from = (from > 0 || -1) * Math.floor(Math.abs(from));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2535
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2536
    if (from < 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2537
        from += len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2538
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2539
        if (from < 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2540
            from = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2541
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2542
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2543
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2544
    for (; from < len; ++from) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2545
        if (from in array && array[from] === value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2546
            return from;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2547
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2548
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2549
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2550
    return -1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2551
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2552
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2553
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2554
Numeric sort convenience function.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2555
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2556
The native `Array.prototype.sort()` function converts values to strings and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2557
sorts them in lexicographic order, which is unsuitable for sorting numeric
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2558
values. Provide `Array.numericSort` as a custom sort function when you want
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2559
to sort values in numeric order.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2560
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2561
@example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2562
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2563
    [42, 23, 8, 16, 4, 15].sort(Y.Array.numericSort);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2564
    // => [4, 8, 15, 16, 23, 42]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2565
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2566
@method numericSort
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2567
@param {Number} a First value to compare.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2568
@param {Number} b Second value to compare.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2569
@return {Number} Difference between _a_ and _b_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2570
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2571
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2572
YArray.numericSort = function (a, b) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2573
    return a - b;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2574
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2575
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2576
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2577
Executes the supplied function on each item in the array. Returning a truthy
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2578
value from the function will stop the processing of remaining items.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2579
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2580
@method some
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2581
@param {Array} array Array to iterate over.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2582
@param {Function} fn Function to execute on each item. The function will receive
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2583
  the following arguments:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2584
    @param {Any} fn.value Current array item.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2585
    @param {Number} fn.index Current array index.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2586
    @param {Array} fn.array Array being iterated over.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2587
@param {Object} [thisObj] `this` object to use when calling _fn_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2588
@return {Boolean} `true` if the function returns a truthy value on any of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2589
  items in the array; `false` otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2590
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2591
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2592
YArray.some = Lang._isNative(Native.some) ? function (array, fn, thisObj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2593
    return Native.some.call(array, fn, thisObj);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2594
} : function (array, fn, thisObj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2595
    for (var i = 0, len = array.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2596
        if (i in array && fn.call(thisObj, array[i], i, array)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2597
            return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2598
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2599
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2600
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2601
    return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2602
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2603
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2604
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2605
Evaluates _obj_ to determine if it's an array, an array-like collection, or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2606
something else. This is useful when working with the function `arguments`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2607
collection and `HTMLElement` collections.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2608
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2609
Note: This implementation doesn't consider elements that are also
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2610
collections, such as `<form>` and `<select>`, to be array-like.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2611
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2612
@method test
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2613
@param {Object} obj Object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2614
@return {Number} A number indicating the results of the test:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2615
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2616
  * 0: Neither an array nor an array-like collection.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2617
  * 1: Real array.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2618
  * 2: Array-like collection.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2619
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2620
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2621
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2622
YArray.test = function (obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2623
    var result = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2624
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2625
    if (Lang.isArray(obj)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2626
        result = 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2627
    } else if (Lang.isObject(obj)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2628
        try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2629
            // indexed, but no tagName (element) or scrollTo/document (window. From DOM.isWindow test which we can't use here),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2630
            // or functions without apply/call (Safari
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2631
            // HTMLElementCollection bug).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2632
            if ('length' in obj && !obj.tagName && !(obj.scrollTo && obj.document) && !obj.apply) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2633
                result = 2;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2634
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2635
        } catch (ex) {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2636
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2637
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2638
    return result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2639
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2640
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2641
 * The YUI module contains the components required for building the YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2642
 * seed file.  This includes the script loading mechanism, a simple queue,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2643
 * and the core utilities for the library.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2644
 * @module yui
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2645
 * @submodule yui-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2646
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2647
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2648
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2649
 * A simple FIFO queue.  Items are added to the Queue with add(1..n items) and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2650
 * removed using next().
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2651
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2652
 * @class Queue
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2653
 * @constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2654
 * @param {MIXED} item* 0..n items to seed the queue.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2655
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2656
function Queue() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2657
    this._init();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2658
    this.add.apply(this, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2659
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2660
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2661
Queue.prototype = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2662
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2663
     * Initialize the queue
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2664
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2665
     * @method _init
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2666
     * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2667
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2668
    _init: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2669
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2670
         * The collection of enqueued items
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2671
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2672
         * @property _q
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2673
         * @type Array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2674
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2675
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2676
        this._q = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2677
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2678
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2679
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2680
     * Get the next item in the queue. FIFO support
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2681
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2682
     * @method next
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2683
     * @return {MIXED} the next item in the queue.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2684
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2685
    next: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2686
        return this._q.shift();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2687
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2688
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2689
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2690
     * Get the last in the queue. LIFO support.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2691
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2692
     * @method last
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2693
     * @return {MIXED} the last item in the queue.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2694
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2695
    last: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2696
        return this._q.pop();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2697
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2698
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2699
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2700
     * Add 0..n items to the end of the queue.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2701
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2702
     * @method add
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2703
     * @param {MIXED} item* 0..n items.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2704
     * @return {object} this queue.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2705
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2706
    add: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2707
        this._q.push.apply(this._q, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2708
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2709
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2710
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2711
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2712
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2713
     * Returns the current number of queued items.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2714
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2715
     * @method size
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2716
     * @return {Number} The size.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2717
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2718
    size: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2719
        return this._q.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2720
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2721
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2722
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2723
Y.Queue = Queue;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2724
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2725
YUI.Env._loaderQueue = YUI.Env._loaderQueue || new Queue();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2726
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2727
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2728
The YUI module contains the components required for building the YUI seed file.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2729
This includes the script loading mechanism, a simple queue, and the core
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2730
utilities for the library.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2731
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2732
@module yui
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2733
@submodule yui-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2734
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2735
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2736
var CACHED_DELIMITER = '__',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2737
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2738
    hasOwn   = Object.prototype.hasOwnProperty,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2739
    isObject = Y.Lang.isObject;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2740
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2741
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2742
Returns a wrapper for a function which caches the return value of that function,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2743
keyed off of the combined string representation of the argument values provided
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2744
when the wrapper is called.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2745
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2746
Calling this function again with the same arguments will return the cached value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2747
rather than executing the wrapped function.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2748
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2749
Note that since the cache is keyed off of the string representation of arguments
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2750
passed to the wrapper function, arguments that aren't strings and don't provide
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2751
a meaningful `toString()` method may result in unexpected caching behavior. For
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2752
example, the objects `{}` and `{foo: 'bar'}` would both be converted to the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2753
string `[object Object]` when used as a cache key.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2754
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2755
@method cached
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2756
@param {Function} source The function to memoize.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2757
@param {Object} [cache={}] Object in which to store cached values. You may seed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2758
  this object with pre-existing cached values if desired.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2759
@param {any} [refetch] If supplied, this value is compared with the cached value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2760
  using a `==` comparison. If the values are equal, the wrapped function is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2761
  executed again even though a cached value exists.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2762
@return {Function} Wrapped function.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2763
@for YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2764
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2765
Y.cached = function (source, cache, refetch) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2766
    /*jshint expr: true*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2767
    cache || (cache = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2768
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2769
    return function (arg) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2770
        var key = arguments.length > 1 ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2771
                Array.prototype.join.call(arguments, CACHED_DELIMITER) :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2772
                String(arg);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2773
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2774
        /*jshint eqeqeq: false*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2775
        if (!(key in cache) || (refetch && cache[key] == refetch)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2776
            cache[key] = source.apply(source, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2777
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2778
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2779
        return cache[key];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2780
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2781
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2782
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2783
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2784
Returns the `location` object from the window/frame in which this YUI instance
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2785
operates, or `undefined` when executing in a non-browser environment
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2786
(e.g. Node.js).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2787
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2788
It is _not_ recommended to hold references to the `window.location` object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2789
outside of the scope of a function in which its properties are being accessed or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2790
its methods are being called. This is because of a nasty bug/issue that exists
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2791
in both Safari and MobileSafari browsers:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2792
[WebKit Bug 34679](https://bugs.webkit.org/show_bug.cgi?id=34679).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2793
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2794
@method getLocation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2795
@return {location} The `location` object from the window/frame in which this YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2796
    instance operates.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2797
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2798
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2799
Y.getLocation = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2800
    // It is safer to look this up every time because yui-base is attached to a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2801
    // YUI instance before a user's config is applied; i.e. `Y.config.win` does
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2802
    // not point the correct window object when this file is loaded.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2803
    var win = Y.config.win;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2804
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2805
    // It is not safe to hold a reference to the `location` object outside the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2806
    // scope in which it is being used. The WebKit engine used in Safari and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2807
    // MobileSafari will "disconnect" the `location` object from the `window`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2808
    // when a page is restored from back/forward history cache.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2809
    return win && win.location;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2810
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2811
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2812
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2813
Returns a new object containing all of the properties of all the supplied
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2814
objects. The properties from later objects will overwrite those in earlier
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2815
objects.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2816
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2817
Passing in a single object will create a shallow copy of it. For a deep copy,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2818
use `clone()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2819
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2820
@method merge
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2821
@param {Object} objects* One or more objects to merge.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2822
@return {Object} A new merged object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2823
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2824
Y.merge = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2825
    var i      = 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2826
        len    = arguments.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2827
        result = {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2828
        key,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2829
        obj;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2830
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2831
    for (; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2832
        obj = arguments[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2833
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2834
        for (key in obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2835
            if (hasOwn.call(obj, key)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2836
                result[key] = obj[key];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2837
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2838
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2839
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2840
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2841
    return result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2842
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2843
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2844
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2845
Mixes _supplier_'s properties into _receiver_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2846
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2847
Properties on _receiver_ or _receiver_'s prototype will not be overwritten or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2848
shadowed unless the _overwrite_ parameter is `true`, and will not be merged
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2849
unless the _merge_ parameter is `true`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2850
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2851
In the default mode (0), only properties the supplier owns are copied (prototype
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2852
properties are not copied). The following copying modes are available:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2853
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2854
  * `0`: _Default_. Object to object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2855
  * `1`: Prototype to prototype.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2856
  * `2`: Prototype to prototype and object to object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2857
  * `3`: Prototype to object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2858
  * `4`: Object to prototype.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2859
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2860
@method mix
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2861
@param {Function|Object} receiver The object or function to receive the mixed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2862
  properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2863
@param {Function|Object} supplier The object or function supplying the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2864
  properties to be mixed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2865
@param {Boolean} [overwrite=false] If `true`, properties that already exist
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2866
  on the receiver will be overwritten with properties from the supplier.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2867
@param {String[]} [whitelist] An array of property names to copy. If
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2868
  specified, only the whitelisted properties will be copied, and all others
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2869
  will be ignored.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2870
@param {Number} [mode=0] Mix mode to use. See above for available modes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2871
@param {Boolean} [merge=false] If `true`, objects and arrays that already
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2872
  exist on the receiver will have the corresponding object/array from the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2873
  supplier merged into them, rather than being skipped or overwritten. When
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2874
  both _overwrite_ and _merge_ are `true`, _merge_ takes precedence.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2875
@return {Function|Object|YUI} The receiver, or the YUI instance if the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2876
  specified receiver is falsy.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2877
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2878
Y.mix = function(receiver, supplier, overwrite, whitelist, mode, merge) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2879
    var alwaysOverwrite, exists, from, i, key, len, to;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2880
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2881
    // If no supplier is given, we return the receiver. If no receiver is given,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2882
    // we return Y. Returning Y doesn't make much sense to me, but it's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2883
    // grandfathered in for backcompat reasons.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2884
    if (!receiver || !supplier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2885
        return receiver || Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2886
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2887
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2888
    if (mode) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2889
        // In mode 2 (prototype to prototype and object to object), we recurse
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2890
        // once to do the proto to proto mix. The object to object mix will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2891
        // handled later on.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2892
        if (mode === 2) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2893
            Y.mix(receiver.prototype, supplier.prototype, overwrite,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2894
                    whitelist, 0, merge);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2895
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2896
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2897
        // Depending on which mode is specified, we may be copying from or to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2898
        // the prototypes of the supplier and receiver.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2899
        from = mode === 1 || mode === 3 ? supplier.prototype : supplier;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2900
        to   = mode === 1 || mode === 4 ? receiver.prototype : receiver;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2901
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2902
        // If either the supplier or receiver doesn't actually have a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2903
        // prototype property, then we could end up with an undefined `from`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2904
        // or `to`. If that happens, we abort and return the receiver.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2905
        if (!from || !to) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2906
            return receiver;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2907
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2908
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2909
        from = supplier;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2910
        to   = receiver;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2911
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2912
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2913
    // If `overwrite` is truthy and `merge` is falsy, then we can skip a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2914
    // property existence check on each iteration and save some time.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2915
    alwaysOverwrite = overwrite && !merge;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2916
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2917
    if (whitelist) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2918
        for (i = 0, len = whitelist.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2919
            key = whitelist[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2920
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2921
            // We call `Object.prototype.hasOwnProperty` instead of calling
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2922
            // `hasOwnProperty` on the object itself, since the object's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2923
            // `hasOwnProperty` method may have been overridden or removed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2924
            // Also, some native objects don't implement a `hasOwnProperty`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2925
            // method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2926
            if (!hasOwn.call(from, key)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2927
                continue;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2928
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2929
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2930
            // The `key in to` check here is (sadly) intentional for backwards
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2931
            // compatibility reasons. It prevents undesired shadowing of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2932
            // prototype members on `to`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2933
            exists = alwaysOverwrite ? false : key in to;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2934
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2935
            if (merge && exists && isObject(to[key], true)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2936
                    && isObject(from[key], true)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2937
                // If we're in merge mode, and the key is present on both
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2938
                // objects, and the value on both objects is either an object or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2939
                // an array (but not a function), then we recurse to merge the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2940
                // `from` value into the `to` value instead of overwriting it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2941
                //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2942
                // Note: It's intentional that the whitelist isn't passed to the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2943
                // recursive call here. This is legacy behavior that lots of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2944
                // code still depends on.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2945
                Y.mix(to[key], from[key], overwrite, null, 0, merge);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2946
            } else if (overwrite || !exists) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2947
                // We're not in merge mode, so we'll only copy the `from` value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2948
                // to the `to` value if we're in overwrite mode or if the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2949
                // current key doesn't exist on the `to` object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2950
                to[key] = from[key];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2951
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2952
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2953
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2954
        for (key in from) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2955
            // The code duplication here is for runtime performance reasons.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2956
            // Combining whitelist and non-whitelist operations into a single
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2957
            // loop or breaking the shared logic out into a function both result
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2958
            // in worse performance, and Y.mix is critical enough that the byte
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2959
            // tradeoff is worth it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2960
            if (!hasOwn.call(from, key)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2961
                continue;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2962
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2963
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2964
            // The `key in to` check here is (sadly) intentional for backwards
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2965
            // compatibility reasons. It prevents undesired shadowing of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2966
            // prototype members on `to`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2967
            exists = alwaysOverwrite ? false : key in to;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2968
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2969
            if (merge && exists && isObject(to[key], true)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2970
                    && isObject(from[key], true)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2971
                Y.mix(to[key], from[key], overwrite, null, 0, merge);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2972
            } else if (overwrite || !exists) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2973
                to[key] = from[key];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2974
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2975
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2976
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2977
        // If this is an IE browser with the JScript enumeration bug, force
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2978
        // enumeration of the buggy properties by making a recursive call with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2979
        // the buggy properties as the whitelist.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2980
        if (Y.Object._hasEnumBug) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2981
            Y.mix(to, from, overwrite, Y.Object._forceEnum, mode, merge);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2982
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2983
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2984
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2985
    return receiver;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2986
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2987
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2988
 * The YUI module contains the components required for building the YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2989
 * seed file.  This includes the script loading mechanism, a simple queue,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2990
 * and the core utilities for the library.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2991
 * @module yui
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2992
 * @submodule yui-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2993
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2994
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2995
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2996
 * Adds utilities to the YUI instance for working with objects.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2997
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2998
 * @class Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2999
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3000
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3001
var Lang   = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3002
    hasOwn = Object.prototype.hasOwnProperty,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3003
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3004
    UNDEFINED, // <-- Note the comma. We're still declaring vars.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3005
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3006
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3007
 * Returns a new object that uses _obj_ as its prototype. This method wraps the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3008
 * native ES5 `Object.create()` method if available, but doesn't currently
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3009
 * pass through `Object.create()`'s second argument (properties) in order to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3010
 * ensure compatibility with older browsers.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3011
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3012
 * @method ()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3013
 * @param {Object} obj Prototype object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3014
 * @return {Object} New object using _obj_ as its prototype.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3015
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3016
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3017
O = Y.Object = Lang._isNative(Object.create) ? function (obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3018
    // We currently wrap the native Object.create instead of simply aliasing it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3019
    // to ensure consistency with our fallback shim, which currently doesn't
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3020
    // support Object.create()'s second argument (properties). Once we have a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3021
    // safe fallback for the properties arg, we can stop wrapping
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3022
    // Object.create().
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3023
    return Object.create(obj);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3024
} : (function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3025
    // Reusable constructor function for the Object.create() shim.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3026
    function F() {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3027
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3028
    // The actual shim.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3029
    return function (obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3030
        F.prototype = obj;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3031
        return new F();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3032
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3033
}()),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3034
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3035
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3036
 * Property names that IE doesn't enumerate in for..in loops, even when they
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3037
 * should be enumerable. When `_hasEnumBug` is `true`, it's necessary to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3038
 * manually enumerate these properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3039
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3040
 * @property _forceEnum
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3041
 * @type String[]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3042
 * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3043
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3044
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3045
forceEnum = O._forceEnum = [
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3046
    'hasOwnProperty',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3047
    'isPrototypeOf',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3048
    'propertyIsEnumerable',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3049
    'toString',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3050
    'toLocaleString',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3051
    'valueOf'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3052
],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3053
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3054
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3055
 * `true` if this browser has the JScript enumeration bug that prevents
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3056
 * enumeration of the properties named in the `_forceEnum` array, `false`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3057
 * otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3058
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3059
 * See:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3060
 *   - <https://developer.mozilla.org/en/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3061
 *   - <http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3062
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3063
 * @property _hasEnumBug
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3064
 * @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3065
 * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3066
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3067
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3068
hasEnumBug = O._hasEnumBug = !{valueOf: 0}.propertyIsEnumerable('valueOf'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3069
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3070
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3071
 * `true` if this browser incorrectly considers the `prototype` property of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3072
 * functions to be enumerable. Currently known to affect Opera 11.50 and Android 2.3.x.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3073
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3074
 * @property _hasProtoEnumBug
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3075
 * @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3076
 * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3077
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3078
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3079
hasProtoEnumBug = O._hasProtoEnumBug = (function () {}).propertyIsEnumerable('prototype'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3080
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3081
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3082
 * Returns `true` if _key_ exists on _obj_, `false` if _key_ doesn't exist or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3083
 * exists only on _obj_'s prototype. This is essentially a safer version of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3084
 * `obj.hasOwnProperty()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3085
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3086
 * @method owns
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3087
 * @param {Object} obj Object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3088
 * @param {String} key Property name to look for.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3089
 * @return {Boolean} `true` if _key_ exists on _obj_, `false` otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3090
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3091
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3092
owns = O.owns = function (obj, key) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3093
    return !!obj && hasOwn.call(obj, key);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3094
}; // <-- End of var declarations.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3095
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3096
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3097
 * Alias for `owns()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3098
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3099
 * @method hasKey
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3100
 * @param {Object} obj Object to test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3101
 * @param {String} key Property name to look for.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3102
 * @return {Boolean} `true` if _key_ exists on _obj_, `false` otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3103
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3104
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3105
O.hasKey = owns;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3106
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3107
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3108
 * Returns an array containing the object's enumerable keys. Does not include
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3109
 * prototype keys or non-enumerable keys.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3110
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3111
 * Note that keys are returned in enumeration order (that is, in the same order
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3112
 * that they would be enumerated by a `for-in` loop), which may not be the same
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3113
 * as the order in which they were defined.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3114
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3115
 * This method is an alias for the native ES5 `Object.keys()` method if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3116
 * available and non-buggy. The Opera 11.50 and Android 2.3.x versions of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3117
 * `Object.keys()` have an inconsistency as they consider `prototype` to be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3118
 * enumerable, so a non-native shim is used to rectify the difference.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3119
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3120
 * @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3121
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3122
 *     Y.Object.keys({a: 'foo', b: 'bar', c: 'baz'});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3123
 *     // => ['a', 'b', 'c']
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3124
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3125
 * @method keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3126
 * @param {Object} obj An object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3127
 * @return {String[]} Array of keys.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3128
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3129
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3130
O.keys = Lang._isNative(Object.keys) && !hasProtoEnumBug ? Object.keys : function (obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3131
    if (!Lang.isObject(obj)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3132
        throw new TypeError('Object.keys called on a non-object');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3133
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3134
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3135
    var keys = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3136
        i, key, len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3137
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3138
    if (hasProtoEnumBug && typeof obj === 'function') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3139
        for (key in obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3140
            if (owns(obj, key) && key !== 'prototype') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3141
                keys.push(key);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3142
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3143
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3144
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3145
        for (key in obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3146
            if (owns(obj, key)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3147
                keys.push(key);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3148
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3149
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3150
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3151
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3152
    if (hasEnumBug) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3153
        for (i = 0, len = forceEnum.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3154
            key = forceEnum[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3155
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3156
            if (owns(obj, key)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3157
                keys.push(key);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3158
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3159
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3160
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3161
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3162
    return keys;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3163
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3164
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3165
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3166
 * Returns an array containing the values of the object's enumerable keys.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3167
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3168
 * Note that values are returned in enumeration order (that is, in the same
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3169
 * order that they would be enumerated by a `for-in` loop), which may not be the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3170
 * same as the order in which they were defined.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3171
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3172
 * @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3173
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3174
 *     Y.Object.values({a: 'foo', b: 'bar', c: 'baz'});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3175
 *     // => ['foo', 'bar', 'baz']
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3176
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3177
 * @method values
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3178
 * @param {Object} obj An object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3179
 * @return {Array} Array of values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3180
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3181
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3182
O.values = function (obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3183
    var keys   = O.keys(obj),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3184
        i      = 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3185
        len    = keys.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3186
        values = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3187
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3188
    for (; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3189
        values.push(obj[keys[i]]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3190
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3191
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3192
    return values;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3193
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3194
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3195
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3196
 * Returns the number of enumerable keys owned by an object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3197
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3198
 * @method size
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3199
 * @param {Object} obj An object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3200
 * @return {Number} The object's size.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3201
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3202
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3203
O.size = function (obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3204
    try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3205
        return O.keys(obj).length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3206
    } catch (ex) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3207
        return 0; // Legacy behavior for non-objects.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3208
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3209
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3210
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3211
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3212
 * Returns `true` if the object owns an enumerable property with the specified
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3213
 * value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3214
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3215
 * @method hasValue
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3216
 * @param {Object} obj An object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3217
 * @param {any} value The value to search for.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3218
 * @return {Boolean} `true` if _obj_ contains _value_, `false` otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3219
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3220
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3221
O.hasValue = function (obj, value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3222
    return Y.Array.indexOf(O.values(obj), value) > -1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3223
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3224
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3225
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3226
 * Executes a function on each enumerable property in _obj_. The function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3227
 * receives the value, the key, and the object itself as parameters (in that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3228
 * order).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3229
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3230
 * By default, only properties owned by _obj_ are enumerated. To include
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3231
 * prototype properties, set the _proto_ parameter to `true`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3232
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3233
 * @method each
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3234
 * @param {Object} obj Object to enumerate.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3235
 * @param {Function} fn Function to execute on each enumerable property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3236
 *   @param {mixed} fn.value Value of the current property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3237
 *   @param {String} fn.key Key of the current property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3238
 *   @param {Object} fn.obj Object being enumerated.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3239
 * @param {Object} [thisObj] `this` object to use when calling _fn_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3240
 * @param {Boolean} [proto=false] Include prototype properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3241
 * @return {YUI} the YUI instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3242
 * @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3243
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3244
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3245
O.each = function (obj, fn, thisObj, proto) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3246
    var key;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3247
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3248
    for (key in obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3249
        if (proto || owns(obj, key)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3250
            fn.call(thisObj || Y, obj[key], key, obj);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3251
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3252
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3253
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3254
    return Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3255
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3256
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3257
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3258
 * Executes a function on each enumerable property in _obj_, but halts if the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3259
 * function returns a truthy value. The function receives the value, the key,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3260
 * and the object itself as paramters (in that order).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3261
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3262
 * By default, only properties owned by _obj_ are enumerated. To include
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3263
 * prototype properties, set the _proto_ parameter to `true`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3264
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3265
 * @method some
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3266
 * @param {Object} obj Object to enumerate.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3267
 * @param {Function} fn Function to execute on each enumerable property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3268
 *   @param {mixed} fn.value Value of the current property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3269
 *   @param {String} fn.key Key of the current property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3270
 *   @param {Object} fn.obj Object being enumerated.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3271
 * @param {Object} [thisObj] `this` object to use when calling _fn_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3272
 * @param {Boolean} [proto=false] Include prototype properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3273
 * @return {Boolean} `true` if any execution of _fn_ returns a truthy value,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3274
 *   `false` otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3275
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3276
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3277
O.some = function (obj, fn, thisObj, proto) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3278
    var key;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3279
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3280
    for (key in obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3281
        if (proto || owns(obj, key)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3282
            if (fn.call(thisObj || Y, obj[key], key, obj)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3283
                return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3284
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3285
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3286
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3287
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3288
    return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3289
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3290
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3291
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3292
 * Retrieves the sub value at the provided path,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3293
 * from the value object provided.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3294
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3295
 * @method getValue
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3296
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3297
 * @param o The object from which to extract the property value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3298
 * @param path {Array} A path array, specifying the object traversal path
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3299
 * from which to obtain the sub value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3300
 * @return {Any} The value stored in the path, undefined if not found,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3301
 * undefined if the source is not an object.  Returns the source object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3302
 * if an empty path is provided.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3303
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3304
O.getValue = function(o, path) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3305
    if (!Lang.isObject(o)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3306
        return UNDEFINED;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3307
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3308
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3309
    var i,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3310
        p = Y.Array(path),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3311
        l = p.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3312
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3313
    for (i = 0; o !== UNDEFINED && i < l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3314
        o = o[p[i]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3315
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3316
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3317
    return o;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3318
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3319
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3320
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3321
 * Sets the sub-attribute value at the provided path on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3322
 * value object.  Returns the modified value object, or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3323
 * undefined if the path is invalid.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3324
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3325
 * @method setValue
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3326
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3327
 * @param o             The object on which to set the sub value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3328
 * @param path {Array}  A path array, specifying the object traversal path
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3329
 *                      at which to set the sub value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3330
 * @param val {Any}     The new value for the sub-attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3331
 * @return {Object}     The modified object, with the new sub value set, or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3332
 *                      undefined, if the path was invalid.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3333
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3334
O.setValue = function(o, path, val) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3335
    var i,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3336
        p = Y.Array(path),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3337
        leafIdx = p.length - 1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3338
        ref = o;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3339
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3340
    if (leafIdx >= 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3341
        for (i = 0; ref !== UNDEFINED && i < leafIdx; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3342
            ref = ref[p[i]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3343
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3344
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3345
        if (ref !== UNDEFINED) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3346
            ref[p[i]] = val;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3347
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3348
            return UNDEFINED;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3349
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3350
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3351
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3352
    return o;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3353
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3354
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3355
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3356
 * Returns `true` if the object has no enumerable properties of its own.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3357
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3358
 * @method isEmpty
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3359
 * @param {Object} obj An object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3360
 * @return {Boolean} `true` if the object is empty.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3361
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3362
 * @since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3363
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3364
O.isEmpty = function (obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3365
    return !O.keys(Object(obj)).length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3366
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3367
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3368
 * The YUI module contains the components required for building the YUI seed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3369
 * file.  This includes the script loading mechanism, a simple queue, and the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3370
 * core utilities for the library.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3371
 * @module yui
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3372
 * @submodule yui-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3373
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3374
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3375
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3376
 * YUI user agent detection.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3377
 * Do not fork for a browser if it can be avoided.  Use feature detection when
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3378
 * you can.  Use the user agent as a last resort.  For all fields listed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3379
 * as @type float, UA stores a version number for the browser engine,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3380
 * 0 otherwise.  This value may or may not map to the version number of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3381
 * the browser using the engine.  The value is presented as a float so
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3382
 * that it can easily be used for boolean evaluation as well as for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3383
 * looking for a particular range of versions.  Because of this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3384
 * some of the granularity of the version info may be lost.  The fields that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3385
 * are @type string default to null.  The API docs list the values that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3386
 * these fields can have.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3387
 * @class UA
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3388
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3389
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3390
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3391
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3392
* Static method on `YUI.Env` for parsing a UA string.  Called at instantiation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3393
* to populate `Y.UA`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3394
*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3395
* @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3396
* @method parseUA
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3397
* @param {String} [subUA=navigator.userAgent] UA string to parse
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3398
* @return {Object} The Y.UA object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3399
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3400
YUI.Env.parseUA = function(subUA) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3401
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3402
    var numberify = function(s) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3403
            var c = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3404
            return parseFloat(s.replace(/\./g, function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3405
                return (c++ === 1) ? '' : '.';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3406
            }));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3407
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3408
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3409
        win = Y.config.win,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3410
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3411
        nav = win && win.navigator,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3412
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3413
        o = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3414
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3415
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3416
         * Internet Explorer version number or 0.  Example: 6
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3417
         * @property ie
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3418
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3419
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3420
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3421
        ie: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3422
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3423
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3424
         * Opera version number or 0.  Example: 9.2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3425
         * @property opera
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3426
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3427
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3428
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3429
        opera: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3430
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3431
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3432
         * Gecko engine revision number.  Will evaluate to 1 if Gecko
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3433
         * is detected but the revision could not be found. Other browsers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3434
         * will be 0.  Example: 1.8
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3435
         * <pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3436
         * Firefox 1.0.0.4: 1.7.8   <-- Reports 1.7
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3437
         * Firefox 1.5.0.9: 1.8.0.9 <-- 1.8
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3438
         * Firefox 2.0.0.3: 1.8.1.3 <-- 1.81
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3439
         * Firefox 3.0   <-- 1.9
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3440
         * Firefox 3.5   <-- 1.91
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3441
         * </pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3442
         * @property gecko
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3443
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3444
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3445
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3446
        gecko: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3447
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3448
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3449
         * AppleWebKit version.  KHTML browsers that are not WebKit browsers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3450
         * will evaluate to 1, other browsers 0.  Example: 418.9
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3451
         * <pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3452
         * Safari 1.3.2 (312.6): 312.8.1 <-- Reports 312.8 -- currently the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3453
         *                                   latest available for Mac OSX 10.3.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3454
         * Safari 2.0.2:         416     <-- hasOwnProperty introduced
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3455
         * Safari 2.0.4:         418     <-- preventDefault fixed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3456
         * Safari 2.0.4 (419.3): 418.9.1 <-- One version of Safari may run
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3457
         *                                   different versions of webkit
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3458
         * Safari 2.0.4 (419.3): 419     <-- Tiger installations that have been
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3459
         *                                   updated, but not updated
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3460
         *                                   to the latest patch.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3461
         * Webkit 212 nightly:   522+    <-- Safari 3.0 precursor (with native
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3462
         * SVG and many major issues fixed).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3463
         * Safari 3.0.4 (523.12) 523.12  <-- First Tiger release - automatic
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3464
         * update from 2.x via the 10.4.11 OS patch.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3465
         * Webkit nightly 1/2008:525+    <-- Supports DOMContentLoaded event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3466
         *                                   yahoo.com user agent hack removed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3467
         * </pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3468
         * http://en.wikipedia.org/wiki/Safari_version_history
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3469
         * @property webkit
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3470
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3471
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3472
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3473
        webkit: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3474
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3475
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3476
         * Safari will be detected as webkit, but this property will also
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3477
         * be populated with the Safari version number
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3478
         * @property safari
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3479
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3480
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3481
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3482
        safari: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3483
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3484
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3485
         * Chrome will be detected as webkit, but this property will also
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3486
         * be populated with the Chrome version number
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3487
         * @property chrome
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3488
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3489
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3490
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3491
        chrome: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3492
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3493
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3494
         * The mobile property will be set to a string containing any relevant
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3495
         * user agent information when a modern mobile browser is detected.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3496
         * Currently limited to Safari on the iPhone/iPod Touch, Nokia N-series
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3497
         * devices with the WebKit-based browser, and Opera Mini.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3498
         * @property mobile
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3499
         * @type string
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3500
         * @default null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3501
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3502
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3503
        mobile: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3504
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3505
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3506
         * Adobe AIR version number or 0.  Only populated if webkit is detected.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3507
         * Example: 1.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3508
         * @property air
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3509
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3510
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3511
        air: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3512
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3513
         * PhantomJS version number or 0.  Only populated if webkit is detected.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3514
         * Example: 1.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3515
         * @property phantomjs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3516
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3517
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3518
        phantomjs: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3519
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3520
         * Detects Apple iPad's OS version
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3521
         * @property ipad
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3522
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3523
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3524
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3525
        ipad: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3526
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3527
         * Detects Apple iPhone's OS version
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3528
         * @property iphone
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3529
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3530
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3531
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3532
        iphone: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3533
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3534
         * Detects Apples iPod's OS version
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3535
         * @property ipod
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3536
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3537
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3538
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3539
        ipod: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3540
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3541
         * General truthy check for iPad, iPhone or iPod
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3542
         * @property ios
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3543
         * @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3544
         * @default null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3545
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3546
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3547
        ios: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3548
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3549
         * Detects Googles Android OS version
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3550
         * @property android
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3551
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3552
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3553
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3554
        android: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3555
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3556
         * Detects Kindle Silk
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3557
         * @property silk
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3558
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3559
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3560
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3561
        silk: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3562
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3563
         * Detects Kindle Silk Acceleration
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3564
         * @property accel
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3565
         * @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3566
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3567
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3568
        accel: false,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3569
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3570
         * Detects Palms WebOS version
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3571
         * @property webos
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3572
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3573
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3574
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3575
        webos: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3576
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3577
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3578
         * Google Caja version number or 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3579
         * @property caja
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3580
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3581
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3582
        caja: nav && nav.cajaVersion,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3583
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3584
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3585
         * Set to true if the page appears to be in SSL
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3586
         * @property secure
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3587
         * @type boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3588
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3589
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3590
        secure: false,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3591
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3592
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3593
         * The operating system.  Currently only detecting windows or macintosh
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3594
         * @property os
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3595
         * @type string
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3596
         * @default null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3597
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3598
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3599
        os: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3600
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3601
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3602
         * The Nodejs Version
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3603
         * @property nodejs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3604
         * @type float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3605
         * @default 0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3606
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3607
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3608
        nodejs: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3609
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3610
        * Window8/IE10 Application host environment
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3611
        * @property winjs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3612
        * @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3613
        * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3614
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3615
        winjs: !!((typeof Windows !== "undefined") && Windows.System),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3616
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3617
        * Are touch/msPointer events available on this device
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3618
        * @property touchEnabled
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3619
        * @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3620
        * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3621
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3622
        touchEnabled: false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3623
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3624
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3625
    ua = subUA || nav && nav.userAgent,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3626
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3627
    loc = win && win.location,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3628
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3629
    href = loc && loc.href,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3630
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3631
    m;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3632
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3633
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3634
    * The User Agent string that was parsed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3635
    * @property userAgent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3636
    * @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3637
    * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3638
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3639
    o.userAgent = ua;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3640
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3641
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3642
    o.secure = href && (href.toLowerCase().indexOf('https') === 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3643
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3644
    if (ua) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3645
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3646
        if ((/windows|win32/i).test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3647
            o.os = 'windows';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3648
        } else if ((/macintosh|mac_powerpc/i).test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3649
            o.os = 'macintosh';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3650
        } else if ((/android/i).test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3651
            o.os = 'android';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3652
        } else if ((/symbos/i).test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3653
            o.os = 'symbos';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3654
        } else if ((/linux/i).test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3655
            o.os = 'linux';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3656
        } else if ((/rhino/i).test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3657
            o.os = 'rhino';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3658
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3659
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3660
        // Modern KHTML browsers should qualify as Safari X-Grade
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3661
        if ((/KHTML/).test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3662
            o.webkit = 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3663
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3664
        if ((/IEMobile|XBLWP7/).test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3665
            o.mobile = 'windows';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3666
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3667
        if ((/Fennec/).test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3668
            o.mobile = 'gecko';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3669
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3670
        // Modern WebKit browsers are at least X-Grade
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3671
        m = ua.match(/AppleWebKit\/([^\s]*)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3672
        if (m && m[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3673
            o.webkit = numberify(m[1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3674
            o.safari = o.webkit;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3675
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3676
            if (/PhantomJS/.test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3677
                m = ua.match(/PhantomJS\/([^\s]*)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3678
                if (m && m[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3679
                    o.phantomjs = numberify(m[1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3680
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3681
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3682
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3683
            // Mobile browser check
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3684
            if (/ Mobile\//.test(ua) || (/iPad|iPod|iPhone/).test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3685
                o.mobile = 'Apple'; // iPhone or iPod Touch
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3686
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3687
                m = ua.match(/OS ([^\s]*)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3688
                if (m && m[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3689
                    m = numberify(m[1].replace('_', '.'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3690
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3691
                o.ios = m;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3692
                o.os = 'ios';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3693
                o.ipad = o.ipod = o.iphone = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3694
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3695
                m = ua.match(/iPad|iPod|iPhone/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3696
                if (m && m[0]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3697
                    o[m[0].toLowerCase()] = o.ios;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3698
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3699
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3700
                m = ua.match(/NokiaN[^\/]*|webOS\/\d\.\d/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3701
                if (m) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3702
                    // Nokia N-series, webOS, ex: NokiaN95
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3703
                    o.mobile = m[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3704
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3705
                if (/webOS/.test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3706
                    o.mobile = 'WebOS';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3707
                    m = ua.match(/webOS\/([^\s]*);/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3708
                    if (m && m[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3709
                        o.webos = numberify(m[1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3710
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3711
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3712
                if (/ Android/.test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3713
                    if (/Mobile/.test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3714
                        o.mobile = 'Android';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3715
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3716
                    m = ua.match(/Android ([^\s]*);/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3717
                    if (m && m[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3718
                        o.android = numberify(m[1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3719
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3720
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3721
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3722
                if (/Silk/.test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3723
                    m = ua.match(/Silk\/([^\s]*)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3724
                    if (m && m[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3725
                        o.silk = numberify(m[1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3726
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3727
                    if (!o.android) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3728
                        o.android = 2.34; //Hack for desktop mode in Kindle
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3729
                        o.os = 'Android';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3730
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3731
                    if (/Accelerated=true/.test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3732
                        o.accel = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3733
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3734
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3735
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3736
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3737
            m = ua.match(/OPR\/(\d+\.\d+)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3738
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3739
            if (m && m[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3740
                // Opera 15+ with Blink (pretends to be both Chrome and Safari)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3741
                o.opera = numberify(m[1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3742
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3743
                m = ua.match(/(Chrome|CrMo|CriOS)\/([^\s]*)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3744
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3745
                if (m && m[1] && m[2]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3746
                    o.chrome = numberify(m[2]); // Chrome
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3747
                    o.safari = 0; //Reset safari back to 0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3748
                    if (m[1] === 'CrMo') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3749
                        o.mobile = 'chrome';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3750
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3751
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3752
                    m = ua.match(/AdobeAIR\/([^\s]*)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3753
                    if (m) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3754
                        o.air = m[0]; // Adobe AIR 1.0 or better
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3755
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3756
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3757
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3758
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3759
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3760
        if (!o.webkit) { // not webkit
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3761
// @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; fi; U; ssr)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3762
            if (/Opera/.test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3763
                m = ua.match(/Opera[\s\/]([^\s]*)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3764
                if (m && m[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3765
                    o.opera = numberify(m[1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3766
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3767
                m = ua.match(/Version\/([^\s]*)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3768
                if (m && m[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3769
                    o.opera = numberify(m[1]); // opera 10+
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3770
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3771
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3772
                if (/Opera Mobi/.test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3773
                    o.mobile = 'opera';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3774
                    m = ua.replace('Opera Mobi', '').match(/Opera ([^\s]*)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3775
                    if (m && m[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3776
                        o.opera = numberify(m[1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3777
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3778
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3779
                m = ua.match(/Opera Mini[^;]*/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3780
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3781
                if (m) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3782
                    o.mobile = m[0]; // ex: Opera Mini/2.0.4509/1316
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3783
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3784
            } else { // not opera or webkit
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3785
                m = ua.match(/MSIE ([^;]*)|Trident.*; rv:([0-9.]+)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3786
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3787
                if (m && (m[1] || m[2])) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3788
                    o.ie = numberify(m[1] || m[2]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3789
                } else { // not opera, webkit, or ie
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3790
                    m = ua.match(/Gecko\/([^\s]*)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3791
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3792
                    if (m) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3793
                        o.gecko = 1; // Gecko detected, look for revision
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3794
                        m = ua.match(/rv:([^\s\)]*)/);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3795
                        if (m && m[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3796
                            o.gecko = numberify(m[1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3797
                            if (/Mobile|Tablet/.test(ua)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3798
                                o.mobile = "ffos";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3799
                            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3800
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3801
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3802
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3803
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3804
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3805
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3806
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3807
    //Check for known properties to tell if touch events are enabled on this device or if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3808
    //the number of MSPointer touchpoints on this device is greater than 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3809
    if (win && nav && !(o.chrome && o.chrome < 6)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3810
        o.touchEnabled = (("ontouchstart" in win) || (("msMaxTouchPoints" in nav) && (nav.msMaxTouchPoints > 0)));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3811
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3812
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3813
    //It was a parsed UA, do not assign the global value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3814
    if (!subUA) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3815
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3816
        if (typeof process === 'object') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3817
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3818
            if (process.versions && process.versions.node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3819
                //NodeJS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3820
                o.os = process.platform;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3821
                o.nodejs = numberify(process.versions.node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3822
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3823
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3824
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3825
        YUI.Env.UA = o;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3826
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3827
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3828
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3829
    return o;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3830
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3831
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3832
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3833
Y.UA = YUI.Env.UA || YUI.Env.parseUA();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3834
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3835
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3836
Performs a simple comparison between two version numbers, accounting for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3837
standard versioning logic such as the fact that "535.8" is a lower version than
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3838
"535.24", even though a simple numerical comparison would indicate that it's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3839
greater. Also accounts for cases such as "1.1" vs. "1.1.0", which are
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3840
considered equivalent.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3841
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3842
Returns -1 if version _a_ is lower than version _b_, 0 if they're equivalent,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3843
1 if _a_ is higher than _b_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3844
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3845
Versions may be numbers or strings containing numbers and dots. For example,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3846
both `535` and `"535.8.10"` are acceptable. A version string containing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3847
non-numeric characters, like `"535.8.beta"`, may produce unexpected results.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3848
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3849
@method compareVersions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3850
@param {Number|String} a First version number to compare.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3851
@param {Number|String} b Second version number to compare.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3852
@return -1 if _a_ is lower than _b_, 0 if they're equivalent, 1 if _a_ is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3853
    higher than _b_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3854
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3855
Y.UA.compareVersions = function (a, b) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3856
    var aPart, aParts, bPart, bParts, i, len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3857
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3858
    if (a === b) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3859
        return 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3860
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3861
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3862
    aParts = (a + '').split('.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3863
    bParts = (b + '').split('.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3864
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3865
    for (i = 0, len = Math.max(aParts.length, bParts.length); i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3866
        aPart = parseInt(aParts[i], 10);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3867
        bPart = parseInt(bParts[i], 10);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3868
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3869
        /*jshint expr: true*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3870
        isNaN(aPart) && (aPart = 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3871
        isNaN(bPart) && (bPart = 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3872
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3873
        if (aPart < bPart) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3874
            return -1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3875
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3876
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3877
        if (aPart > bPart) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3878
            return 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3879
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3880
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3881
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3882
    return 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3883
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3884
YUI.Env.aliases = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3885
    "anim": ["anim-base","anim-color","anim-curve","anim-easing","anim-node-plugin","anim-scroll","anim-xy"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3886
    "anim-shape-transform": ["anim-shape"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3887
    "app": ["app-base","app-content","app-transitions","lazy-model-list","model","model-list","model-sync-rest","model-sync-local","router","view","view-node-map"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3888
    "attribute": ["attribute-base","attribute-complex"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3889
    "attribute-events": ["attribute-observable"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3890
    "autocomplete": ["autocomplete-base","autocomplete-sources","autocomplete-list","autocomplete-plugin"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3891
    "axes": ["axis-numeric","axis-category","axis-time","axis-stacked"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3892
    "axes-base": ["axis-numeric-base","axis-category-base","axis-time-base","axis-stacked-base"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3893
    "base": ["base-base","base-pluginhost","base-build"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3894
    "cache": ["cache-base","cache-offline","cache-plugin"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3895
    "charts": ["charts-base"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3896
    "collection": ["array-extras","arraylist","arraylist-add","arraylist-filter","array-invoke"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3897
    "color": ["color-base","color-hsl","color-harmony"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3898
    "controller": ["router"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3899
    "dataschema": ["dataschema-base","dataschema-json","dataschema-xml","dataschema-array","dataschema-text"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3900
    "datasource": ["datasource-local","datasource-io","datasource-get","datasource-function","datasource-cache","datasource-jsonschema","datasource-xmlschema","datasource-arrayschema","datasource-textschema","datasource-polling"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3901
    "datatable": ["datatable-core","datatable-table","datatable-head","datatable-body","datatable-base","datatable-column-widths","datatable-message","datatable-mutable","datatable-sort","datatable-datasource"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3902
    "datatype": ["datatype-date","datatype-number","datatype-xml"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3903
    "datatype-date": ["datatype-date-parse","datatype-date-format","datatype-date-math"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3904
    "datatype-number": ["datatype-number-parse","datatype-number-format"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3905
    "datatype-xml": ["datatype-xml-parse","datatype-xml-format"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3906
    "dd": ["dd-ddm-base","dd-ddm","dd-ddm-drop","dd-drag","dd-proxy","dd-constrain","dd-drop","dd-scroll","dd-delegate"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3907
    "dom": ["dom-base","dom-screen","dom-style","selector-native","selector"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3908
    "editor": ["frame","editor-selection","exec-command","editor-base","editor-para","editor-br","editor-bidi","editor-tab","createlink-base"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3909
    "event": ["event-base","event-delegate","event-synthetic","event-mousewheel","event-mouseenter","event-key","event-focus","event-resize","event-hover","event-outside","event-touch","event-move","event-flick","event-valuechange","event-tap"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3910
    "event-custom": ["event-custom-base","event-custom-complex"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3911
    "event-gestures": ["event-flick","event-move"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3912
    "handlebars": ["handlebars-compiler"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3913
    "highlight": ["highlight-base","highlight-accentfold"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3914
    "history": ["history-base","history-hash","history-html5"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3915
    "io": ["io-base","io-xdr","io-form","io-upload-iframe","io-queue"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3916
    "json": ["json-parse","json-stringify"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3917
    "loader": ["loader-base","loader-rollup","loader-yui3"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3918
    "node": ["node-base","node-event-delegate","node-pluginhost","node-screen","node-style"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3919
    "pluginhost": ["pluginhost-base","pluginhost-config"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3920
    "querystring": ["querystring-parse","querystring-stringify"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3921
    "recordset": ["recordset-base","recordset-sort","recordset-filter","recordset-indexer"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3922
    "resize": ["resize-base","resize-proxy","resize-constrain"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3923
    "slider": ["slider-base","slider-value-range","clickable-rail","range-slider"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3924
    "template": ["template-base","template-micro"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3925
    "text": ["text-accentfold","text-wordbreak"],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3926
    "widget": ["widget-base","widget-htmlparser","widget-skin","widget-uievents"]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3927
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3928
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3929
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3930
}, '@VERSION@', {"use": ["get", "features", "intl-base", "yui-log", "yui-later"]});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3931
YUI.add('get', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3932
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3933
/*jslint boss:true, expr:true, laxbreak: true */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3934
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3935
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3936
Provides dynamic loading of remote JavaScript and CSS resources.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3937
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3938
@module get
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3939
@class Get
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3940
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3941
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3942
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3943
var Lang = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3944
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3945
    CUSTOM_ATTRS, // defined lazily in Y.Get.Transaction._createNode()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3946
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3947
    Get, Transaction;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3948
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3949
Y.Get = Get = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3950
    // -- Public Properties ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3951
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3952
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3953
    Default options for CSS requests. Options specified here will override
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3954
    global defaults for CSS requests.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3955
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3956
    See the `options` property for all available options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3957
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3958
    @property cssOptions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3959
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3960
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3961
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3962
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3963
    cssOptions: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3964
        attributes: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3965
            rel: 'stylesheet'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3966
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3967
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3968
        doc         : Y.config.linkDoc || Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3969
        pollInterval: 50
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3970
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3971
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3972
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3973
    Default options for JS requests. Options specified here will override global
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3974
    defaults for JS requests.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3975
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3976
    See the `options` property for all available options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3977
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3978
    @property jsOptions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3979
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3980
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3981
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3982
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3983
    jsOptions: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3984
        autopurge: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3985
        doc      : Y.config.scriptDoc || Y.config.doc
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3986
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3987
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3988
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3989
    Default options to use for all requests.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3990
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3991
    Note that while all available options are documented here for ease of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3992
    discovery, some options (like callback functions) only make sense at the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3993
    transaction level.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3994
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3995
    Callback functions specified via the options object or the `options`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3996
    parameter of the `css()`, `js()`, or `load()` methods will receive the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3997
    transaction object as a parameter. See `Y.Get.Transaction` for details on
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3998
    the properties and methods available on transactions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  3999
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4000
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4001
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4002
    @property {Object} options
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4003
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4004
    @property {Boolean} [options.async=false] Whether or not to load scripts
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4005
        asynchronously, meaning they're requested in parallel and execution
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4006
        order is not guaranteed. Has no effect on CSS, since CSS is always
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4007
        loaded asynchronously.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4008
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4009
    @property {Object} [options.attributes] HTML attribute name/value pairs that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4010
        should be added to inserted nodes. By default, the `charset` attribute
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4011
        will be set to "utf-8" and nodes will be given an auto-generated `id`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4012
        attribute, but you can override these with your own values if desired.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4013
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4014
    @property {Boolean} [options.autopurge] Whether or not to automatically
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4015
        purge inserted nodes after the purge threshold is reached. This is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4016
        `true` by default for JavaScript, but `false` for CSS since purging a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4017
        CSS node will also remove any styling applied by the referenced file.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4018
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4019
    @property {Object} [options.context] `this` object to use when calling
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4020
        callback functions. Defaults to the transaction object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4021
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4022
    @property {Mixed} [options.data] Arbitrary data object to pass to "on*"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4023
        callbacks.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4024
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4025
    @property {Document} [options.doc] Document into which nodes should be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4026
        inserted. By default, the current document is used.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4027
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4028
    @property {HTMLElement|String} [options.insertBefore] HTML element or id
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4029
        string of an element before which all generated nodes should be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4030
        inserted. If not specified, Get will automatically determine the best
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4031
        place to insert nodes for maximum compatibility.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4032
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4033
    @property {Function} [options.onEnd] Callback to execute after a transaction
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4034
        is complete, regardless of whether it succeeded or failed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4035
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4036
    @property {Function} [options.onFailure] Callback to execute after a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4037
        transaction fails, times out, or is aborted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4038
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4039
    @property {Function} [options.onProgress] Callback to execute after each
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4040
        individual request in a transaction either succeeds or fails.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4041
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4042
    @property {Function} [options.onSuccess] Callback to execute after a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4043
        transaction completes successfully with no errors. Note that in browsers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4044
        that don't support the `error` event on CSS `<link>` nodes, a failed CSS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4045
        request may still be reported as a success because in these browsers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4046
        it can be difficult or impossible to distinguish between success and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4047
        failure for CSS resources.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4048
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4049
    @property {Function} [options.onTimeout] Callback to execute after a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4050
        transaction times out.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4051
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4052
    @property {Number} [options.pollInterval=50] Polling interval (in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4053
        milliseconds) for detecting CSS load completion in browsers that don't
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4054
        support the `load` event on `<link>` nodes. This isn't used for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4055
        JavaScript.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4056
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4057
    @property {Number} [options.purgethreshold=20] Number of nodes to insert
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4058
        before triggering an automatic purge when `autopurge` is `true`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4059
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4060
    @property {Number} [options.timeout] Number of milliseconds to wait before
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4061
        aborting a transaction. When a timeout occurs, the `onTimeout` callback
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4062
        is called, followed by `onFailure` and finally `onEnd`. By default,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4063
        there is no timeout.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4064
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4065
    @property {String} [options.type] Resource type ("css" or "js"). This option
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4066
        is set automatically by the `css()` and `js()` functions and will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4067
        ignored there, but may be useful when using the `load()` function. If
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4068
        not specified, the type will be inferred from the URL, defaulting to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4069
        "js" if the URL doesn't contain a recognizable file extension.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4070
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4071
    options: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4072
        attributes: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4073
            charset: 'utf-8'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4074
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4075
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4076
        purgethreshold: 20
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4077
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4078
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4079
    // -- Protected Properties -------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4080
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4081
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4082
    Regex that matches a CSS URL. Used to guess the file type when it's not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4083
    specified.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4084
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4085
    @property REGEX_CSS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4086
    @type RegExp
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4087
    @final
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4088
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4089
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4090
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4091
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4092
    REGEX_CSS: /\.css(?:[?;].*)?$/i,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4093
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4094
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4095
    Regex that matches a JS URL. Used to guess the file type when it's not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4096
    specified.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4097
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4098
    @property REGEX_JS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4099
    @type RegExp
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4100
    @final
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4101
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4102
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4103
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4104
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4105
    REGEX_JS : /\.js(?:[?;].*)?$/i,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4106
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4107
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4108
    Contains information about the current environment, such as what script and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4109
    link injection features it supports.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4110
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4111
    This object is created and populated the first time the `_getEnv()` method
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4112
    is called.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4113
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4114
    @property _env
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4115
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4116
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4117
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4118
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4119
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4120
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4121
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4122
    Mapping of document _yuid strings to <head> or <base> node references so we
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4123
    don't have to look the node up each time we want to insert a request node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4124
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4125
    @property _insertCache
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4126
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4127
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4128
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4129
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4130
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4131
    _insertCache: {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4132
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4133
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4134
    Information about the currently pending transaction, if any.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4135
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4136
    This is actually an object with two properties: `callback`, containing the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4137
    optional callback passed to `css()`, `load()`, or `js()`; and `transaction`,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4138
    containing the actual transaction instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4139
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4140
    @property _pending
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4141
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4142
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4143
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4144
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4145
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4146
    _pending: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4147
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4148
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4149
    HTML nodes eligible to be purged next time autopurge is triggered.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4150
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4151
    @property _purgeNodes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4152
    @type HTMLElement[]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4153
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4154
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4155
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4156
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4157
    _purgeNodes: [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4158
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4159
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4160
    Queued transactions and associated callbacks.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4161
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4162
    @property _queue
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4163
    @type Object[]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4164
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4165
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4166
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4167
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4168
    _queue: [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4169
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4170
    // -- Public Methods -------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4171
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4172
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4173
    Aborts the specified transaction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4174
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4175
    This will cause the transaction's `onFailure` callback to be called and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4176
    will prevent any new script and link nodes from being added to the document,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4177
    but any resources that have already been requested will continue loading
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4178
    (there's no safe way to prevent this, unfortunately).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4179
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4180
    *Note:* This method is deprecated as of 3.5.0, and will be removed in a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4181
    future version of YUI. Use the transaction-level `abort()` method instead.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4182
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4183
    @method abort
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4184
    @param {Get.Transaction} transaction Transaction to abort.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4185
    @deprecated Use the `abort()` method on the transaction instead.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4186
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4187
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4188
    abort: function (transaction) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4189
        var i, id, item, len, pending;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4190
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4191
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4192
        if (!transaction.abort) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4193
            id          = transaction;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4194
            pending     = this._pending;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4195
            transaction = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4196
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4197
            if (pending && pending.transaction.id === id) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4198
                transaction   = pending.transaction;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4199
                this._pending = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4200
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4201
                for (i = 0, len = this._queue.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4202
                    item = this._queue[i].transaction;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4203
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4204
                    if (item.id === id) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4205
                        transaction = item;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4206
                        this._queue.splice(i, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4207
                        break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4208
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4209
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4210
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4211
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4212
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4213
        transaction && transaction.abort();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4214
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4215
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4216
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4217
    Loads one or more CSS files.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4218
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4219
    The _urls_ parameter may be provided as a URL string, a request object,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4220
    or an array of URL strings and/or request objects.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4221
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4222
    A request object is just an object that contains a `url` property and zero
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4223
    or more options that should apply specifically to that request.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4224
    Request-specific options take priority over transaction-level options and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4225
    default options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4226
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4227
    URLs may be relative or absolute, and do not have to have the same origin
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4228
    as the current page.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4229
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4230
    The `options` parameter may be omitted completely and a callback passed in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4231
    its place, if desired.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4232
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4233
    @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4234
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4235
        // Load a single CSS file and log a message on completion.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4236
        Y.Get.css('foo.css', function (err) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4237
            if (err) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4238
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4239
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4240
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4241
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4242
        // Load multiple CSS files and log a message when all have finished
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4243
        // loading.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4244
        var urls = ['foo.css', 'http://example.com/bar.css', 'baz/quux.css'];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4245
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4246
        Y.Get.css(urls, function (err) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4247
            if (err) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4248
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4249
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4250
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4251
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4252
        // Specify transaction-level options, which will apply to all requests
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4253
        // within the transaction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4254
        Y.Get.css(urls, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4255
            attributes: {'class': 'my-css'},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4256
            timeout   : 5000
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4257
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4258
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4259
        // Specify per-request options, which override transaction-level and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4260
        // default options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4261
        Y.Get.css([
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4262
            {url: 'foo.css', attributes: {id: 'foo'}},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4263
            {url: 'bar.css', attributes: {id: 'bar', charset: 'iso-8859-1'}}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4264
        ]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4265
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4266
    @method css
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4267
    @param {String|Object|Array} urls URL string, request object, or array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4268
        of URLs and/or request objects to load.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4269
    @param {Object} [options] Options for this transaction. See the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4270
        `Y.Get.options` property for a complete list of available options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4271
    @param {Function} [callback] Callback function to be called on completion.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4272
        This is a general callback and will be called before any more granular
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4273
        callbacks (`onSuccess`, `onFailure`, etc.) specified in the `options`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4274
        object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4275
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4276
        @param {Array|null} callback.err Array of errors that occurred during
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4277
            the transaction, or `null` on success.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4278
        @param {Get.Transaction} callback.transaction Transaction object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4279
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4280
    @return {Get.Transaction} Transaction object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4281
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4282
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4283
    css: function (urls, options, callback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4284
        return this._load('css', urls, options, callback);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4285
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4286
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4287
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4288
    Loads one or more JavaScript resources.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4289
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4290
    The _urls_ parameter may be provided as a URL string, a request object,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4291
    or an array of URL strings and/or request objects.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4292
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4293
    A request object is just an object that contains a `url` property and zero
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4294
    or more options that should apply specifically to that request.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4295
    Request-specific options take priority over transaction-level options and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4296
    default options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4297
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4298
    URLs may be relative or absolute, and do not have to have the same origin
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4299
    as the current page.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4300
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4301
    The `options` parameter may be omitted completely and a callback passed in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4302
    its place, if desired.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4303
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4304
    Scripts will be executed in the order they're specified unless the `async`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4305
    option is `true`, in which case they'll be loaded in parallel and executed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4306
    in whatever order they finish loading.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4307
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4308
    @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4309
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4310
        // Load a single JS file and log a message on completion.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4311
        Y.Get.js('foo.js', function (err) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4312
            if (err) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4313
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4314
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4315
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4316
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4317
        // Load multiple JS files, execute them in order, and log a message when
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4318
        // all have finished loading.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4319
        var urls = ['foo.js', 'http://example.com/bar.js', 'baz/quux.js'];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4320
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4321
        Y.Get.js(urls, function (err) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4322
            if (err) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4323
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4324
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4325
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4326
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4327
        // Specify transaction-level options, which will apply to all requests
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4328
        // within the transaction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4329
        Y.Get.js(urls, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4330
            attributes: {'class': 'my-js'},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4331
            timeout   : 5000
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4332
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4333
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4334
        // Specify per-request options, which override transaction-level and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4335
        // default options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4336
        Y.Get.js([
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4337
            {url: 'foo.js', attributes: {id: 'foo'}},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4338
            {url: 'bar.js', attributes: {id: 'bar', charset: 'iso-8859-1'}}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4339
        ]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4340
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4341
    @method js
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4342
    @param {String|Object|Array} urls URL string, request object, or array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4343
        of URLs and/or request objects to load.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4344
    @param {Object} [options] Options for this transaction. See the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4345
        `Y.Get.options` property for a complete list of available options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4346
    @param {Function} [callback] Callback function to be called on completion.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4347
        This is a general callback and will be called before any more granular
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4348
        callbacks (`onSuccess`, `onFailure`, etc.) specified in the `options`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4349
        object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4350
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4351
        @param {Array|null} callback.err Array of errors that occurred during
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4352
            the transaction, or `null` on success.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4353
        @param {Get.Transaction} callback.transaction Transaction object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4354
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4355
    @return {Get.Transaction} Transaction object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4356
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4357
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4358
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4359
    js: function (urls, options, callback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4360
        return this._load('js', urls, options, callback);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4361
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4362
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4363
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4364
    Loads one or more CSS and/or JavaScript resources in the same transaction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4365
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4366
    Use this method when you want to load both CSS and JavaScript in a single
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4367
    transaction and be notified when all requested URLs have finished loading,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4368
    regardless of type.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4369
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4370
    Behavior and options are the same as for the `css()` and `js()` methods. If
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4371
    a resource type isn't specified in per-request options or transaction-level
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4372
    options, Get will guess the file type based on the URL's extension (`.css`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4373
    or `.js`, with or without a following query string). If the file type can't
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4374
    be guessed from the URL, a warning will be logged and Get will assume the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4375
    URL is a JavaScript resource.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4376
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4377
    @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4378
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4379
        // Load both CSS and JS files in a single transaction, and log a message
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4380
        // when all files have finished loading.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4381
        Y.Get.load(['foo.css', 'bar.js', 'baz.css'], function (err) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4382
            if (err) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4383
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4384
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4385
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4387
    @method load
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4388
    @param {String|Object|Array} urls URL string, request object, or array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4389
        of URLs and/or request objects to load.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4390
    @param {Object} [options] Options for this transaction. See the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4391
        `Y.Get.options` property for a complete list of available options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4392
    @param {Function} [callback] Callback function to be called on completion.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4393
        This is a general callback and will be called before any more granular
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4394
        callbacks (`onSuccess`, `onFailure`, etc.) specified in the `options`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4395
        object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4396
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4397
        @param {Array|null} err Array of errors that occurred during the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4398
            transaction, or `null` on success.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4399
        @param {Get.Transaction} Transaction object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4400
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4401
    @return {Get.Transaction} Transaction object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4402
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4403
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4404
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4405
    load: function (urls, options, callback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4406
        return this._load(null, urls, options, callback);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4407
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4408
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4409
    // -- Protected Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4410
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4411
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4412
    Triggers an automatic purge if the purge threshold has been reached.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4413
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4414
    @method _autoPurge
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4415
    @param {Number} threshold Purge threshold to use, in milliseconds.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4416
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4417
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4418
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4419
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4420
    _autoPurge: function (threshold) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4421
        if (threshold && this._purgeNodes.length >= threshold) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4422
            this._purge(this._purgeNodes);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4423
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4424
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4425
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4426
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4427
    Populates the `_env` property with information about the current
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4428
    environment.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4429
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4430
    @method _getEnv
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4431
    @return {Object} Environment information.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4432
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4433
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4434
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4435
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4436
    _getEnv: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4437
        var doc = Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4438
            ua  = Y.UA;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4439
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4440
        // Note: some of these checks require browser sniffs since it's not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4441
        // feasible to load test files on every pageview just to perform a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4442
        // feature test. I'm sorry if this makes you sad.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4443
        return (this._env = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4444
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4445
            // True if this is a browser that supports disabling async mode on
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4446
            // dynamically created script nodes. See
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4447
            // https://developer.mozilla.org/En/HTML/Element/Script#Attributes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4448
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4449
            // IE10 doesn't return true for the MDN feature test, so setting it explicitly,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4450
            // because it is async by default, and allows you to disable async by setting it to false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4451
            async: (doc && doc.createElement('script').async === true) || (ua.ie >= 10),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4452
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4453
            // True if this browser fires an event when a dynamically injected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4454
            // link node fails to load. This is currently true for Firefox 9+
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4455
            // and WebKit 535.24+
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4456
            cssFail: ua.gecko >= 9 || ua.compareVersions(ua.webkit, 535.24) >= 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4457
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4458
            // True if this browser fires an event when a dynamically injected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4459
            // link node finishes loading. This is currently true for IE, Opera,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4460
            // Firefox 9+, and WebKit 535.24+. Note that IE versions <9 fire the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4461
            // DOM 0 "onload" event, but not "load". All versions of IE fire
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4462
            // "onload".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4463
            // davglass: Seems that Chrome on Android needs this to be false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4464
            cssLoad: (
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4465
                    (!ua.gecko && !ua.webkit) || ua.gecko >= 9 ||
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4466
                    ua.compareVersions(ua.webkit, 535.24) >= 0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4467
                ) && !(ua.chrome && ua.chrome <= 18),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4468
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4469
            // True if this browser preserves script execution order while
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4470
            // loading scripts in parallel as long as the script node's `async`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4471
            // attribute is set to false to explicitly disable async execution.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4472
            preservesScriptOrder: !!(ua.gecko || ua.opera || (ua.ie && ua.ie >= 10))
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4473
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4474
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4475
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4476
    _getTransaction: function (urls, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4477
        var requests = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4478
            i, len, req, url;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4479
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4480
        if (!Lang.isArray(urls)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4481
            urls = [urls];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4482
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4483
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4484
        options = Y.merge(this.options, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4485
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4486
        // Clone the attributes object so we don't end up modifying it by ref.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4487
        options.attributes = Y.merge(this.options.attributes,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4488
                options.attributes);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4489
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4490
        for (i = 0, len = urls.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4491
            url = urls[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4492
            req = {attributes: {}};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4493
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4494
            // If `url` is a string, we create a URL object for it, then mix in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4495
            // global options and request-specific options. If it's an object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4496
            // with a "url" property, we assume it's a request object containing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4497
            // URL-specific options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4498
            if (typeof url === 'string') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4499
                req.url = url;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4500
            } else if (url.url) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4501
                // URL-specific options override both global defaults and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4502
                // request-specific options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4503
                Y.mix(req, url, false, null, 0, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4504
                url = url.url; // Make url a string so we can use it later.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4505
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4506
                continue;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4507
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4508
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4509
            Y.mix(req, options, false, null, 0, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4510
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4511
            // If we didn't get an explicit type for this URL either in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4512
            // request options or the URL-specific options, try to determine
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4513
            // one from the file extension.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4514
            if (!req.type) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4515
                if (this.REGEX_CSS.test(url)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4516
                    req.type = 'css';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4517
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4518
                    if (!this.REGEX_JS.test(url)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4519
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4520
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4521
                    req.type = 'js';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4522
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4523
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4524
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4525
            // Mix in type-specific default options, but don't overwrite any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4526
            // options that have already been set.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4527
            Y.mix(req, req.type === 'js' ? this.jsOptions : this.cssOptions,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4528
                false, null, 0, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4529
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4530
            // Give the node an id attribute if it doesn't already have one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4531
            req.attributes.id || (req.attributes.id = Y.guid());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4532
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4533
            // Backcompat for <3.5.0 behavior.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4534
            if (req.win) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4535
                req.doc = req.win.document;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4536
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4537
                req.win = req.doc.defaultView || req.doc.parentWindow;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4538
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4539
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4540
            if (req.charset) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4541
                req.attributes.charset = req.charset;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4542
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4543
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4544
            requests.push(req);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4545
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4546
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4547
        return new Transaction(requests, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4548
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4549
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4550
    _load: function (type, urls, options, callback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4551
        var transaction;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4552
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4553
        // Allow callback as third param.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4554
        if (typeof options === 'function') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4555
            callback = options;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4556
            options  = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4557
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4558
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4559
        options || (options = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4560
        options.type = type;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4561
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4562
        options._onFinish = Get._onTransactionFinish;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4563
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4564
        if (!this._env) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4565
            this._getEnv();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4566
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4567
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4568
        transaction = this._getTransaction(urls, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4569
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4570
        this._queue.push({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4571
            callback   : callback,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4572
            transaction: transaction
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4573
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4574
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4575
        this._next();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4576
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4577
        return transaction;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4578
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4579
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4580
    _onTransactionFinish : function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4581
        Get._pending = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4582
        Get._next();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4583
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4584
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4585
    _next: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4586
        var item;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4587
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4588
        if (this._pending) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4589
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4590
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4591
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4592
        item = this._queue.shift();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4593
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4594
        if (item) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4595
            this._pending = item;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4596
            item.transaction.execute(item.callback);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4597
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4598
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4599
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4600
    _purge: function (nodes) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4601
        var purgeNodes    = this._purgeNodes,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4602
            isTransaction = nodes !== purgeNodes,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4603
            index, node;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4604
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4605
        while (node = nodes.pop()) { // assignment
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4606
            // Don't purge nodes that haven't finished loading (or errored out),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4607
            // since this can hang the transaction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4608
            if (!node._yuiget_finished) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4609
                continue;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4610
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4611
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4612
            node.parentNode && node.parentNode.removeChild(node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4613
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4614
            // If this is a transaction-level purge and this node also exists in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4615
            // the Get-level _purgeNodes array, we need to remove it from
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4616
            // _purgeNodes to avoid creating a memory leak. The indexOf lookup
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4617
            // sucks, but until we get WeakMaps, this is the least troublesome
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4618
            // way to do this (we can't just hold onto node ids because they may
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4619
            // not be in the same document).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4620
            if (isTransaction) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4621
                index = Y.Array.indexOf(purgeNodes, node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4622
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4623
                if (index > -1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4624
                    purgeNodes.splice(index, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4625
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4626
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4627
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4628
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4629
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4630
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4631
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4632
Alias for `js()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4633
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4634
@method script
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4635
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4636
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4637
Get.script = Get.js;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4638
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4639
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4640
Represents a Get transaction, which may contain requests for one or more JS or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4641
CSS files.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4642
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4643
This class should not be instantiated manually. Instances will be created and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4644
returned as needed by Y.Get's `css()`, `js()`, and `load()` methods.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4645
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4646
@class Get.Transaction
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4647
@constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4648
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4649
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4650
Get.Transaction = Transaction = function (requests, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4651
    var self = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4652
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4653
    self.id       = Transaction._lastId += 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4654
    self.data     = options.data;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4655
    self.errors   = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4656
    self.nodes    = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4657
    self.options  = options;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4658
    self.requests = requests;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4659
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4660
    self._callbacks = []; // callbacks to call after execution finishes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4661
    self._queue     = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4662
    self._reqsWaiting   = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4663
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4664
    // Deprecated pre-3.5.0 properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4665
    self.tId = self.id; // Use `id` instead.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4666
    self.win = options.win || Y.config.win;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4667
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4668
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4669
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4670
Arbitrary data object associated with this transaction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4671
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4672
This object comes from the options passed to `Get.css()`, `Get.js()`, or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4673
`Get.load()`, and will be `undefined` if no data object was specified.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4674
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4675
@property {Object} data
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4676
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4677
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4678
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4679
Array of errors that have occurred during this transaction, if any. Each error
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4680
object has the following properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4681
`errors.error`: Error message.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4682
`errors.request`: Request object related to the error.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4683
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4684
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4685
@property {Object[]} errors
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4686
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4687
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4688
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4689
Numeric id for this transaction, unique among all transactions within the same
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4690
YUI sandbox in the current pageview.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4691
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4692
@property {Number} id
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4693
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4694
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4695
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4696
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4697
HTMLElement nodes (native ones, not YUI Node instances) that have been inserted
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4698
during the current transaction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4699
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4700
@property {HTMLElement[]} nodes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4701
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4702
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4703
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4704
Options associated with this transaction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4705
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4706
See `Get.options` for the full list of available options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4707
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4708
@property {Object} options
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4709
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4710
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4711
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4712
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4713
Request objects contained in this transaction. Each request object represents
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4714
one CSS or JS URL that will be (or has been) requested and loaded into the page.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4715
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4716
@property {Object} requests
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4717
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4718
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4719
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4720
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4721
Id of the most recent transaction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4722
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4723
@property _lastId
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4724
@type Number
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4725
@protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4726
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4727
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4728
Transaction._lastId = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4729
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4730
Transaction.prototype = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4731
    // -- Public Properties ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4732
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4733
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4734
    Current state of this transaction. One of "new", "executing", or "done".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4735
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4736
    @property _state
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4737
    @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4738
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4739
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4740
    _state: 'new', // "new", "executing", or "done"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4741
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4742
    // -- Public Methods -------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4743
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4744
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4745
    Aborts this transaction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4746
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4747
    This will cause the transaction's `onFailure` callback to be called and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4748
    will prevent any new script and link nodes from being added to the document,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4749
    but any resources that have already been requested will continue loading
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4750
    (there's no safe way to prevent this, unfortunately).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4751
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4752
    @method abort
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4753
    @param {String} [msg="Aborted."] Optional message to use in the `errors`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4754
        array describing why the transaction was aborted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4755
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4756
    abort: function (msg) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4757
        this._pending    = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4758
        this._pendingCSS = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4759
        this._pollTimer  = clearTimeout(this._pollTimer);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4760
        this._queue      = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4761
        this._reqsWaiting    = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4762
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4763
        this.errors.push({error: msg || 'Aborted'});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4764
        this._finish();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4765
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4766
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4767
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4768
    Begins execting the transaction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4769
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4770
    There's usually no reason to call this manually, since Get will call it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4771
    automatically when other pending transactions have finished. If you really
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4772
    want to execute your transaction before Get does, you can, but be aware that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4773
    this transaction's scripts may end up executing before the scripts in other
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4774
    pending transactions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4775
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4776
    If the transaction is already executing, the specified callback (if any)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4777
    will be queued and called after execution finishes. If the transaction has
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4778
    already finished, the callback will be called immediately (the transaction
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4779
    will not be executed again).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4780
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4781
    @method execute
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4782
    @param {Function} callback Callback function to execute after all requests
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4783
        in the transaction are complete, or after the transaction is aborted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4784
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4785
    execute: function (callback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4786
        var self     = this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4787
            requests = self.requests,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4788
            state    = self._state,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4789
            i, len, queue, req;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4790
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4791
        if (state === 'done') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4792
            callback && callback(self.errors.length ? self.errors : null, self);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4793
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4794
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4795
            callback && self._callbacks.push(callback);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4796
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4797
            if (state === 'executing') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4798
                return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4799
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4800
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4801
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4802
        self._state = 'executing';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4803
        self._queue = queue = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4804
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4805
        if (self.options.timeout) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4806
            self._timeout = setTimeout(function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4807
                self.abort('Timeout');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4808
            }, self.options.timeout);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4809
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4810
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4811
        self._reqsWaiting = requests.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4812
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4813
        for (i = 0, len = requests.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4814
            req = requests[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4815
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4816
            if (req.async || req.type === 'css') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4817
                // No need to queue CSS or fully async JS.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4818
                self._insert(req);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4819
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4820
                queue.push(req);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4821
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4822
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4823
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4824
        self._next();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4825
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4826
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4827
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4828
    Manually purges any `<script>` or `<link>` nodes this transaction has
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4829
    created.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4830
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4831
    Be careful when purging a transaction that contains CSS requests, since
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4832
    removing `<link>` nodes will also remove any styles they applied.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4833
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4834
    @method purge
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4835
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4836
    purge: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4837
        Get._purge(this.nodes);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4838
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4839
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4840
    // -- Protected Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4841
    _createNode: function (name, attrs, doc) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4842
        var node = doc.createElement(name),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4843
            attr, testEl;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4844
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4845
        if (!CUSTOM_ATTRS) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4846
            // IE6 and IE7 expect property names rather than attribute names for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4847
            // certain attributes. Rather than sniffing, we do a quick feature
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4848
            // test the first time _createNode() runs to determine whether we
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4849
            // need to provide a workaround.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4850
            testEl = doc.createElement('div');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4851
            testEl.setAttribute('class', 'a');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4852
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4853
            CUSTOM_ATTRS = testEl.className === 'a' ? {} : {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4854
                'for'  : 'htmlFor',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4855
                'class': 'className'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4856
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4857
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4858
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4859
        for (attr in attrs) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4860
            if (attrs.hasOwnProperty(attr)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4861
                node.setAttribute(CUSTOM_ATTRS[attr] || attr, attrs[attr]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4862
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4863
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4864
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4865
        return node;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4866
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4867
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4868
    _finish: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4869
        var errors  = this.errors.length ? this.errors : null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4870
            options = this.options,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4871
            thisObj = options.context || this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4872
            data, i, len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4873
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4874
        if (this._state === 'done') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4875
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4876
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4877
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4878
        this._state = 'done';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4879
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4880
        for (i = 0, len = this._callbacks.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4881
            this._callbacks[i].call(thisObj, errors, this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4882
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4883
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4884
        data = this._getEventData();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4885
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4886
        if (errors) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4887
            if (options.onTimeout && errors[errors.length - 1].error === 'Timeout') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4888
                options.onTimeout.call(thisObj, data);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4889
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4890
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4891
            if (options.onFailure) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4892
                options.onFailure.call(thisObj, data);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4893
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4894
        } else if (options.onSuccess) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4895
            options.onSuccess.call(thisObj, data);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4896
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4897
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4898
        if (options.onEnd) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4899
            options.onEnd.call(thisObj, data);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4900
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4901
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4902
        if (options._onFinish) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4903
            options._onFinish();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4904
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4905
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4906
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4907
    _getEventData: function (req) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4908
        if (req) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4909
            // This merge is necessary for backcompat. I hate it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4910
            return Y.merge(this, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4911
                abort  : this.abort, // have to copy these because the prototype isn't preserved
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4912
                purge  : this.purge,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4913
                request: req,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4914
                url    : req.url,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4915
                win    : req.win
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4916
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4917
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4918
            return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4919
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4920
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4921
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4922
    _getInsertBefore: function (req) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4923
        var doc = req.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4924
            el  = req.insertBefore,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4925
            cache, docStamp;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4926
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4927
        if (el) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4928
            return typeof el === 'string' ? doc.getElementById(el) : el;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4929
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4930
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4931
        cache    = Get._insertCache;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4932
        docStamp = Y.stamp(doc);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4933
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4934
        if ((el = cache[docStamp])) { // assignment
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4935
            return el;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4936
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4937
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4938
        // Inserting before a <base> tag apparently works around an IE bug
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4939
        // (according to a comment from pre-3.5.0 Y.Get), but I'm not sure what
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4940
        // bug that is, exactly. Better safe than sorry?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4941
        if ((el = doc.getElementsByTagName('base')[0])) { // assignment
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4942
            return (cache[docStamp] = el);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4943
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4944
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4945
        // Look for a <head> element.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4946
        el = doc.head || doc.getElementsByTagName('head')[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4947
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4948
        if (el) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4949
            // Create a marker node at the end of <head> to use as an insertion
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4950
            // point. Inserting before this node will ensure that all our CSS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4951
            // gets inserted in the correct order, to maintain style precedence.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4952
            el.appendChild(doc.createTextNode(''));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4953
            return (cache[docStamp] = el.lastChild);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4954
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4955
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4956
        // If all else fails, just insert before the first script node on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4957
        // page, which is virtually guaranteed to exist.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4958
        return (cache[docStamp] = doc.getElementsByTagName('script')[0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4959
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4960
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4961
    _insert: function (req) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4962
        var env          = Get._env,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4963
            insertBefore = this._getInsertBefore(req),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4964
            isScript     = req.type === 'js',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4965
            node         = req.node,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4966
            self         = this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4967
            ua           = Y.UA,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4968
            cssTimeout, nodeType;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4969
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4970
        if (!node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4971
            if (isScript) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4972
                nodeType = 'script';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4973
            } else if (!env.cssLoad && ua.gecko) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4974
                nodeType = 'style';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4975
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4976
                nodeType = 'link';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4977
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4978
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4979
            node = req.node = this._createNode(nodeType, req.attributes,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4980
                req.doc);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4981
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4982
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4983
        function onError() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4984
            self._progress('Failed to load ' + req.url, req);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4985
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4986
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4987
        function onLoad() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4988
            if (cssTimeout) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4989
                clearTimeout(cssTimeout);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4990
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4991
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4992
            self._progress(null, req);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4993
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4994
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4995
        // Deal with script asynchronicity.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4996
        if (isScript) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4997
            node.setAttribute('src', req.url);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4998
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  4999
            if (req.async) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5000
                // Explicitly indicate that we want the browser to execute this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5001
                // script asynchronously. This is necessary for older browsers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5002
                // like Firefox <4.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5003
                node.async = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5004
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5005
                if (env.async) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5006
                    // This browser treats injected scripts as async by default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5007
                    // (standard HTML5 behavior) but asynchronous loading isn't
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5008
                    // desired, so tell the browser not to mark this script as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5009
                    // async.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5010
                    node.async = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5011
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5012
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5013
                // If this browser doesn't preserve script execution order based
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5014
                // on insertion order, we'll need to avoid inserting other
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5015
                // scripts until this one finishes loading.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5016
                if (!env.preservesScriptOrder) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5017
                    this._pending = req;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5018
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5019
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5020
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5021
            if (!env.cssLoad && ua.gecko) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5022
                // In Firefox <9, we can import the requested URL into a <style>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5023
                // node and poll for the existence of node.sheet.cssRules. This
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5024
                // gives us a reliable way to determine CSS load completion that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5025
                // also works for cross-domain stylesheets.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5026
                //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5027
                // Props to Zach Leatherman for calling my attention to this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5028
                // technique.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5029
                node.innerHTML = (req.attributes.charset ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5030
                    '@charset "' + req.attributes.charset + '";' : '') +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5031
                    '@import "' + req.url + '";';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5032
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5033
                node.setAttribute('href', req.url);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5034
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5035
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5036
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5037
        // Inject the node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5038
        if (isScript && ua.ie && (ua.ie < 9 || (document.documentMode && document.documentMode < 9))) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5039
            // Script on IE < 9, and IE 9+ when in IE 8 or older modes, including quirks mode.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5040
            node.onreadystatechange = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5041
                if (/loaded|complete/.test(node.readyState)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5042
                    node.onreadystatechange = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5043
                    onLoad();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5044
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5045
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5046
        } else if (!isScript && !env.cssLoad) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5047
            // CSS on Firefox <9 or WebKit.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5048
            this._poll(req);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5049
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5050
            // Script or CSS on everything else. Using DOM 0 events because that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5051
            // evens the playing field with older IEs.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5052
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5053
            if (ua.ie >= 10) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5054
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5055
                // We currently need to introduce a timeout for IE10, since it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5056
                // calls onerror/onload synchronously for 304s - messing up existing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5057
                // program flow.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5058
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5059
                // Remove this block if the following bug gets fixed by GA
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5060
                /*jshint maxlen: 1500 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5061
                // https://connect.microsoft.com/IE/feedback/details/763871/dynamically-loaded-scripts-with-304s-responses-interrupt-the-currently-executing-js-thread-onload
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5062
                node.onerror = function() { setTimeout(onError, 0); };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5063
                node.onload  = function() { setTimeout(onLoad, 0); };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5064
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5065
                node.onerror = onError;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5066
                node.onload  = onLoad;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5067
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5068
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5069
            // If this browser doesn't fire an event when CSS fails to load,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5070
            // fail after a timeout to avoid blocking the transaction queue.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5071
            if (!env.cssFail && !isScript) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5072
                cssTimeout = setTimeout(onError, req.timeout || 3000);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5073
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5074
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5075
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5076
        this.nodes.push(node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5077
        insertBefore.parentNode.insertBefore(node, insertBefore);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5078
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5079
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5080
    _next: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5081
        if (this._pending) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5082
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5083
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5084
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5085
        // If there are requests in the queue, insert the next queued request.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5086
        // Otherwise, if we're waiting on already-inserted requests to finish,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5087
        // wait longer. If there are no queued requests and we're not waiting
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5088
        // for anything to load, then we're done!
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5089
        if (this._queue.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5090
            this._insert(this._queue.shift());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5091
        } else if (!this._reqsWaiting) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5092
            this._finish();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5093
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5094
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5095
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5096
    _poll: function (newReq) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5097
        var self       = this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5098
            pendingCSS = self._pendingCSS,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5099
            isWebKit   = Y.UA.webkit,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5100
            i, hasRules, j, nodeHref, req, sheets;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5101
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5102
        if (newReq) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5103
            pendingCSS || (pendingCSS = self._pendingCSS = []);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5104
            pendingCSS.push(newReq);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5105
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5106
            if (self._pollTimer) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5107
                // A poll timeout is already pending, so no need to create a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5108
                // new one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5109
                return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5110
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5111
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5112
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5113
        self._pollTimer = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5114
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5115
        // Note: in both the WebKit and Gecko hacks below, a CSS URL that 404s
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5116
        // will still be treated as a success. There's no good workaround for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5117
        // this.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5118
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5119
        for (i = 0; i < pendingCSS.length; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5120
            req = pendingCSS[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5121
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5122
            if (isWebKit) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5123
                // Look for a stylesheet matching the pending URL.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5124
                sheets   = req.doc.styleSheets;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5125
                j        = sheets.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5126
                nodeHref = req.node.href;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5127
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5128
                while (--j >= 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5129
                    if (sheets[j].href === nodeHref) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5130
                        pendingCSS.splice(i, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5131
                        i -= 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5132
                        self._progress(null, req);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5133
                        break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5134
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5135
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5136
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5137
                // Many thanks to Zach Leatherman for calling my attention to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5138
                // the @import-based cross-domain technique used here, and to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5139
                // Oleg Slobodskoi for an earlier same-domain implementation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5140
                //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5141
                // See Zach's blog for more details:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5142
                // http://www.zachleat.com/web/2010/07/29/load-css-dynamically/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5143
                try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5144
                    // We don't really need to store this value since we never
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5145
                    // use it again, but if we don't store it, Closure Compiler
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5146
                    // assumes the code is useless and removes it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5147
                    hasRules = !!req.node.sheet.cssRules;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5148
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5149
                    // If we get here, the stylesheet has loaded.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5150
                    pendingCSS.splice(i, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5151
                    i -= 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5152
                    self._progress(null, req);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5153
                } catch (ex) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5154
                    // An exception means the stylesheet is still loading.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5155
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5156
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5157
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5158
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5159
        if (pendingCSS.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5160
            self._pollTimer = setTimeout(function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5161
                self._poll.call(self);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5162
            }, self.options.pollInterval);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5163
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5164
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5165
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5166
    _progress: function (err, req) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5167
        var options = this.options;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5168
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5169
        if (err) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5170
            req.error = err;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5171
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5172
            this.errors.push({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5173
                error  : err,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5174
                request: req
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5175
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5176
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5177
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5178
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5179
        req.node._yuiget_finished = req.finished = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5180
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5181
        if (options.onProgress) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5182
            options.onProgress.call(options.context || this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5183
                this._getEventData(req));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5184
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5185
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5186
        if (req.autopurge) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5187
            // Pre-3.5.0 Get always excludes the most recent node from an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5188
            // autopurge. I find this odd, but I'm keeping that behavior for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5189
            // the sake of backcompat.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5190
            Get._autoPurge(this.options.purgethreshold);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5191
            Get._purgeNodes.push(req.node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5192
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5193
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5194
        if (this._pending === req) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5195
            this._pending = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5196
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5197
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5198
        this._reqsWaiting -= 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5199
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5200
        this._next();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5201
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5202
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5203
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5204
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5205
}, '@VERSION@', {"requires": ["yui-base"]});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5206
YUI.add('features', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5207
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5208
var feature_tests = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5209
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5210
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5211
Contains the core of YUI's feature test architecture.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5212
@module features
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5213
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5214
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5215
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5216
* Feature detection
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5217
* @class Features
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5218
* @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5219
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5220
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5221
Y.mix(Y.namespace('Features'), {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5222
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5223
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5224
    * Object hash of all registered feature tests
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5225
    * @property tests
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5226
    * @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5227
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5228
    tests: feature_tests,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5229
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5230
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5231
    * Add a test to the system
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5232
    *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5233
    *   ```
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5234
    *   Y.Features.add("load", "1", {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5235
    *   ```
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5236
    *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5237
    * @method add
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5238
    * @param {String} cat The category, right now only 'load' is supported
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5239
    * @param {String} name The number sequence of the test, how it's reported in the URL or config: 1, 2, 3
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5240
    * @param {Object} o Object containing test properties
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5241
    * @param {String} o.name The name of the test
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5242
    * @param {Function} o.test The test function to execute, the only argument to the function is the `Y` instance
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5243
    * @param {String} o.trigger The module that triggers this test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5244
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5245
    add: function(cat, name, o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5246
        feature_tests[cat] = feature_tests[cat] || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5247
        feature_tests[cat][name] = o;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5248
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5249
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5250
    * Execute all tests of a given category and return the serialized results
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5251
    *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5252
    *   ```
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5253
    *   caps=1:1;2:1;3:0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5254
    *   ```
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5255
    * @method all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5256
    * @param {String} cat The category to execute
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5257
    * @param {Array} args The arguments to pass to the test function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5258
    * @return {String} A semi-colon separated string of tests and their success/failure: 1:1;2:1;3:0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5259
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5260
    all: function(cat, args) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5261
        var cat_o = feature_tests[cat],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5262
            // results = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5263
            result = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5264
        if (cat_o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5265
            Y.Object.each(cat_o, function(v, k) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5266
                result.push(k + ':' + (Y.Features.test(cat, k, args) ? 1 : 0));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5267
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5268
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5269
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5270
        return (result.length) ? result.join(';') : '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5271
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5272
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5273
    * Run a sepecific test and return a Boolean response.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5274
    *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5275
    *   ```
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5276
    *   Y.Features.test("load", "1");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5277
    *   ```
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5278
    *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5279
    * @method test
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5280
    * @param {String} cat The category of the test to run
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5281
    * @param {String} name The name of the test to run
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5282
    * @param {Array} args The arguments to pass to the test function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5283
    * @return {Boolean} True or false if the test passed/failed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5284
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5285
    test: function(cat, name, args) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5286
        args = args || [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5287
        var result, ua, test,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5288
            cat_o = feature_tests[cat],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5289
            feature = cat_o && cat_o[name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5290
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5291
        if (!feature) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5292
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5293
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5294
            result = feature.result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5295
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5296
            if (Y.Lang.isUndefined(result)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5297
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5298
                ua = feature.ua;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5299
                if (ua) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5300
                    result = (Y.UA[ua]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5301
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5302
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5303
                test = feature.test;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5304
                if (test && ((!ua) || result)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5305
                    result = test.apply(Y, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5306
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5307
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5308
                feature.result = result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5309
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5310
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5311
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5312
        return result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5313
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5314
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5315
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5316
// Y.Features.add("load", "1", {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5317
// Y.Features.test("load", "1");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5318
// caps=1:1;2:0;3:1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5319
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5320
/* This file is auto-generated by (yogi loader --yes --mix --start ../) */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5321
/*jshint maxlen:900, eqeqeq: false */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5322
var add = Y.Features.add;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5323
// app-transitions-native
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5324
add('load', '0', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5325
    "name": "app-transitions-native",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5326
    "test": function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5327
    var doc  = Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5328
        node = doc ? doc.documentElement : null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5329
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5330
    if (node && node.style) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5331
        return ('MozTransition' in node.style || 'WebkitTransition' in node.style || 'transition' in node.style);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5332
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5333
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5334
    return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5335
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5336
    "trigger": "app-transitions"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5337
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5338
// autocomplete-list-keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5339
add('load', '1', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5340
    "name": "autocomplete-list-keys",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5341
    "test": function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5342
    // Only add keyboard support to autocomplete-list if this doesn't appear to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5343
    // be an iOS or Android-based mobile device.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5344
    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5345
    // There's currently no feasible way to actually detect whether a device has
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5346
    // a hardware keyboard, so this sniff will have to do. It can easily be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5347
    // overridden by manually loading the autocomplete-list-keys module.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5348
    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5349
    // Worth noting: even though iOS supports bluetooth keyboards, Mobile Safari
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5350
    // doesn't fire the keyboard events used by AutoCompleteList, so there's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5351
    // no point loading the -keys module even when a bluetooth keyboard may be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5352
    // available.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5353
    return !(Y.UA.ios || Y.UA.android);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5354
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5355
    "trigger": "autocomplete-list"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5356
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5357
// dd-gestures
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5358
add('load', '2', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5359
    "name": "dd-gestures",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5360
    "trigger": "dd-drag",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5361
    "ua": "touchEnabled"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5362
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5363
// dom-style-ie
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5364
add('load', '3', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5365
    "name": "dom-style-ie",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5366
    "test": function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5367
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5368
    var testFeature = Y.Features.test,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5369
        addFeature = Y.Features.add,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5370
        WINDOW = Y.config.win,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5371
        DOCUMENT = Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5372
        DOCUMENT_ELEMENT = 'documentElement',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5373
        ret = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5374
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5375
    addFeature('style', 'computedStyle', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5376
        test: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5377
            return WINDOW && 'getComputedStyle' in WINDOW;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5378
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5379
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5380
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5381
    addFeature('style', 'opacity', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5382
        test: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5383
            return DOCUMENT && 'opacity' in DOCUMENT[DOCUMENT_ELEMENT].style;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5384
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5385
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5387
    ret =  (!testFeature('style', 'opacity') &&
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5388
            !testFeature('style', 'computedStyle'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5389
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5390
    return ret;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5391
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5392
    "trigger": "dom-style"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5393
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5394
// editor-para-ie
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5395
add('load', '4', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5396
    "name": "editor-para-ie",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5397
    "trigger": "editor-para",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5398
    "ua": "ie",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5399
    "when": "instead"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5400
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5401
// event-base-ie
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5402
add('load', '5', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5403
    "name": "event-base-ie",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5404
    "test": function(Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5405
    var imp = Y.config.doc && Y.config.doc.implementation;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5406
    return (imp && (!imp.hasFeature('Events', '2.0')));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5407
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5408
    "trigger": "node-base"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5409
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5410
// graphics-canvas
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5411
add('load', '6', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5412
    "name": "graphics-canvas",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5413
    "test": function(Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5414
    var DOCUMENT = Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5415
        useCanvas = Y.config.defaultGraphicEngine && Y.config.defaultGraphicEngine == "canvas",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5416
		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5417
        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5418
    return (!svg || useCanvas) && (canvas && canvas.getContext && canvas.getContext("2d"));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5419
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5420
    "trigger": "graphics"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5421
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5422
// graphics-canvas-default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5423
add('load', '7', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5424
    "name": "graphics-canvas-default",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5425
    "test": function(Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5426
    var DOCUMENT = Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5427
        useCanvas = Y.config.defaultGraphicEngine && Y.config.defaultGraphicEngine == "canvas",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5428
		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5429
        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5430
    return (!svg || useCanvas) && (canvas && canvas.getContext && canvas.getContext("2d"));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5431
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5432
    "trigger": "graphics"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5433
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5434
// graphics-svg
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5435
add('load', '8', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5436
    "name": "graphics-svg",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5437
    "test": function(Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5438
    var DOCUMENT = Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5439
        useSVG = !Y.config.defaultGraphicEngine || Y.config.defaultGraphicEngine != "canvas",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5440
		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5441
        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5442
    
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5443
    return svg && (useSVG || !canvas);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5444
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5445
    "trigger": "graphics"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5446
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5447
// graphics-svg-default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5448
add('load', '9', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5449
    "name": "graphics-svg-default",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5450
    "test": function(Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5451
    var DOCUMENT = Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5452
        useSVG = !Y.config.defaultGraphicEngine || Y.config.defaultGraphicEngine != "canvas",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5453
		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5454
        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5455
    
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5456
    return svg && (useSVG || !canvas);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5457
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5458
    "trigger": "graphics"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5459
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5460
// graphics-vml
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5461
add('load', '10', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5462
    "name": "graphics-vml",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5463
    "test": function(Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5464
    var DOCUMENT = Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5465
		canvas = DOCUMENT && DOCUMENT.createElement("canvas");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5466
    return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5467
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5468
    "trigger": "graphics"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5469
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5470
// graphics-vml-default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5471
add('load', '11', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5472
    "name": "graphics-vml-default",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5473
    "test": function(Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5474
    var DOCUMENT = Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5475
		canvas = DOCUMENT && DOCUMENT.createElement("canvas");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5476
    return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5477
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5478
    "trigger": "graphics"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5479
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5480
// history-hash-ie
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5481
add('load', '12', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5482
    "name": "history-hash-ie",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5483
    "test": function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5484
    var docMode = Y.config.doc && Y.config.doc.documentMode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5485
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5486
    return Y.UA.ie && (!('onhashchange' in Y.config.win) ||
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5487
            !docMode || docMode < 8);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5488
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5489
    "trigger": "history-hash"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5490
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5491
// io-nodejs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5492
add('load', '13', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5493
    "name": "io-nodejs",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5494
    "trigger": "io-base",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5495
    "ua": "nodejs"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5496
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5497
// json-parse-shim
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5498
add('load', '14', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5499
    "name": "json-parse-shim",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5500
    "test": function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5501
    var _JSON = Y.config.global.JSON,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5502
        Native = Object.prototype.toString.call(_JSON) === '[object JSON]' && _JSON,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5503
        nativeSupport = Y.config.useNativeJSONParse !== false && !!Native;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5504
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5505
    function workingNative( k, v ) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5506
        return k === "ok" ? true : v;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5507
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5508
    
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5509
    // Double check basic functionality.  This is mainly to catch early broken
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5510
    // implementations of the JSON API in Firefox 3.1 beta1 and beta2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5511
    if ( nativeSupport ) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5512
        try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5513
            nativeSupport = ( Native.parse( '{"ok":false}', workingNative ) ).ok;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5514
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5515
        catch ( e ) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5516
            nativeSupport = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5517
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5518
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5519
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5520
    return !nativeSupport;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5521
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5522
    "trigger": "json-parse"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5523
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5524
// json-stringify-shim
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5525
add('load', '15', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5526
    "name": "json-stringify-shim",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5527
    "test": function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5528
    var _JSON = Y.config.global.JSON,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5529
        Native = Object.prototype.toString.call(_JSON) === '[object JSON]' && _JSON,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5530
        nativeSupport = Y.config.useNativeJSONStringify !== false && !!Native;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5531
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5532
    // Double check basic native functionality.  This is primarily to catch broken
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5533
    // early JSON API implementations in Firefox 3.1 beta1 and beta2.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5534
    if ( nativeSupport ) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5535
        try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5536
            nativeSupport = ( '0' === Native.stringify(0) );
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5537
        } catch ( e ) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5538
            nativeSupport = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5539
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5540
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5541
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5542
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5543
    return !nativeSupport;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5544
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5545
    "trigger": "json-stringify"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5546
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5547
// scrollview-base-ie
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5548
add('load', '16', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5549
    "name": "scrollview-base-ie",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5550
    "trigger": "scrollview-base",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5551
    "ua": "ie"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5552
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5553
// selector-css2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5554
add('load', '17', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5555
    "name": "selector-css2",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5556
    "test": function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5557
    var DOCUMENT = Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5558
        ret = DOCUMENT && !('querySelectorAll' in DOCUMENT);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5559
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5560
    return ret;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5561
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5562
    "trigger": "selector"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5563
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5564
// transition-timer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5565
add('load', '18', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5566
    "name": "transition-timer",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5567
    "test": function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5568
    var DOCUMENT = Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5569
        node = (DOCUMENT) ? DOCUMENT.documentElement: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5570
        ret = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5571
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5572
    if (node && node.style) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5573
        ret = !('MozTransition' in node.style || 'WebkitTransition' in node.style || 'transition' in node.style);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5574
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5575
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5576
    return ret;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5577
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5578
    "trigger": "transition"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5579
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5580
// widget-base-ie
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5581
add('load', '19', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5582
    "name": "widget-base-ie",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5583
    "trigger": "widget-base",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5584
    "ua": "ie"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5585
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5586
// yql-jsonp
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5587
add('load', '20', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5588
    "name": "yql-jsonp",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5589
    "test": function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5590
    /* Only load the JSONP module when not in nodejs or winjs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5591
    TODO Make the winjs module a CORS module
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5592
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5593
    return (!Y.UA.nodejs && !Y.UA.winjs);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5594
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5595
    "trigger": "yql",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5596
    "when": "after"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5597
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5598
// yql-nodejs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5599
add('load', '21', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5600
    "name": "yql-nodejs",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5601
    "trigger": "yql",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5602
    "ua": "nodejs",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5603
    "when": "after"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5604
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5605
// yql-winjs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5606
add('load', '22', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5607
    "name": "yql-winjs",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5608
    "trigger": "yql",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5609
    "ua": "winjs",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5610
    "when": "after"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5611
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5612
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5613
}, '@VERSION@', {"requires": ["yui-base"]});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5614
YUI.add('intl-base', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5615
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5616
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5617
 * The Intl utility provides a central location for managing sets of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5618
 * localized resources (strings and formatting patterns).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5619
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5620
 * @class Intl
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5621
 * @uses EventTarget
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5622
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5623
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5624
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5625
var SPLIT_REGEX = /[, ]/;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5626
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5627
Y.mix(Y.namespace('Intl'), {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5628
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5629
 /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5630
    * Returns the language among those available that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5631
    * best matches the preferred language list, using the Lookup
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5632
    * algorithm of BCP 47.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5633
    * If none of the available languages meets the user's preferences,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5634
    * then "" is returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5635
    * Extended language ranges are not supported.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5636
    *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5637
    * @method lookupBestLang
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5638
    * @param {String[] | String} preferredLanguages The list of preferred
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5639
    * languages in descending preference order, represented as BCP 47
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5640
    * language tags. A string array or a comma-separated list.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5641
    * @param {String[]} availableLanguages The list of languages
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5642
    * that the application supports, represented as BCP 47 language
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5643
    * tags.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5644
    *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5645
    * @return {String} The available language that best matches the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5646
    * preferred language list, or "".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5647
    * @since 3.1.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5648
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5649
    lookupBestLang: function(preferredLanguages, availableLanguages) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5650
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5651
        var i, language, result, index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5652
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5653
        // check whether the list of available languages contains language;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5654
        // if so return it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5655
        function scan(language) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5656
            var i;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5657
            for (i = 0; i < availableLanguages.length; i += 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5658
                if (language.toLowerCase() ===
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5659
                            availableLanguages[i].toLowerCase()) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5660
                    return availableLanguages[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5661
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5662
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5663
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5664
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5665
        if (Y.Lang.isString(preferredLanguages)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5666
            preferredLanguages = preferredLanguages.split(SPLIT_REGEX);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5667
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5668
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5669
        for (i = 0; i < preferredLanguages.length; i += 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5670
            language = preferredLanguages[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5671
            if (!language || language === '*') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5672
                continue;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5673
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5674
            // check the fallback sequence for one language
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5675
            while (language.length > 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5676
                result = scan(language);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5677
                if (result) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5678
                    return result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5679
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5680
                    index = language.lastIndexOf('-');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5681
                    if (index >= 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5682
                        language = language.substring(0, index);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5683
                        // one-character subtags get cut along with the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5684
                        // following subtag
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5685
                        if (index >= 2 && language.charAt(index - 2) === '-') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5686
                            language = language.substring(0, index - 2);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5687
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5688
                    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5689
                        // nothing available for this language
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5690
                        break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5691
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5692
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5693
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5694
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5695
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5696
        return '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5697
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5698
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5699
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5700
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5701
}, '@VERSION@', {"requires": ["yui-base"]});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5702
YUI.add('yui-log', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5703
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5704
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5705
 * Provides console log capability and exposes a custom event for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5706
 * console implementations. This module is a `core` YUI module,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5707
 * <a href="../classes/YUI.html#method_log">it's documentation is located under the YUI class</a>.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5708
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5709
 * @module yui
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5710
 * @submodule yui-log
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5711
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5712
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5713
var INSTANCE = Y,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5714
    LOGEVENT = 'yui:log',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5715
    UNDEFINED = 'undefined',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5716
    LEVELS = { debug: 1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5717
               info: 2,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5718
               warn: 4,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5719
               error: 8 };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5720
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5721
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5722
 * If the 'debug' config is true, a 'yui:log' event will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5723
 * dispatched, which the Console widget and anything else
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5724
 * can consume.  If the 'useBrowserConsole' config is true, it will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5725
 * write to the browser console if available.  YUI-specific log
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5726
 * messages will only be present in the -debug versions of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5727
 * JS files.  The build system is supposed to remove log statements
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5728
 * from the raw and minified versions of the files.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5729
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5730
 * @method log
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5731
 * @for YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5732
 * @param  {String}  msg  The message to log.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5733
 * @param  {String}  cat  The log category for the message.  Default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5734
 *                        categories are "info", "warn", "error", "debug".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5735
 *                        Custom categories can be used as well. (opt).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5736
 * @param  {String}  src  The source of the the message (opt).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5737
 * @param  {boolean} silent If true, the log event won't fire.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5738
 * @return {YUI}      YUI instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5739
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5740
INSTANCE.log = function(msg, cat, src, silent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5741
    var bail, excl, incl, m, f, minlevel,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5742
        Y = INSTANCE,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5743
        c = Y.config,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5744
        publisher = (Y.fire) ? Y : YUI.Env.globalEvents;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5745
    // suppress log message if the config is off or the event stack
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5746
    // or the event call stack contains a consumer of the yui:log event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5747
    if (c.debug) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5748
        // apply source filters
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5749
        src = src || "";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5750
        if (typeof src !== "undefined") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5751
            excl = c.logExclude;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5752
            incl = c.logInclude;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5753
            if (incl && !(src in incl)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5754
                bail = 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5755
            } else if (incl && (src in incl)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5756
                bail = !incl[src];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5757
            } else if (excl && (src in excl)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5758
                bail = excl[src];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5759
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5760
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5761
            // Set a default category of info if the category was not defined or was not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5762
            // a real category.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5763
            if ((typeof cat === 'undefined') || !(cat in LEVELS)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5764
                cat = 'info';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5765
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5766
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5767
            // Determine the current minlevel as defined in configuration
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5768
            Y.config.logLevel = Y.config.logLevel || 'debug';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5769
            minlevel = LEVELS[Y.config.logLevel.toLowerCase()];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5770
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5771
            if (cat in LEVELS && LEVELS[cat] < minlevel) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5772
                // Skip this message if the we don't meet the defined minlevel
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5773
                bail = 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5774
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5775
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5776
        if (!bail) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5777
            if (c.useBrowserConsole) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5778
                m = (src) ? src + ': ' + msg : msg;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5779
                if (Y.Lang.isFunction(c.logFn)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5780
                    c.logFn.call(Y, msg, cat, src);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5781
                } else if (typeof console !== UNDEFINED && console.log) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5782
                    f = (cat && console[cat] && (cat in LEVELS)) ? cat : 'log';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5783
                    console[f](m);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5784
                } else if (typeof opera !== UNDEFINED) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5785
                    opera.postError(m);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5786
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5787
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5788
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5789
            if (publisher && !silent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5790
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5791
                if (publisher === Y && (!publisher.getEvent(LOGEVENT))) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5792
                    publisher.publish(LOGEVENT, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5793
                        broadcast: 2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5794
                    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5795
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5796
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5797
                publisher.fire(LOGEVENT, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5798
                    msg: msg,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5799
                    cat: cat,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5800
                    src: src
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5801
                });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5802
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5803
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5804
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5805
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5806
    return Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5807
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5808
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5809
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5810
 * Write a system message.  This message will be preserved in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5811
 * minified and raw versions of the YUI files, unlike log statements.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5812
 * @method message
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5813
 * @for YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5814
 * @param  {String}  msg  The message to log.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5815
 * @param  {String}  cat  The log category for the message.  Default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5816
 *                        categories are "info", "warn", "error", "debug".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5817
 *                        Custom categories can be used as well. (opt).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5818
 * @param  {String}  src  The source of the the message (opt).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5819
 * @param  {boolean} silent If true, the log event won't fire.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5820
 * @return {YUI}      YUI instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5821
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5822
INSTANCE.message = function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5823
    return INSTANCE.log.apply(INSTANCE, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5824
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5825
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5826
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5827
}, '@VERSION@', {"requires": ["yui-base"]});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5828
YUI.add('yui-later', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5829
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5830
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5831
 * Provides a setTimeout/setInterval wrapper. This module is a `core` YUI module,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5832
 * <a href="../classes/YUI.html#method_later">it's documentation is located under the YUI class</a>.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5833
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5834
 * @module yui
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5835
 * @submodule yui-later
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5836
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5837
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5838
var NO_ARGS = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5839
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5840
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5841
 * Executes the supplied function in the context of the supplied
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5842
 * object 'when' milliseconds later.  Executes the function a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5843
 * single time unless periodic is set to true.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5844
 * @for YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5845
 * @method later
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5846
 * @param when {Number} the number of milliseconds to wait until the fn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5847
 * is executed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5848
 * @param o the context object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5849
 * @param fn {Function|String} the function to execute or the name of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5850
 * the method in the 'o' object to execute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5851
 * @param data [Array] data that is provided to the function.  This
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5852
 * accepts either a single item or an array.  If an array is provided,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5853
 * the function is executed with one parameter for each array item.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5854
 * If you need to pass a single array parameter, it needs to be wrapped
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5855
 * in an array [myarray].
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5856
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5857
 * Note: native methods in IE may not have the call and apply methods.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5858
 * In this case, it will work, but you are limited to four arguments.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5859
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5860
 * @param periodic {boolean} if true, executes continuously at supplied
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5861
 * interval until canceled.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5862
 * @return {object} a timer object. Call the cancel() method on this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5863
 * object to stop the timer.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5864
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5865
Y.later = function(when, o, fn, data, periodic) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5866
    when = when || 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5867
    data = (!Y.Lang.isUndefined(data)) ? Y.Array(data) : NO_ARGS;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5868
    o = o || Y.config.win || Y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5869
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5870
    var cancelled = false,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5871
        method = (o && Y.Lang.isString(fn)) ? o[fn] : fn,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5872
        wrapper = function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5873
            // IE 8- may execute a setInterval callback one last time
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5874
            // after clearInterval was called, so in order to preserve
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5875
            // the cancel() === no more runny-run, we have to jump through
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5876
            // an extra hoop.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5877
            if (!cancelled) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5878
                if (!method.apply) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5879
                    method(data[0], data[1], data[2], data[3]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5880
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5881
                    method.apply(o, data || NO_ARGS);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5882
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5883
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5884
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5885
        id = (periodic) ? setInterval(wrapper, when) : setTimeout(wrapper, when);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5886
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5887
    return {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5888
        id: id,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5889
        interval: periodic,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5890
        cancel: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5891
            cancelled = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5892
            if (this.interval) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5893
                clearInterval(id);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5894
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5895
                clearTimeout(id);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5896
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5897
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5898
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5899
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5900
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5901
Y.Lang.later = Y.later;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5902
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5903
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5904
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5905
}, '@VERSION@', {"requires": ["yui-base"]});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  5906
YUI.add('yui', function (Y, NAME) {}, '@VERSION@', {"use": ["get", "features", "intl-base", "yui-log", "yui-later"]});