yui.js revision 52671ce4f644d565b2acd71a8ce4f6d20829a67c
4812N/A// @TODO: this needs to be created at build time from module metadata 4812N/A// reduce to one or the other 4812N/A * The YUI global namespace object. If YUI is already defined, the 4812N/A * existing YUI object will not be overwritten so that defined 4812N/A * namespaces are preserved. 4812N/A * @param o Optional configuration object. Options: 6936N/A * <li>------------------------------------------------------------------------</li> 6936N/A * <li>------------------------------------------------------------------------</li> 6936N/A * <li>debug: Turn debug statements on or off</li> 6936N/A * Log to the browser console if debug is on and the console is available</li> 6936N/A * A hash of log sources that should be logged. If specified, only log messages from these sources will be logged. 4812N/A * A hash of log sources that should be not be logged. If specified, all sources are logged if not on this list.</li> 6936N/A * <li>injected: set to true if the yui seed file was dynamically loaded in 6936N/A * order to bootstrap components relying on the window load event and onDOMReady.</li> 4812N/A * If throwFail is set, Y.fail will generate or re-throw a JS error. Otherwise the failure is logged. 4812N/A * A list of modules that defines the YUI core (overrides the default)</li> 4812N/A * <li>dateFormat: default date format</li> 6936N/A * <li>locale: default locale</li> 4812N/A * <li>------------------------------------------------------------------------</li> 4812N/A * <li>For event and get:</li> 4812N/A * <li>------------------------------------------------------------------------</li> 4812N/A * <li>pollInterval: The default poll interval</li> 5105N/A * <li>windowResizeDelay: The time between browser events to wait before firing.</li> 5105N/A * <li>-------------------------------------------------------------------------</li> 5105N/A * <li>-------------------------------------------------------------------------</li> 5105N/A * The secure base dir (not implemented)</li> 5105N/A * The root path to prepend to module names for the combo service. Ex: 2.5.2/build/</li> 5105N/A * A filter to apply to result urls. This filter will modify the default 5105N/A * path for all modules. The default path for the YUI library is the 5105N/A * can be a predefined filter or a custom filter. The valid predefined 5105N/A * This option will automatically include the Logger widget</dd> 5105N/A * <dd>Selects the non-minified version of the library (e.g., event.js).</dd> 5105N/A * You can also define a custom filter, which must be an object literal 5105N/A * containing a search expression and a replace string: 5105N/A * 'searchExp': "-min\\.js", 5105N/A * Use the YUI combo service to reduce the number of http connections required to load your dependencies</li> 5105N/A * A list of modules that should never be dynamically loaded</li> 5105N/A * A list of modules that should always be loaded when required, even if already present on the page</li> 5105N/A * Node or id for a node that should be used as the insertion point for new nodes</li> 5105N/A * charset for dynamic nodes</li> 5105N/A * number of milliseconds before a timeout occurs when dynamically loading nodes. in not set, there is no timeout</li> 5105N/A * execution context for all callbacks</li> 5105N/A * callback for the 'success' event</li> 5105N/A * callback for the 'failure' event</li> 5105N/A * callback for the 'timeout' event</li> 5105N/A * callback executed each time a script or css file is loaded</li> 5105N/A * A list of module definitions. See Loader.addModule for the supported module metadata</li> 5105N/A // Make a function, disallow direct instantiation 5105N/A // Allow instantiation without the new operator 5105N/A // set up the core environment 5105N/A // bind the specified additional modules for this instance 5105N/A// The prototype contains the functions that are required to allow the external 5105N/A// modules to be registered and for the instance to be initialized. 5105N/A * Initialize this YUI instance 6936N/A // @TODO resolve windowless environments 4812N/A // add a reference to o for anything that needs it 4812N/A // before _setup is called. 4812N/A // @todo expand the new module metadata // this.log(this.id + ') init '); * Finishes the instance setup. Attaches whatever modules were defined * when the yui modules was registered. // @TODO eval the need to copy the config * Executes a method on a YUI instance with * the specified id if the specified method is whitelisted. * @param id {string} the YUI instance id * @param method {string} the name of the method to exectute. * @param args {Array} the arguments to apply to the method * @return {object} the return value from the applied method or null * @param name {string} module name * @param fn {Function} entry point into the module that * is used to bind module to the YUI instance * @param version {string} version string * @param details optional config data: * requires - features that should be present before loading * optional - optional features that should be present if load optional defined * use - features that should be attached automatically * omit - features that should not be loaded if this module is present * @return {YUI} the YUI instance // this.log('Adding a new component ' + name); // @todo expand this to include version mapping // @todo may want to restore the build property // @todo fire moduleAvailable event return this;
// chain support // this.log('attaching ' + name, 'info', 'yui'); * Bind a module to a YUI instance * @param modules* {string} 1-n modules to bind (uses arguments array) * @param *callback {function} callback function executed when * the instance has the required functionality. If included, it * must be the last parameter. * Implement versioning? loader can load different versions? * we add syntax for specifying these? * YUI().use('dragdrop:2.4.0'); // specific version * YUI().use('dragdrop:2.4.0-'); // at least this version * YUI().use('dragdrop:2.4.0-2.9999.9999'); // version range * YUI().use('*'); // use all available modules * YUI().use('lang+dump+substitute'); // use lang and some plugins * YUI().use('lang+*'); // use lang and all known plugins * @return {YUI} the YUI instance // only attach a module once // Y.log(name + ' already used', 'info', 'yui'); // Y.log('USING ' + name, 'info', 'yui'); // CSS files don't register themselves, see if it has been loaded // While sorting out the packaged metadata in the modules, // let's look at the loader metadata as well // loaderMods = Y.Env.meta.modules; // m = loaderMods && loaderMods[name]; // if (m && m.parent && used[m.parent]) { // Y.log('USING FROM LOADER METADATA' + name, 'info', 'yui'); // Y.log('module not found: ' + name, 'info', 'yui'); Y.
log(
'module not found: ' +
name,
'info',
'yui');
// Y.log('module not found BUT HAS BEEN LOADED: ' + name, 'info', 'yui'); // make sure requirements are attached // Y.log('using module\'s requirements: ' + name, 'info', 'yui'); // add this module to full list of things to attach // Y.log('adding to requires list: ' + name); // Y.log('Use complete'); // Y.log(Y.id + ': use called: ' + a + ' :: ' + callback); // The last argument supplied to use can be a load complete callback // YUI().use('*'); // bind everything available // Y.log('loader before: ' + a.join(',')); // use loader to expand dependencies and sort the // requirements if it is available. // Y.log('loader after: ' + a.join(',')); // process each requirement and any additional requirements // the module metadata specifies // Y.log('all reqs: ' + r + ' --- missing: ' + missing + ', l: ' + l + ', ' + r[0]); Y.
log(
'Attempting to dynamically load the missing modules ' +
missing,
'info',
'yui');
return Y;
// chain support var yui = YUI().use('dragdrop'); * 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 * @param {string*} arguments 1-n namespaces to create * @return {object} A reference to the last namespace object created for (i=
0; i<a.
length; i=i+
1) {
d = (
"" + a[i]).
split(
".");
for (j=(d[
0] ==
"YAHOO") ?
1 :
0; j<d.
length; j=j+
1) {
// this is replaced if the log module is included * 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 * @param msg {string} the error message * @param e {Error} Optional JS error that was caught. If supplied * and throwFail is specified, this error will be re-thrown. * @return {YUI} this YUI instance this.
message(
msg,
"error");
// don't scrub this one * Generate an id that is unique among all YUI instances * @param pre {string} optional guid prefix * @return {string} the guid * Returns a guid associated with an object. If the object * does not have one, a new one is created unless readOnly * @param o 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 var uid = (
typeof o ===
'string') ? o : o.
_yuid;
// Give the YUI global the same properties as an instance. // This makes it so that the YUI global can be used like the YAHOO // global was used prior to 3.x. More importantly, the YUI global // provides global metadata, so env needs to be configured. // inheritance utilities are not available yet // set up the environment // add a window load event at load time so we can capture // the case where it fires before dynamic loading is