diff options
Diffstat (limited to 'lib/dojo/dojo.js.uncompressed.js')
-rw-r--r-- | lib/dojo/dojo.js.uncompressed.js | 1448 |
1 files changed, 780 insertions, 668 deletions
diff --git a/lib/dojo/dojo.js.uncompressed.js b/lib/dojo/dojo.js.uncompressed.js index 07593d88e..af7051aaf 100644 --- a/lib/dojo/dojo.js.uncompressed.js +++ b/lib/dojo/dojo.js.uncompressed.js @@ -1,5 +1,5 @@ /* - Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved. + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. Available via Academic Free License >= 2.1 OR the modified BSD license. see: http://dojotoolkit.org/license for details */ @@ -122,7 +122,7 @@ djConfig = { // of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple // modules may be configured via `djConfig.modulePaths`. modulePaths: {}, - // afterOnLoad: Boolean + // afterOnLoad: Boolean // Indicates Dojo was added to the page after the page load. In this case // Dojo will not wait for the page DOMContentLoad/load events and fire // its dojo.addOnLoad callbacks after making sure all outstanding @@ -149,7 +149,7 @@ djConfig = { // dojoBlankHtmlUrl: String // Used by some modules to configure an empty iframe. Used by dojo.io.iframe and // dojo.back, and dijit popup support in IE where an iframe is needed to make sure native - // controls do not bleed through the popups. Normally this configuration variable + // controls do not bleed through the popups. Normally this configuration variable // does not need to be set, except when using cross-domain/CDN Dojo builds. // Save dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl` // to the path on your domain your copy of blank.html. @@ -195,7 +195,7 @@ djConfig = { "groupEnd", "info", "profile", "profileEnd", "time", "timeEnd", "trace", "warn", "log" ]; - var i=0, tn; + var i = 0, tn; while((tn=cn[i++])){ if(!console[tn]){ (function(){ @@ -255,9 +255,13 @@ dojo.global = { debugAtAllCosts: false }; - if(typeof djConfig != "undefined"){ - for(var opt in djConfig){ - d.config[opt] = djConfig[opt]; + // FIXME: 2.0, drop djConfig support. Use dojoConfig exclusively for global config. + var cfg = typeof djConfig != "undefined" ? djConfig : + typeof dojoConfig != "undefined" ? dojoConfig : null; + + if(cfg){ + for(var c in cfg){ + d.config[c] = cfg[c]; } } @@ -269,7 +273,7 @@ dojo.global = { =====*/ dojo.locale = d.config.locale; - var rev = "$Rev: 22487 $".match(/\d+/); + var rev = "$Rev: 24595 $".match(/\d+/); /*===== dojo.version = function(){ @@ -293,7 +297,7 @@ dojo.global = { } =====*/ dojo.version = { - major: 1, minor: 5, patch: 0, flag: "", + major: 1, minor: 6, patch: 1, flag: "", revision: rev ? +rev[0] : NaN, toString: function(){ with(d.version){ @@ -369,7 +373,7 @@ dojo.global = { // | constructor: function(properties){ // | // property configuration: // | dojo.mixin(this, properties); - // | + // | // | console.log(this.quip); // | // ... // | }, @@ -390,7 +394,7 @@ dojo.global = { // | name: "Carl Brutanananadilewski" // | } // | ); - // | + // | // | // will print "Carl Brutanananadilewski" // | console.log(flattened.name); // | // will print "true" @@ -465,10 +469,7 @@ dojo.global = { // determine if an object supports a given method // description: // useful for longer api chains where you have to test each object in - // the chain. Useful only for object and method detection. - // Not useful for testing generic properties on an object. - // In particular, dojo.exists("foo.bar") when foo.bar = "" - // will return false. Use ("bar" in foo) to test for those cases. + // the chain. Useful for object and method detection. // name: // Path to an object, in the form "A.B.C". // obj: @@ -487,7 +488,7 @@ dojo.global = { // | // search from a particular scope // | dojo.exists("bar", foo); // true // | dojo.exists("bar.baz", foo); // false - return !!d.getObject(name, false, obj); // Boolean + return d.getObject(name, false, obj) !== undefined; // Boolean } dojo["eval"] = function(/*String*/ scriptFragment){ @@ -553,9 +554,8 @@ dojo.global = { * loader.js - A bootstrap module. Runs before the hostenv_*.js file. Contains * all of the package loading methods. */ - (function(){ - var d = dojo; + var d = dojo, currentModule; d.mixin(d, { _loadedModules: {}, @@ -587,11 +587,11 @@ dojo.global = { _loadedUrls: [], - //WARNING: + //WARNING: // This variable is referenced by packages outside of bootstrap: // FloatingPane.js and undo/browser.js _postLoad: false, - + //Egad! Lots of test files push on this directly instead of using dojo.addOnLoad. _loaders: [], _unloaders: [], @@ -610,21 +610,24 @@ dojo.global = { // not caught by us, so the caller will see it. We return a true // value if and only if the script is found. // - // relpath: + // relpath: // A relative path to a script (no leading '/', and typically ending // in '.js'). - // module: + // module: // A module whose existance to check for after loading a path. Can be // used to determine success or failure of the load. - // cb: + // cb: // a callback function to pass the result of evaluating the script var uri = ((relpath.charAt(0) == '/' || relpath.match(/^\w+:/)) ? "" : d.baseUrl) + relpath; try{ + currentModule = module; return !module ? d._loadUri(uri, cb) : d._loadUriAndCheck(uri, module, cb); // Boolean }catch(e){ console.error(e); return false; // Boolean + }finally{ + currentModule = null; } } @@ -637,7 +640,7 @@ dojo.global = { // it succeeded. Returns false if the URI reading failed. Throws if // the evaluation throws. // uri: a uri which points at the script to be loaded - // cb: + // cb: // a callback function to process the result of evaluating the script // as an expression, typically used by the resource bundle loader to // load JSON-style resources @@ -651,7 +654,8 @@ dojo.global = { d._loadedUrls[uri] = true; d._loadedUrls.push(uri); if(cb){ - contents = '('+contents+')'; + //conditional to support script-inject i18n bundle format + contents = /^define\(/.test(contents) ? contents : '('+contents+')'; }else{ //Only do the scoping if no callback. If a callback is specified, //it is most likely the i18n bundle stuff. @@ -663,16 +667,16 @@ dojo.global = { } // Check to see if we need to call _callLoaded() due to an addOnLoad() that arrived while we were busy downloading if(--d._inFlightCount == 0 && d._postLoad && d._loaders.length){ - // We shouldn't be allowed to get here but Firefox allows an event - // (mouse, keybd, async xhrGet) to interrupt a synchronous xhrGet. + // We shouldn't be allowed to get here but Firefox allows an event + // (mouse, keybd, async xhrGet) to interrupt a synchronous xhrGet. // If the current script block contains multiple require() statements, then after each // require() returns, inFlightCount == 0, but we want to hold the _callLoaded() until // all require()s are done since the out-of-sequence addOnLoad() presumably needs them all. // setTimeout allows the next require() to start (if needed), and then we check this again. - setTimeout(function(){ - // If inFlightCount > 0, then multiple require()s are running sequentially and + setTimeout(function(){ + // If inFlightCount > 0, then multiple require()s are running sequentially and // the next require() started after setTimeout() was executed but before we got here. - if(d._inFlightCount == 0){ + if(d._inFlightCount == 0){ d._callLoaded(); } }, 0); @@ -695,10 +699,10 @@ dojo.global = { dojo.loaded = function(){ // summary: // signal fired when initial environment and package loading is - // complete. You should use dojo.addOnLoad() instead of doing a + // complete. You should use dojo.addOnLoad() instead of doing a // direct dojo.connect() to this method in order to handle // initialization tasks that require the environment to be - // initialized. In a browser host, declarative widgets will + // initialized. In a browser host, declarative widgets will // be constructed when this function finishes runing. d._loadNotifying = true; d._postLoad = true; @@ -725,8 +729,8 @@ dojo.global = { dojo.unloaded = function(){ // summary: // signal fired by impending environment destruction. You should use - // dojo.addOnUnload() instead of doing a direct dojo.connect() to this - // method to perform page/application cleanup methods. See + // dojo.addOnUnload() instead of doing a direct dojo.connect() to this + // method to perform page/application cleanup methods. See // dojo.addOnUnload for more info. var mll = d._unloaders; while(mll.length){ @@ -745,13 +749,13 @@ dojo.global = { dojo.ready = dojo.addOnLoad = function(/*Object*/obj, /*String|Function?*/functionName){ // summary: - // Registers a function to be triggered after the DOM and dojo.require() calls + // Registers a function to be triggered after the DOM and dojo.require() calls // have finished loading. // // description: // Registers a function to be triggered after the DOM has finished - // loading and `dojo.require` modules have loaded. Widgets declared in markup - // have been instantiated if `djConfig.parseOnLoad` is true when this fires. + // loading and `dojo.require` modules have loaded. Widgets declared in markup + // have been instantiated if `djConfig.parseOnLoad` is true when this fires. // // Images and CSS files may or may not have finished downloading when // the specified function is called. (Note that widgets' CSS and HTML @@ -794,7 +798,7 @@ dojo.global = { dojo._modulesLoaded = function(){ if(d._postLoad){ return; } - if(d._inFlightCount > 0){ + if(d._inFlightCount > 0){ console.warn("files still in flight!"); return; } @@ -826,8 +830,8 @@ dojo.global = { var syms = modulename.split("."); for(var i = syms.length; i>0; i--){ var parentModule = syms.slice(0, i).join("."); - if(i == 1 && !d._moduleHasPrefix(parentModule)){ - // Support default module directory (sibling of dojo) for top-level modules + if(i == 1 && !d._moduleHasPrefix(parentModule)){ + // Support default module directory (sibling of dojo) for top-level modules syms[0] = "../" + syms[0]; }else{ var parentModulePath = d._getModulePrefix(parentModule); @@ -862,87 +866,95 @@ dojo.global = { dojo._loadModule = dojo.require = function(/*String*/moduleName, /*Boolean?*/omitModuleCheck){ // summary: // loads a Javascript module from the appropriate URI - // moduleName: + // + // moduleName: String // module name to load, using periods for separators, // e.g. "dojo.date.locale". Module paths are de-referenced by dojo's // internal mapping of locations to names and are disambiguated by // longest prefix. See `dojo.registerModulePath()` for details on // registering new modules. - // omitModuleCheck: + // + // omitModuleCheck: Boolean? // if `true`, omitModuleCheck skips the step of ensuring that the // loaded file actually defines the symbol it is referenced by. // For example if it called as `dojo.require("a.b.c")` and the // file located at `a/b/c.js` does not define an object `a.b.c`, // and exception will be throws whereas no exception is raised // when called as `dojo.require("a.b.c", true)` + // // description: // Modules are loaded via dojo.require by using one of two loaders: the normal loader // and the xdomain loader. The xdomain loader is used when dojo was built with a // custom build that specified loader=xdomain and the module lives on a modulePath // that is a whole URL, with protocol and a domain. The versions of Dojo that are on // the Google and AOL CDNs use the xdomain loader. - // + // // If the module is loaded via the xdomain loader, it is an asynchronous load, since // the module is added via a dynamically created script tag. This - // means that dojo.require() can return before the module has loaded. However, this + // means that dojo.require() can return before the module has loaded. However, this // should only happen in the case where you do dojo.require calls in the top-level // HTML page, or if you purposely avoid the loader checking for dojo.require // dependencies in your module by using a syntax like dojo["require"] to load the module. - // + // // Sometimes it is useful to not have the loader detect the dojo.require calls in the // module so that you can dynamically load the modules as a result of an action on the // page, instead of right at module load time. - // + // // Also, for script blocks in an HTML page, the loader does not pre-process them, so // it does not know to download the modules before the dojo.require calls occur. - // + // // So, in those two cases, when you want on-the-fly module loading or for script blocks // in the HTML page, special care must be taken if the dojo.required code is loaded // asynchronously. To make sure you can execute code that depends on the dojo.required // modules, be sure to add the code that depends on the modules in a dojo.addOnLoad() // callback. dojo.addOnLoad waits for all outstanding modules to finish loading before - // executing. Example: - // - // | <script type="text/javascript"> - // | dojo.require("foo"); - // | dojo.require("bar"); - // | dojo.addOnLoad(function(){ - // | //you can now safely do something with foo and bar - // | }); - // | </script> - // + // executing. + // // This type of syntax works with both xdomain and normal loaders, so it is good // practice to always use this idiom for on-the-fly code loading and in HTML script // blocks. If at some point you change loaders and where the code is loaded from, // it will all still work. - // + // // More on how dojo.require // `dojo.require("A.B")` first checks to see if symbol A.B is // defined. If it is, it is simply returned (nothing to do). - // + // // If it is not defined, it will look for `A/B.js` in the script root // directory. - // - // `dojo.require` throws an excpetion if it cannot find a file + // + // `dojo.require` throws an exception if it cannot find a file // to load, or if the symbol `A.B` is not defined after loading. - // + // // It returns the object `A.B`, but note the caveats above about on-the-fly loading and // HTML script blocks when the xdomain loader is loading a module. - // + // // `dojo.require()` does nothing about importing symbols into // the current namespace. It is presumed that the caller will - // take care of that. For example, to import all symbols into a - // local block, you might write: - // + // take care of that. + // + // example: + // To use dojo.require in conjunction with dojo.ready: + // + // | dojo.require("foo"); + // | dojo.require("bar"); + // | dojo.addOnLoad(function(){ + // | //you can now safely do something with foo and bar + // | }); + // + // example: + // For example, to import all symbols into a local block, you might write: + // // | with (dojo.require("A.B")) { // | ... // | } - // + // // And to import just the leaf symbol to a local variable: - // + // // | var B = dojo.require("A.B"); // | ... - // returns: the required namespace object + // + // returns: + // the required namespace object omitModuleCheck = d._global_omit_module_check || omitModuleCheck; //Check if it is already loaded. @@ -953,10 +965,8 @@ dojo.global = { // convert periods to slashes var relpath = d._getModuleSymbols(moduleName).join("/") + '.js'; - var modArg = !omitModuleCheck ? moduleName : null; var ok = d._loadPath(relpath, modArg); - if(!ok && !omitModuleCheck){ throw new Error("Could not load '" + moduleName + "'; last tried '" + relpath + "'"); } @@ -967,7 +977,7 @@ dojo.global = { // pass in false so we can give better error module = d._loadedModules[moduleName]; if(!module){ - throw new Error("symbol '" + moduleName + "' is not defined after loading '" + relpath + "'"); + throw new Error("symbol '" + moduleName + "' is not defined after loading '" + relpath + "'"); } } @@ -988,14 +998,14 @@ dojo.global = { // the file name. For example, `js/dojo/foo.js` must have // `dojo.provide("dojo.foo");` before any calls to // `dojo.require()` are made. - // + // // For backwards compatibility reasons, in addition to registering // the resource, `dojo.provide()` also ensures that the javascript // object for the module exists. For example, // `dojo.provide("dojox.data.FlickrStore")`, in addition to // registering that `FlickrStore.js` is a resource for the // `dojox.data` module, will ensure that the `dojox.data` - // javascript object exists, so that calls like + // javascript object exists, so that calls like // `dojo.data.foo = function(){ ... }` don't fail. // // In the case of a build where multiple javascript source files @@ -1004,11 +1014,11 @@ dojo.global = { // note that it includes multiple resources. // // resourceName: String - // A dot-sperated string identifying a resource. + // A dot-sperated string identifying a resource. // // example: // Safely create a `my` object, and make dojo.require("my.CustomModule") work - // | dojo.provide("my.CustomModule"); + // | dojo.provide("my.CustomModule"); //Make sure we have a string. resourceName = resourceName + ""; @@ -1065,7 +1075,7 @@ dojo.global = { if(condition === true){ // FIXME: why do we support chained require()'s here? does the build system? var args = []; - for(var i = 1; i < arguments.length; i++){ + for(var i = 1; i < arguments.length; i++){ args.push(arguments[i]); } d.require.apply(d, args); @@ -1075,13 +1085,13 @@ dojo.global = { dojo.requireAfterIf = d.requireIf; dojo.registerModulePath = function(/*String*/module, /*String*/prefix){ - // summary: + // summary: // Maps a module name to a path - // description: + // description: // An unregistered module is given the default path of ../[module], // relative to Dojo root. For example, module acme is mapped to // ../acme. If you want to use a different module name, use - // dojo.registerModulePath. + // dojo.registerModulePath. // example: // If your dojo.js is located at this location in the web root: // | /myapp/js/dojo/dojo/dojo.js @@ -1094,7 +1104,7 @@ dojo.global = { // At which point you can then use dojo.require() to load the // modules (assuming they provide() the same things which are // required). The full code might be: - // | <script type="text/javascript" + // | <script type="text/javascript" // | src="/myapp/js/dojo/dojo/dojo.js"></script> // | <script type="text/javascript"> // | dojo.registerModulePath("foo", "../../foo"); @@ -1103,8 +1113,8 @@ dojo.global = { // | dojo.require("foo.thud.xyzzy"); // | </script> d._modulePrefixes[module] = { name: module, value: prefix }; - } - + }; + dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){ // summary: // Declares translated resources and loads them if necessary, in the @@ -1115,7 +1125,7 @@ dojo.global = { // description: // Load translated resource bundles provided underneath the "nls" // directory within a package. Translated resources may be located in - // different packages throughout the source tree. + // different packages throughout the source tree. // // Each directory is named for a locale as specified by RFC 3066, // (http://www.ietf.org/rfc/rfc3066.txt), normalized in lowercase. @@ -1130,21 +1140,21 @@ dojo.global = { // preload the bundles to avoid data redundancy and the multiple // network hits normally required to load these resources. // - // moduleName: + // moduleName: // name of the package containing the "nls" directory in which the // bundle is found // - // bundleName: + // bundleName: // bundle name, i.e. the filename without the '.js' suffix. Using "nls" as a // a bundle name is not supported, since "nls" is the name of the folder // that holds bundles. Using "nls" as the bundle name will cause problems // with the custom build. // - // locale: + // locale: // the locale to load (optional) By default, the browser's user // locale as defined by dojo.locale // - // availableFlatLocales: + // availableFlatLocales: // A comma-separated list of the available, flattened locales for this // bundle. This argument should only be set by the build process. // @@ -1186,11 +1196,11 @@ dojo.global = { ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"); dojo._Url = function(/*dojo._Url|String...*/){ - // summary: + // summary: // Constructor to create an object representing a URL. // It is marked as private, since we might consider removing // or simplifying it. - // description: + // description: // Each argument is evaluated in order relative to the next until // a canonical uri is produced. To get an absolute Uri relative to // the current document use: @@ -1257,7 +1267,7 @@ dojo.global = { } uri = []; - if(relobj.scheme){ + if(relobj.scheme){ uri.push(relobj.scheme, ":"); } if(relobj.authority){ @@ -1297,7 +1307,7 @@ dojo.global = { dojo._Url.prototype.toString = function(){ return this.uri; }; dojo.moduleUrl = function(/*String*/module, /*dojo._Url||String*/url){ - // summary: + // summary: // Returns a `dojo._Url` object relative to a module. // example: // | var pngPath = dojo.moduleUrl("acme","images/small.png"); @@ -1305,10 +1315,10 @@ dojo.global = { // | // create an image and set it's source to pngPath's value: // | var img = document.createElement("img"); // | // NOTE: we assign the string representation of the url object - // | img.src = pngPath.toString(); + // | img.src = pngPath.toString(); // | // add our image to the document // | dojo.body().appendChild(img); - // example: + // example: // you may de-reference as far as you like down the package // hierarchy. This is sometimes handy to avoid lenghty relative // urls or for building portable sub-packages. In this example, @@ -1319,9 +1329,9 @@ dojo.global = { // | // somewhere in a configuration block // | dojo.registerModulePath("acme.widget", "../../acme/widget"); // | dojo.registerModulePath("acme.util", "../../util"); - // | + // | // | // ... - // | + // | // | // code in a module using acme resources // | var tmpltPath = dojo.moduleUrl("acme.widget","templates/template.html"); // | var dataPath = dojo.moduleUrl("acme.util","resources/data.json"); @@ -1340,7 +1350,10 @@ dojo.global = { } return new d._Url(loc, url); // dojo._Url - } + }; + + + })(); /*===== @@ -1364,9 +1377,9 @@ dojo.isIE = { dojo.isSafari = { // example: // | if(dojo.isSafari){ ... } - // example: + // example: // Detect iPhone: - // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){ + // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){ // | // we are iPhone. Note, iPod touch reports "iPod" above and fails this test. // | } }; @@ -1409,7 +1422,6 @@ dojo = { // True if the client runs on Mac } =====*/ - if(typeof window != 'undefined'){ dojo.isBrowser = true; dojo._name = "browser"; @@ -1436,7 +1448,7 @@ if(typeof window != 'undefined'){ d.config.baseUrl = src.substring(0, m.index); } // and find out if we need to modify our behavior - var cfg = scripts[i].getAttribute("djConfig"); + var cfg = (scripts[i].getAttribute("djConfig") || scripts[i].getAttribute("data-dojo-config")); if(cfg){ var cfgo = eval("({ "+cfg+" })"); for(var x in cfgo){ @@ -1510,7 +1522,7 @@ if(typeof window != 'undefined'){ d._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0']; d._xhrObj = function(){ - // summary: + // summary: // does the work of portably generating a new XMLHTTPRequest object. var http, last_e; if(!dojo.isIE || !dojo.config.ieForceActiveXXhr){ @@ -1543,10 +1555,11 @@ if(typeof window != 'undefined'){ var stat = http.status || 0, lp = location.protocol; return (stat >= 200 && stat < 300) || // Boolean - stat == 304 || // allow any 2XX response code - stat == 1223 || // get it out of the cache + stat == 304 || // allow any 2XX response code + stat == 1223 || // get it out of the cache + // Internet Explorer mangled the status code // Internet Explorer mangled the status code OR we're Titanium/browser chrome/chrome extension requesting a local file - (!stat && (lp == "file:" || lp == "chrome:" || lp == "chrome-extension:" || lp == "app:") ); + (!stat && (lp == "file:" || lp == "chrome:" || lp == "chrome-extension:" || lp == "app:")); } //See if base tag is in use. @@ -1641,7 +1654,7 @@ if(typeof window != 'undefined'){ d.addOnWindowUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){ // summary: // registers a function to be triggered when window.onunload - // fires. + // fires. // description: // The first time that addOnWindowUnload is called Dojo // will register a page listener to trigger your unload @@ -1672,7 +1685,7 @@ if(typeof window != 'undefined'){ // description: // The first time that addOnUnload is called Dojo will // register a page listener to trigger your unload handler - // with. + // with. // // In a browser enviroment, the functions will be triggered // during the window.onbeforeunload event. Be careful of doing @@ -1685,7 +1698,7 @@ if(typeof window != 'undefined'){ // // Further note that calling dojo.addOnUnload will prevent // browsers from using a "fast back" cache to make page - // loading via back button instantaneous. + // loading via back button instantaneous. // example: // | dojo.addOnUnload(functionPointer) // | dojo.addOnUnload(object, "functionName") @@ -1722,7 +1735,7 @@ if(typeof window != 'undefined'){ } } - if(!dojo.config.afterOnLoad){ + if(!dojo.config.afterOnLoad){ if(document.addEventListener){ //Standards. Hooray! Assumption here that if standards based, //it knows about DOMContentLoaded. It is OK if it does not, the fall through @@ -1739,10 +1752,10 @@ if(typeof window != 'undefined'){ if(!dojo.config.skipIeDomLoaded && self === self.top){ dojo._scrollIntervalId = setInterval(function (){ try{ - //When dojo is loaded into an iframe in an IE HTML Application + //When dojo is loaded into an iframe in an IE HTML Application //(HTA), such as in a selenium test, javascript in the iframe //can't see anything outside of it, so self===self.top is true, - //but the iframe is not the top window and doScroll will be + //but the iframe is not the top window and doScroll will be //available before document.body is set. Test document.body //before trying the doScroll trick if(document.body){ @@ -1805,16 +1818,20 @@ if(dojo.config.isDebug){ } if(dojo.config.debugAtAllCosts){ - dojo.config.useXDomain = true; - dojo.require("dojo._base._loader.loader_xd"); + // this breaks the new AMD based module loader. The XDomain won't be necessary + // anyway if you switch to the asynchronous loader + //dojo.config.useXDomain = true; + //dojo.require("dojo._base._loader.loader_xd"); dojo.require("dojo._base._loader.loader_debug"); dojo.require("dojo.i18n"); } + if(!dojo._hasResource["dojo._base.lang"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. dojo._hasResource["dojo._base.lang"] = true; dojo.provide("dojo._base.lang"); + (function(){ var d = dojo, opts = Object.prototype.toString; @@ -1824,14 +1841,14 @@ dojo.provide("dojo._base.lang"); // summary: // Return true if it is a String return (typeof it == "string" || it instanceof String); // Boolean - } + }; dojo.isArray = function(/*anything*/ it){ // summary: // Return true if it is an Array. // Does not work on Arrays created in other windows. return it && (it instanceof Array || typeof it == "array"); // Boolean - } + }; dojo.isFunction = function(/*anything*/ it){ // summary: @@ -1845,7 +1862,7 @@ dojo.provide("dojo._base.lang"); // or null) return it !== undefined && (it === null || typeof it == "object" || d.isArray(it) || d.isFunction(it)); // Boolean - } + }; dojo.isArrayLike = function(/*anything*/ it){ // summary: @@ -1864,14 +1881,14 @@ dojo.provide("dojo._base.lang"); !d.isString(it) && !d.isFunction(it) && !(it.tagName && it.tagName.toLowerCase() == 'form') && (d.isArray(it) || isFinite(it.length)); - } + }; dojo.isAlien = function(/*anything*/ it){ // summary: // Returns true if it is a built-in function or some other kind of // oddball that *should* report as a function but doesn't return it && !d.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean - } + }; dojo.extend = function(/*Object*/ constructor, /*Object...*/ props){ // summary: @@ -1882,7 +1899,7 @@ dojo.provide("dojo._base.lang"); d._mixin(constructor.prototype, arguments[i]); } return constructor; // Object - } + }; dojo._hitchArgs = function(scope, method /*,...*/){ var pre = d._toArray(arguments, 2); @@ -1894,8 +1911,8 @@ dojo.provide("dojo._base.lang"); var f = named ? (scope||d.global)[method] : method; // invoke with collected args return f && f.apply(scope || this, pre.concat(args)); // mixed - } // Function - } + }; // Function + }; dojo.hitch = function(/*Object*/scope, /*Function|String*/method /*,...*/){ // summary: @@ -1903,7 +1920,7 @@ dojo.provide("dojo._base.lang"); // This allows for easy use of object member functions // in callbacks and other places in which the "this" keyword may // otherwise not reference the expected scope. - // Any number of default positional arguments may be passed as parameters + // Any number of default positional arguments may be passed as parameters // beyond "method". // Each of these values will be used to "placehold" (similar to curry) // for the hitched function. @@ -1943,7 +1960,7 @@ dojo.provide("dojo._base.lang"); return function(){ return scope[method].apply(scope, arguments || []); }; // Function } return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function - } + }; /*===== dojo.delegate = function(obj, props){ @@ -1987,7 +2004,7 @@ dojo.provide("dojo._base.lang"); d._mixin(tmp, props); } return tmp; // Object - } + }; })(); /*===== @@ -2036,7 +2053,7 @@ dojo.provide("dojo._base.lang"); // | dojo.hitch(null, funcName, ...); var arr = [ null ]; return d.hitch.apply(d, arr.concat(d._toArray(arguments))); // Function - } + }; var extraNames = d._extraNames, extraLen = extraNames.length, empty = {}; @@ -2056,6 +2073,10 @@ dojo.provide("dojo._base.lang"); // Date return new Date(o.getTime()); // Date } + if(o instanceof RegExp){ + // RegExp + return new RegExp(o); // RegExp + } var r, i, l, s, name; if(d.isArray(o)){ // array @@ -2094,7 +2115,7 @@ dojo.provide("dojo._base.lang"); } } return r; // Object - } + }; /*===== dojo.trim = function(str){ @@ -2123,7 +2144,7 @@ dojo.provide("dojo._base.lang"); dojo.replace = function(tmpl, map, pattern){ // summary: // Performs parameterized substitutions on a string. Throws an - // exception if any parameter is unmatched. + // exception if any parameter is unmatched. // tmpl: String // String to be used as a template. // map: Object|Function @@ -2199,13 +2220,14 @@ dojo.provide("dojo._base.lang"); if(!dojo._hasResource["dojo._base.array"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. dojo._hasResource["dojo._base.array"] = true; - dojo.provide("dojo._base.array"); + + (function(){ var _getParts = function(arr, obj, cb){ - return [ - (typeof arr == "string") ? arr.split("") : arr, + return [ + (typeof arr == "string") ? arr.split("") : arr, obj || dojo.global, // FIXME: cache the anonymous functions we create here? (typeof cb == "string") ? new Function("item", "index", "array", cb) : cb @@ -2224,7 +2246,7 @@ dojo.provide("dojo._base.array"); }; dojo.mixin(dojo, { - indexOf: function( /*Array*/ array, + indexOf: function( /*Array*/ array, /*Object*/ value, /*Integer?*/ fromIndex, /*Boolean?*/ findLast){ @@ -2233,7 +2255,7 @@ dojo.provide("dojo._base.array"); // passed array. If the value is not found, -1 is returned. // description: // This method corresponds to the JavaScript 1.6 Array.indexOf method, with one difference: when - // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript + // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript // 1.6's indexOf skips the holes in the sparse array. // For details on this method, see: // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf @@ -2258,7 +2280,7 @@ dojo.provide("dojo._base.array"); // array. If the value is not found, -1 is returned. // description: // This method corresponds to the JavaScript 1.6 Array.lastIndexOf method, with one difference: when - // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript + // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript // 1.6's lastIndexOf skips the holes in the sparse array. // For details on this method, see: // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/lastIndexOf @@ -2277,7 +2299,7 @@ dojo.provide("dojo._base.array"); // thisObject: // may be used to scope the call to callback // description: - // This function corresponds to the JavaScript 1.6 Array.forEach() method, with one difference: when + // This function corresponds to the JavaScript 1.6 Array.forEach() method, with one difference: when // run over sparse arrays, this implemenation passes the "holes" in the sparse array to // the callback function with a value of undefined. JavaScript 1.6's forEach skips the holes in the sparse array. // For more details, see: @@ -2300,21 +2322,21 @@ dojo.provide("dojo._base.array"); // | ); // example: // | // use a scoped object member as the callback - // | + // | // | var obj = { - // | prefix: "logged via obj.callback:", + // | prefix: "logged via obj.callback:", // | callback: function(item){ // | console.log(this.prefix, item); // | } // | }; - // | + // | // | // specifying the scope function executes the callback in that scope // | dojo.forEach( // | [ "thinger", "blah", "howdy", 10 ], // | obj.callback, // | obj // | ); - // | + // | // | // alternately, we can accomplish the same thing with dojo.hitch() // | dojo.forEach( // | [ "thinger", "blah", "howdy", 10 ], @@ -2327,7 +2349,7 @@ dojo.provide("dojo._base.array"); // FIXME: there are several ways of handilng thisObject. Is // dojo.global always the default context? var _p = _getParts(arr, thisObject, callback); arr = _p[0]; - for(var i=0,l=arr.length; i<l; ++i){ + for(var i=0,l=arr.length; i<l; ++i){ _p[2].call(_p[1], arr[i], i, arr); } }, @@ -2344,7 +2366,7 @@ dojo.provide("dojo._base.array"); // thisObject: // may be used to scope the call to callback // description: - // This function corresponds to the JavaScript 1.6 Array.every() method, with one difference: when + // This function corresponds to the JavaScript 1.6 Array.every() method, with one difference: when // run over sparse arrays, this implemenation passes the "holes" in the sparse array to // the callback function with a value of undefined. JavaScript 1.6's every skips the holes in the sparse array. // For more details, see: @@ -2353,7 +2375,7 @@ dojo.provide("dojo._base.array"); // | // returns false // | dojo.every([1, 2, 3, 4], function(item){ return item>1; }); // example: - // | // returns true + // | // returns true // | dojo.every([1, 2, 3, 4], function(item){ return item>0; }); return everyOrSome(true, arr, callback, thisObject); // Boolean }, @@ -2370,7 +2392,7 @@ dojo.provide("dojo._base.array"); // thisObject: // may be used to scope the call to callback // description: - // This function corresponds to the JavaScript 1.6 Array.some() method, with one difference: when + // This function corresponds to the JavaScript 1.6 Array.some() method, with one difference: when // run over sparse arrays, this implemenation passes the "holes" in the sparse array to // the callback function with a value of undefined. JavaScript 1.6's some skips the holes in the sparse array. // For more details, see: @@ -2397,7 +2419,7 @@ dojo.provide("dojo._base.array"); // thisObject: // may be used to scope the call to callback // description: - // This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when + // This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when // run over sparse arrays, this implemenation passes the "holes" in the sparse array to // the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array. // For more details, see: @@ -2428,9 +2450,9 @@ dojo.provide("dojo._base.array"); // thisObject: // may be used to scope the call to callback // description: - // This function corresponds to the JavaScript 1.6 Array.filter() method, with one difference: when + // This function corresponds to the JavaScript 1.6 Array.filter() method, with one difference: when // run over sparse arrays, this implemenation passes the "holes" in the sparse array to - // the callback function with a value of undefined. JavaScript 1.6's filter skips the holes in the sparse array. + // the callback function with a value of undefined. JavaScript 1.6's filter skips the holes in the sparse array. // For more details, see: // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter // example: @@ -2464,10 +2486,10 @@ dojo.provide("dojo._base.declare"); var d = dojo, mix = d._mixin, op = Object.prototype, opts = op.toString, xtor = new Function, counter = 0, cname = "constructor"; - function err(msg){ throw new Error("declare: " + msg); } + function err(msg, cls){ throw new Error("declare" + (cls ? " " + cls : "") + ": " + msg); } // C3 Method Resolution Order (see http://www.python.org/download/releases/2.3/mro/) - function c3mro(bases){ + function c3mro(bases, className){ var result = [], roots = [{cls: 0, refs: []}], nameMap = {}, clsCount = 1, l = bases.length, i = 0, j, lin, base, top, proto, rec, name, refs; @@ -2475,9 +2497,9 @@ dojo.provide("dojo._base.declare"); for(; i < l; ++i){ base = bases[i]; if(!base){ - err("mixin #" + i + " is unknown. Did you use dojo.require to pull it in?"); + err("mixin #" + i + " is unknown. Did you use dojo.require to pull it in?", className); }else if(opts.call(base) != "[object Function]"){ - err("mixin #" + i + " is not a callable constructor."); + err("mixin #" + i + " is not a callable constructor.", className); } lin = base._meta ? base._meta.bases : [base]; top = 0; @@ -2530,7 +2552,7 @@ dojo.provide("dojo._base.declare"); } } if(clsCount){ - err("can't build consistent linearization"); + err("can't build consistent linearization", className); } // calculate the superclass offset @@ -2557,7 +2579,7 @@ dojo.provide("dojo._base.declare"); caller = args.callee; name = name || caller.nom; if(!name){ - err("can't deduce a name to call inherited()"); + err("can't deduce a name to call inherited()", this.declaredClass); } meta = this.constructor._meta; @@ -2575,7 +2597,7 @@ dojo.provide("dojo._base.declare"); // error detection chains = meta.chains; if(chains && typeof chains[name] == "string"){ - err("calling chained method with inherited: " + name); + err("calling chained method with inherited: " + name, this.declaredClass); } // find caller do{ @@ -2616,7 +2638,7 @@ dojo.provide("dojo._base.declare"); // error detection chains = meta.chains; if(!chains || chains.constructor !== "manual"){ - err("calling chained constructor with inherited"); + err("calling chained constructor with inherited", this.declaredClass); } // find caller while(base = bases[++pos]){ // intentional assignment @@ -2912,7 +2934,7 @@ dojo.provide("dojo._base.declare"); // build a prototype if(opts.call(superclass) == "[object Array]"){ // C3 MRO - bases = c3mro(superclass); + bases = c3mro(superclass, className); t = bases[0]; mixins = bases.length - t; superclass = bases[mixins]; @@ -2923,10 +2945,10 @@ dojo.provide("dojo._base.declare"); t = superclass._meta; bases = bases.concat(t ? t.bases : superclass); }else{ - err("base class is not a callable constructor."); + err("base class is not a callable constructor.", className); } }else if(superclass !== null){ - err("unknown base class. Did you use dojo.require to pull it in?") + err("unknown base class. Did you use dojo.require to pull it in?", className); } } if(superclass){ @@ -3500,27 +3522,28 @@ dojo._hasResource["dojo._base.connect"] = true; dojo.provide("dojo._base.connect"); + // this file courtesy of the TurboAjax Group, licensed under a Dojo CLA // low-level delegation machinery dojo._listener = { // create a dispatcher function getDispatcher: function(){ - // following comments pulled out-of-line to prevent cloning them + // following comments pulled out-of-line to prevent cloning them // in the returned function. - // - indices (i) that are really in the array of listeners (ls) will + // - indices (i) that are really in the array of listeners (ls) will // not be in Array.prototype. This is the 'sparse array' trick - // that keeps us safe from libs that take liberties with built-in + // that keeps us safe from libs that take liberties with built-in // objects // - listener is invoked with current scope (this) return function(){ - var ap=Array.prototype, c=arguments.callee, ls=c._listeners, t=c.target; + var ap = Array.prototype, c = arguments.callee, ls = c._listeners, t = c.target, // return value comes from original target function - var r = t && t.apply(this, arguments); + r = t && t.apply(this, arguments), // make local copy of listener array so it is immutable during processing - var i, lls; - lls = [].concat(ls); - + i, lls = [].concat(ls) + ; + // invoke listeners after target function for(i in lls){ if(!(i in ap)){ @@ -3534,12 +3557,12 @@ dojo._listener = { // add a listener to an object add: function(/*Object*/ source, /*String*/ method, /*Function*/ listener){ // Whenever 'method' is invoked, 'listener' will have the same scope. - // Trying to supporting a context object for the listener led to - // complexity. + // Trying to supporting a context object for the listener led to + // complexity. // Non trivial to provide 'once' functionality here // because listener could be the result of a dojo.hitch call, // in which case two references to the same hitch target would not - // be equivalent. + // be equivalent. source = source || dojo.global; // The source method is either null, a dispatcher, or some other function var f = source[method]; @@ -3549,15 +3572,15 @@ dojo._listener = { // original target function is special d.target = f; // dispatcher holds a list of listeners - d._listeners = []; + d._listeners = []; // redirect source to dispatcher f = source[method] = d; } - // The contract is that a handle is returned that can - // identify this listener for disconnect. + // The contract is that a handle is returned that can + // identify this listener for disconnect. // - // The type of the handle is private. Here is it implemented as Integer. - // DOM event code has this same contract but handle is Function + // The type of the handle is private. Here is it implemented as Integer. + // DOM event code has this same contract but handle is Function // in non-IE browsers. // // We could have separate lists of before and after listeners. @@ -3579,9 +3602,9 @@ dojo._listener = { // and dontFix argument here to help the autodocs. Actual DOM aware code is in // event.js. -dojo.connect = function(/*Object|null*/ obj, - /*String*/ event, - /*Object|null*/ context, +dojo.connect = function(/*Object|null*/ obj, + /*String*/ event, + /*Object|null*/ context, /*String|Function*/ method, /*Boolean?*/ dontFix){ // summary: @@ -3616,37 +3639,37 @@ dojo.connect = function(/*Object|null*/ obj, // arguments may simply be omitted such that fewer than 4 arguments // may be required to set up a connection See the examples for details. // - // The return value is a handle that is needed to + // The return value is a handle that is needed to // remove this connection with `dojo.disconnect`. // - // obj: - // The source object for the event function. + // obj: + // The source object for the event function. // Defaults to `dojo.global` if null. - // If obj is a DOM node, the connection is delegated + // If obj is a DOM node, the connection is delegated // to the DOM event manager (unless dontFix is true). // // event: - // String name of the event function in obj. + // String name of the event function in obj. // I.e. identifies a property `obj[event]`. // - // context: + // context: // The object that method will receive as "this". // // If context is null and method is a function, then method // inherits the context of event. - // - // If method is a string then context must be the source + // + // If method is a string then context must be the source // object object for method (context[method]). If context is null, // dojo.global is used. // // method: - // A function reference, or name of a function in context. - // The function identified by method fires after event does. + // A function reference, or name of a function in context. + // The function identified by method fires after event does. // method receives the same arguments as the event. // See context argument comments for information on method's scope. // // dontFix: - // If obj is a DOM node, set dontFix to true to prevent delegation + // If obj is a DOM node, set dontFix to true to prevent delegation // of this connection to the DOM event manager. // // example: @@ -3696,9 +3719,9 @@ dojo.connect = function(/*Object|null*/ obj, // used by non-browser hostenvs. always overriden by event.js dojo._connect = function(obj, event, context, method){ - var l=dojo._listener, h=l.add(obj, event, dojo.hitch(context, method)); + var l=dojo._listener, h=l.add(obj, event, dojo.hitch(context, method)); return [obj, event, h, l]; // Handle -} +}; dojo.disconnect = function(/*Handle*/ handle){ // summary: @@ -3712,11 +3735,11 @@ dojo.disconnect = function(/*Handle*/ handle){ // let's not keep this reference delete handle[0]; } -} +}; dojo._disconnect = function(obj, event, handle, listener){ listener.remove(obj, event, handle); -} +}; // topic publish/subscribe @@ -3734,15 +3757,15 @@ dojo.subscribe = function(/*String*/ topic, /*Object|null*/ context, /*String|Fu // is invoked when topic is published. // example: // | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); }); - // | dojo.publish("alerts", [ "read this", "hello world" ]); + // | dojo.publish("alerts", [ "read this", "hello world" ]); // support for 2 argument invocation (omitting context) depends on hitch return [topic, dojo._listener.add(dojo._topics, topic, dojo.hitch(context, method))]; /*Handle*/ -} +}; dojo.unsubscribe = function(/*Handle*/ handle){ // summary: - // Remove a topic listener. + // Remove a topic listener. // handle: // The handle returned from a call to subscribe. // example: @@ -3752,7 +3775,7 @@ dojo.unsubscribe = function(/*Handle*/ handle){ if(handle){ dojo._listener.remove(dojo._topics, handle[0], handle[1]); } -} +}; dojo.publish = function(/*String*/ topic, /*Array*/ args){ // summary: @@ -3760,11 +3783,11 @@ dojo.publish = function(/*String*/ topic, /*Array*/ args){ // topic: // The name of the topic to publish. // args: - // An array of arguments. The arguments will be applied + // An array of arguments. The arguments will be applied // to each topic subscriber (as first class parameters, via apply). // example: // | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); }; - // | dojo.publish("alerts", [ "read this", "hello world" ]); + // | dojo.publish("alerts", [ "read this", "hello world" ]); // Note that args is an array, which is more efficient vs variable length // argument list. Ideally, var args would be implemented via Array @@ -3773,10 +3796,10 @@ dojo.publish = function(/*String*/ topic, /*Array*/ args){ if(f){ f.apply(this, args||[]); } -} +}; -dojo.connectPublisher = function( /*String*/ topic, - /*Object|null*/ obj, +dojo.connectPublisher = function( /*String*/ topic, + /*Object|null*/ obj, /*String*/ event){ // summary: // Ensure that every time obj.event() is called, a message is published @@ -3785,11 +3808,11 @@ dojo.connectPublisher = function( /*String*/ topic, // the topic. // topic: // The name of the topic to publish. - // obj: + // obj: // The source object for the event function. Defaults to dojo.global // if null. // event: - // The name of the event function in obj. + // The name of the event function in obj. // I.e. identifies a property obj[event]. // example: // | dojo.connectPublisher("/ajax/start", dojo, "xhrGet"); @@ -3804,42 +3827,43 @@ dojo._hasResource["dojo._base.Deferred"] = true; dojo.provide("dojo._base.Deferred"); + (function(){ - var mutator = function(){}; + var mutator = function(){}; var freeze = Object.freeze || function(){}; // A deferred provides an API for creating and resolving a promise. dojo.Deferred = function(/*Function?*/canceller){ // summary: // Deferreds provide a generic means for encapsulating an asynchronous - // operation and notifying users of the completion and result of the operation. + // operation and notifying users of the completion and result of the operation. // description: // The dojo.Deferred API is based on the concept of promises that provide a // generic interface into the eventual completion of an asynchronous action. - // The motivation for promises fundamentally is about creating a - // separation of concerns that allows one to achieve the same type of - // call patterns and logical data flow in asynchronous code as can be - // achieved in synchronous code. Promises allows one - // to be able to call a function purely with arguments needed for - // execution, without conflating the call with concerns of whether it is - // sync or async. One shouldn't need to alter a call's arguments if the - // implementation switches from sync to async (or vice versa). By having - // async functions return promises, the concerns of making the call are - // separated from the concerns of asynchronous interaction (which are + // The motivation for promises fundamentally is about creating a + // separation of concerns that allows one to achieve the same type of + // call patterns and logical data flow in asynchronous code as can be + // achieved in synchronous code. Promises allows one + // to be able to call a function purely with arguments needed for + // execution, without conflating the call with concerns of whether it is + // sync or async. One shouldn't need to alter a call's arguments if the + // implementation switches from sync to async (or vice versa). By having + // async functions return promises, the concerns of making the call are + // separated from the concerns of asynchronous interaction (which are // handled by the promise). - // - // The dojo.Deferred is a type of promise that provides methods for fulfilling the - // promise with a successful result or an error. The most important method for - // working with Dojo's promises is the then() method, which follows the + // + // The dojo.Deferred is a type of promise that provides methods for fulfilling the + // promise with a successful result or an error. The most important method for + // working with Dojo's promises is the then() method, which follows the // CommonJS proposed promise API. An example of using a Dojo promise: - // + // // | var resultingPromise = someAsyncOperation.then(function(result){ // | ... handle result ... // | }, // | function(error){ // | ... handle error ... // | }); - // - // The .then() call returns a new promise that represents the result of the + // + // The .then() call returns a new promise that represents the result of the // execution of the callback. The callbacks will never affect the original promises value. // // The dojo.Deferred instances also provide the following functions for backwards compatibility: @@ -3849,7 +3873,7 @@ dojo.provide("dojo._base.Deferred"); // * callback(result) // * errback(result) // - // Callbacks are allowed to return promisesthemselves, so + // Callbacks are allowed to return promises themselves, so // you can build complicated sequences of events with ease. // // The creator of the Deferred may specify a canceller. The canceller @@ -3909,7 +3933,7 @@ dojo.provide("dojo._base.Deferred"); // | renderDataitem(data[x]); // | } // | d.callback(true); - // | }catch(e){ + // | }catch(e){ // | d.errback(new Error("rendering failed")); // | } // | return d; @@ -3923,7 +3947,7 @@ dojo.provide("dojo._base.Deferred"); // | // again, so we could chain adding callbacks or save the // | // deferred for later should we need to be notified again. // example: - // In this example, renderLotsOfData is syncrhonous and so both + // In this example, renderLotsOfData is synchronous and so both // versions are pretty artificial. Putting the data display on a // timeout helps show why Deferreds rock: // @@ -3936,7 +3960,7 @@ dojo.provide("dojo._base.Deferred"); // | renderDataitem(data[x]); // | } // | d.callback(true); - // | }catch(e){ + // | }catch(e){ // | d.errback(new Error("rendering failed")); // | } // | }, 100); @@ -3951,11 +3975,11 @@ dojo.provide("dojo._base.Deferred"); // Note that the caller doesn't have to change his code at all to // handle the asynchronous case. var result, finished, isError, head, nextListener; - var promise = this.promise = {}; + var promise = (this.promise = {}); function complete(value){ if(finished){ - throw new Error("This deferred has already been resolved"); + throw new Error("This deferred has already been resolved"); } result = value; finished = true; @@ -3966,7 +3990,7 @@ dojo.provide("dojo._base.Deferred"); while(!mutated && nextListener){ var listener = nextListener; nextListener = nextListener.next; - if(mutated = (listener.progress == mutator)){ // assignment and check + if((mutated = (listener.progress == mutator))){ // assignment and check finished = false; } var func = (isError ? listener.error : listener.resolved); @@ -3978,6 +4002,9 @@ dojo.provide("dojo._base.Deferred"); continue; } var unchanged = mutated && newResult === undefined; + if(mutated && !unchanged){ + isError = newResult instanceof Error; + } listener.deferred[unchanged && isError ? "reject" : "resolve"](unchanged ? result : newResult); } catch (e) { @@ -3990,7 +4017,7 @@ dojo.provide("dojo._base.Deferred"); listener.deferred.resolve(result); } } - } + } } // calling resolve will resolve the promise this.resolve = this.callback = function(value){ @@ -4005,7 +4032,7 @@ dojo.provide("dojo._base.Deferred"); // calling error will indicate that the promise failed this.reject = this.errback = function(error){ // summary: - // Fulfills the Deferred instance as an error with the provided error + // Fulfills the Deferred instance as an error with the provided error isError = true; this.fired = 1; complete(error); @@ -4022,7 +4049,7 @@ dojo.provide("dojo._base.Deferred"); while(listener){ var progress = listener.progress; progress && progress(update); - listener = listener.next; + listener = listener.next; } }; this.addCallbacks = function(/*Function?*/callback, /*Function?*/errback){ @@ -4031,35 +4058,35 @@ dojo.provide("dojo._base.Deferred"); }; // provide the implementation of the promise this.then = promise.then = function(/*Function?*/resolvedCallback, /*Function?*/errorCallback, /*Function?*/progressCallback){ - // summary - // Adds a fulfilledHandler, errorHandler, and progressHandler to be called for - // completion of a promise. The fulfilledHandler is called when the promise - // is fulfilled. The errorHandler is called when a promise fails. The - // progressHandler is called for progress events. All arguments are optional - // and non-function values are ignored. The progressHandler is not only an - // optional argument, but progress events are purely optional. Promise + // summary: + // Adds a fulfilledHandler, errorHandler, and progressHandler to be called for + // completion of a promise. The fulfilledHandler is called when the promise + // is fulfilled. The errorHandler is called when a promise fails. The + // progressHandler is called for progress events. All arguments are optional + // and non-function values are ignored. The progressHandler is not only an + // optional argument, but progress events are purely optional. Promise // providers are not required to ever create progress events. - // - // This function will return a new promise that is fulfilled when the given - // fulfilledHandler or errorHandler callback is finished. This allows promise - // operations to be chained together. The value returned from the callback - // handler is the fulfillment value for the returned promise. If the callback + // + // This function will return a new promise that is fulfilled when the given + // fulfilledHandler or errorHandler callback is finished. This allows promise + // operations to be chained together. The value returned from the callback + // handler is the fulfillment value for the returned promise. If the callback // throws an error, the returned promise will be moved to failed state. - // + // // example: // An example of using a CommonJS compliant promise: // | asyncComputeTheAnswerToEverything(). // | then(addTwo). // | then(printResult, onError); - // | >44 - // + // | >44 + // var returnDeferred = progressCallback == mutator ? this : new dojo.Deferred(promise.cancel); var listener = { - resolved: resolvedCallback, - error: errorCallback, - progress: progressCallback, + resolved: resolvedCallback, + error: errorCallback, + progress: progressCallback, deferred: returnDeferred - }; + }; if(nextListener){ head = head.next = listener; } @@ -4085,7 +4112,7 @@ dojo.provide("dojo._base.Deferred"); deferred.reject(error); } } - } + }; freeze(promise); }; dojo.extend(dojo.Deferred, { @@ -4106,7 +4133,7 @@ dojo.provide("dojo._base.Deferred"); })(); dojo.when = function(promiseOrValue, /*Function?*/callback, /*Function?*/errback, /*Function?*/progressHandler){ // summary: - // This provides normalization between normal synchronous values and + // This provides normalization between normal synchronous values and // asynchronous promises, so you can interact with them in a common way // example: // | function printFirstAndList(items){ @@ -4139,6 +4166,7 @@ if(!dojo._hasResource["dojo._base.json"]){ //_hasResource checks added by build. dojo._hasResource["dojo._base.json"] = true; dojo.provide("dojo._base.json"); + dojo.fromJson = function(/*String*/ json){ // summary: // Parses a [JSON](http://json.org) string to return a JavaScript object. @@ -4146,12 +4174,12 @@ dojo.fromJson = function(/*String*/ json){ // Throws for invalid JSON strings, but it does not use a strict JSON parser. It // delegates to eval(). The content passed to this method must therefore come // from a trusted source. - // json: + // json: // a string literal of a JSON item, for instance: // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'` return eval("(" + json + ")"); // Object -} +}; dojo._escapeString = function(/*String*/str){ //summary: @@ -4161,7 +4189,7 @@ dojo._escapeString = function(/*String*/str){ return ('"' + str.replace(/(["\\])/g, '\\$1') + '"'). replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n"). replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r"); // string -} +}; dojo.toJsonIndentStr = "\t"; dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _indentStr){ @@ -4205,8 +4233,8 @@ dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _ind if(it === null){ return "null"; } - if(dojo.isString(it)){ - return dojo._escapeString(it); + if(dojo.isString(it)){ + return dojo._escapeString(it); } // recurse var recurse = arguments.callee; @@ -4279,7 +4307,7 @@ dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _ind output.push(newLine + nextIndent + keyStr + ":" + sep + val); } return "{" + output.join("," + sep) + newLine + _indentStr + "}"; // String -} +}; } @@ -4289,6 +4317,7 @@ dojo.provide("dojo._base.Color"); + (function(){ var d = dojo; @@ -4477,7 +4506,7 @@ dojo.provide("dojo._base.Color"); // Builds a `dojo.Color` from a 3 or 4 element array, mapping each // element in sequence to the rgb(a) values of the color. // example: - // | var myColor = dojo.colorFromArray([237,237,237,0.5]); // grey, 50% alpha + // | var myColor = dojo.colorFromArray([237,237,237,0.5]); // grey, 50% alpha // returns: // A dojo.Color object. If obj is passed, it will be the return value. var t = obj || new d.Color(); @@ -4504,24 +4533,11 @@ dojo.provide("dojo._base.Color"); } -if(!dojo._hasResource["dojo._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo._base"] = true; -dojo.provide("dojo._base"); - - - - - - - - - -} - if(!dojo._hasResource["dojo._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. dojo._hasResource["dojo._base.window"] = true; dojo.provide("dojo._base.window"); + /*===== dojo.doc = { // summary: @@ -4547,7 +4563,7 @@ dojo.body = function(){ // Note: document.body is not defined for a strict xhtml document // Would like to memoize this, but dojo.doc can change vi dojo.withDoc(). return dojo.doc.body || dojo.doc.getElementsByTagName("body")[0]; // Node -} +}; dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocument){ // summary: @@ -4560,9 +4576,9 @@ dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocu dojo.doc = globalDocument; }; -dojo.withGlobal = function( /*Object*/globalObject, - /*Function*/callback, - /*Object?*/thisObject, +dojo.withGlobal = function( /*Object*/globalObject, + /*Function*/callback, + /*Object?*/thisObject, /*Array?*/cbArguments){ // summary: // Invoke callback with globalObject as dojo.global and @@ -4581,11 +4597,11 @@ dojo.withGlobal = function( /*Object*/globalObject, }finally{ dojo.global = oldGlob; } -} +}; -dojo.withDoc = function( /*DocumentElement*/documentObject, - /*Function*/callback, - /*Object?*/thisObject, +dojo.withDoc = function( /*DocumentElement*/documentObject, + /*Function*/callback, + /*Object?*/thisObject, /*Array?*/cbArguments){ // summary: // Invoke callback with documentObject as dojo.doc. @@ -4616,7 +4632,6 @@ dojo.withDoc = function( /*DocumentElement*/documentObject, dojo.isQuirks = oldQ; } }; - } @@ -4625,27 +4640,26 @@ dojo._hasResource["dojo._base.event"] = true; dojo.provide("dojo._base.event"); + // this file courtesy of the TurboAjax Group, licensed under a Dojo CLA (function(){ // DOM event listener machinery var del = (dojo._event_listener = { add: function(/*DOMNode*/ node, /*String*/ name, /*Function*/ fp){ - if(!node){return;} + if(!node){return;} name = del._normalizeEventName(name); fp = del._fixCallback(name, fp); - var oname = name; if( - !dojo.isIE && + !dojo.isIE && (name == "mouseenter" || name == "mouseleave") ){ var ofp = fp; - //oname = name; name = (name == "mouseenter") ? "mouseover" : "mouseout"; fp = function(e){ if(!dojo.isDescendant(e.relatedTarget, node)){ // e.type = oname; // FIXME: doesn't take? SJM: event.type is generally immutable. - return ofp.call(this, e); + return ofp.call(this, e); } } } @@ -4686,7 +4700,7 @@ dojo.provide("dojo._base.event"); }, _fixEvent: function(evt, sender){ // _fixCallback only attaches us to keypress. - // Switch on evt.type anyway because we might + // Switch on evt.type anyway because we might // be called directly from dojo.fixEvent. switch(evt.type){ case "keypress": @@ -4696,26 +4710,26 @@ dojo.provide("dojo._base.event"); return evt; }, _setKeyChar: function(evt){ - evt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : ''; + evt.keyChar = evt.charCode >= 32 ? String.fromCharCode(evt.charCode) : ''; evt.charOrCode = evt.keyChar || evt.keyCode; }, // For IE and Safari: some ctrl-key combinations (mostly w/punctuation) do not emit a char code in IE // we map those virtual key codes to ascii here // not valid for all (non-US) keyboards, so maybe we shouldn't bother - _punctMap: { - 106:42, - 111:47, - 186:59, - 187:43, - 188:44, - 189:45, - 190:46, - 191:47, - 192:96, - 219:91, - 220:92, - 221:93, - 222:39 + _punctMap: { + 106:42, + 111:47, + 186:59, + 187:43, + 188:44, + 189:45, + 190:46, + 191:47, + 192:96, + 219:91, + 220:92, + 221:93, + 222:39 } }); @@ -4730,7 +4744,7 @@ dojo.provide("dojo._base.event"); // sender: DOMNode // node to treat as "currentTarget" return del._fixEvent(evt, sender); - } + }; dojo.stopEvent = function(/*Event*/ evt){ // summary: @@ -4741,7 +4755,7 @@ dojo.provide("dojo._base.event"); evt.preventDefault(); evt.stopPropagation(); // NOTE: below, this method is overridden for IE - } + }; // the default listener to use on dontFix nodes, overriden for IE var node_listener = dojo._listener; @@ -4756,16 +4770,16 @@ dojo.provide("dojo._base.event"); // create a listener var h = l.add(obj, event, dojo.hitch(context, method)); // formerly, the disconnect package contained "l" directly, but if client code - // leaks the disconnect package (by connecting it to a node), referencing "l" + // leaks the disconnect package (by connecting it to a node), referencing "l" // compounds the problem. // instead we return a listener id, which requires custom _disconnect below. // return disconnect package return [ obj, event, h, lid ]; - } + }; dojo._disconnect = function(obj, event, handle, listener){ ([dojo._listener, del, node_listener][listener]).remove(obj, event, handle); - } + }; // Constants @@ -4895,7 +4909,7 @@ dojo.provide("dojo._base.event"); }; =====*/ - if(dojo.isIE){ + if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){ dojo.mouseButtons = { LEFT: 1, MIDDLE: 4, @@ -4920,7 +4934,7 @@ dojo.provide("dojo._base.event"); } // IE event normalization - if(dojo.isIE){ + if(dojo.isIE){ var _trySetKeyCode = function(e, code){ try{ // squelch errors when keyCode is read-only @@ -4929,7 +4943,7 @@ dojo.provide("dojo._base.event"); }catch(e){ return 0; } - } + }; // by default, use the standard listener var iel = dojo._listener; @@ -4938,7 +4952,7 @@ dojo.provide("dojo._base.event"); if(!dojo.config._allow_leaks){ // custom listener that handles leak protection for DOM events node_listener = iel = dojo._ie_listener = { - // support handler indirection: event handler functions are + // support handler indirection: event handler functions are // referenced here. Event dispatchers hold only indices. handlers: [], // add a listener to an object @@ -4991,7 +5005,7 @@ dojo.provide("dojo._base.event"); }, remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){ event = del._normalizeEventName(event); - iel.remove(node, event, handle); + iel.remove(node, event, handle); if(event=="onkeypress"){ var kd = node.onkeydown; if(--kd._stealthKeydownRefs <= 0){ @@ -5017,11 +5031,11 @@ dojo.provide("dojo._base.event"); // node to treat as "currentTarget" if(!evt){ var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window; - evt = w.event; + evt = w.event; } if(!evt){return(evt);} - evt.target = evt.srcElement; - evt.currentTarget = (sender || evt.srcElement); + evt.target = evt.srcElement; + evt.currentTarget = (sender || evt.srcElement); evt.layerX = evt.offsetX; evt.layerY = evt.offsetY; // FIXME: scroll position query is duped from dojo.html to @@ -5034,14 +5048,16 @@ dojo.provide("dojo._base.event"); var offset = dojo._getIeDocumentElementOffset(); evt.pageX = evt.clientX + dojo._fixIeBiDiScrollLeft(docBody.scrollLeft || 0) - offset.x; evt.pageY = evt.clientY + (docBody.scrollTop || 0) - offset.y; - if(evt.type == "mouseover"){ + if(evt.type == "mouseover"){ evt.relatedTarget = evt.fromElement; } - if(evt.type == "mouseout"){ + if(evt.type == "mouseout"){ evt.relatedTarget = evt.toElement; } - evt.stopPropagation = del._stopPropagation; - evt.preventDefault = del._preventDefault; + if (dojo.isIE < 9 || dojo.isQuirks) { + evt.stopPropagation = del._stopPropagation; + evt.preventDefault = del._preventDefault; + } return del._fixKeys(evt); }, _fixKeys: function(evt){ @@ -5075,38 +5091,41 @@ dojo.provide("dojo._base.event"); var k=evt.keyCode; // These are Windows Virtual Key Codes // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp - var unprintable = k!=13 && k!=32 && k!=27 && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222); + var unprintable = (k!=13 || (dojo.isIE >= 9 && !dojo.isQuirks)) && k!=32 && k!=27 && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222); + // synthesize keypress for most unprintables and CTRL-keys if(unprintable||evt.ctrlKey){ var c = unprintable ? 0 : k; if(evt.ctrlKey){ if(k==3 || k==13){ - return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively - }else if(c>95 && c<106){ + return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively + }else if(c>95 && c<106){ c -= 48; // map CTRL-[numpad 0-9] to ASCII - }else if((!evt.shiftKey)&&(c>=65&&c<=90)){ + }else if((!evt.shiftKey)&&(c>=65&&c<=90)){ c += 32; // map CTRL-[A-Z] to lowercase - }else{ + }else{ c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII } } // simulate a keypress event var faux = del._synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c}); kp.call(evt.currentTarget, faux); - evt.cancelBubble = faux.cancelBubble; + if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){ + evt.cancelBubble = faux.cancelBubble; + } evt.returnValue = faux.returnValue; _trySetKeyCode(evt, faux.keyCode); } }, // Called in Event scope _stopPropagation: function(){ - this.cancelBubble = true; + this.cancelBubble = true; }, _preventDefault: function(){ // Setting keyCode to 0 is the only way to prevent certain keypresses (namely // ctrl-combinations that correspond to menu accelerator keys). // Otoh, it prevents upstream listeners from getting this information - // Try to split the difference here by clobbering keyCode only for ctrl + // Try to split the difference here by clobbering keyCode only for ctrl // combinations. If you still need to access the key upstream, bubbledKeyCode is // provided as a workaround. this.bubbledKeyCode = this.keyCode; @@ -5116,23 +5135,23 @@ dojo.provide("dojo._base.event"); }); // override stopEvent for IE - dojo.stopEvent = function(evt){ + dojo.stopEvent = (dojo.isIE < 9 || dojo.isQuirks) ? function(evt){ evt = evt || window.event; del._stopPropagation.call(evt); del._preventDefault.call(evt); - } + } : dojo.stopEvent; } del._synthesizeEvent = function(evt, props){ var faux = dojo.mixin({}, evt, props); del._setKeyChar(faux); - // FIXME: would prefer to use dojo.hitch: dojo.hitch(evt, evt.preventDefault); + // FIXME: would prefer to use dojo.hitch: dojo.hitch(evt, evt.preventDefault); // but it throws an error when preventDefault is invoked on Safari // does Event.preventDefault not support "apply" on Safari? - faux.preventDefault = function(){ evt.preventDefault(); }; - faux.stopPropagation = function(){ evt.stopPropagation(); }; + faux.preventDefault = function(){ evt.preventDefault(); }; + faux.stopPropagation = function(){ evt.stopPropagation(); }; return faux; - } + }; // Opera event normalization if(dojo.isOpera){ @@ -5183,12 +5202,12 @@ dojo.provide("dojo._base.event"); var c = unprintable ? 0 : k; if(evt.ctrlKey){ if(k==3 || k==13){ - return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively - }else if(c>95 && c<106){ + return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively + }else if(c>95 && c<106){ c -= 48; // map CTRL-[numpad 0-9] to ASCII - }else if(!evt.shiftKey && c>=65 && c<=90){ + }else if(!evt.shiftKey && c>=65 && c<=90){ c += 32; // map CTRL-[A-Z] to lowercase - }else{ + }else{ c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII } } @@ -5245,25 +5264,26 @@ if(dojo.isIE){ } } return r; - } + }; dojo._getIeDispatcher = function(){ // ensure the returned function closes over nothing ("new Function" apparently doesn't close) return new Function(dojo._scopeName + "._ieDispatcher(arguments, this)"); // function - } + }; // keep this out of the closure to reduce RAM allocation dojo._event_listener._fixCallback = function(fp){ var f = dojo._event_listener._fixEvent; return function(e){ return fp.call(this, f(e, this)); }; - } + }; } } if(!dojo._hasResource["dojo._base.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. dojo._hasResource["dojo._base.html"] = true; - dojo.provide("dojo._base.html"); + + // FIXME: need to add unit tests for all the semi-public methods try{ @@ -5307,13 +5327,13 @@ dojo.byId = function(id, doc){ // | } =====*/ -if(dojo.isIE || dojo.isOpera){ +if(dojo.isIE){ dojo.byId = function(id, doc){ if(typeof id != "string"){ return id; } var _d = doc || dojo.doc, te = _d.getElementById(id); - // attributes.id.value is better than just id in case the + // attributes.id.value is better than just id in case the // user has a name=id inside a form if(te && (te.attributes.id.value == id || te.id == id)){ return te; @@ -5334,8 +5354,9 @@ if(dojo.isIE || dojo.isOpera){ }; }else{ dojo.byId = function(id, doc){ - // inline'd type check - return (typeof id == "string") ? (doc || dojo.doc).getElementById(id) : id; // DomNode + // inline'd type check. + // be sure to return null per documentation, to match IE branch. + return ((typeof id == "string") ? (doc || dojo.doc).getElementById(id) : id) || null; // DomNode }; } /*===== @@ -5418,16 +5439,16 @@ if(dojo.isIE || dojo.isOpera){ }; dojo.setSelectable = function(/*DomNode|String*/node, /*Boolean*/selectable){ - // summary: + // summary: // Enable or disable selection on a node // node: // id or reference to node // selectable: - // state to put the node in. false indicates unselectable, true + // state to put the node in. false indicates unselectable, true // allows selection. // example: // Make the node id="bar" unselectable - // | dojo.setSelectable("bar"); + // | dojo.setSelectable("bar"); // example: // Make the node id="bar" selectable // | dojo.setSelectable("bar", true); @@ -5510,7 +5531,7 @@ if(dojo.isIE || dojo.isOpera){ refNode = byId(refNode); if(typeof node == "string"){ // inline'd type check - node = node.charAt(0) == "<" ? d._toDom(node, refNode.ownerDocument) : byId(node); + node = /^\s*</.test(node) ? d._toDom(node, refNode.ownerDocument) : byId(node); } if(typeof position == "number"){ // inline'd type check var cn = refNode.childNodes; @@ -5545,7 +5566,7 @@ if(dojo.isIE || dojo.isOpera){ } } return node; // DomNode - } + }; // Box functions will assume this model. // On IE/Opera, BORDER_BOX will be set if the primary document is in quirks mode. @@ -5557,7 +5578,7 @@ if(dojo.isIE || dojo.isOpera){ dojo.boxModel = "content-box"; // We punt per-node box mode testing completely. - // If anybody cares, we can provide an additional (optional) unit + // If anybody cares, we can provide an additional (optional) unit // that overrides existing code to include per-node box sensitivity. // Opera documentation claims that Opera 9 uses border-box in BackCompat mode. @@ -5577,10 +5598,10 @@ if(dojo.isIE || dojo.isOpera){ // getComputedStyle drives most of the style code. // Wherever possible, reuse the returned object. // - // API functions below that need to access computed styles accept an + // API functions below that need to access computed styles accept an // optional computedStyle parameter. // If this parameter is omitted, the functions will call getComputedStyle themselves. - // This way, calling code can access computedStyle once, and then pass the reference to + // This way, calling code can access computedStyle once, and then pass the reference to // multiple API functions. /*===== @@ -5619,7 +5640,7 @@ if(dojo.isIE || dojo.isOpera){ // Although we normally eschew argument validation at this // level, here we test argument 'node' for (duck)type, // by testing nodeType, ecause 'document' is the 'parentNode' of 'body' - // it is frequently sent to this function even + // it is frequently sent to this function even // though it is not Element. var gcs; if(d.isWebKit){ @@ -5680,7 +5701,7 @@ if(dojo.isIE || dojo.isOpera){ runtimeStyle.left = rsLeft; } return avalue; - } + }; } var px = d._toPixelValue; @@ -5708,7 +5729,7 @@ if(dojo.isIE || dojo.isOpera){ }; dojo._getOpacity = - d.isIE ? function(node){ + d.isIE < 9 ? function(node){ try{ return af(node).Opacity / 100; // Number }catch(e){ @@ -5735,7 +5756,7 @@ if(dojo.isIE || dojo.isOpera){ =====*/ dojo._setOpacity = - d.isIE ? function(/*DomNode*/node, /*Number*/opacity){ + d.isIE < 9 ? function(/*DomNode*/node, /*Number*/opacity){ var ov = opacity * 100, opaque = opacity == 1; node.style.zoom = opaque ? "" : 1; @@ -5807,7 +5828,7 @@ if(dojo.isIE || dojo.isOpera){ // Also when getting values, use specific style names, // like "borderBottomWidth" instead of "border" since compound values like // "border" are not necessarily reflected as expected. - // If you want to get node dimensions, use `dojo.marginBox()`, + // If you want to get node dimensions, use `dojo.marginBox()`, // `dojo.contentBox()` or `dojo.position()`. // node: // id or reference to node to get/set style for @@ -5876,7 +5897,7 @@ if(dojo.isIE || dojo.isOpera){ return s; } return (args == 1) ? s : _toStyleValue(n, style, s[style] || n.style[style]); /* CSS2Properties||String||Number */ - } + }; // ============================= // Box Functions @@ -5889,13 +5910,13 @@ if(dojo.isIE || dojo.isOpera){ // description: // Returns an object with `w`, `h`, `l`, `t` properties: // | l/t = left/top padding (respectively) - // | w = the total of the left and right padding + // | w = the total of the left and right padding // | h = the total of the top and bottom padding // If 'node' has position, l/t forms the origin for child nodes. // The w/h are used for calculating boxes. // Normally application code will not need to invoke this // directly, and will use the ...box... functions instead. - var + var s = computedStyle||gcs(n), l = px(n, s.paddingLeft), t = px(n, s.paddingTop); @@ -5905,7 +5926,7 @@ if(dojo.isIE || dojo.isOpera){ w: l+px(n, s.paddingRight), h: t+px(n, s.paddingBottom) }; - } + }; dojo._getBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){ // summary: @@ -5919,7 +5940,7 @@ if(dojo.isIE || dojo.isOpera){ // The w/h are used for calculating boxes. // Normally application code will not need to invoke this // directly, and will use the ...box... functions instead. - var + var ne = "none", s = computedStyle||gcs(n), bl = (s.borderLeftStyle != ne ? px(n, s.borderLeftWidth) : 0), @@ -5930,7 +5951,7 @@ if(dojo.isIE || dojo.isOpera){ w: bl + (s.borderRightStyle!=ne ? px(n, s.borderRightWidth) : 0), h: bt + (s.borderBottomStyle!=ne ? px(n, s.borderBottomWidth) : 0) }; - } + }; dojo._getPadBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){ // summary: @@ -5944,7 +5965,7 @@ if(dojo.isIE || dojo.isOpera){ // The w/h are used for calculating boxes. // Normally application code will not need to invoke this // directly, and will use the ...box... functions instead. - var + var s = computedStyle||gcs(n), p = d._getPadExtents(n, s), b = d._getBorderExtents(n, s); @@ -5954,7 +5975,7 @@ if(dojo.isIE || dojo.isOpera){ w: p.w + b.w, h: p.h + b.h }; - } + }; dojo._getMarginExtents = function(n, computedStyle){ // summary: @@ -5968,7 +5989,7 @@ if(dojo.isIE || dojo.isOpera){ // The w/h are used for calculating boxes. // Normally application code will not need to invoke this // directly, and will use the ...box... functions instead. - var + var s = computedStyle||gcs(n), l = px(n, s.marginLeft), t = px(n, s.marginTop), @@ -5976,9 +5997,9 @@ if(dojo.isIE || dojo.isOpera){ b = px(n, s.marginBottom); if(d.isWebKit && (s.position != "absolute")){ // FIXME: Safari's version of the computed right margin - // is the space between our right edge and the right edge + // is the space between our right edge and the right edge // of our offsetParent. - // What we are looking for is the actual margin value as + // What we are looking for is the actual margin value as // determined by CSS. // Hack solution is to assume left/right margins are the same. r = l; @@ -5989,7 +6010,7 @@ if(dojo.isIE || dojo.isOpera){ w: l+r, h: t+b }; - } + }; // Box getters work in any box context because offsetWidth/clientWidth // are invariant wrt box context @@ -5997,10 +6018,10 @@ if(dojo.isIE || dojo.isOpera){ // They do *not* work for display: inline objects that have padding styles // because the user agent ignores padding (it's bogus styling in any case) // - // Be careful with IMGs because they are inline or block depending on + // Be careful with IMGs because they are inline or block depending on // browser and browser mode. - // Although it would be easier to read, there are not separate versions of + // Although it would be easier to read, there are not separate versions of // _getMarginBox for each browser because: // 1. the branching is not expensive // 2. factoring the shared code wastes cycles (function call overhead) @@ -6044,9 +6065,23 @@ if(dojo.isIE || dojo.isOpera){ l: l, t: t, w: node.offsetWidth + me.w, - h: node.offsetHeight + me.h + h: node.offsetHeight + me.h }; } + + dojo._getMarginSize = function(/*DomNode*/node, /*Object*/computedStyle){ + // summary: + // returns an object that encodes the width and height of + // the node's margin box + node = byId(node); + var me = d._getMarginExtents(node, computedStyle || gcs(node)); + + var size = node.getBoundingClientRect(); + return { + w: (size.right - size.left) + me.w, + h: (size.bottom - size.top) + me.h + } + } dojo._getContentBox = function(node, computedStyle){ // summary: @@ -6075,7 +6110,7 @@ if(dojo.isIE || dojo.isOpera){ w: w - pe.w - be.w, h: h - pe.h - be.h }; - } + }; dojo._getBorderBox = function(node, computedStyle){ var s = computedStyle || gcs(node), @@ -6088,7 +6123,7 @@ if(dojo.isIE || dojo.isOpera){ w: cb.w + pe.w, h: cb.h + pe.h }; - } + }; // Box setters depend on box context because interpretation of width/height styles // vary wrt box context. @@ -6099,12 +6134,12 @@ if(dojo.isIE || dojo.isOpera){ // Beware of display: inline objects that have padding styles // because the user agent ignores padding (it's a bogus setup anyway) // - // Be careful with IMGs because they are inline or block depending on + // Be careful with IMGs because they are inline or block depending on // browser and browser mode. // // Elements other than DIV may have special quirks, like built-in // margins or padding, or values not detectable via computedStyle. - // In particular, margins on TABLE do not seems to appear + // In particular, margins on TABLE do not seems to appear // at all in computedStyle on Mozilla. dojo._setBox = function(/*DomNode*/node, /*Number?*/l, /*Number?*/t, /*Number?*/w, /*Number?*/h, /*String?*/u){ @@ -6130,14 +6165,14 @@ if(dojo.isIE || dojo.isOpera){ if(!isNaN(t)){ s.top = t + u; } if(w >= 0){ s.width = w + u; } if(h >= 0){ s.height = h + u; } - } + }; dojo._isButtonTag = function(/*DomNode*/node) { // summary: // True if the node is BUTTON or INPUT.type="button". return node.tagName == "BUTTON" || node.tagName=="INPUT" && (node.getAttribute("type")||'').toUpperCase() == "BUTTON"; // boolean - } + }; dojo._usesBorderBox = function(/*DomNode*/node){ // summary: @@ -6152,7 +6187,7 @@ if(dojo.isIE || dojo.isOpera){ var n = node.tagName; return d.boxModel=="border-box" || n=="TABLE" || d._isButtonTag(node); // boolean - } + }; dojo._setContentSize = function(/*DomNode*/node, /*Number*/widthPx, /*Number*/heightPx, /*Object*/computedStyle){ // summary: @@ -6164,7 +6199,7 @@ if(dojo.isIE || dojo.isOpera){ if(heightPx >= 0){ heightPx += pb.h; } } d._setBox(node, NaN, NaN, widthPx, heightPx); - } + }; dojo._setMarginBox = function(/*DomNode*/node, /*Number?*/leftPx, /*Number?*/topPx, /*Number?*/widthPx, /*Number?*/heightPx, @@ -6196,7 +6231,7 @@ if(dojo.isIE || dojo.isOpera){ if(widthPx >= 0){ widthPx = Math.max(widthPx - pb.w - mb.w, 0); } if(heightPx >= 0){ heightPx = Math.max(heightPx - pb.h - mb.h, 0); } d._setBox(node, leftPx, topPx, widthPx, heightPx); - } + }; var _nilExtents = { l:0, t:0, w:0, h:0 }; @@ -6231,7 +6266,7 @@ if(dojo.isIE || dojo.isOpera){ var n = byId(node), s = gcs(n), b = box; return !b ? d._getMarginBox(n, s) : d._setMarginBox(n, b.l, b.t, b.w, b.h, s); // Object - } + }; dojo.contentBox = function(/*DomNode|String*/node, /*Object?*/box){ // summary: @@ -6256,14 +6291,14 @@ if(dojo.isIE || dojo.isOpera){ // All properties are optional if passed. var n = byId(node), s = gcs(n), b = box; return !b ? d._getContentBox(n, s) : d._setContentSize(n, b.w, b.h, s); // Object - } + }; // ============================= - // Positioning + // Positioning // ============================= var _sumAncestorProperties = function(node, prop){ - if(!(node = (node||0).parentNode)){return 0} + if(!(node = (node||0).parentNode)){return 0;} var val, retVal = 0, _b = d.body(); while(node && node.style){ if(gcs(node).position == "fixed"){ @@ -6279,19 +6314,19 @@ if(dojo.isIE || dojo.isOpera){ node = node.parentNode; } return retVal; // integer - } + }; dojo._docScroll = function(){ var n = d.global; - return "pageXOffset" in n? { x:n.pageXOffset, y:n.pageYOffset } : - (n=d.doc.documentElement, n.clientHeight? { x:d._fixIeBiDiScrollLeft(n.scrollLeft), y:n.scrollTop } : - (n=d.body(), { x:n.scrollLeft||0, y:n.scrollTop||0 })); + return "pageXOffset" in n + ? { x:n.pageXOffset, y:n.pageYOffset } + : (n = d.isQuirks? d.doc.body : d.doc.documentElement, { x:d._fixIeBiDiScrollLeft(n.scrollLeft || 0), y:n.scrollTop || 0 }); }; dojo._isBodyLtr = function(){ return "_bodyLtr" in d? d._bodyLtr : - d._bodyLtr = (d.body().dir || d.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean - } + d._bodyLtr = (d.body().dir || d.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean + }; dojo._getIeDocumentElementOffset = function(){ // summary: @@ -6312,7 +6347,7 @@ if(dojo.isIE || dojo.isOpera){ //NOTE: assumes we're being called in an IE browser - var de = d.doc.documentElement; // only deal with HTML element here, _abs handles body/quirks + var de = d.doc.documentElement; // only deal with HTML element here, _abs handles body/quirks if(d.isIE < 8){ var r = de.getBoundingClientRect(); // works well for IE6+ @@ -6337,18 +6372,22 @@ if(dojo.isIE || dojo.isOpera){ }; dojo._fixIeBiDiScrollLeft = function(/*Integer*/ scrollLeft){ - // In RTL direction, scrollLeft should be a negative value, but IE < 8 + // In RTL direction, scrollLeft should be a negative value, but IE // returns a positive one. All codes using documentElement.scrollLeft // must call this function to fix this error, otherwise the position // will offset to right when there is a horizontal scrollbar. - var dd = d.doc; - if(d.isIE < 8 && !d._isBodyLtr()){ - var de = d.isQuirks ? dd.body : dd.documentElement; - return scrollLeft + de.clientWidth - de.scrollWidth; // Integer + var ie = d.isIE; + if(ie && !d._isBodyLtr()){ + var qk = d.isQuirks, + de = qk ? d.doc.body : d.doc.documentElement; + if(ie == 6 && !qk && d.global.frameElement && de.scrollHeight > de.clientHeight){ + scrollLeft += de.clientLeft; // workaround ie6+strict+rtl+iframe+vertical-scrollbar bug where clientWidth is too small by clientLeft pixels + } + return (ie < 8 || qk) ? (scrollLeft + de.clientWidth - de.scrollWidth) : -scrollLeft; // Integer } return scrollLeft; // Integer - } + }; // FIXME: need a setter for coords or a moveTo!! dojo._abs = dojo.position = function(/*DomNode*/node, /*Boolean?*/includeScroll){ @@ -6366,10 +6405,9 @@ if(dojo.isIE || dojo.isOpera){ // Uses the border-box model (inclusive of border and padding but // not margin). Does not act as a setter. - var db = d.body(), dh = db.parentNode, ret; node = byId(node); - if(node["getBoundingClientRect"]){ - // IE6+, FF3+, super-modern WebKit, and Opera 9.6+ all take this branch + var db = d.body(), + dh = db.parentNode, ret = node.getBoundingClientRect(); ret = { x: ret.left, y: ret.top, w: ret.right - ret.left, h: ret.bottom - ret.top }; if(d.isIE){ @@ -6386,60 +6424,7 @@ if(dojo.isIE || dojo.isOpera){ ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth); ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth); } - }else{ - // FF2 and older WebKit - ret = { - x: 0, - y: 0, - w: node.offsetWidth, - h: node.offsetHeight - }; - if(node["offsetParent"]){ - ret.x -= _sumAncestorProperties(node, "scrollLeft"); - ret.y -= _sumAncestorProperties(node, "scrollTop"); - - var curnode = node; - do{ - var n = curnode.offsetLeft, - t = curnode.offsetTop; - ret.x += isNaN(n) ? 0 : n; - ret.y += isNaN(t) ? 0 : t; - - cs = gcs(curnode); - if(curnode != node){ - if(d.isMoz){ - // tried left+right with differently sized left/right borders - // it really is 2xleft border in FF, not left+right, even in RTL! - ret.x += 2 * px(curnode,cs.borderLeftWidth); - ret.y += 2 * px(curnode,cs.borderTopWidth); - }else{ - ret.x += px(curnode, cs.borderLeftWidth); - ret.y += px(curnode, cs.borderTopWidth); - } - } - // static children in a static div in FF2 are affected by the div's border as well - // but offsetParent will skip this div! - if(d.isMoz && cs.position=="static"){ - var parent=curnode.parentNode; - while(parent!=curnode.offsetParent){ - var pcs=gcs(parent); - if(pcs.position=="static"){ - ret.x += px(curnode,pcs.borderLeftWidth); - ret.y += px(curnode,pcs.borderTopWidth); - } - parent=parent.parentNode; - } - } - curnode = curnode.offsetParent; - }while((curnode != dh) && curnode); - }else if(node.x && node.y){ - ret.x += isNaN(node.x) ? 0 : node.x; - ret.y += isNaN(node.y) ? 0 : node.y; - } - } - // account for document scrolling - // if offsetParent is used, ret value already includes scroll position - // so we may have to actually remove that value if !includeScroll + // account for document scrolling if(includeScroll){ var scroll = d._docScroll(); ret.x += scroll.x; @@ -6447,7 +6432,7 @@ if(dojo.isIE || dojo.isOpera){ } return ret; // Object - } + }; dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){ // summary: @@ -6469,7 +6454,7 @@ if(dojo.isIE || dojo.isOpera){ mb.x = abs.x; mb.y = abs.y; return mb; - } + }; // ============================= // Element attribute Functions @@ -6531,7 +6516,7 @@ if(dojo.isIE || dojo.isOpera){ // given element, and false otherwise var lc = name.toLowerCase(); return _forcePropNames[_propNames[lc] || name] || _hasAttr(byId(node), _attrNames[lc] || name); // Boolean - } + }; var _evtHdlrMap = {}, _ctr = 0, _attrId = dojo._scopeName + "attrid", @@ -6701,7 +6686,7 @@ if(dojo.isIE || dojo.isOpera){ // node's attribute // we need _hasAttr() here to guard against IE returning a default value return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything - } + }; dojo.removeAttr = function(/*DomNode|String*/ node, /*String*/ name){ // summary: @@ -6711,7 +6696,7 @@ if(dojo.isIE || dojo.isOpera){ // name: // the name of the attribute to remove byId(node).removeAttribute(_fixAttrName(name)); - } + }; dojo.getNodeProp = function(/*DomNode|String*/ node, /*String*/ name){ // summary: @@ -6730,7 +6715,7 @@ if(dojo.isIE || dojo.isOpera){ // node's attribute var attrName = _attrNames[lc] || name; return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything - } + }; dojo.create = function(tag, attrs, refNode, pos){ // summary: @@ -6745,7 +6730,7 @@ if(dojo.isIE || dojo.isOpera){ // Attributes are set by passing the optional object through `dojo.attr`. // See `dojo.attr` for noted caveats and nuances, and API if applicable. //| - // Placement is done via `dojo.place`, assuming the new node to be the action + // Placement is done via `dojo.place`, assuming the new node to be the action // node, passing along the optional reference node and position. // // tag: String|DomNode @@ -6783,7 +6768,7 @@ if(dojo.isIE || dojo.isOpera){ // | var n = dojo.create("div", null, dojo.body()); // // example: - // Create an UL, and populate it with LI's. Place the list as the first-child of a + // Create an UL, and populate it with LI's. Place the list as the first-child of a // node with id="someId": // | var ul = dojo.create("ul", null, "someId", "first"); // | var items = ["one", "two", "three", "four"]; @@ -6813,7 +6798,7 @@ if(dojo.isIE || dojo.isOpera){ if(attrs){ d.attr(tag, attrs); } if(refNode){ d.place(tag, refNode, pos); } return tag; // DomNode - } + }; /*===== dojo.empty = function(node){ @@ -6881,11 +6866,13 @@ if(dojo.isIE || dojo.isOpera){ // generate start/end tag strings to use // for the injection for each special tag wrap case. for(var param in tagWrap){ - var tw = tagWrap[param]; - tw.pre = param == "option" ? '<select multiple="multiple">' : "<" + tw.join("><") + ">"; - tw.post = "</" + tw.reverse().join("></") + ">"; - // the last line is destructive: it reverses the array, - // but we don't care at this point + if(tagWrap.hasOwnProperty(param)){ + var tw = tagWrap[param]; + tw.pre = param == "option" ? '<select multiple="multiple">' : "<" + tw.join("><") + ">"; + tw.post = "</" + tw.reverse().join("></") + ">"; + // the last line is destructive: it reverses the array, + // but we don't care at this point + } } d._toDom = function(frag, doc){ @@ -6928,7 +6915,7 @@ if(dojo.isIE || dojo.isOpera){ df.appendChild(fc); } return df; // DOMNode - } + }; // ============================= // (CSS) Class Functions @@ -6954,6 +6941,7 @@ if(dojo.isIE || dojo.isOpera){ }; var spaces = /\s+/, a1 = [""], + fakeNode = {}, str2array = function(s){ if(typeof s == "string" || s instanceof String){ if(s.indexOf(" ") < 0){ @@ -7059,6 +7047,39 @@ if(dojo.isIE || dojo.isOpera){ if(node[_className] != cls){ node[_className] = cls; } }; + dojo.replaceClass = function(/*DomNode|String*/node, /*String|Array*/addClassStr, /*String|Array?*/removeClassStr){ + // summary: + // Replaces one or more classes on a node if not present. + // Operates more quickly than calling dojo.removeClass and dojo.addClass + // node: + // String ID or DomNode reference to remove the class from. + // addClassStr: + // A String class name to add, or several space-separated class names, + // or an array of class names. + // removeClassStr: + // A String class name to remove, or several space-separated class names, + // or an array of class names. + // + // example: + // | dojo.replaceClass("someNode", "add1 add2", "remove1 remove2"); + // + // example: + // Replace all classes with addMe + // | dojo.replaceClass("someNode", "addMe"); + // + // example: + // Available in `dojo.NodeList()` for multiple toggles + // | dojo.query(".findMe").replaceClass("addMe", "removeMe"); + + node = byId(node); + fakeNode.className = node.className; + dojo.removeClass(fakeNode, removeClassStr); + dojo.addClass(fakeNode, addClassStr); + if(node.className !== fakeNode.className){ + node.className = fakeNode.className; + } + }; + dojo.toggleClass = function(/*DomNode|String*/node, /*String|Array*/classStr, /*Boolean?*/condition){ // summary: // Adds a class to node if not present, or removes if present. @@ -7093,6 +7114,9 @@ dojo.provide("dojo._base.NodeList"); + + + (function(){ var d = dojo; @@ -7330,7 +7354,7 @@ dojo.provide("dojo._base.NodeList"); }); // add forEach actions - d.forEach(["connect", "addClass", "removeClass", "toggleClass", "empty", "removeAttr"], function(name){ + d.forEach(["connect", "addClass", "removeClass", "replaceClass", "toggleClass", "empty", "removeAttr"], function(name){ nlp[name] = adaptAsForEach(d[name]); }); @@ -7388,7 +7412,7 @@ dojo.provide("dojo._base.NodeList"); _cloneNode: function(/*DOMNode*/ node){ // summary: - // private utiltity to clone a node. Not very interesting in the vanilla + // private utility to clone a node. Not very interesting in the vanilla // dojo.NodeList case, but delegates could do interesting things like // clone event handlers if that is derivable from the node. return node.cloneNode(true); @@ -7482,7 +7506,7 @@ dojo.provide("dojo._base.NodeList"); if(this._parent){ return this._parent; }else{ - //Just return empy list. + //Just return empty list. return new this._NodeListCtor(); } }, @@ -7550,12 +7574,12 @@ dojo.provide("dojo._base.NodeList"); indexOf: function(value, fromIndex){ // summary: - // see dojo.indexOf(). The primary difference is that the acted-on + // see dojo.indexOf(). The primary difference is that the acted-on // array is implicitly this NodeList // value: Object: // The value to search for. // fromIndex: Integer?: - // The loction to start searching from. Optional. Defaults to 0. + // The location to start searching from. Optional. Defaults to 0. // description: // For more details on the behavior of indexOf, see Mozilla's // (indexOf @@ -7576,7 +7600,7 @@ dojo.provide("dojo._base.NodeList"); // value: Object // The value to search for. // fromIndex: Integer? - // The loction to start searching from. Optional. Defaults to 0. + // The location to start searching from. Optional. Defaults to 0. // returns: // Positive Integer or 0 for a match, -1 of not found. return d.lastIndexOf(this, value, fromIndex); // Integer @@ -7654,12 +7678,12 @@ dojo.provide("dojo._base.NodeList"); forEach: function(callback, thisObj){ // summary: - // see `dojo.forEach()`. The primary difference is that the acted-on + // see `dojo.forEach()`. The primary difference is that the acted-on // array is implicitly this NodeList. If you want the option to break out // of the forEach loop, use every() or some() instead. d.forEach(this, callback, thisObj); // non-standard return to allow easier chaining - return this; // dojo.NodeList + return this; // dojo.NodeList }, /*===== @@ -7676,7 +7700,7 @@ dojo.provide("dojo._base.NodeList"); // summary: // Returns border-box objects (x/y/w/h) of all elements in a node list // as an Array (*not* a NodeList). Acts like `dojo.position`, though - // assumes the node passed is each node in this list. + // assumes the node passed is each node in this list. return d.map(this, d.position); // Array }, @@ -7699,7 +7723,7 @@ dojo.provide("dojo._base.NodeList"); // Disable a group of buttons: // | dojo.query("button.group").attr("disabled", true); // example: - // innerHTML can be assigned or retreived as well: + // innerHTML can be assigned or retrieved as well: // | // get the innerHTML (as an array) for each list item // | var ih = dojo.query("li.replaceable").attr("innerHTML"); return; // dojo.NodeList @@ -7764,7 +7788,7 @@ dojo.provide("dojo._base.NodeList"); // if 2 arguments are passed (methodName, objOrFunc), objOrFunc should // reference a function or be the name of the function in the global // namespace to attach. If 3 arguments are provided - // (methodName, objOrFunc, funcName), objOrFunc must be the scope to + // (methodName, objOrFunc, funcName), objOrFunc must be the scope to // locate the bound function in // funcName: String? // optional. A string naming the function in objOrFunc to bind to the @@ -7810,7 +7834,7 @@ dojo.provide("dojo._base.NodeList"); // by queryOrNode. Returns the original NodeList. See: `dojo.place` // queryOrNode: // may be a string representing any valid CSS3 selector or a DOM node. - // In the selector case, only the first matching element will be used + // In the selector case, only the first matching element will be used // for relative positioning. // position: // can be one of: @@ -7825,18 +7849,15 @@ dojo.provide("dojo._base.NodeList"); return this.forEach(function(node){ d.place(node, item, position); }); // dojo.NodeList }, - orphan: function(/*String?*/ simpleFilter){ + orphan: function(/*String?*/ filter){ // summary: - // removes elements in this list that match the simple filter + // removes elements in this list that match the filter // from their parents and returns them as a new NodeList. - // simpleFilter: - // single-expression CSS rule. For example, ".thinger" or - // "#someId[attrName='value']" but not "div > span". In short, - // anything which does not invoke a descent to evaluate but - // can instead be used to test a single node is acceptable. + // filter: + // CSS selector like ".foo" or "div > span" // returns: - // `dojo.NodeList` containing the orpahned elements - return (simpleFilter ? d._filterQueryResult(this, simpleFilter) : this).forEach(orphan); // dojo.NodeList + // `dojo.NodeList` containing the orphaned elements + return (filter ? d._filterQueryResult(this, filter) : this).forEach(orphan); // dojo.NodeList }, adopt: function(/*String||Array||DomNode*/ queryOrListOrNode, /*String?*/ position){ @@ -7863,7 +7884,7 @@ dojo.provide("dojo._base.NodeList"); // FIXME: do we need this? query: function(/*String*/ queryStr){ // summary: - // Returns a new list whose memebers match the passed query, + // Returns a new list whose members match the passed query, // assuming elements of the current NodeList as the root for // each search. // example: @@ -7874,9 +7895,9 @@ dojo.provide("dojo._base.NodeList"); // | </p> // | </div> // | <div id="bar"> - // | <p>great commedians may not be funny <span>in person</span></p> + // | <p>great comedians may not be funny <span>in person</span></p> // | </div> - // If we are presented with the following defintion for a NodeList: + // If we are presented with the following definition for a NodeList: // | var l = new dojo.NodeList(dojo.byId("foo"), dojo.byId("bar")); // it's possible to find all span elements under paragraphs // contained by these elements with this sub-query: @@ -7891,18 +7912,14 @@ dojo.provide("dojo._base.NodeList"); return this._wrap(apc.apply([], ret), this); // dojo.NodeList }, - filter: function(/*String|Function*/ simpleFilter){ + filter: function(/*String|Function*/ filter){ // summary: // "masks" the built-in javascript filter() method (supported // in Dojo via `dojo.filter`) to support passing a simple // string filter in addition to supporting filtering function // objects. - // simpleFilter: - // If a string, a single-expression CSS rule. For example, - // ".thinger" or "#someId[attrName='value']" but not "div > - // span". In short, anything which does not invoke a descent - // to evaluate but can instead be used to test a single node - // is acceptable. + // filter: + // If a string, a CSS rule like ".thinger" or "div > span". // example: // "regular" JS filter syntax as exposed in dojo.filter: // | dojo.query("*").filter(function(item){ @@ -7914,7 +7931,7 @@ dojo.provide("dojo._base.NodeList"); // | dojo.query("*").filter("p").styles("backgroundColor", "yellow"); var a = arguments, items = this, start = 0; - if(typeof simpleFilter == "string"){ // inline'd type check + if(typeof filter == "string"){ // inline'd type check items = d._filterQueryResult(this, a[0]); if(a.length == 1){ // if we only got a string query, pass back the filtered results @@ -7962,10 +7979,10 @@ dojo.provide("dojo._base.NodeList"); // | "before" // | "after" // | "replace" (replaces nodes in this NodeList with new content) - // | "only" (removes other children of the nodes so new content is hte only child) + // | "only" (removes other children of the nodes so new content is the only child) // or an offset in the childNodes property // example: - // appends content to the end if the position is ommitted + // appends content to the end if the position is omitted // | dojo.query("h3 > p").addContent("hey there!"); // example: // add something to the front of each element that has a @@ -7996,7 +8013,7 @@ dojo.provide("dojo._base.NodeList"); // text: "Send" // }); content = this._normalize(content, this[0]); - for(var i = 0, node; node = this[i]; i++){ + for(var i = 0, node; (node = this[i]); i++){ this._place(content, node, position, i > 0); } return this; //dojo.NodeList @@ -8025,11 +8042,11 @@ dojo.provide("dojo._base.NodeList"); // index: Integer... // One or more 0-based indices of items in the current // NodeList. A negative index will start at the end of the - // list and go backwards. + // list and go backwards. // // example: // Shorten the list to the first, second, and third elements - // | dojo.query("a").at(0, 1, 2).forEach(fn); + // | dojo.query("a").at(0, 1, 2).forEach(fn); // // example: // Retrieve the first and last elements of a unordered list: @@ -8039,13 +8056,13 @@ dojo.provide("dojo._base.NodeList"); // Do something for the first element only, but end() out back to // the original list and continue chaining: // | dojo.query("a").at(0).onclick(fn).end().forEach(function(n){ - // | console.log(n); // all anchors on the page. - // | }) + // | console.log(n); // all anchors on the page. + // | }) // // returns: // dojo.NodeList var t = new this._NodeListCtor(); - d.forEach(arguments, function(i){ + d.forEach(arguments, function(i){ if(i < 0){ i = this.length + i } if(this[i]){ t.push(this[i]); } }, this); @@ -8055,7 +8072,8 @@ dojo.provide("dojo._base.NodeList"); }); nl.events = [ - // summary: list of all DOM events used in NodeList + // summary: + // list of all DOM events used in NodeList "blur", "focus", "change", "click", "error", "keydown", "keypress", "keyup", "load", "mousedown", "mouseenter", "mouseleave", "mousemove", "mouseout", "mouseover", "mouseup", "submit" @@ -8068,7 +8086,7 @@ dojo.provide("dojo._base.NodeList"); var _oe = "on" + evt; nlp[_oe] = function(a, b){ return this.connect(_oe, a, b); - } + }; // FIXME: should these events trigger publishes? /* return (a ? this.connect(_oe, a, b) : @@ -8099,12 +8117,7 @@ dojo.provide("dojo._base.NodeList"); if(!dojo._hasResource["dojo._base.query"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. dojo._hasResource["dojo._base.query"] = true; -if(typeof dojo != "undefined"){ - dojo.provide("dojo._base.query"); - - - -} +(function(){ /* dojo.query() architectural overview: @@ -8138,7 +8151,7 @@ if(typeof dojo != "undefined"){ 5.) matched nodes are pruned to ensure they are unique (if necessary) */ -;(function(d){ +var defineQuery= function(d){ // define everything in a closure for compressability reasons. "d" is an // alias to "dojo" (or the toolkit alias object, e.g., "acme"). @@ -8146,7 +8159,7 @@ if(typeof dojo != "undefined"){ // Toolkit aliases //////////////////////////////////////////////////////////////////////// - // if you are extracing dojo.query for use in your own system, you will + // if you are extracting dojo.query for use in your own system, you will // need to provide these methods and properties. No other porting should be // necessary, save for configuring the system to use a class other than // dojo.NodeList as the return instance instantiator @@ -8157,7 +8170,7 @@ if(typeof dojo != "undefined"){ // d.isOpera; // float // d.isWebKit; // float // d.doc ; // document element - var qlc = d._NodeListCtor = d.NodeList; + var qlc = (d._NodeListCtor = d.NodeList); var getDoc = function(){ return d.doc; }; // NOTE(alex): the spec is idiotic. CSS queries should ALWAYS be case-sensitive, but nooooooo @@ -8188,7 +8201,7 @@ if(typeof dojo != "undefined"){ //////////////////////////////////////////////////////////////////////// var getQueryParts = function(query){ - // summary: + // summary: // state machine for query tokenization // description: // instead of using a brittle and slow regex-based CSS parser, @@ -8197,16 +8210,16 @@ if(typeof dojo != "undefined"){ // the same query run multiple times or under different root nodes // does not re-parse the selector expression but instead uses the // cached data structure. The state machine implemented here - // terminates on the last " " (space) charachter and returns an + // terminates on the last " " (space) character and returns an // ordered array of query component structures (or "parts"). Each // part represents an operator or a simple CSS filtering // expression. The structure for parts is documented in the code // below. - // NOTE: + // NOTE: // this code is designed to run fast and compress well. Sacrifices - // to readibility and maintainability have been made. Your best + // to readability and maintainability have been made. Your best // bet when hacking the tokenizer is to put The Donnas on *really* // loud (may we recommend their "Spend The Night" release?) and // just assume you're gonna make mistakes. Keep the unit tests @@ -8222,7 +8235,7 @@ if(typeof dojo != "undefined"){ } var ts = function(/*Integer*/ s, /*Integer*/ e){ - // trim and slice. + // trim and slice. // take an index to start a string slice from and an end position // and return a trimmed copy of that sub-string @@ -8230,12 +8243,12 @@ if(typeof dojo != "undefined"){ } // the overall data graph of the full query, as represented by queryPart objects - var queryParts = []; + var queryParts = []; // state keeping vars - var inBrackets = -1, inParens = -1, inMatchFor = -1, - inPseudo = -1, inClass = -1, inId = -1, inTag = -1, + var inBrackets = -1, inParens = -1, inMatchFor = -1, + inPseudo = -1, inClass = -1, inId = -1, inTag = -1, lc = "", cc = "", pStart; // iteration vars @@ -8244,7 +8257,7 @@ if(typeof dojo != "undefined"){ currentPart = null, // data structure representing the entire clause _cp = null; // the current pseudo or attr matcher - // several temporary variables are assigned to this structure durring a + // several temporary variables are assigned to this structure during a // potential sub-expression match: // attr: // a string representing the current full attribute match in a @@ -8299,9 +8312,9 @@ if(typeof dojo != "undefined"){ // needs to do any iteration. Many simple selectors don't, and // we can avoid significant construction-time work by advising // the system to skip them - currentPart.loops = ( - currentPart.pseudos.length || - currentPart.attrs.length || + currentPart.loops = ( + currentPart.pseudos.length || + currentPart.attrs.length || currentPart.classes.length ); currentPart.oquery = currentPart.query = ts(pStart, x); // save the full expression as a string @@ -8331,9 +8344,9 @@ if(typeof dojo != "undefined"){ currentPart.infixOper = queryParts.pop(); currentPart.query = currentPart.infixOper.query + " " + currentPart.query; /* - console.debug( "swapping out the infix", - currentPart.infixOper, - "and attaching it to", + console.debug( "swapping out the infix", + currentPart.infixOper, + "and attaching it to", currentPart); */ } @@ -8342,15 +8355,15 @@ if(typeof dojo != "undefined"){ currentPart = null; } - // iterate over the query, charachter by charachter, building up a + // iterate over the query, character by character, building up a // list of query part objects for(; lc=cc, cc=query.charAt(x), x < ql; x++){ // cc: the current character in the match - // lc: the last charachter (if any) + // lc: the last character (if any) // someone is trying to escape something, so don't try to match any // fragments. We assume we're inside a literal. - if(lc == "\\"){ continue; } + if(lc == "\\"){ continue; } if(!currentPart){ // a part was just ended or none has yet been created // NOTE: I hate all this alloc, but it's shorter than writing tons of if's pStart = x; @@ -8393,7 +8406,7 @@ if(typeof dojo != "undefined"){ // the beginning of a match, which should be a tag name. This // might fault a little later on, but we detect that and this // iteration will still be fine. - inTag = x; + inTag = x; } if(inBrackets >= 0){ @@ -8401,7 +8414,7 @@ if(typeof dojo != "undefined"){ if(cc == "]"){ // if we're in a [...] clause and we end, do assignment if(!_cp.attr){ // no attribute match was previously begun, so we - // assume this is an attribute existance match in the + // assume this is an attribute existence match in the // form of [someAttributeName] _cp.attr = ts(inBrackets+1, x); }else{ @@ -8412,19 +8425,19 @@ if(typeof dojo != "undefined"){ var cmf = _cp.matchFor; if(cmf){ // try to strip quotes from the matchFor value. We want - // [attrName=howdy] to match the same + // [attrName=howdy] to match the same // as [attrName = 'howdy' ] if( (cmf.charAt(0) == '"') || (cmf.charAt(0) == "'") ){ _cp.matchFor = cmf.slice(1, -1); } } - // end the attribute by adding it to the list of attributes. + // end the attribute by adding it to the list of attributes. currentPart.attrs.push(_cp); _cp = null; // necessary? inBrackets = inMatchFor = -1; }else if(cc == "="){ // if the last char was an operator prefix, make sure we - // record it along with the "=" operator. + // record it along with the "=" operator. var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : ""; _cp.type = addToCc+cc; _cp.attr = ts(inBrackets+1, x-addToCc.length); @@ -8433,7 +8446,7 @@ if(typeof dojo != "undefined"){ // now look for other clause parts }else if(inParens >= 0){ // if we're in a parenthetical expression, we need to figure - // out if it's attached to a pseduo-selector rule like + // out if it's attached to a pseudo-selector rule like // :nth-child(1) if(cc == ")"){ if(inPseudo >= 0){ @@ -8454,7 +8467,7 @@ if(typeof dojo != "undefined"){ endAll(); inPseudo = x; }else if(cc == "["){ - // start of an attribute match. + // start of an attribute match. endAll(); inBrackets = x; // provide a new structure for the attribute match to fill-in @@ -8468,15 +8481,15 @@ if(typeof dojo != "undefined"){ // expression if we're already inside a pseudo-selector match if(inPseudo >= 0){ // provide a new structure for the pseudo match to fill-in - _cp = { - name: ts(inPseudo+1, x), + _cp = { + name: ts(inPseudo+1, x), value: null } currentPart.pseudos.push(_cp); } inParens = x; }else if( - (cc == " ") && + (cc == " ") && // if it's a space char and the last char is too, consume the // current one without doing more work (lc != cc) @@ -8496,7 +8509,7 @@ if(typeof dojo != "undefined"){ // the basic building block of the yes/no chaining system. agree(f1, // f2) generates a new function which returns the boolean results of // both of the passed functions to a single logical-anded result. If - // either are not possed, the other is used exclusively. + // either are not passed, the other is used exclusively. if(!first){ return second; } if(!second){ return first; } @@ -8548,7 +8561,7 @@ if(typeof dojo != "undefined"){ } }, "$=": function(attr, value){ - // E[foo$="bar"] + // E[foo$="bar"] // an E element whose "foo" attribute value ends exactly // with the string "bar" var tval = " "+value; @@ -8558,7 +8571,7 @@ if(typeof dojo != "undefined"){ } }, "~=": function(attr, value){ - // E[foo~="bar"] + // E[foo~="bar"] // an E element whose "foo" attribute value is a list of // space-separated values, one of which is exactly equal // to "bar" @@ -8624,7 +8637,7 @@ if(typeof dojo != "undefined"){ if(!tret){ return -1; } var l = tret.length; - // we calcuate the parent length as a cheap way to invalidate the + // we calculate the parent length as a cheap way to invalidate the // cache. It's not 100% accurate, but it's much more honest than what // other libraries do if( cl == l && ci >= 0 && cl >= 0 ){ @@ -8636,11 +8649,11 @@ if(typeof dojo != "undefined"){ root["_l"] = l; ci = -1; for(var te = root["firstElementChild"]||root["firstChild"]; te; te = te[_ns]){ - if(_simpleNodeTest(te)){ + if(_simpleNodeTest(te)){ te["_i"] = ++i; - if(node === te){ + if(node === te){ // NOTE: - // shortcuting the return at this step in indexing works + // shortcutting the return at this step in indexing works // very well for benchmarking but we avoid it here since // it leads to potential O(n^2) behavior in sequential // getNodexIndex operations on a previously un-indexed @@ -8671,7 +8684,7 @@ if(typeof dojo != "undefined"){ "first-child": function(){ return _lookLeft; }, "last-child": function(){ return _lookRight; }, "only-child": function(name, condition){ - return function(node){ + return function(node){ if(!_lookLeft(node)){ return false; } if(!_lookRight(node)){ return false; } return true; @@ -8702,7 +8715,7 @@ if(typeof dojo != "undefined"){ }, "not": function(name, condition){ var p = getQueryParts(condition)[0]; - var ignores = { el: 1 }; + var ignores = { el: 1 }; if(p.tag != "*"){ ignores.tag = 1; } @@ -8762,7 +8775,7 @@ if(typeof dojo != "undefined"){ } }; - var defaultGetter = (d.isIE) ? function(cond){ + var defaultGetter = (d.isIE < 9 || (dojo.isIE && dojo.isQuirks)) ? function(cond){ var clc = cond.toLowerCase(); if(clc == "class"){ cond = "className"; } return function(elem){ @@ -8776,7 +8789,7 @@ if(typeof dojo != "undefined"){ var getSimpleFilterFunc = function(query, ignores){ // generates a node tester function based on the passed query part. The - // query part is one of the structures generatd by the query parser + // query part is one of the structures generated by the query parser // when it creates the query AST. The "ignores" object specifies which // (if any) tests to skip, allowing the system to avoid duplicating // work where it may have already been taken into account by other @@ -8807,7 +8820,7 @@ if(typeof dojo != "undefined"){ if(isWildcard){ cname = cname.substr(0, cname.length-1); } - // I dislike the regex thing, even if memozied in a cache, but it's VERY short + // I dislike the regex thing, even if memoized in a cache, but it's VERY short var re = new RegExp("(?:^|\\s)" + cname + (isWildcard ? ".*" : "") + "(?:\\s|$)"); */ var re = new RegExp("(?:^|\\s)" + cname + "(?:\\s|$)"); @@ -8845,7 +8858,7 @@ if(typeof dojo != "undefined"){ if(!("id" in ignores)){ if(query.id){ - ff = agree(ff, function(elem){ + ff = agree(ff, function(elem){ return (!!elem && (elem.id == query.id)); }); } @@ -8853,7 +8866,7 @@ if(typeof dojo != "undefined"){ if(!ff){ if(!("default" in ignores)){ - ff = yesman; + ff = yesman; } } return ff; @@ -8904,7 +8917,7 @@ if(typeof dojo != "undefined"){ _simpleNodeTest(te) && (!bag || _isUnique(te, bag)) && (filterFunc(te, x)) - ){ + ){ ret.push(te); } } @@ -8946,7 +8959,7 @@ if(typeof dojo != "undefined"){ // filters them. The search may be specialized by infix operators // (">", "~", or "+") else it will default to searching all // descendants (the " " selector). Once a group of children is - // founde, a test function is applied to weed out the ones we + // found, a test function is applied to weed out the ones we // don't want. Many common cases can be fast-pathed. We spend a // lot of cycles to create a dispatcher that doesn't do more work // than necessary at any point since, unlike this function, the @@ -8999,7 +9012,7 @@ if(typeof dojo != "undefined"){ var filterFunc = getSimpleFilterFunc(query, { el: 1 }); var qt = query.tag; var wildcardTag = ("*" == qt); - var ecs = getDoc()["getElementsByClassName"]; + var ecs = getDoc()["getElementsByClassName"]; if(!oper){ // if there's no infix operator, then it's a descendant query. ID @@ -9009,8 +9022,8 @@ if(typeof dojo != "undefined"){ // testing shows that the overhead of yesman() is acceptable // and can save us some bytes vs. re-defining the function // everywhere. - filterFunc = (!query.loops && wildcardTag) ? - yesman : + filterFunc = (!query.loops && wildcardTag) ? + yesman : getSimpleFilterFunc(query, { el: 1, id: 1 }); retFunc = function(root, arr){ @@ -9025,9 +9038,9 @@ if(typeof dojo != "undefined"){ } } }else if( - ecs && + ecs && // isAlien check. Workaround for Prototype.js being totally evil/dumb. - /\{\s*\[native code\]\s*\}/.test(String(ecs)) && + /\{\s*\[native code\]\s*\}/.test(String(ecs)) && query.classes.length && !cssCaseBug ){ @@ -9193,8 +9206,8 @@ if(typeof dojo != "undefined"){ // We need te detect the right "internal" webkit version to make this work. var wk = "WebKit/"; var is525 = ( - d.isWebKit && - (nua.indexOf(wk) > 0) && + d.isWebKit && + (nua.indexOf(wk) > 0) && (parseFloat(nua.split(wk)[1]) > 528) ); @@ -9205,7 +9218,7 @@ if(typeof dojo != "undefined"){ var qsa = "querySelectorAll"; var qsaAvail = ( - !!getDoc()[qsa] && + !!getDoc()[qsa] && // see #5832 (!d.isSafari || (d.isSafari > 3.1) || is525 ) ); @@ -9234,7 +9247,7 @@ if(typeof dojo != "undefined"){ var domCached = _queryFuncCacheDOM[query]; if(domCached){ return domCached; } - // TODO: + // TODO: // today we're caching DOM and QSA branches separately so we // recalc useQSA every time. If we had a way to tag root+query // efficiently, we'd be in good shape to do a global cache. @@ -9248,11 +9261,11 @@ if(typeof dojo != "undefined"){ forceDOM = true; } - var useQSA = ( + var useQSA = ( qsaAvail && (!forceDOM) && // as per CSS 3, we can't currently start w/ combinator: // http://www.w3.org/TR/css3-selectors/#w3cselgrammar - (specials.indexOf(qcz) == -1) && + (specials.indexOf(qcz) == -1) && // IE's QSA impl sucks on pseudos (!d.isIE || (query.indexOf(":") == -1)) && @@ -9265,11 +9278,11 @@ if(typeof dojo != "undefined"){ // elements, even though according to spec, selected options should // match :checked. So go nonQSA for it: // http://bugs.dojotoolkit.org/ticket/5179 - (query.indexOf(":contains") == -1) && (query.indexOf(":checked") == -1) && + (query.indexOf(":contains") == -1) && (query.indexOf(":checked") == -1) && (query.indexOf("|=") == -1) // some browsers don't grok it ); - // TODO: + // TODO: // if we've got a descendant query (e.g., "> .thinger" instead of // just ".thinger") in a QSA-able doc, but are passed a child as a // root, it should be possible to give the item a synthetic ID and @@ -9278,7 +9291,7 @@ if(typeof dojo != "undefined"){ if(useQSA){ - var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ? + var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ? (query + " *") : query; return _queryFuncCacheQSA[query] = function(root){ try{ @@ -9305,9 +9318,9 @@ if(typeof dojo != "undefined"){ }else{ // DOM branch var parts = query.split(/\s*,\s*/); - return _queryFuncCacheDOM[query] = ((parts.length < 2) ? + return _queryFuncCacheDOM[query] = ((parts.length < 2) ? // if not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher - getStepQueryFunc(query) : + getStepQueryFunc(query) : // if it *is* a complex query, break it up into its // constituent parts and return a dispatcher that will // merge the parts when run @@ -9337,7 +9350,7 @@ if(typeof dojo != "undefined"){ }else{ return node.uniqueID; } - } : + } : function(node){ return (node._uid || (node._uid = ++_zipIdx)); }; @@ -9346,7 +9359,7 @@ if(typeof dojo != "undefined"){ // to flatten a list of unique items, but rather just tell if the item in // question is already in the bag. Normally we'd just use hash lookup to do // this for us but IE's DOM is busted so we can't really count on that. On - // the upside, it gives us a built in unique ID function. + // the upside, it gives us a built in unique ID function. var _isUnique = function(node, bag){ if(!bag){ return 1; } var id = _nodeUID(node); @@ -9358,7 +9371,7 @@ if(typeof dojo != "undefined"){ // returning a list of "uniques", hopefully in doucment order var _zipIdxName = "_zipIdx"; var _zip = function(arr){ - if(arr && arr.nozip){ + if(arr && arr.nozip){ return (qlc._wrap) ? qlc._wrap(arr) : arr; } // var ret = new d._NodeListCtor(); @@ -9377,7 +9390,7 @@ if(typeof dojo != "undefined"){ var szidx = _zipIdx+""; arr[0].setAttribute(_zipIdxName, szidx); for(var x = 1, te; te = arr[x]; x++){ - if(arr[x].getAttribute(_zipIdxName) != szidx){ + if(arr[x].getAttribute(_zipIdxName) != szidx){ ret.push(te); } te.setAttribute(_zipIdxName, szidx); @@ -9385,7 +9398,7 @@ if(typeof dojo != "undefined"){ }else if(d.isIE && arr.commentStrip){ try{ for(var x = 1, te; te = arr[x]; x++){ - if(_isElement(te)){ + if(_isElement(te)){ ret.push(te); } } @@ -9393,7 +9406,7 @@ if(typeof dojo != "undefined"){ }else{ if(arr[0]){ arr[0][_zipIdxName] = _zipIdx; } for(var x = 1, te; te = arr[x]; x++){ - if(arr[x][_zipIdxName] != _zipIdx){ + if(arr[x][_zipIdxName] != _zipIdx){ ret.push(te); } te[_zipIdxName] = _zipIdx; @@ -9423,11 +9436,11 @@ if(typeof dojo != "undefined"){ // * class selectors (e.g., `.foo`) // * node type selectors like `span` // * ` ` descendant selectors - // * `>` child element selectors + // * `>` child element selectors // * `#foo` style ID selectors // * `*` universal selector - // * `~`, the immediately preceeded-by sibling selector - // * `+`, the preceeded-by sibling selector + // * `~`, the preceded-by sibling selector + // * `+`, the immediately preceded-by sibling selector // * attribute queries: // | * `[foo]` attribute presence selector // | * `[foo='bar']` attribute value exact match @@ -9448,14 +9461,14 @@ if(typeof dojo != "undefined"){ // palette of selectors and when combined with functions for // manipulation presented by dojo.NodeList, many types of DOM // manipulation operations become very straightforward. - // + // // Unsupported Selectors: // ---------------------- // // While dojo.query handles many CSS3 selectors, some fall outside of - // what's resaonable for a programmatic node querying engine to + // what's reasonable for a programmatic node querying engine to // handle. Currently unsupported selectors include: - // + // // * namespace-differentiated selectors of any form // * all `::` pseduo-element selectors // * certain pseduo-selectors which don't get a lot of day-to-day use: @@ -9464,10 +9477,10 @@ if(typeof dojo != "undefined"){ // | * `:root`, `:active`, `:hover`, `:visisted`, `:link`, // `:enabled`, `:disabled` // * `:*-of-type` pseudo selectors - // + // // dojo.query and XML Documents: // ----------------------------- - // + // // `dojo.query` (as of dojo 1.2) supports searching XML documents // in a case-sensitive manner. If an HTML document is served with // a doctype that forces case-sensitivity (e.g., XHTML 1.1 @@ -9577,12 +9590,12 @@ if(typeof dojo != "undefined"){ // NOTE: // Opera in XHTML mode doesn't detect case-sensitivity correctly // and it's not clear that there's any way to test for it - caseSensitive = (root.contentType && root.contentType=="application/xml") || + caseSensitive = (root.contentType && root.contentType=="application/xml") || (d.isOpera && (root.doctype || od.toString() == "[object XMLDocument]")) || - (!!od) && + (!!od) && (d.isIE ? od.xml : (root.xmlVersion||od.xmlVersion)); - // NOTE: + // NOTE: // adding "true" as the 2nd argument to getQueryFunc is useful for // testing the DOM branch without worrying about the // behavior/performance of the QSA branch. @@ -9599,16 +9612,98 @@ if(typeof dojo != "undefined"){ // FIXME: need to add infrastructure for post-filtering pseudos, ala :last d.query.pseudos = pseudos; - // one-off function for filtering a NodeList based on a simple selector - d._filterQueryResult = function(nodeList, simpleFilter){ - var tmpNodeList = new d._NodeListCtor(); - var filterFunc = getSimpleFilterFunc(getQueryParts(simpleFilter)[0]); + // function for filtering a NodeList based on a selector, optimized for simple selectors + d._filterQueryResult = function(/*NodeList*/ nodeList, /*String*/ filter, /*String|DOMNode?*/ root){ + var tmpNodeList = new d._NodeListCtor(), + parts = getQueryParts(filter), + filterFunc = + (parts.length == 1 && !/[^\w#\.]/.test(filter)) ? + getSimpleFilterFunc(parts[0]) : + function(node) { + return dojo.query(filter, root).indexOf(node) != -1; + }; for(var x = 0, te; te = nodeList[x]; x++){ if(filterFunc(te)){ tmpNodeList.push(te); } } return tmpNodeList; } -})(this["queryPortability"]||this["acme"]||dojo); +};//end defineQuery + +var defineAcme= function(){ + // a self-sufficient query impl + acme = { + trim: function(/*String*/ str){ + // summary: + // trims whitespaces from both sides of the string + str = str.replace(/^\s+/, ''); + for(var i = str.length - 1; i >= 0; i--){ + if(/\S/.test(str.charAt(i))){ + str = str.substring(0, i + 1); + break; + } + } + return str; // String + }, + forEach: function(/*String*/ arr, /*Function*/ callback, /*Object?*/ thisObject){ + // summary: + // an iterator function that passes items, indexes, + // and the array to a callback + if(!arr || !arr.length){ return; } + for(var i=0,l=arr.length; i<l; ++i){ + callback.call(thisObject||window, arr[i], i, arr); + } + }, + byId: function(id, doc){ + // summary: + // a function that return an element by ID, but also + // accepts nodes safely + if(typeof id == "string"){ + return (doc||document).getElementById(id); // DomNode + }else{ + return id; // DomNode + } + }, + // the default document to search + doc: document, + // the constructor for node list objects returned from query() + NodeList: Array + }; + + // define acme.isIE, acme.isSafari, acme.isOpera, etc. + var n = navigator; + var dua = n.userAgent; + var dav = n.appVersion; + var tv = parseFloat(dav); + acme.isOpera = (dua.indexOf("Opera") >= 0) ? tv: undefined; + acme.isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : undefined; + acme.isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined; + acme.isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined; + var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0); + if(index && !acme.isChrome){ + acme.isSafari = parseFloat(dav.split("Version/")[1]); + if(!acme.isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){ + acme.isSafari = 2; + } + } + if(document.all && !acme.isOpera){ + acme.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined; + } + + Array._wrap = function(arr){ return arr; }; + return acme; +}; + + //prefers queryPortability, then acme, then dojo + if(this["dojo"]){ + dojo.provide("dojo._base.query"); + + + defineQuery(this["queryPortability"]||this["acme"]||dojo); + }else{ + defineQuery(this["queryPortability"]||this["acme"]||defineAcme()); + } + +})(); /* */ @@ -9623,6 +9718,7 @@ dojo.provide("dojo._base.xhr"); + (function(){ var _d = dojo, cfg = _d.config; @@ -9663,7 +9759,7 @@ dojo.provide("dojo._base.xhr"); var type = (item.type||"").toLowerCase(); if(_in && type && !item.disabled){ if(type == "radio" || type == "checkbox"){ - if(item.checked){ ret = item.value } + if(item.checked){ ret = item.value; } }else if(item.multiple){ ret = []; _d.query("option", item).forEach(function(opt){ @@ -9677,7 +9773,7 @@ dojo.provide("dojo._base.xhr"); } } return ret; // Object - } + }; dojo.formToObject = function(/*DOMNode||String*/ formNode){ // summary: @@ -9704,7 +9800,7 @@ dojo.provide("dojo._base.xhr"); // yields this object structure as the result of a call to // formToObject(): // - // | { + // | { // | blah: "blah", // | multi: [ // | "thud", @@ -9725,7 +9821,7 @@ dojo.provide("dojo._base.xhr"); } }); return ret; // Object - } + }; dojo.objectToQuery = function(/*Object*/ map){ // summary: @@ -9734,7 +9830,7 @@ dojo.provide("dojo._base.xhr"); // example: // this object: // - // | { + // | { // | blah: "blah", // | multi: [ // | "thud", @@ -9743,7 +9839,7 @@ dojo.provide("dojo._base.xhr"); // | }; // // yields the following query string: - // + // // | "blah=blah&multi=thud&multi=thonk" // FIXME: need to implement encodeAscii!! @@ -9764,21 +9860,21 @@ dojo.provide("dojo._base.xhr"); } } return pairs.join("&"); // String - } + }; dojo.formToQuery = function(/*DOMNode||String*/ formNode){ // summary: // Returns a URL-encoded string representing the form passed as either a // node or string ID identifying the form to serialize return _d.objectToQuery(_d.formToObject(formNode)); // String - } + }; dojo.formToJson = function(/*DOMNode||String*/ formNode, /*Boolean?*/prettyPrint){ // summary: // Create a serialized JSON string from a form node or string // ID identifying the form to serialize return _d.toJson(_d.formToObject(formNode), prettyPrint); // String - } + }; dojo.queryToObject = function(/*String*/ str){ // summary: @@ -9789,7 +9885,7 @@ dojo.provide("dojo._base.xhr"); // This string: // // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&" - // + // // results in this object structure: // // | { @@ -9797,7 +9893,7 @@ dojo.provide("dojo._base.xhr"); // | thinger: " spaces =blah", // | zonk: "blarg" // | } - // + // // Note that spaces and other urlencoded entities are correctly // handled. @@ -9822,7 +9918,7 @@ dojo.provide("dojo._base.xhr"); } }); return ret; // Object - } + }; // need to block async callbacks from snatching this thread as the result // of an async callback might call another sync XHR, this hangs khtml forever @@ -9832,7 +9928,7 @@ dojo.provide("dojo._base.xhr"); // MOW: remove dojo._contentHandlers alias in 2.0 var handlers = _d._contentHandlers = dojo.contentHandlers = { - // summary: + // summary: // A map of availble XHR transport handle types. Name matches the // `handleAs` attribute passed to XHR calls. // @@ -9840,41 +9936,41 @@ dojo.provide("dojo._base.xhr"); // A map of availble XHR transport handle types. Name matches the // `handleAs` attribute passed to XHR calls. Each contentHandler is // called, passing the xhr object for manipulation. The return value - // from the contentHandler will be passed to the `load` or `handle` - // functions defined in the original xhr call. - // + // from the contentHandler will be passed to the `load` or `handle` + // functions defined in the original xhr call. + // // example: // Creating a custom content-handler: // | dojo.contentHandlers.makeCaps = function(xhr){ // | return xhr.responseText.toUpperCase(); // | } // | // and later: - // | dojo.xhrGet({ + // | dojo.xhrGet({ // | url:"foo.txt", // | handleAs:"makeCaps", // | load: function(data){ /* data is a toUpper version of foo.txt */ } // | }); - text: function(xhr){ + text: function(xhr){ // summary: A contentHandler which simply returns the plaintext response data - return xhr.responseText; + return xhr.responseText; }, json: function(xhr){ // summary: A contentHandler which returns a JavaScript object created from the response data return _d.fromJson(xhr.responseText || null); }, - "json-comment-filtered": function(xhr){ - // summary: A contentHandler which expects comment-filtered JSON. - // description: - // A contentHandler which expects comment-filtered JSON. + "json-comment-filtered": function(xhr){ + // summary: A contentHandler which expects comment-filtered JSON. + // description: + // A contentHandler which expects comment-filtered JSON. // the json-comment-filtered option was implemented to prevent // "JavaScript Hijacking", but it is less secure than standard JSON. Use // standard JSON instead. JSON prefixing can be used to subvert hijacking. - // + // // Will throw a notice suggesting to use application/json mimetype, as // json-commenting can introduce security issues. To decrease the chances of hijacking, - // use the standard `json` contentHandler, and prefix your "JSON" with: {}&& - // + // use the standard `json` contentHandler, and prefix your "JSON" with: {}&& + // // use djConfig.useCommentedJson = true to turn off the notice if(!dojo.config.useCommentedJson){ console.warn("Consider using the standard mimetype:application/json." @@ -9892,7 +9988,7 @@ dojo.provide("dojo._base.xhr"); } return _d.fromJson(value.substring(cStartIdx+2, cEndIdx)); }, - javascript: function(xhr){ + javascript: function(xhr){ // summary: A contentHandler which evaluates the response data, expecting it to be valid JavaScript // FIXME: try Moz and IE specific eval variants? @@ -9904,7 +10000,7 @@ dojo.provide("dojo._base.xhr"); if(_d.isIE && (!result || !result.documentElement)){ //WARNING: this branch used by the xml handling in dojo.io.iframe, //so be sure to test dojo.io.iframe if making changes below. - var ms = function(n){ return "MSXML" + n + ".DOMDocument"; } + var ms = function(n){ return "MSXML" + n + ".DOMDocument"; }; var dp = ["Microsoft.XMLDOM", ms(6), ms(4), ms(3), ms(2)]; _d.some(dp, function(p){ try{ @@ -9919,7 +10015,7 @@ dojo.provide("dojo._base.xhr"); return result; // DOMDocument }, "json-comment-optional": function(xhr){ - // summary: A contentHandler which checks the presence of comment-filtered JSON and + // summary: A contentHandler which checks the presence of comment-filtered JSON and // alternates between the `json` and `json-comment-filtered` contentHandlers. if(xhr.responseText && /^[^{\[]*\/\*/.test(xhr.responseText)){ return handlers["json-comment-filtered"](xhr); @@ -9951,7 +10047,7 @@ dojo.provide("dojo._base.xhr"); // handleAs: String? // Acceptable values depend on the type of IO // transport (see specific IO calls for more information). - // rawBody: String? + // rawBody: String? // Sets the raw body for an HTTP request. If this is used, then the content // property is ignored. This is mostly useful for HTTP methods that have // a body to their requests, like PUT or POST. This property can be used instead @@ -10096,7 +10192,7 @@ dojo.provide("dojo._base.xhr"); /*Function*/canceller, /*Function*/okHandler, /*Function*/errHandler){ - // summary: + // summary: // sets up the Deferred and ioArgs property on the Deferred so it // can be used in an io call. // args: @@ -10112,19 +10208,19 @@ dojo.provide("dojo._base.xhr"); // object returned from this function. // errHandler: // The first error callback to be registered with Deferred. It has the opportunity - // to do cleanup on an error. It will receive two arguments: error (the + // to do cleanup on an error. It will receive two arguments: error (the // Error object) and dfd, the Deferred object returned from this function. var ioArgs = {args: args, url: args.url}; //Get values from form if requestd. var formObject = null; - if(args.form){ + if(args.form){ var form = _d.byId(args.form); - //IE requires going through getAttributeNode instead of just getAttribute in some form cases, + //IE requires going through getAttributeNode instead of just getAttribute in some form cases, //so use it for all. See #2844 var actnNode = form.getAttributeNode("action"); - ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null); + ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null); formObject = _d.formToObject(form); } @@ -10197,7 +10293,7 @@ dojo.provide("dojo._base.xhr"); // FIXME: need to wire up the xhr object's abort method to something // analagous in the Deferred return d; - } + }; var _deferredCancel = function(/*Deferred*/dfd){ // summary: canceller function for dojo._ioSetArgs call. @@ -10214,13 +10310,13 @@ dojo.provide("dojo._base.xhr"); err.dojoType="cancel"; } return err; - } + }; var _deferredOk = function(/*Deferred*/dfd){ // summary: okHandler function for dojo._ioSetArgs call. var ret = handlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr); return ret === undefined ? null : ret; - } + }; var _deferError = function(/*Error*/error, /*Deferred*/dfd){ // summary: errHandler function for dojo._ioSetArgs call. @@ -10228,7 +10324,7 @@ dojo.provide("dojo._base.xhr"); console.error(error); } return error; - } + }; // avoid setting a timer per request. It degrades performance on IE // something fierece if we don't use unified loops. @@ -10252,7 +10348,7 @@ dojo.provide("dojo._base.xhr"); }; var _watchInFlight = function(){ - //summary: + //summary: // internal method that checks each inflight XMLHttpRequest to see // if it has completed or if the timeout situation applies. @@ -10267,7 +10363,7 @@ dojo.provide("dojo._base.xhr"); var dfd = tif.dfd; var func = function(){ if(!dfd || dfd.canceled || !tif.validCheck(dfd)){ - _inFlight.splice(i--, 1); + _inFlight.splice(i--, 1); _pubCount -= 1; }else if(tif.ioCheck(dfd)){ _inFlight.splice(i--, 1); @@ -10305,7 +10401,7 @@ dojo.provide("dojo._base.xhr"); _inFlightIntvl = null; return; } - } + }; dojo._ioCancelAll = function(){ //summary: Cancels all pending IO requests, regardless of IO type @@ -10317,7 +10413,7 @@ dojo.provide("dojo._base.xhr"); }catch(e){/*squelch*/} }); }catch(e){/*squelch*/} - } + }; //Automatically call cancel all io calls on unload //in IE for trac issue #2357. @@ -10340,10 +10436,10 @@ dojo.provide("dojo._base.xhr"); _pubCount += 1; _d.publish("/dojo/io/send", [dfd]); } - } + }; _d._ioWatch = function(dfd, validCheck, ioCheck, resHandle){ - // summary: + // summary: // Watches the io request represented by dfd to see if it completes. // dfd: Deferred // The Deferred object to watch. @@ -10373,16 +10469,16 @@ dojo.provide("dojo._base.xhr"); if(args.sync){ _watchInFlight(); } - } + }; var _defaultContentType = "application/x-www-form-urlencoded"; var _validCheck = function(/*Deferred*/dfd){ return dfd.ioArgs.xhr.readyState; //boolean - } + }; var _ioCheck = function(/*Deferred*/dfd){ return 4 == dfd.ioArgs.xhr.readyState; //boolean - } + }; var _resHandle = function(/*Deferred*/dfd){ var xhr = dfd.ioArgs.xhr; if(_d._isDocumentOk(xhr)){ @@ -10393,7 +10489,7 @@ dojo.provide("dojo._base.xhr"); err.responseText = xhr.responseText; dfd.errback(err); } - } + }; dojo._ioAddQueryToUrl = function(/*dojo.__IoCallbackArgs*/ioArgs){ //summary: Adds query params discovered by the io deferred construction to the URL. @@ -10401,8 +10497,8 @@ dojo.provide("dojo._base.xhr"); if(ioArgs.query.length){ ioArgs.url += (ioArgs.url.indexOf("?") == -1 ? "?" : "&") + ioArgs.query; ioArgs.query = null; - } - } + } + }; /*===== dojo.declare("dojo.__XhrArgs", dojo.__IoArgs, { @@ -10503,13 +10599,13 @@ dojo.provide("dojo._base.xhr"); _d._ioWatch(dfd, _validCheck, _ioCheck, _resHandle); xhr = null; return dfd; // dojo.Deferred - } + }; dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){ - // summary: + // summary: // Sends an HTTP GET request to the server. return _d.xhr("GET", args); // dojo.Deferred - } + }; dojo.rawXhrPost = dojo.xhrPost = function(/*dojo.__XhrArgs*/ args){ // summary: @@ -10518,7 +10614,7 @@ dojo.provide("dojo._base.xhr"); // postData: // String. Send raw data in the body of the POST request. return _d.xhr("POST", args, true); // dojo.Deferred - } + }; dojo.rawXhrPut = dojo.xhrPut = function(/*dojo.__XhrArgs*/ args){ // summary: @@ -10527,13 +10623,13 @@ dojo.provide("dojo._base.xhr"); // putData: // String. Send raw data in the body of the PUT request. return _d.xhr("PUT", args, true); // dojo.Deferred - } + }; dojo.xhrDelete = function(/*dojo.__XhrArgs*/ args){ // summary: // Sends an HTTP DELETE request to the server. return _d.xhr("DELETE", args); //dojo.Deferred - } + }; /* dojo.wrapForm = function(formNode){ @@ -10558,6 +10654,7 @@ dojo.provide("dojo._base.fx"); + /* Animation loosely package based on Dan Pupius' work, contributed under CLA: http://pupius.co.uk/js/Toolkit.Drawing.js @@ -11225,14 +11322,29 @@ dojo.provide("dojo._base.browser"); + //Need this to be the last code segment in base, so do not place any + //dojo/requireIf calls in this file/ Otherwise, due to how the build system + //puts all requireIf dependencies after the current file, the require calls + //could be called before all of base is defined/ + dojo.forEach(dojo.config.require, function(i){ + dojo["require"](i); + }); + +} + +if(!dojo._hasResource["dojo._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base"] = true; +dojo.provide("dojo._base"); + + + + + + + + + -//Need this to be the last code segment in base, so do not place any -//dojo.requireIf calls in this file. Otherwise, due to how the build system -//puts all requireIf dependencies after the current file, the require calls -//could be called before all of base is defined. -dojo.forEach(dojo.config.require, function(i){ - dojo["require"](i); -}); } |