yui-core-debug.js revision 71651656e38f39cf8f088e75166fb0bf51c52eb1
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * The YUI module contains the components required for building the YUI seed
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync * file. This includes the script loading mechanism, a simple queue, and
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * the core utilities for the library.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @module yui
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @submodule yui-base
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncif (typeof YUI != 'undefined') {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync YUI._YUI = YUI;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncThe YUI global namespace object. If YUI is already defined, the
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncexisting YUI object will not be overwritten so that defined
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncnamespaces are preserved. It is the constructor for the object
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncthe end user interacts with. As indicated below, each instance
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynchas full custom event support, but only if the event system
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncis available. This is a self-instantiable factory function. You
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynccan invoke it directly like this:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync YUI().use('*', function(Y) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // ready
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync });
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncBut it also works like this:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var Y = YUI();
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync@class YUI
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync@constructor
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync@global
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync@uses EventTarget
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync@param o* {object} 0..n optional configuration objects. these values
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncare store in Y.config. See <a href="config.html">Config</a> for the list of supported
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncproperties.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync*/
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /*global YUI*/
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /*global YUI_config*/
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var YUI = function() {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var i = 0,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y = this,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync args = arguments,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync l = args.length,
63636e131aa8b7d2aa48f3f928102a02c0f454bcvboxsync instanceOf = function(o, type) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (o && o.hasOwnProperty && (o instanceof type));
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync gconf = (typeof YUI_config !== 'undefined') && YUI_config;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!(instanceOf(Y, YUI))) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y = new YUI();
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // set up the core environment
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y._init();
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync YUI.GlobalConfig is a master configuration that might span
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync multiple contexts in a non-browser environment. It is applied
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync first to all instances in all contexts.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync @property YUI.GlobalConfig
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync @type {Object}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync @global
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync @example
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
22e5e79c3462b52f8da631a7b92f82ed03550d52vboxsync
22e5e79c3462b52f8da631a7b92f82ed03550d52vboxsync YUI.GlobalConfig = {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync filter: 'debug'
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync };
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync YUI().use('node', function(Y) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync //debug files used here
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync });
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync YUI({
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync filter: 'min'
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }).use('node', function(Y) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync //min files used here
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync });
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (YUI.GlobalConfig) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.applyConfig(YUI.GlobalConfig);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync YUI_config is a page-level config. It is applied to all
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync instances created on the page. This is applied after
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync YUI.GlobalConfig, and before the instance level configuration
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync objects.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync @global
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync @property YUI_config
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync @type {Object}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync @example
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync //Single global var to include before YUI seed file
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync YUI_config = {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync filter: 'debug'
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync };
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync YUI().use('node', function(Y) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync //debug files used here
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync });
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync YUI({
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync filter: 'min'
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }).use('node', function(Y) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync //min files used here
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync });
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (gconf) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.applyConfig(gconf);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // bind the specified additional modules for this instance
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!l) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y._setup();
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (l) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // Each instance can accept one or more configuration objects.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // These are applied after YUI.GlobalConfig and YUI_Config,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // overriding values set in those config files if there is a '
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // matching property.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (; i < l; i++) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.applyConfig(args[i]);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y._setup();
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.instanceOf = instanceOf;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return Y;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync };
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync(function() {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var proto, prop,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync VERSION = '@VERSION@',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync PERIOD = '.',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync BASE = 'http://yui.yahooapis.com/',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync DOC_LABEL = 'yui3-js-enabled',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync NOOP = function() {},
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync SLICE = Array.prototype.slice,
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync APPLY_TO_AUTH = { 'io.xdrReady': 1, // the functions applyTo
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync 'io.xdrResponse': 1, // can call. this should
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync 'SWF.eventHandler': 1 }, // be done at build time
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync hasWin = (typeof window != 'undefined'),
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync win = (hasWin) ? window : null,
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync doc = (hasWin) ? win.document : null,
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync docEl = doc && doc.documentElement,
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync docClass = docEl && docEl.className,
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync instances = {},
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync time = new Date().getTime(),
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync add = function(el, type, fn, capture) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (el && el.addEventListener) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync el.addEventListener(type, fn, capture);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else if (el && el.attachEvent) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync el.attachEvent('on' + type, fn);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync remove = function(el, type, fn, capture) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (el && el.removeEventListener) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // this can throw an uncaught exception in FF
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync try {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync el.removeEventListener(type, fn, capture);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } catch (ex) {}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else if (el && el.detachEvent) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync el.detachEvent('on' + type, fn);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync handleLoad = function() {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync YUI.Env.windowLoaded = true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync YUI.Env.DOMReady = true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (hasWin) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync remove(window, 'load', handleLoad);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync getLoader = function(Y, o) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var loader = Y.Env._loader;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (loader) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync //loader._config(Y.config);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync loader.ignoreRegistered = false;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync loader.onEnd = null;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync loader.data = null;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync loader.required = [];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync loader.loadType = null;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync loader = new Y.Loader(Y.config);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.Env._loader = loader;
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync
447cbf113f44132911fc13dc33cb26603759b82evboxsync return loader;
447cbf113f44132911fc13dc33cb26603759b82evboxsync },
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync clobber = function(r, s) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync for (var i in s) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync if (s.hasOwnProperty(i)) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync r[i] = s[i];
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync }
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync },
daac39eba667f9e64b03ef08bb5cd7c965cd72c2vboxsync
daac39eba667f9e64b03ef08bb5cd7c965cd72c2vboxsync ALREADY_DONE = { success: true };
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync
daac39eba667f9e64b03ef08bb5cd7c965cd72c2vboxsync// Stamp the documentElement (HTML) with a class of "yui-loaded" to
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync// enable styles that need to key off of JS being enabled.
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsyncif (docEl && docClass.indexOf(DOC_LABEL) == -1) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync if (docClass) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync docClass += ' ';
daac39eba667f9e64b03ef08bb5cd7c965cd72c2vboxsync }
daac39eba667f9e64b03ef08bb5cd7c965cd72c2vboxsync docClass += DOC_LABEL;
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync docEl.className = docClass;
daac39eba667f9e64b03ef08bb5cd7c965cd72c2vboxsync}
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsyncif (VERSION.indexOf('@') > -1) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync VERSION = '3.3.0'; // dev time hack for cdn test
daac39eba667f9e64b03ef08bb5cd7c965cd72c2vboxsync}
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsyncproto = {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync /**
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync * Applies a new configuration object to the YUI instance config.
daac39eba667f9e64b03ef08bb5cd7c965cd72c2vboxsync * This will merge new group/module definitions, and will also
daac39eba667f9e64b03ef08bb5cd7c965cd72c2vboxsync * update the loader cache if necessary. Updating Y.config directly
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync * will not update the cache.
447cbf113f44132911fc13dc33cb26603759b82evboxsync * @method applyConfig
447cbf113f44132911fc13dc33cb26603759b82evboxsync * @param {object} o the configuration object.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @since 3.2.0
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync applyConfig: function(o) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync o = o || NOOP;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var attr,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync name,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // detail,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync config = this.config,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync mods = config.modules,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync groups = config.groups,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync rls = config.rls,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync loader = this.Env._loader;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (name in o) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (o.hasOwnProperty(name)) {
53267393b2631d5c5dbdc5f6996b5feebfd9b12cvboxsync attr = o[name];
53267393b2631d5c5dbdc5f6996b5feebfd9b12cvboxsync if (mods && name == 'modules') {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync clobber(mods, attr);
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync } else if (groups && name == 'groups') {
53267393b2631d5c5dbdc5f6996b5feebfd9b12cvboxsync clobber(groups, attr);
53267393b2631d5c5dbdc5f6996b5feebfd9b12cvboxsync } else if (rls && name == 'rls') {
53267393b2631d5c5dbdc5f6996b5feebfd9b12cvboxsync clobber(rls, attr);
53267393b2631d5c5dbdc5f6996b5feebfd9b12cvboxsync } else if (name == 'win') {
53267393b2631d5c5dbdc5f6996b5feebfd9b12cvboxsync config[name] = attr.contentWindow || attr;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync config.doc = config[name].document;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else if (name == '_yuid') {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // preserve the guid
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync config[name] = attr;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (loader) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync loader._config(o);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Old way to apply a config to the instance (calls `applyConfig` under the hood)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @private
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method _config
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {Object} o The config to apply
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _config: function(o) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync this.applyConfig(o);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Initialize this YUI instance
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @private
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method _init
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _init: function() {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var filter,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y = this,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync G_ENV = YUI.Env,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Env = Y.Env,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync prop;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * The version number of the YUI instance.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @property version
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @type string
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.version = VERSION;
09a58e1a2f4285c5af5ee2c31e3000778ddc7027vboxsync
09a58e1a2f4285c5af5ee2c31e3000778ddc7027vboxsync if (!Env) {
09a58e1a2f4285c5af5ee2c31e3000778ddc7027vboxsync Y.Env = {
09a58e1a2f4285c5af5ee2c31e3000778ddc7027vboxsync mods: {}, // flat module map
09a58e1a2f4285c5af5ee2c31e3000778ddc7027vboxsync versions: {}, // version module map
9a88baf80535828f7e11cd9f9c8796b2bb428ca2vboxsync base: BASE,
9a88baf80535828f7e11cd9f9c8796b2bb428ca2vboxsync cdn: BASE + VERSION + '/build/',
9a88baf80535828f7e11cd9f9c8796b2bb428ca2vboxsync // bootstrapped: false,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _idx: 0,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _used: {},
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _attached: {},
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _missed: [],
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _yidx: 0,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _uidx: 0,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _guidp: 'y',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _loaded: {},
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // serviced: {},
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // Regex in English:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // I'll start at the \b(simpleyui).
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // 1. Look in the test string for "simpleyui" or "yui" or
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // "yui-base" or "yui-rls" or "yui-foobar" that comes after a word break. That is, it
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // can't match "foyui" or "i_heart_simpleyui". This can be anywhere in the string.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // 2. After #1 must come a forward slash followed by the string matched in #1, so
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // "yui-base/yui-base" or "simpleyui/simpleyui" or "yui-pants/yui-pants".
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // 3. The second occurence of the #1 token can optionally be followed by "-debug" or "-min",
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // so "yui/yui-min", "yui/yui-debug", "yui-base/yui-base-debug". NOT "yui/yui-tshirt".
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // 4. This is followed by ".js", so "yui/yui.js", "simpleyui/simpleyui-min.js"
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // 0. Going back to the beginning, now. If all that stuff in 1-4 comes after a "?" in the string,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // then capture the junk between the LAST "&" and the string in 1-4. So
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // "blah?foo/yui/yui.js" will capture "foo/" and "blah?some/thing.js&3.3.0/build/yui-rls/yui-rls.js"
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // will capture "3.3.0/build/"
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync //
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // Regex Exploded:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // (?:\? Find a ?
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // (?:[^&]*&) followed by 0..n characters followed by an &
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // * in fact, find as many sets of characters followed by a & as you can
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // ([^&]*) capture the stuff after the last & in \1
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // )? but it's ok if all this ?junk&more_junk stuff isn't even there
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // \b(simpleyui| after a word break find either the string "simpleyui" or
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // yui(?:-\w+)? the string "yui" optionally followed by a -, then more characters
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // ) and store the simpleyui or yui-* string in \2
9e28880ed1afe735e1a11ddd5af1bb8355918b27vboxsync // \/\2 then comes a / followed by the simpleyui or yui-* string in \2
2a0786080a186b4049daadf7b179ae6984107608vboxsync // (?:-(min|debug))? optionally followed by "-min" or "-debug"
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // .js and ending in ".js"
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _BASE_RE: /(?:\?(?:[^&]*&)*([^&]*))?\b(simpleyui|yui(?:-\w+)?)\/\2(?:-(min|debug))?\.js/,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync parseBasePath: function(src, pattern) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var match = src.match(pattern),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync path, filter;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (match) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync path = RegExp.leftContext || src.slice(0, src.indexOf(match[0]));
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // this is to set up the path to the loader. The file
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // filter for loader should match the yui include.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync filter = match[3];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // extract correct path for mixed combo urls
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // http://yuilibrary.com/projects/yui3/ticket/2528423
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (match[1]) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync path += '?' + match[1];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync path = {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync filter: filter,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync path: path
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return path;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync getBase: G_ENV && G_ENV.getBase ||
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync function(pattern) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var nodes = (doc && doc.getElementsByTagName('script')) || [],
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync path = Env.cdn, parsed,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync i, len, src;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (i = 0, len = nodes.length; i < len; ++i) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync src = nodes[i].src;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (src) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync parsed = Y.Env.parseBasePath(src, pattern);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (parsed) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync filter = parsed.filter;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync path = parsed.path;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync break;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // use CDN default
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return path;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync };
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Env = Y.Env;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Env._loaded[VERSION] = {};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (G_ENV && Y !== YUI) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Env._yidx = ++G_ENV._yidx;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Env._guidp = ('yui_' + VERSION + '_' +
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Env._yidx + '_' + time).replace(/\./g, '_');
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else if (YUI._YUI) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync G_ENV = YUI._YUI.Env;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Env._yidx += G_ENV._yidx;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Env._uidx += G_ENV._uidx;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (prop in G_ENV) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!(prop in Env)) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Env[prop] = G_ENV[prop];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync delete YUI._YUI;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.id = Y.stamp(Y);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync instances[Y.id] = Y;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.constructor = YUI;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
65c46326177819a2479fa19862d415edc3d5c615vboxsync // configuration defaults
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync Y.config = Y.config || {
65c46326177819a2479fa19862d415edc3d5c615vboxsync win: win,
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync doc: doc,
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync debug: true,
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync useBrowserConsole: true,
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync throwFail: true,
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync bootstrap: true,
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync cacheUse: true,
460a499238e6c6f20ab54a12b89f3d5ec2177be8vboxsync fetchCSS: true,
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync use_rls: false,
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync rls_timeout: 2000
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync };
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync
65c46326177819a2479fa19862d415edc3d5c615vboxsync if (YUI.Env.rls_disabled) {
460a499238e6c6f20ab54a12b89f3d5ec2177be8vboxsync Y.config.use_rls = false;
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync }
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync Y.config.lang = Y.config.lang || 'en-US';
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync Y.config.base = YUI.config.base || Y.Env.getBase(Y.Env._BASE_RE);
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync if (!filter || (!('mindebug').indexOf(filter))) {
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync filter = 'min';
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync }
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync filter = (filter) ? '-' + filter : filter;
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync Y.config.loaderPath = YUI.config.loaderPath || 'loader/loader' + filter + '.js';
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync
797b7f5ad66c5c0b4c927d219fa05e14f129ff9dvboxsync },
797b7f5ad66c5c0b4c927d219fa05e14f129ff9dvboxsync
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync /**
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync * Finishes the instance setup. Attaches whatever modules were defined
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync * when the yui modules was registered.
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync * @method _setup
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync * @private
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync */
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync _setup: function(o) {
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync var i, Y = this,
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync core = [],
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync mods = YUI.Env.mods,
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync extras = Y.config.core || ['get','intl-base'];
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync for (i = 0; i < extras.length; i++) {
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync if (mods[extras[i]]) {
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync core.push(extras[i]);
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync }
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync }
bb0e9e28c1a2656d8a7279e7ae4a59fd4da752c1vboxsync
bb0e9e28c1a2656d8a7279e7ae4a59fd4da752c1vboxsync Y._attach(['yui-base']);
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync Y._attach(core);
f91efc1ea08b5174ddbf71ce0bff708e319349bfvboxsync
65c46326177819a2479fa19862d415edc3d5c615vboxsync // Y.log(Y.id + ' initialized', 'info', 'yui');
65c46326177819a2479fa19862d415edc3d5c615vboxsync },
dd1de51db071be42f2acdf532c49c851b78b0812vboxsync
dd1de51db071be42f2acdf532c49c851b78b0812vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Executes a method on a YUI instance with
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * the specified id if the specified method is whitelisted.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method applyTo
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param id {String} the YUI instance id.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param method {String} the name of the method to exectute.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Ex: 'Object.keys'.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param args {Array} the arguments to apply to the method.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {Object} the return value from the applied method or null.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync applyTo: function(id, method, args) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!(method in APPLY_TO_AUTH)) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync this.log(method + ': applyTo not allowed', 'warn', 'yui');
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return null;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var instance = instances[id], nest, m, i;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (instance) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync nest = method.split('.');
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m = instance;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (i = 0; i < nest.length; i = i + 1) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m = m[nest[i]];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!m) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync this.log('applyTo not found: ' + method, 'warn', 'yui');
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return m.apply(instance, args);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return null;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncRegisters a module with the YUI global. The easiest way to create a
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncfirst-class YUI module is to use the YUI component build tool.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynchttp://yuilibrary.com/projects/builder
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncThe build system will produce the `YUI.add` wrapper for you module, along
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncwith any configuration info required for the module.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync@method add
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync@param name {String} module name.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync@param fn {Function} entry point into the module that is used to bind module to the YUI instance.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync@param {YUI} fn.Y The YUI instance this module is executed in.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync@param {String} fn.name The name of the module
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync@param version {String} version string.
adad4c53ebf3692881e3054c02d2ff6494912deevboxsync@param details {Object} optional config data:
9a21b0b6af798a6465c28a5ab9d9b1c3b07b974cvboxsync@param details.requires {Array} features that must be present before this module can be attached.
9a21b0b6af798a6465c28a5ab9d9b1c3b07b974cvboxsync@param details.optional {Array} optional features that should be present if loadOptional
9a21b0b6af798a6465c28a5ab9d9b1c3b07b974cvboxsync is defined. Note: modules are not often loaded this way in YUI 3,
9a21b0b6af798a6465c28a5ab9d9b1c3b07b974cvboxsync but this field is still useful to inform the user that certain
9a21b0b6af798a6465c28a5ab9d9b1c3b07b974cvboxsync features in the component will require additional dependencies.
9a21b0b6af798a6465c28a5ab9d9b1c3b07b974cvboxsync@param details.use {Array} features that are included within this module which need to
9a21b0b6af798a6465c28a5ab9d9b1c3b07b974cvboxsync be attached automatically when this module is attached. This
9a21b0b6af798a6465c28a5ab9d9b1c3b07b974cvboxsync supports the YUI 3 rollup system -- a module with submodules
9a21b0b6af798a6465c28a5ab9d9b1c3b07b974cvboxsync defined will need to have the submodules listed in the 'use'
9a21b0b6af798a6465c28a5ab9d9b1c3b07b974cvboxsync config. The YUI component build tool does this for you.
adad4c53ebf3692881e3054c02d2ff6494912deevboxsync@return {YUI} the YUI instance.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync@example
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync YUI.add('davglass', function(Y, name) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.davglass = function() {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync alert('Dav was here!');
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync };
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }, '3.4.0', { requires: ['yui-base', 'harley-davidson', 'mt-dew'] });
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync*/
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync add: function(name, fn, version, details) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync details = details || {};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var env = YUI.Env,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync mod = {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync name: name,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync fn: fn,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync version: version,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync details: details
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync loader,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync i, versions = env.versions;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
1411bb6dbd910abf34198a9c5809c19657102eb5vboxsync env.mods[name] = mod;
1411bb6dbd910abf34198a9c5809c19657102eb5vboxsync versions[version] = versions[version] || {};
1411bb6dbd910abf34198a9c5809c19657102eb5vboxsync versions[version][name] = mod;
1411bb6dbd910abf34198a9c5809c19657102eb5vboxsync
1411bb6dbd910abf34198a9c5809c19657102eb5vboxsync for (i in instances) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (instances.hasOwnProperty(i)) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync loader = instances[i].Env._loader;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (loader) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!loader.moduleInfo[name]) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync loader.addModule(details, name);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
dbfa49ace8a2d0a827e6cc9da505cbe0e8bed933vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
a1a0588b89dd0e8ecad7a024ef8cb8b0ac518156vboxsync
a1a0588b89dd0e8ecad7a024ef8cb8b0ac518156vboxsync return this;
a1a0588b89dd0e8ecad7a024ef8cb8b0ac518156vboxsync },
a1a0588b89dd0e8ecad7a024ef8cb8b0ac518156vboxsync
c53fd76cb229897343a9f1b32fc1187d8009de38vboxsync /**
c53fd76cb229897343a9f1b32fc1187d8009de38vboxsync * Executes the function associated with each required
c53fd76cb229897343a9f1b32fc1187d8009de38vboxsync * module, binding the module to the YUI instance.
c53fd76cb229897343a9f1b32fc1187d8009de38vboxsync * @method _attach
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @private
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _attach: function(r, moot) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var i, name, mod, details, req, use, after,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync mods = YUI.Env.mods,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync aliases = YUI.Env.aliases,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y = this, j,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync done = Y.Env._attached,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync len = r.length, loader;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync //console.info('attaching: ' + r, 'info', 'yui');
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (i = 0; i < len; i++) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!done[r[i]]) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync name = r[i];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync mod = mods[name];
1850c16ce11168701ea73f1284d90ddb0f00f16bvboxsync if (aliases && aliases[name]) {
1850c16ce11168701ea73f1284d90ddb0f00f16bvboxsync Y._attach(aliases[name]);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync continue;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!mod) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync loader = Y.Env._loader;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (loader && loader.moduleInfo[name]) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync mod = loader.moduleInfo[name];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (mod.use) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync moot = true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync }
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // Y.log('no js def for: ' + name, 'info', 'yui');
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
fae4adece685167d2bfded7360230eb35366aeadvboxsync //if (!loader || !loader.moduleInfo[name]) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync //if ((!loader || !loader.moduleInfo[name]) && !moot) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync if (!moot) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync if (name.indexOf('skin-') === -1) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync Y.Env._missed.push(name);
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync Y.message('NOT loaded: ' + name, 'warn', 'yui');
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync }
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync done[name] = true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync //Don't like this, but in case a mod was asked for once, then we fetch it
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync //We need to remove it from the missed list
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (j = 0; j < Y.Env._missed.length; j++) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (Y.Env._missed[j] === name) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.message('Found: ' + name + ' (was reported as missing earlier)', 'warn', 'yui');
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.Env._missed.splice(j, 1);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync details = mod.details;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync req = details.requires;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync use = details.use;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync after = details.after;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (req) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (j = 0; j < req.length; j++) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!done[req[j]]) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!Y._attach(req)) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return false;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync break;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (after) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (j = 0; j < after.length; j++) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!done[after[j]]) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!Y._attach(after, true)) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return false;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync break;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (mod.fn) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync try {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync mod.fn(Y, name);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } catch (e) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.error('Attach error: ' + name, e, name);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return false;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (use) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (j = 0; j < use.length; j++) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!done[use[j]]) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!Y._attach(use)) {
91b3ad12b6cac90efc3b65eeffba7241cdb15edavboxsync return false;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync break;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Attaches one or more modules to the YUI instance. When this
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * is executed, the requirements are analyzed, and one of
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * several things can happen:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * All requirements are available on the page -- The modules
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * are attached to the instance. If supplied, the use callback
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * is executed synchronously.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * Modules are missing, the Get utility is not available OR
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * the 'bootstrap' config is false -- A warning is issued about
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * the missing modules and all available modules are attached.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * Modules are missing, the Loader is not available but the Get
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * utility is and boostrap is not false -- The loader is bootstrapped
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * before doing the following....
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * Modules are missing and the Loader is available -- The loader
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * expands the dependency tree and fetches missing modules. When
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * the loader is finshed the callback supplied to use is executed
5999df4de51c716ca922e268c4b0d60beeb51ac6vboxsync * asynchronously.
5999df4de51c716ca922e268c4b0d60beeb51ac6vboxsync *
5999df4de51c716ca922e268c4b0d60beeb51ac6vboxsync * @method use
5999df4de51c716ca922e268c4b0d60beeb51ac6vboxsync * @param modules* {String} 1-n modules to bind (uses arguments array).
5999df4de51c716ca922e268c4b0d60beeb51ac6vboxsync * @param *callback {Function} callback function executed when
5999df4de51c716ca922e268c4b0d60beeb51ac6vboxsync * the instance has the required functionality. If included, it
5999df4de51c716ca922e268c4b0d60beeb51ac6vboxsync * must be the last parameter.
5999df4de51c716ca922e268c4b0d60beeb51ac6vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @example
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * // loads and attaches dd and its dependencies
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * YUI().use('dd', function(Y) {});
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * // loads and attaches dd and node as well as all of their dependencies (since 3.4.0)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * YUI().use(['dd', 'node'], function(Y) {});
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * // attaches all modules that are available on the page
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * YUI().use('*', function(Y) {});
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * // intrinsic YUI gallery support (since 3.1.0)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * YUI().use('gallery-yql', function(Y) {});
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * // intrinsic YUI 2in3 support (since 3.1.0)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * YUI().use('yui2-datatable', function(Y) {});
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {YUI} the YUI instance.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync use: function() {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var args = SLICE.call(arguments, 0),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync callback = args[args.length - 1],
599595881adeaefb423b996cf29e21e5831c26d7vboxsync Y = this,
64a8b485ac4cfbaa75c7791962fac53dca818dc0vboxsync i = 0,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync name,
447cbf113f44132911fc13dc33cb26603759b82evboxsync Env = Y.Env,
447cbf113f44132911fc13dc33cb26603759b82evboxsync provisioned = true;
447cbf113f44132911fc13dc33cb26603759b82evboxsync
447cbf113f44132911fc13dc33cb26603759b82evboxsync // The last argument supplied to use can be a load complete callback
447cbf113f44132911fc13dc33cb26603759b82evboxsync if (Y.Lang.isFunction(callback)) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync args.pop();
447cbf113f44132911fc13dc33cb26603759b82evboxsync } else {
447cbf113f44132911fc13dc33cb26603759b82evboxsync callback = null;
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync if (Y.Lang.isArray(args[0])) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync args = args[0];
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync
447cbf113f44132911fc13dc33cb26603759b82evboxsync if (Y.config.cacheUse) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync while ((name = args[i++])) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync if (!Env._attached[name]) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync provisioned = false;
447cbf113f44132911fc13dc33cb26603759b82evboxsync break;
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync
447cbf113f44132911fc13dc33cb26603759b82evboxsync if (provisioned) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync if (args.length) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync Y.log('already provisioned: ' + args, 'info', 'yui');
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync Y._notify(callback, ALREADY_DONE, args);
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync return Y;
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync
447cbf113f44132911fc13dc33cb26603759b82evboxsync if (Y.config.cacheUse) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync while ((name = args[i++])) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync if (!Env._attached[name]) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync provisioned = false;
447cbf113f44132911fc13dc33cb26603759b82evboxsync break;
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync
447cbf113f44132911fc13dc33cb26603759b82evboxsync if (provisioned) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync if (args.length) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync Y.log('already provisioned: ' + args, 'info', 'yui');
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync Y._notify(callback, ALREADY_DONE, args);
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync return Y;
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync
447cbf113f44132911fc13dc33cb26603759b82evboxsync if (Y._loading) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync Y._useQueue = Y._useQueue || new Y.Queue();
447cbf113f44132911fc13dc33cb26603759b82evboxsync Y._useQueue.add([args, callback]);
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync } else {
447cbf113f44132911fc13dc33cb26603759b82evboxsync Y._use(args, function(Y, response) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync Y._notify(callback, response, args);
447cbf113f44132911fc13dc33cb26603759b82evboxsync });
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync
447cbf113f44132911fc13dc33cb26603759b82evboxsync return Y;
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync },
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync /**
447cbf113f44132911fc13dc33cb26603759b82evboxsync * Notify handler from Loader for attachment/load errors
447cbf113f44132911fc13dc33cb26603759b82evboxsync * @method _notify
447cbf113f44132911fc13dc33cb26603759b82evboxsync * @param callback {Function} The callback to pass to the `Y.config.loadErrorFn`
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync * @param response {Object} The response returned from Loader
b31d6eb6e369ce51f3e51de2e651319333451403vboxsync * @param args {Array} The aruments passed from Loader
b31d6eb6e369ce51f3e51de2e651319333451403vboxsync * @private
b31d6eb6e369ce51f3e51de2e651319333451403vboxsync */
b31d6eb6e369ce51f3e51de2e651319333451403vboxsync _notify: function(callback, response, args) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync if (!response.success && this.config.loadErrorFn) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync this.config.loadErrorFn.call(this, this, callback, response, args);
447cbf113f44132911fc13dc33cb26603759b82evboxsync } else if (callback) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync try {
447cbf113f44132911fc13dc33cb26603759b82evboxsync callback(this, response);
447cbf113f44132911fc13dc33cb26603759b82evboxsync } catch (e) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync this.error('use callback error', e, args);
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync }
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync }
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync },
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync /**
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync * This private method is called from the `use` method queue. To ensure that only one set of loading
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync * logic is performed at a time.
447cbf113f44132911fc13dc33cb26603759b82evboxsync * @method _use
447cbf113f44132911fc13dc33cb26603759b82evboxsync * @private
447cbf113f44132911fc13dc33cb26603759b82evboxsync * @param args* {String} 1-n modules to bind (uses arguments array).
447cbf113f44132911fc13dc33cb26603759b82evboxsync * @param *callback {Function} callback function executed when
447cbf113f44132911fc13dc33cb26603759b82evboxsync * the instance has the required functionality. If included, it
447cbf113f44132911fc13dc33cb26603759b82evboxsync * must be the last parameter.
447cbf113f44132911fc13dc33cb26603759b82evboxsync */
447cbf113f44132911fc13dc33cb26603759b82evboxsync _use: function(args, callback) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync
447cbf113f44132911fc13dc33cb26603759b82evboxsync if (!this.Array) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync this._attach(['yui-base']);
447cbf113f44132911fc13dc33cb26603759b82evboxsync }
447cbf113f44132911fc13dc33cb26603759b82evboxsync
447cbf113f44132911fc13dc33cb26603759b82evboxsync var len, loader, handleBoot, handleRLS,
447cbf113f44132911fc13dc33cb26603759b82evboxsync Y = this,
447cbf113f44132911fc13dc33cb26603759b82evboxsync G_ENV = YUI.Env,
447cbf113f44132911fc13dc33cb26603759b82evboxsync mods = G_ENV.mods,
447cbf113f44132911fc13dc33cb26603759b82evboxsync Env = Y.Env,
447cbf113f44132911fc13dc33cb26603759b82evboxsync used = Env._used,
447cbf113f44132911fc13dc33cb26603759b82evboxsync queue = G_ENV._loaderQueue,
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync firstArg = args[0],
447cbf113f44132911fc13dc33cb26603759b82evboxsync YArray = Y.Array,
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync config = Y.config,
447cbf113f44132911fc13dc33cb26603759b82evboxsync boot = config.bootstrap,
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync missing = [],
447cbf113f44132911fc13dc33cb26603759b82evboxsync r = [],
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync ret = true,
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync fetchCSS = config.fetchCSS,
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync process = function(names, skip) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync if (!names.length) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync return;
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync }
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync
447cbf113f44132911fc13dc33cb26603759b82evboxsync YArray.each(names, function(name) {
447cbf113f44132911fc13dc33cb26603759b82evboxsync
447cbf113f44132911fc13dc33cb26603759b82evboxsync // add this module to full list of things to attach
447cbf113f44132911fc13dc33cb26603759b82evboxsync if (!skip) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync r.push(name);
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync }
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync // only attach a module once
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync if (used[name]) {
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync return;
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync }
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync
dad6cdf976d1a75918d0d66731bb1b916a29b1fdvboxsync var m = mods[name], req, use;
447cbf113f44132911fc13dc33cb26603759b82evboxsync
af7209255033c3b77816f81ef6293ff8070ee156vboxsync if (m) {
af7209255033c3b77816f81ef6293ff8070ee156vboxsync used[name] = true;
af7209255033c3b77816f81ef6293ff8070ee156vboxsync req = m.details.requires;
af7209255033c3b77816f81ef6293ff8070ee156vboxsync use = m.details.use;
af7209255033c3b77816f81ef6293ff8070ee156vboxsync } else {
af7209255033c3b77816f81ef6293ff8070ee156vboxsync // CSS files don't register themselves, see if it has
af7209255033c3b77816f81ef6293ff8070ee156vboxsync // been loaded
af7209255033c3b77816f81ef6293ff8070ee156vboxsync if (!G_ENV._loaded[VERSION][name]) {
4810cef85a9a6a265ffd6c8367a07914e336904cvboxsync missing.push(name);
4810cef85a9a6a265ffd6c8367a07914e336904cvboxsync } else {
4810cef85a9a6a265ffd6c8367a07914e336904cvboxsync used[name] = true; // probably css
01ce32a050c5349de591c1cd961be7f565b0a7f2vboxsync }
af7209255033c3b77816f81ef6293ff8070ee156vboxsync }
af7209255033c3b77816f81ef6293ff8070ee156vboxsync
af7209255033c3b77816f81ef6293ff8070ee156vboxsync // make sure requirements are attached
af7209255033c3b77816f81ef6293ff8070ee156vboxsync if (req && req.length) {
af7209255033c3b77816f81ef6293ff8070ee156vboxsync process(req);
af7209255033c3b77816f81ef6293ff8070ee156vboxsync }
af7209255033c3b77816f81ef6293ff8070ee156vboxsync
af7209255033c3b77816f81ef6293ff8070ee156vboxsync // make sure we grab the submodule dependencies too
af7209255033c3b77816f81ef6293ff8070ee156vboxsync if (use && use.length) {
af7209255033c3b77816f81ef6293ff8070ee156vboxsync process(use, 1);
740e2088813cecb83b4ccca84a36d4cfd7659442vboxsync }
af7209255033c3b77816f81ef6293ff8070ee156vboxsync });
af7209255033c3b77816f81ef6293ff8070ee156vboxsync },
af7209255033c3b77816f81ef6293ff8070ee156vboxsync
af7209255033c3b77816f81ef6293ff8070ee156vboxsync handleLoader = function(fromLoader) {
af7209255033c3b77816f81ef6293ff8070ee156vboxsync var response = fromLoader || {
01ce32a050c5349de591c1cd961be7f565b0a7f2vboxsync success: true,
01ce32a050c5349de591c1cd961be7f565b0a7f2vboxsync msg: 'not dynamic'
01ce32a050c5349de591c1cd961be7f565b0a7f2vboxsync },
01ce32a050c5349de591c1cd961be7f565b0a7f2vboxsync redo, origMissing,
01ce32a050c5349de591c1cd961be7f565b0a7f2vboxsync ret = true,
01ce32a050c5349de591c1cd961be7f565b0a7f2vboxsync data = response.data;
01ce32a050c5349de591c1cd961be7f565b0a7f2vboxsync
01ce32a050c5349de591c1cd961be7f565b0a7f2vboxsync
01ce32a050c5349de591c1cd961be7f565b0a7f2vboxsync Y._loading = false;
af7209255033c3b77816f81ef6293ff8070ee156vboxsync
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync if (data) {
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync origMissing = missing;
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync missing = [];
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync r = [];
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync process(data);
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync redo = missing.length;
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync if (redo) {
91b3ad12b6cac90efc3b65eeffba7241cdb15edavboxsync if (missing.sort().join() ==
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync origMissing.sort().join()) {
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync redo = false;
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync }
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync }
91b3ad12b6cac90efc3b65eeffba7241cdb15edavboxsync }
91b3ad12b6cac90efc3b65eeffba7241cdb15edavboxsync
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync if (redo && data) {
17679e11e1f82a29329c858f2cae07844e47b657vboxsync Y._loading = false;
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync Y._use(args, function() {
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync Y.log('Nested use callback: ' + data, 'info', 'yui');
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync if (Y._attach(data)) {
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync Y._notify(callback, response, data);
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync }
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync });
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync } else {
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync if (data) {
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync // Y.log('attaching from loader: ' + data, 'info', 'yui');
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync ret = Y._attach(data);
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync }
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync if (ret) {
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync Y._notify(callback, response, args);
91b3ad12b6cac90efc3b65eeffba7241cdb15edavboxsync }
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync }
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync if (Y._useQueue && Y._useQueue.size() && !Y._loading) {
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync Y._use.apply(Y, Y._useQueue.next());
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync }
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync };
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync// Y.log(Y.id + ': use called: ' + a + ' :: ' + callback, 'info', 'yui');
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync // YUI().use('*'); // bind everything available
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync if (firstArg === '*') {
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync ret = Y._attach(Y.Object.keys(mods));
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync if (ret) {
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync handleLoader();
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync }
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync return Y;
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync }
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync // Y.log('before loader requirements: ' + args, 'info', 'yui');
b611b9aef058a4d56b211e69026abf3500bf74c3vboxsync
599595881adeaefb423b996cf29e21e5831c26d7vboxsync // use loader to expand dependencies and sort the
// requirements if it is available.
if (boot && Y.Loader && args.length) {
loader = getLoader(Y);
loader.require(args);
loader.ignoreRegistered = true;
loader.calculate(null, (fetchCSS) ? null : 'js');
args = loader.sorted;
}
// process each requirement and any additional requirements
// the module metadata specifies
process(args);
len = missing.length;
if (len) {
missing = Y.Object.keys(YArray.hash(missing));
len = missing.length;
Y.log('Modules missing: ' + missing + ', ' + missing.length, 'info', 'yui');
}
// dynamic load
if (boot && len && Y.Loader) {
// Y.log('Using loader to fetch missing deps: ' + missing, 'info', 'yui');
Y.log('Using Loader', 'info', 'yui');
Y._loading = true;
loader = getLoader(Y);
loader.onEnd = handleLoader;
loader.context = Y;
loader.data = args;
loader.ignoreRegistered = false;
loader.require(args);
loader.insert(null, (fetchCSS) ? null : 'js');
// loader.partial(missing, (fetchCSS) ? null : 'js');
} else if (len && Y.config.use_rls && !YUI.Env.rls_enabled) {
G_ENV._rls_queue = G_ENV._rls_queue || new Y.Queue();
// server side loader service
handleRLS = function(instance, argz) {
var rls_end = function(o) {
handleLoader(o);
instance.rls_advance();
},
rls_url = instance._rls(argz);
if (rls_url) {
Y.log('Fetching RLS url', 'info', 'rls');
instance.rls_oncomplete(function(o) {
rls_end(o);
});
instance.Get.script(rls_url, {
data: argz,
timeout: instance.config.rls_timeout,
onFailure: instance.rls_handleFailure,
onTimeout: instance.rls_handleTimeout
});
} else {
rls_end({
success: true,
data: argz
});
}
};
G_ENV._rls_queue.add(function() {
Y.log('executing queued rls request', 'info', 'rls');
G_ENV._rls_in_progress = true;
Y.rls_callback = callback;
Y.rls_locals(Y, args, handleRLS);
});
if (!G_ENV._rls_in_progress && G_ENV._rls_queue.size()) {
G_ENV._rls_queue.next()();
}
} else if (boot && len && Y.Get && !Env.bootstrapped) {
Y._loading = true;
handleBoot = function() {
Y._loading = false;
queue.running = false;
Env.bootstrapped = true;
G_ENV._bootstrapping = false;
if (Y._attach(['loader'])) {
Y._use(args, callback);
}
};
if (G_ENV._bootstrapping) {
Y.log('Waiting for loader', 'info', 'yui');
queue.add(handleBoot);
} else {
G_ENV._bootstrapping = true;
Y.log('Fetching loader: ' + config.base + config.loaderPath, 'info', 'yui');
Y.Get.script(config.base + config.loaderPath, {
onEnd: handleBoot
});
}
} else {
Y.log('Attaching available dependencies: ' + args, 'info', 'yui');
ret = Y._attach(args);
if (ret) {
handleLoader();
}
}
return Y;
},
/**
* Returns the namespace specified and creates it if it doesn't exist
*
* YUI.namespace("property.package");
* YUI.namespace("YAHOO.property.package");
*
* Either of the above would create `YUI.property`, then
* `YUI.property.package` (`YAHOO` is scrubbed out, this is
* to remain compatible with YUI2)
*
* Be careful when naming packages. Reserved words may work in some browsers
* and not others. For instance, the following will fail in Safari:
*
* YUI.namespace("really.long.nested.namespace");
*
* This fails because "long" is a future reserved word in ECMAScript
*
* @method namespace
* @param {string*} arguments 1-n namespaces to create.
* @return {object} A reference to the last namespace object created.
*/
namespace: function() {
var a = arguments, o = this, i = 0, j, d, arg;
for (; i < a.length; i++) {
// d = ('' + a[i]).split('.');
arg = a[i];
if (arg.indexOf(PERIOD)) {
d = arg.split(PERIOD);
for (j = (d[0] == 'YAHOO') ? 1 : 0; j < d.length; j++) {
o[d[j]] = o[d[j]] || {};
o = o[d[j]];
}
} else {
o[arg] = o[arg] || {};
}
}
return o;
},
// this is replaced if the log module is included
log: NOOP,
message: NOOP,
// this is replaced if the dump module is included
dump: function (o) { return ''+o; },
/**
* Report an error. The reporting mechanism is controled by
* the `throwFail` configuration attribute. If throwFail is
* not specified, the message is written to the Logger, otherwise
* a JS error is thrown
* @method error
* @param msg {String} the error message.
* @param e {Error|String} Optional JS error that was caught, or an error string.
* @param data Optional additional info
* and `throwFail` is specified, this error will be re-thrown.
* @return {YUI} this YUI instance.
*/
error: function(msg, e, data) {
var Y = this, ret;
if (Y.config.errorFn) {
ret = Y.config.errorFn.apply(Y, arguments);
}
if (Y.config.throwFail && !ret) {
throw (e || new Error(msg));
} else {
Y.message(msg, 'error'); // don't scrub this one
}
return Y;
},
/**
* Generate an id that is unique among all YUI instances
* @method guid
* @param pre {String} optional guid prefix.
* @return {String} the guid.
*/
guid: function(pre) {
var id = this.Env._guidp + '_' + (++this.Env._uidx);
return (pre) ? (pre + id) : id;
},
/**
* Returns a `guid` associated with an object. If the object
* does not have one, a new one is created unless `readOnly`
* is specified.
* @method stamp
* @param o {Object} The object to stamp.
* @param readOnly {Boolean} if `true`, a valid guid will only
* be returned if the object has one assigned to it.
* @return {String} The object's guid or null.
*/
stamp: function(o, readOnly) {
var uid;
if (!o) {
return o;
}
// IE generates its own unique ID for dom nodes
// The uniqueID property of a document node returns a new ID
if (o.uniqueID && o.nodeType && o.nodeType !== 9) {
uid = o.uniqueID;
} else {
uid = (typeof o === 'string') ? o : o._yuid;
}
if (!uid) {
uid = this.guid();
if (!readOnly) {
try {
o._yuid = uid;
} catch (e) {
uid = null;
}
}
}
return uid;
},
/**
* Destroys the YUI instance
* @method destroy
* @since 3.3.0
*/
destroy: function() {
var Y = this;
if (Y.Event) {
Y.Event._unload();
}
delete instances[Y.id];
delete Y.Env;
delete Y.config;
}
/**
* instanceof check for objects that works around
* memory leak in IE when the item tested is
* window/document
* @method instanceOf
* @since 3.3.0
*/
};
YUI.prototype = proto;
// inheritance utilities are not available yet
for (prop in proto) {
if (proto.hasOwnProperty(prop)) {
YUI[prop] = proto[prop];
}
}
// set up the environment
YUI._init();
if (hasWin) {
// add a window load event at load time so we can capture
// the case where it fires before dynamic loading is
// complete.
add(window, 'load', handleLoad);
} else {
handleLoad();
}
YUI.Env.add = add;
YUI.Env.remove = remove;
/*global exports*/
// Support the CommonJS method for exporting our single global
if (typeof exports == 'object') {
exports.YUI = YUI;
}
}());
/**
* The config object contains all of the configuration options for
* the `YUI` instance. This object is supplied by the implementer
* when instantiating a `YUI` instance. Some properties have default
* values if they are not supplied by the implementer. This should
* not be updated directly because some values are cached. Use
* `applyConfig()` to update the config object on a YUI instance that
* has already been configured.
*
* @class config
* @static
*/
/**
* Allows the YUI seed file to fetch the loader component and library
* metadata to dynamically load additional dependencies.
*
* @property bootstrap
* @type boolean
* @default true
*/
/**
* Log to the browser console if debug is on and the browser has a
* supported console.
*
* @property useBrowserConsole
* @type boolean
* @default true
*/
/**
* A hash of log sources that should be logged. If specified, only
* log messages from these sources will be logged.
*
* @property logInclude
* @type object
*/
/**
* A hash of log sources that should be not be logged. If specified,
* all sources are logged if not on this list.
*
* @property logExclude
* @type object
*/
/**
* Set to true if the yui seed file was dynamically loaded in
* order to bootstrap components relying on the window load event
* and the `domready` custom event.
*
* @property injected
* @type boolean
* @default false
*/
/**
* If `throwFail` is set, `Y.error` will generate or re-throw a JS Error.
* Otherwise the failure is logged.
*
* @property throwFail
* @type boolean
* @default true
*/
/**
* The window/frame that this instance should operate in.
*
* @property win
* @type Window
* @default the window hosting YUI
*/
/**
* The document associated with the 'win' configuration.
*
* @property doc
* @type Document
* @default the document hosting YUI
*/
/**
* A list of modules that defines the YUI core (overrides the default).
*
* @property core
* @type string[]
*/
/**
* A list of languages in order of preference. This list is matched against
* the list of available languages in modules that the YUI instance uses to
* determine the best possible localization of language sensitive modules.
* Languages are represented using BCP 47 language tags, such as "en-GB" for
* English as used in the United Kingdom, or "zh-Hans-CN" for simplified
* Chinese as used in China. The list can be provided as a comma-separated
* list or as an array.
*
* @property lang
* @type string|string[]
*/
/**
* The default date format
* @property dateFormat
* @type string
* @deprecated use configuration in `DataType.Date.format()` instead.
*/
/**
* The default locale
* @property locale
* @type string
* @deprecated use `config.lang` instead.
*/
/**
* The default interval when polling in milliseconds.
* @property pollInterval
* @type int
* @default 20
*/
/**
* The number of dynamic nodes to insert by default before
* automatically removing them. This applies to script nodes
* because removing the node will not make the evaluated script
* unavailable. Dynamic CSS is not auto purged, because removing
* a linked style sheet will also remove the style definitions.
* @property purgethreshold
* @type int
* @default 20
*/
/**
* The default interval when polling in milliseconds.
* @property windowResizeDelay
* @type int
* @default 40
*/
/**
* Base directory for dynamic loading
* @property base
* @type string
*/
/*
* The secure base dir (not implemented)
* For dynamic loading.
* @property secureBase
* @type string
*/
/**
* The YUI combo service base dir. Ex: `http://yui.yahooapis.com/combo?`
* For dynamic loading.
* @property comboBase
* @type string
*/
/**
* The root path to prepend to module path for the combo service.
* Ex: 3.0.0b1/build/
* For dynamic loading.
* @property root
* @type string
*/
/**
* A filter to apply to result urls. This filter will modify the default
* path for all modules. The default path for the YUI library is the
* minified version of the files (e.g., event-min.js). The filter property
* can be a predefined filter or a custom filter. The valid predefined
* filters are:
* <dl>
* <dt>DEBUG</dt>
* <dd>Selects the debug versions of the library (e.g., event-debug.js).
* This option will automatically include the Logger widget</dd>
* <dt>RAW</dt>
* <dd>Selects the non-minified version of the library (e.g., event.js).</dd>
* </dl>
* You can also define a custom filter, which must be an object literal
* containing a search expression and a replace string:
*
* myFilter: {
* 'searchExp': "-min\\.js",
* 'replaceStr': "-debug.js"
* }
*
* For dynamic loading.
*
* @property filter
* @type string|object
*/
/**
* The `skin` config let's you configure application level skin
* customizations. It contains the following attributes which
* can be specified to override the defaults:
*
* // The default skin, which is automatically applied if not
* // overriden by a component-specific skin definition.
* // Change this in to apply a different skin globally
* defaultSkin: 'sam',
*
* // This is combined with the loader base property to get
* // the default root directory for a skin.
* base: 'assets/skins/',
*
* // Any component-specific overrides can be specified here,
* // making it possible to load different skins for different
* // components. It is possible to load more than one skin
* // for a given component as well.
* overrides: {
* slider: ['capsule', 'round']
* }
*
* For dynamic loading.
*
* @property skin
*/
/**
* Hash of per-component filter specification. If specified for a given
* component, this overrides the filter config.
*
* For dynamic loading.
*
* @property filters
*/
/**
* Use the YUI combo service to reduce the number of http connections
* required to load your dependencies. Turning this off will
* disable combo handling for YUI and all module groups configured
* with a combo service.
*
* For dynamic loading.
*
* @property combine
* @type boolean
* @default true if 'base' is not supplied, false if it is.
*/
/**
* A list of modules that should never be dynamically loaded
*
* @property ignore
* @type string[]
*/
/**
* A list of modules that should always be loaded when required, even if already
* present on the page.
*
* @property force
* @type string[]
*/
/**
* Node or id for a node that should be used as the insertion point for new
* nodes. For dynamic loading.
*
* @property insertBefore
* @type string
*/
/**
* Object literal containing attributes to add to dynamically loaded script
* nodes.
* @property jsAttributes
* @type string
*/
/**
* Object literal containing attributes to add to dynamically loaded link
* nodes.
* @property cssAttributes
* @type string
*/
/**
* Number of milliseconds before a timeout occurs when dynamically
* loading nodes. If not set, there is no timeout.
* @property timeout
* @type int
*/
/**
* Callback for the 'CSSComplete' event. When dynamically loading YUI
* components with CSS, this property fires when the CSS is finished
* loading but script loading is still ongoing. This provides an
* opportunity to enhance the presentation of a loading page a little
* bit before the entire loading process is done.
*
* @property onCSS
* @type function
*/
/**
* A hash of module definitions to add to the list of YUI components.
* These components can then be dynamically loaded side by side with
* YUI via the `use()` method. This is a hash, the key is the module
* name, and the value is an object literal specifying the metdata
* for the module. See `Loader.addModule` for the supported module
* metadata fields. Also see groups, which provides a way to
* configure the base and combo spec for a set of modules.
*
* modules: {
* mymod1: {
* requires: ['node'],
* fullpath: 'http://myserver.mydomain.com/mymod1/mymod1.js'
* },
* mymod2: {
* requires: ['mymod1'],
* fullpath: 'http://myserver.mydomain.com/mymod2/mymod2.js'
* }
* }
*
* @property modules
* @type object
*/
/**
* A hash of module group definitions. It for each group you
* can specify a list of modules and the base path and
* combo spec to use when dynamically loading the modules.
*
* groups: {
* yui2: {
* // specify whether or not this group has a combo service
* combine: true,
*
* // the base path for non-combo paths
* base: 'http://yui.yahooapis.com/2.8.0r4/build/',
*
* // the path to the combo service
* comboBase: 'http://yui.yahooapis.com/combo?',
*
* // a fragment to prepend to the path attribute when
* // when building combo urls
* root: '2.8.0r4/build/',
*
* // the module definitions
* modules: {
* yui2_yde: {
* path: "yahoo-dom-event/yahoo-dom-event.js"
* },
* yui2_anim: {
* path: "animation/animation.js",
* requires: ['yui2_yde']
* }
* }
* }
* }
*
* @property groups
* @type object
*/
/**
* The loader 'path' attribute to the loader itself. This is combined
* with the 'base' attribute to dynamically load the loader component
* when boostrapping with the get utility alone.
*
* @property loaderPath
* @type string
* @default loader/loader-min.js
*/
/**
* Specifies whether or not YUI().use(...) will attempt to load CSS
* resources at all. Any truthy value will cause CSS dependencies
* to load when fetching script. The special value 'force' will
* cause CSS dependencies to be loaded even if no script is needed.
*
* @property fetchCSS
* @type boolean|string
* @default true
*/
/**
* The default gallery version to build gallery module urls
* @property gallery
* @type string
* @since 3.1.0
*/
/**
* The default YUI 2 version to build yui2 module urls. This is for
* intrinsic YUI 2 support via the 2in3 project. Also see the '2in3'
* config for pulling different revisions of the wrapped YUI 2
* modules.
* @since 3.1.0
* @property yui2
* @type string
* @default 2.8.1
*/
/**
* The 2in3 project is a deployment of the various versions of YUI 2
* deployed as first-class YUI 3 modules. Eventually, the wrapper
* for the modules will change (but the underlying YUI 2 code will
* be the same), and you can select a particular version of
* the wrapper modules via this config.
* @since 3.1.0
* @property 2in3
* @type string
* @default 1
*/
/**
* Alternative console log function for use in environments without
* a supported native console. The function is executed in the
* YUI instance context.
* @since 3.1.0
* @property logFn
* @type Function
*/
/**
* A callback to execute when Y.error is called. It receives the
* error message and an javascript error object if Y.error was
* executed because a javascript error was caught. The function
* is executed in the YUI instance context.
*
* @since 3.2.0
* @property errorFn
* @type Function
*/
/**
* A callback to execute when the loader fails to load one or
* more resource. This could be because of a script load
* failure. It can also fail if a javascript module fails
* to register itself, but only when the 'requireRegistration'
* is true. If this function is defined, the use() callback will
* only be called when the loader succeeds, otherwise it always
* executes unless there was a javascript error when attaching
* a module.
*
* @since 3.3.0
* @property loadErrorFn
* @type Function
*/
/**
* When set to true, the YUI loader will expect that all modules
* it is responsible for loading will be first-class YUI modules
* that register themselves with the YUI global. If this is
* set to true, loader will fail if the module registration fails
* to happen after the script is loaded.
*
* @since 3.3.0
* @property requireRegistration
* @type boolean
* @default false
*/
/**
* Cache serviced use() requests.
* @since 3.3.0
* @property cacheUse
* @type boolean
* @default true
* @deprecated no longer used
*/
/**
* The parameter defaults for the remote loader service.
* Requires the rls submodule. The properties that are
* supported:
*
* * `m`: comma separated list of module requirements. This
* must be the param name even for custom implemetations.
* * `v`: the version of YUI to load. Defaults to the version
* of YUI that is being used.
* * `gv`: the version of the gallery to load (see the gallery config)
* * `env`: comma separated list of modules already on the page.
* this must be the param name even for custom implemetations.
* * `lang`: the languages supported on the page (see the lang config)
* * `'2in3v'`: the version of the 2in3 wrapper to use (see the 2in3 config).
* * `'2v'`: the version of yui2 to use in the yui 2in3 wrappers
* * `filt`: a filter def to apply to the urls (see the filter config).
* * `filts`: a list of custom filters to apply per module
* * `tests`: this is a map of conditional module test function id keys
* with the values of 1 if the test passes, 0 if not. This must be
* the name of the querystring param in custom templates.
*
* @since 3.2.0
* @property rls
*/
/**
* The base path to the remote loader service
*
* @since 3.2.0
* @property rls_base
*/
/**
* The template to use for building the querystring portion
* of the remote loader service url. The default is determined
* by the rls config -- each property that has a value will be
* represented.
*
* @since 3.2.0
* @property rls_tmpl
* @example
* m={m}&v={v}&env={env}&lang={lang}&filt={filt}&tests={tests}
*
*/
/**
* Configure the instance to use a remote loader service instead of
* the client loader.
*
* @since 3.2.0
* @property use_rls
*/
YUI.add('yui-base', function(Y) {
/*
* YUI stub
* @module yui
* @submodule yui-base
*/
/**
* The YUI module contains the components required for building the YUI
* seed file. This includes the script loading mechanism, a simple queue,
* and the core utilities for the library.
* @module yui
* @submodule yui-base
*/
/**
* Provides core language utilites and extensions used throughout YUI.
*
* @class Lang
* @static
*/
var L = Y.Lang || (Y.Lang = {}),
STRING_PROTO = String.prototype,
TOSTRING = Object.prototype.toString,
TYPES = {
'undefined' : 'undefined',
'number' : 'number',
'boolean' : 'boolean',
'string' : 'string',
'[object Function]': 'function',
'[object RegExp]' : 'regexp',
'[object Array]' : 'array',
'[object Date]' : 'date',
'[object Error]' : 'error'
},
SUBREGEX = /\{\s*([^|}]+?)\s*(?:\|([^}]*))?\s*\}/g,
TRIMREGEX = /^\s+|\s+$/g,
// If either MooTools or Prototype is on the page, then there's a chance that we
// can't trust "native" language features to actually be native. When this is
// the case, we take the safe route and fall back to our own non-native
// implementation.
win = Y.config.win,
unsafeNatives = win && !!(win.MooTools || win.Prototype);
/**
* Determines whether or not the provided item is an array.
*
* Returns `false` for array-like collections such as the function `arguments`
* collection or `HTMLElement` collections. Use `Y.Array.test()` if you want to
* test for an array-like collection.
*
* @method isArray
* @param o The object to test.
* @return {boolean} true if o is an array.
* @static
*/
L.isArray = (!unsafeNatives && Array.isArray) || function (o) {
return L.type(o) === 'array';
};
/**
* Determines whether or not the provided item is a boolean.
* @method isBoolean
* @static
* @param o The object to test.
* @return {boolean} true if o is a boolean.
*/
L.isBoolean = function(o) {
return typeof o === 'boolean';
};
/**
* <p>
* Determines whether or not the provided item is a function.
* Note: Internet Explorer thinks certain functions are objects:
* </p>
*
* <pre>
* var obj = document.createElement("object");
* Y.Lang.isFunction(obj.getAttribute) // reports false in IE
* &nbsp;
* var input = document.createElement("input"); // append to body
* Y.Lang.isFunction(input.focus) // reports false in IE
* </pre>
*
* <p>
* You will have to implement additional tests if these functions
* matter to you.
* </p>
*
* @method isFunction
* @static
* @param o The object to test.
* @return {boolean} true if o is a function.
*/
L.isFunction = function(o) {
return L.type(o) === 'function';
};
/**
* Determines whether or not the supplied item is a date instance.
* @method isDate
* @static
* @param o The object to test.
* @return {boolean} true if o is a date.
*/
L.isDate = function(o) {
return L.type(o) === 'date' && o.toString() !== 'Invalid Date' && !isNaN(o);
};
/**
* Determines whether or not the provided item is null.
* @method isNull
* @static
* @param o The object to test.
* @return {boolean} true if o is null.
*/
L.isNull = function(o) {
return o === null;
};
/**
* Determines whether or not the provided item is a legal number.
* @method isNumber
* @static
* @param o The object to test.
* @return {boolean} true if o is a number.
*/
L.isNumber = function(o) {
return typeof o === 'number' && isFinite(o);
};
/**
* Determines whether or not the provided item is of type object
* or function. Note that arrays are also objects, so
* <code>Y.Lang.isObject([]) === true</code>.
* @method isObject
* @static
* @param o The object to test.
* @param failfn {boolean} fail if the input is a function.
* @return {boolean} true if o is an object.
* @see isPlainObject
*/
L.isObject = function(o, failfn) {
var t = typeof o;
return (o && (t === 'object' ||
(!failfn && (t === 'function' || L.isFunction(o))))) || false;
};
/**
* Determines whether or not the provided item is a string.
* @method isString
* @static
* @param o The object to test.
* @return {boolean} true if o is a string.
*/
L.isString = function(o) {
return typeof o === 'string';
};
/**
* Determines whether or not the provided item is undefined.
* @method isUndefined
* @static
* @param o The object to test.
* @return {boolean} true if o is undefined.
*/
L.isUndefined = function(o) {
return typeof o === 'undefined';
};
/**
* Returns a string without any leading or trailing whitespace. If
* the input is not a string, the input will be returned untouched.
* @method trim
* @static
* @param s {string} the string to trim.
* @return {string} the trimmed string.
*/
L.trim = STRING_PROTO.trim ? function(s) {
return s && s.trim ? s.trim() : s;
} : function (s) {
try {
return s.replace(TRIMREGEX, '');
} catch (e) {
return s;
}
};
/**
* Returns a string without any leading whitespace.
* @method trimLeft
* @static
* @param s {string} the string to trim.
* @return {string} the trimmed string.
*/
L.trimLeft = STRING_PROTO.trimLeft ? function (s) {
return s.trimLeft();
} : function (s) {
return s.replace(/^\s+/, '');
};
/**
* Returns a string without any trailing whitespace.
* @method trimRight
* @static
* @param s {string} the string to trim.
* @return {string} the trimmed string.
*/
L.trimRight = STRING_PROTO.trimRight ? function (s) {
return s.trimRight();
} : function (s) {
return s.replace(/\s+$/, '');
};
/**
* A convenience method for detecting a legitimate non-null value.
* Returns false for null/undefined/NaN, true for other values,
* including 0/false/''
* @method isValue
* @static
* @param o The item to test.
* @return {boolean} true if it is not null/undefined/NaN || false.
*/
L.isValue = function(o) {
var t = L.type(o);
switch (t) {
case 'number':
return isFinite(o);
case 'null': // fallthru
case 'undefined':
return false;
default:
return !!t;
}
};
/**
* <p>
* Returns a string representing the type of the item passed in.
* </p>
*
* <p>
* Known issues:
* </p>
*
* <ul>
* <li>
* <code>typeof HTMLElementCollection</code> returns function in Safari, but
* <code>Y.type()</code> reports object, which could be a good thing --
* but it actually caused the logic in <code>Y.Lang.isObject</code> to fail.
* </li>
* </ul>
*
* @method type
* @param o the item to test.
* @return {string} the detected type.
* @static
*/
L.type = function(o) {
return TYPES[typeof o] || TYPES[TOSTRING.call(o)] || (o ? 'object' : 'null');
};
/**
* Lightweight version of <code>Y.substitute</code>. Uses the same template
* structure as <code>Y.substitute</code>, but doesn't support recursion,
* auto-object coersion, or formats.
* @method sub
* @param {string} s String to be modified.
* @param {object} o Object containing replacement values.
* @return {string} the substitute result.
* @static
* @since 3.2.0
*/
L.sub = function(s, o) {
return s.replace ? s.replace(SUBREGEX, function (match, key) {
return L.isUndefined(o[key]) ? match : o[key];
}) : s;
};
/**
* Returns the current time in milliseconds.
*
* @method now
* @return {Number} Current time in milliseconds.
* @static
* @since 3.3.0
*/
L.now = Date.now || function () {
return new Date().getTime();
};
/**
* The YUI module contains the components required for building the YUI seed
* file. This includes the script loading mechanism, a simple queue, and the
* core utilities for the library.
*
* @module yui
* @submodule yui-base
*/
var Lang = Y.Lang,
Native = Array.prototype,
hasOwn = Object.prototype.hasOwnProperty;
/**
Provides utility methods for working with arrays. Additional array helpers can
be found in the `collection` and `array-extras` modules.
`Y.Array(thing)` returns a native array created from _thing_. Depending on
_thing_'s type, one of the following will happen:
* Arrays are returned unmodified unless a non-zero _startIndex_ is
specified.
* Array-like collections (see `Array.test()`) are converted to arrays.
* For everything else, a new array is created with _thing_ as the sole
item.
Note: elements that are also collections, such as `<form>` and `<select>`
elements, are not automatically converted to arrays. To force a conversion,
pass `true` as the value of the _force_ parameter.
@class Array
@constructor
@param {Any} thing The thing to arrayify.
@param {Number} [startIndex=0] If non-zero and _thing_ is an array or array-like
collection, a subset of items starting at the specified index will be
returned.
@param {Boolean} [force=false] If `true`, _thing_ will be treated as an
array-like collection no matter what.
@return {Array} A native array created from _thing_, according to the rules
described above.
**/
function YArray(thing, startIndex, force) {
var len, result;
startIndex || (startIndex = 0);
if (force || YArray.test(thing)) {
// IE throws when trying to slice HTMLElement collections.
try {
return Native.slice.call(thing, startIndex);
} catch (ex) {
result = [];
for (len = thing.length; startIndex < len; ++startIndex) {
result.push(thing[startIndex]);
}
return result;
}
}
return [thing];
}
Y.Array = YArray;
/**
Evaluates _obj_ to determine if it's an array, an array-like collection, or
something else. This is useful when working with the function `arguments`
collection and `HTMLElement` collections.
Note: This implementation doesn't consider elements that are also
collections, such as `<form>` and `<select>`, to be array-like.
@method test
@param {Object} obj Object to test.
@return {Number} A number indicating the results of the test:
* 0: Neither an array nor an array-like collection.
* 1: Real array.
* 2: Array-like collection.
@static
**/
YArray.test = function (obj) {
var result = 0;
if (Lang.isArray(obj)) {
result = 1;
} else if (Lang.isObject(obj)) {
try {
// indexed, but no tagName (element) or alert (window),
// or functions without apply/call (Safari
// HTMLElementCollection bug).
if ('length' in obj && !obj.tagName && !obj.alert && !obj.apply) {
result = 2;
}
} catch (ex) {}
}
return result;
};
/**
Dedupes an array of strings, returning an array that's guaranteed to contain
only one copy of a given string.
This method differs from `Array.unique()` in that it's optimized for use only
with strings, whereas `unique` may be used with other types (but is slower).
Using `dedupe()` with non-string values may result in unexpected behavior.
@method dedupe
@param {String[]} array Array of strings to dedupe.
@return {Array} Deduped copy of _array_.
@static
@since 3.4.0
**/
YArray.dedupe = function (array) {
var hash = {},
results = [],
i, item, len;
for (i = 0, len = array.length; i < len; ++i) {
item = array[i];
if (!hasOwn.call(hash, item)) {
hash[item] = 1;
results.push(item);
}
}
return results;
};
/**
Executes the supplied function on each item in the array. This method wraps
the native ES5 `Array.forEach()` method if available.
@method each
@param {Array} array Array to iterate.
@param {Function} fn Function to execute on each item in the array. The function
will receive the following arguments:
@param {Any} fn.item Current array item.
@param {Number} fn.index Current array index.
@param {Array} fn.array Array being iterated.
@param {Object} [thisObj] `this` object to use when calling _fn_.
@return {YUI} The YUI instance.
@static
**/
YArray.each = YArray.forEach = Native.forEach ? function (array, fn, thisObj) {
Native.forEach.call(array || [], fn, thisObj || Y);
return Y;
} : function (array, fn, thisObj) {
for (var i = 0, len = (array && array.length) || 0; i < len; ++i) {
if (i in array) {
fn.call(thisObj || Y, array[i], i, array);
}
}
return Y;
};
/**
Alias for `each()`.
@method forEach
@static
**/
/**
Returns an object using the first array as keys and the second as values. If
the second array is not provided, or if it doesn't contain the same number of
values as the first array, then `true` will be used in place of the missing
values.
@example
Y.Array.hash(['a', 'b', 'c'], ['foo', 'bar']);
// => {a: 'foo', b: 'bar', c: true}
@method hash
@param {String[]} keys Array of strings to use as keys.
@param {Array} [values] Array to use as values.
@return {Object} Hash using the first array as keys and the second as values.
@static
**/
YArray.hash = function (keys, values) {
var hash = {},
vlen = (values && values.length) || 0,
i, len;
for (i = 0, len = keys.length; i < len; ++i) {
if (i in keys) {
hash[keys[i]] = vlen > i && i in values ? values[i] : true;
}
}
return hash;
};
/**
Returns the index of the first item in the array that's equal (using a strict
equality check) to the specified _value_, or `-1` if the value isn't found.
This method wraps the native ES5 `Array.indexOf()` method if available.
@method indexOf
@param {Array} array Array to search.
@param {Any} value Value to search for.
@return {Number} Index of the item strictly equal to _value_, or `-1` if not
found.
@static
**/
YArray.indexOf = Native.indexOf ? function (array, value) {
// TODO: support fromIndex
return Native.indexOf.call(array, value);
} : function (array, value) {
for (var i = 0, len = array.length; i < len; ++i) {
if (array[i] === value) {
return i;
}
}
return -1;
};
/**
Numeric sort convenience function.
The native `Array.prototype.sort()` function converts values to strings and
sorts them in lexicographic order, which is unsuitable for sorting numeric
values. Provide `Array.numericSort` as a custom sort function when you want
to sort values in numeric order.
@example
[42, 23, 8, 16, 4, 15].sort(Y.Array.numericSort);
// => [4, 8, 15, 16, 23, 42]
@method numericSort
@param {Number} a First value to compare.
@param {Number} b Second value to compare.
@return {Number} Difference between _a_ and _b_.
@static
**/
YArray.numericSort = function (a, b) {
return a - b;
};
/**
Executes the supplied function on each item in the array. Returning a truthy
value from the function will stop the processing of remaining items.
@method some
@param {Array} array Array to iterate over.
@param {Function} fn Function to execute on each item. The function will receive
the following arguments:
@param {Any} fn.value Current array item.
@param {Number} fn.index Current array index.
@param {Array} fn.array Array being iterated over.
@param {Object} [thisObj] `this` object to use when calling _fn_.
@return {Boolean} `true` if the function returns a truthy value on any of the
items in the array; `false` otherwise.
@static
**/
YArray.some = Native.some ? function (array, fn, thisObj) {
return Native.some.call(array, fn, thisObj);
} : function (array, fn, thisObj) {
for (var i = 0, len = array.length; i < len; ++i) {
if (i in array && fn.call(thisObj, array[i], i, array)) {
return true;
}
}
return false;
};
/**
* The YUI module contains the components required for building the YUI
* seed file. This includes the script loading mechanism, a simple queue,
* and the core utilities for the library.
* @module yui
* @submodule yui-base
*/
/**
* A simple FIFO queue. Items are added to the Queue with add(1..n items) and
* removed using next().
*
* @class Queue
* @constructor
* @param {MIXED} item* 0..n items to seed the queue.
*/
function Queue() {
this._init();
this.add.apply(this, arguments);
}
Queue.prototype = {
/**
* Initialize the queue
*
* @method _init
* @protected
*/
_init: function() {
/**
* The collection of enqueued items
*
* @property _q
* @type Array
* @protected
*/
this._q = [];
},
/**
* Get the next item in the queue. FIFO support
*
* @method next
* @return {MIXED} the next item in the queue.
*/
next: function() {
return this._q.shift();
},
/**
* Get the last in the queue. LIFO support.
*
* @method last
* @return {MIXED} the last item in the queue.
*/
last: function() {
return this._q.pop();
},
/**
* Add 0..n items to the end of the queue.
*
* @method add
* @param {MIXED} item* 0..n items.
* @return {object} this queue.
*/
add: function() {
this._q.push.apply(this._q, arguments);
return this;
},
/**
* Returns the current number of queued items.
*
* @method size
* @return {Number} The size.
*/
size: function() {
return this._q.length;
}
};
Y.Queue = Queue;
YUI.Env._loaderQueue = YUI.Env._loaderQueue || new Queue();
/**
The YUI module contains the components required for building the YUI seed file.
This includes the script loading mechanism, a simple queue, and the core
utilities for the library.
@module yui
@submodule yui-base
**/
var CACHED_DELIMITER = '__',
hasOwn = Object.prototype.hasOwnProperty,
isObject = Y.Lang.isObject;
/**
Returns a wrapper for a function which caches the return value of that function,
keyed off of the combined string representation of the argument values provided
when the wrapper is called.
Calling this function again with the same arguments will return the cached value
rather than executing the wrapped function.
Note that since the cache is keyed off of the string representation of arguments
passed to the wrapper function, arguments that aren't strings and don't provide
a meaningful `toString()` method may result in unexpected caching behavior. For
example, the objects `{}` and `{foo: 'bar'}` would both be converted to the
string `[object Object]` when used as a cache key.
@method cached
@param {Function} source The function to memoize.
@param {Object} [cache={}] Object in which to store cached values. You may seed
this object with pre-existing cached values if desired.
@param {any} [refetch] If supplied, this value is compared with the cached value
using a `==` comparison. If the values are equal, the wrapped function is
executed again even though a cached value exists.
@return {Function} Wrapped function.
@for YUI
**/
Y.cached = function (source, cache, refetch) {
cache || (cache = {});
return function (arg) {
var key = arguments.length > 1 ?
Array.prototype.join.call(arguments, CACHED_DELIMITER) :
arg.toString();
if (!(key in cache) || (refetch && cache[key] == refetch)) {
cache[key] = source.apply(source, arguments);
}
return cache[key];
};
};
/**
Returns a new object containing all of the properties of all the supplied
objects. The properties from later objects will overwrite those in earlier
objects.
Passing in a single object will create a shallow copy of it. For a deep copy,
use `clone()`.
@method merge
@param {Object} objects* One or more objects to merge.
@return {Object} A new merged object.
**/
Y.merge = function () {
var args = arguments,
i = 0,
len = args.length,
result = {};
for (; i < len; ++i) {
Y.mix(result, args[i], true);
}
return result;
};
/**
Mixes _supplier_'s properties into _receiver_. Properties will not be
overwritten or merged unless the _overwrite_ or _merge_ parameters are `true`,
respectively.
In the default mode (0), only properties the supplier owns are copied (prototype
properties are not copied). The following copying modes are available:
* `0`: _Default_. Object to object.
* `1`: Prototype to prototype.
* `2`: Prototype to prototype and object to object.
* `3`: Prototype to object.
* `4`: Object to prototype.
@method mix
@param {Function|Object} receiver The object or function to receive the mixed
properties.
@param {Function|Object} supplier The object or function supplying the
properties to be mixed.
@param {Boolean} [overwrite=false] If `true`, properties that already exist
on the receiver will be overwritten with properties from the supplier.
@param {String[]} [whitelist] An array of property names to copy. If
specified, only the whitelisted properties will be copied, and all others
will be ignored.
@param {Int} [mode=0] Mix mode to use. See above for available modes.
@param {Boolean} [merge=false] If `true`, objects and arrays that already
exist on the receiver will have the corresponding object/array from the
supplier merged into them, rather than being skipped or overwritten. When
both _overwrite_ and _merge_ are `true`, _merge_ takes precedence.
@return {Function|Object|YUI} The receiver, or the YUI instance if the
specified receiver is falsy.
**/
Y.mix = function(receiver, supplier, overwrite, whitelist, mode, merge) {
var alwaysOverwrite, exists, from, i, key, len, to;
// If no supplier is given, we return the receiver. If no receiver is given,
// we return Y. Returning Y doesn't make much sense to me, but it's
// grandfathered in for backcompat reasons.
if (!receiver || !supplier) {
return receiver || Y;
}
if (mode) {
// In mode 2 (prototype to prototype and object to object), we recurse
// once to do the proto to proto mix. The object to object mix will be
// handled later on.
if (mode === 2) {
Y.mix(receiver.prototype, supplier.prototype, overwrite,
whitelist, 0, merge);
}
// Depending on which mode is specified, we may be copying from or to
// the prototypes of the supplier and receiver.
from = mode === 1 || mode === 3 ? supplier.prototype : supplier;
to = mode === 1 || mode === 4 ? receiver.prototype : receiver;
// If either the supplier or receiver doesn't actually have a
// prototype property, then we could end up with an undefined `from`
// or `to`. If that happens, we abort and return the receiver.
if (!from || !to) {
return receiver;
}
} else {
from = supplier;
to = receiver;
}
// If `overwrite` is truthy and `merge` is falsy, then we can skip a call
// to `hasOwnProperty` on each iteration and save some time.
alwaysOverwrite = overwrite && !merge;
if (whitelist) {
for (i = 0, len = whitelist.length; i < len; ++i) {
key = whitelist[i];
// We call `Object.prototype.hasOwnProperty` instead of calling
// `hasOwnProperty` on the object itself, since the object's
// `hasOwnProperty` method may have been overridden or removed.
// Also, some native objects don't implement a `hasOwnProperty`
// method.
if (!hasOwn.call(from, key)) {
continue;
}
exists = alwaysOverwrite ? false : hasOwn.call(to, key);
if (merge && exists && isObject(to[key], true)
&& isObject(from[key], true)) {
// If we're in merge mode, and the key is present on both
// objects, and the value on both objects is either an object or
// an array (but not a function), then we recurse to merge the
// `from` value into the `to` value instead of overwriting it.
//
// Note: It's intentional that the whitelist isn't passed to the
// recursive call here. This is legacy behavior that lots of
// code still depends on.
Y.mix(to[key], from[key], overwrite, null, 0, merge);
} else if (overwrite || !exists) {
// We're not in merge mode, so we'll only copy the `from` value
// to the `to` value if we're in overwrite mode or if the
// current key doesn't exist on the `to` object.
to[key] = from[key];
}
}
} else {
for (key in from) {
// The code duplication here is for runtime performance reasons.
// Combining whitelist and non-whitelist operations into a single
// loop or breaking the shared logic out into a function both result
// in worse performance, and Y.mix is critical enough that the byte
// tradeoff is worth it.
if (!hasOwn.call(from, key)) {
continue;
}
exists = alwaysOverwrite ? false : hasOwn.call(to, key);
if (merge && exists && isObject(to[key], true)
&& isObject(from[key], true)) {
Y.mix(to[key], from[key], overwrite, null, 0, merge);
} else if (overwrite || !exists) {
to[key] = from[key];
}
}
// If this is an IE browser with the JScript enumeration bug, force
// enumeration of the buggy properties by making a recursive call with
// the buggy properties as the whitelist.
if (Y.Object._hasEnumBug) {
Y.mix(to, from, overwrite, Y.Object._forceEnum, mode, merge);
}
}
return receiver;
};
/**
* The YUI module contains the components required for building the YUI
* seed file. This includes the script loading mechanism, a simple queue,
* and the core utilities for the library.
* @module yui
* @submodule yui-base
*/
/**
* Adds utilities to the YUI instance for working with objects.
*
* @class Object
*/
var hasOwn = Object.prototype.hasOwnProperty,
// If either MooTools or Prototype is on the page, then there's a chance that we
// can't trust "native" language features to actually be native. When this is
// the case, we take the safe route and fall back to our own non-native
// implementations.
win = Y.config.win,
unsafeNatives = win && !!(win.MooTools || win.Prototype),
UNDEFINED, // <-- Note the comma. We're still declaring vars.
/**
* Returns a new object that uses _obj_ as its prototype. This method wraps the
* native ES5 `Object.create()` method if available, but doesn't currently
* pass through `Object.create()`'s second argument (properties) in order to
* ensure compatibility with older browsers.
*
* @method ()
* @param {Object} obj Prototype object.
* @return {Object} New object using _obj_ as its prototype.
* @static
*/
O = Y.Object = (!unsafeNatives && Object.create) ? function (obj) {
// We currently wrap the native Object.create instead of simply aliasing it
// to ensure consistency with our fallback shim, which currently doesn't
// support Object.create()'s second argument (properties). Once we have a
// safe fallback for the properties arg, we can stop wrapping
// Object.create().
return Object.create(obj);
} : (function () {
// Reusable constructor function for the Object.create() shim.
function F() {}
// The actual shim.
return function (obj) {
F.prototype = obj;
return new F();
};
}()),
/**
* Property names that IE doesn't enumerate in for..in loops, even when they
* should be enumerable. When `_hasEnumBug` is `true`, it's necessary to
* manually enumerate these properties.
*
* @property _forceEnum
* @type String[]
* @protected
* @static
*/
forceEnum = O._forceEnum = [
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'toString',
'toLocaleString',
'valueOf'
],
/**
* `true` if this browser has the JScript enumeration bug that prevents
* enumeration of the properties named in the `_forceEnum` array, `false`
* otherwise.
*
* See:
* - <https://developer.mozilla.org/en/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug>
* - <http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation>
*
* @property _hasEnumBug
* @type {Boolean}
* @protected
* @static
*/
hasEnumBug = O._hasEnumBug = !{valueOf: 0}.propertyIsEnumerable('valueOf'),
/**
* Returns `true` if _key_ exists on _obj_, `false` if _key_ doesn't exist or
* exists only on _obj_'s prototype. This is essentially a safer version of
* `obj.hasOwnProperty()`.
*
* @method owns
* @param {Object} obj Object to test.
* @param {String} key Property name to look for.
* @return {Boolean} `true` if _key_ exists on _obj_, `false` otherwise.
* @static
*/
owns = O.owns = function (obj, key) {
return !!obj && hasOwn.call(obj, key);
}; // <-- End of var declarations.
/**
* Alias for `owns()`.
*
* @method hasKey
* @param {Object} obj Object to test.
* @param {String} key Property name to look for.
* @return {Boolean} `true` if _key_ exists on _obj_, `false` otherwise.
* @static
*/
O.hasKey = owns;
/**
* Returns an array containing the object's enumerable keys. Does not include
* prototype keys or non-enumerable keys.
*
* Note that keys are returned in enumeration order (that is, in the same order
* that they would be enumerated by a `for-in` loop), which may not be the same
* as the order in which they were defined.
*
* This method is an alias for the native ES5 `Object.keys()` method if
* available.
*
* @example
*
* Y.Object.keys({a: 'foo', b: 'bar', c: 'baz'});
* // => ['a', 'b', 'c']
*
* @method keys
* @param {Object} obj An object.
* @return {String[]} Array of keys.
* @static
*/
O.keys = (!unsafeNatives && Object.keys) || function (obj) {
if (!Y.Lang.isObject(obj)) {
throw new TypeError('Object.keys called on a non-object');
}
var keys = [],
i, key, len;
for (key in obj) {
if (owns(obj, key)) {
keys.push(key);
}
}
if (hasEnumBug) {
for (i = 0, len = forceEnum.length; i < len; ++i) {
key = forceEnum[i];
if (owns(obj, key)) {
keys.push(key);
}
}
}
return keys;
};
/**
* Returns an array containing the values of the object's enumerable keys.
*
* Note that values are returned in enumeration order (that is, in the same
* order that they would be enumerated by a `for-in` loop), which may not be the
* same as the order in which they were defined.
*
* @example
*
* Y.Object.values({a: 'foo', b: 'bar', c: 'baz'});
* // => ['foo', 'bar', 'baz']
*
* @method values
* @param {Object} obj An object.
* @return {Array} Array of values.
* @static
*/
O.values = function (obj) {
var keys = O.keys(obj),
i = 0,
len = keys.length,
values = [];
for (; i < len; ++i) {
values.push(obj[keys[i]]);
}
return values;
};
/**
* Returns the number of enumerable keys owned by an object.
*
* @method size
* @param {Object} obj An object.
* @return {Number} The object's size.
* @static
*/
O.size = function (obj) {
return O.keys(obj).length;
};
/**
* Returns `true` if the object owns an enumerable property with the specified
* value.
*
* @method hasValue
* @param {Object} obj An object.
* @param {any} value The value to search for.
* @return {Boolean} `true` if _obj_ contains _value_, `false` otherwise.
* @static
*/
O.hasValue = function (obj, value) {
return Y.Array.indexOf(O.values(obj), value) > -1;
};
/**
* Executes a function on each enumerable property in _obj_. The function
* receives the value, the key, and the object itself as parameters (in that
* order).
*
* By default, only properties owned by _obj_ are enumerated. To include
* prototype properties, set the _proto_ parameter to `true`.
*
* @method each
* @param {Object} obj Object to enumerate.
* @param {Function} fn Function to execute on each enumerable property.
* @param {mixed} fn.value Value of the current property.
* @param {String} fn.key Key of the current property.
* @param {Object} fn.obj Object being enumerated.
* @param {Object} [thisObj] `this` object to use when calling _fn_.
* @param {Boolean} [proto=false] Include prototype properties.
* @return {YUI} the YUI instance.
* @chainable
* @static
*/
O.each = function (obj, fn, thisObj, proto) {
var key;
for (key in obj) {
if (proto || owns(obj, key)) {
fn.call(thisObj || Y, obj[key], key, obj);
}
}
return Y;
};
/**
* Executes a function on each enumerable property in _obj_, but halts if the
* function returns a truthy value. The function receives the value, the key,
* and the object itself as paramters (in that order).
*
* By default, only properties owned by _obj_ are enumerated. To include
* prototype properties, set the _proto_ parameter to `true`.
*
* @method some
* @param {Object} obj Object to enumerate.
* @param {Function} fn Function to execute on each enumerable property.
* @param {mixed} fn.value Value of the current property.
* @param {String} fn.key Key of the current property.
* @param {Object} fn.obj Object being enumerated.
* @param {Object} [thisObj] `this` object to use when calling _fn_.
* @param {Boolean} [proto=false] Include prototype properties.
* @return {Boolean} `true` if any execution of _fn_ returns a truthy value,
* `false` otherwise.
* @static
*/
O.some = function (obj, fn, thisObj, proto) {
var key;
for (key in obj) {
if (proto || owns(obj, key)) {
if (fn.call(thisObj || Y, obj[key], key, obj)) {
return true;
}
}
}
return false;
};
/**
* Retrieves the sub value at the provided path,
* from the value object provided.
*
* @method getValue
* @static
* @param o The object from which to extract the property value.
* @param path {Array} A path array, specifying the object traversal path
* from which to obtain the sub value.
* @return {Any} The value stored in the path, undefined if not found,
* undefined if the source is not an object. Returns the source object
* if an empty path is provided.
*/
O.getValue = function(o, path) {
if (!Y.Lang.isObject(o)) {
return UNDEFINED;
}
var i,
p = Y.Array(path),
l = p.length;
for (i = 0; o !== UNDEFINED && i < l; i++) {
o = o[p[i]];
}
return o;
};
/**
* Sets the sub-attribute value at the provided path on the
* value object. Returns the modified value object, or
* undefined if the path is invalid.
*
* @method setValue
* @static
* @param o The object on which to set the sub value.
* @param path {Array} A path array, specifying the object traversal path
* at which to set the sub value.
* @param val {Any} The new value for the sub-attribute.
* @return {Object} The modified object, with the new sub value set, or
* undefined, if the path was invalid.
*/
O.setValue = function(o, path, val) {
var i,
p = Y.Array(path),
leafIdx = p.length - 1,
ref = o;
if (leafIdx >= 0) {
for (i = 0; ref !== UNDEFINED && i < leafIdx; i++) {
ref = ref[p[i]];
}
if (ref !== UNDEFINED) {
ref[p[i]] = val;
} else {
return UNDEFINED;
}
}
return o;
};
/**
* Returns `true` if the object has no enumerable properties of its own.
*
* @method isEmpty
* @param {Object} obj An object.
* @return {Boolean} `true` if the object is empty.
* @static
* @since 3.2.0
*/
O.isEmpty = function (obj) {
return !O.keys(obj).length;
};
/**
* The YUI module contains the components required for building the YUI seed
* file. This includes the script loading mechanism, a simple queue, and the
* core utilities for the library.
* @module yui
* @submodule yui-base
*/
/**
* YUI user agent detection.
* Do not fork for a browser if it can be avoided. Use feature detection when
* you can. Use the user agent as a last resort. For all fields listed
* as @type float, UA stores a version number for the browser engine,
* 0 otherwise. This value may or may not map to the version number of
* the browser using the engine. The value is presented as a float so
* that it can easily be used for boolean evaluation as well as for
* looking for a particular range of versions. Because of this,
* some of the granularity of the version info may be lost. The fields that
* are @type string default to null. The API docs list the values that
* these fields can have.
* @class UA
* @static
*/
/**
* Static method for parsing the UA string. Defaults to assigning it's value to Y.UA
* @static
* @method Env.parseUA
* @param {String} subUA Parse this UA string instead of navigator.userAgent
* @returns {Object} The Y.UA object
*/
YUI.Env.parseUA = function(subUA) {
var numberify = function(s) {
var c = 0;
return parseFloat(s.replace(/\./g, function() {
return (c++ == 1) ? '' : '.';
}));
},
win = Y.config.win,
nav = win && win.navigator,
o = {
/**
* Internet Explorer version number or 0. Example: 6
* @property ie
* @type float
* @static
*/
ie: 0,
/**
* Opera version number or 0. Example: 9.2
* @property opera
* @type float
* @static
*/
opera: 0,
/**
* Gecko engine revision number. Will evaluate to 1 if Gecko
* is detected but the revision could not be found. Other browsers
* will be 0. Example: 1.8
* <pre>
* Firefox 1.0.0.4: 1.7.8 <-- Reports 1.7
* Firefox 1.5.0.9: 1.8.0.9 <-- 1.8
* Firefox 2.0.0.3: 1.8.1.3 <-- 1.81
* Firefox 3.0 <-- 1.9
* Firefox 3.5 <-- 1.91
* </pre>
* @property gecko
* @type float
* @static
*/
gecko: 0,
/**
* AppleWebKit version. KHTML browsers that are not WebKit browsers
* will evaluate to 1, other browsers 0. Example: 418.9
* <pre>
* Safari 1.3.2 (312.6): 312.8.1 <-- Reports 312.8 -- currently the
* latest available for Mac OSX 10.3.
* Safari 2.0.2: 416 <-- hasOwnProperty introduced
* Safari 2.0.4: 418 <-- preventDefault fixed
* Safari 2.0.4 (419.3): 418.9.1 <-- One version of Safari may run
* different versions of webkit
* Safari 2.0.4 (419.3): 419 <-- Tiger installations that have been
* updated, but not updated
* to the latest patch.
* Webkit 212 nightly: 522+ <-- Safari 3.0 precursor (with native
* SVG and many major issues fixed).
* Safari 3.0.4 (523.12) 523.12 <-- First Tiger release - automatic
* update from 2.x via the 10.4.11 OS patch.
* Webkit nightly 1/2008:525+ <-- Supports DOMContentLoaded event.
* yahoo.com user agent hack removed.
* </pre>
* http://en.wikipedia.org/wiki/Safari_version_history
* @property webkit
* @type float
* @static
*/
webkit: 0,
/**
* Safari will be detected as webkit, but this property will also
* be populated with the Safari version number
* @property safari
* @type float
* @static
*/
safari: 0,
/**
* Chrome will be detected as webkit, but this property will also
* be populated with the Chrome version number
* @property chrome
* @type float
* @static
*/
chrome: 0,
/**
* The mobile property will be set to a string containing any relevant
* user agent information when a modern mobile browser is detected.
* Currently limited to Safari on the iPhone/iPod Touch, Nokia N-series
* devices with the WebKit-based browser, and Opera Mini.
* @property mobile
* @type string
* @default null
* @static
*/
mobile: null,
/**
* Adobe AIR version number or 0. Only populated if webkit is detected.
* Example: 1.0
* @property air
* @type float
*/
air: 0,
/**
* Detects Apple iPad's OS version
* @property ipad
* @type float
* @static
*/
ipad: 0,
/**
* Detects Apple iPhone's OS version
* @property iphone
* @type float
* @static
*/
iphone: 0,
/**
* Detects Apples iPod's OS version
* @property ipod
* @type float
* @static
*/
ipod: 0,
/**
* General truthy check for iPad, iPhone or iPod
* @property ios
* @type float
* @default null
* @static
*/
ios: null,
/**
* Detects Googles Android OS version
* @property android
* @type float
* @static
*/
android: 0,
/**
* Detects Palms WebOS version
* @property webos
* @type float
* @static
*/
webos: 0,
/**
* Google Caja version number or 0.
* @property caja
* @type float
*/
caja: nav && nav.cajaVersion,
/**
* Set to true if the page appears to be in SSL
* @property secure
* @type boolean
* @static
*/
secure: false,
/**
* The operating system. Currently only detecting windows or macintosh
* @property os
* @type string
* @default null
* @static
*/
os: null
},
ua = subUA || nav && nav.userAgent,
loc = win && win.location,
href = loc && loc.href,
m;
o.secure = href && (href.toLowerCase().indexOf('https') === 0);
if (ua) {
if ((/windows|win32/i).test(ua)) {
o.os = 'windows';
} else if ((/macintosh/i).test(ua)) {
o.os = 'macintosh';
} else if ((/rhino/i).test(ua)) {
o.os = 'rhino';
}
// Modern KHTML browsers should qualify as Safari X-Grade
if ((/KHTML/).test(ua)) {
o.webkit = 1;
}
// Modern WebKit browsers are at least X-Grade
m = ua.match(/AppleWebKit\/([^\s]*)/);
if (m && m[1]) {
o.webkit = numberify(m[1]);
o.safari = o.webkit;
// Mobile browser check
if (/ Mobile\//.test(ua)) {
o.mobile = 'Apple'; // iPhone or iPod Touch
m = ua.match(/OS ([^\s]*)/);
if (m && m[1]) {
m = numberify(m[1].replace('_', '.'));
}
o.ios = m;
o.ipad = o.ipod = o.iphone = 0;
m = ua.match(/iPad|iPod|iPhone/);
if (m && m[0]) {
o[m[0].toLowerCase()] = o.ios;
}
} else {
m = ua.match(/NokiaN[^\/]*|webOS\/\d\.\d/);
if (m) {
// Nokia N-series, webOS, ex: NokiaN95
o.mobile = m[0];
}
if (/webOS/.test(ua)) {
o.mobile = 'WebOS';
m = ua.match(/webOS\/([^\s]*);/);
if (m && m[1]) {
o.webos = numberify(m[1]);
}
}
if (/ Android/.test(ua)) {
if (/Mobile/.test(ua)) {
o.mobile = 'Android';
}
m = ua.match(/Android ([^\s]*);/);
if (m && m[1]) {
o.android = numberify(m[1]);
}
}
}
m = ua.match(/Chrome\/([^\s]*)/);
if (m && m[1]) {
o.chrome = numberify(m[1]); // Chrome
o.safari = 0; //Reset safari back to 0
} else {
m = ua.match(/AdobeAIR\/([^\s]*)/);
if (m) {
o.air = m[0]; // Adobe AIR 1.0 or better
}
}
}
if (!o.webkit) { // not webkit
// @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; fi; U; ssr)
m = ua.match(/Opera[\s\/]([^\s]*)/);
if (m && m[1]) {
o.opera = numberify(m[1]);
m = ua.match(/Version\/([^\s]*)/);
if (m && m[1]) {
o.opera = numberify(m[1]); // opera 10+
}
m = ua.match(/Opera Mini[^;]*/);
if (m) {
o.mobile = m[0]; // ex: Opera Mini/2.0.4509/1316
}
} else { // not opera or webkit
m = ua.match(/MSIE\s([^;]*)/);
if (m && m[1]) {
o.ie = numberify(m[1]);
} else { // not opera, webkit, or ie
m = ua.match(/Gecko\/([^\s]*)/);
if (m) {
o.gecko = 1; // Gecko detected, look for revision
m = ua.match(/rv:([^\s\)]*)/);
if (m && m[1]) {
o.gecko = numberify(m[1]);
}
}
}
}
}
}
YUI.Env.UA = o;
return o;
};
Y.UA = YUI.Env.UA || YUI.Env.parseUA();
YUI.Env.aliases = {
"anim": ["anim-base","anim-color","anim-curve","anim-easing","anim-node-plugin","anim-scroll","anim-xy"],
"app": ["controller","model","model-list","view"],
"attribute": ["attribute-base","attribute-complex"],
"autocomplete": ["autocomplete-base","autocomplete-sources","autocomplete-list","autocomplete-plugin"],
"base": ["base-base","base-pluginhost","base-build"],
"cache": ["cache-base","cache-offline","cache-plugin"],
"collection": ["array-extras","arraylist","arraylist-add","arraylist-filter","array-invoke"],
"dataschema": ["dataschema-base","dataschema-json","dataschema-xml","dataschema-array","dataschema-text"],
"datasource": ["datasource-local","datasource-io","datasource-get","datasource-function","datasource-cache","datasource-jsonschema","datasource-xmlschema","datasource-arrayschema","datasource-textschema","datasource-polling"],
"datatable": ["datatable-base","datatable-datasource","datatable-sort","datatable-scroll"],
"datatype": ["datatype-number","datatype-date","datatype-xml"],
"datatype-date": ["datatype-date-parse","datatype-date-format"],
"datatype-number": ["datatype-number-parse","datatype-number-format"],
"datatype-xml": ["datatype-xml-parse","datatype-xml-format"],
"dd": ["dd-ddm-base","dd-ddm","dd-ddm-drop","dd-drag","dd-proxy","dd-constrain","dd-drop","dd-scroll","dd-delegate"],
"dom": ["dom-base","dom-screen","dom-style","selector-native","selector"],
"editor": ["frame","selection","exec-command","editor-base","editor-para","editor-br","editor-bidi","editor-tab","createlink-base"],
"event": ["event-base","event-delegate","event-synthetic","event-mousewheel","event-mouseenter","event-key","event-focus","event-resize","event-hover","event-outside"],
"event-custom": ["event-custom-base","event-custom-complex"],
"event-gestures": ["event-flick","event-move"],
"highlight": ["highlight-base","highlight-accentfold"],
"history": ["history-base","history-hash","history-hash-ie","history-html5"],
"io": ["io-base","io-xdr","io-form","io-upload-iframe","io-queue"],
"json": ["json-parse","json-stringify"],
"loader": ["loader-base","loader-rollup","loader-yui3"],
"node": ["node-base","node-event-delegate","node-pluginhost","node-screen","node-style"],
"pluginhost": ["pluginhost-base","pluginhost-config"],
"querystring": ["querystring-parse","querystring-stringify"],
"recordset": ["recordset-base","recordset-sort","recordset-filter","recordset-indexer"],
"resize": ["resize-base","resize-proxy","resize-constrain"],
"slider": ["slider-base","slider-value-range","clickable-rail","range-slider"],
"text": ["text-accentfold","text-wordbreak"],
"widget": ["widget-base","widget-htmlparser","widget-uievents","widget-skin"]
};
}, '@VERSION@' );