~bcsaller/juju-gui/update-reductions

« back to all changes in this revision

Viewing changes to lib/yui/build/yui-nodejs/yui-nodejs-debug.js

  • Committer: kapil.foss at gmail
  • Date: 2012-07-13 18:45:59 UTC
  • Revision ID: kapil.foss@gmail.com-20120713184559-2xl7be17egsrz0c9
reshape

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
YUI 3.5.1 (build 22)
3
 
Copyright 2012 Yahoo! Inc. All rights reserved.
4
 
Licensed under the BSD License.
5
 
http://yuilibrary.com/license/
6
 
*/
7
 
/**
8
 
 * The YUI module contains the components required for building the YUI seed
9
 
 * file.  This includes the script loading mechanism, a simple queue, and
10
 
 * the core utilities for the library.
11
 
 * @module yui
12
 
 * @submodule yui-base
13
 
 */
14
 
 
15
 
if (typeof YUI != 'undefined') {
16
 
    YUI._YUI = YUI;
17
 
}
18
 
 
19
 
/**
20
 
The YUI global namespace object.  If YUI is already defined, the
21
 
existing YUI object will not be overwritten so that defined
22
 
namespaces are preserved.  It is the constructor for the object
23
 
the end user interacts with.  As indicated below, each instance
24
 
has full custom event support, but only if the event system
25
 
is available.  This is a self-instantiable factory function.  You
26
 
can invoke it directly like this:
27
 
 
28
 
     YUI().use('*', function(Y) {
29
 
         // ready
30
 
     });
31
 
 
32
 
But it also works like this:
33
 
 
34
 
     var Y = YUI();
35
 
 
36
 
Configuring the YUI object:
37
 
 
38
 
    YUI({
39
 
        debug: true,
40
 
        combine: false
41
 
    }).use('node', function(Y) {
42
 
        //Node is ready to use
43
 
    });
44
 
 
45
 
See the API docs for the <a href="config.html">Config</a> class
46
 
for the complete list of supported configuration properties accepted
47
 
by the YUI constuctor.
48
 
 
49
 
@class YUI
50
 
@constructor
51
 
@global
52
 
@uses EventTarget
53
 
@param [o]* {Object} 0..n optional configuration objects.  these values
54
 
are store in Y.config.  See <a href="config.html">Config</a> for the list of supported
55
 
properties.
56
 
*/
57
 
    /*global YUI*/
58
 
    /*global YUI_config*/
59
 
    var YUI = function() {
60
 
        var i = 0,
61
 
            Y = this,
62
 
            args = arguments,
63
 
            l = args.length,
64
 
            instanceOf = function(o, type) {
65
 
                return (o && o.hasOwnProperty && (o instanceof type));
66
 
            },
67
 
            gconf = (typeof YUI_config !== 'undefined') && YUI_config;
68
 
 
69
 
        if (!(instanceOf(Y, YUI))) {
70
 
            Y = new YUI();
71
 
        } else {
72
 
            // set up the core environment
73
 
            Y._init();
74
 
 
75
 
            /**
76
 
                YUI.GlobalConfig is a master configuration that might span
77
 
                multiple contexts in a non-browser environment.  It is applied
78
 
                first to all instances in all contexts.
79
 
                @property GlobalConfig
80
 
                @type {Object}
81
 
                @global
82
 
                @static
83
 
                @example
84
 
 
85
 
 
86
 
                    YUI.GlobalConfig = {
87
 
                        filter: 'debug'
88
 
                    };
89
 
 
90
 
                    YUI().use('node', function(Y) {
91
 
                        //debug files used here
92
 
                    });
93
 
 
94
 
                    YUI({
95
 
                        filter: 'min'
96
 
                    }).use('node', function(Y) {
97
 
                        //min files used here
98
 
                    });
99
 
 
100
 
            */
101
 
            if (YUI.GlobalConfig) {
102
 
                Y.applyConfig(YUI.GlobalConfig);
103
 
            }
104
 
 
105
 
            /**
106
 
                YUI_config is a page-level config.  It is applied to all
107
 
                instances created on the page.  This is applied after
108
 
                YUI.GlobalConfig, and before the instance level configuration
109
 
                objects.
110
 
                @global
111
 
                @property YUI_config
112
 
                @type {Object}
113
 
                @example
114
 
 
115
 
 
116
 
                    //Single global var to include before YUI seed file
117
 
                    YUI_config = {
118
 
                        filter: 'debug'
119
 
                    };
120
 
 
121
 
                    YUI().use('node', function(Y) {
122
 
                        //debug files used here
123
 
                    });
124
 
 
125
 
                    YUI({
126
 
                        filter: 'min'
127
 
                    }).use('node', function(Y) {
128
 
                        //min files used here
129
 
                    });
130
 
            */
131
 
            if (gconf) {
132
 
                Y.applyConfig(gconf);
133
 
            }
134
 
 
135
 
            // bind the specified additional modules for this instance
136
 
            if (!l) {
137
 
                Y._setup();
138
 
            }
139
 
        }
140
 
 
141
 
        if (l) {
142
 
            // Each instance can accept one or more configuration objects.
143
 
            // These are applied after YUI.GlobalConfig and YUI_Config,
144
 
            // overriding values set in those config files if there is a '
145
 
            // matching property.
146
 
            for (; i < l; i++) {
147
 
                Y.applyConfig(args[i]);
148
 
            }
149
 
 
150
 
            Y._setup();
151
 
        }
152
 
 
153
 
        Y.instanceOf = instanceOf;
154
 
 
155
 
        return Y;
156
 
    };
157
 
 
158
 
(function() {
159
 
 
160
 
    var proto, prop,
161
 
        VERSION = '3.5.1',
162
 
        PERIOD = '.',
163
 
        BASE = 'http://yui.yahooapis.com/',
164
 
        DOC_LABEL = 'yui3-js-enabled',
165
 
        CSS_STAMP_EL = 'yui3-css-stamp',
166
 
        NOOP = function() {},
167
 
        SLICE = Array.prototype.slice,
168
 
        APPLY_TO_AUTH = { 'io.xdrReady': 1,   // the functions applyTo
169
 
                          'io.xdrResponse': 1,   // can call. this should
170
 
                          'SWF.eventHandler': 1 }, // be done at build time
171
 
        hasWin = (typeof window != 'undefined'),
172
 
        win = (hasWin) ? window : null,
173
 
        doc = (hasWin) ? win.document : null,
174
 
        docEl = doc && doc.documentElement,
175
 
        docClass = docEl && docEl.className,
176
 
        instances = {},
177
 
        time = new Date().getTime(),
178
 
        add = function(el, type, fn, capture) {
179
 
            if (el && el.addEventListener) {
180
 
                el.addEventListener(type, fn, capture);
181
 
            } else if (el && el.attachEvent) {
182
 
                el.attachEvent('on' + type, fn);
183
 
            }
184
 
        },
185
 
        remove = function(el, type, fn, capture) {
186
 
            if (el && el.removeEventListener) {
187
 
                // this can throw an uncaught exception in FF
188
 
                try {
189
 
                    el.removeEventListener(type, fn, capture);
190
 
                } catch (ex) {}
191
 
            } else if (el && el.detachEvent) {
192
 
                el.detachEvent('on' + type, fn);
193
 
            }
194
 
        },
195
 
        handleLoad = function() {
196
 
            YUI.Env.windowLoaded = true;
197
 
            YUI.Env.DOMReady = true;
198
 
            if (hasWin) {
199
 
                remove(window, 'load', handleLoad);
200
 
            }
201
 
        },
202
 
        getLoader = function(Y, o) {
203
 
            var loader = Y.Env._loader;
204
 
            if (loader) {
205
 
                //loader._config(Y.config);
206
 
                loader.ignoreRegistered = false;
207
 
                loader.onEnd = null;
208
 
                loader.data = null;
209
 
                loader.required = [];
210
 
                loader.loadType = null;
211
 
            } else {
212
 
                loader = new Y.Loader(Y.config);
213
 
                Y.Env._loader = loader;
214
 
            }
215
 
            YUI.Env.core = Y.Array.dedupe([].concat(YUI.Env.core, [ 'loader-base', 'loader-rollup', 'loader-yui3' ]));
216
 
 
217
 
            return loader;
218
 
        },
219
 
 
220
 
        clobber = function(r, s) {
221
 
            for (var i in s) {
222
 
                if (s.hasOwnProperty(i)) {
223
 
                    r[i] = s[i];
224
 
                }
225
 
            }
226
 
        },
227
 
 
228
 
        ALREADY_DONE = { success: true };
229
 
 
230
 
//  Stamp the documentElement (HTML) with a class of "yui-loaded" to
231
 
//  enable styles that need to key off of JS being enabled.
232
 
if (docEl && docClass.indexOf(DOC_LABEL) == -1) {
233
 
    if (docClass) {
234
 
        docClass += ' ';
235
 
    }
236
 
    docClass += DOC_LABEL;
237
 
    docEl.className = docClass;
238
 
}
239
 
 
240
 
if (VERSION.indexOf('@') > -1) {
241
 
    VERSION = '3.3.0'; // dev time hack for cdn test
242
 
}
243
 
 
244
 
proto = {
245
 
    /**
246
 
     * Applies a new configuration object to the YUI instance config.
247
 
     * This will merge new group/module definitions, and will also
248
 
     * update the loader cache if necessary.  Updating Y.config directly
249
 
     * will not update the cache.
250
 
     * @method applyConfig
251
 
     * @param {Object} o the configuration object.
252
 
     * @since 3.2.0
253
 
     */
254
 
    applyConfig: function(o) {
255
 
 
256
 
        o = o || NOOP;
257
 
 
258
 
        var attr,
259
 
            name,
260
 
            // detail,
261
 
            config = this.config,
262
 
            mods = config.modules,
263
 
            groups = config.groups,
264
 
            aliases = config.aliases,
265
 
            loader = this.Env._loader;
266
 
 
267
 
        for (name in o) {
268
 
            if (o.hasOwnProperty(name)) {
269
 
                attr = o[name];
270
 
                if (mods && name == 'modules') {
271
 
                    clobber(mods, attr);
272
 
                } else if (aliases && name == 'aliases') {
273
 
                    clobber(aliases, attr);
274
 
                } else if (groups && name == 'groups') {
275
 
                    clobber(groups, attr);
276
 
                } else if (name == 'win') {
277
 
                    config[name] = (attr && attr.contentWindow) || attr;
278
 
                    config.doc = config[name] ? config[name].document : null;
279
 
                } else if (name == '_yuid') {
280
 
                    // preserve the guid
281
 
                } else {
282
 
                    config[name] = attr;
283
 
                }
284
 
            }
285
 
        }
286
 
 
287
 
        if (loader) {
288
 
            loader._config(o);
289
 
        }
290
 
 
291
 
    },
292
 
    /**
293
 
    * Old way to apply a config to the instance (calls `applyConfig` under the hood)
294
 
    * @private
295
 
    * @method _config
296
 
    * @param {Object} o The config to apply
297
 
    */
298
 
    _config: function(o) {
299
 
        this.applyConfig(o);
300
 
    },
301
 
 
302
 
    /**
303
 
     * Initialize this YUI instance
304
 
     * @private
305
 
     * @method _init
306
 
     */
307
 
    _init: function() {
308
 
        var filter, el,
309
 
            Y = this,
310
 
            G_ENV = YUI.Env,
311
 
            Env = Y.Env,
312
 
            prop;
313
 
 
314
 
        /**
315
 
         * The version number of the YUI instance.
316
 
         * @property version
317
 
         * @type string
318
 
         */
319
 
        Y.version = VERSION;
320
 
 
321
 
        if (!Env) {
322
 
            Y.Env = {
323
 
                core: ['get','features','intl-base','yui-log', 'yui-log-nodejs', 'yui-later','loader-base', 'loader-rollup', 'loader-yui3'],
324
 
                mods: {}, // flat module map
325
 
                versions: {}, // version module map
326
 
                base: BASE,
327
 
                cdn: BASE + VERSION + '/build/',
328
 
                // bootstrapped: false,
329
 
                _idx: 0,
330
 
                _used: {},
331
 
                _attached: {},
332
 
                _missed: [],
333
 
                _yidx: 0,
334
 
                _uidx: 0,
335
 
                _guidp: 'y',
336
 
                _loaded: {},
337
 
                // serviced: {},
338
 
                // Regex in English:
339
 
                // I'll start at the \b(simpleyui).
340
 
                // 1. Look in the test string for "simpleyui" or "yui" or
341
 
                //    "yui-base" or "yui-davglass" or "yui-foobar" that comes after a word break.  That is, it
342
 
                //    can't match "foyui" or "i_heart_simpleyui". This can be anywhere in the string.
343
 
                // 2. After #1 must come a forward slash followed by the string matched in #1, so
344
 
                //    "yui-base/yui-base" or "simpleyui/simpleyui" or "yui-pants/yui-pants".
345
 
                // 3. The second occurence of the #1 token can optionally be followed by "-debug" or "-min",
346
 
                //    so "yui/yui-min", "yui/yui-debug", "yui-base/yui-base-debug". NOT "yui/yui-tshirt".
347
 
                // 4. This is followed by ".js", so "yui/yui.js", "simpleyui/simpleyui-min.js"
348
 
                // 0. Going back to the beginning, now. If all that stuff in 1-4 comes after a "?" in the string,
349
 
                //    then capture the junk between the LAST "&" and the string in 1-4.  So
350
 
                //    "blah?foo/yui/yui.js" will capture "foo/" and "blah?some/thing.js&3.3.0/build/yui-davglass/yui-davglass.js"
351
 
                //    will capture "3.3.0/build/"
352
 
                //
353
 
                // Regex Exploded:
354
 
                // (?:\?             Find a ?
355
 
                //   (?:[^&]*&)      followed by 0..n characters followed by an &
356
 
                //   *               in fact, find as many sets of characters followed by a & as you can
357
 
                //   ([^&]*)         capture the stuff after the last & in \1
358
 
                // )?                but it's ok if all this ?junk&more_junk stuff isn't even there
359
 
                // \b(simpleyui|     after a word break find either the string "simpleyui" or
360
 
                //    yui(?:-\w+)?   the string "yui" optionally followed by a -, then more characters
361
 
                // )                 and store the simpleyui or yui-* string in \2
362
 
                // \/\2              then comes a / followed by the simpleyui or yui-* string in \2
363
 
                // (?:-(min|debug))? optionally followed by "-min" or "-debug"
364
 
                // .js               and ending in ".js"
365
 
                _BASE_RE: /(?:\?(?:[^&]*&)*([^&]*))?\b(simpleyui|yui(?:-\w+)?)\/\2(?:-(min|debug))?\.js/,
366
 
                parseBasePath: function(src, pattern) {
367
 
                    var match = src.match(pattern),
368
 
                        path, filter;
369
 
 
370
 
                    if (match) {
371
 
                        path = RegExp.leftContext || src.slice(0, src.indexOf(match[0]));
372
 
 
373
 
                        // this is to set up the path to the loader.  The file
374
 
                        // filter for loader should match the yui include.
375
 
                        filter = match[3];
376
 
 
377
 
                        // extract correct path for mixed combo urls
378
 
                        // http://yuilibrary.com/projects/yui3/ticket/2528423
379
 
                        if (match[1]) {
380
 
                            path += '?' + match[1];
381
 
                        }
382
 
                        path = {
383
 
                            filter: filter,
384
 
                            path: path
385
 
                        }
386
 
                    }
387
 
                    return path;
388
 
                },
389
 
                getBase: G_ENV && G_ENV.getBase ||
390
 
                        function(pattern) {
391
 
                            var nodes = (doc && doc.getElementsByTagName('script')) || [],
392
 
                                path = Env.cdn, parsed,
393
 
                                i, len, src;
394
 
 
395
 
                            for (i = 0, len = nodes.length; i < len; ++i) {
396
 
                                src = nodes[i].src;
397
 
                                if (src) {
398
 
                                    parsed = Y.Env.parseBasePath(src, pattern);
399
 
                                    if (parsed) {
400
 
                                        filter = parsed.filter;
401
 
                                        path = parsed.path;
402
 
                                        break;
403
 
                                    }
404
 
                                }
405
 
                            }
406
 
 
407
 
                            // use CDN default
408
 
                            return path;
409
 
                        }
410
 
 
411
 
            };
412
 
 
413
 
            Env = Y.Env;
414
 
 
415
 
            Env._loaded[VERSION] = {};
416
 
 
417
 
            if (G_ENV && Y !== YUI) {
418
 
                Env._yidx = ++G_ENV._yidx;
419
 
                Env._guidp = ('yui_' + VERSION + '_' +
420
 
                             Env._yidx + '_' + time).replace(/\./g, '_');
421
 
            } else if (YUI._YUI) {
422
 
 
423
 
                G_ENV = YUI._YUI.Env;
424
 
                Env._yidx += G_ENV._yidx;
425
 
                Env._uidx += G_ENV._uidx;
426
 
 
427
 
                for (prop in G_ENV) {
428
 
                    if (!(prop in Env)) {
429
 
                        Env[prop] = G_ENV[prop];
430
 
                    }
431
 
                }
432
 
 
433
 
                delete YUI._YUI;
434
 
            }
435
 
 
436
 
            Y.id = Y.stamp(Y);
437
 
            instances[Y.id] = Y;
438
 
 
439
 
        }
440
 
 
441
 
        Y.constructor = YUI;
442
 
 
443
 
        // configuration defaults
444
 
        Y.config = Y.config || {
445
 
            bootstrap: true,
446
 
            cacheUse: true,
447
 
            debug: true,
448
 
            doc: doc,
449
 
            fetchCSS: true,
450
 
            throwFail: true,
451
 
            useBrowserConsole: true,
452
 
            useNativeES5: true,
453
 
            win: win
454
 
        };
455
 
 
456
 
        //Register the CSS stamp element
457
 
        if (doc && !doc.getElementById(CSS_STAMP_EL)) {
458
 
            el = doc.createElement('div');
459
 
            el.innerHTML = '<div id="' + CSS_STAMP_EL + '" style="position: absolute !important; visibility: hidden !important"></div>';
460
 
            YUI.Env.cssStampEl = el.firstChild;
461
 
            docEl.insertBefore(YUI.Env.cssStampEl, docEl.firstChild);
462
 
        }
463
 
 
464
 
        Y.config.lang = Y.config.lang || 'en-US';
465
 
 
466
 
        Y.config.base = YUI.config.base || Y.Env.getBase(Y.Env._BASE_RE);
467
 
 
468
 
        if (!filter || (!('mindebug').indexOf(filter))) {
469
 
            filter = 'min';
470
 
        }
471
 
        filter = (filter) ? '-' + filter : filter;
472
 
        Y.config.loaderPath = YUI.config.loaderPath || 'loader/loader' + filter + '.js';
473
 
 
474
 
    },
475
 
 
476
 
    /**
477
 
     * Finishes the instance setup. Attaches whatever modules were defined
478
 
     * when the yui modules was registered.
479
 
     * @method _setup
480
 
     * @private
481
 
     */
482
 
    _setup: function(o) {
483
 
        var i, Y = this,
484
 
            core = [],
485
 
            mods = YUI.Env.mods,
486
 
            //extras = Y.config.core || ['get','features','intl-base','yui-log', 'yui-log-nodejs', 'yui-later','loader-base', 'loader-rollup', 'loader-yui3'];
487
 
            extras = Y.config.core || [].concat(YUI.Env.core); //Clone it..
488
 
 
489
 
        for (i = 0; i < extras.length; i++) {
490
 
            if (mods[extras[i]]) {
491
 
                core.push(extras[i]);
492
 
            }
493
 
        }
494
 
 
495
 
        Y._attach(['yui-base']);
496
 
        Y._attach(core);
497
 
 
498
 
        if (Y.Loader) {
499
 
            getLoader(Y);
500
 
        }
501
 
 
502
 
        // Y.log(Y.id + ' initialized', 'info', 'yui');
503
 
    },
504
 
 
505
 
    /**
506
 
     * Executes a method on a YUI instance with
507
 
     * the specified id if the specified method is whitelisted.
508
 
     * @method applyTo
509
 
     * @param id {String} the YUI instance id.
510
 
     * @param method {String} the name of the method to exectute.
511
 
     * Ex: 'Object.keys'.
512
 
     * @param args {Array} the arguments to apply to the method.
513
 
     * @return {Object} the return value from the applied method or null.
514
 
     */
515
 
    applyTo: function(id, method, args) {
516
 
        if (!(method in APPLY_TO_AUTH)) {
517
 
            this.log(method + ': applyTo not allowed', 'warn', 'yui');
518
 
            return null;
519
 
        }
520
 
 
521
 
        var instance = instances[id], nest, m, i;
522
 
        if (instance) {
523
 
            nest = method.split('.');
524
 
            m = instance;
525
 
            for (i = 0; i < nest.length; i = i + 1) {
526
 
                m = m[nest[i]];
527
 
                if (!m) {
528
 
                    this.log('applyTo not found: ' + method, 'warn', 'yui');
529
 
                }
530
 
            }
531
 
            return m && m.apply(instance, args);
532
 
        }
533
 
 
534
 
        return null;
535
 
    },
536
 
 
537
 
/**
538
 
Registers a module with the YUI global.  The easiest way to create a
539
 
first-class YUI module is to use the YUI component build tool.
540
 
 
541
 
http://yuilibrary.com/projects/builder
542
 
 
543
 
The build system will produce the `YUI.add` wrapper for you module, along
544
 
with any configuration info required for the module.
545
 
@method add
546
 
@param name {String} module name.
547
 
@param fn {Function} entry point into the module that is used to bind module to the YUI instance.
548
 
@param {YUI} fn.Y The YUI instance this module is executed in.
549
 
@param {String} fn.name The name of the module
550
 
@param version {String} version string.
551
 
@param details {Object} optional config data:
552
 
@param details.requires {Array} features that must be present before this module can be attached.
553
 
@param details.optional {Array} optional features that should be present if loadOptional
554
 
 is defined.  Note: modules are not often loaded this way in YUI 3,
555
 
 but this field is still useful to inform the user that certain
556
 
 features in the component will require additional dependencies.
557
 
@param details.use {Array} features that are included within this module which need to
558
 
 be attached automatically when this module is attached.  This
559
 
 supports the YUI 3 rollup system -- a module with submodules
560
 
 defined will need to have the submodules listed in the 'use'
561
 
 config.  The YUI component build tool does this for you.
562
 
@return {YUI} the YUI instance.
563
 
@example
564
 
 
565
 
    YUI.add('davglass', function(Y, name) {
566
 
        Y.davglass = function() {
567
 
            alert('Dav was here!');
568
 
        };
569
 
    }, '3.4.0', { requires: ['yui-base', 'harley-davidson', 'mt-dew'] });
570
 
 
571
 
*/
572
 
    add: function(name, fn, version, details) {
573
 
        details = details || {};
574
 
        var env = YUI.Env,
575
 
            mod = {
576
 
                name: name,
577
 
                fn: fn,
578
 
                version: version,
579
 
                details: details
580
 
            },
581
 
            loader,
582
 
            i, versions = env.versions;
583
 
 
584
 
        env.mods[name] = mod;
585
 
        versions[version] = versions[version] || {};
586
 
        versions[version][name] = mod;
587
 
 
588
 
        for (i in instances) {
589
 
            if (instances.hasOwnProperty(i)) {
590
 
                loader = instances[i].Env._loader;
591
 
                if (loader) {
592
 
                    if (!loader.moduleInfo[name] || loader.moduleInfo[name].temp) {
593
 
                        loader.addModule(details, name);
594
 
                    }
595
 
                }
596
 
            }
597
 
        }
598
 
 
599
 
        return this;
600
 
    },
601
 
 
602
 
    /**
603
 
     * Executes the function associated with each required
604
 
     * module, binding the module to the YUI instance.
605
 
     * @param {Array} r The array of modules to attach
606
 
     * @param {Boolean} [moot=false] Don't throw a warning if the module is not attached
607
 
     * @method _attach
608
 
     * @private
609
 
     */
610
 
    _attach: function(r, moot) {
611
 
        var i, name, mod, details, req, use, after,
612
 
            mods = YUI.Env.mods,
613
 
            aliases = YUI.Env.aliases,
614
 
            Y = this, j,
615
 
            loader = Y.Env._loader,
616
 
            done = Y.Env._attached,
617
 
            len = r.length, loader,
618
 
            c = [];
619
 
 
620
 
        //Check for conditional modules (in a second+ instance) and add their requirements
621
 
        //TODO I hate this entire method, it needs to be fixed ASAP (3.5.0) ^davglass
622
 
        for (i = 0; i < len; i++) {
623
 
            name = r[i];
624
 
            mod = mods[name];
625
 
            c.push(name);
626
 
            if (loader && loader.conditions[name]) {
627
 
                Y.Object.each(loader.conditions[name], function(def) {
628
 
                    var go = def && ((def.ua && Y.UA[def.ua]) || (def.test && def.test(Y)));
629
 
                    if (go) {
630
 
                        c.push(def.name);
631
 
                    }
632
 
                });
633
 
            }
634
 
        }
635
 
        r = c;
636
 
        len = r.length;
637
 
 
638
 
        for (i = 0; i < len; i++) {
639
 
            if (!done[r[i]]) {
640
 
                name = r[i];
641
 
                mod = mods[name];
642
 
 
643
 
                if (aliases && aliases[name]) {
644
 
                    Y._attach(aliases[name]);
645
 
                    continue;
646
 
                }
647
 
                if (!mod) {
648
 
                    if (loader && loader.moduleInfo[name]) {
649
 
                        mod = loader.moduleInfo[name];
650
 
                        moot = true;
651
 
                    }
652
 
 
653
 
                    // Y.log('no js def for: ' + name, 'info', 'yui');
654
 
 
655
 
                    //if (!loader || !loader.moduleInfo[name]) {
656
 
                    //if ((!loader || !loader.moduleInfo[name]) && !moot) {
657
 
                    if (!moot && name) {
658
 
                        if ((name.indexOf('skin-') === -1) && (name.indexOf('css') === -1)) {
659
 
                            Y.Env._missed.push(name);
660
 
                            Y.Env._missed = Y.Array.dedupe(Y.Env._missed);
661
 
                            Y.message('NOT loaded: ' + name, 'warn', 'yui');
662
 
                        }
663
 
                    }
664
 
                } else {
665
 
                    done[name] = true;
666
 
                    //Don't like this, but in case a mod was asked for once, then we fetch it
667
 
                    //We need to remove it from the missed list ^davglass
668
 
                    for (j = 0; j < Y.Env._missed.length; j++) {
669
 
                        if (Y.Env._missed[j] === name) {
670
 
                            Y.message('Found: ' + name + ' (was reported as missing earlier)', 'warn', 'yui');
671
 
                            Y.Env._missed.splice(j, 1);
672
 
                        }
673
 
                    }
674
 
                    details = mod.details;
675
 
                    req = details.requires;
676
 
                    use = details.use;
677
 
                    after = details.after;
678
 
 
679
 
                    if (req) {
680
 
                        for (j = 0; j < req.length; j++) {
681
 
                            if (!done[req[j]]) {
682
 
                                if (!Y._attach(req)) {
683
 
                                    return false;
684
 
                                }
685
 
                                break;
686
 
                            }
687
 
                        }
688
 
                    }
689
 
 
690
 
                    if (after) {
691
 
                        for (j = 0; j < after.length; j++) {
692
 
                            if (!done[after[j]]) {
693
 
                                if (!Y._attach(after, true)) {
694
 
                                    return false;
695
 
                                }
696
 
                                break;
697
 
                            }
698
 
                        }
699
 
                    }
700
 
 
701
 
                    if (mod.fn) {
702
 
                        try {
703
 
                            mod.fn(Y, name);
704
 
                        } catch (e) {
705
 
                            Y.error('Attach error: ' + name, e, name);
706
 
                            return false;
707
 
                        }
708
 
                    }
709
 
 
710
 
                    if (use) {
711
 
                        for (j = 0; j < use.length; j++) {
712
 
                            if (!done[use[j]]) {
713
 
                                if (!Y._attach(use)) {
714
 
                                    return false;
715
 
                                }
716
 
                                break;
717
 
                            }
718
 
                        }
719
 
                    }
720
 
 
721
 
 
722
 
 
723
 
                }
724
 
            }
725
 
        }
726
 
 
727
 
        return true;
728
 
    },
729
 
 
730
 
    /**
731
 
     * Attaches one or more modules to the YUI instance.  When this
732
 
     * is executed, the requirements are analyzed, and one of
733
 
     * several things can happen:
734
 
     *
735
 
     *  * All requirements are available on the page --  The modules
736
 
     *   are attached to the instance.  If supplied, the use callback
737
 
     *   is executed synchronously.
738
 
     *
739
 
     *  * Modules are missing, the Get utility is not available OR
740
 
     *   the 'bootstrap' config is false -- A warning is issued about
741
 
     *   the missing modules and all available modules are attached.
742
 
     *
743
 
     *  * Modules are missing, the Loader is not available but the Get
744
 
     *   utility is and boostrap is not false -- The loader is bootstrapped
745
 
     *   before doing the following....
746
 
     *
747
 
     *  * Modules are missing and the Loader is available -- The loader
748
 
     *   expands the dependency tree and fetches missing modules.  When
749
 
     *   the loader is finshed the callback supplied to use is executed
750
 
     *   asynchronously.
751
 
     *
752
 
     * @method use
753
 
     * @param modules* {String|Array} 1-n modules to bind (uses arguments array).
754
 
     * @param [callback] {Function} callback function executed when
755
 
     * the instance has the required functionality.  If included, it
756
 
     * must be the last parameter.
757
 
     * @param callback.Y {YUI} The `YUI` instance created for this sandbox
758
 
     * @param callback.data {Object} Object data returned from `Loader`.
759
 
     *
760
 
     * @example
761
 
     *      // loads and attaches dd and its dependencies
762
 
     *      YUI().use('dd', function(Y) {});
763
 
     *
764
 
     *      // loads and attaches dd and node as well as all of their dependencies (since 3.4.0)
765
 
     *      YUI().use(['dd', 'node'], function(Y) {});
766
 
     *
767
 
     *      // attaches all modules that are available on the page
768
 
     *      YUI().use('*', function(Y) {});
769
 
     *
770
 
     *      // intrinsic YUI gallery support (since 3.1.0)
771
 
     *      YUI().use('gallery-yql', function(Y) {});
772
 
     *
773
 
     *      // intrinsic YUI 2in3 support (since 3.1.0)
774
 
     *      YUI().use('yui2-datatable', function(Y) {});
775
 
     *
776
 
     * @return {YUI} the YUI instance.
777
 
     */
778
 
    use: function() {
779
 
        var args = SLICE.call(arguments, 0),
780
 
            callback = args[args.length - 1],
781
 
            Y = this,
782
 
            i = 0,
783
 
            a = [],
784
 
            name,
785
 
            Env = Y.Env,
786
 
            provisioned = true;
787
 
 
788
 
        // The last argument supplied to use can be a load complete callback
789
 
        if (Y.Lang.isFunction(callback)) {
790
 
            args.pop();
791
 
        } else {
792
 
            callback = null;
793
 
        }
794
 
        if (Y.Lang.isArray(args[0])) {
795
 
            args = args[0];
796
 
        }
797
 
 
798
 
        if (Y.config.cacheUse) {
799
 
            while ((name = args[i++])) {
800
 
                if (!Env._attached[name]) {
801
 
                    provisioned = false;
802
 
                    break;
803
 
                }
804
 
            }
805
 
 
806
 
            if (provisioned) {
807
 
                if (args.length) {
808
 
                    Y.log('already provisioned: ' + args, 'info', 'yui');
809
 
                }
810
 
                Y._notify(callback, ALREADY_DONE, args);
811
 
                return Y;
812
 
            }
813
 
        }
814
 
 
815
 
        if (Y._loading) {
816
 
            Y._useQueue = Y._useQueue || new Y.Queue();
817
 
            Y._useQueue.add([args, callback]);
818
 
        } else {
819
 
            Y._use(args, function(Y, response) {
820
 
                Y._notify(callback, response, args);
821
 
            });
822
 
        }
823
 
 
824
 
        return Y;
825
 
    },
826
 
    /**
827
 
    * Notify handler from Loader for attachment/load errors
828
 
    * @method _notify
829
 
    * @param callback {Function} The callback to pass to the `Y.config.loadErrorFn`
830
 
    * @param response {Object} The response returned from Loader
831
 
    * @param args {Array} The aruments passed from Loader
832
 
    * @private
833
 
    */
834
 
    _notify: function(callback, response, args) {
835
 
        if (!response.success && this.config.loadErrorFn) {
836
 
            this.config.loadErrorFn.call(this, this, callback, response, args);
837
 
        } else if (callback) {
838
 
            try {
839
 
                callback(this, response);
840
 
            } catch (e) {
841
 
                this.error('use callback error', e, args);
842
 
            }
843
 
        }
844
 
    },
845
 
 
846
 
    /**
847
 
    * This private method is called from the `use` method queue. To ensure that only one set of loading
848
 
    * logic is performed at a time.
849
 
    * @method _use
850
 
    * @private
851
 
    * @param args* {String} 1-n modules to bind (uses arguments array).
852
 
    * @param *callback {Function} callback function executed when
853
 
    * the instance has the required functionality.  If included, it
854
 
    * must be the last parameter.
855
 
    */
856
 
    _use: function(args, callback) {
857
 
 
858
 
        if (!this.Array) {
859
 
            this._attach(['yui-base']);
860
 
        }
861
 
 
862
 
        var len, loader, handleBoot, handleRLS,
863
 
            Y = this,
864
 
            G_ENV = YUI.Env,
865
 
            mods = G_ENV.mods,
866
 
            Env = Y.Env,
867
 
            used = Env._used,
868
 
            aliases = G_ENV.aliases,
869
 
            queue = G_ENV._loaderQueue,
870
 
            firstArg = args[0],
871
 
            YArray = Y.Array,
872
 
            config = Y.config,
873
 
            boot = config.bootstrap,
874
 
            missing = [],
875
 
            r = [],
876
 
            ret = true,
877
 
            fetchCSS = config.fetchCSS,
878
 
            process = function(names, skip) {
879
 
 
880
 
                var i = 0, a = [];
881
 
 
882
 
                if (!names.length) {
883
 
                    return;
884
 
                }
885
 
 
886
 
                if (aliases) {
887
 
                    for (i = 0; i < names.length; i++) {
888
 
                        if (aliases[names[i]]) {
889
 
                            a = [].concat(a, aliases[names[i]]);
890
 
                        } else {
891
 
                            a.push(names[i]);
892
 
                        }
893
 
                    }
894
 
                    names = a;
895
 
                }
896
 
 
897
 
                YArray.each(names, function(name) {
898
 
 
899
 
                    // add this module to full list of things to attach
900
 
                    if (!skip) {
901
 
                        r.push(name);
902
 
                    }
903
 
 
904
 
                    // only attach a module once
905
 
                    if (used[name]) {
906
 
                        return;
907
 
                    }
908
 
 
909
 
                    var m = mods[name], req, use;
910
 
 
911
 
                    if (m) {
912
 
                        used[name] = true;
913
 
                        req = m.details.requires;
914
 
                        use = m.details.use;
915
 
                    } else {
916
 
                        // CSS files don't register themselves, see if it has
917
 
                        // been loaded
918
 
                        if (!G_ENV._loaded[VERSION][name]) {
919
 
                            missing.push(name);
920
 
                        } else {
921
 
                            used[name] = true; // probably css
922
 
                        }
923
 
                    }
924
 
 
925
 
                    // make sure requirements are attached
926
 
                    if (req && req.length) {
927
 
                        process(req);
928
 
                    }
929
 
 
930
 
                    // make sure we grab the submodule dependencies too
931
 
                    if (use && use.length) {
932
 
                        process(use, 1);
933
 
                    }
934
 
                });
935
 
            },
936
 
 
937
 
            handleLoader = function(fromLoader) {
938
 
                var response = fromLoader || {
939
 
                        success: true,
940
 
                        msg: 'not dynamic'
941
 
                    },
942
 
                    redo, origMissing,
943
 
                    ret = true,
944
 
                    data = response.data;
945
 
 
946
 
                Y._loading = false;
947
 
 
948
 
                if (data) {
949
 
                    origMissing = missing;
950
 
                    missing = [];
951
 
                    r = [];
952
 
                    process(data);
953
 
                    redo = missing.length;
954
 
                    if (redo) {
955
 
                        if (missing.sort().join() ==
956
 
                                origMissing.sort().join()) {
957
 
                            redo = false;
958
 
                        }
959
 
                    }
960
 
                }
961
 
 
962
 
                if (redo && data) {
963
 
                    Y._loading = true;
964
 
                    Y._use(missing, function() {
965
 
                        Y.log('Nested use callback: ' + data, 'info', 'yui');
966
 
                        if (Y._attach(data)) {
967
 
                            Y._notify(callback, response, data);
968
 
                        }
969
 
                    });
970
 
                } else {
971
 
                    if (data) {
972
 
                        // Y.log('attaching from loader: ' + data, 'info', 'yui');
973
 
                        ret = Y._attach(data);
974
 
                    }
975
 
                    if (ret) {
976
 
                        Y._notify(callback, response, args);
977
 
                    }
978
 
                }
979
 
 
980
 
                if (Y._useQueue && Y._useQueue.size() && !Y._loading) {
981
 
                    Y._use.apply(Y, Y._useQueue.next());
982
 
                }
983
 
 
984
 
            };
985
 
 
986
 
// Y.log(Y.id + ': use called: ' + a + ' :: ' + callback, 'info', 'yui');
987
 
 
988
 
        // YUI().use('*'); // bind everything available
989
 
        if (firstArg === '*') {
990
 
            ret = Y._attach(Y.Object.keys(mods));
991
 
            if (ret) {
992
 
                handleLoader();
993
 
            }
994
 
            return Y;
995
 
        }
996
 
 
997
 
        if (mods['loader'] && !Y.Loader) {
998
 
            Y.log('Loader was found in meta, but it is not attached. Attaching..', 'info', 'yui');
999
 
            Y._attach(['loader']);
1000
 
        }
1001
 
 
1002
 
        // Y.log('before loader requirements: ' + args, 'info', 'yui');
1003
 
 
1004
 
        // use loader to expand dependencies and sort the
1005
 
        // requirements if it is available.
1006
 
        if (boot && Y.Loader && args.length) {
1007
 
            loader = getLoader(Y);
1008
 
            loader.require(args);
1009
 
            loader.ignoreRegistered = true;
1010
 
            loader._boot = true;
1011
 
            loader.calculate(null, (fetchCSS) ? null : 'js');
1012
 
            args = loader.sorted;
1013
 
            loader._boot = false;
1014
 
        }
1015
 
 
1016
 
        // process each requirement and any additional requirements
1017
 
        // the module metadata specifies
1018
 
        process(args);
1019
 
 
1020
 
        len = missing.length;
1021
 
 
1022
 
        if (len) {
1023
 
            missing = Y.Object.keys(YArray.hash(missing));
1024
 
            len = missing.length;
1025
 
Y.log('Modules missing: ' + missing + ', ' + missing.length, 'info', 'yui');
1026
 
        }
1027
 
 
1028
 
 
1029
 
        // dynamic load
1030
 
        if (boot && len && Y.Loader) {
1031
 
// Y.log('Using loader to fetch missing deps: ' + missing, 'info', 'yui');
1032
 
            Y.log('Using Loader', 'info', 'yui');
1033
 
            Y._loading = true;
1034
 
            loader = getLoader(Y);
1035
 
            loader.onEnd = handleLoader;
1036
 
            loader.context = Y;
1037
 
            loader.data = args;
1038
 
            loader.ignoreRegistered = false;
1039
 
            loader.require(args);
1040
 
            loader.insert(null, (fetchCSS) ? null : 'js');
1041
 
 
1042
 
        } else if (boot && len && Y.Get && !Env.bootstrapped) {
1043
 
 
1044
 
            Y._loading = true;
1045
 
 
1046
 
            handleBoot = function() {
1047
 
                Y._loading = false;
1048
 
                queue.running = false;
1049
 
                Env.bootstrapped = true;
1050
 
                G_ENV._bootstrapping = false;
1051
 
                if (Y._attach(['loader'])) {
1052
 
                    Y._use(args, callback);
1053
 
                }
1054
 
            };
1055
 
 
1056
 
            if (G_ENV._bootstrapping) {
1057
 
Y.log('Waiting for loader', 'info', 'yui');
1058
 
                queue.add(handleBoot);
1059
 
            } else {
1060
 
                G_ENV._bootstrapping = true;
1061
 
Y.log('Fetching loader: ' + config.base + config.loaderPath, 'info', 'yui');
1062
 
                Y.Get.script(config.base + config.loaderPath, {
1063
 
                    onEnd: handleBoot
1064
 
                });
1065
 
            }
1066
 
 
1067
 
        } else {
1068
 
            Y.log('Attaching available dependencies: ' + args, 'info', 'yui');
1069
 
            ret = Y._attach(args);
1070
 
            if (ret) {
1071
 
                handleLoader();
1072
 
            }
1073
 
        }
1074
 
 
1075
 
        return Y;
1076
 
    },
1077
 
 
1078
 
 
1079
 
    /**
1080
 
    Adds a namespace object onto the YUI global if called statically.
1081
 
 
1082
 
        // creates YUI.your.namespace.here as nested objects
1083
 
        YUI.namespace("your.namespace.here");
1084
 
 
1085
 
    If called as a method on a YUI <em>instance</em>, it creates the
1086
 
    namespace on the instance.
1087
 
 
1088
 
         // creates Y.property.package
1089
 
         Y.namespace("property.package");
1090
 
 
1091
 
    Dots in the input string cause `namespace` to create nested objects for
1092
 
    each token. If any part of the requested namespace already exists, the
1093
 
    current object will be left in place.  This allows multiple calls to
1094
 
    `namespace` to preserve existing namespaced properties.
1095
 
 
1096
 
    If the first token in the namespace string is "YAHOO", the token is
1097
 
    discarded.
1098
 
 
1099
 
    Be careful with namespace tokens. Reserved words may work in some browsers
1100
 
    and not others. For instance, the following will fail in some browsers
1101
 
    because the supported version of JavaScript reserves the word "long":
1102
 
 
1103
 
         Y.namespace("really.long.nested.namespace");
1104
 
 
1105
 
    <em>Note: If you pass multiple arguments to create multiple namespaces, only
1106
 
    the last one created is returned from this function.</em>
1107
 
 
1108
 
    @method namespace
1109
 
    @param  {String} namespace* namespaces to create.
1110
 
    @return {Object}  A reference to the last namespace object created.
1111
 
    **/
1112
 
    namespace: function() {
1113
 
        var a = arguments, o, i = 0, j, d, arg;
1114
 
 
1115
 
        for (; i < a.length; i++) {
1116
 
            o = this; //Reset base object per argument or it will get reused from the last
1117
 
            arg = a[i];
1118
 
            if (arg.indexOf(PERIOD) > -1) { //Skip this if no "." is present
1119
 
                d = arg.split(PERIOD);
1120
 
                for (j = (d[0] == 'YAHOO') ? 1 : 0; j < d.length; j++) {
1121
 
                    o[d[j]] = o[d[j]] || {};
1122
 
                    o = o[d[j]];
1123
 
                }
1124
 
            } else {
1125
 
                o[arg] = o[arg] || {};
1126
 
                o = o[arg]; //Reset base object to the new object so it's returned
1127
 
            }
1128
 
        }
1129
 
        return o;
1130
 
    },
1131
 
 
1132
 
    // this is replaced if the log module is included
1133
 
    log: NOOP,
1134
 
    message: NOOP,
1135
 
    // this is replaced if the dump module is included
1136
 
    dump: function (o) { return ''+o; },
1137
 
 
1138
 
    /**
1139
 
     * Report an error.  The reporting mechanism is controlled by
1140
 
     * the `throwFail` configuration attribute.  If throwFail is
1141
 
     * not specified, the message is written to the Logger, otherwise
1142
 
     * a JS error is thrown. If an `errorFn` is specified in the config
1143
 
     * it must return `true` to keep the error from being thrown.
1144
 
     * @method error
1145
 
     * @param msg {String} the error message.
1146
 
     * @param e {Error|String} Optional JS error that was caught, or an error string.
1147
 
     * @param src Optional additional info (passed to `Y.config.errorFn` and `Y.message`)
1148
 
     * and `throwFail` is specified, this error will be re-thrown.
1149
 
     * @return {YUI} this YUI instance.
1150
 
     */
1151
 
    error: function(msg, e, src) {
1152
 
        //TODO Add check for window.onerror here
1153
 
 
1154
 
        var Y = this, ret;
1155
 
 
1156
 
        if (Y.config.errorFn) {
1157
 
            ret = Y.config.errorFn.apply(Y, arguments);
1158
 
        }
1159
 
 
1160
 
        if (Y.config.throwFail && !ret) {
1161
 
            throw (e || new Error(msg));
1162
 
        } else {
1163
 
            Y.message(msg, 'error', ''+src); // don't scrub this one
1164
 
        }
1165
 
 
1166
 
        return Y;
1167
 
    },
1168
 
 
1169
 
    /**
1170
 
     * Generate an id that is unique among all YUI instances
1171
 
     * @method guid
1172
 
     * @param pre {String} optional guid prefix.
1173
 
     * @return {String} the guid.
1174
 
     */
1175
 
    guid: function(pre) {
1176
 
        var id = this.Env._guidp + '_' + (++this.Env._uidx);
1177
 
        return (pre) ? (pre + id) : id;
1178
 
    },
1179
 
 
1180
 
    /**
1181
 
     * Returns a `guid` associated with an object.  If the object
1182
 
     * does not have one, a new one is created unless `readOnly`
1183
 
     * is specified.
1184
 
     * @method stamp
1185
 
     * @param o {Object} The object to stamp.
1186
 
     * @param readOnly {Boolean} if `true`, a valid guid will only
1187
 
     * be returned if the object has one assigned to it.
1188
 
     * @return {String} The object's guid or null.
1189
 
     */
1190
 
    stamp: function(o, readOnly) {
1191
 
        var uid;
1192
 
        if (!o) {
1193
 
            return o;
1194
 
        }
1195
 
 
1196
 
        // IE generates its own unique ID for dom nodes
1197
 
        // The uniqueID property of a document node returns a new ID
1198
 
        if (o.uniqueID && o.nodeType && o.nodeType !== 9) {
1199
 
            uid = o.uniqueID;
1200
 
        } else {
1201
 
            uid = (typeof o === 'string') ? o : o._yuid;
1202
 
        }
1203
 
 
1204
 
        if (!uid) {
1205
 
            uid = this.guid();
1206
 
            if (!readOnly) {
1207
 
                try {
1208
 
                    o._yuid = uid;
1209
 
                } catch (e) {
1210
 
                    uid = null;
1211
 
                }
1212
 
            }
1213
 
        }
1214
 
        return uid;
1215
 
    },
1216
 
 
1217
 
    /**
1218
 
     * Destroys the YUI instance
1219
 
     * @method destroy
1220
 
     * @since 3.3.0
1221
 
     */
1222
 
    destroy: function() {
1223
 
        var Y = this;
1224
 
        if (Y.Event) {
1225
 
            Y.Event._unload();
1226
 
        }
1227
 
        delete instances[Y.id];
1228
 
        delete Y.Env;
1229
 
        delete Y.config;
1230
 
    }
1231
 
 
1232
 
    /**
1233
 
     * instanceof check for objects that works around
1234
 
     * memory leak in IE when the item tested is
1235
 
     * window/document
1236
 
     * @method instanceOf
1237
 
     * @param o {Object} The object to check.
1238
 
     * @param type {Object} The class to check against.
1239
 
     * @since 3.3.0
1240
 
     */
1241
 
};
1242
 
 
1243
 
    YUI.prototype = proto;
1244
 
 
1245
 
    // inheritance utilities are not available yet
1246
 
    for (prop in proto) {
1247
 
        if (proto.hasOwnProperty(prop)) {
1248
 
            YUI[prop] = proto[prop];
1249
 
        }
1250
 
    }
1251
 
 
1252
 
    /**
1253
 
Static method on the Global YUI object to apply a config to all YUI instances.
1254
 
It's main use case is "mashups" where several third party scripts are trying to write to
1255
 
a global YUI config at the same time. This way they can all call `YUI.applyConfig({})` instead of
1256
 
overwriting other scripts configs.
1257
 
@static
1258
 
@since 3.5.0
1259
 
@method applyConfig
1260
 
@param {Object} o the configuration object.
1261
 
@example
1262
 
 
1263
 
    YUI.applyConfig({
1264
 
        modules: {
1265
 
            davglass: {
1266
 
                fullpath: './davglass.js'
1267
 
            }
1268
 
        }
1269
 
    });
1270
 
 
1271
 
    YUI.applyConfig({
1272
 
        modules: {
1273
 
            foo: {
1274
 
                fullpath: './foo.js'
1275
 
            }
1276
 
        }
1277
 
    });
1278
 
 
1279
 
    YUI().use('davglass', function(Y) {
1280
 
        //Module davglass will be available here..
1281
 
    });
1282
 
 
1283
 
    */
1284
 
    YUI.applyConfig = function(o) {
1285
 
        if (!o) {
1286
 
            return;
1287
 
        }
1288
 
        //If there is a GlobalConfig, apply it first to set the defaults
1289
 
        if (YUI.GlobalConfig) {
1290
 
            this.prototype.applyConfig.call(this, YUI.GlobalConfig);
1291
 
        }
1292
 
        //Apply this config to it
1293
 
        this.prototype.applyConfig.call(this, o);
1294
 
        //Reset GlobalConfig to the combined config
1295
 
        YUI.GlobalConfig = this.config;
1296
 
    };
1297
 
 
1298
 
    // set up the environment
1299
 
    YUI._init();
1300
 
 
1301
 
    if (hasWin) {
1302
 
        // add a window load event at load time so we can capture
1303
 
        // the case where it fires before dynamic loading is
1304
 
        // complete.
1305
 
        add(window, 'load', handleLoad);
1306
 
    } else {
1307
 
        handleLoad();
1308
 
    }
1309
 
 
1310
 
    YUI.Env.add = add;
1311
 
    YUI.Env.remove = remove;
1312
 
 
1313
 
    /*global exports*/
1314
 
    // Support the CommonJS method for exporting our single global
1315
 
    if (typeof exports == 'object') {
1316
 
        exports.YUI = YUI;
1317
 
    }
1318
 
 
1319
 
}());
1320
 
 
1321
 
 
1322
 
/**
1323
 
 * The config object contains all of the configuration options for
1324
 
 * the `YUI` instance.  This object is supplied by the implementer
1325
 
 * when instantiating a `YUI` instance.  Some properties have default
1326
 
 * values if they are not supplied by the implementer.  This should
1327
 
 * not be updated directly because some values are cached.  Use
1328
 
 * `applyConfig()` to update the config object on a YUI instance that
1329
 
 * has already been configured.
1330
 
 *
1331
 
 * @class config
1332
 
 * @static
1333
 
 */
1334
 
 
1335
 
/**
1336
 
 * Allows the YUI seed file to fetch the loader component and library
1337
 
 * metadata to dynamically load additional dependencies.
1338
 
 *
1339
 
 * @property bootstrap
1340
 
 * @type boolean
1341
 
 * @default true
1342
 
 */
1343
 
 
1344
 
/**
1345
 
 * Turns on writing Ylog messages to the browser console.
1346
 
 *
1347
 
 * @property debug
1348
 
 * @type boolean
1349
 
 * @default true
1350
 
 */
1351
 
 
1352
 
/**
1353
 
 * Log to the browser console if debug is on and the browser has a
1354
 
 * supported console.
1355
 
 *
1356
 
 * @property useBrowserConsole
1357
 
 * @type boolean
1358
 
 * @default true
1359
 
 */
1360
 
 
1361
 
/**
1362
 
 * A hash of log sources that should be logged.  If specified, only
1363
 
 * log messages from these sources will be logged.
1364
 
 *
1365
 
 * @property logInclude
1366
 
 * @type object
1367
 
 */
1368
 
 
1369
 
/**
1370
 
 * A hash of log sources that should be not be logged.  If specified,
1371
 
 * all sources are logged if not on this list.
1372
 
 *
1373
 
 * @property logExclude
1374
 
 * @type object
1375
 
 */
1376
 
 
1377
 
/**
1378
 
 * Set to true if the yui seed file was dynamically loaded in
1379
 
 * order to bootstrap components relying on the window load event
1380
 
 * and the `domready` custom event.
1381
 
 *
1382
 
 * @property injected
1383
 
 * @type boolean
1384
 
 * @default false
1385
 
 */
1386
 
 
1387
 
/**
1388
 
 * If `throwFail` is set, `Y.error` will generate or re-throw a JS Error.
1389
 
 * Otherwise the failure is logged.
1390
 
 *
1391
 
 * @property throwFail
1392
 
 * @type boolean
1393
 
 * @default true
1394
 
 */
1395
 
 
1396
 
/**
1397
 
 * The window/frame that this instance should operate in.
1398
 
 *
1399
 
 * @property win
1400
 
 * @type Window
1401
 
 * @default the window hosting YUI
1402
 
 */
1403
 
 
1404
 
/**
1405
 
 * The document associated with the 'win' configuration.
1406
 
 *
1407
 
 * @property doc
1408
 
 * @type Document
1409
 
 * @default the document hosting YUI
1410
 
 */
1411
 
 
1412
 
/**
1413
 
 * A list of modules that defines the YUI core (overrides the default list).
1414
 
 *
1415
 
 * @property core
1416
 
 * @type Array
1417
 
 * @default [ get,features,intl-base,yui-log,yui-later,loader-base, loader-rollup, loader-yui3 ]
1418
 
 */
1419
 
 
1420
 
/**
1421
 
 * A list of languages in order of preference. This list is matched against
1422
 
 * the list of available languages in modules that the YUI instance uses to
1423
 
 * determine the best possible localization of language sensitive modules.
1424
 
 * Languages are represented using BCP 47 language tags, such as "en-GB" for
1425
 
 * English as used in the United Kingdom, or "zh-Hans-CN" for simplified
1426
 
 * Chinese as used in China. The list can be provided as a comma-separated
1427
 
 * list or as an array.
1428
 
 *
1429
 
 * @property lang
1430
 
 * @type string|string[]
1431
 
 */
1432
 
 
1433
 
/**
1434
 
 * The default date format
1435
 
 * @property dateFormat
1436
 
 * @type string
1437
 
 * @deprecated use configuration in `DataType.Date.format()` instead.
1438
 
 */
1439
 
 
1440
 
/**
1441
 
 * The default locale
1442
 
 * @property locale
1443
 
 * @type string
1444
 
 * @deprecated use `config.lang` instead.
1445
 
 */
1446
 
 
1447
 
/**
1448
 
 * The default interval when polling in milliseconds.
1449
 
 * @property pollInterval
1450
 
 * @type int
1451
 
 * @default 20
1452
 
 */
1453
 
 
1454
 
/**
1455
 
 * The number of dynamic nodes to insert by default before
1456
 
 * automatically removing them.  This applies to script nodes
1457
 
 * because removing the node will not make the evaluated script
1458
 
 * unavailable.  Dynamic CSS is not auto purged, because removing
1459
 
 * a linked style sheet will also remove the style definitions.
1460
 
 * @property purgethreshold
1461
 
 * @type int
1462
 
 * @default 20
1463
 
 */
1464
 
 
1465
 
/**
1466
 
 * The default interval when polling in milliseconds.
1467
 
 * @property windowResizeDelay
1468
 
 * @type int
1469
 
 * @default 40
1470
 
 */
1471
 
 
1472
 
/**
1473
 
 * Base directory for dynamic loading
1474
 
 * @property base
1475
 
 * @type string
1476
 
 */
1477
 
 
1478
 
/*
1479
 
 * The secure base dir (not implemented)
1480
 
 * For dynamic loading.
1481
 
 * @property secureBase
1482
 
 * @type string
1483
 
 */
1484
 
 
1485
 
/**
1486
 
 * The YUI combo service base dir. Ex: `http://yui.yahooapis.com/combo?`
1487
 
 * For dynamic loading.
1488
 
 * @property comboBase
1489
 
 * @type string
1490
 
 */
1491
 
 
1492
 
/**
1493
 
 * The root path to prepend to module path for the combo service.
1494
 
 * Ex: 3.0.0b1/build/
1495
 
 * For dynamic loading.
1496
 
 * @property root
1497
 
 * @type string
1498
 
 */
1499
 
 
1500
 
/**
1501
 
 * A filter to apply to result urls.  This filter will modify the default
1502
 
 * path for all modules.  The default path for the YUI library is the
1503
 
 * minified version of the files (e.g., event-min.js).  The filter property
1504
 
 * can be a predefined filter or a custom filter.  The valid predefined
1505
 
 * filters are:
1506
 
 * <dl>
1507
 
 *  <dt>DEBUG</dt>
1508
 
 *  <dd>Selects the debug versions of the library (e.g., event-debug.js).
1509
 
 *      This option will automatically include the Logger widget</dd>
1510
 
 *  <dt>RAW</dt>
1511
 
 *  <dd>Selects the non-minified version of the library (e.g., event.js).</dd>
1512
 
 * </dl>
1513
 
 * You can also define a custom filter, which must be an object literal
1514
 
 * containing a search expression and a replace string:
1515
 
 *
1516
 
 *      myFilter: {
1517
 
 *          'searchExp': "-min\\.js",
1518
 
 *          'replaceStr': "-debug.js"
1519
 
 *      }
1520
 
 *
1521
 
 * For dynamic loading.
1522
 
 *
1523
 
 * @property filter
1524
 
 * @type string|object
1525
 
 */
1526
 
 
1527
 
/**
1528
 
 * The `skin` config let's you configure application level skin
1529
 
 * customizations.  It contains the following attributes which
1530
 
 * can be specified to override the defaults:
1531
 
 *
1532
 
 *      // The default skin, which is automatically applied if not
1533
 
 *      // overriden by a component-specific skin definition.
1534
 
 *      // Change this in to apply a different skin globally
1535
 
 *      defaultSkin: 'sam',
1536
 
 *
1537
 
 *      // This is combined with the loader base property to get
1538
 
 *      // the default root directory for a skin.
1539
 
 *      base: 'assets/skins/',
1540
 
 *
1541
 
 *      // Any component-specific overrides can be specified here,
1542
 
 *      // making it possible to load different skins for different
1543
 
 *      // components.  It is possible to load more than one skin
1544
 
 *      // for a given component as well.
1545
 
 *      overrides: {
1546
 
 *          slider: ['capsule', 'round']
1547
 
 *      }
1548
 
 *
1549
 
 * For dynamic loading.
1550
 
 *
1551
 
 *  @property skin
1552
 
 */
1553
 
 
1554
 
/**
1555
 
 * Hash of per-component filter specification.  If specified for a given
1556
 
 * component, this overrides the filter config.
1557
 
 *
1558
 
 * For dynamic loading.
1559
 
 *
1560
 
 * @property filters
1561
 
 */
1562
 
 
1563
 
/**
1564
 
 * Use the YUI combo service to reduce the number of http connections
1565
 
 * required to load your dependencies.  Turning this off will
1566
 
 * disable combo handling for YUI and all module groups configured
1567
 
 * with a combo service.
1568
 
 *
1569
 
 * For dynamic loading.
1570
 
 *
1571
 
 * @property combine
1572
 
 * @type boolean
1573
 
 * @default true if 'base' is not supplied, false if it is.
1574
 
 */
1575
 
 
1576
 
/**
1577
 
 * A list of modules that should never be dynamically loaded
1578
 
 *
1579
 
 * @property ignore
1580
 
 * @type string[]
1581
 
 */
1582
 
 
1583
 
/**
1584
 
 * A list of modules that should always be loaded when required, even if already
1585
 
 * present on the page.
1586
 
 *
1587
 
 * @property force
1588
 
 * @type string[]
1589
 
 */
1590
 
 
1591
 
/**
1592
 
 * Node or id for a node that should be used as the insertion point for new
1593
 
 * nodes.  For dynamic loading.
1594
 
 *
1595
 
 * @property insertBefore
1596
 
 * @type string
1597
 
 */
1598
 
 
1599
 
/**
1600
 
 * Object literal containing attributes to add to dynamically loaded script
1601
 
 * nodes.
1602
 
 * @property jsAttributes
1603
 
 * @type string
1604
 
 */
1605
 
 
1606
 
/**
1607
 
 * Object literal containing attributes to add to dynamically loaded link
1608
 
 * nodes.
1609
 
 * @property cssAttributes
1610
 
 * @type string
1611
 
 */
1612
 
 
1613
 
/**
1614
 
 * Number of milliseconds before a timeout occurs when dynamically
1615
 
 * loading nodes. If not set, there is no timeout.
1616
 
 * @property timeout
1617
 
 * @type int
1618
 
 */
1619
 
 
1620
 
/**
1621
 
 * Callback for the 'CSSComplete' event.  When dynamically loading YUI
1622
 
 * components with CSS, this property fires when the CSS is finished
1623
 
 * loading but script loading is still ongoing.  This provides an
1624
 
 * opportunity to enhance the presentation of a loading page a little
1625
 
 * bit before the entire loading process is done.
1626
 
 *
1627
 
 * @property onCSS
1628
 
 * @type function
1629
 
 */
1630
 
 
1631
 
/**
1632
 
 * A hash of module definitions to add to the list of YUI components.
1633
 
 * These components can then be dynamically loaded side by side with
1634
 
 * YUI via the `use()` method. This is a hash, the key is the module
1635
 
 * name, and the value is an object literal specifying the metdata
1636
 
 * for the module.  See `Loader.addModule` for the supported module
1637
 
 * metadata fields.  Also see groups, which provides a way to
1638
 
 * configure the base and combo spec for a set of modules.
1639
 
 *
1640
 
 *      modules: {
1641
 
 *          mymod1: {
1642
 
 *              requires: ['node'],
1643
 
 *              fullpath: '/mymod1/mymod1.js'
1644
 
 *          },
1645
 
 *          mymod2: {
1646
 
 *              requires: ['mymod1'],
1647
 
 *              fullpath: '/mymod2/mymod2.js'
1648
 
 *          },
1649
 
 *          mymod3: '/js/mymod3.js',
1650
 
 *          mycssmod: '/css/mycssmod.css'
1651
 
 *      }
1652
 
 *
1653
 
 *
1654
 
 * @property modules
1655
 
 * @type object
1656
 
 */
1657
 
 
1658
 
/**
1659
 
 * Aliases are dynamic groups of modules that can be used as
1660
 
 * shortcuts.
1661
 
 *
1662
 
 *      YUI({
1663
 
 *          aliases: {
1664
 
 *              davglass: [ 'node', 'yql', 'dd' ],
1665
 
 *              mine: [ 'davglass', 'autocomplete']
1666
 
 *          }
1667
 
 *      }).use('mine', function(Y) {
1668
 
 *          //Node, YQL, DD &amp; AutoComplete available here..
1669
 
 *      });
1670
 
 *
1671
 
 * @property aliases
1672
 
 * @type object
1673
 
 */
1674
 
 
1675
 
/**
1676
 
 * A hash of module group definitions.  It for each group you
1677
 
 * can specify a list of modules and the base path and
1678
 
 * combo spec to use when dynamically loading the modules.
1679
 
 *
1680
 
 *      groups: {
1681
 
 *          yui2: {
1682
 
 *              // specify whether or not this group has a combo service
1683
 
 *              combine: true,
1684
 
 *
1685
 
 *              // The comboSeperator to use with this group's combo handler
1686
 
 *              comboSep: ';',
1687
 
 *
1688
 
 *              // The maxURLLength for this server
1689
 
 *              maxURLLength: 500,
1690
 
 *
1691
 
 *              // the base path for non-combo paths
1692
 
 *              base: 'http://yui.yahooapis.com/2.8.0r4/build/',
1693
 
 *
1694
 
 *              // the path to the combo service
1695
 
 *              comboBase: 'http://yui.yahooapis.com/combo?',
1696
 
 *
1697
 
 *              // a fragment to prepend to the path attribute when
1698
 
 *              // when building combo urls
1699
 
 *              root: '2.8.0r4/build/',
1700
 
 *
1701
 
 *              // the module definitions
1702
 
 *              modules:  {
1703
 
 *                  yui2_yde: {
1704
 
 *                      path: "yahoo-dom-event/yahoo-dom-event.js"
1705
 
 *                  },
1706
 
 *                  yui2_anim: {
1707
 
 *                      path: "animation/animation.js",
1708
 
 *                      requires: ['yui2_yde']
1709
 
 *                  }
1710
 
 *              }
1711
 
 *          }
1712
 
 *      }
1713
 
 *
1714
 
 * @property groups
1715
 
 * @type object
1716
 
 */
1717
 
 
1718
 
/**
1719
 
 * The loader 'path' attribute to the loader itself.  This is combined
1720
 
 * with the 'base' attribute to dynamically load the loader component
1721
 
 * when boostrapping with the get utility alone.
1722
 
 *
1723
 
 * @property loaderPath
1724
 
 * @type string
1725
 
 * @default loader/loader-min.js
1726
 
 */
1727
 
 
1728
 
/**
1729
 
 * Specifies whether or not YUI().use(...) will attempt to load CSS
1730
 
 * resources at all.  Any truthy value will cause CSS dependencies
1731
 
 * to load when fetching script.  The special value 'force' will
1732
 
 * cause CSS dependencies to be loaded even if no script is needed.
1733
 
 *
1734
 
 * @property fetchCSS
1735
 
 * @type boolean|string
1736
 
 * @default true
1737
 
 */
1738
 
 
1739
 
/**
1740
 
 * The default gallery version to build gallery module urls
1741
 
 * @property gallery
1742
 
 * @type string
1743
 
 * @since 3.1.0
1744
 
 */
1745
 
 
1746
 
/**
1747
 
 * The default YUI 2 version to build yui2 module urls.  This is for
1748
 
 * intrinsic YUI 2 support via the 2in3 project.  Also see the '2in3'
1749
 
 * config for pulling different revisions of the wrapped YUI 2
1750
 
 * modules.
1751
 
 * @since 3.1.0
1752
 
 * @property yui2
1753
 
 * @type string
1754
 
 * @default 2.9.0
1755
 
 */
1756
 
 
1757
 
/**
1758
 
 * The 2in3 project is a deployment of the various versions of YUI 2
1759
 
 * deployed as first-class YUI 3 modules.  Eventually, the wrapper
1760
 
 * for the modules will change (but the underlying YUI 2 code will
1761
 
 * be the same), and you can select a particular version of
1762
 
 * the wrapper modules via this config.
1763
 
 * @since 3.1.0
1764
 
 * @property 2in3
1765
 
 * @type string
1766
 
 * @default 4
1767
 
 */
1768
 
 
1769
 
/**
1770
 
 * Alternative console log function for use in environments without
1771
 
 * a supported native console.  The function is executed in the
1772
 
 * YUI instance context.
1773
 
 * @since 3.1.0
1774
 
 * @property logFn
1775
 
 * @type Function
1776
 
 */
1777
 
 
1778
 
/**
1779
 
 * A callback to execute when Y.error is called.  It receives the
1780
 
 * error message and an javascript error object if Y.error was
1781
 
 * executed because a javascript error was caught.  The function
1782
 
 * is executed in the YUI instance context. Returning `true` from this
1783
 
 * function will stop the Error from being thrown.
1784
 
 *
1785
 
 * @since 3.2.0
1786
 
 * @property errorFn
1787
 
 * @type Function
1788
 
 */
1789
 
 
1790
 
/**
1791
 
 * A callback to execute when the loader fails to load one or
1792
 
 * more resource.  This could be because of a script load
1793
 
 * failure.  It can also fail if a javascript module fails
1794
 
 * to register itself, but only when the 'requireRegistration'
1795
 
 * is true.  If this function is defined, the use() callback will
1796
 
 * only be called when the loader succeeds, otherwise it always
1797
 
 * executes unless there was a javascript error when attaching
1798
 
 * a module.
1799
 
 *
1800
 
 * @since 3.3.0
1801
 
 * @property loadErrorFn
1802
 
 * @type Function
1803
 
 */
1804
 
 
1805
 
/**
1806
 
 * When set to true, the YUI loader will expect that all modules
1807
 
 * it is responsible for loading will be first-class YUI modules
1808
 
 * that register themselves with the YUI global.  If this is
1809
 
 * set to true, loader will fail if the module registration fails
1810
 
 * to happen after the script is loaded.
1811
 
 *
1812
 
 * @since 3.3.0
1813
 
 * @property requireRegistration
1814
 
 * @type boolean
1815
 
 * @default false
1816
 
 */
1817
 
 
1818
 
/**
1819
 
 * Cache serviced use() requests.
1820
 
 * @since 3.3.0
1821
 
 * @property cacheUse
1822
 
 * @type boolean
1823
 
 * @default true
1824
 
 * @deprecated no longer used
1825
 
 */
1826
 
 
1827
 
/**
1828
 
 * Whether or not YUI should use native ES5 functionality when available for
1829
 
 * features like `Y.Array.each()`, `Y.Object()`, etc. When `false`, YUI will
1830
 
 * always use its own fallback implementations instead of relying on ES5
1831
 
 * functionality, even when it's available.
1832
 
 *
1833
 
 * @method useNativeES5
1834
 
 * @type Boolean
1835
 
 * @default true
1836
 
 * @since 3.5.0
1837
 
 */
1838
 
YUI.add('yui-base', function(Y) {
1839
 
 
1840
 
/*
1841
 
 * YUI stub
1842
 
 * @module yui
1843
 
 * @submodule yui-base
1844
 
 */
1845
 
/**
1846
 
 * The YUI module contains the components required for building the YUI
1847
 
 * seed file.  This includes the script loading mechanism, a simple queue,
1848
 
 * and the core utilities for the library.
1849
 
 * @module yui
1850
 
 * @submodule yui-base
1851
 
 */
1852
 
 
1853
 
/**
1854
 
 * Provides core language utilites and extensions used throughout YUI.
1855
 
 *
1856
 
 * @class Lang
1857
 
 * @static
1858
 
 */
1859
 
 
1860
 
var L = Y.Lang || (Y.Lang = {}),
1861
 
 
1862
 
STRING_PROTO = String.prototype,
1863
 
TOSTRING     = Object.prototype.toString,
1864
 
 
1865
 
TYPES = {
1866
 
    'undefined'        : 'undefined',
1867
 
    'number'           : 'number',
1868
 
    'boolean'          : 'boolean',
1869
 
    'string'           : 'string',
1870
 
    '[object Function]': 'function',
1871
 
    '[object RegExp]'  : 'regexp',
1872
 
    '[object Array]'   : 'array',
1873
 
    '[object Date]'    : 'date',
1874
 
    '[object Error]'   : 'error'
1875
 
},
1876
 
 
1877
 
SUBREGEX        = /\{\s*([^|}]+?)\s*(?:\|([^}]*))?\s*\}/g,
1878
 
TRIMREGEX       = /^\s+|\s+$/g,
1879
 
NATIVE_FN_REGEX = /\{\s*\[(?:native code|function)\]\s*\}/i;
1880
 
 
1881
 
// -- Protected Methods --------------------------------------------------------
1882
 
 
1883
 
/**
1884
 
Returns `true` if the given function appears to be implemented in native code,
1885
 
`false` otherwise. Will always return `false` -- even in ES5-capable browsers --
1886
 
if the `useNativeES5` YUI config option is set to `false`.
1887
 
 
1888
 
This isn't guaranteed to be 100% accurate and won't work for anything other than
1889
 
functions, but it can be useful for determining whether a function like
1890
 
`Array.prototype.forEach` is native or a JS shim provided by another library.
1891
 
 
1892
 
There's a great article by @kangax discussing certain flaws with this technique:
1893
 
<http://perfectionkills.com/detecting-built-in-host-methods/>
1894
 
 
1895
 
While his points are valid, it's still possible to benefit from this function
1896
 
as long as it's used carefully and sparingly, and in such a way that false
1897
 
negatives have minimal consequences. It's used internally to avoid using
1898
 
potentially broken non-native ES5 shims that have been added to the page by
1899
 
other libraries.
1900
 
 
1901
 
@method _isNative
1902
 
@param {Function} fn Function to test.
1903
 
@return {Boolean} `true` if _fn_ appears to be native, `false` otherwise.
1904
 
@static
1905
 
@protected
1906
 
@since 3.5.0
1907
 
**/
1908
 
L._isNative = function (fn) {
1909
 
    return !!(Y.config.useNativeES5 && fn && NATIVE_FN_REGEX.test(fn));
1910
 
};
1911
 
 
1912
 
// -- Public Methods -----------------------------------------------------------
1913
 
 
1914
 
/**
1915
 
 * Determines whether or not the provided item is an array.
1916
 
 *
1917
 
 * Returns `false` for array-like collections such as the function `arguments`
1918
 
 * collection or `HTMLElement` collections. Use `Y.Array.test()` if you want to
1919
 
 * test for an array-like collection.
1920
 
 *
1921
 
 * @method isArray
1922
 
 * @param o The object to test.
1923
 
 * @return {boolean} true if o is an array.
1924
 
 * @static
1925
 
 */
1926
 
L.isArray = L._isNative(Array.isArray) ? Array.isArray : function (o) {
1927
 
    return L.type(o) === 'array';
1928
 
};
1929
 
 
1930
 
/**
1931
 
 * Determines whether or not the provided item is a boolean.
1932
 
 * @method isBoolean
1933
 
 * @static
1934
 
 * @param o The object to test.
1935
 
 * @return {boolean} true if o is a boolean.
1936
 
 */
1937
 
L.isBoolean = function(o) {
1938
 
    return typeof o === 'boolean';
1939
 
};
1940
 
 
1941
 
/**
1942
 
 * Determines whether or not the supplied item is a date instance.
1943
 
 * @method isDate
1944
 
 * @static
1945
 
 * @param o The object to test.
1946
 
 * @return {boolean} true if o is a date.
1947
 
 */
1948
 
L.isDate = function(o) {
1949
 
    return L.type(o) === 'date' && o.toString() !== 'Invalid Date' && !isNaN(o);
1950
 
};
1951
 
 
1952
 
/**
1953
 
 * <p>
1954
 
 * Determines whether or not the provided item is a function.
1955
 
 * Note: Internet Explorer thinks certain functions are objects:
1956
 
 * </p>
1957
 
 *
1958
 
 * <pre>
1959
 
 * var obj = document.createElement("object");
1960
 
 * Y.Lang.isFunction(obj.getAttribute) // reports false in IE
1961
 
 * &nbsp;
1962
 
 * var input = document.createElement("input"); // append to body
1963
 
 * Y.Lang.isFunction(input.focus) // reports false in IE
1964
 
 * </pre>
1965
 
 *
1966
 
 * <p>
1967
 
 * You will have to implement additional tests if these functions
1968
 
 * matter to you.
1969
 
 * </p>
1970
 
 *
1971
 
 * @method isFunction
1972
 
 * @static
1973
 
 * @param o The object to test.
1974
 
 * @return {boolean} true if o is a function.
1975
 
 */
1976
 
L.isFunction = function(o) {
1977
 
    return L.type(o) === 'function';
1978
 
};
1979
 
 
1980
 
/**
1981
 
 * Determines whether or not the provided item is null.
1982
 
 * @method isNull
1983
 
 * @static
1984
 
 * @param o The object to test.
1985
 
 * @return {boolean} true if o is null.
1986
 
 */
1987
 
L.isNull = function(o) {
1988
 
    return o === null;
1989
 
};
1990
 
 
1991
 
/**
1992
 
 * Determines whether or not the provided item is a legal number.
1993
 
 * @method isNumber
1994
 
 * @static
1995
 
 * @param o The object to test.
1996
 
 * @return {boolean} true if o is a number.
1997
 
 */
1998
 
L.isNumber = function(o) {
1999
 
    return typeof o === 'number' && isFinite(o);
2000
 
};
2001
 
 
2002
 
/**
2003
 
 * Determines whether or not the provided item is of type object
2004
 
 * or function. Note that arrays are also objects, so
2005
 
 * <code>Y.Lang.isObject([]) === true</code>.
2006
 
 * @method isObject
2007
 
 * @static
2008
 
 * @param o The object to test.
2009
 
 * @param failfn {boolean} fail if the input is a function.
2010
 
 * @return {boolean} true if o is an object.
2011
 
 * @see isPlainObject
2012
 
 */
2013
 
L.isObject = function(o, failfn) {
2014
 
    var t = typeof o;
2015
 
    return (o && (t === 'object' ||
2016
 
        (!failfn && (t === 'function' || L.isFunction(o))))) || false;
2017
 
};
2018
 
 
2019
 
/**
2020
 
 * Determines whether or not the provided item is a string.
2021
 
 * @method isString
2022
 
 * @static
2023
 
 * @param o The object to test.
2024
 
 * @return {boolean} true if o is a string.
2025
 
 */
2026
 
L.isString = function(o) {
2027
 
    return typeof o === 'string';
2028
 
};
2029
 
 
2030
 
/**
2031
 
 * Determines whether or not the provided item is undefined.
2032
 
 * @method isUndefined
2033
 
 * @static
2034
 
 * @param o The object to test.
2035
 
 * @return {boolean} true if o is undefined.
2036
 
 */
2037
 
L.isUndefined = function(o) {
2038
 
    return typeof o === 'undefined';
2039
 
};
2040
 
 
2041
 
/**
2042
 
 * A convenience method for detecting a legitimate non-null value.
2043
 
 * Returns false for null/undefined/NaN, true for other values,
2044
 
 * including 0/false/''
2045
 
 * @method isValue
2046
 
 * @static
2047
 
 * @param o The item to test.
2048
 
 * @return {boolean} true if it is not null/undefined/NaN || false.
2049
 
 */
2050
 
L.isValue = function(o) {
2051
 
    var t = L.type(o);
2052
 
 
2053
 
    switch (t) {
2054
 
        case 'number':
2055
 
            return isFinite(o);
2056
 
 
2057
 
        case 'null': // fallthru
2058
 
        case 'undefined':
2059
 
            return false;
2060
 
 
2061
 
        default:
2062
 
            return !!t;
2063
 
    }
2064
 
};
2065
 
 
2066
 
/**
2067
 
 * Returns the current time in milliseconds.
2068
 
 *
2069
 
 * @method now
2070
 
 * @return {Number} Current time in milliseconds.
2071
 
 * @static
2072
 
 * @since 3.3.0
2073
 
 */
2074
 
L.now = Date.now || function () {
2075
 
    return new Date().getTime();
2076
 
};
2077
 
 
2078
 
/**
2079
 
 * Lightweight version of <code>Y.substitute</code>. Uses the same template
2080
 
 * structure as <code>Y.substitute</code>, but doesn't support recursion,
2081
 
 * auto-object coersion, or formats.
2082
 
 * @method sub
2083
 
 * @param {string} s String to be modified.
2084
 
 * @param {object} o Object containing replacement values.
2085
 
 * @return {string} the substitute result.
2086
 
 * @static
2087
 
 * @since 3.2.0
2088
 
 */
2089
 
L.sub = function(s, o) {
2090
 
    return s.replace ? s.replace(SUBREGEX, function (match, key) {
2091
 
        return L.isUndefined(o[key]) ? match : o[key];
2092
 
    }) : s;
2093
 
};
2094
 
 
2095
 
/**
2096
 
 * Returns a string without any leading or trailing whitespace.  If
2097
 
 * the input is not a string, the input will be returned untouched.
2098
 
 * @method trim
2099
 
 * @static
2100
 
 * @param s {string} the string to trim.
2101
 
 * @return {string} the trimmed string.
2102
 
 */
2103
 
L.trim = STRING_PROTO.trim ? function(s) {
2104
 
    return s && s.trim ? s.trim() : s;
2105
 
} : function (s) {
2106
 
    try {
2107
 
        return s.replace(TRIMREGEX, '');
2108
 
    } catch (e) {
2109
 
        return s;
2110
 
    }
2111
 
};
2112
 
 
2113
 
/**
2114
 
 * Returns a string without any leading whitespace.
2115
 
 * @method trimLeft
2116
 
 * @static
2117
 
 * @param s {string} the string to trim.
2118
 
 * @return {string} the trimmed string.
2119
 
 */
2120
 
L.trimLeft = STRING_PROTO.trimLeft ? function (s) {
2121
 
    return s.trimLeft();
2122
 
} : function (s) {
2123
 
    return s.replace(/^\s+/, '');
2124
 
};
2125
 
 
2126
 
/**
2127
 
 * Returns a string without any trailing whitespace.
2128
 
 * @method trimRight
2129
 
 * @static
2130
 
 * @param s {string} the string to trim.
2131
 
 * @return {string} the trimmed string.
2132
 
 */
2133
 
L.trimRight = STRING_PROTO.trimRight ? function (s) {
2134
 
    return s.trimRight();
2135
 
} : function (s) {
2136
 
    return s.replace(/\s+$/, '');
2137
 
};
2138
 
 
2139
 
/**
2140
 
Returns one of the following strings, representing the type of the item passed
2141
 
in:
2142
 
 
2143
 
 * "array"
2144
 
 * "boolean"
2145
 
 * "date"
2146
 
 * "error"
2147
 
 * "function"
2148
 
 * "null"
2149
 
 * "number"
2150
 
 * "object"
2151
 
 * "regexp"
2152
 
 * "string"
2153
 
 * "undefined"
2154
 
 
2155
 
Known issues:
2156
 
 
2157
 
 * `typeof HTMLElementCollection` returns function in Safari, but
2158
 
    `Y.Lang.type()` reports "object", which could be a good thing --
2159
 
    but it actually caused the logic in <code>Y.Lang.isObject</code> to fail.
2160
 
 
2161
 
@method type
2162
 
@param o the item to test.
2163
 
@return {string} the detected type.
2164
 
@static
2165
 
**/
2166
 
L.type = function(o) {
2167
 
    return TYPES[typeof o] || TYPES[TOSTRING.call(o)] || (o ? 'object' : 'null');
2168
 
};
2169
 
/**
2170
 
@module yui
2171
 
@submodule yui-base
2172
 
*/
2173
 
 
2174
 
var Lang   = Y.Lang,
2175
 
    Native = Array.prototype,
2176
 
 
2177
 
    hasOwn = Object.prototype.hasOwnProperty;
2178
 
 
2179
 
/**
2180
 
Provides utility methods for working with arrays. Additional array helpers can
2181
 
be found in the `collection` and `array-extras` modules.
2182
 
 
2183
 
`Y.Array(thing)` returns a native array created from _thing_. Depending on
2184
 
_thing_'s type, one of the following will happen:
2185
 
 
2186
 
  * Arrays are returned unmodified unless a non-zero _startIndex_ is
2187
 
    specified.
2188
 
  * Array-like collections (see `Array.test()`) are converted to arrays.
2189
 
  * For everything else, a new array is created with _thing_ as the sole
2190
 
    item.
2191
 
 
2192
 
Note: elements that are also collections, such as `<form>` and `<select>`
2193
 
elements, are not automatically converted to arrays. To force a conversion,
2194
 
pass `true` as the value of the _force_ parameter.
2195
 
 
2196
 
@class Array
2197
 
@constructor
2198
 
@param {Any} thing The thing to arrayify.
2199
 
@param {Number} [startIndex=0] If non-zero and _thing_ is an array or array-like
2200
 
  collection, a subset of items starting at the specified index will be
2201
 
  returned.
2202
 
@param {Boolean} [force=false] If `true`, _thing_ will be treated as an
2203
 
  array-like collection no matter what.
2204
 
@return {Array} A native array created from _thing_, according to the rules
2205
 
  described above.
2206
 
**/
2207
 
function YArray(thing, startIndex, force) {
2208
 
    var len, result;
2209
 
 
2210
 
    startIndex || (startIndex = 0);
2211
 
 
2212
 
    if (force || YArray.test(thing)) {
2213
 
        // IE throws when trying to slice HTMLElement collections.
2214
 
        try {
2215
 
            return Native.slice.call(thing, startIndex);
2216
 
        } catch (ex) {
2217
 
            result = [];
2218
 
 
2219
 
            for (len = thing.length; startIndex < len; ++startIndex) {
2220
 
                result.push(thing[startIndex]);
2221
 
            }
2222
 
 
2223
 
            return result;
2224
 
        }
2225
 
    }
2226
 
 
2227
 
    return [thing];
2228
 
}
2229
 
 
2230
 
Y.Array = YArray;
2231
 
 
2232
 
/**
2233
 
Dedupes an array of strings, returning an array that's guaranteed to contain
2234
 
only one copy of a given string.
2235
 
 
2236
 
This method differs from `Array.unique()` in that it's optimized for use only
2237
 
with strings, whereas `unique` may be used with other types (but is slower).
2238
 
Using `dedupe()` with non-string values may result in unexpected behavior.
2239
 
 
2240
 
@method dedupe
2241
 
@param {String[]} array Array of strings to dedupe.
2242
 
@return {Array} Deduped copy of _array_.
2243
 
@static
2244
 
@since 3.4.0
2245
 
**/
2246
 
YArray.dedupe = function (array) {
2247
 
    var hash    = {},
2248
 
        results = [],
2249
 
        i, item, len;
2250
 
 
2251
 
    for (i = 0, len = array.length; i < len; ++i) {
2252
 
        item = array[i];
2253
 
 
2254
 
        if (!hasOwn.call(hash, item)) {
2255
 
            hash[item] = 1;
2256
 
            results.push(item);
2257
 
        }
2258
 
    }
2259
 
 
2260
 
    return results;
2261
 
};
2262
 
 
2263
 
/**
2264
 
Executes the supplied function on each item in the array. This method wraps
2265
 
the native ES5 `Array.forEach()` method if available.
2266
 
 
2267
 
@method each
2268
 
@param {Array} array Array to iterate.
2269
 
@param {Function} fn Function to execute on each item in the array. The function
2270
 
  will receive the following arguments:
2271
 
    @param {Any} fn.item Current array item.
2272
 
    @param {Number} fn.index Current array index.
2273
 
    @param {Array} fn.array Array being iterated.
2274
 
@param {Object} [thisObj] `this` object to use when calling _fn_.
2275
 
@return {YUI} The YUI instance.
2276
 
@static
2277
 
**/
2278
 
YArray.each = YArray.forEach = Lang._isNative(Native.forEach) ? function (array, fn, thisObj) {
2279
 
    Native.forEach.call(array || [], fn, thisObj || Y);
2280
 
    return Y;
2281
 
} : function (array, fn, thisObj) {
2282
 
    for (var i = 0, len = (array && array.length) || 0; i < len; ++i) {
2283
 
        if (i in array) {
2284
 
            fn.call(thisObj || Y, array[i], i, array);
2285
 
        }
2286
 
    }
2287
 
 
2288
 
    return Y;
2289
 
};
2290
 
 
2291
 
/**
2292
 
Alias for `each()`.
2293
 
 
2294
 
@method forEach
2295
 
@static
2296
 
**/
2297
 
 
2298
 
/**
2299
 
Returns an object using the first array as keys and the second as values. If
2300
 
the second array is not provided, or if it doesn't contain the same number of
2301
 
values as the first array, then `true` will be used in place of the missing
2302
 
values.
2303
 
 
2304
 
@example
2305
 
 
2306
 
    Y.Array.hash(['a', 'b', 'c'], ['foo', 'bar']);
2307
 
    // => {a: 'foo', b: 'bar', c: true}
2308
 
 
2309
 
@method hash
2310
 
@param {String[]} keys Array of strings to use as keys.
2311
 
@param {Array} [values] Array to use as values.
2312
 
@return {Object} Hash using the first array as keys and the second as values.
2313
 
@static
2314
 
**/
2315
 
YArray.hash = function (keys, values) {
2316
 
    var hash = {},
2317
 
        vlen = (values && values.length) || 0,
2318
 
        i, len;
2319
 
 
2320
 
    for (i = 0, len = keys.length; i < len; ++i) {
2321
 
        if (i in keys) {
2322
 
            hash[keys[i]] = vlen > i && i in values ? values[i] : true;
2323
 
        }
2324
 
    }
2325
 
 
2326
 
    return hash;
2327
 
};
2328
 
 
2329
 
/**
2330
 
Returns the index of the first item in the array that's equal (using a strict
2331
 
equality check) to the specified _value_, or `-1` if the value isn't found.
2332
 
 
2333
 
This method wraps the native ES5 `Array.indexOf()` method if available.
2334
 
 
2335
 
@method indexOf
2336
 
@param {Array} array Array to search.
2337
 
@param {Any} value Value to search for.
2338
 
@param {Number} [from=0] The index at which to begin the search.
2339
 
@return {Number} Index of the item strictly equal to _value_, or `-1` if not
2340
 
    found.
2341
 
@static
2342
 
**/
2343
 
YArray.indexOf = Lang._isNative(Native.indexOf) ? function (array, value, from) {
2344
 
    return Native.indexOf.call(array, value, from);
2345
 
} : function (array, value, from) {
2346
 
    // http://es5.github.com/#x15.4.4.14
2347
 
    var len = array.length;
2348
 
 
2349
 
    from = +from || 0;
2350
 
    from = (from > 0 || -1) * Math.floor(Math.abs(from));
2351
 
 
2352
 
    if (from < 0) {
2353
 
        from += len;
2354
 
 
2355
 
        if (from < 0) {
2356
 
            from = 0;
2357
 
        }
2358
 
    }
2359
 
 
2360
 
    for (; from < len; ++from) {
2361
 
        if (from in array && array[from] === value) {
2362
 
            return from;
2363
 
        }
2364
 
    }
2365
 
 
2366
 
    return -1;
2367
 
};
2368
 
 
2369
 
/**
2370
 
Numeric sort convenience function.
2371
 
 
2372
 
The native `Array.prototype.sort()` function converts values to strings and
2373
 
sorts them in lexicographic order, which is unsuitable for sorting numeric
2374
 
values. Provide `Array.numericSort` as a custom sort function when you want
2375
 
to sort values in numeric order.
2376
 
 
2377
 
@example
2378
 
 
2379
 
    [42, 23, 8, 16, 4, 15].sort(Y.Array.numericSort);
2380
 
    // => [4, 8, 15, 16, 23, 42]
2381
 
 
2382
 
@method numericSort
2383
 
@param {Number} a First value to compare.
2384
 
@param {Number} b Second value to compare.
2385
 
@return {Number} Difference between _a_ and _b_.
2386
 
@static
2387
 
**/
2388
 
YArray.numericSort = function (a, b) {
2389
 
    return a - b;
2390
 
};
2391
 
 
2392
 
/**
2393
 
Executes the supplied function on each item in the array. Returning a truthy
2394
 
value from the function will stop the processing of remaining items.
2395
 
 
2396
 
@method some
2397
 
@param {Array} array Array to iterate over.
2398
 
@param {Function} fn Function to execute on each item. The function will receive
2399
 
  the following arguments:
2400
 
    @param {Any} fn.value Current array item.
2401
 
    @param {Number} fn.index Current array index.
2402
 
    @param {Array} fn.array Array being iterated over.
2403
 
@param {Object} [thisObj] `this` object to use when calling _fn_.
2404
 
@return {Boolean} `true` if the function returns a truthy value on any of the
2405
 
  items in the array; `false` otherwise.
2406
 
@static
2407
 
**/
2408
 
YArray.some = Lang._isNative(Native.some) ? function (array, fn, thisObj) {
2409
 
    return Native.some.call(array, fn, thisObj);
2410
 
} : function (array, fn, thisObj) {
2411
 
    for (var i = 0, len = array.length; i < len; ++i) {
2412
 
        if (i in array && fn.call(thisObj, array[i], i, array)) {
2413
 
            return true;
2414
 
        }
2415
 
    }
2416
 
 
2417
 
    return false;
2418
 
};
2419
 
 
2420
 
/**
2421
 
Evaluates _obj_ to determine if it's an array, an array-like collection, or
2422
 
something else. This is useful when working with the function `arguments`
2423
 
collection and `HTMLElement` collections.
2424
 
 
2425
 
Note: This implementation doesn't consider elements that are also
2426
 
collections, such as `<form>` and `<select>`, to be array-like.
2427
 
 
2428
 
@method test
2429
 
@param {Object} obj Object to test.
2430
 
@return {Number} A number indicating the results of the test:
2431
 
 
2432
 
  * 0: Neither an array nor an array-like collection.
2433
 
  * 1: Real array.
2434
 
  * 2: Array-like collection.
2435
 
 
2436
 
@static
2437
 
**/
2438
 
YArray.test = function (obj) {
2439
 
    var result = 0;
2440
 
 
2441
 
    if (Lang.isArray(obj)) {
2442
 
        result = 1;
2443
 
    } else if (Lang.isObject(obj)) {
2444
 
        try {
2445
 
            // indexed, but no tagName (element) or alert (window),
2446
 
            // or functions without apply/call (Safari
2447
 
            // HTMLElementCollection bug).
2448
 
            if ('length' in obj && !obj.tagName && !obj.alert && !obj.apply) {
2449
 
                result = 2;
2450
 
            }
2451
 
        } catch (ex) {}
2452
 
    }
2453
 
 
2454
 
    return result;
2455
 
};
2456
 
/**
2457
 
 * The YUI module contains the components required for building the YUI
2458
 
 * seed file.  This includes the script loading mechanism, a simple queue,
2459
 
 * and the core utilities for the library.
2460
 
 * @module yui
2461
 
 * @submodule yui-base
2462
 
 */
2463
 
 
2464
 
/**
2465
 
 * A simple FIFO queue.  Items are added to the Queue with add(1..n items) and
2466
 
 * removed using next().
2467
 
 *
2468
 
 * @class Queue
2469
 
 * @constructor
2470
 
 * @param {MIXED} item* 0..n items to seed the queue.
2471
 
 */
2472
 
function Queue() {
2473
 
    this._init();
2474
 
    this.add.apply(this, arguments);
2475
 
}
2476
 
 
2477
 
Queue.prototype = {
2478
 
    /**
2479
 
     * Initialize the queue
2480
 
     *
2481
 
     * @method _init
2482
 
     * @protected
2483
 
     */
2484
 
    _init: function() {
2485
 
        /**
2486
 
         * The collection of enqueued items
2487
 
         *
2488
 
         * @property _q
2489
 
         * @type Array
2490
 
         * @protected
2491
 
         */
2492
 
        this._q = [];
2493
 
    },
2494
 
 
2495
 
    /**
2496
 
     * Get the next item in the queue. FIFO support
2497
 
     *
2498
 
     * @method next
2499
 
     * @return {MIXED} the next item in the queue.
2500
 
     */
2501
 
    next: function() {
2502
 
        return this._q.shift();
2503
 
    },
2504
 
 
2505
 
    /**
2506
 
     * Get the last in the queue. LIFO support.
2507
 
     *
2508
 
     * @method last
2509
 
     * @return {MIXED} the last item in the queue.
2510
 
     */
2511
 
    last: function() {
2512
 
        return this._q.pop();
2513
 
    },
2514
 
 
2515
 
    /**
2516
 
     * Add 0..n items to the end of the queue.
2517
 
     *
2518
 
     * @method add
2519
 
     * @param {MIXED} item* 0..n items.
2520
 
     * @return {object} this queue.
2521
 
     */
2522
 
    add: function() {
2523
 
        this._q.push.apply(this._q, arguments);
2524
 
 
2525
 
        return this;
2526
 
    },
2527
 
 
2528
 
    /**
2529
 
     * Returns the current number of queued items.
2530
 
     *
2531
 
     * @method size
2532
 
     * @return {Number} The size.
2533
 
     */
2534
 
    size: function() {
2535
 
        return this._q.length;
2536
 
    }
2537
 
};
2538
 
 
2539
 
Y.Queue = Queue;
2540
 
 
2541
 
YUI.Env._loaderQueue = YUI.Env._loaderQueue || new Queue();
2542
 
 
2543
 
/**
2544
 
The YUI module contains the components required for building the YUI seed file.
2545
 
This includes the script loading mechanism, a simple queue, and the core
2546
 
utilities for the library.
2547
 
 
2548
 
@module yui
2549
 
@submodule yui-base
2550
 
**/
2551
 
 
2552
 
var CACHED_DELIMITER = '__',
2553
 
 
2554
 
    hasOwn   = Object.prototype.hasOwnProperty,
2555
 
    isObject = Y.Lang.isObject;
2556
 
 
2557
 
/**
2558
 
Returns a wrapper for a function which caches the return value of that function,
2559
 
keyed off of the combined string representation of the argument values provided
2560
 
when the wrapper is called.
2561
 
 
2562
 
Calling this function again with the same arguments will return the cached value
2563
 
rather than executing the wrapped function.
2564
 
 
2565
 
Note that since the cache is keyed off of the string representation of arguments
2566
 
passed to the wrapper function, arguments that aren't strings and don't provide
2567
 
a meaningful `toString()` method may result in unexpected caching behavior. For
2568
 
example, the objects `{}` and `{foo: 'bar'}` would both be converted to the
2569
 
string `[object Object]` when used as a cache key.
2570
 
 
2571
 
@method cached
2572
 
@param {Function} source The function to memoize.
2573
 
@param {Object} [cache={}] Object in which to store cached values. You may seed
2574
 
  this object with pre-existing cached values if desired.
2575
 
@param {any} [refetch] If supplied, this value is compared with the cached value
2576
 
  using a `==` comparison. If the values are equal, the wrapped function is
2577
 
  executed again even though a cached value exists.
2578
 
@return {Function} Wrapped function.
2579
 
@for YUI
2580
 
**/
2581
 
Y.cached = function (source, cache, refetch) {
2582
 
    cache || (cache = {});
2583
 
 
2584
 
    return function (arg) {
2585
 
        var key = arguments.length > 1 ?
2586
 
                Array.prototype.join.call(arguments, CACHED_DELIMITER) :
2587
 
                String(arg);
2588
 
 
2589
 
        if (!(key in cache) || (refetch && cache[key] == refetch)) {
2590
 
            cache[key] = source.apply(source, arguments);
2591
 
        }
2592
 
 
2593
 
        return cache[key];
2594
 
    };
2595
 
};
2596
 
 
2597
 
/**
2598
 
Returns the `location` object from the window/frame in which this YUI instance
2599
 
operates, or `undefined` when executing in a non-browser environment
2600
 
(e.g. Node.js).
2601
 
 
2602
 
It is _not_ recommended to hold references to the `window.location` object
2603
 
outside of the scope of a function in which its properties are being accessed or
2604
 
its methods are being called. This is because of a nasty bug/issue that exists
2605
 
in both Safari and MobileSafari browsers:
2606
 
[WebKit Bug 34679](https://bugs.webkit.org/show_bug.cgi?id=34679).
2607
 
 
2608
 
@method getLocation
2609
 
@return {location} The `location` object from the window/frame in which this YUI
2610
 
    instance operates.
2611
 
@since 3.5.0
2612
 
**/
2613
 
Y.getLocation = function () {
2614
 
    // It is safer to look this up every time because yui-base is attached to a
2615
 
    // YUI instance before a user's config is applied; i.e. `Y.config.win` does
2616
 
    // not point the correct window object when this file is loaded.
2617
 
    var win = Y.config.win;
2618
 
 
2619
 
    // It is not safe to hold a reference to the `location` object outside the
2620
 
    // scope in which it is being used. The WebKit engine used in Safari and
2621
 
    // MobileSafari will "disconnect" the `location` object from the `window`
2622
 
    // when a page is restored from back/forward history cache.
2623
 
    return win && win.location;
2624
 
};
2625
 
 
2626
 
/**
2627
 
Returns a new object containing all of the properties of all the supplied
2628
 
objects. The properties from later objects will overwrite those in earlier
2629
 
objects.
2630
 
 
2631
 
Passing in a single object will create a shallow copy of it. For a deep copy,
2632
 
use `clone()`.
2633
 
 
2634
 
@method merge
2635
 
@param {Object} objects* One or more objects to merge.
2636
 
@return {Object} A new merged object.
2637
 
**/
2638
 
Y.merge = function () {
2639
 
    var args   = arguments,
2640
 
        i      = 0,
2641
 
        len    = args.length,
2642
 
        result = {};
2643
 
 
2644
 
    for (; i < len; ++i) {
2645
 
        Y.mix(result, args[i], true);
2646
 
    }
2647
 
 
2648
 
    return result;
2649
 
};
2650
 
 
2651
 
/**
2652
 
Mixes _supplier_'s properties into _receiver_.
2653
 
 
2654
 
Properties on _receiver_ or _receiver_'s prototype will not be overwritten or
2655
 
shadowed unless the _overwrite_ parameter is `true`, and will not be merged
2656
 
unless the _merge_ parameter is `true`.
2657
 
 
2658
 
In the default mode (0), only properties the supplier owns are copied (prototype
2659
 
properties are not copied). The following copying modes are available:
2660
 
 
2661
 
  * `0`: _Default_. Object to object.
2662
 
  * `1`: Prototype to prototype.
2663
 
  * `2`: Prototype to prototype and object to object.
2664
 
  * `3`: Prototype to object.
2665
 
  * `4`: Object to prototype.
2666
 
 
2667
 
@method mix
2668
 
@param {Function|Object} receiver The object or function to receive the mixed
2669
 
  properties.
2670
 
@param {Function|Object} supplier The object or function supplying the
2671
 
  properties to be mixed.
2672
 
@param {Boolean} [overwrite=false] If `true`, properties that already exist
2673
 
  on the receiver will be overwritten with properties from the supplier.
2674
 
@param {String[]} [whitelist] An array of property names to copy. If
2675
 
  specified, only the whitelisted properties will be copied, and all others
2676
 
  will be ignored.
2677
 
@param {Number} [mode=0] Mix mode to use. See above for available modes.
2678
 
@param {Boolean} [merge=false] If `true`, objects and arrays that already
2679
 
  exist on the receiver will have the corresponding object/array from the
2680
 
  supplier merged into them, rather than being skipped or overwritten. When
2681
 
  both _overwrite_ and _merge_ are `true`, _merge_ takes precedence.
2682
 
@return {Function|Object|YUI} The receiver, or the YUI instance if the
2683
 
  specified receiver is falsy.
2684
 
**/
2685
 
Y.mix = function(receiver, supplier, overwrite, whitelist, mode, merge) {
2686
 
    var alwaysOverwrite, exists, from, i, key, len, to;
2687
 
 
2688
 
    // If no supplier is given, we return the receiver. If no receiver is given,
2689
 
    // we return Y. Returning Y doesn't make much sense to me, but it's
2690
 
    // grandfathered in for backcompat reasons.
2691
 
    if (!receiver || !supplier) {
2692
 
        return receiver || Y;
2693
 
    }
2694
 
 
2695
 
    if (mode) {
2696
 
        // In mode 2 (prototype to prototype and object to object), we recurse
2697
 
        // once to do the proto to proto mix. The object to object mix will be
2698
 
        // handled later on.
2699
 
        if (mode === 2) {
2700
 
            Y.mix(receiver.prototype, supplier.prototype, overwrite,
2701
 
                    whitelist, 0, merge);
2702
 
        }
2703
 
 
2704
 
        // Depending on which mode is specified, we may be copying from or to
2705
 
        // the prototypes of the supplier and receiver.
2706
 
        from = mode === 1 || mode === 3 ? supplier.prototype : supplier;
2707
 
        to   = mode === 1 || mode === 4 ? receiver.prototype : receiver;
2708
 
 
2709
 
        // If either the supplier or receiver doesn't actually have a
2710
 
        // prototype property, then we could end up with an undefined `from`
2711
 
        // or `to`. If that happens, we abort and return the receiver.
2712
 
        if (!from || !to) {
2713
 
            return receiver;
2714
 
        }
2715
 
    } else {
2716
 
        from = supplier;
2717
 
        to   = receiver;
2718
 
    }
2719
 
 
2720
 
    // If `overwrite` is truthy and `merge` is falsy, then we can skip a
2721
 
    // property existence check on each iteration and save some time.
2722
 
    alwaysOverwrite = overwrite && !merge;
2723
 
 
2724
 
    if (whitelist) {
2725
 
        for (i = 0, len = whitelist.length; i < len; ++i) {
2726
 
            key = whitelist[i];
2727
 
 
2728
 
            // We call `Object.prototype.hasOwnProperty` instead of calling
2729
 
            // `hasOwnProperty` on the object itself, since the object's
2730
 
            // `hasOwnProperty` method may have been overridden or removed.
2731
 
            // Also, some native objects don't implement a `hasOwnProperty`
2732
 
            // method.
2733
 
            if (!hasOwn.call(from, key)) {
2734
 
                continue;
2735
 
            }
2736
 
 
2737
 
            // The `key in to` check here is (sadly) intentional for backwards
2738
 
            // compatibility reasons. It prevents undesired shadowing of
2739
 
            // prototype members on `to`.
2740
 
            exists = alwaysOverwrite ? false : key in to;
2741
 
 
2742
 
            if (merge && exists && isObject(to[key], true)
2743
 
                    && isObject(from[key], true)) {
2744
 
                // If we're in merge mode, and the key is present on both
2745
 
                // objects, and the value on both objects is either an object or
2746
 
                // an array (but not a function), then we recurse to merge the
2747
 
                // `from` value into the `to` value instead of overwriting it.
2748
 
                //
2749
 
                // Note: It's intentional that the whitelist isn't passed to the
2750
 
                // recursive call here. This is legacy behavior that lots of
2751
 
                // code still depends on.
2752
 
                Y.mix(to[key], from[key], overwrite, null, 0, merge);
2753
 
            } else if (overwrite || !exists) {
2754
 
                // We're not in merge mode, so we'll only copy the `from` value
2755
 
                // to the `to` value if we're in overwrite mode or if the
2756
 
                // current key doesn't exist on the `to` object.
2757
 
                to[key] = from[key];
2758
 
            }
2759
 
        }
2760
 
    } else {
2761
 
        for (key in from) {
2762
 
            // The code duplication here is for runtime performance reasons.
2763
 
            // Combining whitelist and non-whitelist operations into a single
2764
 
            // loop or breaking the shared logic out into a function both result
2765
 
            // in worse performance, and Y.mix is critical enough that the byte
2766
 
            // tradeoff is worth it.
2767
 
            if (!hasOwn.call(from, key)) {
2768
 
                continue;
2769
 
            }
2770
 
 
2771
 
            // The `key in to` check here is (sadly) intentional for backwards
2772
 
            // compatibility reasons. It prevents undesired shadowing of
2773
 
            // prototype members on `to`.
2774
 
            exists = alwaysOverwrite ? false : key in to;
2775
 
 
2776
 
            if (merge && exists && isObject(to[key], true)
2777
 
                    && isObject(from[key], true)) {
2778
 
                Y.mix(to[key], from[key], overwrite, null, 0, merge);
2779
 
            } else if (overwrite || !exists) {
2780
 
                to[key] = from[key];
2781
 
            }
2782
 
        }
2783
 
 
2784
 
        // If this is an IE browser with the JScript enumeration bug, force
2785
 
        // enumeration of the buggy properties by making a recursive call with
2786
 
        // the buggy properties as the whitelist.
2787
 
        if (Y.Object._hasEnumBug) {
2788
 
            Y.mix(to, from, overwrite, Y.Object._forceEnum, mode, merge);
2789
 
        }
2790
 
    }
2791
 
 
2792
 
    return receiver;
2793
 
};
2794
 
/**
2795
 
 * The YUI module contains the components required for building the YUI
2796
 
 * seed file.  This includes the script loading mechanism, a simple queue,
2797
 
 * and the core utilities for the library.
2798
 
 * @module yui
2799
 
 * @submodule yui-base
2800
 
 */
2801
 
 
2802
 
/**
2803
 
 * Adds utilities to the YUI instance for working with objects.
2804
 
 *
2805
 
 * @class Object
2806
 
 */
2807
 
 
2808
 
var Lang   = Y.Lang,
2809
 
    hasOwn = Object.prototype.hasOwnProperty,
2810
 
 
2811
 
    UNDEFINED, // <-- Note the comma. We're still declaring vars.
2812
 
 
2813
 
/**
2814
 
 * Returns a new object that uses _obj_ as its prototype. This method wraps the
2815
 
 * native ES5 `Object.create()` method if available, but doesn't currently
2816
 
 * pass through `Object.create()`'s second argument (properties) in order to
2817
 
 * ensure compatibility with older browsers.
2818
 
 *
2819
 
 * @method ()
2820
 
 * @param {Object} obj Prototype object.
2821
 
 * @return {Object} New object using _obj_ as its prototype.
2822
 
 * @static
2823
 
 */
2824
 
O = Y.Object = Lang._isNative(Object.create) ? function (obj) {
2825
 
    // We currently wrap the native Object.create instead of simply aliasing it
2826
 
    // to ensure consistency with our fallback shim, which currently doesn't
2827
 
    // support Object.create()'s second argument (properties). Once we have a
2828
 
    // safe fallback for the properties arg, we can stop wrapping
2829
 
    // Object.create().
2830
 
    return Object.create(obj);
2831
 
} : (function () {
2832
 
    // Reusable constructor function for the Object.create() shim.
2833
 
    function F() {}
2834
 
 
2835
 
    // The actual shim.
2836
 
    return function (obj) {
2837
 
        F.prototype = obj;
2838
 
        return new F();
2839
 
    };
2840
 
}()),
2841
 
 
2842
 
/**
2843
 
 * Property names that IE doesn't enumerate in for..in loops, even when they
2844
 
 * should be enumerable. When `_hasEnumBug` is `true`, it's necessary to
2845
 
 * manually enumerate these properties.
2846
 
 *
2847
 
 * @property _forceEnum
2848
 
 * @type String[]
2849
 
 * @protected
2850
 
 * @static
2851
 
 */
2852
 
forceEnum = O._forceEnum = [
2853
 
    'hasOwnProperty',
2854
 
    'isPrototypeOf',
2855
 
    'propertyIsEnumerable',
2856
 
    'toString',
2857
 
    'toLocaleString',
2858
 
    'valueOf'
2859
 
],
2860
 
 
2861
 
/**
2862
 
 * `true` if this browser has the JScript enumeration bug that prevents
2863
 
 * enumeration of the properties named in the `_forceEnum` array, `false`
2864
 
 * otherwise.
2865
 
 *
2866
 
 * See:
2867
 
 *   - <https://developer.mozilla.org/en/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug>
2868
 
 *   - <http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation>
2869
 
 *
2870
 
 * @property _hasEnumBug
2871
 
 * @type Boolean
2872
 
 * @protected
2873
 
 * @static
2874
 
 */
2875
 
hasEnumBug = O._hasEnumBug = !{valueOf: 0}.propertyIsEnumerable('valueOf'),
2876
 
 
2877
 
/**
2878
 
 * `true` if this browser incorrectly considers the `prototype` property of
2879
 
 * functions to be enumerable. Currently known to affect Opera 11.50.
2880
 
 *
2881
 
 * @property _hasProtoEnumBug
2882
 
 * @type Boolean
2883
 
 * @protected
2884
 
 * @static
2885
 
 */
2886
 
hasProtoEnumBug = O._hasProtoEnumBug = (function () {}).propertyIsEnumerable('prototype'),
2887
 
 
2888
 
/**
2889
 
 * Returns `true` if _key_ exists on _obj_, `false` if _key_ doesn't exist or
2890
 
 * exists only on _obj_'s prototype. This is essentially a safer version of
2891
 
 * `obj.hasOwnProperty()`.
2892
 
 *
2893
 
 * @method owns
2894
 
 * @param {Object} obj Object to test.
2895
 
 * @param {String} key Property name to look for.
2896
 
 * @return {Boolean} `true` if _key_ exists on _obj_, `false` otherwise.
2897
 
 * @static
2898
 
 */
2899
 
owns = O.owns = function (obj, key) {
2900
 
    return !!obj && hasOwn.call(obj, key);
2901
 
}; // <-- End of var declarations.
2902
 
 
2903
 
/**
2904
 
 * Alias for `owns()`.
2905
 
 *
2906
 
 * @method hasKey
2907
 
 * @param {Object} obj Object to test.
2908
 
 * @param {String} key Property name to look for.
2909
 
 * @return {Boolean} `true` if _key_ exists on _obj_, `false` otherwise.
2910
 
 * @static
2911
 
 */
2912
 
O.hasKey = owns;
2913
 
 
2914
 
/**
2915
 
 * Returns an array containing the object's enumerable keys. Does not include
2916
 
 * prototype keys or non-enumerable keys.
2917
 
 *
2918
 
 * Note that keys are returned in enumeration order (that is, in the same order
2919
 
 * that they would be enumerated by a `for-in` loop), which may not be the same
2920
 
 * as the order in which they were defined.
2921
 
 *
2922
 
 * This method is an alias for the native ES5 `Object.keys()` method if
2923
 
 * available.
2924
 
 *
2925
 
 * @example
2926
 
 *
2927
 
 *     Y.Object.keys({a: 'foo', b: 'bar', c: 'baz'});
2928
 
 *     // => ['a', 'b', 'c']
2929
 
 *
2930
 
 * @method keys
2931
 
 * @param {Object} obj An object.
2932
 
 * @return {String[]} Array of keys.
2933
 
 * @static
2934
 
 */
2935
 
O.keys = Lang._isNative(Object.keys) ? Object.keys : function (obj) {
2936
 
    if (!Lang.isObject(obj)) {
2937
 
        throw new TypeError('Object.keys called on a non-object');
2938
 
    }
2939
 
 
2940
 
    var keys = [],
2941
 
        i, key, len;
2942
 
 
2943
 
    if (hasProtoEnumBug && typeof obj === 'function') {
2944
 
        for (key in obj) {
2945
 
            if (owns(obj, key) && key !== 'prototype') {
2946
 
                keys.push(key);
2947
 
            }
2948
 
        }
2949
 
    } else {
2950
 
        for (key in obj) {
2951
 
            if (owns(obj, key)) {
2952
 
                keys.push(key);
2953
 
            }
2954
 
        }
2955
 
    }
2956
 
 
2957
 
    if (hasEnumBug) {
2958
 
        for (i = 0, len = forceEnum.length; i < len; ++i) {
2959
 
            key = forceEnum[i];
2960
 
 
2961
 
            if (owns(obj, key)) {
2962
 
                keys.push(key);
2963
 
            }
2964
 
        }
2965
 
    }
2966
 
 
2967
 
    return keys;
2968
 
};
2969
 
 
2970
 
/**
2971
 
 * Returns an array containing the values of the object's enumerable keys.
2972
 
 *
2973
 
 * Note that values are returned in enumeration order (that is, in the same
2974
 
 * order that they would be enumerated by a `for-in` loop), which may not be the
2975
 
 * same as the order in which they were defined.
2976
 
 *
2977
 
 * @example
2978
 
 *
2979
 
 *     Y.Object.values({a: 'foo', b: 'bar', c: 'baz'});
2980
 
 *     // => ['foo', 'bar', 'baz']
2981
 
 *
2982
 
 * @method values
2983
 
 * @param {Object} obj An object.
2984
 
 * @return {Array} Array of values.
2985
 
 * @static
2986
 
 */
2987
 
O.values = function (obj) {
2988
 
    var keys   = O.keys(obj),
2989
 
        i      = 0,
2990
 
        len    = keys.length,
2991
 
        values = [];
2992
 
 
2993
 
    for (; i < len; ++i) {
2994
 
        values.push(obj[keys[i]]);
2995
 
    }
2996
 
 
2997
 
    return values;
2998
 
};
2999
 
 
3000
 
/**
3001
 
 * Returns the number of enumerable keys owned by an object.
3002
 
 *
3003
 
 * @method size
3004
 
 * @param {Object} obj An object.
3005
 
 * @return {Number} The object's size.
3006
 
 * @static
3007
 
 */
3008
 
O.size = function (obj) {
3009
 
    try {
3010
 
        return O.keys(obj).length;
3011
 
    } catch (ex) {
3012
 
        return 0; // Legacy behavior for non-objects.
3013
 
    }
3014
 
};
3015
 
 
3016
 
/**
3017
 
 * Returns `true` if the object owns an enumerable property with the specified
3018
 
 * value.
3019
 
 *
3020
 
 * @method hasValue
3021
 
 * @param {Object} obj An object.
3022
 
 * @param {any} value The value to search for.
3023
 
 * @return {Boolean} `true` if _obj_ contains _value_, `false` otherwise.
3024
 
 * @static
3025
 
 */
3026
 
O.hasValue = function (obj, value) {
3027
 
    return Y.Array.indexOf(O.values(obj), value) > -1;
3028
 
};
3029
 
 
3030
 
/**
3031
 
 * Executes a function on each enumerable property in _obj_. The function
3032
 
 * receives the value, the key, and the object itself as parameters (in that
3033
 
 * order).
3034
 
 *
3035
 
 * By default, only properties owned by _obj_ are enumerated. To include
3036
 
 * prototype properties, set the _proto_ parameter to `true`.
3037
 
 *
3038
 
 * @method each
3039
 
 * @param {Object} obj Object to enumerate.
3040
 
 * @param {Function} fn Function to execute on each enumerable property.
3041
 
 *   @param {mixed} fn.value Value of the current property.
3042
 
 *   @param {String} fn.key Key of the current property.
3043
 
 *   @param {Object} fn.obj Object being enumerated.
3044
 
 * @param {Object} [thisObj] `this` object to use when calling _fn_.
3045
 
 * @param {Boolean} [proto=false] Include prototype properties.
3046
 
 * @return {YUI} the YUI instance.
3047
 
 * @chainable
3048
 
 * @static
3049
 
 */
3050
 
O.each = function (obj, fn, thisObj, proto) {
3051
 
    var key;
3052
 
 
3053
 
    for (key in obj) {
3054
 
        if (proto || owns(obj, key)) {
3055
 
            fn.call(thisObj || Y, obj[key], key, obj);
3056
 
        }
3057
 
    }
3058
 
 
3059
 
    return Y;
3060
 
};
3061
 
 
3062
 
/**
3063
 
 * Executes a function on each enumerable property in _obj_, but halts if the
3064
 
 * function returns a truthy value. The function receives the value, the key,
3065
 
 * and the object itself as paramters (in that order).
3066
 
 *
3067
 
 * By default, only properties owned by _obj_ are enumerated. To include
3068
 
 * prototype properties, set the _proto_ parameter to `true`.
3069
 
 *
3070
 
 * @method some
3071
 
 * @param {Object} obj Object to enumerate.
3072
 
 * @param {Function} fn Function to execute on each enumerable property.
3073
 
 *   @param {mixed} fn.value Value of the current property.
3074
 
 *   @param {String} fn.key Key of the current property.
3075
 
 *   @param {Object} fn.obj Object being enumerated.
3076
 
 * @param {Object} [thisObj] `this` object to use when calling _fn_.
3077
 
 * @param {Boolean} [proto=false] Include prototype properties.
3078
 
 * @return {Boolean} `true` if any execution of _fn_ returns a truthy value,
3079
 
 *   `false` otherwise.
3080
 
 * @static
3081
 
 */
3082
 
O.some = function (obj, fn, thisObj, proto) {
3083
 
    var key;
3084
 
 
3085
 
    for (key in obj) {
3086
 
        if (proto || owns(obj, key)) {
3087
 
            if (fn.call(thisObj || Y, obj[key], key, obj)) {
3088
 
                return true;
3089
 
            }
3090
 
        }
3091
 
    }
3092
 
 
3093
 
    return false;
3094
 
};
3095
 
 
3096
 
/**
3097
 
 * Retrieves the sub value at the provided path,
3098
 
 * from the value object provided.
3099
 
 *
3100
 
 * @method getValue
3101
 
 * @static
3102
 
 * @param o The object from which to extract the property value.
3103
 
 * @param path {Array} A path array, specifying the object traversal path
3104
 
 * from which to obtain the sub value.
3105
 
 * @return {Any} The value stored in the path, undefined if not found,
3106
 
 * undefined if the source is not an object.  Returns the source object
3107
 
 * if an empty path is provided.
3108
 
 */
3109
 
O.getValue = function(o, path) {
3110
 
    if (!Lang.isObject(o)) {
3111
 
        return UNDEFINED;
3112
 
    }
3113
 
 
3114
 
    var i,
3115
 
        p = Y.Array(path),
3116
 
        l = p.length;
3117
 
 
3118
 
    for (i = 0; o !== UNDEFINED && i < l; i++) {
3119
 
        o = o[p[i]];
3120
 
    }
3121
 
 
3122
 
    return o;
3123
 
};
3124
 
 
3125
 
/**
3126
 
 * Sets the sub-attribute value at the provided path on the
3127
 
 * value object.  Returns the modified value object, or
3128
 
 * undefined if the path is invalid.
3129
 
 *
3130
 
 * @method setValue
3131
 
 * @static
3132
 
 * @param o             The object on which to set the sub value.
3133
 
 * @param path {Array}  A path array, specifying the object traversal path
3134
 
 *                      at which to set the sub value.
3135
 
 * @param val {Any}     The new value for the sub-attribute.
3136
 
 * @return {Object}     The modified object, with the new sub value set, or
3137
 
 *                      undefined, if the path was invalid.
3138
 
 */
3139
 
O.setValue = function(o, path, val) {
3140
 
    var i,
3141
 
        p = Y.Array(path),
3142
 
        leafIdx = p.length - 1,
3143
 
        ref = o;
3144
 
 
3145
 
    if (leafIdx >= 0) {
3146
 
        for (i = 0; ref !== UNDEFINED && i < leafIdx; i++) {
3147
 
            ref = ref[p[i]];
3148
 
        }
3149
 
 
3150
 
        if (ref !== UNDEFINED) {
3151
 
            ref[p[i]] = val;
3152
 
        } else {
3153
 
            return UNDEFINED;
3154
 
        }
3155
 
    }
3156
 
 
3157
 
    return o;
3158
 
};
3159
 
 
3160
 
/**
3161
 
 * Returns `true` if the object has no enumerable properties of its own.
3162
 
 *
3163
 
 * @method isEmpty
3164
 
 * @param {Object} obj An object.
3165
 
 * @return {Boolean} `true` if the object is empty.
3166
 
 * @static
3167
 
 * @since 3.2.0
3168
 
 */
3169
 
O.isEmpty = function (obj) {
3170
 
    return !O.keys(Object(obj)).length;
3171
 
};
3172
 
/**
3173
 
 * The YUI module contains the components required for building the YUI seed
3174
 
 * file.  This includes the script loading mechanism, a simple queue, and the
3175
 
 * core utilities for the library.
3176
 
 * @module yui
3177
 
 * @submodule yui-base
3178
 
 */
3179
 
 
3180
 
/**
3181
 
 * YUI user agent detection.
3182
 
 * Do not fork for a browser if it can be avoided.  Use feature detection when
3183
 
 * you can.  Use the user agent as a last resort.  For all fields listed
3184
 
 * as @type float, UA stores a version number for the browser engine,
3185
 
 * 0 otherwise.  This value may or may not map to the version number of
3186
 
 * the browser using the engine.  The value is presented as a float so
3187
 
 * that it can easily be used for boolean evaluation as well as for
3188
 
 * looking for a particular range of versions.  Because of this,
3189
 
 * some of the granularity of the version info may be lost.  The fields that
3190
 
 * are @type string default to null.  The API docs list the values that
3191
 
 * these fields can have.
3192
 
 * @class UA
3193
 
 * @static
3194
 
 */
3195
 
 
3196
 
/**
3197
 
* Static method on `YUI.Env` for parsing a UA string.  Called at instantiation
3198
 
* to populate `Y.UA`.
3199
 
*
3200
 
* @static
3201
 
* @method parseUA
3202
 
* @param {String} [subUA=navigator.userAgent] UA string to parse
3203
 
* @return {Object} The Y.UA object
3204
 
*/
3205
 
YUI.Env.parseUA = function(subUA) {
3206
 
 
3207
 
    var numberify = function(s) {
3208
 
            var c = 0;
3209
 
            return parseFloat(s.replace(/\./g, function() {
3210
 
                return (c++ == 1) ? '' : '.';
3211
 
            }));
3212
 
        },
3213
 
 
3214
 
        win = Y.config.win,
3215
 
 
3216
 
        nav = win && win.navigator,
3217
 
 
3218
 
        o = {
3219
 
 
3220
 
        /**
3221
 
         * Internet Explorer version number or 0.  Example: 6
3222
 
         * @property ie
3223
 
         * @type float
3224
 
         * @static
3225
 
         */
3226
 
        ie: 0,
3227
 
 
3228
 
        /**
3229
 
         * Opera version number or 0.  Example: 9.2
3230
 
         * @property opera
3231
 
         * @type float
3232
 
         * @static
3233
 
         */
3234
 
        opera: 0,
3235
 
 
3236
 
        /**
3237
 
         * Gecko engine revision number.  Will evaluate to 1 if Gecko
3238
 
         * is detected but the revision could not be found. Other browsers
3239
 
         * will be 0.  Example: 1.8
3240
 
         * <pre>
3241
 
         * Firefox 1.0.0.4: 1.7.8   <-- Reports 1.7
3242
 
         * Firefox 1.5.0.9: 1.8.0.9 <-- 1.8
3243
 
         * Firefox 2.0.0.3: 1.8.1.3 <-- 1.81
3244
 
         * Firefox 3.0   <-- 1.9
3245
 
         * Firefox 3.5   <-- 1.91
3246
 
         * </pre>
3247
 
         * @property gecko
3248
 
         * @type float
3249
 
         * @static
3250
 
         */
3251
 
        gecko: 0,
3252
 
 
3253
 
        /**
3254
 
         * AppleWebKit version.  KHTML browsers that are not WebKit browsers
3255
 
         * will evaluate to 1, other browsers 0.  Example: 418.9
3256
 
         * <pre>
3257
 
         * Safari 1.3.2 (312.6): 312.8.1 <-- Reports 312.8 -- currently the
3258
 
         *                                   latest available for Mac OSX 10.3.
3259
 
         * Safari 2.0.2:         416     <-- hasOwnProperty introduced
3260
 
         * Safari 2.0.4:         418     <-- preventDefault fixed
3261
 
         * Safari 2.0.4 (419.3): 418.9.1 <-- One version of Safari may run
3262
 
         *                                   different versions of webkit
3263
 
         * Safari 2.0.4 (419.3): 419     <-- Tiger installations that have been
3264
 
         *                                   updated, but not updated
3265
 
         *                                   to the latest patch.
3266
 
         * Webkit 212 nightly:   522+    <-- Safari 3.0 precursor (with native
3267
 
         * SVG and many major issues fixed).
3268
 
         * Safari 3.0.4 (523.12) 523.12  <-- First Tiger release - automatic
3269
 
         * update from 2.x via the 10.4.11 OS patch.
3270
 
         * Webkit nightly 1/2008:525+    <-- Supports DOMContentLoaded event.
3271
 
         *                                   yahoo.com user agent hack removed.
3272
 
         * </pre>
3273
 
         * http://en.wikipedia.org/wiki/Safari_version_history
3274
 
         * @property webkit
3275
 
         * @type float
3276
 
         * @static
3277
 
         */
3278
 
        webkit: 0,
3279
 
 
3280
 
        /**
3281
 
         * Safari will be detected as webkit, but this property will also
3282
 
         * be populated with the Safari version number
3283
 
         * @property safari
3284
 
         * @type float
3285
 
         * @static
3286
 
         */
3287
 
        safari: 0,
3288
 
 
3289
 
        /**
3290
 
         * Chrome will be detected as webkit, but this property will also
3291
 
         * be populated with the Chrome version number
3292
 
         * @property chrome
3293
 
         * @type float
3294
 
         * @static
3295
 
         */
3296
 
        chrome: 0,
3297
 
 
3298
 
        /**
3299
 
         * The mobile property will be set to a string containing any relevant
3300
 
         * user agent information when a modern mobile browser is detected.
3301
 
         * Currently limited to Safari on the iPhone/iPod Touch, Nokia N-series
3302
 
         * devices with the WebKit-based browser, and Opera Mini.
3303
 
         * @property mobile
3304
 
         * @type string
3305
 
         * @default null
3306
 
         * @static
3307
 
         */
3308
 
        mobile: null,
3309
 
 
3310
 
        /**
3311
 
         * Adobe AIR version number or 0.  Only populated if webkit is detected.
3312
 
         * Example: 1.0
3313
 
         * @property air
3314
 
         * @type float
3315
 
         */
3316
 
        air: 0,
3317
 
        /**
3318
 
         * Detects Apple iPad's OS version
3319
 
         * @property ipad
3320
 
         * @type float
3321
 
         * @static
3322
 
         */
3323
 
        ipad: 0,
3324
 
        /**
3325
 
         * Detects Apple iPhone's OS version
3326
 
         * @property iphone
3327
 
         * @type float
3328
 
         * @static
3329
 
         */
3330
 
        iphone: 0,
3331
 
        /**
3332
 
         * Detects Apples iPod's OS version
3333
 
         * @property ipod
3334
 
         * @type float
3335
 
         * @static
3336
 
         */
3337
 
        ipod: 0,
3338
 
        /**
3339
 
         * General truthy check for iPad, iPhone or iPod
3340
 
         * @property ios
3341
 
         * @type float
3342
 
         * @default null
3343
 
         * @static
3344
 
         */
3345
 
        ios: null,
3346
 
        /**
3347
 
         * Detects Googles Android OS version
3348
 
         * @property android
3349
 
         * @type float
3350
 
         * @static
3351
 
         */
3352
 
        android: 0,
3353
 
        /**
3354
 
         * Detects Kindle Silk
3355
 
         * @property silk
3356
 
         * @type float
3357
 
         * @static
3358
 
         */
3359
 
        silk: 0,
3360
 
        /**
3361
 
         * Detects Kindle Silk Acceleration
3362
 
         * @property accel
3363
 
         * @type Boolean
3364
 
         * @static
3365
 
         */
3366
 
        accel: false,
3367
 
        /**
3368
 
         * Detects Palms WebOS version
3369
 
         * @property webos
3370
 
         * @type float
3371
 
         * @static
3372
 
         */
3373
 
        webos: 0,
3374
 
 
3375
 
        /**
3376
 
         * Google Caja version number or 0.
3377
 
         * @property caja
3378
 
         * @type float
3379
 
         */
3380
 
        caja: nav && nav.cajaVersion,
3381
 
 
3382
 
        /**
3383
 
         * Set to true if the page appears to be in SSL
3384
 
         * @property secure
3385
 
         * @type boolean
3386
 
         * @static
3387
 
         */
3388
 
        secure: false,
3389
 
 
3390
 
        /**
3391
 
         * The operating system.  Currently only detecting windows or macintosh
3392
 
         * @property os
3393
 
         * @type string
3394
 
         * @default null
3395
 
         * @static
3396
 
         */
3397
 
        os: null,
3398
 
 
3399
 
        /**
3400
 
         * The Nodejs Version
3401
 
         * @property nodejs
3402
 
         * @type float
3403
 
         * @default 0
3404
 
         * @static
3405
 
         */
3406
 
        nodejs: 0
3407
 
    },
3408
 
 
3409
 
    ua = subUA || nav && nav.userAgent,
3410
 
 
3411
 
    loc = win && win.location,
3412
 
 
3413
 
    href = loc && loc.href,
3414
 
 
3415
 
    m;
3416
 
 
3417
 
    /**
3418
 
    * The User Agent string that was parsed
3419
 
    * @property userAgent
3420
 
    * @type String
3421
 
    * @static
3422
 
    */
3423
 
    o.userAgent = ua;
3424
 
 
3425
 
 
3426
 
    o.secure = href && (href.toLowerCase().indexOf('https') === 0);
3427
 
 
3428
 
    if (ua) {
3429
 
 
3430
 
        if ((/windows|win32/i).test(ua)) {
3431
 
            o.os = 'windows';
3432
 
        } else if ((/macintosh|mac_powerpc/i).test(ua)) {
3433
 
            o.os = 'macintosh';
3434
 
        } else if ((/android/i).test(ua)) {
3435
 
            o.os = 'android';
3436
 
        } else if ((/symbos/i).test(ua)) {
3437
 
            o.os = 'symbos';
3438
 
        } else if ((/linux/i).test(ua)) {
3439
 
            o.os = 'linux';
3440
 
        } else if ((/rhino/i).test(ua)) {
3441
 
            o.os = 'rhino';
3442
 
        }
3443
 
 
3444
 
        // Modern KHTML browsers should qualify as Safari X-Grade
3445
 
        if ((/KHTML/).test(ua)) {
3446
 
            o.webkit = 1;
3447
 
        }
3448
 
        if ((/IEMobile|XBLWP7/).test(ua)) {
3449
 
            o.mobile = 'windows';
3450
 
        }
3451
 
        if ((/Fennec/).test(ua)) {
3452
 
            o.mobile = 'gecko';
3453
 
        }
3454
 
        // Modern WebKit browsers are at least X-Grade
3455
 
        m = ua.match(/AppleWebKit\/([^\s]*)/);
3456
 
        if (m && m[1]) {
3457
 
            o.webkit = numberify(m[1]);
3458
 
            o.safari = o.webkit;
3459
 
 
3460
 
            // Mobile browser check
3461
 
            if (/ Mobile\//.test(ua) || (/iPad|iPod|iPhone/).test(ua)) {
3462
 
                o.mobile = 'Apple'; // iPhone or iPod Touch
3463
 
 
3464
 
                m = ua.match(/OS ([^\s]*)/);
3465
 
                if (m && m[1]) {
3466
 
                    m = numberify(m[1].replace('_', '.'));
3467
 
                }
3468
 
                o.ios = m;
3469
 
                o.os = 'ios';
3470
 
                o.ipad = o.ipod = o.iphone = 0;
3471
 
 
3472
 
                m = ua.match(/iPad|iPod|iPhone/);
3473
 
                if (m && m[0]) {
3474
 
                    o[m[0].toLowerCase()] = o.ios;
3475
 
                }
3476
 
            } else {
3477
 
                m = ua.match(/NokiaN[^\/]*|webOS\/\d\.\d/);
3478
 
                if (m) {
3479
 
                    // Nokia N-series, webOS, ex: NokiaN95
3480
 
                    o.mobile = m[0];
3481
 
                }
3482
 
                if (/webOS/.test(ua)) {
3483
 
                    o.mobile = 'WebOS';
3484
 
                    m = ua.match(/webOS\/([^\s]*);/);
3485
 
                    if (m && m[1]) {
3486
 
                        o.webos = numberify(m[1]);
3487
 
                    }
3488
 
                }
3489
 
                if (/ Android/.test(ua)) {
3490
 
                    if (/Mobile/.test(ua)) {
3491
 
                        o.mobile = 'Android';
3492
 
                    }
3493
 
                    m = ua.match(/Android ([^\s]*);/);
3494
 
                    if (m && m[1]) {
3495
 
                        o.android = numberify(m[1]);
3496
 
                    }
3497
 
 
3498
 
                }
3499
 
                if (/Silk/.test(ua)) {
3500
 
                    m = ua.match(/Silk\/([^\s]*)\)/);
3501
 
                    if (m && m[1]) {
3502
 
                        o.silk = numberify(m[1]);
3503
 
                    }
3504
 
                    if (!o.android) {
3505
 
                        o.android = 2.34; //Hack for desktop mode in Kindle
3506
 
                        o.os = 'Android';
3507
 
                    }
3508
 
                    if (/Accelerated=true/.test(ua)) {
3509
 
                        o.accel = true;
3510
 
                    }
3511
 
                }
3512
 
            }
3513
 
 
3514
 
            m = ua.match(/(Chrome|CrMo)\/([^\s]*)/);
3515
 
            if (m && m[1] && m[2]) {
3516
 
                o.chrome = numberify(m[2]); // Chrome
3517
 
                o.safari = 0; //Reset safari back to 0
3518
 
                if (m[1] === 'CrMo') {
3519
 
                    o.mobile = 'chrome';
3520
 
                }
3521
 
            } else {
3522
 
                m = ua.match(/AdobeAIR\/([^\s]*)/);
3523
 
                if (m) {
3524
 
                    o.air = m[0]; // Adobe AIR 1.0 or better
3525
 
                }
3526
 
            }
3527
 
        }
3528
 
 
3529
 
        if (!o.webkit) { // not webkit
3530
 
// @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; fi; U; ssr)
3531
 
            if (/Opera/.test(ua)) {
3532
 
                m = ua.match(/Opera[\s\/]([^\s]*)/);
3533
 
                if (m && m[1]) {
3534
 
                    o.opera = numberify(m[1]);
3535
 
                }
3536
 
                m = ua.match(/Version\/([^\s]*)/);
3537
 
                if (m && m[1]) {
3538
 
                    o.opera = numberify(m[1]); // opera 10+
3539
 
                }
3540
 
 
3541
 
                if (/Opera Mobi/.test(ua)) {
3542
 
                    o.mobile = 'opera';
3543
 
                    m = ua.replace('Opera Mobi', '').match(/Opera ([^\s]*)/);
3544
 
                    if (m && m[1]) {
3545
 
                        o.opera = numberify(m[1]);
3546
 
                    }
3547
 
                }
3548
 
                m = ua.match(/Opera Mini[^;]*/);
3549
 
 
3550
 
                if (m) {
3551
 
                    o.mobile = m[0]; // ex: Opera Mini/2.0.4509/1316
3552
 
                }
3553
 
            } else { // not opera or webkit
3554
 
                m = ua.match(/MSIE\s([^;]*)/);
3555
 
                if (m && m[1]) {
3556
 
                    o.ie = numberify(m[1]);
3557
 
                } else { // not opera, webkit, or ie
3558
 
                    m = ua.match(/Gecko\/([^\s]*)/);
3559
 
                    if (m) {
3560
 
                        o.gecko = 1; // Gecko detected, look for revision
3561
 
                        m = ua.match(/rv:([^\s\)]*)/);
3562
 
                        if (m && m[1]) {
3563
 
                            o.gecko = numberify(m[1]);
3564
 
                        }
3565
 
                    }
3566
 
                }
3567
 
            }
3568
 
        }
3569
 
    }
3570
 
 
3571
 
    //It was a parsed UA, do not assign the global value.
3572
 
    if (!subUA) {
3573
 
 
3574
 
        if (typeof process == 'object') {
3575
 
 
3576
 
            if (process.versions && process.versions.node) {
3577
 
                //NodeJS
3578
 
                o.os = process.platform;
3579
 
                o.nodejs = process.versions.node;
3580
 
            }
3581
 
        }
3582
 
 
3583
 
        YUI.Env.UA = o;
3584
 
 
3585
 
    }
3586
 
 
3587
 
    return o;
3588
 
};
3589
 
 
3590
 
 
3591
 
Y.UA = YUI.Env.UA || YUI.Env.parseUA();
3592
 
 
3593
 
/**
3594
 
Performs a simple comparison between two version numbers, accounting for
3595
 
standard versioning logic such as the fact that "535.8" is a lower version than
3596
 
"535.24", even though a simple numerical comparison would indicate that it's
3597
 
greater. Also accounts for cases such as "1.1" vs. "1.1.0", which are
3598
 
considered equivalent.
3599
 
 
3600
 
Returns -1 if version _a_ is lower than version _b_, 0 if they're equivalent,
3601
 
1 if _a_ is higher than _b_.
3602
 
 
3603
 
Versions may be numbers or strings containing numbers and dots. For example,
3604
 
both `535` and `"535.8.10"` are acceptable. A version string containing
3605
 
non-numeric characters, like `"535.8.beta"`, may produce unexpected results.
3606
 
 
3607
 
@method compareVersions
3608
 
@param {Number|String} a First version number to compare.
3609
 
@param {Number|String} b Second version number to compare.
3610
 
@return -1 if _a_ is lower than _b_, 0 if they're equivalent, 1 if _a_ is
3611
 
    higher than _b_.
3612
 
**/
3613
 
Y.UA.compareVersions = function (a, b) {
3614
 
    var aPart, aParts, bPart, bParts, i, len;
3615
 
 
3616
 
    if (a === b) {
3617
 
        return 0;
3618
 
    }
3619
 
 
3620
 
    aParts = (a + '').split('.');
3621
 
    bParts = (b + '').split('.');
3622
 
 
3623
 
    for (i = 0, len = Math.max(aParts.length, bParts.length); i < len; ++i) {
3624
 
        aPart = parseInt(aParts[i], 10);
3625
 
        bPart = parseInt(bParts[i], 10);
3626
 
 
3627
 
        isNaN(aPart) && (aPart = 0);
3628
 
        isNaN(bPart) && (bPart = 0);
3629
 
 
3630
 
        if (aPart < bPart) {
3631
 
            return -1;
3632
 
        }
3633
 
 
3634
 
        if (aPart > bPart) {
3635
 
            return 1;
3636
 
        }
3637
 
    }
3638
 
 
3639
 
    return 0;
3640
 
};
3641
 
YUI.Env.aliases = {
3642
 
    "anim": ["anim-base","anim-color","anim-curve","anim-easing","anim-node-plugin","anim-scroll","anim-xy"],
3643
 
    "app": ["app-base","app-transitions","model","model-list","router","view"],
3644
 
    "attribute": ["attribute-base","attribute-complex"],
3645
 
    "autocomplete": ["autocomplete-base","autocomplete-sources","autocomplete-list","autocomplete-plugin"],
3646
 
    "base": ["base-base","base-pluginhost","base-build"],
3647
 
    "cache": ["cache-base","cache-offline","cache-plugin"],
3648
 
    "collection": ["array-extras","arraylist","arraylist-add","arraylist-filter","array-invoke"],
3649
 
    "controller": ["router"],
3650
 
    "dataschema": ["dataschema-base","dataschema-json","dataschema-xml","dataschema-array","dataschema-text"],
3651
 
    "datasource": ["datasource-local","datasource-io","datasource-get","datasource-function","datasource-cache","datasource-jsonschema","datasource-xmlschema","datasource-arrayschema","datasource-textschema","datasource-polling"],
3652
 
    "datatable": ["datatable-core","datatable-head","datatable-body","datatable-base","datatable-column-widths","datatable-message","datatable-mutable","datatable-sort","datatable-datasource"],
3653
 
    "datatable-deprecated": ["datatable-base-deprecated","datatable-datasource-deprecated","datatable-sort-deprecated","datatable-scroll-deprecated"],
3654
 
    "datatype": ["datatype-number","datatype-date","datatype-xml"],
3655
 
    "datatype-date": ["datatype-date-parse","datatype-date-format"],
3656
 
    "datatype-number": ["datatype-number-parse","datatype-number-format"],
3657
 
    "datatype-xml": ["datatype-xml-parse","datatype-xml-format"],
3658
 
    "dd": ["dd-ddm-base","dd-ddm","dd-ddm-drop","dd-drag","dd-proxy","dd-constrain","dd-drop","dd-scroll","dd-delegate"],
3659
 
    "dom": ["dom-base","dom-screen","dom-style","selector-native","selector"],
3660
 
    "editor": ["frame","editor-selection","exec-command","editor-base","editor-para","editor-br","editor-bidi","editor-tab","createlink-base"],
3661
 
    "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"],
3662
 
    "event-custom": ["event-custom-base","event-custom-complex"],
3663
 
    "event-gestures": ["event-flick","event-move"],
3664
 
    "handlebars": ["handlebars-compiler"],
3665
 
    "highlight": ["highlight-base","highlight-accentfold"],
3666
 
    "history": ["history-base","history-hash","history-hash-ie","history-html5"],
3667
 
    "io": ["io-base","io-xdr","io-form","io-upload-iframe","io-queue"],
3668
 
    "json": ["json-parse","json-stringify"],
3669
 
    "loader": ["loader-base","loader-rollup","loader-yui3"],
3670
 
    "node": ["node-base","node-event-delegate","node-pluginhost","node-screen","node-style"],
3671
 
    "pluginhost": ["pluginhost-base","pluginhost-config"],
3672
 
    "querystring": ["querystring-parse","querystring-stringify"],
3673
 
    "recordset": ["recordset-base","recordset-sort","recordset-filter","recordset-indexer"],
3674
 
    "resize": ["resize-base","resize-proxy","resize-constrain"],
3675
 
    "slider": ["slider-base","slider-value-range","clickable-rail","range-slider"],
3676
 
    "text": ["text-accentfold","text-wordbreak"],
3677
 
    "widget": ["widget-base","widget-htmlparser","widget-skin","widget-uievents"]
3678
 
};
3679
 
 
3680
 
 
3681
 
}, '3.5.1' );
3682
 
YUI.add('get', function(Y) {
3683
 
 
3684
 
    /**
3685
 
    * NodeJS specific Get module used to load remote resources. It contains the same signature as the default Get module so there is no code change needed.
3686
 
    * @module get-nodejs
3687
 
    * @class GetNodeJS
3688
 
    */
3689
 
        
3690
 
    var path = require('path'),
3691
 
        vm = require('vm'),
3692
 
        fs = require('fs'),
3693
 
        request = require('request');
3694
 
 
3695
 
 
3696
 
    Y.Get = function() {
3697
 
    };
3698
 
 
3699
 
    //Setup the default config base path
3700
 
    Y.config.base = path.join(__dirname, '../');
3701
 
 
3702
 
    YUI.require = require;
3703
 
    YUI.process = process;
3704
 
    
3705
 
    /**
3706
 
    * Escape the path for Windows, they need to be double encoded when used as `__dirname` or `__filename`
3707
 
    * @method escapeWinPath
3708
 
    * @protected
3709
 
    * @param {String} p The path to modify
3710
 
    * @return {String} The encoded path
3711
 
    */
3712
 
    var escapeWinPath = function(p) {
3713
 
        return p.replace(/\\/g, '\\\\');
3714
 
    };
3715
 
 
3716
 
    /**
3717
 
    * Takes the raw JS files and wraps them to be executed in the YUI context so they can be loaded
3718
 
    * into the YUI object
3719
 
    * @method _exec
3720
 
    * @private
3721
 
    * @param {String} data The JS to execute
3722
 
    * @param {String} url The path to the file that was parsed
3723
 
    * @param {Callback} cb The callback to execute when this is completed
3724
 
    * @param {Error} cb.err=null Error object
3725
 
    * @param {String} cb.url The URL that was just parsed
3726
 
    */
3727
 
 
3728
 
    Y.Get._exec = function(data, url, cb) {
3729
 
        var dirName = escapeWinPath(path.dirname(url));
3730
 
        var fileName = escapeWinPath(url);
3731
 
 
3732
 
        if (dirName.match(/^https?:\/\//)) {
3733
 
            dirName = '.';
3734
 
            fileName = 'remoteResource';
3735
 
        }
3736
 
 
3737
 
        var mod = "(function(YUI) { var __dirname = '" + dirName + "'; "+
3738
 
            "var __filename = '" + fileName + "'; " +
3739
 
            "var process = YUI.process;" +
3740
 
            "var require = function(file) {" +
3741
 
            " if (file.indexOf('./') === 0) {" +
3742
 
            "   file = __dirname + file.replace('./', '/'); }" +
3743
 
            " return YUI.require(file); }; " +
3744
 
            data + " ;return YUI; })";
3745
 
    
3746
 
        //var mod = "(function(YUI) { " + data + ";return YUI; })";
3747
 
        var script = vm.createScript(mod, url);
3748
 
        var fn = script.runInThisContext(mod);
3749
 
        YUI = fn(YUI);
3750
 
        cb(null, url);
3751
 
    };
3752
 
    
3753
 
    /**
3754
 
    * Fetches the content from a remote URL or a file from disc and passes the content
3755
 
    * off to `_exec` for parsing
3756
 
    * @method _include
3757
 
    * @private
3758
 
    * @param {String} url The URL/File path to fetch the content from
3759
 
    * @param {Callback} cb The callback to fire once the content has been executed via `_exec`
3760
 
    */
3761
 
    Y.Get._include = function(url, cb) {
3762
 
        var self = this;
3763
 
 
3764
 
        if (url.match(/^https?:\/\//)) {
3765
 
            var cfg = {
3766
 
                url: url,
3767
 
                timeout: self.timeout
3768
 
            };
3769
 
            request(cfg, function (err, response, body) {
3770
 
                if (err) {
3771
 
                    Y.log(err, 'error', 'get');
3772
 
                    cb(err, url);
3773
 
                } else {
3774
 
                    Y.Get._exec(body, url, cb);
3775
 
                }
3776
 
            });
3777
 
        } else {
3778
 
            if (Y.config.useSync) {
3779
 
                //Needs to be in useSync
3780
 
                if (path.existsSync(url)) {
3781
 
                    var mod = fs.readFileSync(url,'utf8');
3782
 
                    Y.Get._exec(mod, url, cb);
3783
 
                } else {
3784
 
                    cb('Path does not exist: ' + url, url);
3785
 
                }
3786
 
            } else {
3787
 
                fs.readFile(url, 'utf8', function(err, mod) {
3788
 
                    if (err) {
3789
 
                        cb(err, url);
3790
 
                    } else {
3791
 
                        Y.Get._exec(mod, url, cb);
3792
 
                    }
3793
 
                });
3794
 
            }
3795
 
        }
3796
 
        
3797
 
    };
3798
 
 
3799
 
 
3800
 
    var end = function(cb, msg, result) {
3801
 
        //Y.log('Get end: ' + cb.onEnd);
3802
 
        if (Y.Lang.isFunction(cb.onEnd)) {
3803
 
            cb.onEnd.call(Y, msg, result);
3804
 
        }
3805
 
    }, pass = function(cb) {
3806
 
        //Y.log('Get pass: ' + cb.onSuccess);
3807
 
        if (Y.Lang.isFunction(cb.onSuccess)) {
3808
 
            cb.onSuccess.call(Y, cb);
3809
 
        }
3810
 
        end(cb, 'success', 'success');
3811
 
    }, fail = function(cb, er) {
3812
 
        //Y.log('Get fail: ' + er);
3813
 
        if (Y.Lang.isFunction(cb.onFailure)) {
3814
 
            cb.onFailure.call(Y, er, cb);
3815
 
        }
3816
 
        end(cb, er, 'fail');
3817
 
    };
3818
 
 
3819
 
 
3820
 
    /**
3821
 
    * Override for Get.script for loading local or remote YUI modules.
3822
 
    * @method js
3823
 
    * @param {Array|String} s The URL's to load into this context
3824
 
    * @param {Object} options Transaction options
3825
 
    */
3826
 
    Y.Get.js = function(s, options) {
3827
 
        var A = Y.Array,
3828
 
            self = this,
3829
 
            urls = A(s), url, i, l = urls.length, c= 0,
3830
 
            check = function() {
3831
 
                if (c === l) {
3832
 
                    pass(options);
3833
 
                }
3834
 
            };
3835
 
 
3836
 
 
3837
 
 
3838
 
        for (i=0; i<l; i++) {
3839
 
            url = urls[i];
3840
 
            if (Y.Lang.isObject(url)) {
3841
 
                url = url.url;
3842
 
            }
3843
 
 
3844
 
            url = url.replace(/'/g, '%27');
3845
 
            Y.log('URL: ' + url, 'info', 'get');
3846
 
            Y.Get._include(url, function(err, url) {
3847
 
                if (!Y.config) {
3848
 
                    Y.config = {
3849
 
                        debug: true
3850
 
                    };
3851
 
                }
3852
 
                if (options.onProgress) {
3853
 
                    options.onProgress.call(options.context || Y, url);
3854
 
                }
3855
 
                Y.log('After Load: ' + url, 'info', 'get');
3856
 
                if (err) {
3857
 
                    fail(options, err);
3858
 
                    Y.log('----------------------------------------------------------', 'error', 'get');
3859
 
                    Y.log(err, 'error', 'get');
3860
 
                    Y.log('----------------------------------------------------------', 'error', 'get');
3861
 
                } else {
3862
 
                    c++;
3863
 
                    check();
3864
 
                }
3865
 
            });
3866
 
        }
3867
 
    };
3868
 
    
3869
 
    /**
3870
 
    * Alias for `Y.Get.js`
3871
 
    * @method script
3872
 
    */
3873
 
    Y.Get.script = Y.Get.js;
3874
 
    
3875
 
    //Place holder for SS Dom access
3876
 
    Y.Get.css = function(s, cb) {
3877
 
        Y.log('Y.Get.css is not supported, just reporting that it has loaded but not fetching.', 'warn', 'get');
3878
 
        pass(cb);
3879
 
    };
3880
 
 
3881
 
 
3882
 
 
3883
 
}, '3.5.1' ,{requires:['yui-base']});
3884
 
YUI.add('features', function(Y) {
3885
 
 
3886
 
var feature_tests = {};
3887
 
 
3888
 
/**
3889
 
Contains the core of YUI's feature test architecture.
3890
 
@module features
3891
 
*/
3892
 
 
3893
 
/**
3894
 
* Feature detection
3895
 
* @class Features
3896
 
* @static
3897
 
*/
3898
 
 
3899
 
Y.mix(Y.namespace('Features'), {
3900
 
    
3901
 
    /**
3902
 
    * Object hash of all registered feature tests
3903
 
    * @property tests
3904
 
    * @type Object
3905
 
    */
3906
 
    tests: feature_tests,
3907
 
    
3908
 
    /**
3909
 
    * Add a test to the system
3910
 
    * 
3911
 
    *   ```
3912
 
    *   Y.Features.add("load", "1", {});
3913
 
    *   ```
3914
 
    * 
3915
 
    * @method add
3916
 
    * @param {String} cat The category, right now only 'load' is supported
3917
 
    * @param {String} name The number sequence of the test, how it's reported in the URL or config: 1, 2, 3
3918
 
    * @param {Object} o Object containing test properties
3919
 
    * @param {String} o.name The name of the test
3920
 
    * @param {Function} o.test The test function to execute, the only argument to the function is the `Y` instance
3921
 
    * @param {String} o.trigger The module that triggers this test.
3922
 
    */
3923
 
    add: function(cat, name, o) {
3924
 
        feature_tests[cat] = feature_tests[cat] || {};
3925
 
        feature_tests[cat][name] = o;
3926
 
    },
3927
 
    /**
3928
 
    * Execute all tests of a given category and return the serialized results
3929
 
    *
3930
 
    *   ```
3931
 
    *   caps=1:1;2:1;3:0
3932
 
    *   ```
3933
 
    * @method all
3934
 
    * @param {String} cat The category to execute
3935
 
    * @param {Array} args The arguments to pass to the test function
3936
 
    * @return {String} A semi-colon separated string of tests and their success/failure: 1:1;2:1;3:0
3937
 
    */
3938
 
    all: function(cat, args) {
3939
 
        var cat_o = feature_tests[cat],
3940
 
            // results = {};
3941
 
            result = [];
3942
 
        if (cat_o) {
3943
 
            Y.Object.each(cat_o, function(v, k) {
3944
 
                result.push(k + ':' + (Y.Features.test(cat, k, args) ? 1 : 0));
3945
 
            });
3946
 
        }
3947
 
 
3948
 
        return (result.length) ? result.join(';') : '';
3949
 
    },
3950
 
    /**
3951
 
    * Run a sepecific test and return a Boolean response.
3952
 
    *
3953
 
    *   ```
3954
 
    *   Y.Features.test("load", "1");
3955
 
    *   ```
3956
 
    *
3957
 
    * @method test
3958
 
    * @param {String} cat The category of the test to run
3959
 
    * @param {String} name The name of the test to run
3960
 
    * @param {Array} args The arguments to pass to the test function
3961
 
    * @return {Boolean} True or false if the test passed/failed.
3962
 
    */
3963
 
    test: function(cat, name, args) {
3964
 
        args = args || [];
3965
 
        var result, ua, test,
3966
 
            cat_o = feature_tests[cat],
3967
 
            feature = cat_o && cat_o[name];
3968
 
 
3969
 
        if (!feature) {
3970
 
            Y.log('Feature test ' + cat + ', ' + name + ' not found');
3971
 
        } else {
3972
 
 
3973
 
            result = feature.result;
3974
 
 
3975
 
            if (Y.Lang.isUndefined(result)) {
3976
 
 
3977
 
                ua = feature.ua;
3978
 
                if (ua) {
3979
 
                    result = (Y.UA[ua]);
3980
 
                }
3981
 
 
3982
 
                test = feature.test;
3983
 
                if (test && ((!ua) || result)) {
3984
 
                    result = test.apply(Y, args);
3985
 
                }
3986
 
 
3987
 
                feature.result = result;
3988
 
            }
3989
 
        }
3990
 
 
3991
 
        return result;
3992
 
    }
3993
 
});
3994
 
 
3995
 
// Y.Features.add("load", "1", {});
3996
 
// Y.Features.test("load", "1");
3997
 
// caps=1:1;2:0;3:1;
3998
 
 
3999
 
/* This file is auto-generated by src/loader/scripts/meta_join.py */
4000
 
var add = Y.Features.add;
4001
 
// io-nodejs
4002
 
add('load', '0', {
4003
 
    "name": "io-nodejs", 
4004
 
    "trigger": "io-base", 
4005
 
    "ua": "nodejs"
4006
 
});
4007
 
// graphics-canvas-default
4008
 
add('load', '1', {
4009
 
    "name": "graphics-canvas-default", 
4010
 
    "test": function(Y) {
4011
 
    var DOCUMENT = Y.config.doc,
4012
 
        useCanvas = Y.config.defaultGraphicEngine && Y.config.defaultGraphicEngine == "canvas",
4013
 
                canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
4014
 
        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
4015
 
    return (!svg || useCanvas) && (canvas && canvas.getContext && canvas.getContext("2d"));
4016
 
}, 
4017
 
    "trigger": "graphics"
4018
 
});
4019
 
// autocomplete-list-keys
4020
 
add('load', '2', {
4021
 
    "name": "autocomplete-list-keys", 
4022
 
    "test": function (Y) {
4023
 
    // Only add keyboard support to autocomplete-list if this doesn't appear to
4024
 
    // be an iOS or Android-based mobile device.
4025
 
    //
4026
 
    // There's currently no feasible way to actually detect whether a device has
4027
 
    // a hardware keyboard, so this sniff will have to do. It can easily be
4028
 
    // overridden by manually loading the autocomplete-list-keys module.
4029
 
    //
4030
 
    // Worth noting: even though iOS supports bluetooth keyboards, Mobile Safari
4031
 
    // doesn't fire the keyboard events used by AutoCompleteList, so there's
4032
 
    // no point loading the -keys module even when a bluetooth keyboard may be
4033
 
    // available.
4034
 
    return !(Y.UA.ios || Y.UA.android);
4035
 
}, 
4036
 
    "trigger": "autocomplete-list"
4037
 
});
4038
 
// graphics-svg
4039
 
add('load', '3', {
4040
 
    "name": "graphics-svg", 
4041
 
    "test": function(Y) {
4042
 
    var DOCUMENT = Y.config.doc,
4043
 
        useSVG = !Y.config.defaultGraphicEngine || Y.config.defaultGraphicEngine != "canvas",
4044
 
                canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
4045
 
        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
4046
 
    
4047
 
    return svg && (useSVG || !canvas);
4048
 
}, 
4049
 
    "trigger": "graphics"
4050
 
});
4051
 
// editor-para-ie
4052
 
add('load', '4', {
4053
 
    "name": "editor-para-ie", 
4054
 
    "trigger": "editor-para", 
4055
 
    "ua": "ie", 
4056
 
    "when": "instead"
4057
 
});
4058
 
// graphics-vml-default
4059
 
add('load', '5', {
4060
 
    "name": "graphics-vml-default", 
4061
 
    "test": function(Y) {
4062
 
    var DOCUMENT = Y.config.doc,
4063
 
                canvas = DOCUMENT && DOCUMENT.createElement("canvas");
4064
 
    return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
4065
 
}, 
4066
 
    "trigger": "graphics"
4067
 
});
4068
 
// graphics-svg-default
4069
 
add('load', '6', {
4070
 
    "name": "graphics-svg-default", 
4071
 
    "test": function(Y) {
4072
 
    var DOCUMENT = Y.config.doc,
4073
 
        useSVG = !Y.config.defaultGraphicEngine || Y.config.defaultGraphicEngine != "canvas",
4074
 
                canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
4075
 
        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
4076
 
    
4077
 
    return svg && (useSVG || !canvas);
4078
 
}, 
4079
 
    "trigger": "graphics"
4080
 
});
4081
 
// history-hash-ie
4082
 
add('load', '7', {
4083
 
    "name": "history-hash-ie", 
4084
 
    "test": function (Y) {
4085
 
    var docMode = Y.config.doc && Y.config.doc.documentMode;
4086
 
 
4087
 
    return Y.UA.ie && (!('onhashchange' in Y.config.win) ||
4088
 
            !docMode || docMode < 8);
4089
 
}, 
4090
 
    "trigger": "history-hash"
4091
 
});
4092
 
// transition-timer
4093
 
add('load', '8', {
4094
 
    "name": "transition-timer", 
4095
 
    "test": function (Y) {
4096
 
    var DOCUMENT = Y.config.doc,
4097
 
        node = (DOCUMENT) ? DOCUMENT.documentElement: null,
4098
 
        ret = true;
4099
 
 
4100
 
    if (node && node.style) {
4101
 
        ret = !('MozTransition' in node.style || 'WebkitTransition' in node.style);
4102
 
    } 
4103
 
 
4104
 
    return ret;
4105
 
}, 
4106
 
    "trigger": "transition"
4107
 
});
4108
 
// dom-style-ie
4109
 
add('load', '9', {
4110
 
    "name": "dom-style-ie", 
4111
 
    "test": function (Y) {
4112
 
 
4113
 
    var testFeature = Y.Features.test,
4114
 
        addFeature = Y.Features.add,
4115
 
        WINDOW = Y.config.win,
4116
 
        DOCUMENT = Y.config.doc,
4117
 
        DOCUMENT_ELEMENT = 'documentElement',
4118
 
        ret = false;
4119
 
 
4120
 
    addFeature('style', 'computedStyle', {
4121
 
        test: function() {
4122
 
            return WINDOW && 'getComputedStyle' in WINDOW;
4123
 
        }
4124
 
    });
4125
 
 
4126
 
    addFeature('style', 'opacity', {
4127
 
        test: function() {
4128
 
            return DOCUMENT && 'opacity' in DOCUMENT[DOCUMENT_ELEMENT].style;
4129
 
        }
4130
 
    });
4131
 
 
4132
 
    ret =  (!testFeature('style', 'opacity') &&
4133
 
            !testFeature('style', 'computedStyle'));
4134
 
 
4135
 
    return ret;
4136
 
}, 
4137
 
    "trigger": "dom-style"
4138
 
});
4139
 
// selector-css2
4140
 
add('load', '10', {
4141
 
    "name": "selector-css2", 
4142
 
    "test": function (Y) {
4143
 
    var DOCUMENT = Y.config.doc,
4144
 
        ret = DOCUMENT && !('querySelectorAll' in DOCUMENT);
4145
 
 
4146
 
    return ret;
4147
 
}, 
4148
 
    "trigger": "selector"
4149
 
});
4150
 
// widget-base-ie
4151
 
add('load', '11', {
4152
 
    "name": "widget-base-ie", 
4153
 
    "trigger": "widget-base", 
4154
 
    "ua": "ie"
4155
 
});
4156
 
// event-base-ie
4157
 
add('load', '12', {
4158
 
    "name": "event-base-ie", 
4159
 
    "test": function(Y) {
4160
 
    var imp = Y.config.doc && Y.config.doc.implementation;
4161
 
    return (imp && (!imp.hasFeature('Events', '2.0')));
4162
 
}, 
4163
 
    "trigger": "node-base"
4164
 
});
4165
 
// dd-gestures
4166
 
add('load', '13', {
4167
 
    "name": "dd-gestures", 
4168
 
    "test": function(Y) {
4169
 
    return ((Y.config.win && ("ontouchstart" in Y.config.win)) && !(Y.UA.chrome && Y.UA.chrome < 6));
4170
 
}, 
4171
 
    "trigger": "dd-drag"
4172
 
});
4173
 
// scrollview-base-ie
4174
 
add('load', '14', {
4175
 
    "name": "scrollview-base-ie", 
4176
 
    "trigger": "scrollview-base", 
4177
 
    "ua": "ie"
4178
 
});
4179
 
// app-transitions-native
4180
 
add('load', '15', {
4181
 
    "name": "app-transitions-native", 
4182
 
    "test": function (Y) {
4183
 
    var doc  = Y.config.doc,
4184
 
        node = doc ? doc.documentElement : null;
4185
 
 
4186
 
    if (node && node.style) {
4187
 
        return ('MozTransition' in node.style || 'WebkitTransition' in node.style);
4188
 
    }
4189
 
 
4190
 
    return false;
4191
 
}, 
4192
 
    "trigger": "app-transitions"
4193
 
});
4194
 
// graphics-canvas
4195
 
add('load', '16', {
4196
 
    "name": "graphics-canvas", 
4197
 
    "test": function(Y) {
4198
 
    var DOCUMENT = Y.config.doc,
4199
 
        useCanvas = Y.config.defaultGraphicEngine && Y.config.defaultGraphicEngine == "canvas",
4200
 
                canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
4201
 
        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
4202
 
    return (!svg || useCanvas) && (canvas && canvas.getContext && canvas.getContext("2d"));
4203
 
}, 
4204
 
    "trigger": "graphics"
4205
 
});
4206
 
// graphics-vml
4207
 
add('load', '17', {
4208
 
    "name": "graphics-vml", 
4209
 
    "test": function(Y) {
4210
 
    var DOCUMENT = Y.config.doc,
4211
 
                canvas = DOCUMENT && DOCUMENT.createElement("canvas");
4212
 
    return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
4213
 
}, 
4214
 
    "trigger": "graphics"
4215
 
});
4216
 
 
4217
 
 
4218
 
}, '3.5.1' ,{requires:['yui-base']});
4219
 
YUI.add('intl-base', function(Y) {
4220
 
 
4221
 
/**
4222
 
 * The Intl utility provides a central location for managing sets of
4223
 
 * localized resources (strings and formatting patterns).
4224
 
 *
4225
 
 * @class Intl
4226
 
 * @uses EventTarget
4227
 
 * @static
4228
 
 */
4229
 
 
4230
 
var SPLIT_REGEX = /[, ]/;
4231
 
 
4232
 
Y.mix(Y.namespace('Intl'), {
4233
 
 
4234
 
 /**
4235
 
    * Returns the language among those available that
4236
 
    * best matches the preferred language list, using the Lookup
4237
 
    * algorithm of BCP 47.
4238
 
    * If none of the available languages meets the user's preferences,
4239
 
    * then "" is returned.
4240
 
    * Extended language ranges are not supported.
4241
 
    *
4242
 
    * @method lookupBestLang
4243
 
    * @param {String[] | String} preferredLanguages The list of preferred
4244
 
    * languages in descending preference order, represented as BCP 47
4245
 
    * language tags. A string array or a comma-separated list.
4246
 
    * @param {String[]} availableLanguages The list of languages
4247
 
    * that the application supports, represented as BCP 47 language
4248
 
    * tags.
4249
 
    *
4250
 
    * @return {String} The available language that best matches the
4251
 
    * preferred language list, or "".
4252
 
    * @since 3.1.0
4253
 
    */
4254
 
    lookupBestLang: function(preferredLanguages, availableLanguages) {
4255
 
 
4256
 
        var i, language, result, index;
4257
 
 
4258
 
        // check whether the list of available languages contains language;
4259
 
        // if so return it
4260
 
        function scan(language) {
4261
 
            var i;
4262
 
            for (i = 0; i < availableLanguages.length; i += 1) {
4263
 
                if (language.toLowerCase() ===
4264
 
                            availableLanguages[i].toLowerCase()) {
4265
 
                    return availableLanguages[i];
4266
 
                }
4267
 
            }
4268
 
        }
4269
 
 
4270
 
        if (Y.Lang.isString(preferredLanguages)) {
4271
 
            preferredLanguages = preferredLanguages.split(SPLIT_REGEX);
4272
 
        }
4273
 
 
4274
 
        for (i = 0; i < preferredLanguages.length; i += 1) {
4275
 
            language = preferredLanguages[i];
4276
 
            if (!language || language === '*') {
4277
 
                continue;
4278
 
            }
4279
 
            // check the fallback sequence for one language
4280
 
            while (language.length > 0) {
4281
 
                result = scan(language);
4282
 
                if (result) {
4283
 
                    return result;
4284
 
                } else {
4285
 
                    index = language.lastIndexOf('-');
4286
 
                    if (index >= 0) {
4287
 
                        language = language.substring(0, index);
4288
 
                        // one-character subtags get cut along with the
4289
 
                        // following subtag
4290
 
                        if (index >= 2 && language.charAt(index - 2) === '-') {
4291
 
                            language = language.substring(0, index - 2);
4292
 
                        }
4293
 
                    } else {
4294
 
                        // nothing available for this language
4295
 
                        break;
4296
 
                    }
4297
 
                }
4298
 
            }
4299
 
        }
4300
 
 
4301
 
        return '';
4302
 
    }
4303
 
});
4304
 
 
4305
 
 
4306
 
}, '3.5.1' ,{requires:['yui-base']});
4307
 
YUI.add('yui-log', function(Y) {
4308
 
 
4309
 
/**
4310
 
 * Provides console log capability and exposes a custom event for
4311
 
 * console implementations. This module is a `core` YUI module, <a href="../classes/YUI.html#method_log">it's documentation is located under the YUI class</a>.
4312
 
 *
4313
 
 * @module yui
4314
 
 * @submodule yui-log
4315
 
 */
4316
 
 
4317
 
var INSTANCE = Y,
4318
 
    LOGEVENT = 'yui:log',
4319
 
    UNDEFINED = 'undefined',
4320
 
    LEVELS = { debug: 1,
4321
 
               info: 1,
4322
 
               warn: 1,
4323
 
               error: 1 };
4324
 
 
4325
 
/**
4326
 
 * If the 'debug' config is true, a 'yui:log' event will be
4327
 
 * dispatched, which the Console widget and anything else
4328
 
 * can consume.  If the 'useBrowserConsole' config is true, it will
4329
 
 * write to the browser console if available.  YUI-specific log
4330
 
 * messages will only be present in the -debug versions of the
4331
 
 * JS files.  The build system is supposed to remove log statements
4332
 
 * from the raw and minified versions of the files.
4333
 
 *
4334
 
 * @method log
4335
 
 * @for YUI
4336
 
 * @param  {String}  msg  The message to log.
4337
 
 * @param  {String}  cat  The log category for the message.  Default
4338
 
 *                        categories are "info", "warn", "error", time".
4339
 
 *                        Custom categories can be used as well. (opt).
4340
 
 * @param  {String}  src  The source of the the message (opt).
4341
 
 * @param  {boolean} silent If true, the log event won't fire.
4342
 
 * @return {YUI}      YUI instance.
4343
 
 */
4344
 
INSTANCE.log = function(msg, cat, src, silent) {
4345
 
    var bail, excl, incl, m, f,
4346
 
        Y = INSTANCE,
4347
 
        c = Y.config,
4348
 
        publisher = (Y.fire) ? Y : YUI.Env.globalEvents;
4349
 
    // suppress log message if the config is off or the event stack
4350
 
    // or the event call stack contains a consumer of the yui:log event
4351
 
    if (c.debug) {
4352
 
        // apply source filters
4353
 
        if (src) {
4354
 
            excl = c.logExclude;
4355
 
            incl = c.logInclude;
4356
 
            if (incl && !(src in incl)) {
4357
 
                bail = 1;
4358
 
            } else if (incl && (src in incl)) {
4359
 
                bail = !incl[src];
4360
 
            } else if (excl && (src in excl)) {
4361
 
                bail = excl[src];
4362
 
            }
4363
 
        }
4364
 
        if (!bail) {
4365
 
            if (c.useBrowserConsole) {
4366
 
                m = (src) ? src + ': ' + msg : msg;
4367
 
                if (Y.Lang.isFunction(c.logFn)) {
4368
 
                    c.logFn.call(Y, msg, cat, src);
4369
 
                } else if (typeof console != UNDEFINED && console.log) {
4370
 
                    f = (cat && console[cat] && (cat in LEVELS)) ? cat : 'log';
4371
 
                    console[f](m);
4372
 
                } else if (typeof opera != UNDEFINED) {
4373
 
                    opera.postError(m);
4374
 
                }
4375
 
            }
4376
 
 
4377
 
            if (publisher && !silent) {
4378
 
 
4379
 
                if (publisher == Y && (!publisher.getEvent(LOGEVENT))) {
4380
 
                    publisher.publish(LOGEVENT, {
4381
 
                        broadcast: 2
4382
 
                    });
4383
 
                }
4384
 
 
4385
 
                publisher.fire(LOGEVENT, {
4386
 
                    msg: msg,
4387
 
                    cat: cat,
4388
 
                    src: src
4389
 
                });
4390
 
            }
4391
 
        }
4392
 
    }
4393
 
 
4394
 
    return Y;
4395
 
};
4396
 
 
4397
 
/**
4398
 
 * Write a system message.  This message will be preserved in the
4399
 
 * minified and raw versions of the YUI files, unlike log statements.
4400
 
 * @method message
4401
 
 * @for YUI
4402
 
 * @param  {String}  msg  The message to log.
4403
 
 * @param  {String}  cat  The log category for the message.  Default
4404
 
 *                        categories are "info", "warn", "error", time".
4405
 
 *                        Custom categories can be used as well. (opt).
4406
 
 * @param  {String}  src  The source of the the message (opt).
4407
 
 * @param  {boolean} silent If true, the log event won't fire.
4408
 
 * @return {YUI}      YUI instance.
4409
 
 */
4410
 
INSTANCE.message = function() {
4411
 
    return INSTANCE.log.apply(INSTANCE, arguments);
4412
 
};
4413
 
 
4414
 
 
4415
 
}, '3.5.1' ,{requires:['yui-base']});
4416
 
YUI.add('yui-log-nodejs', function(Y) {
4417
 
 
4418
 
var sys = require(process.binding('natives').util ? 'util' : 'sys'),
4419
 
    hasColor = false;
4420
 
 
4421
 
try {
4422
 
    var stdio = require("stdio");
4423
 
    hasColor = stdio.isStderrATTY();
4424
 
} catch (ex) {
4425
 
    hasColor = true;
4426
 
}
4427
 
 
4428
 
Y.config.useColor = hasColor;
4429
 
 
4430
 
Y.consoleColor = function(str, num) {
4431
 
    if (!this.config.useColor) {
4432
 
        return str;
4433
 
    }
4434
 
    if (!num) {
4435
 
        num = '32';
4436
 
    }
4437
 
    return "\033[" + num +"m" + str + "\033[0m"
4438
 
};
4439
 
 
4440
 
 
4441
 
var logFn = function(str, t, m) {
4442
 
    var id = '';
4443
 
    if (this.id) {
4444
 
        id = '[' + this.id + ']:';
4445
 
    }
4446
 
    t = t || 'info';
4447
 
    m = (m) ? this.consoleColor(' (' +  m.toLowerCase() + '):', 35) : '';
4448
 
    
4449
 
    if (str === null) {
4450
 
        str = 'null';
4451
 
    }
4452
 
 
4453
 
    if ((typeof str === 'object') || str instanceof Array) {
4454
 
        try {
4455
 
            //Should we use this?
4456
 
            if (str.tagName || str._yuid || str._query) {
4457
 
                str = str.toString();
4458
 
            } else {
4459
 
                str = sys.inspect(str);
4460
 
            }
4461
 
        } catch (e) {
4462
 
            //Fail catcher
4463
 
        }
4464
 
    }
4465
 
 
4466
 
    var lvl = '37;40', mLvl = ((str) ? '' : 31);
4467
 
    t = t+''; //Force to a string..
4468
 
    switch (t.toLowerCase()) {
4469
 
        case 'error':
4470
 
            lvl = mLvl = 31;
4471
 
            break;
4472
 
        case 'warn':
4473
 
            lvl = 33;
4474
 
            break;
4475
 
        case 'debug':
4476
 
            lvl = 34;
4477
 
            break;
4478
 
    }
4479
 
    if (typeof str === 'string') {
4480
 
        if (str && str.indexOf("\n") !== -1) {
4481
 
            str = "\n" + str;
4482
 
        }
4483
 
    }
4484
 
 
4485
 
    // output log messages to stderr
4486
 
    sys.error(this.consoleColor(t.toLowerCase() + ':', lvl) + m + ' ' + this.consoleColor(str, mLvl));
4487
 
};
4488
 
 
4489
 
if (!Y.config.logFn) {
4490
 
    Y.config.logFn = logFn;
4491
 
}
4492
 
 
4493
 
 
4494
 
 
4495
 
}, '3.5.1' ,{requires:['yui-log']});
4496
 
YUI.add('yui-later', function(Y) {
4497
 
 
4498
 
/**
4499
 
 * Provides a setTimeout/setInterval wrapper. This module is a `core` YUI module, <a href="../classes/YUI.html#method_later">it's documentation is located under the YUI class</a>.
4500
 
 *
4501
 
 * @module yui
4502
 
 * @submodule yui-later
4503
 
 */
4504
 
 
4505
 
var NO_ARGS = [];
4506
 
 
4507
 
/**
4508
 
 * Executes the supplied function in the context of the supplied
4509
 
 * object 'when' milliseconds later.  Executes the function a
4510
 
 * single time unless periodic is set to true.
4511
 
 * @for YUI
4512
 
 * @method later
4513
 
 * @param when {int} the number of milliseconds to wait until the fn
4514
 
 * is executed.
4515
 
 * @param o the context object.
4516
 
 * @param fn {Function|String} the function to execute or the name of
4517
 
 * the method in the 'o' object to execute.
4518
 
 * @param data [Array] data that is provided to the function.  This
4519
 
 * accepts either a single item or an array.  If an array is provided,
4520
 
 * the function is executed with one parameter for each array item.
4521
 
 * If you need to pass a single array parameter, it needs to be wrapped
4522
 
 * in an array [myarray].
4523
 
 *
4524
 
 * Note: native methods in IE may not have the call and apply methods.
4525
 
 * In this case, it will work, but you are limited to four arguments.
4526
 
 *
4527
 
 * @param periodic {boolean} if true, executes continuously at supplied
4528
 
 * interval until canceled.
4529
 
 * @return {object} a timer object. Call the cancel() method on this
4530
 
 * object to stop the timer.
4531
 
 */
4532
 
Y.later = function(when, o, fn, data, periodic) {
4533
 
    when = when || 0;
4534
 
    data = (!Y.Lang.isUndefined(data)) ? Y.Array(data) : NO_ARGS;
4535
 
    o = o || Y.config.win || Y;
4536
 
 
4537
 
    var cancelled = false,
4538
 
        method = (o && Y.Lang.isString(fn)) ? o[fn] : fn,
4539
 
        wrapper = function() {
4540
 
            // IE 8- may execute a setInterval callback one last time
4541
 
            // after clearInterval was called, so in order to preserve
4542
 
            // the cancel() === no more runny-run, we have to jump through
4543
 
            // an extra hoop.
4544
 
            if (!cancelled) {
4545
 
                if (!method.apply) {
4546
 
                    method(data[0], data[1], data[2], data[3]);
4547
 
                } else {
4548
 
                    method.apply(o, data || NO_ARGS);
4549
 
                }
4550
 
            }
4551
 
        },
4552
 
        id = (periodic) ? setInterval(wrapper, when) : setTimeout(wrapper, when);
4553
 
 
4554
 
    return {
4555
 
        id: id,
4556
 
        interval: periodic,
4557
 
        cancel: function() {
4558
 
            cancelled = true;
4559
 
            if (this.interval) {
4560
 
                clearInterval(id);
4561
 
            } else {
4562
 
                clearTimeout(id);
4563
 
            }
4564
 
        }
4565
 
    };
4566
 
};
4567
 
 
4568
 
Y.Lang.later = Y.later;
4569
 
 
4570
 
 
4571
 
 
4572
 
}, '3.5.1' ,{requires:['yui-base']});
4573
 
YUI.add('loader-base', function(Y) {
4574
 
 
4575
 
/**
4576
 
 * The YUI loader core
4577
 
 * @module loader
4578
 
 * @submodule loader-base
4579
 
 */
4580
 
 
4581
 
if (!YUI.Env[Y.version]) {
4582
 
 
4583
 
    (function() {
4584
 
        var VERSION = Y.version,
4585
 
            BUILD = '/build/',
4586
 
            ROOT = VERSION + BUILD,
4587
 
            CDN_BASE = Y.Env.base,
4588
 
            GALLERY_VERSION = '${loader.gallery}',
4589
 
            TNT = '2in3',
4590
 
            TNT_VERSION = '${loader.tnt}',
4591
 
            YUI2_VERSION = '${loader.yui2}',
4592
 
            COMBO_BASE = CDN_BASE + 'combo?',
4593
 
            META = { version: VERSION,
4594
 
                              root: ROOT,
4595
 
                              base: Y.Env.base,
4596
 
                              comboBase: COMBO_BASE,
4597
 
                              skin: { defaultSkin: 'sam',
4598
 
                                           base: 'assets/skins/',
4599
 
                                           path: 'skin.css',
4600
 
                                           after: ['cssreset',
4601
 
                                                          'cssfonts',
4602
 
                                                          'cssgrids',
4603
 
                                                          'cssbase',
4604
 
                                                          'cssreset-context',
4605
 
                                                          'cssfonts-context']},
4606
 
                              groups: {},
4607
 
                              patterns: {} },
4608
 
            groups = META.groups,
4609
 
            yui2Update = function(tnt, yui2, config) {
4610
 
                    
4611
 
                var root = TNT + '.' +
4612
 
                        (tnt || TNT_VERSION) + '/' +
4613
 
                        (yui2 || YUI2_VERSION) + BUILD,
4614
 
                    base = (config && config.base) ? config.base : CDN_BASE,
4615
 
                    combo = (config && config.comboBase) ? config.comboBase : COMBO_BASE;
4616
 
 
4617
 
                groups.yui2.base = base + root;
4618
 
                groups.yui2.root = root;
4619
 
                groups.yui2.comboBase = combo;
4620
 
            },
4621
 
            galleryUpdate = function(tag, config) {
4622
 
                var root = (tag || GALLERY_VERSION) + BUILD,
4623
 
                    base = (config && config.base) ? config.base : CDN_BASE,
4624
 
                    combo = (config && config.comboBase) ? config.comboBase : COMBO_BASE;
4625
 
 
4626
 
                groups.gallery.base = base + root;
4627
 
                groups.gallery.root = root;
4628
 
                groups.gallery.comboBase = combo;
4629
 
            };
4630
 
 
4631
 
 
4632
 
        groups[VERSION] = {};
4633
 
 
4634
 
        groups.gallery = {
4635
 
            ext: false,
4636
 
            combine: true,
4637
 
            comboBase: COMBO_BASE,
4638
 
            update: galleryUpdate,
4639
 
            patterns: { 'gallery-': { },
4640
 
                        'lang/gallery-': {},
4641
 
                        'gallerycss-': { type: 'css' } }
4642
 
        };
4643
 
 
4644
 
        groups.yui2 = {
4645
 
            combine: true,
4646
 
            ext: false,
4647
 
            comboBase: COMBO_BASE,
4648
 
            update: yui2Update,
4649
 
            patterns: {
4650
 
                'yui2-': {
4651
 
                    configFn: function(me) {
4652
 
                        if (/-skin|reset|fonts|grids|base/.test(me.name)) {
4653
 
                            me.type = 'css';
4654
 
                            me.path = me.path.replace(/\.js/, '.css');
4655
 
                            // this makes skins in builds earlier than
4656
 
                            // 2.6.0 work as long as combine is false
4657
 
                            me.path = me.path.replace(/\/yui2-skin/,
4658
 
                                             '/assets/skins/sam/yui2-skin');
4659
 
                        }
4660
 
                    }
4661
 
                }
4662
 
            }
4663
 
        };
4664
 
 
4665
 
        galleryUpdate();
4666
 
        yui2Update();
4667
 
 
4668
 
        YUI.Env[VERSION] = META;
4669
 
    }());
4670
 
}
4671
 
 
4672
 
 
4673
 
/**
4674
 
 * Loader dynamically loads script and css files.  It includes the dependency
4675
 
 * information for the version of the library in use, and will automatically pull in
4676
 
 * dependencies for the modules requested. It can also load the
4677
 
 * files from the Yahoo! CDN, and it can utilize the combo service provided on
4678
 
 * this network to reduce the number of http connections required to download
4679
 
 * YUI files.
4680
 
 *
4681
 
 * @module loader
4682
 
 * @main loader
4683
 
 * @submodule loader-base
4684
 
 */
4685
 
 
4686
 
var NOT_FOUND = {},
4687
 
    NO_REQUIREMENTS = [],
4688
 
    MAX_URL_LENGTH = 1024,
4689
 
    GLOBAL_ENV = YUI.Env,
4690
 
    GLOBAL_LOADED = GLOBAL_ENV._loaded,
4691
 
    CSS = 'css',
4692
 
    JS = 'js',
4693
 
    INTL = 'intl',
4694
 
    VERSION = Y.version,
4695
 
    ROOT_LANG = '',
4696
 
    YObject = Y.Object,
4697
 
    oeach = YObject.each,
4698
 
    YArray = Y.Array,
4699
 
    _queue = GLOBAL_ENV._loaderQueue,
4700
 
    META = GLOBAL_ENV[VERSION],
4701
 
    SKIN_PREFIX = 'skin-',
4702
 
    L = Y.Lang,
4703
 
    ON_PAGE = GLOBAL_ENV.mods,
4704
 
    modulekey,
4705
 
    cache,
4706
 
    _path = function(dir, file, type, nomin) {
4707
 
                        var path = dir + '/' + file;
4708
 
                        if (!nomin) {
4709
 
                            path += '-min';
4710
 
                        }
4711
 
                        path += '.' + (type || CSS);
4712
 
 
4713
 
                        return path;
4714
 
                    };
4715
 
 
4716
 
/**
4717
 
 * The component metadata is stored in Y.Env.meta.
4718
 
 * Part of the loader module.
4719
 
 * @property meta
4720
 
 * @for YUI
4721
 
 */
4722
 
Y.Env.meta = META;
4723
 
 
4724
 
/**
4725
 
 * Loader dynamically loads script and css files.  It includes the dependency
4726
 
 * info for the version of the library in use, and will automatically pull in
4727
 
 * dependencies for the modules requested. It can load the
4728
 
 * files from the Yahoo! CDN, and it can utilize the combo service provided on
4729
 
 * this network to reduce the number of http connections required to download
4730
 
 * YUI files. You can also specify an external, custom combo service to host
4731
 
 * your modules as well.
4732
 
 
4733
 
        var Y = YUI();
4734
 
        var loader = new Y.Loader({
4735
 
            filter: 'debug',
4736
 
            base: '../../',
4737
 
            root: 'build/',
4738
 
            combine: true,
4739
 
            require: ['node', 'dd', 'console']
4740
 
        });
4741
 
        var out = loader.resolve(true);
4742
 
 
4743
 
 * @constructor
4744
 
 * @class Loader
4745
 
 * @param {Object} config an optional set of configuration options.
4746
 
 * @param {String} config.base The base dir which to fetch this module from
4747
 
 * @param {String} config.comboBase The Combo service base path. Ex: `http://yui.yahooapis.com/combo?`
4748
 
 * @param {String} config.root The root path to prepend to module names for the combo service. Ex: `2.5.2/build/`
4749
 
 * @param {String|Object} config.filter A filter to apply to result urls. <a href="#property_filter">See filter property</a>
4750
 
 * @param {Object} config.filters Per-component filter specification.  If specified for a given component, this overrides the filter config.
4751
 
 * @param {Boolean} config.combine Use a combo service to reduce the number of http connections required to load your dependencies
4752
 
 * @param {Array} config.ignore: A list of modules that should never be dynamically loaded
4753
 
 * @param {Array} config.force A list of modules that should always be loaded when required, even if already present on the page
4754
 
 * @param {HTMLElement|String} config.insertBefore Node or id for a node that should be used as the insertion point for new nodes
4755
 
 * @param {Object} config.jsAttributes Object literal containing attributes to add to script nodes
4756
 
 * @param {Object} config.cssAttributes Object literal containing attributes to add to link nodes
4757
 
 * @param {Number} config.timeout The number of milliseconds before a timeout occurs when dynamically loading nodes.  If not set, there is no timeout
4758
 
 * @param {Object} config.context Execution context for all callbacks
4759
 
 * @param {Function} config.onSuccess Callback for the 'success' event
4760
 
 * @param {Function} config.onFailure Callback for the 'failure' event
4761
 
 * @param {Function} config.onCSS Callback for the 'CSSComplete' event.  When loading YUI components with CSS the CSS is loaded first, then the script.  This provides a moment you can tie into to improve the presentation of the page while the script is loading.
4762
 
 * @param {Function} config.onTimeout Callback for the 'timeout' event
4763
 
 * @param {Function} config.onProgress Callback executed each time a script or css file is loaded
4764
 
 * @param {Object} config.modules A list of module definitions.  See <a href="#method_addModule">Loader.addModule</a> for the supported module metadata
4765
 
 * @param {Object} config.groups A list of group definitions.  Each group can contain specific definitions for `base`, `comboBase`, `combine`, and accepts a list of `modules`.
4766
 
 * @param {String} config.2in3 The version of the YUI 2 in 3 wrapper to use.  The intrinsic support for YUI 2 modules in YUI 3 relies on versions of the YUI 2 components inside YUI 3 module wrappers.  These wrappers change over time to accomodate the issues that arise from running YUI 2 in a YUI 3 sandbox.
4767
 
 * @param {String} config.yui2 When using the 2in3 project, you can select the version of YUI 2 to use.  Valid values are `2.2.2`, `2.3.1`, `2.4.1`, `2.5.2`, `2.6.0`, `2.7.0`, `2.8.0`, `2.8.1` and `2.9.0` [default] -- plus all versions of YUI 2 going forward.
4768
 
 */
4769
 
Y.Loader = function(o) {
4770
 
 
4771
 
    var defaults = META.modules,
4772
 
        self = this;
4773
 
    
4774
 
    //Catch no config passed.
4775
 
    o = o || {};
4776
 
 
4777
 
    modulekey = META.md5;
4778
 
 
4779
 
    /**
4780
 
     * Internal callback to handle multiple internal insert() calls
4781
 
     * so that css is inserted prior to js
4782
 
     * @property _internalCallback
4783
 
     * @private
4784
 
     */
4785
 
    // self._internalCallback = null;
4786
 
 
4787
 
    /**
4788
 
     * Callback that will be executed when the loader is finished
4789
 
     * with an insert
4790
 
     * @method onSuccess
4791
 
     * @type function
4792
 
     */
4793
 
    // self.onSuccess = null;
4794
 
 
4795
 
    /**
4796
 
     * Callback that will be executed if there is a failure
4797
 
     * @method onFailure
4798
 
     * @type function
4799
 
     */
4800
 
    // self.onFailure = null;
4801
 
 
4802
 
    /**
4803
 
     * Callback for the 'CSSComplete' event.  When loading YUI components
4804
 
     * with CSS the CSS is loaded first, then the script.  This provides
4805
 
     * a moment you can tie into to improve the presentation of the page
4806
 
     * while the script is loading.
4807
 
     * @method onCSS
4808
 
     * @type function
4809
 
     */
4810
 
    // self.onCSS = null;
4811
 
 
4812
 
    /**
4813
 
     * Callback executed each time a script or css file is loaded
4814
 
     * @method onProgress
4815
 
     * @type function
4816
 
     */
4817
 
    // self.onProgress = null;
4818
 
 
4819
 
    /**
4820
 
     * Callback that will be executed if a timeout occurs
4821
 
     * @method onTimeout
4822
 
     * @type function
4823
 
     */
4824
 
    // self.onTimeout = null;
4825
 
 
4826
 
    /**
4827
 
     * The execution context for all callbacks
4828
 
     * @property context
4829
 
     * @default {YUI} the YUI instance
4830
 
     */
4831
 
    self.context = Y;
4832
 
 
4833
 
    /**
4834
 
     * Data that is passed to all callbacks
4835
 
     * @property data
4836
 
     */
4837
 
    // self.data = null;
4838
 
 
4839
 
    /**
4840
 
     * Node reference or id where new nodes should be inserted before
4841
 
     * @property insertBefore
4842
 
     * @type string|HTMLElement
4843
 
     */
4844
 
    // self.insertBefore = null;
4845
 
 
4846
 
    /**
4847
 
     * The charset attribute for inserted nodes
4848
 
     * @property charset
4849
 
     * @type string
4850
 
     * @deprecated , use cssAttributes or jsAttributes.
4851
 
     */
4852
 
    // self.charset = null;
4853
 
 
4854
 
    /**
4855
 
     * An object literal containing attributes to add to link nodes
4856
 
     * @property cssAttributes
4857
 
     * @type object
4858
 
     */
4859
 
    // self.cssAttributes = null;
4860
 
 
4861
 
    /**
4862
 
     * An object literal containing attributes to add to script nodes
4863
 
     * @property jsAttributes
4864
 
     * @type object
4865
 
     */
4866
 
    // self.jsAttributes = null;
4867
 
 
4868
 
    /**
4869
 
     * The base directory.
4870
 
     * @property base
4871
 
     * @type string
4872
 
     * @default http://yui.yahooapis.com/[YUI VERSION]/build/
4873
 
     */
4874
 
    self.base = Y.Env.meta.base + Y.Env.meta.root;
4875
 
 
4876
 
    /**
4877
 
     * Base path for the combo service
4878
 
     * @property comboBase
4879
 
     * @type string
4880
 
     * @default http://yui.yahooapis.com/combo?
4881
 
     */
4882
 
    self.comboBase = Y.Env.meta.comboBase;
4883
 
 
4884
 
    /*
4885
 
     * Base path for language packs.
4886
 
     */
4887
 
    // self.langBase = Y.Env.meta.langBase;
4888
 
    // self.lang = "";
4889
 
 
4890
 
    /**
4891
 
     * If configured, the loader will attempt to use the combo
4892
 
     * service for YUI resources and configured external resources.
4893
 
     * @property combine
4894
 
     * @type boolean
4895
 
     * @default true if a base dir isn't in the config
4896
 
     */
4897
 
    self.combine = o.base &&
4898
 
        (o.base.indexOf(self.comboBase.substr(0, 20)) > -1);
4899
 
    
4900
 
    /**
4901
 
    * The default seperator to use between files in a combo URL
4902
 
    * @property comboSep
4903
 
    * @type {String}
4904
 
    * @default Ampersand
4905
 
    */
4906
 
    self.comboSep = '&';
4907
 
    /**
4908
 
     * Max url length for combo urls.  The default is 2048. This is the URL
4909
 
     * limit for the Yahoo! hosted combo servers.  If consuming
4910
 
     * a different combo service that has a different URL limit
4911
 
     * it is possible to override this default by supplying
4912
 
     * the maxURLLength config option.  The config option will
4913
 
     * only take effect if lower than the default.
4914
 
     *
4915
 
     * @property maxURLLength
4916
 
     * @type int
4917
 
     */
4918
 
    self.maxURLLength = MAX_URL_LENGTH;
4919
 
 
4920
 
    /**
4921
 
     * Ignore modules registered on the YUI global
4922
 
     * @property ignoreRegistered
4923
 
     * @default false
4924
 
     */
4925
 
    //self.ignoreRegistered = false;
4926
 
 
4927
 
    /**
4928
 
     * Root path to prepend to module path for the combo
4929
 
     * service
4930
 
     * @property root
4931
 
     * @type string
4932
 
     * @default [YUI VERSION]/build/
4933
 
     */
4934
 
    self.root = Y.Env.meta.root;
4935
 
 
4936
 
    /**
4937
 
     * Timeout value in milliseconds.  If set, self value will be used by
4938
 
     * the get utility.  the timeout event will fire if
4939
 
     * a timeout occurs.
4940
 
     * @property timeout
4941
 
     * @type int
4942
 
     */
4943
 
    self.timeout = 0;
4944
 
 
4945
 
    /**
4946
 
     * A list of modules that should not be loaded, even if
4947
 
     * they turn up in the dependency tree
4948
 
     * @property ignore
4949
 
     * @type string[]
4950
 
     */
4951
 
    // self.ignore = null;
4952
 
 
4953
 
    /**
4954
 
     * A list of modules that should always be loaded, even
4955
 
     * if they have already been inserted into the page.
4956
 
     * @property force
4957
 
     * @type string[]
4958
 
     */
4959
 
    // self.force = null;
4960
 
 
4961
 
    self.forceMap = {};
4962
 
 
4963
 
    /**
4964
 
     * Should we allow rollups
4965
 
     * @property allowRollup
4966
 
     * @type boolean
4967
 
     * @default false
4968
 
     */
4969
 
    self.allowRollup = false;
4970
 
 
4971
 
    /**
4972
 
     * A filter to apply to result urls.  This filter will modify the default
4973
 
     * path for all modules.  The default path for the YUI library is the
4974
 
     * minified version of the files (e.g., event-min.js).  The filter property
4975
 
     * can be a predefined filter or a custom filter.  The valid predefined
4976
 
     * filters are:
4977
 
     * <dl>
4978
 
     *  <dt>DEBUG</dt>
4979
 
     *  <dd>Selects the debug versions of the library (e.g., event-debug.js).
4980
 
     *      This option will automatically include the Logger widget</dd>
4981
 
     *  <dt>RAW</dt>
4982
 
     *  <dd>Selects the non-minified version of the library (e.g., event.js).
4983
 
     *  </dd>
4984
 
     * </dl>
4985
 
     * You can also define a custom filter, which must be an object literal
4986
 
     * containing a search expression and a replace string:
4987
 
     *
4988
 
     *      myFilter: {
4989
 
     *          'searchExp': "-min\\.js",
4990
 
     *          'replaceStr': "-debug.js"
4991
 
     *      }
4992
 
     *
4993
 
     * @property filter
4994
 
     * @type string| {searchExp: string, replaceStr: string}
4995
 
     */
4996
 
    // self.filter = null;
4997
 
 
4998
 
    /**
4999
 
     * per-component filter specification.  If specified for a given
5000
 
     * component, this overrides the filter config.
5001
 
     * @property filters
5002
 
     * @type object
5003
 
     */
5004
 
    self.filters = {};
5005
 
 
5006
 
    /**
5007
 
     * The list of requested modules
5008
 
     * @property required
5009
 
     * @type {string: boolean}
5010
 
     */
5011
 
    self.required = {};
5012
 
 
5013
 
    /**
5014
 
     * If a module name is predefined when requested, it is checked againsts
5015
 
     * the patterns provided in this property.  If there is a match, the
5016
 
     * module is added with the default configuration.
5017
 
     *
5018
 
     * At the moment only supporting module prefixes, but anticipate
5019
 
     * supporting at least regular expressions.
5020
 
     * @property patterns
5021
 
     * @type Object
5022
 
     */
5023
 
    // self.patterns = Y.merge(Y.Env.meta.patterns);
5024
 
    self.patterns = {};
5025
 
 
5026
 
    /**
5027
 
     * The library metadata
5028
 
     * @property moduleInfo
5029
 
     */
5030
 
    // self.moduleInfo = Y.merge(Y.Env.meta.moduleInfo);
5031
 
    self.moduleInfo = {};
5032
 
 
5033
 
    self.groups = Y.merge(Y.Env.meta.groups);
5034
 
 
5035
 
    /**
5036
 
     * Provides the information used to skin the skinnable components.
5037
 
     * The following skin definition would result in 'skin1' and 'skin2'
5038
 
     * being loaded for calendar (if calendar was requested), and
5039
 
     * 'sam' for all other skinnable components:
5040
 
     *
5041
 
     *      skin: {
5042
 
     *          // The default skin, which is automatically applied if not
5043
 
     *          // overriden by a component-specific skin definition.
5044
 
     *          // Change this in to apply a different skin globally
5045
 
     *          defaultSkin: 'sam',
5046
 
     *
5047
 
     *          // This is combined with the loader base property to get
5048
 
     *          // the default root directory for a skin. ex:
5049
 
     *          // http://yui.yahooapis.com/2.3.0/build/assets/skins/sam/
5050
 
     *          base: 'assets/skins/',
5051
 
     *          
5052
 
     *          // Any component-specific overrides can be specified here,
5053
 
     *          // making it possible to load different skins for different
5054
 
     *          // components.  It is possible to load more than one skin
5055
 
     *          // for a given component as well.
5056
 
     *          overrides: {
5057
 
     *              calendar: ['skin1', 'skin2']
5058
 
     *          }
5059
 
     *      }
5060
 
     * @property skin
5061
 
     * @type {Object}
5062
 
     */
5063
 
    self.skin = Y.merge(Y.Env.meta.skin);
5064
 
 
5065
 
    /*
5066
 
     * Map of conditional modules
5067
 
     * @since 3.2.0
5068
 
     */
5069
 
    self.conditions = {};
5070
 
 
5071
 
    // map of modules with a hash of modules that meet the requirement
5072
 
    // self.provides = {};
5073
 
 
5074
 
    self.config = o;
5075
 
    self._internal = true;
5076
 
 
5077
 
 
5078
 
    cache = GLOBAL_ENV._renderedMods;
5079
 
 
5080
 
    if (cache) {
5081
 
        oeach(cache, function modCache(v, k) {
5082
 
            self.moduleInfo[k] = Y.merge(v);
5083
 
        });
5084
 
 
5085
 
        cache = GLOBAL_ENV._conditions;
5086
 
 
5087
 
        oeach(cache, function condCache(v, k) {
5088
 
            self.conditions[k] = Y.merge(v);
5089
 
        });
5090
 
 
5091
 
    } else {
5092
 
        oeach(defaults, self.addModule, self);
5093
 
    }
5094
 
 
5095
 
 
5096
 
    /**
5097
 
     * Set when beginning to compute the dependency tree.
5098
 
     * Composed of what YUI reports to be loaded combined
5099
 
     * with what has been loaded by any instance on the page
5100
 
     * with the version number specified in the metadata.
5101
 
     * @property loaded
5102
 
     * @type {string: boolean}
5103
 
     */
5104
 
    self.loaded = GLOBAL_LOADED[VERSION];
5105
 
 
5106
 
 
5107
 
    self._inspectPage();
5108
 
 
5109
 
    self._internal = false;
5110
 
 
5111
 
    self._config(o);
5112
 
 
5113
 
    self.forceMap = (self.force) ? Y.Array.hash(self.force) : {};       
5114
 
 
5115
 
    self.testresults = null;
5116
 
 
5117
 
    if (Y.config.tests) {
5118
 
        self.testresults = Y.config.tests;
5119
 
    }
5120
 
 
5121
 
    /**
5122
 
     * List of rollup files found in the library metadata
5123
 
     * @property rollups
5124
 
     */
5125
 
    // self.rollups = null;
5126
 
 
5127
 
    /**
5128
 
     * Whether or not to load optional dependencies for
5129
 
     * the requested modules
5130
 
     * @property loadOptional
5131
 
     * @type boolean
5132
 
     * @default false
5133
 
     */
5134
 
    // self.loadOptional = false;
5135
 
 
5136
 
    /**
5137
 
     * All of the derived dependencies in sorted order, which
5138
 
     * will be populated when either calculate() or insert()
5139
 
     * is called
5140
 
     * @property sorted
5141
 
     * @type string[]
5142
 
     */
5143
 
    self.sorted = [];
5144
 
 
5145
 
    /*
5146
 
     * A list of modules to attach to the YUI instance when complete.
5147
 
     * If not supplied, the sorted list of dependencies are applied.
5148
 
     * @property attaching
5149
 
     */
5150
 
    // self.attaching = null;
5151
 
 
5152
 
    /**
5153
 
     * Flag to indicate the dependency tree needs to be recomputed
5154
 
     * if insert is called again.
5155
 
     * @property dirty
5156
 
     * @type boolean
5157
 
     * @default true
5158
 
     */
5159
 
    self.dirty = true;
5160
 
 
5161
 
    /**
5162
 
     * List of modules inserted by the utility
5163
 
     * @property inserted
5164
 
     * @type {string: boolean}
5165
 
     */
5166
 
    self.inserted = {};
5167
 
 
5168
 
    /**
5169
 
     * List of skipped modules during insert() because the module
5170
 
     * was not defined
5171
 
     * @property skipped
5172
 
     */
5173
 
    self.skipped = {};
5174
 
 
5175
 
    // Y.on('yui:load', self.loadNext, self);
5176
 
 
5177
 
    self.tested = {};
5178
 
 
5179
 
    /*
5180
 
     * Cached sorted calculate results
5181
 
     * @property results
5182
 
     * @since 3.2.0
5183
 
     */
5184
 
    //self.results = {};
5185
 
 
5186
 
};
5187
 
 
5188
 
Y.Loader.prototype = {
5189
 
    /**
5190
 
    Regex that matches a CSS URL. Used to guess the file type when it's not
5191
 
    specified.
5192
 
 
5193
 
    @property REGEX_CSS
5194
 
    @type RegExp
5195
 
    @final
5196
 
    @protected
5197
 
    @since 3.5.0
5198
 
    **/
5199
 
    REGEX_CSS: /\.css(?:[?;].*)?$/i,
5200
 
    
5201
 
    /**
5202
 
    * Default filters for raw and debug
5203
 
    * @property FILTER_DEFS
5204
 
    * @type Object
5205
 
    * @final
5206
 
    * @protected
5207
 
    */
5208
 
    FILTER_DEFS: {
5209
 
        RAW: {
5210
 
            'searchExp': '-min\\.js',
5211
 
            'replaceStr': '.js'
5212
 
        },
5213
 
        DEBUG: {
5214
 
            'searchExp': '-min\\.js',
5215
 
            'replaceStr': '-debug.js'
5216
 
        }
5217
 
    },
5218
 
    /*
5219
 
    * Check the pages meta-data and cache the result.
5220
 
    * @method _inspectPage
5221
 
    * @private
5222
 
    */
5223
 
    _inspectPage: function() {
5224
 
        
5225
 
        //Inspect the page for CSS only modules and mark them as loaded.
5226
 
        oeach(this.moduleInfo, function(v, k) {
5227
 
            if (v.type && v.type === CSS) {
5228
 
                if (this.isCSSLoaded(v.name)) {
5229
 
                    Y.log('Found CSS module on page: ' + v.name, 'info', 'loader');
5230
 
                    this.loaded[k] = true;
5231
 
                }
5232
 
            }
5233
 
        }, this);
5234
 
        
5235
 
        oeach(ON_PAGE, function(v, k) {
5236
 
           if (v.details) {
5237
 
               var m = this.moduleInfo[k],
5238
 
                   req = v.details.requires,
5239
 
                   mr = m && m.requires;
5240
 
               if (m) {
5241
 
                   if (!m._inspected && req && mr.length != req.length) {
5242
 
                       // console.log('deleting ' + m.name);
5243
 
                       delete m.expanded;
5244
 
                   }
5245
 
               } else {
5246
 
                   m = this.addModule(v.details, k);
5247
 
               }
5248
 
               m._inspected = true;
5249
 
           }
5250
 
       }, this);
5251
 
    },
5252
 
    /*
5253
 
    * returns true if b is not loaded, and is required directly or by means of modules it supersedes.
5254
 
    * @private
5255
 
    * @method _requires
5256
 
    * @param {String} mod1 The first module to compare
5257
 
    * @param {String} mod2 The second module to compare
5258
 
    */
5259
 
   _requires: function(mod1, mod2) {
5260
 
 
5261
 
        var i, rm, after_map, s,
5262
 
            info = this.moduleInfo,
5263
 
            m = info[mod1],
5264
 
            other = info[mod2];
5265
 
 
5266
 
        if (!m || !other) {
5267
 
            return false;
5268
 
        }
5269
 
 
5270
 
        rm = m.expanded_map;
5271
 
        after_map = m.after_map;
5272
 
 
5273
 
        // check if this module should be sorted after the other
5274
 
        // do this first to short circut circular deps
5275
 
        if (after_map && (mod2 in after_map)) {
5276
 
            return true;
5277
 
        }
5278
 
 
5279
 
        after_map = other.after_map;
5280
 
 
5281
 
        // and vis-versa
5282
 
        if (after_map && (mod1 in after_map)) {
5283
 
            return false;
5284
 
        }
5285
 
 
5286
 
        // check if this module requires one the other supersedes
5287
 
        s = info[mod2] && info[mod2].supersedes;
5288
 
        if (s) {
5289
 
            for (i = 0; i < s.length; i++) {
5290
 
                if (this._requires(mod1, s[i])) {
5291
 
                    return true;
5292
 
                }
5293
 
            }
5294
 
        }
5295
 
 
5296
 
        s = info[mod1] && info[mod1].supersedes;
5297
 
        if (s) {
5298
 
            for (i = 0; i < s.length; i++) {
5299
 
                if (this._requires(mod2, s[i])) {
5300
 
                    return false;
5301
 
                }
5302
 
            }
5303
 
        }
5304
 
 
5305
 
        // check if this module requires the other directly
5306
 
        // if (r && YArray.indexOf(r, mod2) > -1) {
5307
 
        if (rm && (mod2 in rm)) {
5308
 
            return true;
5309
 
        }
5310
 
 
5311
 
        // external css files should be sorted below yui css
5312
 
        if (m.ext && m.type == CSS && !other.ext && other.type == CSS) {
5313
 
            return true;
5314
 
        }
5315
 
 
5316
 
        return false;
5317
 
    },
5318
 
    /**
5319
 
    * Apply a new config to the Loader instance
5320
 
    * @method _config
5321
 
    * @private
5322
 
    * @param {Object} o The new configuration
5323
 
    */
5324
 
    _config: function(o) {
5325
 
        var i, j, val, f, group, groupName, self = this;
5326
 
        // apply config values
5327
 
        if (o) {
5328
 
            for (i in o) {
5329
 
                if (o.hasOwnProperty(i)) {
5330
 
                    val = o[i];
5331
 
                    if (i == 'require') {
5332
 
                        self.require(val);
5333
 
                    } else if (i == 'skin') {
5334
 
                        //If the config.skin is a string, format to the expected object
5335
 
                        if (typeof val === 'string') {
5336
 
                            self.skin.defaultSkin = o.skin;
5337
 
                            val = {
5338
 
                                defaultSkin: val
5339
 
                            };
5340
 
                        }
5341
 
 
5342
 
                        Y.mix(self.skin, val, true);
5343
 
                    } else if (i == 'groups') {
5344
 
                        for (j in val) {
5345
 
                            if (val.hasOwnProperty(j)) {
5346
 
                                // Y.log('group: ' + j);
5347
 
                                groupName = j;
5348
 
                                group = val[j];
5349
 
                                self.addGroup(group, groupName);
5350
 
                                if (group.aliases) {
5351
 
                                    oeach(group.aliases, self.addAlias, self);
5352
 
                                }
5353
 
                            }
5354
 
                        }
5355
 
 
5356
 
                    } else if (i == 'modules') {
5357
 
                        // add a hash of module definitions
5358
 
                        oeach(val, self.addModule, self);
5359
 
                    } else if (i === 'aliases') {
5360
 
                        oeach(val, self.addAlias, self);
5361
 
                    } else if (i == 'gallery') {
5362
 
                        this.groups.gallery.update(val, o);
5363
 
                    } else if (i == 'yui2' || i == '2in3') {
5364
 
                        this.groups.yui2.update(o['2in3'], o.yui2, o);
5365
 
                    } else {
5366
 
                        self[i] = val;
5367
 
                    }
5368
 
                }
5369
 
            }
5370
 
        }
5371
 
 
5372
 
        // fix filter
5373
 
        f = self.filter;
5374
 
 
5375
 
        if (L.isString(f)) {
5376
 
            f = f.toUpperCase();
5377
 
            self.filterName = f;
5378
 
            self.filter = self.FILTER_DEFS[f];
5379
 
            if (f == 'DEBUG') {
5380
 
                self.require('yui-log', 'dump');
5381
 
            }
5382
 
        }
5383
 
        
5384
 
 
5385
 
        if (self.lang) {
5386
 
            //Removed this so that when Loader is invoked
5387
 
            //it doesn't request what it doesn't need.
5388
 
            //self.require('intl-base', 'intl');
5389
 
        }
5390
 
 
5391
 
    },
5392
 
 
5393
 
    /**
5394
 
     * Returns the skin module name for the specified skin name.  If a
5395
 
     * module name is supplied, the returned skin module name is
5396
 
     * specific to the module passed in.
5397
 
     * @method formatSkin
5398
 
     * @param {string} skin the name of the skin.
5399
 
     * @param {string} mod optional: the name of a module to skin.
5400
 
     * @return {string} the full skin module name.
5401
 
     */
5402
 
    formatSkin: function(skin, mod) {
5403
 
        var s = SKIN_PREFIX + skin;
5404
 
        if (mod) {
5405
 
            s = s + '-' + mod;
5406
 
        }
5407
 
 
5408
 
        return s;
5409
 
    },
5410
 
 
5411
 
    /**
5412
 
     * Adds the skin def to the module info
5413
 
     * @method _addSkin
5414
 
     * @param {string} skin the name of the skin.
5415
 
     * @param {string} mod the name of the module.
5416
 
     * @param {string} parent parent module if this is a skin of a
5417
 
     * submodule or plugin.
5418
 
     * @return {string} the module name for the skin.
5419
 
     * @private
5420
 
     */
5421
 
    _addSkin: function(skin, mod, parent) {
5422
 
        var mdef, pkg, name, nmod,
5423
 
            info = this.moduleInfo,
5424
 
            sinf = this.skin,
5425
 
            ext = info[mod] && info[mod].ext;
5426
 
 
5427
 
        // Add a module definition for the module-specific skin css
5428
 
        if (mod) {
5429
 
            name = this.formatSkin(skin, mod);
5430
 
            if (!info[name]) {
5431
 
                mdef = info[mod];
5432
 
                pkg = mdef.pkg || mod;
5433
 
                nmod = {
5434
 
                    name: name,
5435
 
                    group: mdef.group,
5436
 
                    type: 'css',
5437
 
                    after: sinf.after,
5438
 
                    path: (parent || pkg) + '/' + sinf.base + skin +
5439
 
                          '/' + mod + '.css',
5440
 
                    ext: ext
5441
 
                };
5442
 
                if (mdef.base) {
5443
 
                    nmod.base = mdef.base;
5444
 
                }
5445
 
                if (mdef.configFn) {
5446
 
                    nmod.configFn = mdef.configFn;
5447
 
                }
5448
 
                this.addModule(nmod, name);
5449
 
 
5450
 
                Y.log('Adding skin (' + name + '), ' + parent + ', ' + pkg + ', ' + info[name].path, 'info', 'loader');
5451
 
            }
5452
 
        }
5453
 
 
5454
 
        return name;
5455
 
    },
5456
 
    /**
5457
 
    * Adds an alias module to the system
5458
 
    * @method addAlias
5459
 
    * @param {Array} use An array of modules that makes up this alias
5460
 
    * @param {String} name The name of the alias
5461
 
    * @example
5462
 
    *       var loader = new Y.Loader({});
5463
 
    *       loader.addAlias([ 'node', 'yql' ], 'davglass');
5464
 
    *       loader.require(['davglass']);
5465
 
    *       var out = loader.resolve(true);
5466
 
    *
5467
 
    *       //out.js will contain Node and YQL modules
5468
 
    */
5469
 
    addAlias: function(use, name) {
5470
 
        YUI.Env.aliases[name] = use;
5471
 
        this.addModule({
5472
 
            name: name,
5473
 
            use: use
5474
 
        });
5475
 
    },
5476
 
    /**
5477
 
     * Add a new module group
5478
 
     * @method addGroup
5479
 
     * @param {Object} config An object containing the group configuration data
5480
 
     * @param {String} config.name required, the group name
5481
 
     * @param {String} config.base The base directory for this module group
5482
 
     * @param {String} config.root The root path to add to each combo resource path
5483
 
     * @param {Boolean} config.combine Should the request be combined
5484
 
     * @param {String} config.comboBase Combo service base path
5485
 
     * @param {Object} config.modules The group of modules
5486
 
     * @param {String} name the group name.
5487
 
     * @example
5488
 
     *      var loader = new Y.Loader({});
5489
 
     *      loader.addGroup({
5490
 
     *          name: 'davglass',
5491
 
     *          combine: true,
5492
 
     *          comboBase: '/combo?',
5493
 
     *          root: '',
5494
 
     *          modules: {
5495
 
     *              //Module List here
5496
 
     *          }
5497
 
     *      }, 'davglass');
5498
 
     */
5499
 
    addGroup: function(o, name) {
5500
 
        var mods = o.modules,
5501
 
            self = this;
5502
 
        name = name || o.name;
5503
 
        o.name = name;
5504
 
        self.groups[name] = o;
5505
 
 
5506
 
        if (o.patterns) {
5507
 
            oeach(o.patterns, function(v, k) {
5508
 
                v.group = name;
5509
 
                self.patterns[k] = v;
5510
 
            });
5511
 
        }
5512
 
 
5513
 
        if (mods) {
5514
 
            oeach(mods, function(v, k) {
5515
 
                if (typeof v === 'string') {
5516
 
                    v = { name: k, fullpath: v };
5517
 
                }
5518
 
                v.group = name;
5519
 
                self.addModule(v, k);
5520
 
            }, self);
5521
 
        }
5522
 
    },
5523
 
 
5524
 
    /**
5525
 
     * Add a new module to the component metadata.
5526
 
     * @method addModule
5527
 
     * @param {Object} config An object containing the module data.
5528
 
     * @param {String} config.name Required, the component name
5529
 
     * @param {String} config.type Required, the component type (js or css)
5530
 
     * @param {String} config.path Required, the path to the script from `base`
5531
 
     * @param {Array} config.requires Array of modules required by this component
5532
 
     * @param {Array} [config.optional] Array of optional modules for this component
5533
 
     * @param {Array} [config.supersedes] Array of the modules this component replaces
5534
 
     * @param {Array} [config.after] Array of modules the components which, if present, should be sorted above this one
5535
 
     * @param {Object} [config.after_map] Faster alternative to 'after' -- supply a hash instead of an array
5536
 
     * @param {Number} [config.rollup] The number of superseded modules required for automatic rollup
5537
 
     * @param {String} [config.fullpath] If `fullpath` is specified, this is used instead of the configured `base + path`
5538
 
     * @param {Boolean} [config.skinnable] Flag to determine if skin assets should automatically be pulled in
5539
 
     * @param {Object} [config.submodules] Hash of submodules
5540
 
     * @param {String} [config.group] The group the module belongs to -- this is set automatically when it is added as part of a group configuration.
5541
 
     * @param {Array} [config.lang] Array of BCP 47 language tags of languages for which this module has localized resource bundles, e.g., `["en-GB", "zh-Hans-CN"]`
5542
 
     * @param {Object} [config.condition] Specifies that the module should be loaded automatically if a condition is met.  This is an object with up to three fields:
5543
 
     * @param {String} [config.condition.trigger] The name of a module that can trigger the auto-load
5544
 
     * @param {Function} [config.condition.test] A function that returns true when the module is to be loaded.
5545
 
     * @param {String} [config.condition.when] Specifies the load order of the conditional module
5546
 
     *  with regard to the position of the trigger module.
5547
 
     *  This should be one of three values: `before`, `after`, or `instead`.  The default is `after`.
5548
 
     * @param {Object} [config.testresults] A hash of test results from `Y.Features.all()`
5549
 
     * @param {Function} [config.configFn] A function to exectute when configuring this module
5550
 
     * @param {Object} config.configFn.mod The module config, modifying this object will modify it's config. Returning false will delete the module's config.
5551
 
     * @param {String} [name] The module name, required if not in the module data.
5552
 
     * @return {Object} the module definition or null if the object passed in did not provide all required attributes.
5553
 
     */
5554
 
    addModule: function(o, name) {
5555
 
        name = name || o.name;
5556
 
 
5557
 
        if (typeof o === 'string') {
5558
 
            o = { name: name, fullpath: o };
5559
 
        }
5560
 
        
5561
 
        //Only merge this data if the temp flag is set
5562
 
        //from an earlier pass from a pattern or else
5563
 
        //an override module (YUI_config) can not be used to
5564
 
        //replace a default module.
5565
 
        if (this.moduleInfo[name] && this.moduleInfo[name].temp) {
5566
 
            //This catches temp modules loaded via a pattern
5567
 
            // The module will be added twice, once from the pattern and
5568
 
            // Once from the actual add call, this ensures that properties
5569
 
            // that were added to the module the first time around (group: gallery)
5570
 
            // are also added the second time around too.
5571
 
            o = Y.merge(this.moduleInfo[name], o);
5572
 
        }
5573
 
 
5574
 
        o.name = name;
5575
 
 
5576
 
        if (!o || !o.name) {
5577
 
            return null;
5578
 
        }
5579
 
 
5580
 
        if (!o.type) {
5581
 
            //Always assume it's javascript unless the CSS pattern is matched.
5582
 
            o.type = JS;
5583
 
            var p = o.path || o.fullpath;
5584
 
            if (p && this.REGEX_CSS.test(p)) {
5585
 
                Y.log('Auto determined module type as CSS', 'warn', 'loader');
5586
 
                o.type = CSS;
5587
 
            }
5588
 
        }
5589
 
 
5590
 
        if (!o.path && !o.fullpath) {
5591
 
            o.path = _path(name, name, o.type);
5592
 
        }
5593
 
        o.supersedes = o.supersedes || o.use;
5594
 
 
5595
 
        o.ext = ('ext' in o) ? o.ext : (this._internal) ? false : true;
5596
 
 
5597
 
        // Handle submodule logic
5598
 
        var subs = o.submodules, i, l, t, sup, s, smod, plugins, plug,
5599
 
            j, langs, packName, supName, flatSup, flatLang, lang, ret,
5600
 
            overrides, skinname, when,
5601
 
            conditions = this.conditions, trigger;
5602
 
            // , existing = this.moduleInfo[name], newr;
5603
 
        
5604
 
        this.moduleInfo[name] = o;
5605
 
 
5606
 
        o.requires = o.requires || [];
5607
 
 
5608
 
        if (o.skinnable) {
5609
 
            skinname = this._addSkin(this.skin.defaultSkin, name);
5610
 
            o.requires.unshift(skinname);
5611
 
        }
5612
 
 
5613
 
        o.requires = this.filterRequires(o.requires) || [];
5614
 
 
5615
 
        if (!o.langPack && o.lang) {
5616
 
            langs = YArray(o.lang);
5617
 
            for (j = 0; j < langs.length; j++) {
5618
 
                lang = langs[j];
5619
 
                packName = this.getLangPackName(lang, name);
5620
 
                smod = this.moduleInfo[packName];
5621
 
                if (!smod) {
5622
 
                    smod = this._addLangPack(lang, o, packName);
5623
 
                }
5624
 
            }
5625
 
        }
5626
 
 
5627
 
 
5628
 
        if (subs) {
5629
 
            sup = o.supersedes || [];
5630
 
            l = 0;
5631
 
 
5632
 
            for (i in subs) {
5633
 
                if (subs.hasOwnProperty(i)) {
5634
 
                    s = subs[i];
5635
 
 
5636
 
                    s.path = s.path || _path(name, i, o.type);
5637
 
                    s.pkg = name;
5638
 
                    s.group = o.group;
5639
 
 
5640
 
                    if (s.supersedes) {
5641
 
                        sup = sup.concat(s.supersedes);
5642
 
                    }
5643
 
 
5644
 
                    smod = this.addModule(s, i);
5645
 
                    sup.push(i);
5646
 
 
5647
 
                    if (smod.skinnable) {
5648
 
                        o.skinnable = true;
5649
 
                        overrides = this.skin.overrides;
5650
 
                        if (overrides && overrides[i]) {
5651
 
                            for (j = 0; j < overrides[i].length; j++) {
5652
 
                                skinname = this._addSkin(overrides[i][j],
5653
 
                                         i, name);
5654
 
                                sup.push(skinname);
5655
 
                            }
5656
 
                        }
5657
 
                        skinname = this._addSkin(this.skin.defaultSkin,
5658
 
                                        i, name);
5659
 
                        sup.push(skinname);
5660
 
                    }
5661
 
 
5662
 
                    // looks like we are expected to work out the metadata
5663
 
                    // for the parent module language packs from what is
5664
 
                    // specified in the child modules.
5665
 
                    if (s.lang && s.lang.length) {
5666
 
 
5667
 
                        langs = YArray(s.lang);
5668
 
                        for (j = 0; j < langs.length; j++) {
5669
 
                            lang = langs[j];
5670
 
                            packName = this.getLangPackName(lang, name);
5671
 
                            supName = this.getLangPackName(lang, i);
5672
 
                            smod = this.moduleInfo[packName];
5673
 
 
5674
 
                            if (!smod) {
5675
 
                                smod = this._addLangPack(lang, o, packName);
5676
 
                            }
5677
 
 
5678
 
                            flatSup = flatSup || YArray.hash(smod.supersedes);
5679
 
 
5680
 
                            if (!(supName in flatSup)) {
5681
 
                                smod.supersedes.push(supName);
5682
 
                            }
5683
 
 
5684
 
                            o.lang = o.lang || [];
5685
 
 
5686
 
                            flatLang = flatLang || YArray.hash(o.lang);
5687
 
 
5688
 
                            if (!(lang in flatLang)) {
5689
 
                                o.lang.push(lang);
5690
 
                            }
5691
 
 
5692
 
// Y.log('pack ' + packName + ' should supersede ' + supName);
5693
 
// Add rollup file, need to add to supersedes list too
5694
 
 
5695
 
                            // default packages
5696
 
                            packName = this.getLangPackName(ROOT_LANG, name);
5697
 
                            supName = this.getLangPackName(ROOT_LANG, i);
5698
 
 
5699
 
                            smod = this.moduleInfo[packName];
5700
 
 
5701
 
                            if (!smod) {
5702
 
                                smod = this._addLangPack(lang, o, packName);
5703
 
                            }
5704
 
 
5705
 
                            if (!(supName in flatSup)) {
5706
 
                                smod.supersedes.push(supName);
5707
 
                            }
5708
 
 
5709
 
// Y.log('pack ' + packName + ' should supersede ' + supName);
5710
 
// Add rollup file, need to add to supersedes list too
5711
 
 
5712
 
                        }
5713
 
                    }
5714
 
 
5715
 
                    l++;
5716
 
                }
5717
 
            }
5718
 
            //o.supersedes = YObject.keys(YArray.hash(sup));
5719
 
            o.supersedes = YArray.dedupe(sup);
5720
 
            if (this.allowRollup) {
5721
 
                o.rollup = (l < 4) ? l : Math.min(l - 1, 4);
5722
 
            }
5723
 
        }
5724
 
 
5725
 
        plugins = o.plugins;
5726
 
        if (plugins) {
5727
 
            for (i in plugins) {
5728
 
                if (plugins.hasOwnProperty(i)) {
5729
 
                    plug = plugins[i];
5730
 
                    plug.pkg = name;
5731
 
                    plug.path = plug.path || _path(name, i, o.type);
5732
 
                    plug.requires = plug.requires || [];
5733
 
                    plug.group = o.group;
5734
 
                    this.addModule(plug, i);
5735
 
                    if (o.skinnable) {
5736
 
                        this._addSkin(this.skin.defaultSkin, i, name);
5737
 
                    }
5738
 
 
5739
 
                }
5740
 
            }
5741
 
        }
5742
 
 
5743
 
        if (o.condition) {
5744
 
            t = o.condition.trigger;
5745
 
            if (YUI.Env.aliases[t]) {
5746
 
                t = YUI.Env.aliases[t];
5747
 
            }
5748
 
            if (!Y.Lang.isArray(t)) {
5749
 
                t = [t];
5750
 
            }
5751
 
 
5752
 
            for (i = 0; i < t.length; i++) {
5753
 
                trigger = t[i];
5754
 
                when = o.condition.when;
5755
 
                conditions[trigger] = conditions[trigger] || {};
5756
 
                conditions[trigger][name] = o.condition;
5757
 
                // the 'when' attribute can be 'before', 'after', or 'instead'
5758
 
                // the default is after.
5759
 
                if (when && when != 'after') {
5760
 
                    if (when == 'instead') { // replace the trigger
5761
 
                        o.supersedes = o.supersedes || [];
5762
 
                        o.supersedes.push(trigger);
5763
 
                    } else { // before the trigger
5764
 
                        // the trigger requires the conditional mod,
5765
 
                        // so it should appear before the conditional
5766
 
                        // mod if we do not intersede.
5767
 
                    }
5768
 
                } else { // after the trigger
5769
 
                    o.after = o.after || [];
5770
 
                    o.after.push(trigger);
5771
 
                }
5772
 
            }
5773
 
        }
5774
 
 
5775
 
        if (o.supersedes) {
5776
 
            o.supersedes = this.filterRequires(o.supersedes);
5777
 
        }
5778
 
 
5779
 
        if (o.after) {
5780
 
            o.after = this.filterRequires(o.after);
5781
 
            o.after_map = YArray.hash(o.after);
5782
 
        }
5783
 
 
5784
 
        // this.dirty = true;
5785
 
 
5786
 
        if (o.configFn) {
5787
 
            ret = o.configFn(o);
5788
 
            if (ret === false) {
5789
 
                Y.log('Config function returned false for ' + name + ', skipping.', 'info', 'loader');
5790
 
                delete this.moduleInfo[name];
5791
 
                delete GLOBAL_ENV._renderedMods[name];
5792
 
                o = null;
5793
 
            }
5794
 
        }
5795
 
        //Add to global cache
5796
 
        if (o) {
5797
 
            if (!GLOBAL_ENV._renderedMods) {
5798
 
                GLOBAL_ENV._renderedMods = {};
5799
 
            }
5800
 
            GLOBAL_ENV._renderedMods[name] = Y.merge(o);
5801
 
            GLOBAL_ENV._conditions = conditions;
5802
 
        }
5803
 
 
5804
 
        return o;
5805
 
    },
5806
 
 
5807
 
    /**
5808
 
     * Add a requirement for one or more module
5809
 
     * @method require
5810
 
     * @param {string[] | string*} what the modules to load.
5811
 
     */
5812
 
    require: function(what) {
5813
 
        var a = (typeof what === 'string') ? YArray(arguments) : what;
5814
 
        this.dirty = true;
5815
 
        this.required = Y.merge(this.required, YArray.hash(this.filterRequires(a)));
5816
 
 
5817
 
        this._explodeRollups();
5818
 
    },
5819
 
    /**
5820
 
    * Grab all the items that were asked for, check to see if the Loader
5821
 
    * meta-data contains a "use" array. If it doesm remove the asked item and replace it with 
5822
 
    * the content of the "use".
5823
 
    * This will make asking for: "dd"
5824
 
    * Actually ask for: "dd-ddm-base,dd-ddm,dd-ddm-drop,dd-drag,dd-proxy,dd-constrain,dd-drop,dd-scroll,dd-drop-plugin"
5825
 
    * @private
5826
 
    * @method _explodeRollups
5827
 
    */
5828
 
    _explodeRollups: function() {
5829
 
        var self = this, m,
5830
 
        r = self.required;
5831
 
        if (!self.allowRollup) {
5832
 
            oeach(r, function(v, name) {
5833
 
                m = self.getModule(name);
5834
 
                if (m && m.use) {
5835
 
                    //delete r[name];
5836
 
                    YArray.each(m.use, function(v) {
5837
 
                        m = self.getModule(v);
5838
 
                        if (m && m.use) {
5839
 
                            //delete r[v];
5840
 
                            YArray.each(m.use, function(v) {
5841
 
                                r[v] = true;
5842
 
                            });
5843
 
                        } else {
5844
 
                            r[v] = true;
5845
 
                        }
5846
 
                    });
5847
 
                }
5848
 
            });
5849
 
            self.required = r;
5850
 
        }
5851
 
 
5852
 
    },
5853
 
    /**
5854
 
    * Explodes the required array to remove aliases and replace them with real modules
5855
 
    * @method filterRequires
5856
 
    * @param {Array} r The original requires array
5857
 
    * @return {Array} The new array of exploded requirements
5858
 
    */
5859
 
    filterRequires: function(r) {
5860
 
        if (r) {
5861
 
            if (!Y.Lang.isArray(r)) {
5862
 
                r = [r];
5863
 
            }
5864
 
            r = Y.Array(r);
5865
 
            var c = [], i, mod, o, m;
5866
 
 
5867
 
            for (i = 0; i < r.length; i++) {
5868
 
                mod = this.getModule(r[i]);
5869
 
                if (mod && mod.use) {
5870
 
                    for (o = 0; o < mod.use.length; o++) {
5871
 
                        //Must walk the other modules in case a module is a rollup of rollups (datatype)
5872
 
                        m = this.getModule(mod.use[o]);
5873
 
                        if (m && m.use) {
5874
 
                            c = Y.Array.dedupe([].concat(c, this.filterRequires(m.use)));
5875
 
                        } else {
5876
 
                            c.push(mod.use[o]);
5877
 
                        }
5878
 
                    }
5879
 
                } else {
5880
 
                    c.push(r[i]);
5881
 
                }
5882
 
            }
5883
 
            r = c;
5884
 
        }
5885
 
        return r;
5886
 
    },
5887
 
    /**
5888
 
     * Returns an object containing properties for all modules required
5889
 
     * in order to load the requested module
5890
 
     * @method getRequires
5891
 
     * @param {object}  mod The module definition from moduleInfo.
5892
 
     * @return {array} the expanded requirement list.
5893
 
     */
5894
 
    getRequires: function(mod) {
5895
 
 
5896
 
        if (!mod) {
5897
 
            //console.log('returning no reqs for ' + mod.name);
5898
 
            return NO_REQUIREMENTS;
5899
 
        }
5900
 
 
5901
 
        if (mod._parsed) {
5902
 
            //console.log('returning requires for ' + mod.name, mod.requires);
5903
 
            return mod.expanded || NO_REQUIREMENTS;
5904
 
        }
5905
 
 
5906
 
        //TODO add modue cache here out of scope..
5907
 
 
5908
 
        var i, m, j, add, packName, lang, testresults = this.testresults,
5909
 
            name = mod.name, cond,
5910
 
            adddef = ON_PAGE[name] && ON_PAGE[name].details,
5911
 
            d, k, m1,
5912
 
            r, old_mod,
5913
 
            o, skinmod, skindef, skinpar, skinname,
5914
 
            intl = mod.lang || mod.intl,
5915
 
            info = this.moduleInfo,
5916
 
            ftests = Y.Features && Y.Features.tests.load,
5917
 
            hash;
5918
 
 
5919
 
        // console.log(name);
5920
 
 
5921
 
        // pattern match leaves module stub that needs to be filled out
5922
 
        if (mod.temp && adddef) {
5923
 
            old_mod = mod;
5924
 
            mod = this.addModule(adddef, name);
5925
 
            mod.group = old_mod.group;
5926
 
            mod.pkg = old_mod.pkg;
5927
 
            delete mod.expanded;
5928
 
        }
5929
 
 
5930
 
        // console.log('cache: ' + mod.langCache + ' == ' + this.lang);
5931
 
 
5932
 
        // if (mod.expanded && (!mod.langCache || mod.langCache == this.lang)) {
5933
 
        if (mod.expanded && (!this.lang || mod.langCache === this.lang)) {
5934
 
            //Y.log('Already expanded ' + name + ', ' + mod.expanded);
5935
 
            return mod.expanded;
5936
 
        }
5937
 
        
5938
 
 
5939
 
        d = [];
5940
 
        hash = {};
5941
 
        r = this.filterRequires(mod.requires);
5942
 
        if (mod.lang) {
5943
 
            //If a module has a lang attribute, auto add the intl requirement.
5944
 
            d.unshift('intl');
5945
 
            r.unshift('intl');
5946
 
            intl = true;
5947
 
        }
5948
 
        o = this.filterRequires(mod.optional);
5949
 
 
5950
 
        // Y.log("getRequires: " + name + " (dirty:" + this.dirty +
5951
 
        // ", expanded:" + mod.expanded + ")");
5952
 
 
5953
 
        mod._parsed = true;
5954
 
        mod.langCache = this.lang;
5955
 
 
5956
 
        for (i = 0; i < r.length; i++) {
5957
 
            //Y.log(name + ' requiring ' + r[i], 'info', 'loader');
5958
 
            if (!hash[r[i]]) {
5959
 
                d.push(r[i]);
5960
 
                hash[r[i]] = true;
5961
 
                m = this.getModule(r[i]);
5962
 
                if (m) {
5963
 
                    add = this.getRequires(m);
5964
 
                    intl = intl || (m.expanded_map &&
5965
 
                        (INTL in m.expanded_map));
5966
 
                    for (j = 0; j < add.length; j++) {
5967
 
                        d.push(add[j]);
5968
 
                    }
5969
 
                }
5970
 
            }
5971
 
        }
5972
 
 
5973
 
        // get the requirements from superseded modules, if any
5974
 
        r = this.filterRequires(mod.supersedes);
5975
 
        if (r) {
5976
 
            for (i = 0; i < r.length; i++) {
5977
 
                if (!hash[r[i]]) {
5978
 
                    // if this module has submodules, the requirements list is
5979
 
                    // expanded to include the submodules.  This is so we can
5980
 
                    // prevent dups when a submodule is already loaded and the
5981
 
                    // parent is requested.
5982
 
                    if (mod.submodules) {
5983
 
                        d.push(r[i]);
5984
 
                    }
5985
 
 
5986
 
                    hash[r[i]] = true;
5987
 
                    m = this.getModule(r[i]);
5988
 
 
5989
 
                    if (m) {
5990
 
                        add = this.getRequires(m);
5991
 
                        intl = intl || (m.expanded_map &&
5992
 
                            (INTL in m.expanded_map));
5993
 
                        for (j = 0; j < add.length; j++) {
5994
 
                            d.push(add[j]);
5995
 
                        }
5996
 
                    }
5997
 
                }
5998
 
            }
5999
 
        }
6000
 
 
6001
 
        if (o && this.loadOptional) {
6002
 
            for (i = 0; i < o.length; i++) {
6003
 
                if (!hash[o[i]]) {
6004
 
                    d.push(o[i]);
6005
 
                    hash[o[i]] = true;
6006
 
                    m = info[o[i]];
6007
 
                    if (m) {
6008
 
                        add = this.getRequires(m);
6009
 
                        intl = intl || (m.expanded_map &&
6010
 
                            (INTL in m.expanded_map));
6011
 
                        for (j = 0; j < add.length; j++) {
6012
 
                            d.push(add[j]);
6013
 
                        }
6014
 
                    }
6015
 
                }
6016
 
            }
6017
 
        }
6018
 
 
6019
 
        cond = this.conditions[name];
6020
 
 
6021
 
        if (cond) {
6022
 
            //Set the module to not parsed since we have conditionals and this could change the dependency tree.
6023
 
            mod._parsed = false;
6024
 
            if (testresults && ftests) {
6025
 
                oeach(testresults, function(result, id) {
6026
 
                    var condmod = ftests[id].name;
6027
 
                    if (!hash[condmod] && ftests[id].trigger == name) {
6028
 
                        if (result && ftests[id]) {
6029
 
                            hash[condmod] = true;
6030
 
                            d.push(condmod);
6031
 
                        }
6032
 
                    }
6033
 
                });
6034
 
            } else {
6035
 
                oeach(cond, function(def, condmod) {
6036
 
                    if (!hash[condmod]) {
6037
 
                        //first see if they've specfied a ua check
6038
 
                        //then see if they've got a test fn & if it returns true
6039
 
                        //otherwise just having a condition block is enough
6040
 
                        var go = def && ((!def.ua && !def.test) || (def.ua && Y.UA[def.ua]) ||
6041
 
                                    (def.test && def.test(Y, r)));
6042
 
 
6043
 
                        if (go) {
6044
 
                            hash[condmod] = true;
6045
 
                            d.push(condmod);
6046
 
                            m = this.getModule(condmod);
6047
 
                            if (m) {
6048
 
                                add = this.getRequires(m);
6049
 
                                for (j = 0; j < add.length; j++) {
6050
 
                                    d.push(add[j]);
6051
 
                                }
6052
 
 
6053
 
                            }
6054
 
                        }
6055
 
                    }
6056
 
                }, this);
6057
 
            }
6058
 
        }
6059
 
 
6060
 
        // Create skin modules
6061
 
        if (mod.skinnable) {
6062
 
            skindef = this.skin.overrides;
6063
 
            oeach(YUI.Env.aliases, function(o, n) {
6064
 
                if (Y.Array.indexOf(o, name) > -1) {
6065
 
                    skinpar = n;
6066
 
                }
6067
 
            });
6068
 
            if (skindef && (skindef[name] || (skinpar && skindef[skinpar]))) {
6069
 
                skinname = name;
6070
 
                if (skindef[skinpar]) {
6071
 
                    skinname = skinpar;
6072
 
                }
6073
 
                for (i = 0; i < skindef[skinname].length; i++) {
6074
 
                    skinmod = this._addSkin(skindef[skinname][i], name);
6075
 
                    if (!this.isCSSLoaded(skinmod, this._boot)) {
6076
 
                        d.push(skinmod);
6077
 
                    }
6078
 
                }
6079
 
            } else {
6080
 
                skinmod = this._addSkin(this.skin.defaultSkin, name);
6081
 
                if (!this.isCSSLoaded(skinmod, this._boot)) {
6082
 
                    d.push(skinmod);
6083
 
                }
6084
 
            }
6085
 
        }
6086
 
 
6087
 
        mod._parsed = false;
6088
 
 
6089
 
        if (intl) {
6090
 
 
6091
 
            if (mod.lang && !mod.langPack && Y.Intl) {
6092
 
                lang = Y.Intl.lookupBestLang(this.lang || ROOT_LANG, mod.lang);
6093
 
                //Y.log('Best lang: ' + lang + ', this.lang: ' + this.lang + ', mod.lang: ' + mod.lang);
6094
 
                packName = this.getLangPackName(lang, name);
6095
 
                if (packName) {
6096
 
                    d.unshift(packName);
6097
 
                }
6098
 
            }
6099
 
            d.unshift(INTL);
6100
 
        }
6101
 
 
6102
 
        mod.expanded_map = YArray.hash(d);
6103
 
 
6104
 
        mod.expanded = YObject.keys(mod.expanded_map);
6105
 
 
6106
 
        return mod.expanded;
6107
 
    },
6108
 
    /**
6109
 
    * Check to see if named css module is already loaded on the page
6110
 
    * @method isCSSLoaded
6111
 
    * @param {String} name The name of the css file
6112
 
    * @return Boolean
6113
 
    */
6114
 
    isCSSLoaded: function(name, skip) {
6115
 
        //TODO - Make this call a batching call with name being an array
6116
 
        if (!name || !YUI.Env.cssStampEl || (!skip && this.ignoreRegistered)) {
6117
 
            Y.log('isCSSLoaded was skipped for ' + name, 'warn', 'loader');
6118
 
            return false;
6119
 
        }
6120
 
 
6121
 
        var el = YUI.Env.cssStampEl,
6122
 
            ret = false,
6123
 
            style = el.currentStyle; //IE
6124
 
 
6125
 
        //Add the classname to the element
6126
 
        el.className = name;
6127
 
 
6128
 
        if (!style) {
6129
 
            style = Y.config.doc.defaultView.getComputedStyle(el, null);
6130
 
        }
6131
 
 
6132
 
        if (style && style['display'] === 'none') {
6133
 
            ret = true;
6134
 
        }
6135
 
 
6136
 
        Y.log('Has Skin? ' + name + ' : ' + ret, 'info', 'loader');
6137
 
 
6138
 
        el.className = ''; //Reset the classname to ''
6139
 
        return ret;
6140
 
    },
6141
 
 
6142
 
    /**
6143
 
     * Returns a hash of module names the supplied module satisfies.
6144
 
     * @method getProvides
6145
 
     * @param {string} name The name of the module.
6146
 
     * @return {object} what this module provides.
6147
 
     */
6148
 
    getProvides: function(name) {
6149
 
        var m = this.getModule(name), o, s;
6150
 
            // supmap = this.provides;
6151
 
 
6152
 
        if (!m) {
6153
 
            return NOT_FOUND;
6154
 
        }
6155
 
 
6156
 
        if (m && !m.provides) {
6157
 
            o = {};
6158
 
            s = m.supersedes;
6159
 
 
6160
 
            if (s) {
6161
 
                YArray.each(s, function(v) {
6162
 
                    Y.mix(o, this.getProvides(v));
6163
 
                }, this);
6164
 
            }
6165
 
 
6166
 
            o[name] = true;
6167
 
            m.provides = o;
6168
 
 
6169
 
        }
6170
 
 
6171
 
        return m.provides;
6172
 
    },
6173
 
 
6174
 
    /**
6175
 
     * Calculates the dependency tree, the result is stored in the sorted
6176
 
     * property.
6177
 
     * @method calculate
6178
 
     * @param {object} o optional options object.
6179
 
     * @param {string} type optional argument to prune modules.
6180
 
     */
6181
 
    calculate: function(o, type) {
6182
 
        if (o || type || this.dirty) {
6183
 
 
6184
 
            if (o) {
6185
 
                this._config(o);
6186
 
            }
6187
 
 
6188
 
            if (!this._init) {
6189
 
                this._setup();
6190
 
            }
6191
 
 
6192
 
            this._explode();
6193
 
 
6194
 
            if (this.allowRollup) {
6195
 
                this._rollup();
6196
 
            } else {
6197
 
                this._explodeRollups();
6198
 
            }
6199
 
            this._reduce();
6200
 
            this._sort();
6201
 
        }
6202
 
    },
6203
 
    /**
6204
 
    * Creates a "psuedo" package for languages provided in the lang array
6205
 
    * @method _addLangPack
6206
 
    * @private
6207
 
    * @param {String} lang The language to create
6208
 
    * @param {Object} m The module definition to create the language pack around
6209
 
    * @param {String} packName The name of the package (e.g: lang/datatype-date-en-US)
6210
 
    * @return {Object} The module definition
6211
 
    */
6212
 
    _addLangPack: function(lang, m, packName) {
6213
 
        var name = m.name,
6214
 
            packPath, conf,
6215
 
            existing = this.moduleInfo[packName];
6216
 
 
6217
 
        if (!existing) {
6218
 
 
6219
 
            packPath = _path((m.pkg || name), packName, JS, true);
6220
 
 
6221
 
            conf = {
6222
 
                path: packPath,
6223
 
                intl: true,
6224
 
                langPack: true,
6225
 
                ext: m.ext,
6226
 
                group: m.group,
6227
 
                supersedes: []
6228
 
            };
6229
 
 
6230
 
            if (m.configFn) {
6231
 
                conf.configFn = m.configFn;
6232
 
            }
6233
 
 
6234
 
            this.addModule(conf, packName);
6235
 
 
6236
 
            if (lang) {
6237
 
                Y.Env.lang = Y.Env.lang || {};
6238
 
                Y.Env.lang[lang] = Y.Env.lang[lang] || {};
6239
 
                Y.Env.lang[lang][name] = true;
6240
 
            }
6241
 
        }
6242
 
 
6243
 
        return this.moduleInfo[packName];
6244
 
    },
6245
 
 
6246
 
    /**
6247
 
     * Investigates the current YUI configuration on the page.  By default,
6248
 
     * modules already detected will not be loaded again unless a force
6249
 
     * option is encountered.  Called by calculate()
6250
 
     * @method _setup
6251
 
     * @private
6252
 
     */
6253
 
    _setup: function() {
6254
 
        var info = this.moduleInfo, name, i, j, m, l,
6255
 
            packName;
6256
 
 
6257
 
        for (name in info) {
6258
 
            if (info.hasOwnProperty(name)) {
6259
 
                m = info[name];
6260
 
                if (m) {
6261
 
 
6262
 
                    // remove dups
6263
 
                    //m.requires = YObject.keys(YArray.hash(m.requires));
6264
 
                    m.requires = YArray.dedupe(m.requires);
6265
 
 
6266
 
                    // Create lang pack modules
6267
 
                    if (m.lang && m.lang.length) {
6268
 
                        // Setup root package if the module has lang defined,
6269
 
                        // it needs to provide a root language pack
6270
 
                        packName = this.getLangPackName(ROOT_LANG, name);
6271
 
                        this._addLangPack(null, m, packName);
6272
 
                    }
6273
 
 
6274
 
                }
6275
 
            }
6276
 
        }
6277
 
 
6278
 
 
6279
 
        //l = Y.merge(this.inserted);
6280
 
        l = {};
6281
 
 
6282
 
        // available modules
6283
 
        if (!this.ignoreRegistered) {
6284
 
            Y.mix(l, GLOBAL_ENV.mods);
6285
 
        }
6286
 
 
6287
 
        // add the ignore list to the list of loaded packages
6288
 
        if (this.ignore) {
6289
 
            Y.mix(l, YArray.hash(this.ignore));
6290
 
        }
6291
 
 
6292
 
        // expand the list to include superseded modules
6293
 
        for (j in l) {
6294
 
            if (l.hasOwnProperty(j)) {
6295
 
                Y.mix(l, this.getProvides(j));
6296
 
            }
6297
 
        }
6298
 
 
6299
 
        // remove modules on the force list from the loaded list
6300
 
        if (this.force) {
6301
 
            for (i = 0; i < this.force.length; i++) {
6302
 
                if (this.force[i] in l) {
6303
 
                    delete l[this.force[i]];
6304
 
                }
6305
 
            }
6306
 
        }
6307
 
 
6308
 
        Y.mix(this.loaded, l);
6309
 
 
6310
 
        this._init = true;
6311
 
    },
6312
 
 
6313
 
    /**
6314
 
     * Builds a module name for a language pack
6315
 
     * @method getLangPackName
6316
 
     * @param {string} lang the language code.
6317
 
     * @param {string} mname the module to build it for.
6318
 
     * @return {string} the language pack module name.
6319
 
     */
6320
 
    getLangPackName: function(lang, mname) {
6321
 
        return ('lang/' + mname + ((lang) ? '_' + lang : ''));
6322
 
    },
6323
 
    /**
6324
 
     * Inspects the required modules list looking for additional
6325
 
     * dependencies.  Expands the required list to include all
6326
 
     * required modules.  Called by calculate()
6327
 
     * @method _explode
6328
 
     * @private
6329
 
     */
6330
 
    _explode: function() {
6331
 
        //TODO Move done out of scope
6332
 
        var r = this.required, m, reqs, done = {},
6333
 
            self = this;
6334
 
 
6335
 
        // the setup phase is over, all modules have been created
6336
 
        self.dirty = false;
6337
 
 
6338
 
        self._explodeRollups();
6339
 
        r = self.required;
6340
 
        
6341
 
        oeach(r, function(v, name) {
6342
 
            if (!done[name]) {
6343
 
                done[name] = true;
6344
 
                m = self.getModule(name);
6345
 
                if (m) {
6346
 
                    var expound = m.expound;
6347
 
 
6348
 
                    if (expound) {
6349
 
                        r[expound] = self.getModule(expound);
6350
 
                        reqs = self.getRequires(r[expound]);
6351
 
                        Y.mix(r, YArray.hash(reqs));
6352
 
                    }
6353
 
 
6354
 
                    reqs = self.getRequires(m);
6355
 
                    Y.mix(r, YArray.hash(reqs));
6356
 
                }
6357
 
            }
6358
 
        });
6359
 
 
6360
 
        // Y.log('After explode: ' + YObject.keys(r));
6361
 
    },
6362
 
    /**
6363
 
    * Get's the loader meta data for the requested module
6364
 
    * @method getModule
6365
 
    * @param {String} mname The module name to get
6366
 
    * @return {Object} The module metadata
6367
 
    */
6368
 
    getModule: function(mname) {
6369
 
        //TODO: Remove name check - it's a quick hack to fix pattern WIP
6370
 
        if (!mname) {
6371
 
            return null;
6372
 
        }
6373
 
 
6374
 
        var p, found, pname,
6375
 
            m = this.moduleInfo[mname],
6376
 
            patterns = this.patterns;
6377
 
 
6378
 
        // check the patterns library to see if we should automatically add
6379
 
        // the module with defaults
6380
 
        if (!m) {
6381
 
           // Y.log('testing patterns ' + YObject.keys(patterns));
6382
 
            for (pname in patterns) {
6383
 
                if (patterns.hasOwnProperty(pname)) {
6384
 
                    // Y.log('testing pattern ' + i);
6385
 
                    p = patterns[pname];
6386
 
                    
6387
 
                    //There is no test method, create a default one that tests
6388
 
                    // the pattern against the mod name
6389
 
                    if (!p.test) {
6390
 
                        p.test = function(mname, pname) {
6391
 
                            return (mname.indexOf(pname) > -1);
6392
 
                        };
6393
 
                    }
6394
 
 
6395
 
                    if (p.test(mname, pname)) {
6396
 
                        // use the metadata supplied for the pattern
6397
 
                        // as the module definition.
6398
 
                        found = p;
6399
 
                        break;
6400
 
                    }
6401
 
                }
6402
 
            }
6403
 
 
6404
 
            if (found) {
6405
 
                if (p.action) {
6406
 
                    // Y.log('executing pattern action: ' + pname);
6407
 
                    p.action.call(this, mname, pname);
6408
 
                } else {
6409
 
Y.log('Undefined module: ' + mname + ', matched a pattern: ' +
6410
 
    pname, 'info', 'loader');
6411
 
                    // ext true or false?
6412
 
                    m = this.addModule(Y.merge(found), mname);
6413
 
                    m.temp = true;
6414
 
                }
6415
 
            }
6416
 
        }
6417
 
 
6418
 
        return m;
6419
 
    },
6420
 
 
6421
 
    // impl in rollup submodule
6422
 
    _rollup: function() { },
6423
 
 
6424
 
    /**
6425
 
     * Remove superceded modules and loaded modules.  Called by
6426
 
     * calculate() after we have the mega list of all dependencies
6427
 
     * @method _reduce
6428
 
     * @return {object} the reduced dependency hash.
6429
 
     * @private
6430
 
     */
6431
 
    _reduce: function(r) {
6432
 
 
6433
 
        r = r || this.required;
6434
 
 
6435
 
        var i, j, s, m, type = this.loadType,
6436
 
        ignore = this.ignore ? YArray.hash(this.ignore) : false;
6437
 
 
6438
 
        for (i in r) {
6439
 
            if (r.hasOwnProperty(i)) {
6440
 
                m = this.getModule(i);
6441
 
                // remove if already loaded
6442
 
                if (((this.loaded[i] || ON_PAGE[i]) &&
6443
 
                        !this.forceMap[i] && !this.ignoreRegistered) ||
6444
 
                        (type && m && m.type != type)) {
6445
 
                    delete r[i];
6446
 
                }
6447
 
                if (ignore && ignore[i]) {
6448
 
                    delete r[i];
6449
 
                }
6450
 
                // remove anything this module supersedes
6451
 
                s = m && m.supersedes;
6452
 
                if (s) {
6453
 
                    for (j = 0; j < s.length; j++) {
6454
 
                        if (s[j] in r) {
6455
 
                            delete r[s[j]];
6456
 
                        }
6457
 
                    }
6458
 
                }
6459
 
            }
6460
 
        }
6461
 
 
6462
 
        return r;
6463
 
    },
6464
 
    /**
6465
 
    * Handles the queue when a module has been loaded for all cases
6466
 
    * @method _finish
6467
 
    * @private
6468
 
    * @param {String} msg The message from Loader
6469
 
    * @param {Boolean} success A boolean denoting success or failure
6470
 
    */
6471
 
    _finish: function(msg, success) {
6472
 
        Y.log('loader finishing: ' + msg + ', ' + Y.id + ', ' +
6473
 
            this.data, 'info', 'loader');
6474
 
 
6475
 
        _queue.running = false;
6476
 
 
6477
 
        var onEnd = this.onEnd;
6478
 
        if (onEnd) {
6479
 
            onEnd.call(this.context, {
6480
 
                msg: msg,
6481
 
                data: this.data,
6482
 
                success: success
6483
 
            });
6484
 
        }
6485
 
        this._continue();
6486
 
    },
6487
 
    /**
6488
 
    * The default Loader onSuccess handler, calls this.onSuccess with a payload
6489
 
    * @method _onSuccess
6490
 
    * @private
6491
 
    */
6492
 
    _onSuccess: function() {
6493
 
        var self = this, skipped = Y.merge(self.skipped), fn,
6494
 
            failed = [], rreg = self.requireRegistration,
6495
 
            success, msg;
6496
 
 
6497
 
        oeach(skipped, function(k) {
6498
 
            delete self.inserted[k];
6499
 
        });
6500
 
 
6501
 
        self.skipped = {};
6502
 
 
6503
 
        oeach(self.inserted, function(v, k) {
6504
 
            var mod = self.getModule(k);
6505
 
            if (mod && rreg && mod.type == JS && !(k in YUI.Env.mods)) {
6506
 
                failed.push(k);
6507
 
            } else {
6508
 
                Y.mix(self.loaded, self.getProvides(k));
6509
 
            }
6510
 
        });
6511
 
 
6512
 
        fn = self.onSuccess;
6513
 
        msg = (failed.length) ? 'notregistered' : 'success';
6514
 
        success = !(failed.length);
6515
 
        if (fn) {
6516
 
            fn.call(self.context, {
6517
 
                msg: msg,
6518
 
                data: self.data,
6519
 
                success: success,
6520
 
                failed: failed,
6521
 
                skipped: skipped
6522
 
            });
6523
 
        }
6524
 
        self._finish(msg, success);
6525
 
    },
6526
 
    /**
6527
 
    * The default Loader onProgress handler, calls this.onProgress with a payload
6528
 
    * @method _onProgress
6529
 
    * @private
6530
 
    */
6531
 
    _onProgress: function(e) {
6532
 
        var self = this;
6533
 
        if (self.onProgress) {
6534
 
            self.onProgress.call(self.context, {
6535
 
                name: e.url,
6536
 
                data: e.data
6537
 
            });
6538
 
        }
6539
 
    },
6540
 
    /**
6541
 
    * The default Loader onFailure handler, calls this.onFailure with a payload
6542
 
    * @method _onFailure
6543
 
    * @private
6544
 
    */
6545
 
    _onFailure: function(o) {
6546
 
        var f = this.onFailure, msg = [], i = 0, len = o.errors.length;
6547
 
        
6548
 
        for (i; i < len; i++) {
6549
 
            msg.push(o.errors[i].error);
6550
 
        }
6551
 
 
6552
 
        msg = msg.join(',');
6553
 
 
6554
 
        Y.log('load error: ' + msg + ', ' + Y.id, 'error', 'loader');
6555
 
        
6556
 
        if (f) {
6557
 
            f.call(this.context, {
6558
 
                msg: msg,
6559
 
                data: this.data,
6560
 
                success: false
6561
 
            });
6562
 
        }
6563
 
        
6564
 
        this._finish(msg, false);
6565
 
 
6566
 
    },
6567
 
 
6568
 
    /**
6569
 
    * The default Loader onTimeout handler, calls this.onTimeout with a payload
6570
 
    * @method _onTimeout
6571
 
    * @private
6572
 
    */
6573
 
    _onTimeout: function() {
6574
 
        Y.log('loader timeout: ' + Y.id, 'error', 'loader');
6575
 
        var f = this.onTimeout;
6576
 
        if (f) {
6577
 
            f.call(this.context, {
6578
 
                msg: 'timeout',
6579
 
                data: this.data,
6580
 
                success: false
6581
 
            });
6582
 
        }
6583
 
    },
6584
 
 
6585
 
    /**
6586
 
     * Sorts the dependency tree.  The last step of calculate()
6587
 
     * @method _sort
6588
 
     * @private
6589
 
     */
6590
 
    _sort: function() {
6591
 
 
6592
 
        // create an indexed list
6593
 
        var s = YObject.keys(this.required),
6594
 
            // loaded = this.loaded,
6595
 
            //TODO Move this out of scope
6596
 
            done = {},
6597
 
            p = 0, l, a, b, j, k, moved, doneKey;
6598
 
 
6599
 
        // keep going until we make a pass without moving anything
6600
 
        for (;;) {
6601
 
 
6602
 
            l = s.length;
6603
 
            moved = false;
6604
 
 
6605
 
            // start the loop after items that are already sorted
6606
 
            for (j = p; j < l; j++) {
6607
 
 
6608
 
                // check the next module on the list to see if its
6609
 
                // dependencies have been met
6610
 
                a = s[j];
6611
 
 
6612
 
                // check everything below current item and move if we
6613
 
                // find a requirement for the current item
6614
 
                for (k = j + 1; k < l; k++) {
6615
 
                    doneKey = a + s[k];
6616
 
 
6617
 
                    if (!done[doneKey] && this._requires(a, s[k])) {
6618
 
 
6619
 
                        // extract the dependency so we can move it up
6620
 
                        b = s.splice(k, 1);
6621
 
 
6622
 
                        // insert the dependency above the item that
6623
 
                        // requires it
6624
 
                        s.splice(j, 0, b[0]);
6625
 
 
6626
 
                        // only swap two dependencies once to short circut
6627
 
                        // circular dependencies
6628
 
                        done[doneKey] = true;
6629
 
 
6630
 
                        // keep working
6631
 
                        moved = true;
6632
 
 
6633
 
                        break;
6634
 
                    }
6635
 
                }
6636
 
 
6637
 
                // jump out of loop if we moved something
6638
 
                if (moved) {
6639
 
                    break;
6640
 
                // this item is sorted, move our pointer and keep going
6641
 
                } else {
6642
 
                    p++;
6643
 
                }
6644
 
            }
6645
 
 
6646
 
            // when we make it here and moved is false, we are
6647
 
            // finished sorting
6648
 
            if (!moved) {
6649
 
                break;
6650
 
            }
6651
 
 
6652
 
        }
6653
 
 
6654
 
        this.sorted = s;
6655
 
    },
6656
 
 
6657
 
    /**
6658
 
    * Handles the actual insertion of script/link tags
6659
 
    * @method _insert
6660
 
    * @private
6661
 
    * @param {Object} source The YUI instance the request came from
6662
 
    * @param {Object} o The metadata to include
6663
 
    * @param {String} type JS or CSS
6664
 
    * @param {Boolean} [skipcalc=false] Do a Loader.calculate on the meta
6665
 
    */
6666
 
    _insert: function(source, o, type, skipcalc) {
6667
 
 
6668
 
        Y.log('private _insert() ' + (type || '') + ', ' + Y.id, "info", "loader");
6669
 
 
6670
 
        // restore the state at the time of the request
6671
 
        if (source) {
6672
 
            this._config(source);
6673
 
        }
6674
 
 
6675
 
        // build the dependency list
6676
 
        // don't include type so we can process CSS and script in
6677
 
        // one pass when the type is not specified.
6678
 
        if (!skipcalc) {
6679
 
            this.calculate(o);
6680
 
        }
6681
 
 
6682
 
        var modules = this.resolve(),
6683
 
            self = this, comp = 0, actions = 0;
6684
 
 
6685
 
        if (type) {
6686
 
            //Filter out the opposite type and reset the array so the checks later work
6687
 
            modules[((type === JS) ? CSS : JS)] = [];
6688
 
        }
6689
 
        if (modules.js.length) {
6690
 
            comp++;
6691
 
        }
6692
 
        if (modules.css.length) {
6693
 
            comp++;
6694
 
        }
6695
 
 
6696
 
        //console.log('Resolved Modules: ', modules);
6697
 
 
6698
 
        var complete = function(d) {
6699
 
            actions++;
6700
 
            var errs = {}, i = 0, u = '', fn;
6701
 
 
6702
 
            if (d && d.errors) {
6703
 
                for (i = 0; i < d.errors.length; i++) {
6704
 
                    if (d.errors[i].request) {
6705
 
                        u = d.errors[i].request.url;
6706
 
                    } else {
6707
 
                        u = d.errors[i];
6708
 
                    }
6709
 
                    errs[u] = u;
6710
 
                }
6711
 
            }
6712
 
            
6713
 
            if (d && d.data && d.data.length && (d.type === 'success')) {
6714
 
                for (i = 0; i < d.data.length; i++) {
6715
 
                    self.inserted[d.data[i].name] = true;
6716
 
                }
6717
 
            }
6718
 
 
6719
 
            if (actions === comp) {
6720
 
                self._loading = null;
6721
 
                Y.log('Loader actions complete!', 'info', 'loader');
6722
 
                if (d && d.fn) {
6723
 
                    Y.log('Firing final Loader callback!', 'info', 'loader');
6724
 
                    fn = d.fn;
6725
 
                    delete d.fn;
6726
 
                    fn.call(self, d);
6727
 
                }
6728
 
            }
6729
 
        };
6730
 
 
6731
 
        this._loading = true;
6732
 
 
6733
 
        if (!modules.js.length && !modules.css.length) {
6734
 
            Y.log('No modules resolved..', 'warn', 'loader');
6735
 
            actions = -1;
6736
 
            complete({
6737
 
                fn: self._onSuccess
6738
 
            });
6739
 
            return;
6740
 
        }
6741
 
        
6742
 
 
6743
 
        if (modules.css.length) { //Load CSS first
6744
 
            Y.log('Loading CSS modules', 'info', 'loader');
6745
 
            Y.Get.css(modules.css, {
6746
 
                data: modules.cssMods,
6747
 
                attributes: self.cssAttributes,
6748
 
                insertBefore: self.insertBefore,
6749
 
                charset: self.charset,
6750
 
                timeout: self.timeout,
6751
 
                context: self,
6752
 
                onProgress: function(e) {
6753
 
                    self._onProgress.call(self, e);
6754
 
                },
6755
 
                onTimeout: function(d) {
6756
 
                    self._onTimeout.call(self, d);
6757
 
                },
6758
 
                onSuccess: function(d) {
6759
 
                    d.type = 'success';
6760
 
                    d.fn = self._onSuccess;
6761
 
                    complete.call(self, d);
6762
 
                },
6763
 
                onFailure: function(d) {
6764
 
                    d.type = 'failure';
6765
 
                    d.fn = self._onFailure;
6766
 
                    complete.call(self, d);
6767
 
                }
6768
 
            });
6769
 
        }
6770
 
 
6771
 
        if (modules.js.length) {
6772
 
            Y.log('Loading JS modules', 'info', 'loader');
6773
 
            Y.Get.js(modules.js, {
6774
 
                data: modules.jsMods,
6775
 
                insertBefore: self.insertBefore,
6776
 
                attributes: self.jsAttributes,
6777
 
                charset: self.charset,
6778
 
                timeout: self.timeout,
6779
 
                autopurge: false,
6780
 
                context: self,
6781
 
                async: true,
6782
 
                onProgress: function(e) {
6783
 
                    self._onProgress.call(self, e);
6784
 
                },
6785
 
                onTimeout: function(d) {
6786
 
                    self._onTimeout.call(self, d);
6787
 
                },
6788
 
                onSuccess: function(d) {
6789
 
                    d.type = 'success';
6790
 
                    d.fn = self._onSuccess;
6791
 
                    complete.call(self, d);
6792
 
                },
6793
 
                onFailure: function(d) {
6794
 
                    d.type = 'failure';
6795
 
                    d.fn = self._onFailure;
6796
 
                    complete.call(self, d);
6797
 
                }
6798
 
            });
6799
 
        }
6800
 
    },
6801
 
    /**
6802
 
    * Once a loader operation is completely finished, process any additional queued items.
6803
 
    * @method _continue
6804
 
    * @private
6805
 
    */
6806
 
    _continue: function() {
6807
 
        if (!(_queue.running) && _queue.size() > 0) {
6808
 
            _queue.running = true;
6809
 
            _queue.next()();
6810
 
        }
6811
 
    },
6812
 
 
6813
 
    /**
6814
 
     * inserts the requested modules and their dependencies.
6815
 
     * <code>type</code> can be "js" or "css".  Both script and
6816
 
     * css are inserted if type is not provided.
6817
 
     * @method insert
6818
 
     * @param {object} o optional options object.
6819
 
     * @param {string} type the type of dependency to insert.
6820
 
     */
6821
 
    insert: function(o, type, skipsort) {
6822
 
         Y.log('public insert() ' + (type || '') + ', ' +
6823
 
         Y.Object.keys(this.required), "info", "loader");
6824
 
        var self = this, copy = Y.merge(this);
6825
 
        delete copy.require;
6826
 
        delete copy.dirty;
6827
 
        _queue.add(function() {
6828
 
            self._insert(copy, o, type, skipsort);
6829
 
        });
6830
 
        this._continue();
6831
 
    },
6832
 
 
6833
 
    /**
6834
 
     * Executed every time a module is loaded, and if we are in a load
6835
 
     * cycle, we attempt to load the next script.  Public so that it
6836
 
     * is possible to call this if using a method other than
6837
 
     * Y.register to determine when scripts are fully loaded
6838
 
     * @method loadNext
6839
 
     * @deprecated
6840
 
     * @param {string} mname optional the name of the module that has
6841
 
     * been loaded (which is usually why it is time to load the next
6842
 
     * one).
6843
 
     */
6844
 
    loadNext: function(mname) {
6845
 
        Y.log('loadNext was called..', 'error', 'loader');
6846
 
        return;
6847
 
    },
6848
 
 
6849
 
    /**
6850
 
     * Apply filter defined for this instance to a url/path
6851
 
     * @method _filter
6852
 
     * @param {string} u the string to filter.
6853
 
     * @param {string} name the name of the module, if we are processing
6854
 
     * a single module as opposed to a combined url.
6855
 
     * @return {string} the filtered string.
6856
 
     * @private
6857
 
     */
6858
 
    _filter: function(u, name, group) {
6859
 
        var f = this.filter,
6860
 
            hasFilter = name && (name in this.filters),
6861
 
            modFilter = hasFilter && this.filters[name],
6862
 
                groupName = group || (this.moduleInfo[name] ? this.moduleInfo[name].group : null);
6863
 
 
6864
 
            if (groupName && this.groups[groupName] && this.groups[groupName].filter) {         
6865
 
                    modFilter = this.groups[groupName].filter;
6866
 
                    hasFilter = true;           
6867
 
            };
6868
 
 
6869
 
        if (u) {
6870
 
            if (hasFilter) {
6871
 
                f = (L.isString(modFilter)) ?
6872
 
                    this.FILTER_DEFS[modFilter.toUpperCase()] || null :
6873
 
                    modFilter;
6874
 
            }
6875
 
            if (f) {
6876
 
                u = u.replace(new RegExp(f.searchExp, 'g'), f.replaceStr);
6877
 
            }
6878
 
        }
6879
 
 
6880
 
        return u;
6881
 
    },
6882
 
 
6883
 
    /**
6884
 
     * Generates the full url for a module
6885
 
     * @method _url
6886
 
     * @param {string} path the path fragment.
6887
 
     * @param {String} name The name of the module
6888
 
     * @param {String} [base=self.base] The base url to use
6889
 
     * @return {string} the full url.
6890
 
     * @private
6891
 
     */
6892
 
    _url: function(path, name, base) {
6893
 
        return this._filter((base || this.base || '') + path, name);
6894
 
    },
6895
 
    /**
6896
 
    * Returns an Object hash of file arrays built from `loader.sorted` or from an arbitrary list of sorted modules.
6897
 
    * @method resolve
6898
 
    * @param {Boolean} [calc=false] Perform a loader.calculate() before anything else
6899
 
    * @param {Array} [s=loader.sorted] An override for the loader.sorted array
6900
 
    * @return {Object} Object hash (js and css) of two arrays of file lists
6901
 
    * @example This method can be used as an off-line dep calculator
6902
 
    *
6903
 
    *        var Y = YUI();
6904
 
    *        var loader = new Y.Loader({
6905
 
    *            filter: 'debug',
6906
 
    *            base: '../../',
6907
 
    *            root: 'build/',
6908
 
    *            combine: true,
6909
 
    *            require: ['node', 'dd', 'console']
6910
 
    *        });
6911
 
    *        var out = loader.resolve(true);
6912
 
    *
6913
 
    */
6914
 
    resolve: function(calc, s) {
6915
 
 
6916
 
        var len, i, m, url, fn, msg, attr, group, groupName, j, frag,
6917
 
            comboSource, comboSources, mods, comboBase,
6918
 
            base, urls, u = [], tmpBase, baseLen, resCombos = {},
6919
 
            self = this, comboSep, maxURLLength, singles = [],
6920
 
            inserted = (self.ignoreRegistered) ? {} : self.inserted,
6921
 
            resolved = { js: [], jsMods: [], css: [], cssMods: [] },
6922
 
            type = self.loadType || 'js';
6923
 
 
6924
 
        if (calc) {
6925
 
            self.calculate();
6926
 
        }
6927
 
        s = s || self.sorted;
6928
 
 
6929
 
        var addSingle = function(m) {
6930
 
            
6931
 
            if (m) {
6932
 
                group = (m.group && self.groups[m.group]) || NOT_FOUND;
6933
 
                
6934
 
                //Always assume it's async
6935
 
                if (group.async === false) {
6936
 
                    m.async = group.async;
6937
 
                }
6938
 
 
6939
 
                url = (m.fullpath) ? self._filter(m.fullpath, s[i]) :
6940
 
                      self._url(m.path, s[i], group.base || m.base);
6941
 
                
6942
 
                if (m.attributes || m.async === false) {
6943
 
                    url = {
6944
 
                        url: url,
6945
 
                        async: m.async
6946
 
                    };
6947
 
                    if (m.attributes) {
6948
 
                        url.attributes = m.attributes
6949
 
                    }
6950
 
                }
6951
 
                resolved[m.type].push(url);
6952
 
                resolved[m.type + 'Mods'].push(m);
6953
 
            } else {
6954
 
                Y.log('Undefined Module', 'warn', 'loader');
6955
 
            }
6956
 
            
6957
 
        };
6958
 
 
6959
 
        len = s.length;
6960
 
 
6961
 
        // the default combo base
6962
 
        comboBase = self.comboBase;
6963
 
 
6964
 
        url = comboBase;
6965
 
 
6966
 
        comboSources = {};
6967
 
 
6968
 
        for (i = 0; i < len; i++) {
6969
 
            comboSource = comboBase;
6970
 
            m = self.getModule(s[i]);
6971
 
            groupName = m && m.group;
6972
 
            group = self.groups[groupName];
6973
 
            if (groupName && group) {
6974
 
 
6975
 
                if (!group.combine || m.fullpath) {
6976
 
                    //This is not a combo module, skip it and load it singly later.
6977
 
                    //singles.push(s[i]);
6978
 
                    addSingle(m);
6979
 
                    continue;
6980
 
                }
6981
 
                m.combine = true;
6982
 
                if (group.comboBase) {
6983
 
                    comboSource = group.comboBase;
6984
 
                }
6985
 
 
6986
 
                if ("root" in group && L.isValue(group.root)) {
6987
 
                    m.root = group.root;
6988
 
                }
6989
 
                m.comboSep = group.comboSep || self.comboSep;
6990
 
                m.maxURLLength = group.maxURLLength || self.maxURLLength;
6991
 
            } else {
6992
 
                if (!self.combine) {
6993
 
                    //This is not a combo module, skip it and load it singly later.
6994
 
                    //singles.push(s[i]);
6995
 
                    addSingle(m);
6996
 
                    continue;
6997
 
                }
6998
 
            }
6999
 
 
7000
 
            comboSources[comboSource] = comboSources[comboSource] || [];
7001
 
            comboSources[comboSource].push(m);
7002
 
        }
7003
 
 
7004
 
        for (j in comboSources) {
7005
 
            if (comboSources.hasOwnProperty(j)) {
7006
 
                resCombos[j] = resCombos[j] || { js: [], jsMods: [], css: [], cssMods: [] };
7007
 
                url = j;
7008
 
                mods = comboSources[j];
7009
 
                len = mods.length;
7010
 
                
7011
 
                if (len) {
7012
 
                    for (i = 0; i < len; i++) {
7013
 
                        if (inserted[mods[i]]) {
7014
 
                            continue;
7015
 
                        }
7016
 
                        m = mods[i];
7017
 
                        // Do not try to combine non-yui JS unless combo def
7018
 
                        // is found
7019
 
                        if (m && (m.combine || !m.ext)) {
7020
 
                            resCombos[j].comboSep = m.comboSep;
7021
 
                            resCombos[j].group = m.group;
7022
 
                            resCombos[j].maxURLLength = m.maxURLLength;
7023
 
                            frag = ((L.isValue(m.root)) ? m.root : self.root) + (m.path || m.fullpath);
7024
 
                            frag = self._filter(frag, m.name);
7025
 
                            resCombos[j][m.type].push(frag);
7026
 
                            resCombos[j][m.type + 'Mods'].push(m);
7027
 
                        } else {
7028
 
                            //Add them to the next process..
7029
 
                            if (mods[i]) {
7030
 
                                //singles.push(mods[i].name);
7031
 
                                addSingle(mods[i]);
7032
 
                            }
7033
 
                        }
7034
 
 
7035
 
                    }
7036
 
                }
7037
 
            }
7038
 
        }
7039
 
 
7040
 
 
7041
 
        for (j in resCombos) {
7042
 
            base = j;
7043
 
            comboSep = resCombos[base].comboSep || self.comboSep;
7044
 
            maxURLLength = resCombos[base].maxURLLength || self.maxURLLength;
7045
 
            Y.log('Using maxURLLength of ' + maxURLLength, 'info', 'loader');
7046
 
            for (type in resCombos[base]) {
7047
 
                if (type === JS || type === CSS) {
7048
 
                    urls = resCombos[base][type];
7049
 
                    mods = resCombos[base][type + 'Mods'];
7050
 
                    len = urls.length;
7051
 
                    tmpBase = base + urls.join(comboSep);
7052
 
                    baseLen = tmpBase.length;
7053
 
                    if (maxURLLength <= base.length) {
7054
 
                        Y.log('maxURLLength (' + maxURLLength + ') is lower than the comboBase length (' + base.length + '), resetting to default (' + MAX_URL_LENGTH + ')', 'error', 'loader');
7055
 
                        maxURLLength = MAX_URL_LENGTH;
7056
 
                    }
7057
 
                    
7058
 
                    if (len) {
7059
 
                        if (baseLen > maxURLLength) {
7060
 
                            Y.log('Exceeded maxURLLength (' + maxURLLength + ') for ' + type + ', splitting', 'info', 'loader');
7061
 
                            u = [];
7062
 
                            for (s = 0; s < len; s++) {
7063
 
                                u.push(urls[s]);
7064
 
                                tmpBase = base + u.join(comboSep);
7065
 
 
7066
 
                                if (tmpBase.length > maxURLLength) {
7067
 
                                    m = u.pop();
7068
 
                                    tmpBase = base + u.join(comboSep)
7069
 
                                    resolved[type].push(self._filter(tmpBase, null, resCombos[base].group));
7070
 
                                    u = [];
7071
 
                                    if (m) {
7072
 
                                        u.push(m);
7073
 
                                    }
7074
 
                                }
7075
 
                            }
7076
 
                            if (u.length) {
7077
 
                                tmpBase = base + u.join(comboSep);
7078
 
                                resolved[type].push(self._filter(tmpBase, null, resCombos[base].group));
7079
 
                            }
7080
 
                        } else {
7081
 
                            resolved[type].push(self._filter(tmpBase, null, resCombos[base].group));
7082
 
                        }
7083
 
                    }
7084
 
                    resolved[type + 'Mods'] = resolved[type + 'Mods'].concat(mods);
7085
 
                }
7086
 
            }
7087
 
        }
7088
 
 
7089
 
        resCombos = null;
7090
 
 
7091
 
        return resolved;
7092
 
    },
7093
 
    /**
7094
 
    Shortcut to calculate, resolve and load all modules.
7095
 
 
7096
 
        var loader = new Y.Loader({
7097
 
            ignoreRegistered: true,
7098
 
            modules: {
7099
 
                mod: {
7100
 
                    path: 'mod.js'
7101
 
                }
7102
 
            },
7103
 
            requires: [ 'mod' ]
7104
 
        });
7105
 
        loader.load(function() {
7106
 
            console.log('All modules have loaded..');
7107
 
        });
7108
 
 
7109
 
 
7110
 
    @method load
7111
 
    @param {Callback} cb Executed after all load operations are complete
7112
 
    */
7113
 
    load: function(cb) {
7114
 
        if (!cb) {
7115
 
            Y.log('No callback supplied to load()', 'error', 'loader');
7116
 
            return;
7117
 
        }
7118
 
        var self = this,
7119
 
            out = self.resolve(true);
7120
 
        
7121
 
        self.data = out;
7122
 
 
7123
 
        self.onEnd = function() {
7124
 
            cb.apply(self.context || self, arguments);
7125
 
        };
7126
 
 
7127
 
        self.insert();
7128
 
    }
7129
 
};
7130
 
 
7131
 
 
7132
 
 
7133
 
}, '3.5.1' ,{requires:['get', 'features']});
7134
 
YUI.add('loader-rollup', function(Y) {
7135
 
 
7136
 
/**
7137
 
 * Optional automatic rollup logic for reducing http connections
7138
 
 * when not using a combo service.
7139
 
 * @module loader
7140
 
 * @submodule rollup
7141
 
 */
7142
 
 
7143
 
/**
7144
 
 * Look for rollup packages to determine if all of the modules a
7145
 
 * rollup supersedes are required.  If so, include the rollup to
7146
 
 * help reduce the total number of connections required.  Called
7147
 
 * by calculate().  This is an optional feature, and requires the
7148
 
 * appropriate submodule to function.
7149
 
 * @method _rollup
7150
 
 * @for Loader
7151
 
 * @private
7152
 
 */
7153
 
Y.Loader.prototype._rollup = function() {
7154
 
    var i, j, m, s, r = this.required, roll,
7155
 
        info = this.moduleInfo, rolled, c, smod;
7156
 
 
7157
 
    // find and cache rollup modules
7158
 
    if (this.dirty || !this.rollups) {
7159
 
        this.rollups = {};
7160
 
        for (i in info) {
7161
 
            if (info.hasOwnProperty(i)) {
7162
 
                m = this.getModule(i);
7163
 
                // if (m && m.rollup && m.supersedes) {
7164
 
                if (m && m.rollup) {
7165
 
                    this.rollups[i] = m;
7166
 
                }
7167
 
            }
7168
 
        }
7169
 
    }
7170
 
 
7171
 
    // make as many passes as needed to pick up rollup rollups
7172
 
    for (;;) {
7173
 
        rolled = false;
7174
 
 
7175
 
        // go through the rollup candidates
7176
 
        for (i in this.rollups) {
7177
 
            if (this.rollups.hasOwnProperty(i)) {
7178
 
                // there can be only one, unless forced
7179
 
                if (!r[i] && ((!this.loaded[i]) || this.forceMap[i])) {
7180
 
                    m = this.getModule(i);
7181
 
                    s = m.supersedes || [];
7182
 
                    roll = false;
7183
 
 
7184
 
                    // @TODO remove continue
7185
 
                    if (!m.rollup) {
7186
 
                        continue;
7187
 
                    }
7188
 
 
7189
 
                    c = 0;
7190
 
 
7191
 
                    // check the threshold
7192
 
                    for (j = 0; j < s.length; j++) {
7193
 
                        smod = info[s[j]];
7194
 
 
7195
 
                        // if the superseded module is loaded, we can't
7196
 
                        // load the rollup unless it has been forced.
7197
 
                        if (this.loaded[s[j]] && !this.forceMap[s[j]]) {
7198
 
                            roll = false;
7199
 
                            break;
7200
 
                        // increment the counter if this module is required.
7201
 
                        // if we are beyond the rollup threshold, we will
7202
 
                        // use the rollup module
7203
 
                        } else if (r[s[j]] && m.type == smod.type) {
7204
 
                            c++;
7205
 
                            // Y.log("adding to thresh: " + c + ", " + s[j]);
7206
 
                            roll = (c >= m.rollup);
7207
 
                            if (roll) {
7208
 
                                // Y.log("over thresh " + c + ", " + s[j]);
7209
 
                                break;
7210
 
                            }
7211
 
                        }
7212
 
                    }
7213
 
 
7214
 
                    if (roll) {
7215
 
                        // Y.log("adding rollup: " +  i);
7216
 
                        // add the rollup
7217
 
                        r[i] = true;
7218
 
                        rolled = true;
7219
 
 
7220
 
                        // expand the rollup's dependencies
7221
 
                        this.getRequires(m);
7222
 
                    }
7223
 
                }
7224
 
            }
7225
 
        }
7226
 
 
7227
 
        // if we made it here w/o rolling up something, we are done
7228
 
        if (!rolled) {
7229
 
            break;
7230
 
        }
7231
 
    }
7232
 
};
7233
 
 
7234
 
 
7235
 
}, '3.5.1' ,{requires:['loader-base']});
7236
 
YUI.add('loader-yui3', function(Y) {
7237
 
 
7238
 
/* This file is auto-generated by src/loader/scripts/meta_join.py */
7239
 
 
7240
 
/**
7241
 
 * YUI 3 module metadata
7242
 
 * @module loader
7243
 
 * @submodule yui3
7244
 
 */
7245
 
YUI.Env[Y.version].modules = YUI.Env[Y.version].modules || {
7246
 
    "align-plugin": {
7247
 
        "requires": [
7248
 
            "node-screen", 
7249
 
            "node-pluginhost"
7250
 
        ]
7251
 
    }, 
7252
 
    "anim": {
7253
 
        "use": [
7254
 
            "anim-base", 
7255
 
            "anim-color", 
7256
 
            "anim-curve", 
7257
 
            "anim-easing", 
7258
 
            "anim-node-plugin", 
7259
 
            "anim-scroll", 
7260
 
            "anim-xy"
7261
 
        ]
7262
 
    }, 
7263
 
    "anim-base": {
7264
 
        "requires": [
7265
 
            "base-base", 
7266
 
            "node-style"
7267
 
        ]
7268
 
    }, 
7269
 
    "anim-color": {
7270
 
        "requires": [
7271
 
            "anim-base"
7272
 
        ]
7273
 
    }, 
7274
 
    "anim-curve": {
7275
 
        "requires": [
7276
 
            "anim-xy"
7277
 
        ]
7278
 
    }, 
7279
 
    "anim-easing": {
7280
 
        "requires": [
7281
 
            "anim-base"
7282
 
        ]
7283
 
    }, 
7284
 
    "anim-node-plugin": {
7285
 
        "requires": [
7286
 
            "node-pluginhost", 
7287
 
            "anim-base"
7288
 
        ]
7289
 
    }, 
7290
 
    "anim-scroll": {
7291
 
        "requires": [
7292
 
            "anim-base"
7293
 
        ]
7294
 
    }, 
7295
 
    "anim-shape-transform": {
7296
 
        "requires": [
7297
 
            "anim-base", 
7298
 
            "anim-easing", 
7299
 
            "matrix"
7300
 
        ]
7301
 
    }, 
7302
 
    "anim-xy": {
7303
 
        "requires": [
7304
 
            "anim-base", 
7305
 
            "node-screen"
7306
 
        ]
7307
 
    }, 
7308
 
    "app": {
7309
 
        "use": [
7310
 
            "app-base", 
7311
 
            "app-transitions", 
7312
 
            "model", 
7313
 
            "model-list", 
7314
 
            "router", 
7315
 
            "view"
7316
 
        ]
7317
 
    }, 
7318
 
    "app-base": {
7319
 
        "requires": [
7320
 
            "classnamemanager", 
7321
 
            "pjax-base", 
7322
 
            "router", 
7323
 
            "view"
7324
 
        ]
7325
 
    }, 
7326
 
    "app-transitions": {
7327
 
        "requires": [
7328
 
            "app-base"
7329
 
        ]
7330
 
    }, 
7331
 
    "app-transitions-css": {
7332
 
        "type": "css"
7333
 
    }, 
7334
 
    "app-transitions-native": {
7335
 
        "condition": {
7336
 
            "name": "app-transitions-native", 
7337
 
            "test": function (Y) {
7338
 
    var doc  = Y.config.doc,
7339
 
        node = doc ? doc.documentElement : null;
7340
 
 
7341
 
    if (node && node.style) {
7342
 
        return ('MozTransition' in node.style || 'WebkitTransition' in node.style);
7343
 
    }
7344
 
 
7345
 
    return false;
7346
 
}, 
7347
 
            "trigger": "app-transitions"
7348
 
        }, 
7349
 
        "requires": [
7350
 
            "app-transitions", 
7351
 
            "app-transitions-css", 
7352
 
            "parallel", 
7353
 
            "transition"
7354
 
        ]
7355
 
    }, 
7356
 
    "array-extras": {
7357
 
        "requires": [
7358
 
            "yui-base"
7359
 
        ]
7360
 
    }, 
7361
 
    "array-invoke": {
7362
 
        "requires": [
7363
 
            "yui-base"
7364
 
        ]
7365
 
    }, 
7366
 
    "arraylist": {
7367
 
        "requires": [
7368
 
            "yui-base"
7369
 
        ]
7370
 
    }, 
7371
 
    "arraylist-add": {
7372
 
        "requires": [
7373
 
            "arraylist"
7374
 
        ]
7375
 
    }, 
7376
 
    "arraylist-filter": {
7377
 
        "requires": [
7378
 
            "arraylist"
7379
 
        ]
7380
 
    }, 
7381
 
    "arraysort": {
7382
 
        "requires": [
7383
 
            "yui-base"
7384
 
        ]
7385
 
    }, 
7386
 
    "async-queue": {
7387
 
        "requires": [
7388
 
            "event-custom"
7389
 
        ]
7390
 
    }, 
7391
 
    "attribute": {
7392
 
        "use": [
7393
 
            "attribute-base", 
7394
 
            "attribute-complex"
7395
 
        ]
7396
 
    }, 
7397
 
    "attribute-base": {
7398
 
        "requires": [
7399
 
            "attribute-core", 
7400
 
            "attribute-events", 
7401
 
            "attribute-extras"
7402
 
        ]
7403
 
    }, 
7404
 
    "attribute-complex": {
7405
 
        "requires": [
7406
 
            "attribute-base"
7407
 
        ]
7408
 
    }, 
7409
 
    "attribute-core": {
7410
 
        "requires": [
7411
 
            "yui-base"
7412
 
        ]
7413
 
    }, 
7414
 
    "attribute-events": {
7415
 
        "requires": [
7416
 
            "event-custom"
7417
 
        ]
7418
 
    }, 
7419
 
    "attribute-extras": {
7420
 
        "requires": [
7421
 
            "yui-base"
7422
 
        ]
7423
 
    }, 
7424
 
    "autocomplete": {
7425
 
        "use": [
7426
 
            "autocomplete-base", 
7427
 
            "autocomplete-sources", 
7428
 
            "autocomplete-list", 
7429
 
            "autocomplete-plugin"
7430
 
        ]
7431
 
    }, 
7432
 
    "autocomplete-base": {
7433
 
        "optional": [
7434
 
            "autocomplete-sources"
7435
 
        ], 
7436
 
        "requires": [
7437
 
            "array-extras", 
7438
 
            "base-build", 
7439
 
            "escape", 
7440
 
            "event-valuechange", 
7441
 
            "node-base"
7442
 
        ]
7443
 
    }, 
7444
 
    "autocomplete-filters": {
7445
 
        "requires": [
7446
 
            "array-extras", 
7447
 
            "text-wordbreak"
7448
 
        ]
7449
 
    }, 
7450
 
    "autocomplete-filters-accentfold": {
7451
 
        "requires": [
7452
 
            "array-extras", 
7453
 
            "text-accentfold", 
7454
 
            "text-wordbreak"
7455
 
        ]
7456
 
    }, 
7457
 
    "autocomplete-highlighters": {
7458
 
        "requires": [
7459
 
            "array-extras", 
7460
 
            "highlight-base"
7461
 
        ]
7462
 
    }, 
7463
 
    "autocomplete-highlighters-accentfold": {
7464
 
        "requires": [
7465
 
            "array-extras", 
7466
 
            "highlight-accentfold"
7467
 
        ]
7468
 
    }, 
7469
 
    "autocomplete-list": {
7470
 
        "after": [
7471
 
            "autocomplete-sources"
7472
 
        ], 
7473
 
        "lang": [
7474
 
            "en"
7475
 
        ], 
7476
 
        "requires": [
7477
 
            "autocomplete-base", 
7478
 
            "event-resize", 
7479
 
            "node-screen", 
7480
 
            "selector-css3", 
7481
 
            "shim-plugin", 
7482
 
            "widget", 
7483
 
            "widget-position", 
7484
 
            "widget-position-align"
7485
 
        ], 
7486
 
        "skinnable": true
7487
 
    }, 
7488
 
    "autocomplete-list-keys": {
7489
 
        "condition": {
7490
 
            "name": "autocomplete-list-keys", 
7491
 
            "test": function (Y) {
7492
 
    // Only add keyboard support to autocomplete-list if this doesn't appear to
7493
 
    // be an iOS or Android-based mobile device.
7494
 
    //
7495
 
    // There's currently no feasible way to actually detect whether a device has
7496
 
    // a hardware keyboard, so this sniff will have to do. It can easily be
7497
 
    // overridden by manually loading the autocomplete-list-keys module.
7498
 
    //
7499
 
    // Worth noting: even though iOS supports bluetooth keyboards, Mobile Safari
7500
 
    // doesn't fire the keyboard events used by AutoCompleteList, so there's
7501
 
    // no point loading the -keys module even when a bluetooth keyboard may be
7502
 
    // available.
7503
 
    return !(Y.UA.ios || Y.UA.android);
7504
 
}, 
7505
 
            "trigger": "autocomplete-list"
7506
 
        }, 
7507
 
        "requires": [
7508
 
            "autocomplete-list", 
7509
 
            "base-build"
7510
 
        ]
7511
 
    }, 
7512
 
    "autocomplete-plugin": {
7513
 
        "requires": [
7514
 
            "autocomplete-list", 
7515
 
            "node-pluginhost"
7516
 
        ]
7517
 
    }, 
7518
 
    "autocomplete-sources": {
7519
 
        "optional": [
7520
 
            "io-base", 
7521
 
            "json-parse", 
7522
 
            "jsonp", 
7523
 
            "yql"
7524
 
        ], 
7525
 
        "requires": [
7526
 
            "autocomplete-base"
7527
 
        ]
7528
 
    }, 
7529
 
    "base": {
7530
 
        "use": [
7531
 
            "base-base", 
7532
 
            "base-pluginhost", 
7533
 
            "base-build"
7534
 
        ]
7535
 
    }, 
7536
 
    "base-base": {
7537
 
        "after": [
7538
 
            "attribute-complex"
7539
 
        ], 
7540
 
        "requires": [
7541
 
            "base-core", 
7542
 
            "attribute-base"
7543
 
        ]
7544
 
    }, 
7545
 
    "base-build": {
7546
 
        "requires": [
7547
 
            "base-base"
7548
 
        ]
7549
 
    }, 
7550
 
    "base-core": {
7551
 
        "requires": [
7552
 
            "attribute-core"
7553
 
        ]
7554
 
    }, 
7555
 
    "base-pluginhost": {
7556
 
        "requires": [
7557
 
            "base-base", 
7558
 
            "pluginhost"
7559
 
        ]
7560
 
    }, 
7561
 
    "button": {
7562
 
        "requires": [
7563
 
            "button-core", 
7564
 
            "cssbutton", 
7565
 
            "widget"
7566
 
        ]
7567
 
    }, 
7568
 
    "button-core": {
7569
 
        "requires": [
7570
 
            "attribute-core", 
7571
 
            "classnamemanager", 
7572
 
            "node-base"
7573
 
        ]
7574
 
    }, 
7575
 
    "button-group": {
7576
 
        "requires": [
7577
 
            "button-plugin", 
7578
 
            "cssbutton", 
7579
 
            "widget"
7580
 
        ]
7581
 
    }, 
7582
 
    "button-plugin": {
7583
 
        "requires": [
7584
 
            "button-core", 
7585
 
            "cssbutton", 
7586
 
            "node-pluginhost"
7587
 
        ]
7588
 
    }, 
7589
 
    "cache": {
7590
 
        "use": [
7591
 
            "cache-base", 
7592
 
            "cache-offline", 
7593
 
            "cache-plugin"
7594
 
        ]
7595
 
    }, 
7596
 
    "cache-base": {
7597
 
        "requires": [
7598
 
            "base"
7599
 
        ]
7600
 
    }, 
7601
 
    "cache-offline": {
7602
 
        "requires": [
7603
 
            "cache-base", 
7604
 
            "json"
7605
 
        ]
7606
 
    }, 
7607
 
    "cache-plugin": {
7608
 
        "requires": [
7609
 
            "plugin", 
7610
 
            "cache-base"
7611
 
        ]
7612
 
    }, 
7613
 
    "calendar": {
7614
 
        "lang": [
7615
 
            "de", 
7616
 
            "en", 
7617
 
            "fr", 
7618
 
            "ja", 
7619
 
            "nb-NO", 
7620
 
            "pt-BR", 
7621
 
            "ru", 
7622
 
            "zh-HANT-TW"
7623
 
        ], 
7624
 
        "requires": [
7625
 
            "calendar-base", 
7626
 
            "calendarnavigator"
7627
 
        ], 
7628
 
        "skinnable": true
7629
 
    }, 
7630
 
    "calendar-base": {
7631
 
        "lang": [
7632
 
            "de", 
7633
 
            "en", 
7634
 
            "fr", 
7635
 
            "ja", 
7636
 
            "nb-NO", 
7637
 
            "pt-BR", 
7638
 
            "ru", 
7639
 
            "zh-HANT-TW"
7640
 
        ], 
7641
 
        "requires": [
7642
 
            "widget", 
7643
 
            "substitute", 
7644
 
            "datatype-date", 
7645
 
            "datatype-date-math", 
7646
 
            "cssgrids"
7647
 
        ], 
7648
 
        "skinnable": true
7649
 
    }, 
7650
 
    "calendarnavigator": {
7651
 
        "requires": [
7652
 
            "plugin", 
7653
 
            "classnamemanager", 
7654
 
            "datatype-date", 
7655
 
            "node", 
7656
 
            "substitute"
7657
 
        ], 
7658
 
        "skinnable": true
7659
 
    }, 
7660
 
    "charts": {
7661
 
        "requires": [
7662
 
            "charts-base"
7663
 
        ]
7664
 
    }, 
7665
 
    "charts-base": {
7666
 
        "requires": [
7667
 
            "dom", 
7668
 
            "datatype-number", 
7669
 
            "datatype-date", 
7670
 
            "event-custom", 
7671
 
            "event-mouseenter", 
7672
 
            "event-touch", 
7673
 
            "widget", 
7674
 
            "widget-position", 
7675
 
            "widget-stack", 
7676
 
            "graphics"
7677
 
        ]
7678
 
    }, 
7679
 
    "charts-legend": {
7680
 
        "requires": [
7681
 
            "charts-base"
7682
 
        ]
7683
 
    }, 
7684
 
    "classnamemanager": {
7685
 
        "requires": [
7686
 
            "yui-base"
7687
 
        ]
7688
 
    }, 
7689
 
    "clickable-rail": {
7690
 
        "requires": [
7691
 
            "slider-base"
7692
 
        ]
7693
 
    }, 
7694
 
    "collection": {
7695
 
        "use": [
7696
 
            "array-extras", 
7697
 
            "arraylist", 
7698
 
            "arraylist-add", 
7699
 
            "arraylist-filter", 
7700
 
            "array-invoke"
7701
 
        ]
7702
 
    }, 
7703
 
    "console": {
7704
 
        "lang": [
7705
 
            "en", 
7706
 
            "es", 
7707
 
            "ja"
7708
 
        ], 
7709
 
        "requires": [
7710
 
            "yui-log", 
7711
 
            "widget", 
7712
 
            "substitute"
7713
 
        ], 
7714
 
        "skinnable": true
7715
 
    }, 
7716
 
    "console-filters": {
7717
 
        "requires": [
7718
 
            "plugin", 
7719
 
            "console"
7720
 
        ], 
7721
 
        "skinnable": true
7722
 
    }, 
7723
 
    "controller": {
7724
 
        "use": [
7725
 
            "router"
7726
 
        ]
7727
 
    }, 
7728
 
    "cookie": {
7729
 
        "requires": [
7730
 
            "yui-base"
7731
 
        ]
7732
 
    }, 
7733
 
    "createlink-base": {
7734
 
        "requires": [
7735
 
            "editor-base"
7736
 
        ]
7737
 
    }, 
7738
 
    "cssbase": {
7739
 
        "after": [
7740
 
            "cssreset", 
7741
 
            "cssfonts", 
7742
 
            "cssgrids", 
7743
 
            "cssreset-context", 
7744
 
            "cssfonts-context", 
7745
 
            "cssgrids-context"
7746
 
        ], 
7747
 
        "type": "css"
7748
 
    }, 
7749
 
    "cssbase-context": {
7750
 
        "after": [
7751
 
            "cssreset", 
7752
 
            "cssfonts", 
7753
 
            "cssgrids", 
7754
 
            "cssreset-context", 
7755
 
            "cssfonts-context", 
7756
 
            "cssgrids-context"
7757
 
        ], 
7758
 
        "type": "css"
7759
 
    }, 
7760
 
    "cssbutton": {
7761
 
        "type": "css"
7762
 
    }, 
7763
 
    "cssfonts": {
7764
 
        "type": "css"
7765
 
    }, 
7766
 
    "cssfonts-context": {
7767
 
        "type": "css"
7768
 
    }, 
7769
 
    "cssgrids": {
7770
 
        "optional": [
7771
 
            "cssreset", 
7772
 
            "cssfonts"
7773
 
        ], 
7774
 
        "type": "css"
7775
 
    }, 
7776
 
    "cssgrids-base": {
7777
 
        "optional": [
7778
 
            "cssreset", 
7779
 
            "cssfonts"
7780
 
        ], 
7781
 
        "type": "css"
7782
 
    }, 
7783
 
    "cssgrids-units": {
7784
 
        "optional": [
7785
 
            "cssreset", 
7786
 
            "cssfonts"
7787
 
        ], 
7788
 
        "requires": [
7789
 
            "cssgrids-base"
7790
 
        ], 
7791
 
        "type": "css"
7792
 
    }, 
7793
 
    "cssreset": {
7794
 
        "type": "css"
7795
 
    }, 
7796
 
    "cssreset-context": {
7797
 
        "type": "css"
7798
 
    }, 
7799
 
    "dataschema": {
7800
 
        "use": [
7801
 
            "dataschema-base", 
7802
 
            "dataschema-json", 
7803
 
            "dataschema-xml", 
7804
 
            "dataschema-array", 
7805
 
            "dataschema-text"
7806
 
        ]
7807
 
    }, 
7808
 
    "dataschema-array": {
7809
 
        "requires": [
7810
 
            "dataschema-base"
7811
 
        ]
7812
 
    }, 
7813
 
    "dataschema-base": {
7814
 
        "requires": [
7815
 
            "base"
7816
 
        ]
7817
 
    }, 
7818
 
    "dataschema-json": {
7819
 
        "requires": [
7820
 
            "dataschema-base", 
7821
 
            "json"
7822
 
        ]
7823
 
    }, 
7824
 
    "dataschema-text": {
7825
 
        "requires": [
7826
 
            "dataschema-base"
7827
 
        ]
7828
 
    }, 
7829
 
    "dataschema-xml": {
7830
 
        "requires": [
7831
 
            "dataschema-base"
7832
 
        ]
7833
 
    }, 
7834
 
    "datasource": {
7835
 
        "use": [
7836
 
            "datasource-local", 
7837
 
            "datasource-io", 
7838
 
            "datasource-get", 
7839
 
            "datasource-function", 
7840
 
            "datasource-cache", 
7841
 
            "datasource-jsonschema", 
7842
 
            "datasource-xmlschema", 
7843
 
            "datasource-arrayschema", 
7844
 
            "datasource-textschema", 
7845
 
            "datasource-polling"
7846
 
        ]
7847
 
    }, 
7848
 
    "datasource-arrayschema": {
7849
 
        "requires": [
7850
 
            "datasource-local", 
7851
 
            "plugin", 
7852
 
            "dataschema-array"
7853
 
        ]
7854
 
    }, 
7855
 
    "datasource-cache": {
7856
 
        "requires": [
7857
 
            "datasource-local", 
7858
 
            "plugin", 
7859
 
            "cache-base"
7860
 
        ]
7861
 
    }, 
7862
 
    "datasource-function": {
7863
 
        "requires": [
7864
 
            "datasource-local"
7865
 
        ]
7866
 
    }, 
7867
 
    "datasource-get": {
7868
 
        "requires": [
7869
 
            "datasource-local", 
7870
 
            "get"
7871
 
        ]
7872
 
    }, 
7873
 
    "datasource-io": {
7874
 
        "requires": [
7875
 
            "datasource-local", 
7876
 
            "io-base"
7877
 
        ]
7878
 
    }, 
7879
 
    "datasource-jsonschema": {
7880
 
        "requires": [
7881
 
            "datasource-local", 
7882
 
            "plugin", 
7883
 
            "dataschema-json"
7884
 
        ]
7885
 
    }, 
7886
 
    "datasource-local": {
7887
 
        "requires": [
7888
 
            "base"
7889
 
        ]
7890
 
    }, 
7891
 
    "datasource-polling": {
7892
 
        "requires": [
7893
 
            "datasource-local"
7894
 
        ]
7895
 
    }, 
7896
 
    "datasource-textschema": {
7897
 
        "requires": [
7898
 
            "datasource-local", 
7899
 
            "plugin", 
7900
 
            "dataschema-text"
7901
 
        ]
7902
 
    }, 
7903
 
    "datasource-xmlschema": {
7904
 
        "requires": [
7905
 
            "datasource-local", 
7906
 
            "plugin", 
7907
 
            "dataschema-xml"
7908
 
        ]
7909
 
    }, 
7910
 
    "datatable": {
7911
 
        "use": [
7912
 
            "datatable-core", 
7913
 
            "datatable-head", 
7914
 
            "datatable-body", 
7915
 
            "datatable-base", 
7916
 
            "datatable-column-widths", 
7917
 
            "datatable-message", 
7918
 
            "datatable-mutable", 
7919
 
            "datatable-sort", 
7920
 
            "datatable-datasource"
7921
 
        ]
7922
 
    }, 
7923
 
    "datatable-base": {
7924
 
        "requires": [
7925
 
            "datatable-core", 
7926
 
            "datatable-head", 
7927
 
            "datatable-body", 
7928
 
            "base-build", 
7929
 
            "widget"
7930
 
        ], 
7931
 
        "skinnable": true
7932
 
    }, 
7933
 
    "datatable-base-deprecated": {
7934
 
        "requires": [
7935
 
            "recordset-base", 
7936
 
            "widget", 
7937
 
            "substitute", 
7938
 
            "event-mouseenter"
7939
 
        ], 
7940
 
        "skinnable": true
7941
 
    }, 
7942
 
    "datatable-body": {
7943
 
        "requires": [
7944
 
            "datatable-core", 
7945
 
            "view", 
7946
 
            "classnamemanager"
7947
 
        ]
7948
 
    }, 
7949
 
    "datatable-column-widths": {
7950
 
        "requires": [
7951
 
            "datatable-base"
7952
 
        ]
7953
 
    }, 
7954
 
    "datatable-core": {
7955
 
        "requires": [
7956
 
            "escape", 
7957
 
            "model-list", 
7958
 
            "node-event-delegate"
7959
 
        ]
7960
 
    }, 
7961
 
    "datatable-datasource": {
7962
 
        "requires": [
7963
 
            "datatable-base", 
7964
 
            "plugin", 
7965
 
            "datasource-local"
7966
 
        ]
7967
 
    }, 
7968
 
    "datatable-datasource-deprecated": {
7969
 
        "requires": [
7970
 
            "datatable-base-deprecated", 
7971
 
            "plugin", 
7972
 
            "datasource-local"
7973
 
        ]
7974
 
    }, 
7975
 
    "datatable-deprecated": {
7976
 
        "use": [
7977
 
            "datatable-base-deprecated", 
7978
 
            "datatable-datasource-deprecated", 
7979
 
            "datatable-sort-deprecated", 
7980
 
            "datatable-scroll-deprecated"
7981
 
        ]
7982
 
    }, 
7983
 
    "datatable-head": {
7984
 
        "requires": [
7985
 
            "datatable-core", 
7986
 
            "view", 
7987
 
            "classnamemanager"
7988
 
        ]
7989
 
    }, 
7990
 
    "datatable-message": {
7991
 
        "lang": [
7992
 
            "en"
7993
 
        ], 
7994
 
        "requires": [
7995
 
            "datatable-base"
7996
 
        ], 
7997
 
        "skinnable": true
7998
 
    }, 
7999
 
    "datatable-mutable": {
8000
 
        "requires": [
8001
 
            "datatable-base"
8002
 
        ]
8003
 
    }, 
8004
 
    "datatable-scroll": {
8005
 
        "requires": [
8006
 
            "datatable-base", 
8007
 
            "datatable-column-widths", 
8008
 
            "dom-screen"
8009
 
        ], 
8010
 
        "skinnable": true
8011
 
    }, 
8012
 
    "datatable-scroll-deprecated": {
8013
 
        "requires": [
8014
 
            "datatable-base-deprecated", 
8015
 
            "plugin"
8016
 
        ]
8017
 
    }, 
8018
 
    "datatable-sort": {
8019
 
        "lang": [
8020
 
            "en"
8021
 
        ], 
8022
 
        "requires": [
8023
 
            "datatable-base"
8024
 
        ], 
8025
 
        "skinnable": true
8026
 
    }, 
8027
 
    "datatable-sort-deprecated": {
8028
 
        "lang": [
8029
 
            "en"
8030
 
        ], 
8031
 
        "requires": [
8032
 
            "datatable-base-deprecated", 
8033
 
            "plugin", 
8034
 
            "recordset-sort"
8035
 
        ]
8036
 
    }, 
8037
 
    "datatype": {
8038
 
        "use": [
8039
 
            "datatype-number", 
8040
 
            "datatype-date", 
8041
 
            "datatype-xml"
8042
 
        ]
8043
 
    }, 
8044
 
    "datatype-date": {
8045
 
        "supersedes": [
8046
 
            "datatype-date-format"
8047
 
        ], 
8048
 
        "use": [
8049
 
            "datatype-date-parse", 
8050
 
            "datatype-date-format"
8051
 
        ]
8052
 
    }, 
8053
 
    "datatype-date-format": {
8054
 
        "lang": [
8055
 
            "ar", 
8056
 
            "ar-JO", 
8057
 
            "ca", 
8058
 
            "ca-ES", 
8059
 
            "da", 
8060
 
            "da-DK", 
8061
 
            "de", 
8062
 
            "de-AT", 
8063
 
            "de-DE", 
8064
 
            "el", 
8065
 
            "el-GR", 
8066
 
            "en", 
8067
 
            "en-AU", 
8068
 
            "en-CA", 
8069
 
            "en-GB", 
8070
 
            "en-IE", 
8071
 
            "en-IN", 
8072
 
            "en-JO", 
8073
 
            "en-MY", 
8074
 
            "en-NZ", 
8075
 
            "en-PH", 
8076
 
            "en-SG", 
8077
 
            "en-US", 
8078
 
            "es", 
8079
 
            "es-AR", 
8080
 
            "es-BO", 
8081
 
            "es-CL", 
8082
 
            "es-CO", 
8083
 
            "es-EC", 
8084
 
            "es-ES", 
8085
 
            "es-MX", 
8086
 
            "es-PE", 
8087
 
            "es-PY", 
8088
 
            "es-US", 
8089
 
            "es-UY", 
8090
 
            "es-VE", 
8091
 
            "fi", 
8092
 
            "fi-FI", 
8093
 
            "fr", 
8094
 
            "fr-BE", 
8095
 
            "fr-CA", 
8096
 
            "fr-FR", 
8097
 
            "hi", 
8098
 
            "hi-IN", 
8099
 
            "id", 
8100
 
            "id-ID", 
8101
 
            "it", 
8102
 
            "it-IT", 
8103
 
            "ja", 
8104
 
            "ja-JP", 
8105
 
            "ko", 
8106
 
            "ko-KR", 
8107
 
            "ms", 
8108
 
            "ms-MY", 
8109
 
            "nb", 
8110
 
            "nb-NO", 
8111
 
            "nl", 
8112
 
            "nl-BE", 
8113
 
            "nl-NL", 
8114
 
            "pl", 
8115
 
            "pl-PL", 
8116
 
            "pt", 
8117
 
            "pt-BR", 
8118
 
            "ro", 
8119
 
            "ro-RO", 
8120
 
            "ru", 
8121
 
            "ru-RU", 
8122
 
            "sv", 
8123
 
            "sv-SE", 
8124
 
            "th", 
8125
 
            "th-TH", 
8126
 
            "tr", 
8127
 
            "tr-TR", 
8128
 
            "vi", 
8129
 
            "vi-VN", 
8130
 
            "zh-Hans", 
8131
 
            "zh-Hans-CN", 
8132
 
            "zh-Hant", 
8133
 
            "zh-Hant-HK", 
8134
 
            "zh-Hant-TW"
8135
 
        ]
8136
 
    }, 
8137
 
    "datatype-date-math": {
8138
 
        "requires": [
8139
 
            "yui-base"
8140
 
        ]
8141
 
    }, 
8142
 
    "datatype-date-parse": {}, 
8143
 
    "datatype-number": {
8144
 
        "use": [
8145
 
            "datatype-number-parse", 
8146
 
            "datatype-number-format"
8147
 
        ]
8148
 
    }, 
8149
 
    "datatype-number-format": {}, 
8150
 
    "datatype-number-parse": {}, 
8151
 
    "datatype-xml": {
8152
 
        "use": [
8153
 
            "datatype-xml-parse", 
8154
 
            "datatype-xml-format"
8155
 
        ]
8156
 
    }, 
8157
 
    "datatype-xml-format": {}, 
8158
 
    "datatype-xml-parse": {}, 
8159
 
    "dd": {
8160
 
        "use": [
8161
 
            "dd-ddm-base", 
8162
 
            "dd-ddm", 
8163
 
            "dd-ddm-drop", 
8164
 
            "dd-drag", 
8165
 
            "dd-proxy", 
8166
 
            "dd-constrain", 
8167
 
            "dd-drop", 
8168
 
            "dd-scroll", 
8169
 
            "dd-delegate"
8170
 
        ]
8171
 
    }, 
8172
 
    "dd-constrain": {
8173
 
        "requires": [
8174
 
            "dd-drag"
8175
 
        ]
8176
 
    }, 
8177
 
    "dd-ddm": {
8178
 
        "requires": [
8179
 
            "dd-ddm-base", 
8180
 
            "event-resize"
8181
 
        ]
8182
 
    }, 
8183
 
    "dd-ddm-base": {
8184
 
        "requires": [
8185
 
            "node", 
8186
 
            "base", 
8187
 
            "yui-throttle", 
8188
 
            "classnamemanager"
8189
 
        ]
8190
 
    }, 
8191
 
    "dd-ddm-drop": {
8192
 
        "requires": [
8193
 
            "dd-ddm"
8194
 
        ]
8195
 
    }, 
8196
 
    "dd-delegate": {
8197
 
        "requires": [
8198
 
            "dd-drag", 
8199
 
            "dd-drop-plugin", 
8200
 
            "event-mouseenter"
8201
 
        ]
8202
 
    }, 
8203
 
    "dd-drag": {
8204
 
        "requires": [
8205
 
            "dd-ddm-base"
8206
 
        ]
8207
 
    }, 
8208
 
    "dd-drop": {
8209
 
        "requires": [
8210
 
            "dd-drag", 
8211
 
            "dd-ddm-drop"
8212
 
        ]
8213
 
    }, 
8214
 
    "dd-drop-plugin": {
8215
 
        "requires": [
8216
 
            "dd-drop"
8217
 
        ]
8218
 
    }, 
8219
 
    "dd-gestures": {
8220
 
        "condition": {
8221
 
            "name": "dd-gestures", 
8222
 
            "test": function(Y) {
8223
 
    return ((Y.config.win && ("ontouchstart" in Y.config.win)) && !(Y.UA.chrome && Y.UA.chrome < 6));
8224
 
}, 
8225
 
            "trigger": "dd-drag"
8226
 
        }, 
8227
 
        "requires": [
8228
 
            "dd-drag", 
8229
 
            "event-synthetic", 
8230
 
            "event-gestures"
8231
 
        ]
8232
 
    }, 
8233
 
    "dd-plugin": {
8234
 
        "optional": [
8235
 
            "dd-constrain", 
8236
 
            "dd-proxy"
8237
 
        ], 
8238
 
        "requires": [
8239
 
            "dd-drag"
8240
 
        ]
8241
 
    }, 
8242
 
    "dd-proxy": {
8243
 
        "requires": [
8244
 
            "dd-drag"
8245
 
        ]
8246
 
    }, 
8247
 
    "dd-scroll": {
8248
 
        "requires": [
8249
 
            "dd-drag"
8250
 
        ]
8251
 
    }, 
8252
 
    "dial": {
8253
 
        "lang": [
8254
 
            "en", 
8255
 
            "es"
8256
 
        ], 
8257
 
        "requires": [
8258
 
            "widget", 
8259
 
            "dd-drag", 
8260
 
            "substitute", 
8261
 
            "event-mouseenter", 
8262
 
            "event-move", 
8263
 
            "event-key", 
8264
 
            "transition", 
8265
 
            "intl"
8266
 
        ], 
8267
 
        "skinnable": true
8268
 
    }, 
8269
 
    "dom": {
8270
 
        "use": [
8271
 
            "dom-base", 
8272
 
            "dom-screen", 
8273
 
            "dom-style", 
8274
 
            "selector-native", 
8275
 
            "selector"
8276
 
        ]
8277
 
    }, 
8278
 
    "dom-base": {
8279
 
        "requires": [
8280
 
            "dom-core"
8281
 
        ]
8282
 
    }, 
8283
 
    "dom-core": {
8284
 
        "requires": [
8285
 
            "oop", 
8286
 
            "features"
8287
 
        ]
8288
 
    }, 
8289
 
    "dom-deprecated": {
8290
 
        "requires": [
8291
 
            "dom-base"
8292
 
        ]
8293
 
    }, 
8294
 
    "dom-screen": {
8295
 
        "requires": [
8296
 
            "dom-base", 
8297
 
            "dom-style"
8298
 
        ]
8299
 
    }, 
8300
 
    "dom-style": {
8301
 
        "requires": [
8302
 
            "dom-base"
8303
 
        ]
8304
 
    }, 
8305
 
    "dom-style-ie": {
8306
 
        "condition": {
8307
 
            "name": "dom-style-ie", 
8308
 
            "test": function (Y) {
8309
 
 
8310
 
    var testFeature = Y.Features.test,
8311
 
        addFeature = Y.Features.add,
8312
 
        WINDOW = Y.config.win,
8313
 
        DOCUMENT = Y.config.doc,
8314
 
        DOCUMENT_ELEMENT = 'documentElement',
8315
 
        ret = false;
8316
 
 
8317
 
    addFeature('style', 'computedStyle', {
8318
 
        test: function() {
8319
 
            return WINDOW && 'getComputedStyle' in WINDOW;
8320
 
        }
8321
 
    });
8322
 
 
8323
 
    addFeature('style', 'opacity', {
8324
 
        test: function() {
8325
 
            return DOCUMENT && 'opacity' in DOCUMENT[DOCUMENT_ELEMENT].style;
8326
 
        }
8327
 
    });
8328
 
 
8329
 
    ret =  (!testFeature('style', 'opacity') &&
8330
 
            !testFeature('style', 'computedStyle'));
8331
 
 
8332
 
    return ret;
8333
 
}, 
8334
 
            "trigger": "dom-style"
8335
 
        }, 
8336
 
        "requires": [
8337
 
            "dom-style"
8338
 
        ]
8339
 
    }, 
8340
 
    "dump": {
8341
 
        "requires": [
8342
 
            "yui-base"
8343
 
        ]
8344
 
    }, 
8345
 
    "editor": {
8346
 
        "use": [
8347
 
            "frame", 
8348
 
            "editor-selection", 
8349
 
            "exec-command", 
8350
 
            "editor-base", 
8351
 
            "editor-para", 
8352
 
            "editor-br", 
8353
 
            "editor-bidi", 
8354
 
            "editor-tab", 
8355
 
            "createlink-base"
8356
 
        ]
8357
 
    }, 
8358
 
    "editor-base": {
8359
 
        "requires": [
8360
 
            "base", 
8361
 
            "frame", 
8362
 
            "node", 
8363
 
            "exec-command", 
8364
 
            "editor-selection"
8365
 
        ]
8366
 
    }, 
8367
 
    "editor-bidi": {
8368
 
        "requires": [
8369
 
            "editor-base"
8370
 
        ]
8371
 
    }, 
8372
 
    "editor-br": {
8373
 
        "requires": [
8374
 
            "editor-base"
8375
 
        ]
8376
 
    }, 
8377
 
    "editor-lists": {
8378
 
        "requires": [
8379
 
            "editor-base"
8380
 
        ]
8381
 
    }, 
8382
 
    "editor-para": {
8383
 
        "requires": [
8384
 
            "editor-para-base"
8385
 
        ]
8386
 
    }, 
8387
 
    "editor-para-base": {
8388
 
        "requires": [
8389
 
            "editor-base"
8390
 
        ]
8391
 
    }, 
8392
 
    "editor-para-ie": {
8393
 
        "condition": {
8394
 
            "name": "editor-para-ie", 
8395
 
            "trigger": "editor-para", 
8396
 
            "ua": "ie", 
8397
 
            "when": "instead"
8398
 
        }, 
8399
 
        "requires": [
8400
 
            "editor-para-base"
8401
 
        ]
8402
 
    }, 
8403
 
    "editor-selection": {
8404
 
        "requires": [
8405
 
            "node"
8406
 
        ]
8407
 
    }, 
8408
 
    "editor-tab": {
8409
 
        "requires": [
8410
 
            "editor-base"
8411
 
        ]
8412
 
    }, 
8413
 
    "escape": {
8414
 
        "requires": [
8415
 
            "yui-base"
8416
 
        ]
8417
 
    }, 
8418
 
    "event": {
8419
 
        "after": [
8420
 
            "node-base"
8421
 
        ], 
8422
 
        "use": [
8423
 
            "event-base", 
8424
 
            "event-delegate", 
8425
 
            "event-synthetic", 
8426
 
            "event-mousewheel", 
8427
 
            "event-mouseenter", 
8428
 
            "event-key", 
8429
 
            "event-focus", 
8430
 
            "event-resize", 
8431
 
            "event-hover", 
8432
 
            "event-outside", 
8433
 
            "event-touch", 
8434
 
            "event-move", 
8435
 
            "event-flick", 
8436
 
            "event-valuechange"
8437
 
        ]
8438
 
    }, 
8439
 
    "event-base": {
8440
 
        "after": [
8441
 
            "node-base"
8442
 
        ], 
8443
 
        "requires": [
8444
 
            "event-custom-base"
8445
 
        ]
8446
 
    }, 
8447
 
    "event-base-ie": {
8448
 
        "after": [
8449
 
            "event-base"
8450
 
        ], 
8451
 
        "condition": {
8452
 
            "name": "event-base-ie", 
8453
 
            "test": function(Y) {
8454
 
    var imp = Y.config.doc && Y.config.doc.implementation;
8455
 
    return (imp && (!imp.hasFeature('Events', '2.0')));
8456
 
}, 
8457
 
            "trigger": "node-base"
8458
 
        }, 
8459
 
        "requires": [
8460
 
            "node-base"
8461
 
        ]
8462
 
    }, 
8463
 
    "event-contextmenu": {
8464
 
        "requires": [
8465
 
            "event-synthetic", 
8466
 
            "dom-screen"
8467
 
        ]
8468
 
    }, 
8469
 
    "event-custom": {
8470
 
        "use": [
8471
 
            "event-custom-base", 
8472
 
            "event-custom-complex"
8473
 
        ]
8474
 
    }, 
8475
 
    "event-custom-base": {
8476
 
        "requires": [
8477
 
            "oop"
8478
 
        ]
8479
 
    }, 
8480
 
    "event-custom-complex": {
8481
 
        "requires": [
8482
 
            "event-custom-base"
8483
 
        ]
8484
 
    }, 
8485
 
    "event-delegate": {
8486
 
        "requires": [
8487
 
            "node-base"
8488
 
        ]
8489
 
    }, 
8490
 
    "event-flick": {
8491
 
        "requires": [
8492
 
            "node-base", 
8493
 
            "event-touch", 
8494
 
            "event-synthetic"
8495
 
        ]
8496
 
    }, 
8497
 
    "event-focus": {
8498
 
        "requires": [
8499
 
            "event-synthetic"
8500
 
        ]
8501
 
    }, 
8502
 
    "event-gestures": {
8503
 
        "use": [
8504
 
            "event-flick", 
8505
 
            "event-move"
8506
 
        ]
8507
 
    }, 
8508
 
    "event-hover": {
8509
 
        "requires": [
8510
 
            "event-mouseenter"
8511
 
        ]
8512
 
    }, 
8513
 
    "event-key": {
8514
 
        "requires": [
8515
 
            "event-synthetic"
8516
 
        ]
8517
 
    }, 
8518
 
    "event-mouseenter": {
8519
 
        "requires": [
8520
 
            "event-synthetic"
8521
 
        ]
8522
 
    }, 
8523
 
    "event-mousewheel": {
8524
 
        "requires": [
8525
 
            "node-base"
8526
 
        ]
8527
 
    }, 
8528
 
    "event-move": {
8529
 
        "requires": [
8530
 
            "node-base", 
8531
 
            "event-touch", 
8532
 
            "event-synthetic"
8533
 
        ]
8534
 
    }, 
8535
 
    "event-outside": {
8536
 
        "requires": [
8537
 
            "event-synthetic"
8538
 
        ]
8539
 
    }, 
8540
 
    "event-resize": {
8541
 
        "requires": [
8542
 
            "node-base", 
8543
 
            "event-synthetic"
8544
 
        ]
8545
 
    }, 
8546
 
    "event-simulate": {
8547
 
        "requires": [
8548
 
            "event-base"
8549
 
        ]
8550
 
    }, 
8551
 
    "event-synthetic": {
8552
 
        "requires": [
8553
 
            "node-base", 
8554
 
            "event-custom-complex"
8555
 
        ]
8556
 
    }, 
8557
 
    "event-touch": {
8558
 
        "requires": [
8559
 
            "node-base"
8560
 
        ]
8561
 
    }, 
8562
 
    "event-valuechange": {
8563
 
        "requires": [
8564
 
            "event-focus", 
8565
 
            "event-synthetic"
8566
 
        ]
8567
 
    }, 
8568
 
    "exec-command": {
8569
 
        "requires": [
8570
 
            "frame"
8571
 
        ]
8572
 
    }, 
8573
 
    "features": {
8574
 
        "requires": [
8575
 
            "yui-base"
8576
 
        ]
8577
 
    }, 
8578
 
    "file": {
8579
 
        "requires": [
8580
 
            "file-flash", 
8581
 
            "file-html5"
8582
 
        ]
8583
 
    }, 
8584
 
    "file-flash": {
8585
 
        "requires": [
8586
 
            "base"
8587
 
        ]
8588
 
    }, 
8589
 
    "file-html5": {
8590
 
        "requires": [
8591
 
            "base"
8592
 
        ]
8593
 
    }, 
8594
 
    "frame": {
8595
 
        "requires": [
8596
 
            "base", 
8597
 
            "node", 
8598
 
            "selector-css3", 
8599
 
            "substitute", 
8600
 
            "yui-throttle"
8601
 
        ]
8602
 
    }, 
8603
 
    "get": {
8604
 
        "requires": [
8605
 
            "yui-base"
8606
 
        ]
8607
 
    }, 
8608
 
    "graphics": {
8609
 
        "requires": [
8610
 
            "node", 
8611
 
            "event-custom", 
8612
 
            "pluginhost", 
8613
 
            "matrix"
8614
 
        ]
8615
 
    }, 
8616
 
    "graphics-canvas": {
8617
 
        "condition": {
8618
 
            "name": "graphics-canvas", 
8619
 
            "test": function(Y) {
8620
 
    var DOCUMENT = Y.config.doc,
8621
 
        useCanvas = Y.config.defaultGraphicEngine && Y.config.defaultGraphicEngine == "canvas",
8622
 
                canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
8623
 
        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
8624
 
    return (!svg || useCanvas) && (canvas && canvas.getContext && canvas.getContext("2d"));
8625
 
}, 
8626
 
            "trigger": "graphics"
8627
 
        }, 
8628
 
        "requires": [
8629
 
            "graphics"
8630
 
        ]
8631
 
    }, 
8632
 
    "graphics-canvas-default": {
8633
 
        "condition": {
8634
 
            "name": "graphics-canvas-default", 
8635
 
            "test": function(Y) {
8636
 
    var DOCUMENT = Y.config.doc,
8637
 
        useCanvas = Y.config.defaultGraphicEngine && Y.config.defaultGraphicEngine == "canvas",
8638
 
                canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
8639
 
        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
8640
 
    return (!svg || useCanvas) && (canvas && canvas.getContext && canvas.getContext("2d"));
8641
 
}, 
8642
 
            "trigger": "graphics"
8643
 
        }
8644
 
    }, 
8645
 
    "graphics-svg": {
8646
 
        "condition": {
8647
 
            "name": "graphics-svg", 
8648
 
            "test": function(Y) {
8649
 
    var DOCUMENT = Y.config.doc,
8650
 
        useSVG = !Y.config.defaultGraphicEngine || Y.config.defaultGraphicEngine != "canvas",
8651
 
                canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
8652
 
        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
8653
 
    
8654
 
    return svg && (useSVG || !canvas);
8655
 
}, 
8656
 
            "trigger": "graphics"
8657
 
        }, 
8658
 
        "requires": [
8659
 
            "graphics"
8660
 
        ]
8661
 
    }, 
8662
 
    "graphics-svg-default": {
8663
 
        "condition": {
8664
 
            "name": "graphics-svg-default", 
8665
 
            "test": function(Y) {
8666
 
    var DOCUMENT = Y.config.doc,
8667
 
        useSVG = !Y.config.defaultGraphicEngine || Y.config.defaultGraphicEngine != "canvas",
8668
 
                canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
8669
 
        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
8670
 
    
8671
 
    return svg && (useSVG || !canvas);
8672
 
}, 
8673
 
            "trigger": "graphics"
8674
 
        }
8675
 
    }, 
8676
 
    "graphics-vml": {
8677
 
        "condition": {
8678
 
            "name": "graphics-vml", 
8679
 
            "test": function(Y) {
8680
 
    var DOCUMENT = Y.config.doc,
8681
 
                canvas = DOCUMENT && DOCUMENT.createElement("canvas");
8682
 
    return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
8683
 
}, 
8684
 
            "trigger": "graphics"
8685
 
        }, 
8686
 
        "requires": [
8687
 
            "graphics"
8688
 
        ]
8689
 
    }, 
8690
 
    "graphics-vml-default": {
8691
 
        "condition": {
8692
 
            "name": "graphics-vml-default", 
8693
 
            "test": function(Y) {
8694
 
    var DOCUMENT = Y.config.doc,
8695
 
                canvas = DOCUMENT && DOCUMENT.createElement("canvas");
8696
 
    return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
8697
 
}, 
8698
 
            "trigger": "graphics"
8699
 
        }
8700
 
    }, 
8701
 
    "handlebars": {
8702
 
        "use": [
8703
 
            "handlebars-compiler"
8704
 
        ]
8705
 
    }, 
8706
 
    "handlebars-base": {
8707
 
        "requires": [
8708
 
            "escape"
8709
 
        ]
8710
 
    }, 
8711
 
    "handlebars-compiler": {
8712
 
        "requires": [
8713
 
            "handlebars-base"
8714
 
        ]
8715
 
    }, 
8716
 
    "highlight": {
8717
 
        "use": [
8718
 
            "highlight-base", 
8719
 
            "highlight-accentfold"
8720
 
        ]
8721
 
    }, 
8722
 
    "highlight-accentfold": {
8723
 
        "requires": [
8724
 
            "highlight-base", 
8725
 
            "text-accentfold"
8726
 
        ]
8727
 
    }, 
8728
 
    "highlight-base": {
8729
 
        "requires": [
8730
 
            "array-extras", 
8731
 
            "classnamemanager", 
8732
 
            "escape", 
8733
 
            "text-wordbreak"
8734
 
        ]
8735
 
    }, 
8736
 
    "history": {
8737
 
        "use": [
8738
 
            "history-base", 
8739
 
            "history-hash", 
8740
 
            "history-hash-ie", 
8741
 
            "history-html5"
8742
 
        ]
8743
 
    }, 
8744
 
    "history-base": {
8745
 
        "requires": [
8746
 
            "event-custom-complex"
8747
 
        ]
8748
 
    }, 
8749
 
    "history-hash": {
8750
 
        "after": [
8751
 
            "history-html5"
8752
 
        ], 
8753
 
        "requires": [
8754
 
            "event-synthetic", 
8755
 
            "history-base", 
8756
 
            "yui-later"
8757
 
        ]
8758
 
    }, 
8759
 
    "history-hash-ie": {
8760
 
        "condition": {
8761
 
            "name": "history-hash-ie", 
8762
 
            "test": function (Y) {
8763
 
    var docMode = Y.config.doc && Y.config.doc.documentMode;
8764
 
 
8765
 
    return Y.UA.ie && (!('onhashchange' in Y.config.win) ||
8766
 
            !docMode || docMode < 8);
8767
 
}, 
8768
 
            "trigger": "history-hash"
8769
 
        }, 
8770
 
        "requires": [
8771
 
            "history-hash", 
8772
 
            "node-base"
8773
 
        ]
8774
 
    }, 
8775
 
    "history-html5": {
8776
 
        "optional": [
8777
 
            "json"
8778
 
        ], 
8779
 
        "requires": [
8780
 
            "event-base", 
8781
 
            "history-base", 
8782
 
            "node-base"
8783
 
        ]
8784
 
    }, 
8785
 
    "imageloader": {
8786
 
        "requires": [
8787
 
            "base-base", 
8788
 
            "node-style", 
8789
 
            "node-screen"
8790
 
        ]
8791
 
    }, 
8792
 
    "intl": {
8793
 
        "requires": [
8794
 
            "intl-base", 
8795
 
            "event-custom"
8796
 
        ]
8797
 
    }, 
8798
 
    "intl-base": {
8799
 
        "requires": [
8800
 
            "yui-base"
8801
 
        ]
8802
 
    }, 
8803
 
    "io": {
8804
 
        "use": [
8805
 
            "io-base", 
8806
 
            "io-xdr", 
8807
 
            "io-form", 
8808
 
            "io-upload-iframe", 
8809
 
            "io-queue"
8810
 
        ]
8811
 
    }, 
8812
 
    "io-base": {
8813
 
        "requires": [
8814
 
            "event-custom-base", 
8815
 
            "querystring-stringify-simple"
8816
 
        ]
8817
 
    }, 
8818
 
    "io-form": {
8819
 
        "requires": [
8820
 
            "io-base", 
8821
 
            "node-base"
8822
 
        ]
8823
 
    }, 
8824
 
    "io-nodejs": {
8825
 
        "condition": {
8826
 
            "name": "io-nodejs", 
8827
 
            "trigger": "io-base", 
8828
 
            "ua": "nodejs"
8829
 
        }, 
8830
 
        "requires": [
8831
 
            "io-base"
8832
 
        ]
8833
 
    }, 
8834
 
    "io-queue": {
8835
 
        "requires": [
8836
 
            "io-base", 
8837
 
            "queue-promote"
8838
 
        ]
8839
 
    }, 
8840
 
    "io-upload-iframe": {
8841
 
        "requires": [
8842
 
            "io-base", 
8843
 
            "node-base"
8844
 
        ]
8845
 
    }, 
8846
 
    "io-xdr": {
8847
 
        "requires": [
8848
 
            "io-base", 
8849
 
            "datatype-xml-parse"
8850
 
        ]
8851
 
    }, 
8852
 
    "json": {
8853
 
        "use": [
8854
 
            "json-parse", 
8855
 
            "json-stringify"
8856
 
        ]
8857
 
    }, 
8858
 
    "json-parse": {
8859
 
        "requires": [
8860
 
            "yui-base"
8861
 
        ]
8862
 
    }, 
8863
 
    "json-stringify": {
8864
 
        "requires": [
8865
 
            "yui-base"
8866
 
        ]
8867
 
    }, 
8868
 
    "jsonp": {
8869
 
        "requires": [
8870
 
            "get", 
8871
 
            "oop"
8872
 
        ]
8873
 
    }, 
8874
 
    "jsonp-url": {
8875
 
        "requires": [
8876
 
            "jsonp"
8877
 
        ]
8878
 
    }, 
8879
 
    "loader": {
8880
 
        "use": [
8881
 
            "loader-base", 
8882
 
            "loader-rollup", 
8883
 
            "loader-yui3"
8884
 
        ]
8885
 
    }, 
8886
 
    "loader-base": {
8887
 
        "requires": [
8888
 
            "get", 
8889
 
            "features"
8890
 
        ]
8891
 
    }, 
8892
 
    "loader-rollup": {
8893
 
        "requires": [
8894
 
            "loader-base"
8895
 
        ]
8896
 
    }, 
8897
 
    "loader-yui3": {
8898
 
        "requires": [
8899
 
            "loader-base"
8900
 
        ]
8901
 
    }, 
8902
 
    "matrix": {
8903
 
        "requires": [
8904
 
            "yui-base"
8905
 
        ]
8906
 
    }, 
8907
 
    "model": {
8908
 
        "requires": [
8909
 
            "base-build", 
8910
 
            "escape", 
8911
 
            "json-parse"
8912
 
        ]
8913
 
    }, 
8914
 
    "model-list": {
8915
 
        "requires": [
8916
 
            "array-extras", 
8917
 
            "array-invoke", 
8918
 
            "arraylist", 
8919
 
            "base-build", 
8920
 
            "escape", 
8921
 
            "json-parse", 
8922
 
            "model"
8923
 
        ]
8924
 
    }, 
8925
 
    "node": {
8926
 
        "use": [
8927
 
            "node-base", 
8928
 
            "node-event-delegate", 
8929
 
            "node-pluginhost", 
8930
 
            "node-screen", 
8931
 
            "node-style"
8932
 
        ]
8933
 
    }, 
8934
 
    "node-base": {
8935
 
        "requires": [
8936
 
            "event-base", 
8937
 
            "node-core", 
8938
 
            "dom-base"
8939
 
        ]
8940
 
    }, 
8941
 
    "node-core": {
8942
 
        "requires": [
8943
 
            "dom-core", 
8944
 
            "selector"
8945
 
        ]
8946
 
    }, 
8947
 
    "node-deprecated": {
8948
 
        "requires": [
8949
 
            "node-base"
8950
 
        ]
8951
 
    }, 
8952
 
    "node-event-delegate": {
8953
 
        "requires": [
8954
 
            "node-base", 
8955
 
            "event-delegate"
8956
 
        ]
8957
 
    }, 
8958
 
    "node-event-html5": {
8959
 
        "requires": [
8960
 
            "node-base"
8961
 
        ]
8962
 
    }, 
8963
 
    "node-event-simulate": {
8964
 
        "requires": [
8965
 
            "node-base", 
8966
 
            "event-simulate"
8967
 
        ]
8968
 
    }, 
8969
 
    "node-flick": {
8970
 
        "requires": [
8971
 
            "classnamemanager", 
8972
 
            "transition", 
8973
 
            "event-flick", 
8974
 
            "plugin"
8975
 
        ], 
8976
 
        "skinnable": true
8977
 
    }, 
8978
 
    "node-focusmanager": {
8979
 
        "requires": [
8980
 
            "attribute", 
8981
 
            "node", 
8982
 
            "plugin", 
8983
 
            "node-event-simulate", 
8984
 
            "event-key", 
8985
 
            "event-focus"
8986
 
        ]
8987
 
    }, 
8988
 
    "node-load": {
8989
 
        "requires": [
8990
 
            "node-base", 
8991
 
            "io-base"
8992
 
        ]
8993
 
    }, 
8994
 
    "node-menunav": {
8995
 
        "requires": [
8996
 
            "node", 
8997
 
            "classnamemanager", 
8998
 
            "plugin", 
8999
 
            "node-focusmanager"
9000
 
        ], 
9001
 
        "skinnable": true
9002
 
    }, 
9003
 
    "node-pluginhost": {
9004
 
        "requires": [
9005
 
            "node-base", 
9006
 
            "pluginhost"
9007
 
        ]
9008
 
    }, 
9009
 
    "node-screen": {
9010
 
        "requires": [
9011
 
            "dom-screen", 
9012
 
            "node-base"
9013
 
        ]
9014
 
    }, 
9015
 
    "node-style": {
9016
 
        "requires": [
9017
 
            "dom-style", 
9018
 
            "node-base"
9019
 
        ]
9020
 
    }, 
9021
 
    "oop": {
9022
 
        "requires": [
9023
 
            "yui-base"
9024
 
        ]
9025
 
    }, 
9026
 
    "overlay": {
9027
 
        "requires": [
9028
 
            "widget", 
9029
 
            "widget-stdmod", 
9030
 
            "widget-position", 
9031
 
            "widget-position-align", 
9032
 
            "widget-stack", 
9033
 
            "widget-position-constrain"
9034
 
        ], 
9035
 
        "skinnable": true
9036
 
    }, 
9037
 
    "panel": {
9038
 
        "requires": [
9039
 
            "widget", 
9040
 
            "widget-autohide", 
9041
 
            "widget-buttons", 
9042
 
            "widget-modality", 
9043
 
            "widget-position", 
9044
 
            "widget-position-align", 
9045
 
            "widget-position-constrain", 
9046
 
            "widget-stack", 
9047
 
            "widget-stdmod"
9048
 
        ], 
9049
 
        "skinnable": true
9050
 
    }, 
9051
 
    "parallel": {
9052
 
        "requires": [
9053
 
            "yui-base"
9054
 
        ]
9055
 
    }, 
9056
 
    "pjax": {
9057
 
        "requires": [
9058
 
            "pjax-base", 
9059
 
            "io-base"
9060
 
        ]
9061
 
    }, 
9062
 
    "pjax-base": {
9063
 
        "requires": [
9064
 
            "classnamemanager", 
9065
 
            "node-event-delegate", 
9066
 
            "router"
9067
 
        ]
9068
 
    }, 
9069
 
    "pjax-plugin": {
9070
 
        "requires": [
9071
 
            "node-pluginhost", 
9072
 
            "pjax", 
9073
 
            "plugin"
9074
 
        ]
9075
 
    }, 
9076
 
    "plugin": {
9077
 
        "requires": [
9078
 
            "base-base"
9079
 
        ]
9080
 
    }, 
9081
 
    "pluginhost": {
9082
 
        "use": [
9083
 
            "pluginhost-base", 
9084
 
            "pluginhost-config"
9085
 
        ]
9086
 
    }, 
9087
 
    "pluginhost-base": {
9088
 
        "requires": [
9089
 
            "yui-base"
9090
 
        ]
9091
 
    }, 
9092
 
    "pluginhost-config": {
9093
 
        "requires": [
9094
 
            "pluginhost-base"
9095
 
        ]
9096
 
    }, 
9097
 
    "profiler": {
9098
 
        "requires": [
9099
 
            "yui-base"
9100
 
        ]
9101
 
    }, 
9102
 
    "querystring": {
9103
 
        "use": [
9104
 
            "querystring-parse", 
9105
 
            "querystring-stringify"
9106
 
        ]
9107
 
    }, 
9108
 
    "querystring-parse": {
9109
 
        "requires": [
9110
 
            "yui-base", 
9111
 
            "array-extras"
9112
 
        ]
9113
 
    }, 
9114
 
    "querystring-parse-simple": {
9115
 
        "requires": [
9116
 
            "yui-base"
9117
 
        ]
9118
 
    }, 
9119
 
    "querystring-stringify": {
9120
 
        "requires": [
9121
 
            "yui-base"
9122
 
        ]
9123
 
    }, 
9124
 
    "querystring-stringify-simple": {
9125
 
        "requires": [
9126
 
            "yui-base"
9127
 
        ]
9128
 
    }, 
9129
 
    "queue-promote": {
9130
 
        "requires": [
9131
 
            "yui-base"
9132
 
        ]
9133
 
    }, 
9134
 
    "range-slider": {
9135
 
        "requires": [
9136
 
            "slider-base", 
9137
 
            "slider-value-range", 
9138
 
            "clickable-rail"
9139
 
        ]
9140
 
    }, 
9141
 
    "recordset": {
9142
 
        "use": [
9143
 
            "recordset-base", 
9144
 
            "recordset-sort", 
9145
 
            "recordset-filter", 
9146
 
            "recordset-indexer"
9147
 
        ]
9148
 
    }, 
9149
 
    "recordset-base": {
9150
 
        "requires": [
9151
 
            "base", 
9152
 
            "arraylist"
9153
 
        ]
9154
 
    }, 
9155
 
    "recordset-filter": {
9156
 
        "requires": [
9157
 
            "recordset-base", 
9158
 
            "array-extras", 
9159
 
            "plugin"
9160
 
        ]
9161
 
    }, 
9162
 
    "recordset-indexer": {
9163
 
        "requires": [
9164
 
            "recordset-base", 
9165
 
            "plugin"
9166
 
        ]
9167
 
    }, 
9168
 
    "recordset-sort": {
9169
 
        "requires": [
9170
 
            "arraysort", 
9171
 
            "recordset-base", 
9172
 
            "plugin"
9173
 
        ]
9174
 
    }, 
9175
 
    "resize": {
9176
 
        "use": [
9177
 
            "resize-base", 
9178
 
            "resize-proxy", 
9179
 
            "resize-constrain"
9180
 
        ]
9181
 
    }, 
9182
 
    "resize-base": {
9183
 
        "requires": [
9184
 
            "base", 
9185
 
            "widget", 
9186
 
            "substitute", 
9187
 
            "event", 
9188
 
            "oop", 
9189
 
            "dd-drag", 
9190
 
            "dd-delegate", 
9191
 
            "dd-drop"
9192
 
        ], 
9193
 
        "skinnable": true
9194
 
    }, 
9195
 
    "resize-constrain": {
9196
 
        "requires": [
9197
 
            "plugin", 
9198
 
            "resize-base"
9199
 
        ]
9200
 
    }, 
9201
 
    "resize-plugin": {
9202
 
        "optional": [
9203
 
            "resize-constrain"
9204
 
        ], 
9205
 
        "requires": [
9206
 
            "resize-base", 
9207
 
            "plugin"
9208
 
        ]
9209
 
    }, 
9210
 
    "resize-proxy": {
9211
 
        "requires": [
9212
 
            "plugin", 
9213
 
            "resize-base"
9214
 
        ]
9215
 
    }, 
9216
 
    "rls": {
9217
 
        "requires": [
9218
 
            "get", 
9219
 
            "features"
9220
 
        ]
9221
 
    }, 
9222
 
    "router": {
9223
 
        "optional": [
9224
 
            "querystring-parse"
9225
 
        ], 
9226
 
        "requires": [
9227
 
            "array-extras", 
9228
 
            "base-build", 
9229
 
            "history"
9230
 
        ]
9231
 
    }, 
9232
 
    "scrollview": {
9233
 
        "requires": [
9234
 
            "scrollview-base", 
9235
 
            "scrollview-scrollbars"
9236
 
        ]
9237
 
    }, 
9238
 
    "scrollview-base": {
9239
 
        "requires": [
9240
 
            "widget", 
9241
 
            "event-gestures", 
9242
 
            "event-mousewheel", 
9243
 
            "transition"
9244
 
        ], 
9245
 
        "skinnable": true
9246
 
    }, 
9247
 
    "scrollview-base-ie": {
9248
 
        "condition": {
9249
 
            "name": "scrollview-base-ie", 
9250
 
            "trigger": "scrollview-base", 
9251
 
            "ua": "ie"
9252
 
        }, 
9253
 
        "requires": [
9254
 
            "scrollview-base"
9255
 
        ]
9256
 
    }, 
9257
 
    "scrollview-list": {
9258
 
        "requires": [
9259
 
            "plugin", 
9260
 
            "classnamemanager"
9261
 
        ], 
9262
 
        "skinnable": true
9263
 
    }, 
9264
 
    "scrollview-paginator": {
9265
 
        "requires": [
9266
 
            "plugin"
9267
 
        ]
9268
 
    }, 
9269
 
    "scrollview-scrollbars": {
9270
 
        "requires": [
9271
 
            "classnamemanager", 
9272
 
            "transition", 
9273
 
            "plugin"
9274
 
        ], 
9275
 
        "skinnable": true
9276
 
    }, 
9277
 
    "selector": {
9278
 
        "requires": [
9279
 
            "selector-native"
9280
 
        ]
9281
 
    }, 
9282
 
    "selector-css2": {
9283
 
        "condition": {
9284
 
            "name": "selector-css2", 
9285
 
            "test": function (Y) {
9286
 
    var DOCUMENT = Y.config.doc,
9287
 
        ret = DOCUMENT && !('querySelectorAll' in DOCUMENT);
9288
 
 
9289
 
    return ret;
9290
 
}, 
9291
 
            "trigger": "selector"
9292
 
        }, 
9293
 
        "requires": [
9294
 
            "selector-native"
9295
 
        ]
9296
 
    }, 
9297
 
    "selector-css3": {
9298
 
        "requires": [
9299
 
            "selector-native", 
9300
 
            "selector-css2"
9301
 
        ]
9302
 
    }, 
9303
 
    "selector-native": {
9304
 
        "requires": [
9305
 
            "dom-base"
9306
 
        ]
9307
 
    }, 
9308
 
    "shim-plugin": {
9309
 
        "requires": [
9310
 
            "node-style", 
9311
 
            "node-pluginhost"
9312
 
        ]
9313
 
    }, 
9314
 
    "slider": {
9315
 
        "use": [
9316
 
            "slider-base", 
9317
 
            "slider-value-range", 
9318
 
            "clickable-rail", 
9319
 
            "range-slider"
9320
 
        ]
9321
 
    }, 
9322
 
    "slider-base": {
9323
 
        "requires": [
9324
 
            "widget", 
9325
 
            "dd-constrain", 
9326
 
            "substitute", 
9327
 
            "event-key"
9328
 
        ], 
9329
 
        "skinnable": true
9330
 
    }, 
9331
 
    "slider-value-range": {
9332
 
        "requires": [
9333
 
            "slider-base"
9334
 
        ]
9335
 
    }, 
9336
 
    "sortable": {
9337
 
        "requires": [
9338
 
            "dd-delegate", 
9339
 
            "dd-drop-plugin", 
9340
 
            "dd-proxy"
9341
 
        ]
9342
 
    }, 
9343
 
    "sortable-scroll": {
9344
 
        "requires": [
9345
 
            "dd-scroll", 
9346
 
            "sortable"
9347
 
        ]
9348
 
    }, 
9349
 
    "stylesheet": {
9350
 
        "requires": [
9351
 
            "yui-base"
9352
 
        ]
9353
 
    }, 
9354
 
    "substitute": {
9355
 
        "optional": [
9356
 
            "dump"
9357
 
        ], 
9358
 
        "requires": [
9359
 
            "yui-base"
9360
 
        ]
9361
 
    }, 
9362
 
    "swf": {
9363
 
        "requires": [
9364
 
            "event-custom", 
9365
 
            "node", 
9366
 
            "swfdetect", 
9367
 
            "escape"
9368
 
        ]
9369
 
    }, 
9370
 
    "swfdetect": {
9371
 
        "requires": [
9372
 
            "yui-base"
9373
 
        ]
9374
 
    }, 
9375
 
    "tabview": {
9376
 
        "requires": [
9377
 
            "widget", 
9378
 
            "widget-parent", 
9379
 
            "widget-child", 
9380
 
            "tabview-base", 
9381
 
            "node-pluginhost", 
9382
 
            "node-focusmanager"
9383
 
        ], 
9384
 
        "skinnable": true
9385
 
    }, 
9386
 
    "tabview-base": {
9387
 
        "requires": [
9388
 
            "node-event-delegate", 
9389
 
            "classnamemanager", 
9390
 
            "skin-sam-tabview"
9391
 
        ]
9392
 
    }, 
9393
 
    "tabview-plugin": {
9394
 
        "requires": [
9395
 
            "tabview-base"
9396
 
        ]
9397
 
    }, 
9398
 
    "test": {
9399
 
        "requires": [
9400
 
            "event-simulate", 
9401
 
            "event-custom", 
9402
 
            "substitute", 
9403
 
            "json-stringify"
9404
 
        ], 
9405
 
        "skinnable": true
9406
 
    }, 
9407
 
    "test-console": {
9408
 
        "requires": [
9409
 
            "console-filters", 
9410
 
            "test"
9411
 
        ], 
9412
 
        "skinnable": true
9413
 
    }, 
9414
 
    "text": {
9415
 
        "use": [
9416
 
            "text-accentfold", 
9417
 
            "text-wordbreak"
9418
 
        ]
9419
 
    }, 
9420
 
    "text-accentfold": {
9421
 
        "requires": [
9422
 
            "array-extras", 
9423
 
            "text-data-accentfold"
9424
 
        ]
9425
 
    }, 
9426
 
    "text-data-accentfold": {
9427
 
        "requires": [
9428
 
            "yui-base"
9429
 
        ]
9430
 
    }, 
9431
 
    "text-data-wordbreak": {
9432
 
        "requires": [
9433
 
            "yui-base"
9434
 
        ]
9435
 
    }, 
9436
 
    "text-wordbreak": {
9437
 
        "requires": [
9438
 
            "array-extras", 
9439
 
            "text-data-wordbreak"
9440
 
        ]
9441
 
    }, 
9442
 
    "transition": {
9443
 
        "requires": [
9444
 
            "node-style"
9445
 
        ]
9446
 
    }, 
9447
 
    "transition-timer": {
9448
 
        "condition": {
9449
 
            "name": "transition-timer", 
9450
 
            "test": function (Y) {
9451
 
    var DOCUMENT = Y.config.doc,
9452
 
        node = (DOCUMENT) ? DOCUMENT.documentElement: null,
9453
 
        ret = true;
9454
 
 
9455
 
    if (node && node.style) {
9456
 
        ret = !('MozTransition' in node.style || 'WebkitTransition' in node.style);
9457
 
    } 
9458
 
 
9459
 
    return ret;
9460
 
}, 
9461
 
            "trigger": "transition"
9462
 
        }, 
9463
 
        "requires": [
9464
 
            "transition"
9465
 
        ]
9466
 
    }, 
9467
 
    "uploader": {
9468
 
        "requires": [
9469
 
            "uploader-html5", 
9470
 
            "uploader-flash"
9471
 
        ]
9472
 
    }, 
9473
 
    "uploader-deprecated": {
9474
 
        "requires": [
9475
 
            "event-custom", 
9476
 
            "node", 
9477
 
            "base", 
9478
 
            "swf"
9479
 
        ]
9480
 
    }, 
9481
 
    "uploader-flash": {
9482
 
        "requires": [
9483
 
            "swf", 
9484
 
            "widget", 
9485
 
            "substitute", 
9486
 
            "base", 
9487
 
            "cssbutton", 
9488
 
            "node", 
9489
 
            "event-custom", 
9490
 
            "file-flash", 
9491
 
            "uploader-queue"
9492
 
        ]
9493
 
    }, 
9494
 
    "uploader-html5": {
9495
 
        "requires": [
9496
 
            "widget", 
9497
 
            "node-event-simulate", 
9498
 
            "substitute", 
9499
 
            "file-html5", 
9500
 
            "uploader-queue"
9501
 
        ]
9502
 
    }, 
9503
 
    "uploader-queue": {
9504
 
        "requires": [
9505
 
            "base"
9506
 
        ]
9507
 
    }, 
9508
 
    "view": {
9509
 
        "requires": [
9510
 
            "base-build", 
9511
 
            "node-event-delegate"
9512
 
        ]
9513
 
    }, 
9514
 
    "view-node-map": {
9515
 
        "requires": [
9516
 
            "view"
9517
 
        ]
9518
 
    }, 
9519
 
    "widget": {
9520
 
        "use": [
9521
 
            "widget-base", 
9522
 
            "widget-htmlparser", 
9523
 
            "widget-skin", 
9524
 
            "widget-uievents"
9525
 
        ]
9526
 
    }, 
9527
 
    "widget-anim": {
9528
 
        "requires": [
9529
 
            "anim-base", 
9530
 
            "plugin", 
9531
 
            "widget"
9532
 
        ]
9533
 
    }, 
9534
 
    "widget-autohide": {
9535
 
        "requires": [
9536
 
            "base-build", 
9537
 
            "event-key", 
9538
 
            "event-outside", 
9539
 
            "widget"
9540
 
        ]
9541
 
    }, 
9542
 
    "widget-base": {
9543
 
        "requires": [
9544
 
            "attribute", 
9545
 
            "base-base", 
9546
 
            "base-pluginhost", 
9547
 
            "classnamemanager", 
9548
 
            "event-focus", 
9549
 
            "node-base", 
9550
 
            "node-style"
9551
 
        ], 
9552
 
        "skinnable": true
9553
 
    }, 
9554
 
    "widget-base-ie": {
9555
 
        "condition": {
9556
 
            "name": "widget-base-ie", 
9557
 
            "trigger": "widget-base", 
9558
 
            "ua": "ie"
9559
 
        }, 
9560
 
        "requires": [
9561
 
            "widget-base"
9562
 
        ]
9563
 
    }, 
9564
 
    "widget-buttons": {
9565
 
        "requires": [
9566
 
            "button-plugin", 
9567
 
            "cssbutton", 
9568
 
            "widget-stdmod"
9569
 
        ]
9570
 
    }, 
9571
 
    "widget-child": {
9572
 
        "requires": [
9573
 
            "base-build", 
9574
 
            "widget"
9575
 
        ]
9576
 
    }, 
9577
 
    "widget-htmlparser": {
9578
 
        "requires": [
9579
 
            "widget-base"
9580
 
        ]
9581
 
    }, 
9582
 
    "widget-locale": {
9583
 
        "requires": [
9584
 
            "widget-base"
9585
 
        ]
9586
 
    }, 
9587
 
    "widget-modality": {
9588
 
        "requires": [
9589
 
            "base-build", 
9590
 
            "event-outside", 
9591
 
            "widget"
9592
 
        ], 
9593
 
        "skinnable": true
9594
 
    }, 
9595
 
    "widget-parent": {
9596
 
        "requires": [
9597
 
            "arraylist", 
9598
 
            "base-build", 
9599
 
            "widget"
9600
 
        ]
9601
 
    }, 
9602
 
    "widget-position": {
9603
 
        "requires": [
9604
 
            "base-build", 
9605
 
            "node-screen", 
9606
 
            "widget"
9607
 
        ]
9608
 
    }, 
9609
 
    "widget-position-align": {
9610
 
        "requires": [
9611
 
            "widget-position"
9612
 
        ]
9613
 
    }, 
9614
 
    "widget-position-constrain": {
9615
 
        "requires": [
9616
 
            "widget-position"
9617
 
        ]
9618
 
    }, 
9619
 
    "widget-skin": {
9620
 
        "requires": [
9621
 
            "widget-base"
9622
 
        ]
9623
 
    }, 
9624
 
    "widget-stack": {
9625
 
        "requires": [
9626
 
            "base-build", 
9627
 
            "widget"
9628
 
        ], 
9629
 
        "skinnable": true
9630
 
    }, 
9631
 
    "widget-stdmod": {
9632
 
        "requires": [
9633
 
            "base-build", 
9634
 
            "widget"
9635
 
        ]
9636
 
    }, 
9637
 
    "widget-uievents": {
9638
 
        "requires": [
9639
 
            "node-event-delegate", 
9640
 
            "widget-base"
9641
 
        ]
9642
 
    }, 
9643
 
    "yql": {
9644
 
        "requires": [
9645
 
            "jsonp", 
9646
 
            "jsonp-url"
9647
 
        ]
9648
 
    }, 
9649
 
    "yui": {}, 
9650
 
    "yui-base": {}, 
9651
 
    "yui-later": {
9652
 
        "requires": [
9653
 
            "yui-base"
9654
 
        ]
9655
 
    }, 
9656
 
    "yui-log": {
9657
 
        "requires": [
9658
 
            "yui-base"
9659
 
        ]
9660
 
    }, 
9661
 
    "yui-rls": {}, 
9662
 
    "yui-throttle": {
9663
 
        "requires": [
9664
 
            "yui-base"
9665
 
        ]
9666
 
    }
9667
 
};
9668
 
YUI.Env[Y.version].md5 = 'f5a3bc9bda2441a3b15fb52c567fc1f7';
9669
 
 
9670
 
 
9671
 
}, '3.5.1' ,{requires:['loader-base']});
9672
 
 
9673
 
 
9674
 
YUI.add('yui', function(Y){}, '3.5.1' ,{use:['yui-base','get','features','intl-base','yui-log','yui-log-nodejs','yui-later','loader-base', 'loader-rollup', 'loader-yui3']});
9675