yui-debug.js revision b3f4bd4eb7b190da01195b5622026c87b32e066b
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync * The YUI module contains the components required for building the YUI seed
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync * file. This includes the script loading mechanism, a simple queue, and
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync * the core utilities for the library.
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync * @module yui
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync * @submodule yui-base
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsyncThe YUI global namespace object. If YUI is already defined, the
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsyncexisting YUI object will not be overwritten so that defined
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsyncnamespaces are preserved. It is the constructor for the object
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsyncthe end user interacts with. As indicated below, each instance
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsynchas full custom event support, but only if the event system
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsyncis available. This is a self-instantiable factory function. You
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsynccan invoke it directly like this:
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync YUI().use('*', function(Y) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsyncBut it also works like this:
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync var Y = YUI();
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsyncConfiguring the YUI object:
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync debug: true,
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync combine: false
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync }).use('node', function(Y) {
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync //Node is ready to use
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsyncSee the API docs for the <a href="config.html">Config</a> class
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsyncfor the complete list of supported configuration properties accepted
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsyncby the YUI constuctor.
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync@constructor
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync@uses EventTarget
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync@param [o]* {Object} 0..n optional configuration objects. these values
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsyncare store in Y.config. See <a href="config.html">Config</a> for the list of supported
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync /*global YUI*/
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync /*global YUI_config*/
a5e7ae69e440f6816420fc99599f044e79e716b6vboxsync var YUI = function() {
Y = new YUI();
Y._init();
if (gconf) {
Y._setup();
Y._setup();
NOOP = function() {},
instances = {},
} catch (ex) {}
handleLoad = function() {
if (hasWin) {
getLoader = function(Y, o) {
if (loader) {
//loader._config(Y.config);
YUI.Env.core = Y.Array.dedupe([].concat(YUI.Env.core, [ 'loader-base', 'loader-rollup', 'loader-yui3' ]));
return loader;
clobber = function(r, s) {
if (s.hasOwnProperty(i)) {
if (docClass) {
proto = {
* update the loader cache if necessary. Updating Y.config directly
applyConfig: function(o) {
o = o || NOOP;
var attr,
name,
for (name in o) {
if (loader) {
_config: function(o) {
this.applyConfig(o);
_init: function() {
prop;
if (!Env) {
Y.Env = {
core: ['get','features','intl-base','yui-log','yui-later','loader-base', 'loader-rollup', 'loader-yui3'],
_used: {},
_attached: {},
_missed: [],
_loaded: {},
// so "yui/yui-min", "yui/yui-debug", "yui-base/yui-base-debug". NOT "yui/yui-tshirt".
// 4. This is followed by ".js", so "yui/yui.js", "simpleyui/simpleyui-min.js"
// "blah?foo/yui/yui.js" will capture "foo/" and "blah?some/thing.js&3.3.0/build/yui-davglass/yui-davglass.js"
if (match) {
path = {
return path;
function(pattern) {
if (src) {
if (parsed) {
return path;
bootstrap: true,
cacheUse: true,
debug: true,
fetchCSS: true,
throwFail: true,
useBrowserConsole: true,
useNativeES5: true,
el.innerHTML = '<div id="' + CSS_STAMP_EL + '" style="position: absolute !important; visibility: hidden !important"></div>';
_setup: function(o) {
core = [],
//extras = Y.config.core || ['get','features','intl-base','yui-log','yui-later','loader-base', 'loader-rollup', 'loader-yui3'];
if (Y.Loader) {
getLoader(Y);
if (instance) {
m = instance;
m = m[nest[i]];
mod = {
for (i in instances) {
if (loader) {
name = r[i];
if (go) {
if (!done[r[i]]) {
name = r[i];
if (!mod) {
moot = true;
if (req) {
if (after) {
if (use) {
use: function() {
name,
provisioned = true;
callback = null;
provisioned = false;
if (provisioned) {
if (Y._loading) {
* Notify handler from Loader for attachment/load errors
* @param callback {Function} The callback to pass to the `Y.config.loadErrorFn`
} else if (callback) {
YArray = Y.Array,
missing = [],
ret = true,
if (aliases) {
names = a;
if (!skip) {
success: true,
ret = true,
Y._loading = false;
if (data) {
missing = [];
if (redo) {
redo = false;
Y._loading = true;
if (data) {
if (ret) {
if (ret) {
handleLoader();
if (len) {
Y._loading = true;
Y._loading = true;
handleBoot = function() {
Y._loading = false;
if (ret) {
handleLoader();
namespace: function() {
for (; i < a.length; i++) {
arg = a[i];
* @param src Optional additional info (passed to `Y.config.errorFn` and `Y.message`)
var Y = this, ret;
var uid;
if (!uid) {
if (!readOnly) {
uid = null;
return uid;
destroy: function() {
if (Y.Event) {
delete Y.Env;
delete Y.config;
fullpath: './davglass.js'
fullpath: './foo.js'
if (hasWin) {
handleLoad();
* The YUI combo service base dir. Ex: `http://yui.yahooapis.com/combo?`
* minified version of the files (e.g., event-min.js). The filter property
* <dd>Selects the debug versions of the library (e.g., event-debug.js).
* <dd>Selects the non-minified version of the library (e.g., event.js).</dd>
* 'replaceStr': "-debug.js"
* mycssmod: '/css/mycssmod.css'
* base: 'http://yui.yahooapis.com/2.8.0r4/build/',
* comboBase: 'http://yui.yahooapis.com/combo?',
* path: "yahoo-dom-event/yahoo-dom-event.js"
* path: "animation/animation.js",
* @default loader/loader-min.js
TYPES = {
SUBREGEX = /\{\s*([^|}]+?)\s*(?:\|([^}]*))?\s*\}/g,
TRIMREGEX = /^\s+|\s+$/g,
L.isBoolean = function(o) {
L.isDate = function(o) {
L.isFunction = function(o) {
L.isNull = function(o) {
L.isNumber = function(o) {
L.isString = function(o) {
L.isUndefined = function(o) {
L.isValue = function(o) {
var t = L.type(o);
return isFinite(o);
return new Date().getTime();
L.sub = function(s, o) {
return s.trimLeft();
return s.trimRight();
L.type = function(o) {
} catch (ex) {
result = [];
return result;
return [thing];
Y.Array = YArray;
var hash = {},
results = [],
return results;
if (i in array) {
var hash = {},
i, len;
if (i in keys) {
return hash;
// http://es5.github.com/#x15.4.4.14
return from;
} catch (ex) {}
return result;
function Queue() {
this._init();
_init: function() {
this._q = [];
next: function() {
last: function() {
add: function() {
size: function() {
return function (arg) {
String(arg);
(e.g. Node.js).
[WebKit Bug 34679](https://bugs.webkit.org/show_bug.cgi?id=34679).
Y.getLocation = function () {
// YUI instance before a user's config is applied; i.e. `Y.config.win` does
Y.merge = function () {
result = {};
for (; i < len; ++i) {
return result;
return receiver || Y;
if (mode) {
return receiver;
if (whitelist) {
if (Y.Object._hasEnumBug) {
return receiver;
return function (obj) {
* - <https://developer.mozilla.org/en/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug>
var keys = [],
if (hasEnumBug) {
return keys;
values = [];
for (; i < len; ++i) {
return values;
} catch (ex) {
var key;
var key;
return UNDEFINED;
p = Y.Array(path),
l = p.length;
p = Y.Array(path),
ref = o;
return UNDEFINED;
var numberify = function(s) {
mobile: null,
ios: null,
accel: false,
secure: false,
os: null,
if (ua) {
o.ios = m;
if (!o.android) {
o.accel = true;
if (!subUA) {
"anim": ["anim-base","anim-color","anim-curve","anim-easing","anim-node-plugin","anim-scroll","anim-xy"],
"autocomplete": ["autocomplete-base","autocomplete-sources","autocomplete-list","autocomplete-plugin"],
"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-core","datatable-head","datatable-body","datatable-base","datatable-column-widths","datatable-message","datatable-mutable","datatable-sort","datatable-datasource"],
"datatable-deprecated": ["datatable-base-deprecated","datatable-datasource-deprecated","datatable-sort-deprecated","datatable-scroll-deprecated"],
"dd": ["dd-ddm-base","dd-ddm","dd-ddm-drop","dd-drag","dd-proxy","dd-constrain","dd-drop","dd-scroll","dd-delegate"],
"editor": ["frame","editor-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-touch","event-move","event-flick","event-valuechange"],
cssOptions: {
attributes: {
jsOptions: {
autopurge: true,
options: {
attributes: {
_insertCache: {},
_pending: null,
_purgeNodes: [],
_queue: [],
Y.log('`Y.Get.abort()` is deprecated as of 3.5.0. Use the `abort()` method on the transaction instead.', 'warn', 'get');
transaction = null;
this._pending = null;
var urls = ['foo.css', 'http://example.com/bar.css', 'baz/quux.css'];
Y.log('foo.js failed to load!');
Y.log('foo.js was loaded successfully');
var urls = ['foo.js', 'http://example.com/bar.js', 'baz/quux.js'];
Y.Get.js(urls, function (err) {
Y.Get.js(urls, {
Y.Get.js([
{url: 'foo.js', attributes: {id: 'foo'}},
{url: 'bar.js', attributes: {id: 'bar', charset: 'iso-8859-1'}}
Y.Get.load(['foo.css', 'bar.js', 'baz.css'], function (err) {
_getEnv: function () {
return (this._env = {
// https://developer.mozilla.org/En/HTML/Element/Script#Attributes
var requests = [],
Y.log('The `charset` option is deprecated as of 3.5.0. Set `attributes.charset` instead.', 'warn', 'get');
var transaction;
options = {};
if (!this._env) {
this._getEnv();
this._next();
return transaction;
_next: function () {
var item;
if (this._pending) {
if (item) {
if (isTransaction) {
var self = this;
This object comes from the options passed to `Get.css()`, `Get.js()`, or
this._pending = null;
this._pendingCSS = null;
this._queue = [];
this._finish();
var self = this,
purge: function () {
if (!CUSTOM_ATTRS) {
return node;
_finish: function () {
if (errors) {
if (req) {
return Y.merge(this, {
if (el) {
return el;
if (el) {
self = this,
if (!node) {
if (isScript) {
function onError() {
function onLoad() {
if (isScript) {
onLoad();
_next: function () {
if (this._pending) {
} else if (!this._waiting) {
this._finish();
var self = this,
if (newReq) {
if (isWebKit) {
} catch (ex) {
if (err) {
this._pending = null;
this._next();
var feature_tests = {};
* @param {String} name The number sequence of the test, how it's reported in the URL or config: 1, 2, 3
* @param {Function} o.test The test function to execute, the only argument to the function is the `Y` instance
result = [];
if (cat_o) {
if (!feature) {
if (ua) {
return result;
/* This file is auto-generated by src/loader/scripts/meta_join.py */
svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
ret = true;
return ret;
ret = false;
test: function() {
test: function() {
return ret;
return ret;
svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
var SPLIT_REGEX = /[, ]/;
return availableLanguages[i];
if (result) {
return result;
* console implementations. This module is a `core` YUI module, <a href="../classes/YUI.html#method_log">it's documentation is located under the YUI class</a>.
var INSTANCE = Y,
Y = INSTANCE,
c = Y.config,
if (c.debug) {
if (src) {
if (!bail) {
if (c.useBrowserConsole) {
console[f](m);
* Provides a setTimeout/setInterval wrapper. This module is a `core` YUI module, <a href="../classes/YUI.html#method_later">it's documentation is located under the YUI class</a>.
var NO_ARGS = [];
var cancelled = false,
wrapper = function() {
if (!cancelled) {
cancel: function() {
cancelled = true;
if (this.interval) {
groups: {},
patterns: {} },
ext: false,
combine: true,
combine: true,
ext: false,
patterns: {
yui2Update();
var NOT_FOUND = {},
NO_REQUIREMENTS = [],
YObject = Y.Object,
YArray = Y.Array,
L = Y.Lang,
if (!nomin) {
return path;
* @param {String} config.comboBase The Combo service base path. Ex: `http://yui.yahooapis.com/combo?`
* @param {String} config.root The root path to prepend to module names for the combo service. Ex: `2.5.2/build/`
* @param {String|Object} config.filter A filter to apply to result urls. <a href="#property_filter">See filter property</a>
* @param {Object} config.filters Per-component filter specification. If specified for a given component, this overrides the filter config.
* @param {Boolean} config.combine Use a combo service to reduce the number of http connections required to load your dependencies
* @param {Array} config.force A list of modules that should always be loaded when required, even if already present on the page
* @param {HTMLElement|String} config.insertBefore Node or id for a node that should be used as the insertion point for new nodes
* @param {Object} config.jsAttributes Object literal containing attributes to add to script nodes
* @param {Number} config.timeout The number of milliseconds before a timeout occurs when dynamically loading nodes. If not set, there is no timeout
* @param {Function} config.onCSS Callback for the 'CSSComplete' event. When loading YUI components with CSS the CSS is loaded first, then the script. This provides a moment you can tie into to improve the presentation of the page while the script is loading.
* @param {Object} config.modules A list of module definitions. See <a href="#method_addModule">Loader.addModule</a> for the supported module metadata
* @param {Object} config.groups A list of group definitions. Each group can contain specific definitions for `base`, `comboBase`, `combine`, and accepts a list of `modules`.
* @param {String} config.2in3 The version of the YUI 2 in 3 wrapper to use. The intrinsic support for YUI 2 modules in YUI 3 relies on versions of the YUI 2 components inside YUI 3 module wrappers. These wrappers change over time to accomodate the issues that arise from running YUI 2 in a YUI 3 sandbox.
* @param {String} config.yui2 When using the 2in3 project, you can select the version of YUI 2 to use. Valid values are `2.2.2`, `2.3.1`, `2.4.1`, `2.5.2`, `2.6.0`, `2.7.0`, `2.8.0`, `2.8.1` and `2.9.0` [default] -- plus all versions of YUI 2 going forward.
Y.Loader = function(o) {
self = this;
// self.jsAttributes = null;
* @default http://yui.yahooapis.com/[YUI VERSION]/build/
* @default http://yui.yahooapis.com/combo?
* minified version of the files (e.g., event-min.js). The filter property
* <dd>Selects the debug versions of the library (e.g., event-debug.js).
* <dd>Selects the non-minified version of the library (e.g., event.js).
* 'replaceStr': "-debug.js"
if (cache) {
FILTER_DEFS: {
RAW: {
DEBUG: {
_inspectPage: function() {
this.loaded[k] = true;
if (v.details) {
var m = this.moduleInfo[k],
delete m.expanded;
m._inspected = true;
if (!m || !other) {
_config: function(o) {
if (o.hasOwnProperty(i)) {
val = o[i];
val = {
for (j in val) {
groupName = j;
if (L.isString(f)) {
f = f.toUpperCase();
if (mod) {
if (mod) {
nmod = {
Y.log('Adding skin (' + name + '), ' + parent + ', ' + pkg + ', ' + info[name].path, 'info', 'loader');
return name;
* //out.js will contain Node and YQL modules
this.addModule({
self = this;
if (o.patterns) {
if (mods) {
}, self);
* @param {Array} [config.after] Array of modules the components which, if present, should be sorted above this one
* @param {Object} [config.after_map] Faster alternative to 'after' -- supply a hash instead of an array
* @param {String} [config.fullpath] If `fullpath` is specified, this is used instead of the configured `base + path`
* @param {Boolean} [config.skinnable] Flag to determine if skin assets should automatically be pulled in
* @param {String} [config.group] The group the module belongs to -- this is set automatically when it is added as part of a group configuration.
* @param {Array} [config.lang] Array of BCP 47 language tags of languages for which this module has localized resource bundles, e.g., `["en-GB", "zh-Hans-CN"]`
* @param {Object} [config.condition] Specifies that the module should be loaded automatically if a condition is met. This is an object with up to three fields:
* @param {Function} [config.condition.test] A function that returns true when the module is to be loaded.
* @param {Function} [config.configFn] A function to exectute when configuring this module
* @param {Object} config.configFn.mod The module config, modifying this object will modify it's config. Returning false will delete the module's config.
* @return {Object} the module definition or null if the object passed in did not provide all required attributes.
if (!o || !o.name) {
if (!o.type) {
if (!smod) {
if (subs) {
for (i in subs) {
s = subs[i];
if (s.supersedes) {
o.skinnable = true;
i, name);
i, name);
if (!smod) {
if (!smod) {
if (this.allowRollup) {
if (plugins) {
for (i in plugins) {
if (o.skinnable) {
if (o.condition) {
trigger = t[i];
if (o.supersedes) {
if (o.after) {
if (o.configFn) {
if (ret === false) {
this.dirty = true;
this._explodeRollups();
* Actually ask for: "dd-ddm-base,dd-ddm,dd-ddm-drop,dd-drag,dd-proxy,dd-constrain,dd-drop,dd-scroll,dd-drop-plugin"
_explodeRollups: function() {
var self = this, m,
if (m && m.use) {
if (m && m.use) {
filterRequires: function(r) {
var c = [], i, mod, o, m;
if (m && m.use) {
c.push(r[i]);
if (!mod) {
return NO_REQUIREMENTS;
d, k, m1,
r, old_mod,
hash;
hash = {};
intl = true;
if (!hash[r[i]]) {
d.push(r[i]);
hash[r[i]] = true;
m = this.getModule(r[i]);
if (!hash[r[i]]) {
d.push(r[i]);
hash[r[i]] = true;
m = this.getModule(r[i]);
if (o && this.loadOptional) {
if (!hash[o[i]]) {
d.push(o[i]);
hash[o[i]] = true;
m = info[o[i]];
if (cond) {
//Set the module to not parsed since we have conditionals and this could change the dependency tree.
if (go) {
skinpar = n;
if (intl) {
if (packName) {
ret = false,
if (!style) {
ret = true;
return ret;
return NOT_FOUND;
if (m && !m.provides) {
s = m.supersedes;
o[name] = true;
m.provides = o;
return m.provides;
this._config(o);
if (!this._init) {
this._setup();
this._explode();
if (this.allowRollup) {
this._rollup();
this._explodeRollups();
this._reduce();
this._sort();
* @param {String} packName The name of the package (e.g: lang/datatype-date-en-US)
if (!existing) {
conf = {
intl: true,
langPack: true,
supersedes: []
if (m.configFn) {
if (lang) {
_setup: function() {
if (!this.ignoreRegistered) {
if (this.ignore) {
if (l.hasOwnProperty(j)) {
if (this.force) {
if (this.force[i] in l) {
delete l[this.force[i]];
this._init = true;
_explode: function() {
self = this;
if (expound) {
if (!mname) {
if (!p.test) {
found = p;
if (found) {
if (p.action) {
m.temp = true;
_rollup: function() { },
_reduce: function(r) {
r = r || this.required;
if (r.hasOwnProperty(i)) {
m = this.getModule(i);
s = m && m.supersedes;
if (onEnd) {
this._continue();
_onSuccess: function() {
if (fn) {
_onProgress: function(e) {
var self = this;
_onFailure: function(o) {
for (i; i < len; i++) {
success: false
_onTimeout: function() {
var f = this.onTimeout;
success: false
_sort: function() {
done = {},
l = s.length;
moved = false;
doneKey = a + s[k];
moved = true;
if (moved) {
if (!moved) {
this.sorted = s;
if (source) {
if (!skipcalc) {
this.calculate(o);
if (type) {
comp++;
comp++;
var complete = function(d) {
actions++;
if (d && d.errors) {
u = d.errors[i];
errs[u] = u;
if (d && d.fn) {
delete d.fn;
this._loading = true;
complete({
onProgress: function(e) {
onTimeout: function(d) {
onSuccess: function(d) {
onFailure: function(d) {
autopurge: false,
async: true,
onProgress: function(e) {
onTimeout: function(d) {
onSuccess: function(d) {
onFailure: function(d) {
_continue: function() {
this._continue();
var f = this.filter,
hasFilter = true;
if (hasFilter) {
* Returns an Object hash of file arrays built from `loader.sorted` or from an arbitrary list of sorted modules.
if (calc) {
var addSingle = function(m) {
url = {
if (m.attributes) {
comboSources = {};
addSingle(m);
m.combine = true;
addSingle(m);
for (j in comboSources) {
url = j;
if (len) {
m = mods[i];
if (mods[i]) {
for (j in resCombos) {
base = j;
Y.log('maxURLLength (' + maxURLLength + ') is lower than the comboBase length (' + base.length + '), resetting to default (' + MAX_URL_LENGTH + ')', 'error', 'loader');
if (len) {
Y.log('Exceeded maxURLLength (' + maxURLLength + ') for ' + type + ', splitting', 'info', 'loader');
m = u.pop();
u.push(m);
if (u.length) {
resCombos = null;
return resolved;
path: 'mod.js'
if (!cb) {
var self = this,
this.rollups = {};
for (i in info) {
m = this.getModule(i);
if (m && m.rollup) {
this.rollups[i] = m;
rolled = false;
for (i in this.rollups) {
m = this.getModule(i);
s = m.supersedes || [];
roll = false;
if (!m.rollup) {
roll = false;
if (roll) {
if (roll) {
rolled = true;
this.getRequires(m);
if (!rolled) {
/* This file is auto-generated by src/loader/scripts/meta_join.py */
ret = false;
test: function() {
test: function() {
return ret;
svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
return ret;
ret = true;
return ret;