15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Available via Academic Free License >= 2.1 OR the modified BSD license. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) see: http://dojotoolkit.org/license for details 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/ 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) This is an optimized version of Dojo, built for deployment and not for 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) development. To get sources and documentation, please visit: 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) http://dojotoolkit.org 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/ 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles);(function(){ 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /* 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo, dijit, and dojox must always be the first three, and in that order. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) djConfig.scopeMap = [ 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ["dojo", "fojo"], 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ["dijit", "fijit"], 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ["dojox", "fojox"] 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ] 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /**Build will replace this comment with a scoped djConfig **/ 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //The null below can be relaced by a build-time value used instead of djConfig.scopeMap. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var sMap = null; 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //See if new scopes need to be defined. 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if((sMap || (typeof djConfig != "undefined" && djConfig.scopeMap)) && (typeof window != "undefined")){ 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scopeDef = "", scopePrefix = "", scopeSuffix = "", scopeMap = {}, scopeMapRev = {}; 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sMap = sMap || djConfig.scopeMap; 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = 0; i < sMap.length; i++){ 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Make local variables, then global variables that use the locals. 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var newScope = sMap[i]; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scopeDef += "var " + newScope[0] + " = {}; " + newScope[1] + " = " + newScope[0] + ";" + newScope[1] + "._scopeName = '" + newScope[1] + "';"; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scopePrefix += (i == 0 ? "" : ",") + newScope[0]; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scopeSuffix += (i == 0 ? "" : ",") + newScope[1]; 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scopeMap[newScope[0]] = newScope[1]; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scopeMapRev[newScope[1]] = newScope[0]; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) eval(scopeDef + "dojo._scopeArgs = [" + scopeSuffix + "];"); 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._scopePrefixArgs = scopePrefix; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._scopePrefix = "(function(" + scopePrefix + "){"; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._scopeSuffix = "})(" + scopeSuffix + ")"; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._scopeMap = scopeMap; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._scopeMapRev = scopeMapRev; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*===== 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// note: 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 'djConfig' does not exist under 'dojo.*' so that it can be set before the 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 'dojo' variable exists. 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// note: 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Setting any of these variables *after* the library has loaded does 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// nothing at all. 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)djConfig = { 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Application code can set the global 'djConfig' prior to loading 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the library to override certain global settings for how dojo works. 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isDebug: Boolean 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Defaults to `false`. If set to `true`, ensures that Dojo provides 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // extended debugging feedback via Firebug. If Firebug is not available 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // on your platform, setting `isDebug` to `true` will force Dojo to 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // pull in (and display) the version of Firebug Lite which is 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // integrated into the Dojo distribution, thereby always providing a 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // debugging/logging console when `isDebug` is enabled. Note that 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Firebug's `console.*` methods are ALWAYS defined by Dojo. If 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `isDebug` is false and you are on a platform without Firebug, these 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // methods will be defined as no-ops. 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isDebug: false, 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // debugAtAllCosts: Boolean 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Defaults to `false`. If set to `true`, this triggers an alternate 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // mode of the package system in which dependencies are detected and 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // only then are resources evaluated in dependency order via 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `<script>` tag inclusion. This may double-request resources and 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cause problems with scripts which expect `dojo.require()` to 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // preform synchronously. `debugAtAllCosts` can be an invaluable 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // debugging aid, but when using it, ensure that all code which 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // depends on Dojo modules is wrapped in `dojo.addOnLoad()` handlers. 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Due to the somewhat unpredictable side-effects of using 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `debugAtAllCosts`, it is strongly recommended that you enable this 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // flag as a last resort. `debugAtAllCosts` has no effect when loading 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // resources across domains. For usage information, see the 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // [Dojo Book](http://dojotoolkit.org/book/book-dojo/part-4-meta-dojo-making-your-dojo-code-run-faster-and-better/debugging-facilities/deb) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) debugAtAllCosts: false, 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // locale: String 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The locale to assume for loading localized resources in this page, 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // specified according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt). 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Must be specified entirely in lowercase, e.g. `en-us` and `zh-cn`. 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See the documentation for `dojo.i18n` and `dojo.requireLocalization` 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for details on loading localized resources. If no locale is specified, 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Dojo assumes the locale of the user agent, according to `navigator.userLanguage` 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or `navigator.language` properties. 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) locale: undefined, 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // extraLocale: Array 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // No default value. Specifies additional locales whose 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // resources should also be loaded alongside the default locale when 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // calls to `dojo.requireLocalization()` are processed. 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) extraLocale: undefined, 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // baseUrl: String 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The directory in which `dojo.js` is located. Under normal 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // conditions, Dojo auto-detects the correct location from which it 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // was loaded. You may need to manually configure `baseUrl` in cases 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // where you have renamed `dojo.js` or in which `<base>` tags confuse 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // some browsers (e.g. IE 6). The variable `dojo.baseUrl` is assigned 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // either the value of `djConfig.baseUrl` if one is provided or the 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // auto-detected root if not. Other modules are located relative to 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this path. The path should end in a slash. 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) baseUrl: undefined, 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // modulePaths: Object 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A map of module names to paths relative to `dojo.baseUrl`. The 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // key/value pairs correspond directly to the arguments which 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.registerModulePath` accepts. Specifiying 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `djConfig.modulePaths = { "foo": "../../bar" }` is the equivalent 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // modules may be configured via `djConfig.modulePaths`. 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) modulePaths: {}, 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // afterOnLoad: Boolean 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Indicates Dojo was added to the page after the page load. In this case 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Dojo will not wait for the page DOMContentLoad/load events and fire 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // its dojo.addOnLoad callbacks after making sure all outstanding 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.required modules have loaded. Only works with a built dojo.js, 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it does not work the dojo.js directly from source control. 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) afterOnLoad: false, 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // addOnLoad: Function or Array 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Adds a callback via dojo.addOnLoad. Useful when Dojo is added after 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the page loads and djConfig.afterOnLoad is true. Supports the same 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // arguments as dojo.addOnLoad. When using a function reference, use 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `djConfig.addOnLoad = function(){};`. For object with function name use 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `djConfig.addOnLoad = [myObject, "functionName"];` and for object with 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // function reference use 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `djConfig.addOnLoad = [myObject, function(){}];` 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) addOnLoad: null, 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // require: Array 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An array of module names to be loaded immediately after dojo.js has been included 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in a page. 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) require: [], 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // defaultDuration: Array 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Default duration, in milliseconds, for wipe and fade animations within dijits. 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Assigned to dijit.defaultDuration. 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) defaultDuration: 200, 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojoBlankHtmlUrl: String 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Used by some modules to configure an empty iframe. Used by dojo.io.iframe and 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.back, and dijit popup support in IE where an iframe is needed to make sure native 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // controls do not bleed through the popups. Normally this configuration variable 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // does not need to be set, except when using cross-domain/CDN Dojo builds. 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Save dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl` 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to the path on your domain your copy of blank.html. 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojoBlankHtmlUrl: undefined, 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ioPublish: Boolean? 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Set this to true to enable publishing of topics for the different phases of 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // IO operations. Publishing is done via dojo.publish. See dojo.__IoPublish for a list 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of topics that are published. 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ioPublish: false, 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // useCustomLogger: Anything? 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If set to a value that evaluates to true such as a string or array and 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isDebug is true and Firebug is not available or running, then it bypasses 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the creation of Firebug Lite allowing you to define your own console object. 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) useCustomLogger: undefined, 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // transparentColor: Array 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Array containing the r, g, b components used as transparent color in dojo.Color; 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if undefined, [255,255,255] (white) will be used. 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) transparentColor: undefined, 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // skipIeDomLoaded: Boolean 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For IE only, skip the DOMContentLoaded hack used. Sometimes it can cause an Operation 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Aborted error if the rest of the page triggers script defers before the DOM is ready. 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If this is config value is set to true, then dojo.addOnLoad callbacks will not be 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // triggered until the page load event, which is after images and iframes load. If you 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // want to trigger the callbacks sooner, you can put a script block in the bottom of 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // your HTML that calls dojo._loadInit();. If you are using multiversion support, change 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "dojo." to the appropriate scope name for dojo. 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) skipIeDomLoaded: false 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=====*/ 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // firebug stubs 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof this["loadFirebugConsole"] == "function"){ 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for Firebug 1.2 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this["loadFirebugConsole"](); 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.console = this.console || {}; 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Be careful to leave 'log' always at the end 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cn = [ 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "assert", "count", "debug", "dir", "dirxml", "error", "group", 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "groupEnd", "info", "profile", "profileEnd", "time", "timeEnd", 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "trace", "warn", "log" 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ]; 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var i = 0, tn; 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while((tn=cn[i++])){ 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!console[tn]){ 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (function(){ 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tcn = tn+""; 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) console[tcn] = ('log' in console) ? function(){ 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var a = Array.apply({}, arguments); 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a.unshift(tcn+":"); 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) console["log"](a.join(" ")); 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } : function(){} 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) console[tcn]._fake = true; 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) })(); 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //TODOC: HOW TO DOC THIS? 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo is the root variable of (almost all) our public symbols -- make sure it is defined. 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof dojo == "undefined"){ 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo = { 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _scopeName: "dojo", 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _scopePrefix: "", 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _scopePrefixArgs: "", 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _scopeSuffix: "", 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _scopeMap: {}, 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _scopeMapRev: {} 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var d = dojo; 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Need placeholders for dijit and dojox for scoping code. 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof dijit == "undefined"){ 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dijit = {_scopeName: "dijit"}; 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof dojox == "undefined"){ 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojox = {_scopeName: "dojox"}; 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!d._scopeArgs){ 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._scopeArgs = [dojo, dijit, dojox]; 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*===== 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.global = { 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Alias for the global scope 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (e.g. the window object in a browser). 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Refer to 'dojo.global' rather than referring to window to ensure your 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // code runs correctly in contexts other than web browsers (e.g. Rhino on a server). 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=====*/ 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.global = this; 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.config =/*===== djConfig = =====*/{ 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isDebug: false, 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) debugAtAllCosts: false 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: 2.0, drop djConfig support. Use dojoConfig exclusively for global config. 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cfg = typeof djConfig != "undefined" ? djConfig : 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) typeof dojoConfig != "undefined" ? dojoConfig : null; 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cfg){ 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var c in cfg){ 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.config[c] = cfg[c]; 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*===== 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Override locale setting, if specified 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.locale = { 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: the locale as defined by Dojo (read-only) 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=====*/ 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.locale = d.config.locale; 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var rev = "$Rev: 24595 $".match(/\d+/); 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*===== 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.version = function(){ 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Version number of the Dojo Toolkit 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // major: Integer 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Major version. If total version is "1.2.0beta1", will be 1 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // minor: Integer 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Minor version. If total version is "1.2.0beta1", will be 2 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // patch: Integer 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Patch version. If total version is "1.2.0beta1", will be 0 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // flag: String 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Descriptor flag. If total version is "1.2.0beta1", will be "beta1" 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // revision: Number 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The SVN rev from which dojo was pulled 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.major = 0; 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.minor = 0; 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.patch = 0; 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.flag = ""; 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.revision = 0; 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=====*/ 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.version = { 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) major: 1, minor: 6, patch: 1, flag: "", 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) revision: rev ? +rev[0] : NaN, 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toString: function(){ 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) with(d.version){ 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return major + "." + minor + "." + patch + flag + " (" + revision + ")"; // String 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Register with the OpenAjax hub 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof OpenAjax != "undefined"){ 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OpenAjax.hub.registerLibrary(dojo._scopeName, "http://dojotoolkit.org", d.version.toString()); 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var extraNames, extraLen, empty = {}; 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i in {toString: 1}){ extraNames = []; break; } 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._extraNames = extraNames = extraNames || ["hasOwnProperty", "valueOf", "isPrototypeOf", 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "propertyIsEnumerable", "toLocaleString", "toString", "constructor"]; 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) extraLen = extraNames.length; 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._mixin = function(/*Object*/ target, /*Object*/ source){ 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Adds all properties and methods of source to target. This addition 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is "prototype extension safe", so that instances of objects 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will not pass along prototype defaults. 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var name, s, i; 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(name in source){ 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the "tobj" condition avoid copying properties in "source" 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // inherited from Object.prototype. For example, if target has a custom 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // toString() method, don't overwrite it with the toString() method 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that source inherited from Object.prototype 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s = source[name]; 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!(name in target) || (target[name] !== s && (!(name in empty) || empty[name] !== s))){ 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) target[name] = s; 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // IE doesn't recognize some custom functions in for..in 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(extraLen && source){ 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(i = 0; i < extraLen; ++i){ 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = extraNames[i]; 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s = source[name]; 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!(name in target) || (target[name] !== s && (!(name in empty) || empty[name] !== s))){ 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) target[name] = s; 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return target; // Object 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.mixin = function(/*Object*/obj, /*Object...*/props){ 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Adds all properties and methods of props to obj and returns the 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (now modified) obj. 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.mixin` can mix multiple source objects into a 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // destination object which is then returned. Unlike regular 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `for...in` iteration, `dojo.mixin` is also smart about avoiding 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // extensions which other toolkits may unwisely add to the root 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // object prototype 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // obj: 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The object to mix properties into. Also the return value. 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // props: 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // One or more objects whose values are successively copied into 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // obj. If more than one of these objects contain the same value, 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the one specified last in the function call will "win". 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // make a shallow copy of an object 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var copy = dojo.mixin({}, source); 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // many class constructors often take an object which specifies 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // values to be configured on the object. In this case, it is 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // often simplest to call `dojo.mixin` on the `this` object: 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.declare("acme.Base", null, { 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | constructor: function(properties){ 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // property configuration: 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.mixin(this, properties); 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(this.quip); 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | quip: "I wasn't born yesterday, you know - I've seen movies.", 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // create an instance of the class and configure it 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var b = new acme.Base({quip: "That's what it does!" }); 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // copy in properties from multiple objects 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var flattened = dojo.mixin( 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | { 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | name: "Frylock", 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | braces: true 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | { 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | name: "Carl Brutanananadilewski" 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ); 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // will print "Carl Brutanananadilewski" 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(flattened.name); 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // will print "true" 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(flattened.braces); 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!obj){ obj = {}; } 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i=1, l=arguments.length; i<l; i++){ 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._mixin(obj, arguments[i]); 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return obj; // Object 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getProp = function(/*Array*/parts, /*Boolean*/create, /*Object*/context){ 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var obj=context || d.global; 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i=0, p; obj && (p=parts[i]); i++){ 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(i == 0 && d._scopeMap[p]){ 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) p = d._scopeMap[p]; 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) obj = (p in obj ? obj[p] : (create ? obj[p]={} : undefined)); 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return obj; // mixed 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.setObject = function(/*String*/name, /*Object*/value, /*Object?*/context){ 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Set a property from a dot-separated string, such as "A.B.C" 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Useful for longer api chains where you have to test each object in 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the chain, or when you have an object reference in string format. 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Objects are created as needed along `path`. Returns the passed 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // value if setting is successful or `undefined` if not. 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name: 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Path to a property, in the form "A.B.C". 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // context: 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Optional. Object to use as root of path. Defaults to 4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.global`. 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // set the value of `foo.bar.baz`, regardless of whether 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // intermediate objects already exist: 4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.setObject("foo.bar.baz", value); 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // without `dojo.setObject`, we often see code like this: 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ensure that intermediate objects are available 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(!obj["parent"]){ obj.parent = {}; } 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(!obj.parent["child"]){ obj.parent.child= {}; } 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // now we can safely set the property 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | obj.parent.child.prop = "some value"; 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // wheras with `dojo.setObject`, we can shorten that to: 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.setObject("parent.child.prop", "some value", obj); 4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var parts=name.split("."), p=parts.pop(), obj=d._getProp(parts, true, context); 4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return obj && p ? (obj[p]=value) : undefined; // Object 4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.getObject = function(/*String*/name, /*Boolean?*/create, /*Object?*/context){ 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Get a property from a dot-separated string, such as "A.B.C" 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Useful for longer api chains where you have to test each object in 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the chain, or when you have an object reference in string format. 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name: 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Path to an property, in the form "A.B.C". 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // create: 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Optional. Defaults to `false`. If `true`, Objects will be 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // created at any point along the 'path' that is undefined. 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // context: 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Optional. Object to use as root of path. Defaults to 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 'dojo.global'. Null may be passed. 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d._getProp(name.split("."), create, context); // Object 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.exists = function(/*String*/name, /*Object?*/obj){ 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // determine if an object supports a given method 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // useful for longer api chains where you have to test each object in 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the chain. Useful for object and method detection. 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name: 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Path to an object, in the form "A.B.C". 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // obj: 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Object to use as root of path. Defaults to 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 'dojo.global'. Null may be passed. 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // define an object 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var foo = { 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | bar: { } 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }; 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // search the global scope 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.exists("foo.bar"); // true 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.exists("foo.bar.baz"); // false 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // search from a particular scope 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.exists("bar", foo); // true 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.exists("bar.baz", foo); // false 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.getObject(name, false, obj) !== undefined; // Boolean 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo["eval"] = function(/*String*/ scriptFragment){ 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A legacy method created for use exclusively by internal Dojo methods. Do not use 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this method directly, the behavior of this eval will differ from the normal 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // browser eval. 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Placed in a separate function to minimize size of trapped 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // exceptions. Calling eval() directly from some other scope may 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // complicate tracebacks on some platforms. 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The result of the evaluation. Often `undefined` 5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.global.eval ? d.global.eval(scriptFragment) : eval(scriptFragment); // Object 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.deprecated = function(behaviour, extra, removal){ 5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Log a debug message to indicate that a behavior has been 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // deprecated. 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // behaviour: String 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The API or behavior being deprecated. Usually in the form 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of "myApp.someFunction()". 5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // extra: String? 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Text to append to the message. Often provides advice on a 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // new function or facility to achieve the same goal during 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the deprecation period. 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // removal: String? 5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Text to indicate when in the future the behavior will be 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // removed. Usually a version number. 5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.deprecated("myApp.getTemp()", "use myApp.getLocaleTemp() instead", "1.0"); 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.experimental = function(moduleName, extra){ 5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: Marks code as experimental. 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This can be used to mark a function, file, or module as 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // experimental. Experimental code is not ready to be used, and the 5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // APIs are subject to change without notice. Experimental code may be 5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // completed deleted without going through the normal deprecation 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // process. 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // moduleName: String 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The name of a module, or the name of a module file or a specific 5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // function 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // extra: String? 5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // some additional message for the user 5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.experimental("dojo.data.Result"); 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.experimental("dojo.weather.toKelvin()", "PENDING approval from NOAA"); 5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Real functions declared in dojo._firebug.firebug. 5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.deprecated = d.experimental = function(){}; 5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// vim:ai:ts=4:noet 5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * loader.js - A bootstrap module. Runs before the hostenv_*.js file. Contains 5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * all of the package loading methods. 5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var d = dojo, currentModule; 5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.mixin(d, { 5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _loadedModules: {}, 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _inFlightCount: 0, 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _hasResource: {}, 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _modulePrefixes: { 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo: { name: "dojo", value: "." }, 5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojox: { name: "dojox", value: "../dojox" }, 5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dijit: { name: "dijit", value: "../dijit" }, 5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) doh: { name: "doh", value: "../util/doh" }, 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tests: { name: "tests", value: "tests" } 5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _moduleHasPrefix: function(/*String*/module){ 5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: checks to see if module has been established 5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mp = d._modulePrefixes; 5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !!(mp[module] && mp[module].value); // Boolean 5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _getModulePrefix: function(/*String*/module){ 5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: gets the prefix associated with module 5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mp = d._modulePrefixes; 5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d._moduleHasPrefix(module)){ 5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return mp[module].value; // String 5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return module; // String 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _loadedUrls: [], 5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //WARNING: 5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This variable is referenced by packages outside of bootstrap: 5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FloatingPane.js and undo/browser.js 5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _postLoad: false, 5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Egad! Lots of test files push on this directly instead of using dojo.addOnLoad. 5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _loaders: [], 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _unloaders: [], 5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _loadNotifying: false 5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._loadPath = function(/*String*/relpath, /*String?*/module, /*Function?*/cb){ 6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Load a Javascript module given a relative path 6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Loads and interprets the script located at relpath, which is 6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // relative to the script root directory. If the script is found but 6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // its interpretation causes a runtime exception, that exception is 6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not caught by us, so the caller will see it. We return a true 6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // value if and only if the script is found. 6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // relpath: 6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A relative path to a script (no leading '/', and typically ending 6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in '.js'). 6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // module: 6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A module whose existance to check for after loading a path. Can be 6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // used to determine success or failure of the load. 6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cb: 6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a callback function to pass the result of evaluating the script 6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var uri = ((relpath.charAt(0) == '/' || relpath.match(/^\w+:/)) ? "" : d.baseUrl) + relpath; 6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentModule = module; 6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !module ? d._loadUri(uri, cb) : d._loadUriAndCheck(uri, module, cb); // Boolean 6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) console.error(e); 6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; // Boolean 6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }finally{ 6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentModule = null; 6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._loadUri = function(/*String*/uri, /*Function?*/cb){ 6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Loads JavaScript from a URI 6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Reads the contents of the URI, and evaluates the contents. This is 6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // used to load modules as well as resource bundles. Returns true if 6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it succeeded. Returns false if the URI reading failed. Throws if 6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the evaluation throws. 6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // uri: a uri which points at the script to be loaded 6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cb: 6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a callback function to process the result of evaluating the script 6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // as an expression, typically used by the resource bundle loader to 6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // load JSON-style resources 6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d._loadedUrls[uri]){ 6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; // Boolean 6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._inFlightCount++; // block addOnLoad calls that arrive while we're busy downloading 6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var contents = d._getText(uri, true); 6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(contents){ // not 404, et al 6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._loadedUrls[uri] = true; 6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._loadedUrls.push(uri); 6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cb){ 6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //conditional to support script-inject i18n bundle format 6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) contents = /^define\(/.test(contents) ? contents : '('+contents+')'; 6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Only do the scoping if no callback. If a callback is specified, 6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //it is most likely the i18n bundle stuff. 6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) contents = d._scopePrefix + contents + d._scopeSuffix; 6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!d.isIE){ contents += "\r\n//@ sourceURL=" + uri; } // debugging assist for Firebug 6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var value = d["eval"](contents); 6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cb){ cb(value); } 6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Check to see if we need to call _callLoaded() due to an addOnLoad() that arrived while we were busy downloading 6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(--d._inFlightCount == 0 && d._postLoad && d._loaders.length){ 6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We shouldn't be allowed to get here but Firefox allows an event 6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (mouse, keybd, async xhrGet) to interrupt a synchronous xhrGet. 6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the current script block contains multiple require() statements, then after each 6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // require() returns, inFlightCount == 0, but we want to hold the _callLoaded() until 6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // all require()s are done since the out-of-sequence addOnLoad() presumably needs them all. 6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // setTimeout allows the next require() to start (if needed), and then we check this again. 6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setTimeout(function(){ 6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If inFlightCount > 0, then multiple require()s are running sequentially and 6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the next require() started after setTimeout() was executed but before we got here. 6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d._inFlightCount == 0){ 6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._callLoaded(); 6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 0); 6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !!contents; // Boolean: contents? true : false 6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: probably need to add logging to this method 6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._loadUriAndCheck = function(/*String*/uri, /*String*/moduleName, /*Function?*/cb){ 6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: calls loadUri then findModule and returns true if both succeed 6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ok = false; 6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ok = d._loadUri(uri, cb); 6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) console.error("failed loading " + uri + " with error: " + e); 6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !!(ok && d._loadedModules[moduleName]); // Boolean 6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.loaded = function(){ 7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // signal fired when initial environment and package loading is 7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // complete. You should use dojo.addOnLoad() instead of doing a 7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // direct dojo.connect() to this method in order to handle 7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // initialization tasks that require the environment to be 7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // initialized. In a browser host, declarative widgets will 7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be constructed when this function finishes runing. 7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._loadNotifying = true; 7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._postLoad = true; 7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mll = d._loaders; 7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Clear listeners so new ones can be added 7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //For other xdomain package loads after the initial load. 7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._loaders = []; 7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var x = 0; x < mll.length; x++){ 7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mll[x](); 7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._loadNotifying = false; 7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Make sure nothing else got added to the onload queue 7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //after this first run. If something did, and we are not waiting for any 7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //more inflight resources, run again. 7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d._postLoad && d._inFlightCount == 0 && mll.length){ 7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._callLoaded(); 7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.unloaded = function(){ 7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // signal fired by impending environment destruction. You should use 7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.addOnUnload() instead of doing a direct dojo.connect() to this 7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // method to perform page/application cleanup methods. See 7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.addOnUnload for more info. 7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mll = d._unloaders; 7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(mll.length){ 7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (mll.pop())(); 7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._onto = function(arr, obj, fn){ 7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!fn){ 7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) arr.push(obj); 7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(fn){ 7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var func = (typeof fn == "string") ? obj[fn] : fn; 7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) arr.push(function(){ func.call(obj); }); 7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.ready = dojo.addOnLoad = function(/*Object*/obj, /*String|Function?*/functionName){ 7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Registers a function to be triggered after the DOM and dojo.require() calls 7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // have finished loading. 7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Registers a function to be triggered after the DOM has finished 7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // loading and `dojo.require` modules have loaded. Widgets declared in markup 7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // have been instantiated if `djConfig.parseOnLoad` is true when this fires. 7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Images and CSS files may or may not have finished downloading when 7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the specified function is called. (Note that widgets' CSS and HTML 7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // code is guaranteed to be downloaded before said widgets are 7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // instantiated, though including css resouces BEFORE any script elements 7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is highly recommended). 7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Register an anonymous function to run when everything is ready 7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addOnLoad(function(){ doStuff(); }); 7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Register a function to run when everything is ready by pointer: 7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var init = function(){ doStuff(); } 7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addOnLoad(init); 7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Register a function to run scoped to `object`, either by name or anonymously: 7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addOnLoad(object, "functionName"); 7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addOnLoad(object, function(){ doStuff(); }); 7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._onto(d._loaders, obj, functionName); 7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Added for xdomain loading. dojo.addOnLoad is used to 7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //indicate callbacks after doing some dojo.require() statements. 7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //In the xdomain case, if all the requires are loaded (after initial 7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //page load), then immediately call any listeners. 7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d._postLoad && d._inFlightCount == 0 && !d._loadNotifying){ 7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._callLoaded(); 7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Support calling dojo.addOnLoad via djConfig.addOnLoad. Support all the 7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //call permutations of dojo.addOnLoad. Mainly useful when dojo is added 7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //to the page after the page has loaded. 7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var dca = d.config.addOnLoad; 7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dca){ 7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.addOnLoad[(dca instanceof Array ? "apply" : "call")](d, dca); 7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._modulesLoaded = function(){ 8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d._postLoad){ return; } 8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d._inFlightCount > 0){ 8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) console.warn("files still in flight!"); 8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._callLoaded(); 8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._callLoaded = function(){ 8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The "object" check is for IE, and the other opera check fixes an 8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // issue in Opera where it could not find the body element in some 8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // widget test cases. For 0.9, maybe route all browsers through the 8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // setTimeout (need protection still for non-browser environments 8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // though). This might also help the issue with FF 2.0 and freezing 8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // issues where we try to do sync xhr while background css images are 8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // being loaded (trac #2572)? Consider for 0.9. 8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof setTimeout == "object" || (d.config.useXDomain && d.isOpera)){ 8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setTimeout( 8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isAIR ? function(){ d.loaded(); } : d._scopeName + ".loaded();", 8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 0); 8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.loaded(); 8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getModuleSymbols = function(/*String*/modulename){ 8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Converts a module name in dotted JS notation to an array 8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // representing the path in the source tree 8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var syms = modulename.split("."); 8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = syms.length; i>0; i--){ 8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var parentModule = syms.slice(0, i).join("."); 8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(i == 1 && !d._moduleHasPrefix(parentModule)){ 8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Support default module directory (sibling of dojo) for top-level modules 8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) syms[0] = "../" + syms[0]; 8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var parentModulePath = d._getModulePrefix(parentModule); 8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(parentModulePath != parentModule){ 8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) syms.splice(0, i, parentModulePath); 8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return syms; // Array 8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._global_omit_module_check = false; 8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.loadInit = function(/*Function*/init){ 8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Executes a function that needs to be executed for the loader's dojo.requireIf 8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // resolutions to work. This is needed mostly for the xdomain loader case where 8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a function needs to be executed to set up the possible values for a dojo.requireIf 8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // call. 8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // init: 8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a function reference. Executed immediately. 8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: This function is mainly a marker for the xdomain loader to know parts of 8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // code that needs be executed outside the function wrappper that is placed around modules. 8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The init function could be executed more than once, and it should make no assumptions 8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // on what is loaded, or what modules are available. Only the functionality in Dojo Base 8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is allowed to be used. Avoid using this method. For a valid use case, 8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // see the source for dojox.gfx. 8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) init(); 8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._loadModule = dojo.require = function(/*String*/moduleName, /*Boolean?*/omitModuleCheck){ 8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // loads a Javascript module from the appropriate URI 8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // moduleName: String 8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // module name to load, using periods for separators, 8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // e.g. "dojo.date.locale". Module paths are de-referenced by dojo's 8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // internal mapping of locations to names and are disambiguated by 8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // longest prefix. See `dojo.registerModulePath()` for details on 8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // registering new modules. 8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // omitModuleCheck: Boolean? 8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if `true`, omitModuleCheck skips the step of ensuring that the 8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // loaded file actually defines the symbol it is referenced by. 8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For example if it called as `dojo.require("a.b.c")` and the 8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // file located at `a/b/c.js` does not define an object `a.b.c`, 8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and exception will be throws whereas no exception is raised 8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // when called as `dojo.require("a.b.c", true)` 8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Modules are loaded via dojo.require by using one of two loaders: the normal loader 8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and the xdomain loader. The xdomain loader is used when dojo was built with a 8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // custom build that specified loader=xdomain and the module lives on a modulePath 8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that is a whole URL, with protocol and a domain. The versions of Dojo that are on 8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the Google and AOL CDNs use the xdomain loader. 8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the module is loaded via the xdomain loader, it is an asynchronous load, since 8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the module is added via a dynamically created script tag. This 8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // means that dojo.require() can return before the module has loaded. However, this 8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // should only happen in the case where you do dojo.require calls in the top-level 8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // HTML page, or if you purposely avoid the loader checking for dojo.require 8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dependencies in your module by using a syntax like dojo["require"] to load the module. 8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sometimes it is useful to not have the loader detect the dojo.require calls in the 9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // module so that you can dynamically load the modules as a result of an action on the 9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // page, instead of right at module load time. 9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Also, for script blocks in an HTML page, the loader does not pre-process them, so 9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it does not know to download the modules before the dojo.require calls occur. 9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // So, in those two cases, when you want on-the-fly module loading or for script blocks 9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in the HTML page, special care must be taken if the dojo.required code is loaded 9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // asynchronously. To make sure you can execute code that depends on the dojo.required 9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // modules, be sure to add the code that depends on the modules in a dojo.addOnLoad() 9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // callback. dojo.addOnLoad waits for all outstanding modules to finish loading before 9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // executing. 9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This type of syntax works with both xdomain and normal loaders, so it is good 9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // practice to always use this idiom for on-the-fly code loading and in HTML script 9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // blocks. If at some point you change loaders and where the code is loaded from, 9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it will all still work. 9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // More on how dojo.require 9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.require("A.B")` first checks to see if symbol A.B is 9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // defined. If it is, it is simply returned (nothing to do). 9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If it is not defined, it will look for `A/B.js` in the script root 9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // directory. 9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.require` throws an exception if it cannot find a file 9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to load, or if the symbol `A.B` is not defined after loading. 9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It returns the object `A.B`, but note the caveats above about on-the-fly loading and 9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // HTML script blocks when the xdomain loader is loading a module. 9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.require()` does nothing about importing symbols into 9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the current namespace. It is presumed that the caller will 9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // take care of that. 9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // To use dojo.require in conjunction with dojo.ready: 9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.require("foo"); 9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.require("bar"); 9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addOnLoad(function(){ 9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | //you can now safely do something with foo and bar 9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For example, to import all symbols into a local block, you might write: 9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | with (dojo.require("A.B")) { 9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ... 9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // And to import just the leaf symbol to a local variable: 9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var B = dojo.require("A.B"); 9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ... 9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the required namespace object 9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) omitModuleCheck = d._global_omit_module_check || omitModuleCheck; 9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Check if it is already loaded. 9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var module = d._loadedModules[moduleName]; 9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(module){ 9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return module; 9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // convert periods to slashes 9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var relpath = d._getModuleSymbols(moduleName).join("/") + '.js'; 9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var modArg = !omitModuleCheck ? moduleName : null; 9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ok = d._loadPath(relpath, modArg); 9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!ok && !omitModuleCheck){ 9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw new Error("Could not load '" + moduleName + "'; last tried '" + relpath + "'"); 9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // check that the symbol was defined 9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Don't bother if we're doing xdomain (asynchronous) loading. 9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!omitModuleCheck && !d._isXDomain){ 9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // pass in false so we can give better error 9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) module = d._loadedModules[moduleName]; 9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!module){ 9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw new Error("symbol '" + moduleName + "' is not defined after loading '" + relpath + "'"); 9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return module; 9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.provide = function(/*String*/ resourceName){ 9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Register a resource with the package system. Works in conjunction with `dojo.require` 9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Each javascript source file is called a resource. When a 9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // resource is loaded by the browser, `dojo.provide()` registers 9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that it has been loaded. 9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Each javascript source file must have at least one 9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.provide()` call at the top of the file, corresponding to 9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the file name. For example, `js/dojo/foo.js` must have 9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.provide("dojo.foo");` before any calls to 10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.require()` are made. 10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For backwards compatibility reasons, in addition to registering 10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the resource, `dojo.provide()` also ensures that the javascript 10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // object for the module exists. For example, 10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.provide("dojox.data.FlickrStore")`, in addition to 10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // registering that `FlickrStore.js` is a resource for the 10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojox.data` module, will ensure that the `dojox.data` 10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // javascript object exists, so that calls like 10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.data.foo = function(){ ... }` don't fail. 10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In the case of a build where multiple javascript source files 10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // are combined into one bigger file (similar to a .lib or .jar 10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // file), that file may contain multiple dojo.provide() calls, to 10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // note that it includes multiple resources. 10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // resourceName: String 10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A dot-sperated string identifying a resource. 10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Safely create a `my` object, and make dojo.require("my.CustomModule") work 10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.provide("my.CustomModule"); 10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Make sure we have a string. 10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) resourceName = resourceName + ""; 10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (d._loadedModules[resourceName] = d.getObject(resourceName, true)); // Object 10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Start of old bootstrap2: 10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.platformRequire = function(/*Object*/modMap){ 10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // require one or more modules based on which host environment 10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Dojo is currently operating in 10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This method takes a "map" of arrays which one can use to 10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // optionally load dojo modules. The map is indexed by the 10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // possible dojo.name_ values, with two additional values: 10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "default" and "common". The items in the "default" array will 10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be loaded if none of the other items have been choosen based on 10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.name_, set by your host environment. The items in the 10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "common" array will *always* be loaded, regardless of which 10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // list is chosen. 10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.platformRequire({ 10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | browser: [ 10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "foo.sample", // simple module 10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "foo.test", 10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ["foo.bar.baz", true] // skip object check in _loadModule (dojo.require) 10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ], 10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | default: [ "foo.sample._base" ], 10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | common: [ "important.module.common" ] 10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var common = modMap.common || []; 10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = common.concat(modMap[d._name] || modMap["default"] || []); 10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var x=0; x<result.length; x++){ 10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var curr = result[x]; 10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(curr.constructor == Array){ 10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._loadModule.apply(d, curr); 10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._loadModule(curr); 10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.requireIf = function(/*Boolean*/ condition, /*String*/ resourceName){ 10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the condition is true then call `dojo.require()` for the specified 10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // resource 10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.requireIf(dojo.isBrowser, "my.special.Module"); 10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(condition === true){ 10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: why do we support chained require()'s here? does the build system? 10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var args = []; 10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = 1; i < arguments.length; i++){ 10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) args.push(arguments[i]); 10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.require.apply(d, args); 10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.requireAfterIf = d.requireIf; 10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.registerModulePath = function(/*String*/module, /*String*/prefix){ 10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Maps a module name to a path 10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An unregistered module is given the default path of ../[module], 10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // relative to Dojo root. For example, module acme is mapped to 10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ../acme. If you want to use a different module name, use 10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.registerModulePath. 10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If your dojo.js is located at this location in the web root: 10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | /myapp/js/dojo/dojo/dojo.js 10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and your modules are located at: 10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | /myapp/js/foo/bar.js 11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | /myapp/js/foo/baz.js 11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | /myapp/js/foo/thud/xyzzy.js 11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Your application can tell Dojo to locate the "foo" namespace by calling: 11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.registerModulePath("foo", "../../foo"); 11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // At which point you can then use dojo.require() to load the 11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // modules (assuming they provide() the same things which are 11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // required). The full code might be: 11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <script type="text/javascript" 11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | src="/myapp/js/dojo/dojo/dojo.js"></script> 11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <script type="text/javascript"> 11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.registerModulePath("foo", "../../foo"); 11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.require("foo.bar"); 11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.require("foo.baz"); 11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.require("foo.thud.xyzzy"); 11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | </script> 11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._modulePrefixes[module] = { name: module, value: prefix }; 11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){ 11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Declares translated resources and loads them if necessary, in the 11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // same style as dojo.require. Contents of the resource bundle are 11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // typically strings, but may be any name/value pair, represented in 11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // JSON format. See also `dojo.i18n.getLocalization`. 11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Load translated resource bundles provided underneath the "nls" 11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // directory within a package. Translated resources may be located in 11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // different packages throughout the source tree. 11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Each directory is named for a locale as specified by RFC 3066, 11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (http://www.ietf.org/rfc/rfc3066.txt), normalized in lowercase. 11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note that the two bundles in the example do not define all the 11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // same variants. For a given locale, bundles will be loaded for 11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that locale and all more general locales above it, including a 11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fallback at the root directory. For example, a declaration for 11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the "de-at" locale will first load `nls/de-at/bundleone.js`, 11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // then `nls/de/bundleone.js` and finally `nls/bundleone.js`. The 11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // data will be flattened into a single Object so that lookups 11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will follow this cascading pattern. An optional build step can 11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // preload the bundles to avoid data redundancy and the multiple 11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // network hits normally required to load these resources. 11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // moduleName: 11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name of the package containing the "nls" directory in which the 11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // bundle is found 11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // bundleName: 11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // bundle name, i.e. the filename without the '.js' suffix. Using "nls" as a 11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a bundle name is not supported, since "nls" is the name of the folder 11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that holds bundles. Using "nls" as the bundle name will cause problems 11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // with the custom build. 11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // locale: 11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the locale to load (optional) By default, the browser's user 11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // locale as defined by dojo.locale 11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // availableFlatLocales: 11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A comma-separated list of the available, flattened locales for this 11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // bundle. This argument should only be set by the build process. 11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A particular widget may define one or more resource bundles, 11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // structured in a program as follows, where moduleName is 11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // mycode.mywidget and bundleNames available include bundleone and 11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // bundletwo: 11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ... 11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | mycode/ 11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | mywidget/ 11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | nls/ 11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | bundleone.js (the fallback translation, English in this example) 11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | bundletwo.js (also a fallback translation) 11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | de/ 11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | bundleone.js 11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | bundletwo.js 11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | de-at/ 11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | bundleone.js 11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | en/ 11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | (empty; use the fallback translation) 11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | en-us/ 11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | bundleone.js 11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | en-gb/ 11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | bundleone.js 11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | es/ 11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | bundleone.js 11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | bundletwo.js 11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ...etc 11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ... 11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.require("dojo.i18n"); 11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.i18n._requireLocalization.apply(d.hostenv, arguments); 11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"), 11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"); 11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._Url = function(/*dojo._Url|String...*/){ 11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Constructor to create an object representing a URL. 12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It is marked as private, since we might consider removing 12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or simplifying it. 12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Each argument is evaluated in order relative to the next until 12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a canonical uri is produced. To get an absolute Uri relative to 12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the current document use: 12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // new dojo._Url(document.baseURI, url) 12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var n = null, 12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _a = arguments, 12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uri = [_a[0]]; 12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // resolve uri components relative to each other 12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = 1; i<_a.length; i++){ 12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_a[i]){ continue; } 12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Safari doesn't support this.constructor so we have to be explicit 12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Tracked (and fixed) in Webkit bug 3537. 12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://bugs.webkit.org/show_bug.cgi?id=3537 12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var relobj = new d._Url(_a[i]+""), 12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uriobj = new d._Url(uri[0]+""); 12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if( 12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) relobj.path == "" && 12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) !relobj.scheme && 12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) !relobj.authority && 12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) !relobj.query 12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ){ 12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(relobj.fragment != n){ 12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uriobj.fragment = relobj.fragment; 12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) relobj = uriobj; 12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(!relobj.scheme){ 12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) relobj.scheme = uriobj.scheme; 12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!relobj.authority){ 12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) relobj.authority = uriobj.authority; 12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(relobj.path.charAt(0) != "/"){ 12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var path = uriobj.path.substring(0, 12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uriobj.path.lastIndexOf("/") + 1) + relobj.path; 12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var segs = path.split("/"); 12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var j = 0; j < segs.length; j++){ 12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(segs[j] == "."){ 12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // flatten "./" references 12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(j == segs.length - 1){ 12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) segs[j] = ""; 12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) segs.splice(j, 1); 12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) j--; 12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(j > 0 && !(j == 1 && segs[0] == "") && 12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) segs[j] == ".." && segs[j-1] != ".."){ 12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // flatten "../" references 12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(j == (segs.length - 1)){ 12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) segs.splice(j, 1); 12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) segs[j - 1] = ""; 12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) segs.splice(j - 1, 2); 12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) j -= 2; 12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) relobj.path = segs.join("/"); 12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uri = []; 12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(relobj.scheme){ 12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uri.push(relobj.scheme, ":"); 12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(relobj.authority){ 12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uri.push("//", relobj.authority); 12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uri.push(relobj.path); 12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(relobj.query){ 12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uri.push("?", relobj.query); 12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(relobj.fragment){ 12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uri.push("#", relobj.fragment); 12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.uri = uri.join(""); 12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // break the uri into its main components 12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var r = this.uri.match(ore); 12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.scheme = r[2] || (r[1] ? "" : n); 12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.authority = r[4] || (r[3] ? "" : n); 12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.path = r[5]; // can never be undefined 12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.query = r[7] || (r[6] ? "" : n); 12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.fragment = r[9] || (r[8] ? "" : n); 12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(this.authority != n){ 12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // server based naming authority 12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) r = this.authority.match(ire); 12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.user = r[3] || n; 13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.password = r[4] || n; 13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.host = r[6] || r[7]; // ipv6 || ipv4 13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.port = r[9] || n; 13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._Url.prototype.toString = function(){ return this.uri; }; 13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.moduleUrl = function(/*String*/module, /*dojo._Url||String*/url){ 13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a `dojo._Url` object relative to a module. 13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var pngPath = dojo.moduleUrl("acme","images/small.png"); 13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.dir(pngPath); // list the object properties 13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // create an image and set it's source to pngPath's value: 13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var img = document.createElement("img"); 13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // NOTE: we assign the string representation of the url object 13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | img.src = pngPath.toString(); 13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // add our image to the document 13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.body().appendChild(img); 13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // you may de-reference as far as you like down the package 13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // hierarchy. This is sometimes handy to avoid lenghty relative 13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // urls or for building portable sub-packages. In this example, 13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the `acme.widget` and `acme.util` directories may be located 13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // under different roots (see `dojo.registerModulePath`) but the 13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the modules which reference them can be unaware of their 13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // relative locations on the filesystem: 13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // somewhere in a configuration block 13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.registerModulePath("acme.widget", "../../acme/widget"); 13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.registerModulePath("acme.util", "../../util"); 13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // code in a module using acme resources 13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var tmpltPath = dojo.moduleUrl("acme.widget","templates/template.html"); 13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var dataPath = dojo.moduleUrl("acme.util","resources/data.json"); 13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var loc = d._getModuleSymbols(module).join('/'); 13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!loc){ return null; } 13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(loc.lastIndexOf("/") != loc.length-1){ 13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) loc += "/"; 13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //If the path is an absolute path (starts with a / or is on another 13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //domain/xdomain) then don't add the baseUrl. 13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var colonIndex = loc.indexOf(":"); 13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(loc.charAt(0) != "/" && (colonIndex == -1 || colonIndex > loc.indexOf("/"))){ 13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) loc = d.baseUrl + loc; 13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return new d._Url(loc, url); // dojo._Url 13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*===== 13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.isBrowser = { 13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(dojo.isBrowser){ ... } 13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.isFF = { 13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(dojo.isFF > 1){ ... } 13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.isIE = { 13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(dojo.isIE > 6){ 13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // we are IE7 13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.isSafari = { 13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(dojo.isSafari){ ... } 13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Detect iPhone: 13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){ 13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // we are iPhone. Note, iPod touch reports "iPod" above and fails this test. 13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo = { 13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isBrowser: Boolean 13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // True if the client is a web-browser 13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isBrowser: true, 13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isFF: Number | undefined 13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Version as a Number if client is FireFox. undefined otherwise. Corresponds to 13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // major detected FireFox version (1.5, 2, 3, etc.) 13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isFF: 2, 13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isIE: Number | undefined 13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Version as a Number if client is MSIE(PC). undefined otherwise. Corresponds to 13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // major detected IE version (6, 7, 8, etc.) 13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isIE: 6, 13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isKhtml: Number | undefined 14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Version as a Number if client is a KHTML browser. undefined otherwise. Corresponds to major 14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // detected version. 14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isKhtml: 0, 14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isWebKit: Number | undefined 14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Version as a Number if client is a WebKit-derived browser (Konqueror, 14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Safari, Chrome, etc.). undefined otherwise. 14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isWebKit: 0, 14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isMozilla: Number | undefined 14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Version as a Number if client is a Mozilla-based browser (Firefox, 14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // SeaMonkey). undefined otherwise. Corresponds to major detected version. 14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isMozilla: 0, 14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isOpera: Number | undefined 14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Version as a Number if client is Opera. undefined otherwise. Corresponds to 14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // major detected version. 14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isOpera: 0, 14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isSafari: Number | undefined 14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Version as a Number if client is Safari or iPhone. undefined otherwise. 14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isSafari: 0, 14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isChrome: Number | undefined 14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Version as a Number if client is Chrome browser. undefined otherwise. 14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isChrome: 0 14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isMac: Boolean 14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // True if the client runs on Mac 14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=====*/ 14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(typeof window != 'undefined'){ 14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.isBrowser = true; 14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._name = "browser"; 14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // attempt to figure out the path to dojo if it isn't set in the config 14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (function(){ 14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var d = dojo; 14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this is a scope protection closure. We set browser versions and grab 14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the URL we were loaded from here. 14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // grab the node we were loaded from 14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(document && document.getElementsByTagName){ 14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scripts = document.getElementsByTagName("script"); 14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var rePkg = /dojo(\.xd)?\.js(\W|$)/i; 14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = 0; i < scripts.length; i++){ 14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var src = scripts[i].getAttribute("src"); 14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!src){ continue; } 14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var m = src.match(rePkg); 14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(m){ 14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // find out where we came from 14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!d.config.baseUrl){ 14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.config.baseUrl = src.substring(0, m.index); 14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and find out if we need to modify our behavior 14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cfg = (scripts[i].getAttribute("djConfig") || scripts[i].getAttribute("data-dojo-config")); 14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cfg){ 14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cfgo = eval("({ "+cfg+" })"); 14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var x in cfgo){ 14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.config[x] = cfgo[x]; 14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; // "first Dojo wins" 14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.baseUrl = d.config.baseUrl; 14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fill in the rendering support information in dojo.render.* 14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var n = navigator; 14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var dua = n.userAgent, 14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dav = n.appVersion, 14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tv = parseFloat(dav); 14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dua.indexOf("Opera") >= 0){ d.isOpera = tv; } 14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dua.indexOf("AdobeAIR") >= 0){ d.isAIR = 1; } 14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : 0; 14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined; 14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined; 14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isMac = dav.indexOf("Macintosh") >= 0; 14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // safari detection derived from: 14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://developer.apple.com/internet/safari/faq.html#anchor2 14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://developer.apple.com/internet/safari/uamatrix.html 14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0); 14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(index && !dojo.isChrome){ 14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // try to grab the explicit Safari version first. If we don't get 14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // one, look for less than 419.3 as the indication that we're on something 14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "Safari 2-ish". 14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isSafari = parseFloat(dav.split("Version/")[1]); 14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!d.isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){ 14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isSafari = 2; 14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dua.indexOf("Gecko") >= 0 && !d.isKhtml && !d.isWebKit){ d.isMozilla = d.isMoz = tv; } 14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isMoz){ 14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //We really need to get away from this. Consider a sane isGecko approach for the future. 14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isFF = parseFloat(dua.split("Firefox/")[1] || dua.split("Minefield/")[1]) || undefined; 14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(document.all && !d.isOpera){ 14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined; 14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //In cases where the page has an HTTP header or META tag with 14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //X-UA-Compatible, then it is in emulation mode. 15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Make sure isIE reflects the desired version. 15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //document.documentMode of 5 means quirks mode. 15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Only switch the value if documentMode's major version 15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //is different from isIE's major version. 15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mode = document.documentMode; 15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(mode && mode != 5 && Math.floor(d.isIE) != mode){ 15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isIE = mode; 15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Workaround to get local file loads of dojo to work on IE 7 15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //by forcing to not use native xhr. 15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.isIE && window.location.protocol === "file:"){ 15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.config.ieForceActiveXXhr=true; 15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isQuirks = document.compatMode == "BackCompat"; 15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // TODO: is the HTML LANG attribute relevant? 15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.locale = dojo.config.locale || (d.isIE ? n.userLanguage : n.language).toLowerCase(); 15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // These are in order of decreasing likelihood; this will change in time. 15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0']; 15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._xhrObj = function(){ 15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // does the work of portably generating a new XMLHTTPRequest object. 15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var http, last_e; 15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!dojo.isIE || !dojo.config.ieForceActiveXXhr){ 15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ http = new XMLHttpRequest(); }catch(e){} 15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!http){ 15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i=0; i<3; ++i){ 15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var progid = d._XMLHTTP_PROGIDS[i]; 15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) http = new ActiveXObject(progid); 15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) last_e = e; 15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(http){ 15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._XMLHTTP_PROGIDS = [progid]; // so faster next time 15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!http){ 15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw new Error("XMLHTTP not available: "+last_e); 15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return http; // XMLHTTPRequest instance 15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._isDocumentOk = function(http){ 15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var stat = http.status || 0, 15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lp = location.protocol; 15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (stat >= 200 && stat < 300) || // Boolean 15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) stat == 304 || // allow any 2XX response code 15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) stat == 1223 || // get it out of the cache 15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Internet Explorer mangled the status code 15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Internet Explorer mangled the status code OR we're Titanium/browser chrome/chrome extension requesting a local file 15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (!stat && (lp == "file:" || lp == "chrome:" || lp == "chrome-extension:" || lp == "app:")); 15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //See if base tag is in use. 15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //This is to fix http://trac.dojotoolkit.org/ticket/3973, 15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //but really, we need to find out how to get rid of the dojo._Url reference 15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //below and still have DOH work with the dojo.i18n test following some other 15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //test that uses the test frame to load a document (trac #2757). 15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Opera still has problems, but perhaps a larger issue of base tag support 15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //with XHR requests (hasBase is true, but the request is still made to document 15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //path, not base path). 15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var owloc = window.location+""; 15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var base = document.getElementsByTagName("base"); 15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var hasBase = (base && base.length > 0); 15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){ 15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: Read the contents of the specified uri and return those contents. 15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // uri: 15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A relative or absolute uri. If absolute, it still must be in 15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the same "domain" as we are. 15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fail_ok: 15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Default false. If fail_ok and loading fails, return null 15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // instead of throwing. 15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: The response text. null is returned when there is a 15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // failure and failure is okay (an exception otherwise) 15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE: must be declared before scope switches ie. this._xhrObj() 15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var http = d._xhrObj(); 15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!hasBase && dojo._Url){ 15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uri = (new dojo._Url(owloc, uri)).toString(); 15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.config.cacheBust){ 15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Make sure we have a string before string methods are used on uri 15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uri += ""; 15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uri += (uri.indexOf("?") == -1 ? "?" : "&") + String(d.config.cacheBust).replace(/\W+/g,""); 15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) http.open('GET', uri, false); 16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) http.send(null); 16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!d._isDocumentOk(http)){ 16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var err = Error("Unable to load "+uri+" status:"+ http.status); 16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err.status = http.status; 16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err.responseText = http.responseText; 16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw err; 16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(fail_ok){ return null; } // null 16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // rethrow the exception 16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw e; 16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return http.responseText; // String 16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _w = window; 16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _handleNodeEvent = function(/*String*/evtName, /*Function*/fp){ 16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // non-destructively adds the specified function to the node's 16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // evtName handler. 16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // evtName: should be in the form "onclick" for "onclick" handlers. 16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make sure you pass in the "on" part. 16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _a = _w.attachEvent || _w.addEventListener; 16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evtName = _w.attachEvent ? evtName : evtName.substring(2); 16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _a(evtName, function(){ 16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fp.apply(_w, arguments); 16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, false); 16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._windowUnloaders = []; 16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.windowUnloaded = function(){ 16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // signal fired by impending window destruction. You may use 16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.addOnWindowUnload() to register a listener for this 16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // event. NOTE: if you wish to dojo.connect() to this method 16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to perform page/application cleanup, be aware that this 16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // event WILL NOT fire if no handler has been registered with 16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.addOnWindowUnload. This behavior started in Dojo 1.3. 16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Previous versions always triggered dojo.windowUnloaded. See 16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.addOnWindowUnload for more info. 16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mll = d._windowUnloaders; 16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(mll.length){ 16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (mll.pop())(); 16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d = null; 16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _onWindowUnloadAttached = 0; 16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.addOnWindowUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){ 16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // registers a function to be triggered when window.onunload 16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fires. 16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The first time that addOnWindowUnload is called Dojo 16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will register a page listener to trigger your unload 16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handler with. Note that registering these handlers may 16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // destory "fastback" page caching in browsers that support 16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it. Be careful trying to modify the DOM or access 16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // JavaScript properties during this phase of page unloading: 16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // they may not always be available. Consider 16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.addOnUnload() if you need to modify the DOM or do 16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // heavy JavaScript work since it fires at the eqivalent of 16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the page's "onbeforeunload" event. 16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addOnWindowUnload(functionPointer) 16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addOnWindowUnload(object, "functionName"); 16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addOnWindowUnload(object, function(){ /* ... */}); 16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._onto(d._windowUnloaders, obj, functionName); 16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_onWindowUnloadAttached){ 16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _onWindowUnloadAttached = 1; 16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _handleNodeEvent("onunload", d.windowUnloaded); 16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _onUnloadAttached = 0; 16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.addOnUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){ 16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // registers a function to be triggered when the page unloads. 16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The first time that addOnUnload is called Dojo will 16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // register a page listener to trigger your unload handler 16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // with. 16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In a browser enviroment, the functions will be triggered 16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // during the window.onbeforeunload event. Be careful of doing 16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // too much work in an unload handler. onbeforeunload can be 16935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // triggered if a link to download a file is clicked, or if 16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the link is a javascript: link. In these cases, the 16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // onbeforeunload event fires, but the document is not 16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // actually destroyed. So be careful about doing destructive 16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // operations in a dojo.addOnUnload callback. 16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Further note that calling dojo.addOnUnload will prevent 17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // browsers from using a "fast back" cache to make page 17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // loading via back button instantaneous. 17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addOnUnload(functionPointer) 17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addOnUnload(object, "functionName") 17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addOnUnload(object, function(){ /* ... */}); 17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._onto(d._unloaders, obj, functionName); 17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_onUnloadAttached){ 17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _onUnloadAttached = 1; 17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _handleNodeEvent("onbeforeunload", dojo.unloaded); 17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) })(); 17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //START DOMContentLoaded 17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._initFired = false; 17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._loadInit = function(e){ 17195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo._scrollIntervalId){ 17205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearInterval(dojo._scrollIntervalId); 17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._scrollIntervalId = 0; 17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!dojo._initFired){ 17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._initFired = true; 17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Help out IE to avoid memory leak. 17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!dojo.config.afterOnLoad && window.detachEvent){ 17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) window.detachEvent("onload", dojo._loadInit); 17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo._inFlightCount == 0){ 17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._modulesLoaded(); 17345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!dojo.config.afterOnLoad){ 17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(document.addEventListener){ 17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Standards. Hooray! Assumption here that if standards based, 17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //it knows about DOMContentLoaded. It is OK if it does not, the fall through 17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //to window onload should be good enough. 17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) document.addEventListener("DOMContentLoaded", dojo._loadInit, false); 17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) window.addEventListener("load", dojo._loadInit, false); 17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(window.attachEvent){ 17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) window.attachEvent("onload", dojo._loadInit); 17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //DOMContentLoaded approximation. Diego Perini found this MSDN article 17495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //that indicates doScroll is available after DOM ready, so do a setTimeout 17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //to check when it is available. 17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //http://msdn.microsoft.com/en-us/library/ms531426.aspx 17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!dojo.config.skipIeDomLoaded && self === self.top){ 17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._scrollIntervalId = setInterval(function (){ 17545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 17555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //When dojo is loaded into an iframe in an IE HTML Application 17565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //(HTA), such as in a selenium test, javascript in the iframe 17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //can't see anything outside of it, so self===self.top is true, 17585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //but the iframe is not the top window and doScroll will be 17595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //available before document.body is set. Test document.body 17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //before trying the doScroll trick 17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(document.body){ 17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) document.documentElement.doScroll("left"); 17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._loadInit(); 17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch (e){} 17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 30); 17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.isIE){ 17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (function(){ 17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) document.namespaces.add("v", "urn:schemas-microsoft-com:vml"); 17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var vmlElems = ["*", "group", "roundrect", "oval", "shape", "rect", "imagedata", "path", "textpath", "text"], 17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) i = 0, l = 1, s = document.createStyleSheet(); 17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.isIE >= 8){ 17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) i = 1; 17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l = vmlElems.length; 17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(; i < l; ++i){ 17825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s.addRule("v\\:" + vmlElems[i], "behavior:url(#default#VML); display:inline-block"); 17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) })(); 17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){} 17865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //END DOMContentLoaded 17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /* 17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OpenAjax.subscribe("OpenAjax", "onload", function(){ 17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo._inFlightCount == 0){ 17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._modulesLoaded(); 17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OpenAjax.subscribe("OpenAjax", "onunload", function(){ 17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.unloaded(); 17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} //if (typeof window != 'undefined') 18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//Register any module paths set up in djConfig. Need to do this 18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//in the hostenvs since hostenv_browser can read djConfig from a 18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//script tag's attribute. 18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mp = dojo.config["modulePaths"]; 18085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(mp){ 18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var param in mp){ 18105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.registerModulePath(param, mp[param]); 18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 18125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 18145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//Load debug code if necessary. 18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(dojo.config.isDebug){ 18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.require("dojo._firebug.firebug"); 18185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(dojo.config.debugAtAllCosts){ 18215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this breaks the new AMD based module loader. The XDomain won't be necessary 18225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // anyway if you switch to the asynchronous loader 18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //dojo.config.useXDomain = true; 18245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //dojo.require("dojo._base._loader.loader_xd"); 18255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.require("dojo._base._loader.loader_debug"); 18265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.require("dojo.i18n"); 18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.lang"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 18315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.lang"] = true; 18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.lang"); 18335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 18365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var d = dojo, opts = Object.prototype.toString; 18375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Crockford (ish) functions 18395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.isString = function(/*anything*/ it){ 18415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 18425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Return true if it is a String 18435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (typeof it == "string" || it instanceof String); // Boolean 18445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.isArray = function(/*anything*/ it){ 18475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 18485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Return true if it is an Array. 18495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Does not work on Arrays created in other windows. 18505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return it && (it instanceof Array || typeof it == "array"); // Boolean 18515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.isFunction = function(/*anything*/ it){ 18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Return true if it is a Function 18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return opts.call(it) === "[object Function]"; 18575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 18585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.isObject = function(/*anything*/ it){ 18605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 18615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns true if it is a JavaScript object (or an Array, a Function 18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or null) 18635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return it !== undefined && 18645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (it === null || typeof it == "object" || d.isArray(it) || d.isFunction(it)); // Boolean 18655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 18665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.isArrayLike = function(/*anything*/ it){ 18685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 18695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // similar to dojo.isArray() but more permissive 18705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 18715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Doesn't strongly test for "arrayness". Instead, settles for "isn't 18725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a string or number and has a length property". Arguments objects 18735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and DOM collections will return true when passed to 18745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.isArrayLike(), but will return false when passed to 18755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.isArray(). 18765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 18775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If it walks like a duck and quacks like a duck, return `true` 18785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return it && it !== undefined && // Boolean 18795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // keep out built-in constructors (Number, String, ...) which have length 18805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // properties 18815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) !d.isString(it) && !d.isFunction(it) && 18825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) !(it.tagName && it.tagName.toLowerCase() == 'form') && 18835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (d.isArray(it) || isFinite(it.length)); 18845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 18855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.isAlien = function(/*anything*/ it){ 18875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 18885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns true if it is a built-in function or some other kind of 18895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // oddball that *should* report as a function but doesn't 18905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return it && !d.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean 18915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 18925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.extend = function(/*Object*/ constructor, /*Object...*/ props){ 18945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 18955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Adds all properties and methods of props to constructor's 18965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // prototype, making them available to all instances created with 18975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // constructor. 18985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i=1, l=arguments.length; i<l; i++){ 18995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._mixin(constructor.prototype, arguments[i]); 19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return constructor; // Object 19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._hitchArgs = function(scope, method /*,...*/){ 19055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var pre = d._toArray(arguments, 2); 19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var named = d.isString(method); 19075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(){ 19085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // arrayify arguments 19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var args = d._toArray(arguments); 19105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // locate our method 19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var f = named ? (scope||d.global)[method] : method; 19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // invoke with collected args 19135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return f && f.apply(scope || this, pre.concat(args)); // mixed 19145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; // Function 19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 19165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.hitch = function(/*Object*/scope, /*Function|String*/method /*,...*/){ 19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a function that will only ever execute in the a given scope. 19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This allows for easy use of object member functions 19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in callbacks and other places in which the "this" keyword may 19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // otherwise not reference the expected scope. 19235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Any number of default positional arguments may be passed as parameters 19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // beyond "method". 19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Each of these values will be used to "placehold" (similar to curry) 19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for the hitched function. 19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // scope: 19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The scope to use when method executes. If method is a string, 19295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // scope is also the object containing method. 19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // method: 19315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A function to be hitched to scope, or the name of the method in 19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // scope to be hitched. 19335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.hitch(foo, "bar")(); 19355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // runs foo.bar() in the scope of foo 19365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.hitch(foo, myFunction); 19385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns a function that runs myFunction in the scope of foo 19395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 19405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Expansion on the default positional arguments passed along from 19415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // hitch. Passed args are mixed first, additional args after. 19425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var foo = { bar: function(a, b, c){ console.log(a, b, c); } }; 19435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var fn = dojo.hitch(foo, "bar", 1, 2); 19445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | fn(3); // logs "1, 2, 3" 19455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 19465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var foo = { bar: 2 }; 19475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.hitch(foo, function(){ this.bar = 10; })(); 19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // execute an anonymous function in scope of foo 19495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(arguments.length > 2){ 19515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d._hitchArgs.apply(d, arguments); // Function 19525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!method){ 19545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) method = scope; 19555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scope = null; 19565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isString(method)){ 19585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scope = scope || d.global; 19595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!scope[method]){ throw(['dojo.hitch: scope["', method, '"] is null (scope="', scope, '")'].join('')); } 19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(){ return scope[method].apply(scope, arguments || []); }; // Function 19615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function 19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.delegate = function(obj, props){ 19675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 19685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a new object which "looks" to obj for properties which it 19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // does not have a value for. Optionally takes a bag of properties to 19705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // seed the returned object with initially. 19715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 19725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This is a small implementaton of the Boodman/Crockford delegation 19735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // pattern in JavaScript. An intermediate object constructor mediates 19745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the prototype chain for the returned object, using it to delegate 19755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // down to obj for property lookup when object-local lookup fails. 19765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This can be thought of similarly to ES4's "wrap", save that it does 19775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not act on types but rather on pure objects. 19785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // obj: 19795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The object to delegate to for properties not found directly on the 19805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return object or in props. 19815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // props: 19825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an object containing properties to assign to the returned object 19835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 19845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an Object of anonymous type 19855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 19865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var foo = { bar: "baz" }; 19875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var thinger = dojo.delegate(foo, { thud: "xyzzy"}); 19885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | thinger.bar == "baz"; // delegated to foo 19895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | foo.thud == undefined; // by definition 19905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | thinger.thud == "xyzzy"; // mixed in from props 19915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | foo.bar = "thonk"; 19925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | thinger.bar == "thonk"; // still delegated to foo's bar 19935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 19955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.delegate = dojo._delegate = (function(){ 19975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // boodman/crockford delegation w/ cornford optimization 19985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function TMP(){} 19995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(obj, props){ 20005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TMP.prototype = obj; 20015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tmp = new TMP(); 20025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TMP.prototype = null; 20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(props){ 20045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._mixin(tmp, props); 20055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return tmp; // Object 20075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 20085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) })(); 20095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 20115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._toArray = function(obj, offset, startWith){ 20125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 20135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Converts an array-like object (i.e. arguments, DOMCollection) to an 20145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // array. Returns a new Array with the elements of obj. 20155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // obj: Object 20165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the object to "arrayify". We expect the object to have, at a 20175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // minimum, a length property which corresponds to integer-indexed 20185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // properties. 20195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // offset: Number? 20205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the location in obj to start iterating from. Defaults to 0. 20215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Optional. 20225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // startWith: Array? 20235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An array to pack with the properties of obj. If provided, 20245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // properties in obj are appended at the end of startWith and 20255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // startWith is the returned array. 20265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 20285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var efficient = function(obj, offset, startWith){ 20305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0)); 20315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 20325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var slow = function(obj, offset, startWith){ 20345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var arr = startWith||[]; 20355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var x = offset || 0; x < obj.length; x++){ 20365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) arr.push(obj[x]); 20375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return arr; 20395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 20405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._toArray = 20425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isIE ? function(obj){ 20435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ((obj.item) ? slow : efficient).apply(this, arguments); 20445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } : 20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) efficient; 20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.partial = function(/*Function|String*/method /*, ...*/){ 20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 20495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // similar to hitch() except that the scope object is left to be 20505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // whatever the execution context eventually becomes. 20515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 20525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Calling dojo.partial is the functional equivalent of calling: 20535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.hitch(null, funcName, ...); 20545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var arr = [ null ]; 20555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.hitch.apply(d, arr.concat(d._toArray(arguments))); // Function 20565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 20575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var extraNames = d._extraNames, extraLen = extraNames.length, empty = {}; 20595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.clone = function(/*anything*/ o){ 20615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 20625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Clones objects (including DOM nodes) and all children. 20635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Warning: do not clone cyclic structures. 20645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!o || typeof o != "object" || d.isFunction(o)){ 20655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // null, undefined, any non-object, or function 20665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return o; // anything 20675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(o.nodeType && "cloneNode" in o){ 20695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM Node 20705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return o.cloneNode(true); // Node 20715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(o instanceof Date){ 20735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Date 20745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return new Date(o.getTime()); // Date 20755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(o instanceof RegExp){ 20775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // RegExp 20785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return new RegExp(o); // RegExp 20795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var r, i, l, s, name; 20815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isArray(o)){ 20825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // array 20835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) r = []; 20845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(i = 0, l = o.length; i < l; ++i){ 20855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(i in o){ 20865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) r.push(d.clone(o[i])); 20875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// we don't clone functions for performance reasons 20905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// }else if(d.isFunction(o)){ 20915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// // function 20925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// r = function(){ return o.apply(this, arguments); }; 20935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 20945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // generic objects 20955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) r = o.constructor ? new o.constructor() : {}; 20965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(name in o){ 20985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the "tobj" condition avoid copying properties in "source" 20995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // inherited from Object.prototype. For example, if target has a custom 21005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // toString() method, don't overwrite it with the toString() method 21015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that source inherited from Object.prototype 21025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s = o[name]; 21035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!(name in r) || (r[name] !== s && (!(name in empty) || empty[name] !== s))){ 21045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) r[name] = d.clone(s); 21055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // IE doesn't recognize some custom functions in for..in 21085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(extraLen){ 21095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(i = 0; i < extraLen; ++i){ 21105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = extraNames[i]; 21115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s = o[name]; 21125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!(name in r) || (r[name] !== s && (!(name in empty) || empty[name] !== s))){ 21135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) r[name] = s; // functions only, we don't clone them 21145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return r; // Object 21185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 21195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 21215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.trim = function(str){ 21225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 21235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Trims whitespace from both sides of the string 21245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // str: String 21255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // String to be trimmed 21265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: String 21275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the trimmed string 21285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 21295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This version of trim() was selected for inclusion into the base due 21305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to its compact size and relatively good performance 21315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (see [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript) 21325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Uses String.prototype.trim instead, if available. 21335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The fastest but longest version of this function is located at 21345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.string.trim() 21355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ""; // String 21365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 21385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.trim = String.prototype.trim ? 21405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function(str){ return str.trim(); } : 21415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function(str){ return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); }; 21425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 21445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.replace = function(tmpl, map, pattern){ 21455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 21465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Performs parameterized substitutions on a string. Throws an 21475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // exception if any parameter is unmatched. 21485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // tmpl: String 21495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // String to be used as a template. 21505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // map: Object|Function 21515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If an object, it is used as a dictionary to look up substitutions. 21525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If a function, it is called for every substitution with following 21535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // parameters: a whole match, a name, an offset, and the whole template 21545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // string (see https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace 21555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for more details). 21565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // pattern: RegEx? 21575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Optional regular expression objects that overrides the default pattern. 21585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Must be global and match one item. The default is: /\{([^\}]+)\}/g, 21595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // which matches patterns like that: "{xxx}", where "xxx" is any sequence 21605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of characters, which doesn't include "}". 21615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: String 21625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the substituted string. 21635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 21645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // uses a dictionary for substitutions: 21655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.replace("Hello, {name.first} {name.last} AKA {nick}!", 21665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | { 21675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | nick: "Bob", 21685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | name: { 21695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | first: "Robert", 21705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | middle: "X", 21715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | last: "Cringely" 21725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 21735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 21745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // returns: Hello, Robert Cringely AKA Bob! 21755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 21765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // uses an array for substitutions: 21775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.replace("Hello, {0} {2}!", 21785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ["Robert", "X", "Cringely"]); 21795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // returns: Hello, Robert Cringely! 21805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 21815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // uses a function for substitutions: 21825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | function sum(a){ 21835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var t = 0; 21845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.forEach(a, function(x){ t += x; }); 21855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return t; 21865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 21875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.replace( 21885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "{count} payments averaging {avg} USD per payment.", 21895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.hitch( 21905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | { payments: [11, 16, 12] }, 21915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | function(_, key){ 21925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | switch(key){ 21935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | case "count": return this.payments.length; 21945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | case "min": return Math.min.apply(Math, this.payments); 21955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | case "max": return Math.max.apply(Math, this.payments); 21965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | case "sum": return sum(this.payments); 21975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | case "avg": return sum(this.payments) / this.payments.length; 21985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 21995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 22005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ) 22015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ); 22025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // prints: 3 payments averaging 13 USD per payment. 22035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 22045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // uses an alternative PHP-like pattern for substitutions: 22055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.replace("Hello, ${0} ${2}!", 22065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ["Robert", "X", "Cringely"], /\$\{([^\}]+)\}/g); 22075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // returns: Hello, Robert Cringely! 22085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ""; // String 22095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 22115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _pattern = /\{([^\}]+)\}/g; 22135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.replace = function(tmpl, map, pattern){ 22145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return tmpl.replace(pattern || _pattern, d.isFunction(map) ? 22155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) map : function(_, k){ return d.getObject(k, false, map); }); 22165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 22175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 22185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.array"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 22225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.array"] = true; 22235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.array"); 22245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 22285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _getParts = function(arr, obj, cb){ 22295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return [ 22305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (typeof arr == "string") ? arr.split("") : arr, 22315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) obj || dojo.global, 22325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: cache the anonymous functions we create here? 22335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (typeof cb == "string") ? new Function("item", "index", "array", cb) : cb 22345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ]; 22355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 22365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var everyOrSome = function(/*Boolean*/every, /*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){ 22385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _p = _getParts(arr, thisObject, callback); arr = _p[0]; 22395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i=0,l=arr.length; i<l; ++i){ 22405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = !!_p[2].call(_p[1], arr[i], i, arr); 22415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(every ^ result){ 22425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; // Boolean 22435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return every; // Boolean 22465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 22475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.mixin(dojo, { 22495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) indexOf: function( /*Array*/ array, 22505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Object*/ value, 22515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Integer?*/ fromIndex, 22525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Boolean?*/ findLast){ 22535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 22545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // locates the first index of the provided value in the 22555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // passed array. If the value is not found, -1 is returned. 22565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 22575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This method corresponds to the JavaScript 1.6 Array.indexOf method, with one difference: when 22585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript 22595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1.6's indexOf skips the holes in the sparse array. 22605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For details on this method, see: 22615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf 22625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var step = 1, end = array.length || 0, i = 0; 22645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(findLast){ 22655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) i = end - 1; 22665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) step = end = -1; 22675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(fromIndex != undefined){ i = fromIndex; } 22695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if((findLast && i > end) || i < end){ 22705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(; i != end; i += step){ 22715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(array[i] == value){ return i; } 22725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return -1; // Number 22755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 22765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lastIndexOf: function(/*Array*/array, /*Object*/value, /*Integer?*/fromIndex){ 22785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 22795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // locates the last index of the provided value in the passed 22805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // array. If the value is not found, -1 is returned. 22815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 22825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This method corresponds to the JavaScript 1.6 Array.lastIndexOf method, with one difference: when 22835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript 22845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1.6's lastIndexOf skips the holes in the sparse array. 22855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For details on this method, see: 22865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/lastIndexOf 22875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dojo.indexOf(array, value, fromIndex, true); // Number 22885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 22895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) forEach: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){ 22915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 22925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for every item in arr, callback is invoked. Return values are ignored. 22935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If you want to break out of the loop, consider using dojo.every() or dojo.some(). 22945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // forEach does not allow breaking out of the loop over the items in arr. 22955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // arr: 22965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the array to iterate over. If a string, operates on individual characters. 22975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // callback: 22985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a function is invoked with three arguments: item, index, and array 22995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // thisObject: 23005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // may be used to scope the call to callback 23015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 23025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function corresponds to the JavaScript 1.6 Array.forEach() method, with one difference: when 23035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // run over sparse arrays, this implemenation passes the "holes" in the sparse array to 23045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the callback function with a value of undefined. JavaScript 1.6's forEach skips the holes in the sparse array. 23055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For more details, see: 23065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach 23075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 23085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // log out all members of the array: 23095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.forEach( 23105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | [ "thinger", "blah", "howdy", 10 ], 23115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | function(item){ 23125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(item); 23135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 23145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ); 23155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 23165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // log out the members and their indexes 23175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.forEach( 23185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | [ "thinger", "blah", "howdy", 10 ], 23195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | function(item, idx, arr){ 23205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(item, "at index:", idx); 23215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 23225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ); 23235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 23245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // use a scoped object member as the callback 23255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 23265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var obj = { 23275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | prefix: "logged via obj.callback:", 23285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | callback: function(item){ 23295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(this.prefix, item); 23305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 23315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }; 23325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 23335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // specifying the scope function executes the callback in that scope 23345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.forEach( 23355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | [ "thinger", "blah", "howdy", 10 ], 23365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | obj.callback, 23375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | obj 23385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ); 23395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 23405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // alternately, we can accomplish the same thing with dojo.hitch() 23415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.forEach( 23425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | [ "thinger", "blah", "howdy", 10 ], 23435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.hitch(obj, "callback") 23445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ); 23455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // match the behavior of the built-in forEach WRT empty arrs 23475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!arr || !arr.length){ return; } 23485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: there are several ways of handilng thisObject. Is 23505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.global always the default context? 23515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _p = _getParts(arr, thisObject, callback); arr = _p[0]; 23525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i=0,l=arr.length; i<l; ++i){ 23535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _p[2].call(_p[1], arr[i], i, arr); 23545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 23555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 23565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) every: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){ 23585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 23595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Determines whether or not every item in arr satisfies the 23605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // condition implemented by callback. 23615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // arr: 23625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the array to iterate on. If a string, operates on individual characters. 23635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // callback: 23645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a function is invoked with three arguments: item, index, 23655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and array and returns true if the condition is met. 23665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // thisObject: 23675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // may be used to scope the call to callback 23685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 23695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function corresponds to the JavaScript 1.6 Array.every() method, with one difference: when 23705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // run over sparse arrays, this implemenation passes the "holes" in the sparse array to 23715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the callback function with a value of undefined. JavaScript 1.6's every skips the holes in the sparse array. 23725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For more details, see: 23735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/every 23745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 23755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // returns false 23765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.every([1, 2, 3, 4], function(item){ return item>1; }); 23775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 23785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // returns true 23795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.every([1, 2, 3, 4], function(item){ return item>0; }); 23805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return everyOrSome(true, arr, callback, thisObject); // Boolean 23815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 23825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) some: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){ 23845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 23855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Determines whether or not any item in arr satisfies the 23865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // condition implemented by callback. 23875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // arr: 23885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the array to iterate over. If a string, operates on individual characters. 23895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // callback: 23905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a function is invoked with three arguments: item, index, 23915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and array and returns true if the condition is met. 23925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // thisObject: 23935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // may be used to scope the call to callback 23945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 23955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function corresponds to the JavaScript 1.6 Array.some() method, with one difference: when 23965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // run over sparse arrays, this implemenation passes the "holes" in the sparse array to 23975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the callback function with a value of undefined. JavaScript 1.6's some skips the holes in the sparse array. 23985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For more details, see: 23995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/some 24005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 24015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // is true 24025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.some([1, 2, 3, 4], function(item){ return item>1; }); 24035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 24045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // is false 24055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.some([1, 2, 3, 4], function(item){ return item<1; }); 24065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return everyOrSome(false, arr, callback, thisObject); // Boolean 24075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 24085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) map: function(/*Array|String*/arr, /*Function|String*/callback, /*Function?*/thisObject){ 24105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 24115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // applies callback to each element of arr and returns 24125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an Array with the results 24135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // arr: 24145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the array to iterate on. If a string, operates on 24155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // individual characters. 24165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // callback: 24175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a function is invoked with three arguments, (item, index, 24185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // array), and returns a value 24195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // thisObject: 24205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // may be used to scope the call to callback 24215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 24225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when 24235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // run over sparse arrays, this implemenation passes the "holes" in the sparse array to 24245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array. 24255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For more details, see: 24265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map 24275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 24285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // returns [2, 3, 4, 5] 24295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.map([1, 2, 3, 4], function(item){ return item+1 }); 24305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _p = _getParts(arr, thisObject, callback); arr = _p[0]; 24325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var outArr = (arguments[3] ? (new arguments[3]()) : []); 24335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i=0,l=arr.length; i<l; ++i){ 24345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) outArr.push(_p[2].call(_p[1], arr[i], i, arr)); 24355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 24365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return outArr; // Array 24375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 24385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) filter: function(/*Array*/arr, /*Function|String*/callback, /*Object?*/thisObject){ 24405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 24415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a new Array with those items from arr that match the 24425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // condition implemented by callback. 24435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // arr: 24445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the array to iterate over. 24455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // callback: 24465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a function that is invoked with three arguments (item, 24475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // index, array). The return of this function is expected to 24485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be a boolean which determines whether the passed-in item 24495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will be included in the returned array. 24505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // thisObject: 24515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // may be used to scope the call to callback 24525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 24535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function corresponds to the JavaScript 1.6 Array.filter() method, with one difference: when 24545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // run over sparse arrays, this implemenation passes the "holes" in the sparse array to 24555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the callback function with a value of undefined. JavaScript 1.6's filter skips the holes in the sparse array. 24565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For more details, see: 24575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter 24585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 24595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // returns [2, 3, 4] 24605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.filter([1, 2, 3, 4], function(item){ return item>1; }); 24615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _p = _getParts(arr, thisObject, callback); arr = _p[0]; 24635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var outArr = []; 24645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i=0,l=arr.length; i<l; ++i){ 24655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_p[2].call(_p[1], arr[i], i, arr)){ 24665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) outArr.push(arr[i]); 24675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 24685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 24695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return outArr; // Array 24705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 24715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 24725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 24735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 24745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/ 24755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.declare"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 24795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.declare"] = true; 24805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.declare"); 24815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 24865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var d = dojo, mix = d._mixin, op = Object.prototype, opts = op.toString, 24875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xtor = new Function, counter = 0, cname = "constructor"; 24885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function err(msg, cls){ throw new Error("declare" + (cls ? " " + cls : "") + ": " + msg); } 24905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // C3 Method Resolution Order (see http://www.python.org/download/releases/2.3/mro/) 24925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function c3mro(bases, className){ 24935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = [], roots = [{cls: 0, refs: []}], nameMap = {}, clsCount = 1, 24945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l = bases.length, i = 0, j, lin, base, top, proto, rec, name, refs; 24955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // build a list of bases naming them if needed 24975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(; i < l; ++i){ 24985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base = bases[i]; 24995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!base){ 25005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err("mixin #" + i + " is unknown. Did you use dojo.require to pull it in?", className); 25015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(opts.call(base) != "[object Function]"){ 25025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err("mixin #" + i + " is not a callable constructor.", className); 25035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lin = base._meta ? base._meta.bases : [base]; 25055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) top = 0; 25065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add bases to the name map 25075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(j = lin.length - 1; j >= 0; --j){ 25085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto = lin[j].prototype; 25095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!proto.hasOwnProperty("declaredClass")){ 25105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto.declaredClass = "uniqName_" + (counter++); 25115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = proto.declaredClass; 25135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!nameMap.hasOwnProperty(name)){ 25145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nameMap[name] = {count: 0, refs: [], cls: lin[j]}; 25155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++clsCount; 25165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) rec = nameMap[name]; 25185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(top && top !== rec){ 25195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) rec.refs.push(top); 25205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++top.count; 25215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) top = rec; 25235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++top.count; 25255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) roots[0].refs.push(top); 25265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // remove classes without external references recursively 25295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(roots.length){ 25305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) top = roots.pop(); 25315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.push(top.cls); 25325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) --clsCount; 25335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // optimization: follow a single-linked chain 25345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(refs = top.refs, refs.length == 1){ 25355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) top = refs[0]; 25365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!top || --top.count){ 25375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // branch or end of chain => do not end to roots 25385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) top = 0; 25395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 25405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.push(top.cls); 25425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) --clsCount; 25435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(top){ 25455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // branch 25465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(i = 0, l = refs.length; i < l; ++i){ 25475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) top = refs[i]; 25485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!--top.count){ 25495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) roots.push(top); 25505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(clsCount){ 25555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err("can't build consistent linearization", className); 25565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // calculate the superclass offset 25595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base = bases[0]; 25605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result[0] = base ? 25615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base._meta && base === result[result.length - base._meta.bases.length] ? 25625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base._meta.bases.length : 1 : 0; 25635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 25655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function inherited(args, a, f){ 25685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var name, chains, bases, caller, meta, base, proto, opf, pos, 25695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cache = this._inherited = this._inherited || {}; 25705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // crack arguments 25725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof args == "string"){ 25735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = args; 25745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) args = a; 25755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a = f; 25765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = 0; 25785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) caller = args.callee; 25805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = name || caller.nom; 25815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!name){ 25825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err("can't deduce a name to call inherited()", this.declaredClass); 25835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) meta = this.constructor._meta; 25865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bases = meta.bases; 25875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pos = cache.p; 25895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(name != cname){ 25905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // method 25915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cache.c !== caller){ 25925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cache bust 25935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pos = 0; 25945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base = bases[0]; 25955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) meta = base._meta; 25965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(meta.hidden[name] !== caller){ 25975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // error detection 25985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) chains = meta.chains; 25995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(chains && typeof chains[name] == "string"){ 26005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err("calling chained method with inherited: " + name, this.declaredClass); 26015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // find caller 26035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) do{ 26045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) meta = base._meta; 26055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto = base.prototype; 26065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(meta && (proto[name] === caller && proto.hasOwnProperty(name) || meta.hidden[name] === caller)){ 26075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 26085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }while(base = bases[++pos]); // intentional assignment 26105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pos = base ? pos : -1; 26115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // find next 26145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base = bases[++pos]; 26155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(base){ 26165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto = base.prototype; 26175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(base._meta && proto.hasOwnProperty(name)){ 26185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = proto[name]; 26195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 26205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) opf = op[name]; 26215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) do{ 26225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto = base.prototype; 26235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = proto[name]; 26245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f && (base._meta ? proto.hasOwnProperty(name) : f !== opf)){ 26255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 26265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }while(base = bases[++pos]); // intentional assignment 26285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = base && f || op[name]; 26315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 26325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // constructor 26335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cache.c !== caller){ 26345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cache bust 26355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pos = 0; 26365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) meta = bases[0]._meta; 26375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(meta && meta.ctor !== caller){ 26385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // error detection 26395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) chains = meta.chains; 26405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!chains || chains.constructor !== "manual"){ 26415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err("calling chained constructor with inherited", this.declaredClass); 26425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // find caller 26445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(base = bases[++pos]){ // intentional assignment 26455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) meta = base._meta; 26465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(meta && meta.ctor === caller){ 26475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 26485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pos = base ? pos : -1; 26515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // find next 26545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(base = bases[++pos]){ // intentional assignment 26555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) meta = base._meta; 26565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = meta ? meta.ctor : base; 26575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 26585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 26595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = base && f; 26625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cache the found super method 26655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cache.c = f; 26665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cache.p = pos; 26675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // now we have the result 26695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 26705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a === true ? f : f.apply(this, a || args); 26715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // intentionally if a super method was not found 26735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function getInherited(name, args){ 26765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof name == "string"){ 26775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.inherited(name, args, true); 26785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.inherited(name, true); 26805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // emulation of "instanceof" 26835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function isInstanceOf(cls){ 26845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var bases = this.constructor._meta.bases; 26855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = 0, l = bases.length; i < l; ++i){ 26865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(bases[i] === cls){ 26875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 26885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this instanceof cls; 26915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function mixOwn(target, source){ 26945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var name, i = 0, l = d._extraNames.length; 26955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add props adding metadata for incoming functions skipping a constructor 26965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(name in source){ 26975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(name != cname && source.hasOwnProperty(name)){ 26985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) target[name] = source[name]; 26995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // process unenumerable methods on IE 27025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(; i < l; ++i){ 27035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = d._extraNames[i]; 27045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(name != cname && source.hasOwnProperty(name)){ 27055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) target[name] = source[name]; 27065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // implementation of safe mixin function 27115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function safeMixin(target, source){ 27125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var name, t, i = 0, l = d._extraNames.length; 27135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add props adding metadata for incoming functions skipping a constructor 27145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(name in source){ 27155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = source[name]; 27165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if((t !== op[name] || !(name in op)) && name != cname){ 27175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(opts.call(t) == "[object Function]"){ 27185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // non-trivial function method => attach its name 27195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t.nom = name; 27205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) target[name] = t; 27225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // process unenumerable methods on IE 27255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(; i < l; ++i){ 27265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = d._extraNames[i]; 27275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = source[name]; 27285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if((t !== op[name] || !(name in op)) && name != cname){ 27295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(opts.call(t) == "[object Function]"){ 27305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // non-trivial function method => attach its name 27315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t.nom = name; 27325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) target[name] = t; 27345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return target; 27375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function extend(source){ 27405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) safeMixin(this.prototype, source); 27415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; 27425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // chained constructor compatible with the legacy dojo.declare() 27455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function chainedConstructor(bases, ctorSpecial){ 27465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(){ 27475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var a = arguments, args = a, a0 = a[0], f, i, m, 27485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l = bases.length, preArgs; 27495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!(this instanceof a.callee)){ 27515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not called via new, so force it 27525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return applyNew(a); 27535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //this._inherited = {}; 27565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // perform the shaman's rituals of the original dojo.declare() 27575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1) call two types of the preamble 27585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(ctorSpecial && (a0 && a0.preamble || this.preamble)){ 27595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // full blown ritual 27605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) preArgs = new Array(bases.length); 27615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // prepare parameters 27625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) preArgs[0] = a; 27635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(i = 0;;){ 27645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // process the preamble of the 1st argument 27655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a0 = a[0]; 27665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(a0){ 27675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = a0.preamble; 27685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 27695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a = f.apply(this, a) || a; 27705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // process the preamble of this class 27735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = bases[i].prototype; 27745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = f.hasOwnProperty("preamble") && f.preamble; 27755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 27765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a = f.apply(this, a) || a; 27775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // one peculiarity of the preamble: 27795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it is called if it is not needed, 27805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // e.g., there is no constructor to call 27815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // let's watch for the last constructor 27825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (see ticket #9795) 27835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(++i == l){ 27845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 27855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) preArgs[i] = a; 27875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 2) call all non-trivial constructors using prepared arguments 27905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(i = l - 1; i >= 0; --i){ 27915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = bases[i]; 27925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m = f._meta; 27935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = m ? m.ctor : f; 27945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 27955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f.apply(this, preArgs ? preArgs[i] : a); 27965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 3) continue the original ritual: call the postscript 27995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = this.postscript; 28005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 28015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f.apply(this, args); 28025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 28045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // chained constructor compatible with the legacy dojo.declare() 28085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function singleConstructor(ctor, ctorSpecial){ 28095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(){ 28105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var a = arguments, t = a, a0 = a[0], f; 28115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!(this instanceof a.callee)){ 28135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not called via new, so force it 28145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return applyNew(a); 28155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //this._inherited = {}; 28185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // perform the shaman's rituals of the original dojo.declare() 28195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1) call two types of the preamble 28205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(ctorSpecial){ 28215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // full blown ritual 28225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(a0){ 28235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // process the preamble of the 1st argument 28245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = a0.preamble; 28255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 28265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = f.apply(this, t) || t; 28275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = this.preamble; 28305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 28315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // process the preamble of this class 28325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f.apply(this, t); 28335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // one peculiarity of the preamble: 28345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it is called even if it is not needed, 28355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // e.g., there is no constructor to call 28365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // let's watch for the last constructor 28375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (see ticket #9795) 28385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 2) call a constructor 28415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(ctor){ 28425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ctor.apply(this, a); 28435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 3) continue the original ritual: call the postscript 28455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = this.postscript; 28465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 28475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f.apply(this, a); 28485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 28505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // plain vanilla constructor (can use inherited() to call its base constructor) 28535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function simpleConstructor(bases){ 28545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(){ 28555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var a = arguments, i = 0, f, m; 28565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!(this instanceof a.callee)){ 28585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not called via new, so force it 28595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return applyNew(a); 28605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //this._inherited = {}; 28635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // perform the shaman's rituals of the original dojo.declare() 28645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1) do not call the preamble 28655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 2) call the top constructor (it can use this.inherited()) 28665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(; f = bases[i]; ++i){ // intentional assignment 28675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m = f._meta; 28685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = m ? m.ctor : f; 28695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 28705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f.apply(this, a); 28715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 28725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 3) call the postscript 28755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = this.postscript; 28765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 28775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f.apply(this, a); 28785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 28805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function chain(name, bases, reversed){ 28835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(){ 28845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var b, m, f, i = 0, step = 1; 28855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(reversed){ 28865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) i = bases.length - 1; 28875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) step = -1; 28885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(; b = bases[i]; i += step){ // intentional assignment 28905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m = b._meta; 28915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = (m ? m.hidden : b.prototype)[name]; 28925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 28935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f.apply(this, arguments); 28945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 28975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // forceNew(ctor) 29005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return a new object that inherits from ctor.prototype but 29015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // without actually running ctor on the object. 29025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function forceNew(ctor){ 29035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // create object with correct prototype using a do-nothing 29045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // constructor 29055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xtor.prototype = ctor.prototype; 29065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var t = new xtor; 29075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xtor.prototype = null; // clean up 29085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return t; 29095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // applyNew(args) 29125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // just like 'new ctor()' except that the constructor and its arguments come 29135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // from args, which must be an array or an arguments object 29145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function applyNew(args){ 29155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // create an object with ctor's prototype but without 29165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // calling ctor on it. 29175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ctor = args.callee, t = forceNew(ctor); 29185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // execute the real constructor on the new object 29195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ctor.apply(t, args); 29205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return t; 29215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.declare = function(className, superclass, props){ 29245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // crack parameters 29255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof className != "string"){ 29265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) props = superclass; 29275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) superclass = className; 29285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) className = ""; 29295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) props = props || {}; 29315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var proto, i, t, ctor, name, bases, chains, mixins = 1, parents = superclass; 29335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // build a prototype 29355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(opts.call(superclass) == "[object Array]"){ 29365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // C3 MRO 29375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bases = c3mro(superclass, className); 29385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = bases[0]; 29395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mixins = bases.length - t; 29405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) superclass = bases[mixins]; 29415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 29425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bases = [0]; 29435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(superclass){ 29445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(opts.call(superclass) == "[object Function]"){ 29455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = superclass._meta; 29465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bases = bases.concat(t ? t.bases : superclass); 29475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 29485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err("base class is not a callable constructor.", className); 29495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(superclass !== null){ 29515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err("unknown base class. Did you use dojo.require to pull it in?", className); 29525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(superclass){ 29555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(i = mixins - 1;; --i){ 29565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto = forceNew(superclass); 29575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!i){ 29585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // stop if nothing to add (the last base) 29595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 29605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // mix in properties 29625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = bases[i]; 29635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (t._meta ? mixOwn : mix)(proto, t.prototype); 29645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // chain in new constructor 29655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ctor = new Function; 29665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ctor.superclass = superclass; 29675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ctor.prototype = proto; 29685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) superclass = proto.constructor = ctor; 29695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 29715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto = {}; 29725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add all properties 29745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) safeMixin(proto, props); 29755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add constructor 29765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = props.constructor; 29775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(t !== op.constructor){ 29785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t.nom = cname; 29795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto.constructor = t; 29805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // collect chains and flags 29835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(i = mixins - 1; i; --i){ // intentional assignment 29845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = bases[i]._meta; 29855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(t && t.chains){ 29865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) chains = mix(chains || {}, t.chains); 29875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(proto["-chains-"]){ 29905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) chains = mix(chains || {}, proto["-chains-"]); 29915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 29925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // build ctor 29945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = !chains || !chains.hasOwnProperty(cname); 29955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bases[0] = ctor = (chains && chains.constructor === "manual") ? simpleConstructor(bases) : 29965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (bases.length == 1 ? singleConstructor(props.constructor, t) : chainedConstructor(bases, t)); 29975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add meta information to the constructor 29995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ctor._meta = {bases: bases, hidden: props, chains: chains, 30005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parents: parents, ctor: props.constructor}; 30015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ctor.superclass = superclass && superclass.prototype; 30025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ctor.extend = extend; 30035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ctor.prototype = proto; 30045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto.constructor = ctor; 30055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add "standard" methods to the prototype 30075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto.getInherited = getInherited; 30085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto.inherited = inherited; 30095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto.isInstanceOf = isInstanceOf; 30105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add name if specified 30125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(className){ 30135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) proto.declaredClass = className; 30145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.setObject(className, ctor); 30155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 30165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // build chains and add them to the prototype 30185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(chains){ 30195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(name in chains){ 30205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(proto[name] && typeof chains[name] == "string" && name != cname){ 30215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = proto[name] = chain(name, bases, chains[name] === "after"); 30225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t.nom = name; 30235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 30245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 30255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 30265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // chained methods do not return values 30275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // no need to chain "invisible" functions 30285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ctor; // Function 30305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 30315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.safeMixin = safeMixin; 30335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 30355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.declare = function(className, superclass, props){ 30365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 30375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create a feature-rich constructor from compact notation. 30385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // className: String?: 30395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The optional name of the constructor (loosely, a "class") 30405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // stored in the "declaredClass" property in the created prototype. 30415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It will be used as a global name for a created constructor. 30425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // superclass: Function|Function[]: 30435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // May be null, a Function, or an Array of Functions. This argument 30445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // specifies a list of bases (the left-most one is the most deepest 30455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // base). 30465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // props: Object: 30475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An object whose properties are copied to the created prototype. 30485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Add an instance-initialization function by making it a property 30495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // named "constructor". 30505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 30515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // New constructor function. 30525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 30535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create a constructor using a compact notation for inheritance and 30545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // prototype extension. 30555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 30565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Mixin ancestors provide a type of multiple inheritance. 30575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Prototypes of mixin ancestors are copied to the new class: 30585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // changes to mixin prototypes will not affect classes to which 30595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // they have been mixed in. 30605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 30615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ancestors can be compound classes created by this version of 30625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.declare. In complex cases all base classes are going to be 30635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // linearized according to C3 MRO algorithm 30645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (see http://www.python.org/download/releases/2.3/mro/ for more 30655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // details). 30665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 30675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "className" is cached in "declaredClass" property of the new class, 30685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if it was supplied. The immediate super class will be cached in 30695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "superclass" property of the new class. 30705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 30715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Methods in "props" will be copied and modified: "nom" property 30725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (the declared name of the method) will be added to all copied 30735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // functions to help identify them for the internal machinery. Be 30745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // very careful, while reusing methods: if you use the same 30755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // function under different names, it can produce errors in some 30765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cases. 30775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 30785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It is possible to use constructors created "manually" (without 30795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.declare) as bases. They will be called as usual during the 30805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // creation of an instance, their methods will be chained, and even 30815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // called by "this.inherited()". 30825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 30835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Special property "-chains-" governs how to chain methods. It is 30845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a dictionary, which uses method names as keys, and hint strings 30855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // as values. If a hint string is "after", this method will be 30865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // called after methods of its base classes. If a hint string is 30875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "before", this method will be called before methods of its base 30885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // classes. 30895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 30905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If "constructor" is not mentioned in "-chains-" property, it will 30915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be chained using the legacy mode: using "after" chaining, 30925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // calling preamble() method before each constructor, if available, 30935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and calling postscript() after all constructors were executed. 30945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the hint is "after", it is chained as a regular method, but 30955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // postscript() will be called after the chain of constructors. 30965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "constructor" cannot be chained "before", but it allows 30975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a special hint string: "manual", which means that constructors 30985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // are not going to be chained in any way, and programmer will call 30995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // them manually using this.inherited(). In the latter case 31005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // postscript() will be called after the construction. 31015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 31025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // All chaining hints are "inherited" from base classes and 31035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // potentially can be overridden. Be very careful when overriding 31045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // hints! Make sure that all chained methods can work in a proposed 31055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // manner of chaining. 31065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 31075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Once a method was chained, it is impossible to unchain it. The 31085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // only exception is "constructor". You don't need to define a 31095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // method in order to supply a chaining hint. 31105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 31115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If a method is chained, it cannot use this.inherited() because 31125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // all other methods in the hierarchy will be called automatically. 31135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 31145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Usually constructors and initializers of any kind are chained 31155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // using "after" and destructors of any kind are chained as 31165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "before". Note that chaining assumes that chained methods do not 31175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return any value: any returned value will be discarded. 31185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 31195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 31205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.declare("my.classes.bar", my.classes.foo, { 31215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // properties to be added to the class prototype 31225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | someValue: 2, 31235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // initialization function 31245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | constructor: function(){ 31255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | this.myComplicatedObject = new ReallyComplicatedObject(); 31265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 31275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // other functions 31285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | someMethod: function(){ 31295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | doStuff(); 31305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 31315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 31325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 31335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 31345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var MyBase = dojo.declare(null, { 31355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // constructor, properties, and methods go here 31365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 31375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 31385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var MyClass1 = dojo.declare(MyBase, { 31395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // constructor, properties, and methods go here 31405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 31415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 31425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var MyClass2 = dojo.declare(MyBase, { 31435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // constructor, properties, and methods go here 31445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 31455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 31465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var MyDiamond = dojo.declare([MyClass1, MyClass2], { 31475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // constructor, properties, and methods go here 31485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 31495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 31505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 31515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 31525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var F = function(){ console.log("raw constructor"); }; 31535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | F.prototype.method = function(){ 31545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("raw method"); 31555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }; 31565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var A = dojo.declare(F, { 31575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | constructor: function(){ 31585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("A.constructor"); 31595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 31605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | method: function(){ 31615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("before calling F.method..."); 31625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | this.inherited(arguments); 31635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("...back in A"); 31645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 31655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 31665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | new A().method(); 31675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // will print: 31685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // raw constructor 31695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // A.constructor 31705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // before calling F.method... 31715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // raw method 31725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ...back in A 31735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 31745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 31755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var A = dojo.declare(null, { 31765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "-chains-": { 31775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | destroy: "before" 31785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 31795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 31805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var B = dojo.declare(A, { 31815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | constructor: function(){ 31825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("B.constructor"); 31835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 31845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | destroy: function(){ 31855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("B.destroy"); 31865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 31875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 31885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var C = dojo.declare(B, { 31895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | constructor: function(){ 31905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("C.constructor"); 31915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 31925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | destroy: function(){ 31935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("C.destroy"); 31945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 31955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 31965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | new C().destroy(); 31975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // prints: 31985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // B.constructor 31995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // C.constructor 32005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // C.destroy 32015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // B.destroy 32025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 32035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 32045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var A = dojo.declare(null, { 32055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "-chains-": { 32065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | constructor: "manual" 32075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 32085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 32095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var B = dojo.declare(A, { 32105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | constructor: function(){ 32115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 32125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // call the base constructor with new parameters 32135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | this.inherited(arguments, [1, 2, 3]); 32145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 32155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 32165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 32175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 32185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 32195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var A = dojo.declare(null, { 32205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "-chains-": { 32215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m1: "before" 32225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 32235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m1: function(){ 32245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("A.m1"); 32255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 32265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m2: function(){ 32275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("A.m2"); 32285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 32295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 32305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var B = dojo.declare(A, { 32315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "-chains-": { 32325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m2: "after" 32335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 32345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m1: function(){ 32355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("B.m1"); 32365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 32375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m2: function(){ 32385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("B.m2"); 32395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 32405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 32415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var x = new B(); 32425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | x.m1(); 32435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // prints: 32445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // B.m1 32455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // A.m1 32465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | x.m2(); 32475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // prints: 32485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // A.m2 32495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // B.m2 32505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return new Function(); // Function 32515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 32525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 32535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 32555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.safeMixin = function(target, source){ 32565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 32575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Mix in properties skipping a constructor and decorating functions 32585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // like it is done by dojo.declare. 32595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // target: Object 32605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Target object to accept new properties. 32615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // source: Object 32625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Source object for new properties. 32635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 32645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function is used to mix in properties like dojo._mixin does, 32655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // but it skips a constructor property and decorates functions like 32665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.declare does. 32675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 32685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It is meant to be used with classes and objects produced with 32695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.declare. Functions mixed in with dojo.safeMixin can use 32705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this.inherited() like normal methods. 32715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 32725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function is used to implement extend() method of a constructor 32735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // produced with dojo.declare(). 32745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 32755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 32765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var A = dojo.declare(null, { 32775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m1: function(){ 32785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("A.m1"); 32795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 32805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m2: function(){ 32815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("A.m2"); 32825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 32835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 32845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var B = dojo.declare(A, { 32855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m1: function(){ 32865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | this.inherited(arguments); 32875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("B.m1"); 32885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 32895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 32905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | B.extend({ 32915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m2: function(){ 32925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | this.inherited(arguments); 32935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("B.m2"); 32945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 32955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 32965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var x = new B(); 32975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.safeMixin(x, { 32985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m1: function(){ 32995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | this.inherited(arguments); 33005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("X.m1"); 33015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 33025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m2: function(){ 33035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | this.inherited(arguments); 33045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("X.m2"); 33055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 33065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 33075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | x.m2(); 33085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // prints: 33095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // A.m1 33105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // B.m1 33115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // X.m1 33125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 33135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 33145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 33165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Object.inherited = function(name, args, newArgs){ 33175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 33185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Calls a super method. 33195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name: String? 33205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The optional method name. Should be the same as the caller's 33215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name. Usually "name" is specified in complex dynamic cases, when 33225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the calling method was dynamically added, undecorated by 33235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.declare, and it cannot be determined. 33245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // args: Arguments 33255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The caller supply this argument, which should be the original 33265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "arguments". 33275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // newArgs: Object? 33285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If "true", the found function will be returned without 33295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // executing it. 33305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If Array, it will be used to call a super method. Otherwise 33315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "args" will be used. 33325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 33335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Whatever is returned by a super method, or a super method itself, 33345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if "true" was specified as newArgs. 33355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 33365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This method is used inside method of classes produced with 33375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.declare to call a super method (next in the chain). It is 33385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // used for manually controlled chaining. Consider using the regular 33395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // chaining, because it is faster. Use "this.inherited()" only in 33405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // complex cases. 33415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 33425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This method cannot me called from automatically chained 33435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // constructors including the case of a special (legacy) 33445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // constructor chaining. It cannot be called from chained methods. 33455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 33465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If "this.inherited()" cannot find the next-in-chain method, it 33475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // does nothing and returns "undefined". The last method in chain 33485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can be a default method implemented in Object, which will be 33495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // called last. 33505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 33515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If "name" is specified, it is assumed that the method that 33525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // received "args" is the parent method for this call. It is looked 33535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // up in the chain list and if it is found the next-in-chain method 33545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is called. If it is not found, the first-in-chain method is 33555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // called. 33565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 33575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If "name" is not specified, it will be derived from the calling 33585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // method (using a methoid property "nom"). 33595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 33605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 33615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var B = dojo.declare(A, { 33625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | method1: function(a, b, c){ 33635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | this.inherited(arguments); 33645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 33655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | method2: function(a, b){ 33665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return this.inherited(arguments, [a + b]); 33675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 33685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 33695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // next method is not in the chain list because it is added 33705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // manually after the class was created. 33715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | B.prototype.method3 = function(){ 33725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("This is a dynamically-added method."); 33735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | this.inherited("method3", arguments); 33745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }; 33755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 33765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var B = dojo.declare(A, { 33775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | method: function(a, b){ 33785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var super = this.inherited(arguments, true); 33795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 33805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(!super){ 33815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("there is no super method"); 33825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return 0; 33835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 33845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return super.apply(this, arguments); 33855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 33865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 33875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return {}; // Object 33885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 33895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 33905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 33925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Object.getInherited = function(name, args){ 33935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 33945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a super method. 33955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name: String? 33965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The optional method name. Should be the same as the caller's 33975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name. Usually "name" is specified in complex dynamic cases, when 33985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the calling method was dynamically added, undecorated by 33995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.declare, and it cannot be determined. 34005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // args: Arguments 34015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The caller supply this argument, which should be the original 34025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "arguments". 34035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 34045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a super method (Function) or "undefined". 34055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 34065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This method is a convenience method for "this.inherited()". 34075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It uses the same algorithm but instead of executing a super 34085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // method, it returns it, or "undefined" if not found. 34095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 34105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 34115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var B = dojo.declare(A, { 34125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | method: function(a, b){ 34135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var super = this.getInherited(arguments); 34145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 34155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(!super){ 34165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("there is no super method"); 34175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return 0; 34185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 34195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return super.apply(this, arguments); 34205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 34215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 34225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return {}; // Object 34235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 34245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 34255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 34275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Object.isInstanceOf = function(cls){ 34285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 34295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Checks the inheritance chain to see if it is inherited from this 34305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // class. 34315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cls: Function 34325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Class constructor. 34335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 34345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "true", if this object is inherited from this class, "false" 34355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // otherwise. 34365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 34375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This method is used with instances of classes produced with 34385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.declare to determine of they support a certain interface or 34395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not. It models "instanceof" operator. 34405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 34415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 34425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var A = dojo.declare(null, { 34435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // constructor, properties, and methods go here 34445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 34455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 34465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var B = dojo.declare(null, { 34475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // constructor, properties, and methods go here 34485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 34495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 34505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var C = dojo.declare([A, B], { 34515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // constructor, properties, and methods go here 34525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 34535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 34545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var D = dojo.declare(A, { 34555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // constructor, properties, and methods go here 34565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... 34575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 34585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 34595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var a = new A(), b = new B(), c = new C(), d = new D(); 34605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 34615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(a.isInstanceOf(A)); // true 34625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(b.isInstanceOf(A)); // false 34635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(c.isInstanceOf(A)); // true 34645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(d.isInstanceOf(A)); // true 34655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 34665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(a.isInstanceOf(B)); // false 34675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(b.isInstanceOf(B)); // true 34685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(c.isInstanceOf(B)); // true 34695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(d.isInstanceOf(B)); // false 34705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 34715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(a.isInstanceOf(C)); // false 34725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(b.isInstanceOf(C)); // false 34735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(c.isInstanceOf(C)); // true 34745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(d.isInstanceOf(C)); // false 34755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 34765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(a.isInstanceOf(D)); // false 34775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(b.isInstanceOf(D)); // false 34785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(c.isInstanceOf(D)); // false 34795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(d.isInstanceOf(D)); // true 34805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return {}; // Object 34815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 34825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 34835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 34855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Object.extend = function(source){ 34865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 34875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Adds all properties and methods of source to constructor's 34885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // prototype, making them available to all instances created with 34895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // constructor. This method is specific to constructors created with 34905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.declare. 34915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // source: Object 34925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Source object which properties are going to be copied to the 34935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // constructor's prototype. 34945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 34955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Adds source properties to the constructor's prototype. It can 34965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // override existing properties. 34975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 34985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This method is similar to dojo.extend function, but it is specific 34995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to constructors produced by dojo.declare. It is implemented 35005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // using dojo.safeMixin, and it skips a constructor property, 35015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and properly decorates copied functions. 35025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 35035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 35045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var A = dojo.declare(null, { 35055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m1: function(){}, 35065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | s1: "Popokatepetl" 35075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 35085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | A.extend({ 35095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m1: function(){}, 35105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | m2: function(){}, 35115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | f1: true, 35125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | d1: 42 35135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 35145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 35155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 35165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 35175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 35195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.connect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 35215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.connect"] = true; 35225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.connect"); 35235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA 35275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// low-level delegation machinery 35295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._listener = { 35305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // create a dispatcher function 35315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) getDispatcher: function(){ 35325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // following comments pulled out-of-line to prevent cloning them 35335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in the returned function. 35345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // - indices (i) that are really in the array of listeners (ls) will 35355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not be in Array.prototype. This is the 'sparse array' trick 35365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that keeps us safe from libs that take liberties with built-in 35375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // objects 35385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // - listener is invoked with current scope (this) 35395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(){ 35405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ap = Array.prototype, c = arguments.callee, ls = c._listeners, t = c.target, 35415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return value comes from original target function 35425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) r = t && t.apply(this, arguments), 35435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // make local copy of listener array so it is immutable during processing 35445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) i, lls = [].concat(ls) 35455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ; 35465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // invoke listeners after target function 35485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(i in lls){ 35495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!(i in ap)){ 35505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lls[i].apply(this, arguments); 35515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 35525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 35535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return value comes from original target function 35545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return r; 35555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 35565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 35575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add a listener to an object 35585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) add: function(/*Object*/ source, /*String*/ method, /*Function*/ listener){ 35595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Whenever 'method' is invoked, 'listener' will have the same scope. 35605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Trying to supporting a context object for the listener led to 35615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // complexity. 35625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Non trivial to provide 'once' functionality here 35635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // because listener could be the result of a dojo.hitch call, 35645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in which case two references to the same hitch target would not 35655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be equivalent. 35665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) source = source || dojo.global; 35675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The source method is either null, a dispatcher, or some other function 35685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var f = source[method]; 35695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ensure a dispatcher 35705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!f || !f._listeners){ 35715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var d = dojo._listener.getDispatcher(); 35725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // original target function is special 35735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.target = f; 35745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dispatcher holds a list of listeners 35755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._listeners = []; 35765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // redirect source to dispatcher 35775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = source[method] = d; 35785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 35795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The contract is that a handle is returned that can 35805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // identify this listener for disconnect. 35815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 35825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The type of the handle is private. Here is it implemented as Integer. 35835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM event code has this same contract but handle is Function 35845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in non-IE browsers. 35855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 35865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We could have separate lists of before and after listeners. 35875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return f._listeners.push(listener); /*Handle*/ 35885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 35895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // remove a listener from an object 35905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remove: function(/*Object*/ source, /*String*/ method, /*Handle*/ handle){ 35915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var f = (source || dojo.global)[method]; 35925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // remember that handle is the index+1 (0 is not a valid handle) 35935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f && f._listeners && handle--){ 35945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete f._listeners[handle]; 35955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 35965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 35975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 35985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Multiple delegation for arbitrary methods. 36005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This unit knows nothing about DOM, but we include DOM aware documentation 36025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// and dontFix argument here to help the autodocs. Actual DOM aware code is in 36035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// event.js. 36045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.connect = function(/*Object|null*/ obj, 36065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*String*/ event, 36075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Object|null*/ context, 36085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*String|Function*/ method, 36095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Boolean?*/ dontFix){ 36105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 36115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.connect` is the core event handling and delegation method in 36125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Dojo. It allows one function to "listen in" on the execution of 36135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // any other, triggering the second whenever the first is called. Many 36145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // listeners may be attached to a function, and source functions may 36155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be either regular function calls or DOM events. 36165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 36185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Connects listeners to actions, so that after event fires, a 36195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // listener is called with the same arguments passed to the original 36205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // function. 36215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Since `dojo.connect` allows the source of events to be either a 36235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "regular" JavaScript function or a DOM event, it provides a uniform 36245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // interface for listening to all the types of events that an 36255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // application is likely to deal with though a single, unified 36265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // interface. DOM programmers may want to think of it as 36275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "addEventListener for everything and anything". 36285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When setting up a connection, the `event` parameter must be a 36305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // string that is the name of the method/event to be listened for. If 36315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `obj` is null, `dojo.global` is assumed, meaning that connections 36325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to global methods are supported but also that you may inadvertently 36335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // connect to a global by passing an incorrect object name or invalid 36345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // reference. 36355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.connect` generally is forgiving. If you pass the name of a 36375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // function or method that does not yet exist on `obj`, connect will 36385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not fail, but will instead set up a stub method. Similarly, null 36395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // arguments may simply be omitted such that fewer than 4 arguments 36405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // may be required to set up a connection See the examples for details. 36415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The return value is a handle that is needed to 36435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // remove this connection with `dojo.disconnect`. 36445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // obj: 36465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The source object for the event function. 36475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Defaults to `dojo.global` if null. 36485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If obj is a DOM node, the connection is delegated 36495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to the DOM event manager (unless dontFix is true). 36505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // event: 36525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // String name of the event function in obj. 36535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // I.e. identifies a property `obj[event]`. 36545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // context: 36565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The object that method will receive as "this". 36575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If context is null and method is a function, then method 36595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // inherits the context of event. 36605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If method is a string then context must be the source 36625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // object object for method (context[method]). If context is null, 36635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.global is used. 36645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // method: 36665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A function reference, or name of a function in context. 36675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The function identified by method fires after event does. 36685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // method receives the same arguments as the event. 36695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See context argument comments for information on method's scope. 36705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dontFix: 36725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If obj is a DOM node, set dontFix to true to prevent delegation 36735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of this connection to the DOM event manager. 36745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 36765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When obj.onchange(), do ui.update(): 36775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.connect(obj, "onchange", ui, "update"); 36785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.connect(obj, "onchange", ui, ui.update); // same 36795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 36815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Using return value for disconnect: 36825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var link = dojo.connect(obj, "onchange", ui, "update"); 36835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ... 36845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.disconnect(link); 36855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 36875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When onglobalevent executes, watcher.handler is invoked: 36885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.connect(null, "onglobalevent", watcher, "handler"); 36895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 36915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When ob.onCustomEvent executes, customEventHandler is invoked: 36925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.connect(ob, "onCustomEvent", null, "customEventHandler"); 36935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.connect(ob, "onCustomEvent", "customEventHandler"); // same 36945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 36955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 36965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When ob.onCustomEvent executes, customEventHandler is invoked 36975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // with the same scope (this): 36985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.connect(ob, "onCustomEvent", null, customEventHandler); 36995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.connect(ob, "onCustomEvent", customEventHandler); // same 37005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 37015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 37025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When globalEvent executes, globalHandler is invoked 37035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // with the same scope (this): 37045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.connect(null, "globalEvent", null, globalHandler); 37055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.connect("globalEvent", globalHandler); // same 37065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // normalize arguments 37085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var a=arguments, args=[], i=0; 37095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if a[0] is a String, obj was omitted 37105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) args.push(dojo.isString(a[0]) ? null : a[i++], a[i++]); 37115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if the arg-after-next is a String or Function, context was NOT omitted 37125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var a1 = a[i+1]; 37135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) args.push(dojo.isString(a1)||dojo.isFunction(a1) ? a[i++] : null, a[i++]); 37145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // absorb any additional arguments 37155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var l=a.length; i<l; i++){ args.push(a[i]); } 37165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // do the actual work 37175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dojo._connect.apply(this, args); /*Handle*/ 37185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// used by non-browser hostenvs. always overriden by event.js 37215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._connect = function(obj, event, context, method){ 37225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var l=dojo._listener, h=l.add(obj, event, dojo.hitch(context, method)); 37235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return [obj, event, h, l]; // Handle 37245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 37255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.disconnect = function(/*Handle*/ handle){ 37275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 37285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Remove a link created by dojo.connect. 37295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 37305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Removes the connection between event and the method referenced by handle. 37315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handle: 37325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the return value of the dojo.connect call that created the connection. 37335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(handle && handle[0] !== undefined){ 37345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._disconnect.apply(this, handle); 37355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // let's not keep this reference 37365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete handle[0]; 37375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 37385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 37395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._disconnect = function(obj, event, handle, listener){ 37415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) listener.remove(obj, event, handle); 37425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 37435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// topic publish/subscribe 37455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._topics = {}; 37475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.subscribe = function(/*String*/ topic, /*Object|null*/ context, /*String|Function*/ method){ 37495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 37505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Attach a listener to a named topic. The listener function is invoked whenever the 37515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // named topic is published (see: dojo.publish). 37525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a handle which is needed to unsubscribe this listener. 37535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // context: 37545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Scope in which method will be invoked, or null for default scope. 37555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // method: 37565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The name of a function in context, or a function reference. This is the function that 37575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is invoked when topic is published. 37585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 37595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); }); 37605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.publish("alerts", [ "read this", "hello world" ]); 37615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // support for 2 argument invocation (omitting context) depends on hitch 37635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return [topic, dojo._listener.add(dojo._topics, topic, dojo.hitch(context, method))]; /*Handle*/ 37645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 37655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.unsubscribe = function(/*Handle*/ handle){ 37675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 37685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Remove a topic listener. 37695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handle: 37705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The handle returned from a call to subscribe. 37715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 37725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var alerter = dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); }; 37735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ... 37745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.unsubscribe(alerter); 37755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(handle){ 37765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._listener.remove(dojo._topics, handle[0], handle[1]); 37775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 37785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 37795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.publish = function(/*String*/ topic, /*Array*/ args){ 37815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 37825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Invoke all listener method subscribed to topic. 37835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // topic: 37845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The name of the topic to publish. 37855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // args: 37865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An array of arguments. The arguments will be applied 37875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to each topic subscriber (as first class parameters, via apply). 37885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 37895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); }; 37905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.publish("alerts", [ "read this", "hello world" ]); 37915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note that args is an array, which is more efficient vs variable length 37935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // argument list. Ideally, var args would be implemented via Array 37945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // throughout the APIs. 37955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var f = dojo._topics[topic]; 37965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f){ 37975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f.apply(this, args||[]); 37985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 37995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 38005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.connectPublisher = function( /*String*/ topic, 38025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Object|null*/ obj, 38035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*String*/ event){ 38045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 38055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ensure that every time obj.event() is called, a message is published 38065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // on the topic. Returns a handle which can be passed to 38075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.disconnect() to disable subsequent automatic publication on 38085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the topic. 38095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // topic: 38105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The name of the topic to publish. 38115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // obj: 38125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The source object for the event function. Defaults to dojo.global 38135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if null. 38145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // event: 38155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The name of the event function in obj. 38165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // I.e. identifies a property obj[event]. 38175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 38185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.connectPublisher("/ajax/start", dojo, "xhrGet"); 38195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var pf = function(){ dojo.publish(topic, arguments); } 38205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return event ? dojo.connect(obj, event, pf) : dojo.connect(obj, pf); //Handle 38215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 38225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.Deferred"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 38265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.Deferred"] = true; 38275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.Deferred"); 38285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 38325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mutator = function(){}; 38335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var freeze = Object.freeze || function(){}; 38345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A deferred provides an API for creating and resolving a promise. 38355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.Deferred = function(/*Function?*/canceller){ 38365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 38375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Deferreds provide a generic means for encapsulating an asynchronous 38385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // operation and notifying users of the completion and result of the operation. 38395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 38405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The dojo.Deferred API is based on the concept of promises that provide a 38415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // generic interface into the eventual completion of an asynchronous action. 38425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The motivation for promises fundamentally is about creating a 38435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // separation of concerns that allows one to achieve the same type of 38445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // call patterns and logical data flow in asynchronous code as can be 38455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // achieved in synchronous code. Promises allows one 38465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to be able to call a function purely with arguments needed for 38475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // execution, without conflating the call with concerns of whether it is 38485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sync or async. One shouldn't need to alter a call's arguments if the 38495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // implementation switches from sync to async (or vice versa). By having 38505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // async functions return promises, the concerns of making the call are 38515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // separated from the concerns of asynchronous interaction (which are 38525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handled by the promise). 38535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 38545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The dojo.Deferred is a type of promise that provides methods for fulfilling the 38555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // promise with a successful result or an error. The most important method for 38565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // working with Dojo's promises is the then() method, which follows the 38575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // CommonJS proposed promise API. An example of using a Dojo promise: 38585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 38595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var resultingPromise = someAsyncOperation.then(function(result){ 38605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ... handle result ... 38615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 38625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | function(error){ 38635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ... handle error ... 38645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 38655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 38665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The .then() call returns a new promise that represents the result of the 38675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // execution of the callback. The callbacks will never affect the original promises value. 38685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 38695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The dojo.Deferred instances also provide the following functions for backwards compatibility: 38705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 38715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * addCallback(handler) 38725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * addErrback(handler) 38735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * callback(result) 38745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * errback(result) 38755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 38765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Callbacks are allowed to return promises themselves, so 38775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // you can build complicated sequences of events with ease. 38785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 38795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The creator of the Deferred may specify a canceller. The canceller 38805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is a function that will be called if Deferred.cancel is called 38815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // before the Deferred fires. You can use this to implement clean 38825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // aborting of an XMLHttpRequest, etc. Note that cancel will fire the 38835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // deferred with a CancelledError (unless your canceller returns 38845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // another kind of error), so the errbacks should be prepared to 38855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handle that error for cancellable Deferreds. 38865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 38875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var deferred = new dojo.Deferred(); 38885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | setTimeout(function(){ deferred.callback({success: true}); }, 1000); 38895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return deferred; 38905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 38915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Deferred objects are often used when making code asynchronous. It 38925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // may be easiest to write functions in a synchronous manner and then 38935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // split code using a deferred to trigger a response to a long-lived 38945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // operation. For example, instead of register a callback function to 38955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // denote when a rendering operation completes, the function can 38965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // simply return a deferred: 38975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 38985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // callback style: 38995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | function renderLotsOfData(data, callback){ 39005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var success = false 39015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | try{ 39025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | for(var x in data){ 39035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | renderDataitem(data[x]); 39045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 39055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | success = true; 39065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }catch(e){ } 39075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(callback){ 39085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | callback(success); 39095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 39105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 39115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 39125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // using callback style 39135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | renderLotsOfData(someDataObj, function(success){ 39145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // handles success or failure 39155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(!success){ 39165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | promptUserToRecover(); 39175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 39185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 39195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // NOTE: no way to add another callback here!! 39205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 39215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Using a Deferred doesn't simplify the sending code any, but it 39225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // provides a standard interface for callers and senders alike, 39235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // providing both with a simple way to service multiple callbacks for 39245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an operation and freeing both sides from worrying about details 39255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // such as "did this get called already?". With Deferreds, new 39265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // callbacks can be added at any time. 39275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 39285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // Deferred style: 39295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | function renderLotsOfData(data){ 39305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var d = new dojo.Deferred(); 39315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | try{ 39325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | for(var x in data){ 39335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | renderDataitem(data[x]); 39345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 39355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | d.callback(true); 39365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }catch(e){ 39375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | d.errback(new Error("rendering failed")); 39385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 39395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return d; 39405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 39415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 39425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // using Deferred style 39435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | renderLotsOfData(someDataObj).then(null, function(){ 39445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | promptUserToRecover(); 39455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 39465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // NOTE: addErrback and addCallback both return the Deferred 39475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // again, so we could chain adding callbacks or save the 39485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // deferred for later should we need to be notified again. 39495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 39505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In this example, renderLotsOfData is synchronous and so both 39515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // versions are pretty artificial. Putting the data display on a 39525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // timeout helps show why Deferreds rock: 39535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 39545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // Deferred style and async func 39555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | function renderLotsOfData(data){ 39565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var d = new dojo.Deferred(); 39575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | setTimeout(function(){ 39585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | try{ 39595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | for(var x in data){ 39605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | renderDataitem(data[x]); 39615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 39625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | d.callback(true); 39635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }catch(e){ 39645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | d.errback(new Error("rendering failed")); 39655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 39665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 100); 39675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return d; 39685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 39695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 39705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // using Deferred style 39715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | renderLotsOfData(someDataObj).then(null, function(){ 39725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | promptUserToRecover(); 39735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 39745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 39755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note that the caller doesn't have to change his code at all to 39765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handle the asynchronous case. 39775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result, finished, isError, head, nextListener; 39785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var promise = (this.promise = {}); 39795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function complete(value){ 39815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(finished){ 39825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw new Error("This deferred has already been resolved"); 39835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 39845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result = value; 39855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) finished = true; 39865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) notify(); 39875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 39885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function notify(){ 39895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mutated; 39905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(!mutated && nextListener){ 39915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var listener = nextListener; 39925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nextListener = nextListener.next; 39935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if((mutated = (listener.progress == mutator))){ // assignment and check 39945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) finished = false; 39955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 39965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var func = (isError ? listener.error : listener.resolved); 39975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (func) { 39985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try { 39995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var newResult = func(result); 40005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (newResult && typeof newResult.then === "function") { 40015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) newResult.then(dojo.hitch(listener.deferred, "resolve"), dojo.hitch(listener.deferred, "reject")); 40025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 40035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var unchanged = mutated && newResult === undefined; 40055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(mutated && !unchanged){ 40065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isError = newResult instanceof Error; 40075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) listener.deferred[unchanged && isError ? "reject" : "resolve"](unchanged ? result : newResult); 40095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) catch (e) { 40115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) listener.deferred.reject(e); 40125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else { 40145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(isError){ 40155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) listener.deferred.reject(result); 40165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 40175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) listener.deferred.resolve(result); 40185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // calling resolve will resolve the promise 40235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.resolve = this.callback = function(value){ 40245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 40255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fulfills the Deferred instance successfully with the provide value 40265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.fired = 0; 40275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.results = [value, null]; 40285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) complete(value); 40295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 40305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // calling error will indicate that the promise failed 40335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.reject = this.errback = function(error){ 40345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 40355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fulfills the Deferred instance as an error with the provided error 40365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isError = true; 40375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.fired = 1; 40385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) complete(error); 40395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.results = [null, error]; 40405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!error || error.log !== false){ 40415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (dojo.config.deferredOnError || function(x){ console.error(x); })(error); 40425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 40445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // call progress to provide updates on the progress on the completion of the promise 40455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.progress = function(update){ 40465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary 40475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Send progress events to all listeners 40485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var listener = nextListener; 40495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(listener){ 40505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var progress = listener.progress; 40515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) progress && progress(update); 40525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) listener = listener.next; 40535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 40555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.addCallbacks = function(/*Function?*/callback, /*Function?*/errback){ 40565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.then(callback, errback, mutator); 40575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; 40585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 40595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // provide the implementation of the promise 40605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.then = promise.then = function(/*Function?*/resolvedCallback, /*Function?*/errorCallback, /*Function?*/progressCallback){ 40615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 40625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Adds a fulfilledHandler, errorHandler, and progressHandler to be called for 40635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // completion of a promise. The fulfilledHandler is called when the promise 40645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is fulfilled. The errorHandler is called when a promise fails. The 40655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // progressHandler is called for progress events. All arguments are optional 40665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and non-function values are ignored. The progressHandler is not only an 40675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // optional argument, but progress events are purely optional. Promise 40685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // providers are not required to ever create progress events. 40695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 40705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function will return a new promise that is fulfilled when the given 40715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fulfilledHandler or errorHandler callback is finished. This allows promise 40725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // operations to be chained together. The value returned from the callback 40735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handler is the fulfillment value for the returned promise. If the callback 40745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // throws an error, the returned promise will be moved to failed state. 40755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 40765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 40775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An example of using a CommonJS compliant promise: 40785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | asyncComputeTheAnswerToEverything(). 40795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | then(addTwo). 40805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | then(printResult, onError); 40815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | >44 40825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 40835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var returnDeferred = progressCallback == mutator ? this : new dojo.Deferred(promise.cancel); 40845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var listener = { 40855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) resolved: resolvedCallback, 40865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) error: errorCallback, 40875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) progress: progressCallback, 40885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) deferred: returnDeferred 40895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 40905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(nextListener){ 40915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) head = head.next = listener; 40925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else{ 40945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nextListener = head = listener; 40955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(finished){ 40975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) notify(); 40985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return returnDeferred.promise; 41005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 41015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var deferred = this; 41025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.cancel = promise.cancel = function () { 41035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 41045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Cancels the asynchronous operation 41055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!finished){ 41065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var error = canceller && canceller(deferred); 41075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!finished){ 41085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!(error instanceof Error)) { 41095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) error = new Error(error); 41105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 41115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) error.log = false; 41125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) deferred.reject(error); 41135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 41145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 41155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 41165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeze(promise); 41175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 41185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.extend(dojo.Deferred, { 41195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) addCallback: function (/*Function*/callback) { 41205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.addCallbacks(dojo.hitch.apply(dojo, arguments)); 41215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 41225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) addErrback: function (/*Function*/errback) { 41245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.addCallbacks(null, dojo.hitch.apply(dojo, arguments)); 41255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 41265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) addBoth: function (/*Function*/callback) { 41285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var enclosed = dojo.hitch.apply(dojo, arguments); 41295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.addCallbacks(enclosed, enclosed); 41305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 41315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fired: -1 41325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 41335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 41345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.when = function(promiseOrValue, /*Function?*/callback, /*Function?*/errback, /*Function?*/progressHandler){ 41355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 41365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This provides normalization between normal synchronous values and 41375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // asynchronous promises, so you can interact with them in a common way 41385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 41395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | function printFirstAndList(items){ 41405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.when(findFirst(items), console.log); 41415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.when(findLast(items), console.log); 41425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 41435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | function findFirst(items){ 41445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return dojo.when(items, function(items){ 41455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return items[0]; 41465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 41475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 41485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | function findLast(items){ 41495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return dojo.when(items, function(items){ 41505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return items[items.length]; 41515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 41525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 41535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // And now all three of his functions can be used sync or async. 41545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | printFirstAndLast([1,2,3,4]) will work just as well as 41555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | printFirstAndLast(dojo.xhrGet(...)); 41565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(promiseOrValue && typeof promiseOrValue.then === "function"){ 41585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return promiseOrValue.then(callback, errback, progressHandler); 41595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 41605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return callback(promiseOrValue); 41615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 41625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 41645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.json"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 41665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.json"] = true; 41675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.json"); 41685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.fromJson = function(/*String*/ json){ 41715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 41725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Parses a [JSON](http://json.org) string to return a JavaScript object. 41735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 41745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Throws for invalid JSON strings, but it does not use a strict JSON parser. It 41755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // delegates to eval(). The content passed to this method must therefore come 41765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // from a trusted source. 41775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // json: 41785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a string literal of a JSON item, for instance: 41795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'` 41805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return eval("(" + json + ")"); // Object 41825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 41835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._escapeString = function(/*String*/str){ 41855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //summary: 41865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Adds escape sequences for non-visual characters, double quote and 41875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // backslash and surrounds with double quotes to form a valid string 41885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // literal. 41895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ('"' + str.replace(/(["\\])/g, '\\$1') + '"'). 41905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n"). 41915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r"); // string 41925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 41935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.toJsonIndentStr = "\t"; 41955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _indentStr){ 41965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 41975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a [JSON](http://json.org) serialization of an object. 41985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 41995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a [JSON](http://json.org) serialization of an object. 42005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note that this doesn't check for infinite recursion, so don't do that! 42015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it: 42025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an object to be serialized. Objects may define their own 42035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // serialization via a special "__json__" or "json" function 42045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // property. If a specialized serializer has been defined, it will 42055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be used as a fallback. 42065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // prettyPrint: 42075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if true, we indent objects and arrays to make the output prettier. 42085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The variable `dojo.toJsonIndentStr` is used as the indent string -- 42095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to use something other than the default (tab), change that variable 42105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // before calling dojo.toJson(). 42115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // _indentStr: 42125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // private variable for recursive calls when pretty printing, do not use. 42135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 42145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // simple serialization of a trivial object 42155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var jsonStr = dojo.toJson({ howdy: "stranger!", isStrange: true }); 42165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr); 42175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 42185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a custom serializer for an objects of a particular class: 42195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.declare("Furby", null, { 42205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | furbies: "are strange", 42215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | furbyCount: 10, 42225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | __json__: function(){ 42235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 42245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 42255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(it === undefined){ 42275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return "undefined"; 42285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var objtype = typeof it; 42305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(objtype == "number" || objtype == "boolean"){ 42315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return it + ""; 42325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(it === null){ 42345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return "null"; 42355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.isString(it)){ 42375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dojo._escapeString(it); 42385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // recurse 42405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var recurse = arguments.callee; 42415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // short-circuit for objects that support "json" serialization 42425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if they return "self" then just pass-through... 42435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var newObj; 42445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _indentStr = _indentStr || ""; 42455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var nextIndent = prettyPrint ? _indentStr + dojo.toJsonIndentStr : ""; 42465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tf = it.__json__||it.json; 42475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.isFunction(tf)){ 42485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) newObj = tf.call(it); 42495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(it !== newObj){ 42505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return recurse(newObj, prettyPrint, nextIndent); 42515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(it.nodeType && it.cloneNode){ // isNode 42545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we can't seriailize DOM nodes as regular objects because they have cycles 42555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM nodes could be serialized with something like outerHTML, but 42565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that can be provided by users in the form of .json or .__json__ function. 42575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw new Error("Can't serialize DOM nodes"); 42585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var sep = prettyPrint ? " " : ""; 42615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var newLine = prettyPrint ? "\n" : ""; 42625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // array 42645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.isArray(it)){ 42655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var res = dojo.map(it, function(obj){ 42665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var val = recurse(obj, prettyPrint, nextIndent); 42675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof val != "string"){ 42685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) val = "undefined"; 42695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return newLine + nextIndent + val; 42715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 42725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return "[" + res.join("," + sep) + newLine + _indentStr + "]"; 42735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /* 42755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // look in the registry 42765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try { 42775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) window.o = it; 42785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) newObj = dojo.json.jsonRegistry.match(it); 42795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return recurse(newObj, prettyPrint, nextIndent); 42805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 42815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // console.log(e); 42825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it's a function with no adapter, skip it 42845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 42855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(objtype == "function"){ 42865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return null; // null 42875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // generic object code path 42895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var output = [], key; 42905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(key in it){ 42915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var keyStr, val; 42925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof key == "number"){ 42935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) keyStr = '"' + key + '"'; 42945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(typeof key == "string"){ 42955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) keyStr = dojo._escapeString(key); 42965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 42975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // skip non-string or number keys 42985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 42995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 43005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) val = recurse(it[key], prettyPrint, nextIndent); 43015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof val != "string"){ 43025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // skip non-serializable values 43035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 43045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 43055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: use += on Moz!! 43065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // MOW NOTE: using += is a pain because you have to account for the dangling comma... 43075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) output.push(newLine + nextIndent + keyStr + ":" + sep + val); 43085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 43095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return "{" + output.join("," + sep) + newLine + _indentStr + "}"; // String 43105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 43115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 43135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.Color"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 43155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.Color"] = true; 43165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.Color"); 43175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 43225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var d = dojo; 43245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.Color = function(/*Array|String|Object*/ color){ 43265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 43275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Takes a named string, hex string, array of rgb or rgba values, 43285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an object with r, g, b, and a properties, or another `dojo.Color` object 43295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and creates a new Color instance to work from. 43305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 43315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 43325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Work with a Color instance: 43335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var c = new dojo.Color(); 43345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | c.setColor([0,0,0]); // black 43355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var hex = c.toHex(); // #000000 43365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 43375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 43385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Work with a node's color: 43395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var color = dojo.style("someNode", "backgroundColor"); 43405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var n = new dojo.Color(color); 43415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // adjust the color some 43425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | n.r *= .5; 43435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(n.toString()); // rgb(128, 255, 255); 43445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(color){ this.setColor(color); } 43455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 43465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: 43485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // there's got to be a more space-efficient way to encode or discover 43495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // these!! Use hex? 43505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.Color.named = { 43515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) black: [0,0,0], 43525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) silver: [192,192,192], 43535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gray: [128,128,128], 43545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) white: [255,255,255], 43555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) maroon: [128,0,0], 43565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) red: [255,0,0], 43575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) purple: [128,0,128], 43585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fuchsia: [255,0,255], 43595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) green: [0,128,0], 43605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lime: [0,255,0], 43615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) olive: [128,128,0], 43625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) yellow: [255,255,0], 43635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) navy: [0,0,128], 43645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) blue: [0,0,255], 43655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) teal: [0,128,128], 43665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) aqua: [0,255,255], 43675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) transparent: d.config.transparentColor || [255,255,255] 43685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 43695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.extend(dojo.Color, { 43715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) r: 255, g: 255, b: 255, a: 1, 43725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _set: function(r, g, b, a){ 43735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var t = this; t.r = r; t.g = g; t.b = b; t.a = a; 43745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 43755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setColor: function(/*Array|String|Object*/ color){ 43765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 43775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Takes a named string, hex string, array of rgb or rgba values, 43785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an object with r, g, b, and a properties, or another `dojo.Color` object 43795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and sets this color instance to that value. 43805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 43815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 43825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var c = new dojo.Color(); // no color 43835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | c.setColor("#ededed"); // greyish 43845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isString(color)){ 43855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.colorFromString(color, this); 43865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(d.isArray(color)){ 43875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.colorFromArray(color, this); 43885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 43895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._set(color.r, color.g, color.b, color.a); 43905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!(color instanceof d.Color)){ this.sanitize(); } 43915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 43925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; // dojo.Color 43935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 43945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sanitize: function(){ 43955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 43965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ensures the object has correct attributes 43975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 43985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the default implementation does nothing, include dojo.colors to 43995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // augment it with real checks 44005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; // dojo.Color 44015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 44025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toRgb: function(){ 44035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 44045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns 3 component array of rgb values 44055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 44065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var c = new dojo.Color("#000000"); 44075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(c.toRgb()); // [0,0,0] 44085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var t = this; 44095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return [t.r, t.g, t.b]; // Array 44105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 44115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toRgba: function(){ 44125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 44135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a 4 component array of rgba values from the color 44145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // represented by this object. 44155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var t = this; 44165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return [t.r, t.g, t.b, t.a]; // Array 44175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 44185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toHex: function(){ 44195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 44205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a CSS color string in hexadecimal representation 44215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 44225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(new dojo.Color([0,0,0]).toHex()); // #000000 44235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var arr = d.map(["r", "g", "b"], function(x){ 44245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var s = this[x].toString(16); 44255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return s.length < 2 ? "0" + s : s; 44265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, this); 44275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return "#" + arr.join(""); // String 44285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 44295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toCss: function(/*Boolean?*/ includeAlpha){ 44305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 44315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a css color string in rgb(a) representation 44325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 44335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var c = new dojo.Color("#FFF").toCss(); 44345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(c); // rgb('255','255','255') 44355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var t = this, rgb = t.r + ", " + t.g + ", " + t.b; 44365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (includeAlpha ? "rgba(" + rgb + ", " + t.a : "rgb(" + rgb) + ")"; // String 44375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 44385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toString: function(){ 44395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 44405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a visual representation of the color 44415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.toCss(true); // String 44425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 44435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 44445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 44455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.blendColors = function( 44465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*dojo.Color*/ start, 44475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*dojo.Color*/ end, 44485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Number*/ weight, 44495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*dojo.Color?*/ obj 44505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ){ 44515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 44525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Blend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend, 44535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can reuse a previously allocated dojo.Color object for the result 44545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var t = obj || new d.Color(); 44555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.forEach(["r", "g", "b", "a"], function(x){ 44565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t[x] = start[x] + (end[x] - start[x]) * weight; 44575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(x != "a"){ t[x] = Math.round(t[x]); } 44585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 44595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return t.sanitize(); // dojo.Color 44605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 44615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 44625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){ 44635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 44645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a `dojo.Color` instance from a string of the form 44655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "rgb(...)" or "rgba(...)". Optionally accepts a `dojo.Color` 44665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // object to update with the parsed value and return instead of 44675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // creating a new object. 44685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 44695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A dojo.Color object. If obj is passed, it will be the return value. 44705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var m = color.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/); 44715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m && dojo.colorFromArray(m[1].split(/\s*,\s*/), obj); // dojo.Color 44725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 44735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 44745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.colorFromHex = function(/*String*/ color, /*dojo.Color?*/ obj){ 44755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 44765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Converts a hex string with a '#' prefix to a color object. 44775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Supports 12-bit #rgb shorthand. Optionally accepts a 44785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.Color` object to update with the parsed value. 44795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 44805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 44815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A dojo.Color object. If obj is passed, it will be the return value. 44825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 44835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 44845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var thing = dojo.colorFromHex("#ededed"); // grey, longhand 44855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 44865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 44875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var thing = dojo.colorFromHex("#000"); // black, shorthand 44885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var t = obj || new d.Color(), 44895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bits = (color.length == 4) ? 4 : 8, 44905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mask = (1 << bits) - 1; 44915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) color = Number("0x" + color.substr(1)); 44925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(isNaN(color)){ 44935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return null; // dojo.Color 44945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 44955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.forEach(["b", "g", "r"], function(x){ 44965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var c = color & mask; 44975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) color >>= bits; 44985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t[x] = bits == 4 ? 17 * c : c; 44995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 45005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t.a = 1; 45015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return t; // dojo.Color 45025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 45035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.colorFromArray = function(/*Array*/ a, /*dojo.Color?*/ obj){ 45055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 45065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Builds a `dojo.Color` from a 3 or 4 element array, mapping each 45075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // element in sequence to the rgb(a) values of the color. 45085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 45095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var myColor = dojo.colorFromArray([237,237,237,0.5]); // grey, 50% alpha 45105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 45115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A dojo.Color object. If obj is passed, it will be the return value. 45125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var t = obj || new d.Color(); 45135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3])); 45145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(isNaN(t.a)){ t.a = 1; } 45155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return t.sanitize(); // dojo.Color 45165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 45175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.colorFromString = function(/*String*/ str, /*dojo.Color?*/ obj){ 45195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 45205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Parses `str` for a color value. Accepts hex, rgb, and rgba 45215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // style color values. 45225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 45235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Acceptable input values for str may include arrays of any form 45245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // accepted by dojo.colorFromArray, hex strings such as "#aaaaaa", or 45255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // rgb or rgba strings such as "rgb(133, 200, 16)" or "rgba(10, 10, 45265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 10, 50)" 45275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 45285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A dojo.Color object. If obj is passed, it will be the return value. 45295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var a = d.Color.named[str]; 45305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a && d.colorFromArray(a, obj) || d.colorFromRgb(str, obj) || d.colorFromHex(str, obj); 45315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 45325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 45335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 45355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 45375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.window"] = true; 45385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.window"); 45395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*===== 45425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.doc = { 45435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 45445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Alias for the current document. 'dojo.doc' can be modified 45455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for temporary context shifting. Also see dojo.withDoc(). 45465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 45475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Refer to dojo.doc rather 45485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // than referring to 'window.document' to ensure your code runs 45495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // correctly in managed contexts. 45505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 45515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | n.appendChild(dojo.doc.createElement('div')); 45525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 45535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=====*/ 45545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.doc = window["document"] || null; 45555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.body = function(){ 45575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 45585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Return the body element of the document 45595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return the body object associated with dojo.doc 45605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 45615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.body().appendChild(dojo.doc.createElement('div')); 45625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note: document.body is not defined for a strict xhtml document 45645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Would like to memoize this, but dojo.doc can change vi dojo.withDoc(). 45655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dojo.doc.body || dojo.doc.getElementsByTagName("body")[0]; // Node 45665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 45675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocument){ 45695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 45705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // changes the behavior of many core Dojo functions that deal with 45715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // namespace and DOM lookup, changing them to work in a new global 45725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // context (e.g., an iframe). The varibles dojo.global and dojo.doc 45735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // are modified as a result of calling this function and the result of 45745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.body()` likewise differs. 45755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.global = globalObject; 45765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.doc = globalDocument; 45775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 45785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.withGlobal = function( /*Object*/globalObject, 45805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Function*/callback, 45815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Object?*/thisObject, 45825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Array?*/cbArguments){ 45835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 45845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Invoke callback with globalObject as dojo.global and 45855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // globalObject.document as dojo.doc. 45865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 45875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Invoke callback with globalObject as dojo.global and 45885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // globalObject.document as dojo.doc. If provided, globalObject 45895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will be executed in the context of object thisObject 45905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When callback() returns or throws an error, the dojo.global 45915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and dojo.doc will be restored to its previous state. 45925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var oldGlob = dojo.global; 45945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 45955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.global = globalObject; 45965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dojo.withDoc.call(null, globalObject.document, callback, thisObject, cbArguments); 45975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }finally{ 45985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.global = oldGlob; 45995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 46005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 46015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.withDoc = function( /*DocumentElement*/documentObject, 46035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Function*/callback, 46045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Object?*/thisObject, 46055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Array?*/cbArguments){ 46065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 46075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Invoke callback with documentObject as dojo.doc. 46085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 46095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Invoke callback with documentObject as dojo.doc. If provided, 46105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // callback will be executed in the context of object thisObject 46115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When callback() returns or throws an error, the dojo.doc will 46125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be restored to its previous state. 46135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var oldDoc = dojo.doc, 46155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) oldLtr = dojo._bodyLtr, 46165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) oldQ = dojo.isQuirks; 46175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 46195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.doc = documentObject; 46205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete dojo._bodyLtr; // uncache 46215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.isQuirks = dojo.doc.compatMode == "BackCompat"; // no need to check for QuirksMode which was Opera 7 only 46225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(thisObject && typeof callback == "string"){ 46245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) callback = thisObject[callback]; 46255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 46265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return callback.apply(thisObject, cbArguments || []); 46285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }finally{ 46295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.doc = oldDoc; 46305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete dojo._bodyLtr; // in case it was undefined originally, and set to true/false by the alternate document 46315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(oldLtr !== undefined){ dojo._bodyLtr = oldLtr; } 46325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.isQuirks = oldQ; 46335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 46345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 46355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 46375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.event"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 46395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.event"] = true; 46405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.event"); 46415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA 46455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 46475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM event listener machinery 46485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var del = (dojo._event_listener = { 46495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) add: function(/*DOMNode*/ node, /*String*/ name, /*Function*/ fp){ 46505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!node){return;} 46515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = del._normalizeEventName(name); 46525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fp = del._fixCallback(name, fp); 46535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if( 46545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) !dojo.isIE && 46555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (name == "mouseenter" || name == "mouseleave") 46565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ){ 46575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ofp = fp; 46585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = (name == "mouseenter") ? "mouseover" : "mouseout"; 46595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fp = function(e){ 46605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!dojo.isDescendant(e.relatedTarget, node)){ 46615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // e.type = oname; // FIXME: doesn't take? SJM: event.type is generally immutable. 46625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ofp.call(this, e); 46635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 46645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 46655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 46665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.addEventListener(name, fp, false); 46675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return fp; /*Handle*/ 46685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 46695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){ 46705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 46715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // clobbers the listener from the node 46725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 46735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM node to attach the event to 46745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // event: 46755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the name of the handler to remove the function from 46765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handle: 46775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the handle returned from add 46785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(node){ 46795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event = del._normalizeEventName(event); 46805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!dojo.isIE && (event == "mouseenter" || event == "mouseleave")){ 46815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event = (event == "mouseenter") ? "mouseover" : "mouseout"; 46825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 46835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.removeEventListener(event, handle, false); 46855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 46865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 46875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _normalizeEventName: function(/*String*/ name){ 46885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Generally, name should be lower case, unless it is special 46895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // somehow (e.g. a Mozilla DOM event). 46905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Remove 'on'. 46915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return name.slice(0,2) =="on" ? name.slice(2) : name; 46925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 46935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _fixCallback: function(/*String*/ name, fp){ 46945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // By default, we only invoke _fixEvent for 'keypress' 46955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If code is added to _fixEvent for other events, we have 46965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to revisit this optimization. 46975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This also applies to _fixEvent overrides for Safari and Opera 46985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // below. 46995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return name != "keypress" ? fp : function(e){ return fp.call(this, del._fixEvent(e, this)); }; 47005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 47015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _fixEvent: function(evt, sender){ 47025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // _fixCallback only attaches us to keypress. 47035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Switch on evt.type anyway because we might 47045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be called directly from dojo.fixEvent. 47055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch(evt.type){ 47065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "keypress": 47075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) del._setKeyChar(evt); 47085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 47095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 47105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return evt; 47115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 47125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _setKeyChar: function(evt){ 47135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.keyChar = evt.charCode >= 32 ? String.fromCharCode(evt.charCode) : ''; 47145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.charOrCode = evt.keyChar || evt.keyCode; 47155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 47165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For IE and Safari: some ctrl-key combinations (mostly w/punctuation) do not emit a char code in IE 47175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we map those virtual key codes to ascii here 47185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not valid for all (non-US) keyboards, so maybe we shouldn't bother 47195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _punctMap: { 47205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106:42, 47215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 111:47, 47225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 186:59, 47235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 187:43, 47245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 188:44, 47255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 189:45, 47265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 190:46, 47275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 191:47, 47285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 192:96, 47295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 219:91, 47305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 220:92, 47315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 221:93, 47325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 222:39 47335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 47345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 47355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM events 47375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.fixEvent = function(/*Event*/ evt, /*DOMNode*/ sender){ 47395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 47405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // normalizes properties on the event object including event 47415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // bubbling methods, keystroke normalization, and x/y positions 47425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // evt: Event 47435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // native event object 47445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sender: DOMNode 47455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node to treat as "currentTarget" 47465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return del._fixEvent(evt, sender); 47475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 47485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.stopEvent = function(/*Event*/ evt){ 47505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 47515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // prevents propagation and clobbers the default action of the 47525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // passed event 47535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // evt: Event 47545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The event object. If omitted, window.event is used on IE. 47555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.preventDefault(); 47565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.stopPropagation(); 47575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE: below, this method is overridden for IE 47585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 47595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the default listener to use on dontFix nodes, overriden for IE 47615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var node_listener = dojo._listener; 47625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Unify connect and event listeners 47645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._connect = function(obj, event, context, method, dontFix){ 47655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: need a more strict test 47665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var isNode = obj && (obj.nodeType||obj.attachEvent||obj.addEventListener); 47675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // choose one of three listener options: raw (connect.js), DOM event on a Node, custom event on a Node 47685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we need the third option to provide leak prevention on broken browsers (IE) 47695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var lid = isNode ? (dontFix ? 2 : 1) : 0, l = [dojo._listener, del, node_listener][lid]; 47705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // create a listener 47715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var h = l.add(obj, event, dojo.hitch(context, method)); 47725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // formerly, the disconnect package contained "l" directly, but if client code 47735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // leaks the disconnect package (by connecting it to a node), referencing "l" 47745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // compounds the problem. 47755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // instead we return a listener id, which requires custom _disconnect below. 47765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return disconnect package 47775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return [ obj, event, h, lid ]; 47785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 47795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._disconnect = function(obj, event, handle, listener){ 47815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ([dojo._listener, del, node_listener][listener]).remove(obj, event, handle); 47825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 47835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Constants 47855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Public: client code should test 47875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // keyCode against these named constants, as the 47885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // actual codes can vary by browser. 47895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.keys = { 47905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 47915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Definitions for common key values 47925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) BACKSPACE: 8, 47935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TAB: 9, 47945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CLEAR: 12, 47955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ENTER: 13, 47965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SHIFT: 16, 47975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CTRL: 17, 47985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ALT: 18, 47995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) META: dojo.isSafari ? 91 : 224, // the apple key on macs 48005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PAUSE: 19, 48015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CAPS_LOCK: 20, 48025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ESCAPE: 27, 48035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SPACE: 32, 48045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PAGE_UP: 33, 48055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PAGE_DOWN: 34, 48065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) END: 35, 48075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HOME: 36, 48085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LEFT_ARROW: 37, 48095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) UP_ARROW: 38, 48105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RIGHT_ARROW: 39, 48115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DOWN_ARROW: 40, 48125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) INSERT: 45, 48135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DELETE: 46, 48145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HELP: 47, 48155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LEFT_WINDOW: 91, 48165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RIGHT_WINDOW: 92, 48175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SELECT: 93, 48185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_0: 96, 48195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_1: 97, 48205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_2: 98, 48215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_3: 99, 48225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_4: 100, 48235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_5: 101, 48245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_6: 102, 48255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_7: 103, 48265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_8: 104, 48275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_9: 105, 48285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_MULTIPLY: 106, 48295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_PLUS: 107, 48305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_ENTER: 108, 48315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_MINUS: 109, 48325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_PERIOD: 110, 48335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUMPAD_DIVIDE: 111, 48345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F1: 112, 48355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F2: 113, 48365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F3: 114, 48375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F4: 115, 48385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F5: 116, 48395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F6: 117, 48405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F7: 118, 48415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F8: 119, 48425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F9: 120, 48435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F10: 121, 48445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F11: 122, 48455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F12: 123, 48465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F13: 124, 48475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F14: 125, 48485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) F15: 126, 48495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NUM_LOCK: 144, 48505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SCROLL_LOCK: 145, 48515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // virtual key mapping 48525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) copyKey: dojo.isMac && !dojo.isAIR ? (dojo.isSafari ? 91 : 224 ) : 17 48535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 48545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var evtCopyKey = dojo.isMac ? "metaKey" : "ctrlKey"; 48565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.isCopyKey = function(e){ 48585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 48595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Checks an event for the copy key (meta on Mac, and ctrl anywhere else) 48605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // e: Event 48615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Event object to examine 48625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return e[evtCopyKey]; // Boolean 48635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 48645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Public: decoding mouse buttons from events 48665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*===== 48685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.mouseButtons = { 48695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // LEFT: Number 48705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Numeric value of the left mouse button for the platform. 48715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LEFT: 0, 48725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // MIDDLE: Number 48735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Numeric value of the middle mouse button for the platform. 48745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MIDDLE: 1, 48755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // RIGHT: Number 48765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Numeric value of the right mouse button for the platform. 48775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RIGHT: 2, 48785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isButton: function(e, button){ 48805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 48815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Checks an event object for a pressed button 48825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // e: Event 48835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Event object to examine 48845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // button: Number 48855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The button value (example: dojo.mouseButton.LEFT) 48865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return e.button == button; // Boolean 48875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 48885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isLeft: function(e){ 48895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 48905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Checks an event object for the pressed left button 48915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // e: Event 48925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Event object to examine 48935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return e.button == 0; // Boolean 48945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 48955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isMiddle: function(e){ 48965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 48975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Checks an event object for the pressed middle button 48985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // e: Event 48995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Event object to examine 49005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return e.button == 1; // Boolean 49015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 49025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isRight: function(e){ 49035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 49045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Checks an event object for the pressed right button 49055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // e: Event 49065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Event object to examine 49075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return e.button == 2; // Boolean 49085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 49095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 49105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=====*/ 49115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 49125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){ 49135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.mouseButtons = { 49145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LEFT: 1, 49155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MIDDLE: 4, 49165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RIGHT: 2, 49175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // helper functions 49185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isButton: function(e, button){ return e.button & button; }, 49195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isLeft: function(e){ return e.button & 1; }, 49205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isMiddle: function(e){ return e.button & 4; }, 49215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isRight: function(e){ return e.button & 2; } 49225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 49235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 49245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.mouseButtons = { 49255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LEFT: 0, 49265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MIDDLE: 1, 49275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RIGHT: 2, 49285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // helper functions 49295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isButton: function(e, button){ return e.button == button; }, 49305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isLeft: function(e){ return e.button == 0; }, 49315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isMiddle: function(e){ return e.button == 1; }, 49325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isRight: function(e){ return e.button == 2; } 49335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 49345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 49355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 49365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // IE event normalization 49375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.isIE){ 49385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _trySetKeyCode = function(e, code){ 49395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 49405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // squelch errors when keyCode is read-only 49415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (e.g. if keyCode is ctrl or shift) 49425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (e.keyCode = code); 49435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 49445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 49455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 49465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 49475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 49485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // by default, use the standard listener 49495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var iel = dojo._listener; 49505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var listenersName = (dojo._ieListenersName = "_" + dojo._scopeName + "_listeners"); 49515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dispatcher tracking property 49525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!dojo.config._allow_leaks){ 49535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // custom listener that handles leak protection for DOM events 49545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node_listener = iel = dojo._ie_listener = { 49555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // support handler indirection: event handler functions are 49565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // referenced here. Event dispatchers hold only indices. 49575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) handlers: [], 49585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add a listener to an object 49595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) add: function(/*Object*/ source, /*String*/ method, /*Function*/ listener){ 49605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) source = source || dojo.global; 49615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var f = source[method]; 49625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!f||!f[listenersName]){ 49635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var d = dojo._getIeDispatcher(); 49645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // original target function is special 49655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.target = f && (ieh.push(f) - 1); 49665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dispatcher holds a list of indices into handlers table 49675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d[listenersName] = []; 49685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // redirect source to dispatcher 49695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f = source[method] = d; 49705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 49715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return f[listenersName].push(ieh.push(listener) - 1) ; /*Handle*/ 49725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 49735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // remove a listener from an object 49745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remove: function(/*Object*/ source, /*String*/ method, /*Handle*/ handle){ 49755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var f = (source||dojo.global)[method], l = f && f[listenersName]; 49765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(f && l && handle--){ 49775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete ieh[l[handle]]; 49785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete l[handle]; 49795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 49805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 49815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 49825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // alias used above 49835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ieh = iel.handlers; 49845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 49855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 49865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.mixin(del, { 49875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) add: function(/*DOMNode*/ node, /*String*/ event, /*Function*/ fp){ 49885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!node){return;} // undefined 49895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event = del._normalizeEventName(event); 49905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(event=="onkeypress"){ 49915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we need to listen to onkeydown to synthesize 49925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // keypress events that otherwise won't fire 49935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // on IE 49945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var kd = node.onkeydown; 49955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!kd || !kd[listenersName] || !kd._stealthKeydownHandle){ 49965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var h = del.add(node, "onkeydown", del._stealthKeyDown); 49975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) kd = node.onkeydown; 49985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) kd._stealthKeydownHandle = h; 49995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) kd._stealthKeydownRefs = 1; 50005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 50015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) kd._stealthKeydownRefs++; 50025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 50035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 50045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return iel.add(node, event, del._fixCallback(fp)); 50055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 50065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){ 50075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event = del._normalizeEventName(event); 50085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) iel.remove(node, event, handle); 50095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(event=="onkeypress"){ 50105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var kd = node.onkeydown; 50115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(--kd._stealthKeydownRefs <= 0){ 50125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) iel.remove(node, "onkeydown", kd._stealthKeydownHandle); 50135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete kd._stealthKeydownHandle; 50145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 50155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 50165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 50175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _normalizeEventName: function(/*String*/ eventName){ 50185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Generally, eventName should be lower case, unless it is 50195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // special somehow (e.g. a Mozilla event) 50205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ensure 'on' 50215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return eventName.slice(0,2) != "on" ? "on" + eventName : eventName; 50225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 50235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _nop: function(){}, 50245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _fixEvent: function(/*Event*/ evt, /*DOMNode*/ sender){ 50255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 50265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // normalizes properties on the event object including event 50275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // bubbling methods, keystroke normalization, and x/y positions 50285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // evt: 50295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // native event object 50305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sender: 50315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node to treat as "currentTarget" 50325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!evt){ 50335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window; 50345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt = w.event; 50355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 50365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!evt){return(evt);} 50375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.target = evt.srcElement; 50385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.currentTarget = (sender || evt.srcElement); 50395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.layerX = evt.offsetX; 50405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.layerY = evt.offsetY; 50415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: scroll position query is duped from dojo.html to 50425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // avoid dependency on that entire module. Now that HTML is in 50435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Base, we should convert back to something similar there. 50445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var se = evt.srcElement, doc = (se && se.ownerDocument) || document; 50455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DO NOT replace the following to use dojo.body(), in IE, document.documentElement should be used 50465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // here rather than document.body 50475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var docBody = ((dojo.isIE < 6) || (doc["compatMode"] == "BackCompat")) ? doc.body : doc.documentElement; 50485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var offset = dojo._getIeDocumentElementOffset(); 50495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.pageX = evt.clientX + dojo._fixIeBiDiScrollLeft(docBody.scrollLeft || 0) - offset.x; 50505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.pageY = evt.clientY + (docBody.scrollTop || 0) - offset.y; 50515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(evt.type == "mouseover"){ 50525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.relatedTarget = evt.fromElement; 50535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 50545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(evt.type == "mouseout"){ 50555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.relatedTarget = evt.toElement; 50565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 50575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (dojo.isIE < 9 || dojo.isQuirks) { 50585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.stopPropagation = del._stopPropagation; 50595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.preventDefault = del._preventDefault; 50605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 50615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return del._fixKeys(evt); 50625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 50635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _fixKeys: function(evt){ 50645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch(evt.type){ 50655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "keypress": 50665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var c = ("charCode" in evt ? evt.charCode : evt.keyCode); 50675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (c==10){ 50685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // CTRL-ENTER is CTRL-ASCII(10) on IE, but CTRL-ENTER on Mozilla 50695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c=0; 50705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.keyCode = 13; 50715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(c==13||c==27){ 50725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c=0; // Mozilla considers ENTER and ESC non-printable 50735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(c==3){ 50745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c=99; // Mozilla maps CTRL-BREAK to CTRL-c 50755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 50765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Mozilla sets keyCode to 0 when there is a charCode 50775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // but that stops the event on IE. 50785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.charCode = c; 50795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) del._setKeyChar(evt); 50805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 50815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 50825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return evt; 50835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 50845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _stealthKeyDown: function(evt){ 50855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // IE doesn't fire keypress for most non-printable characters. 50865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // other browsers do, we simulate it here. 50875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var kp = evt.currentTarget.onkeypress; 50885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // only works if kp exists and is a dispatcher 50895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!kp || !kp[listenersName]){ return; } 50905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // munge key/charCode 50915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var k=evt.keyCode; 50925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // These are Windows Virtual Key Codes 50935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp 50945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 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); 50955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 50965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // synthesize keypress for most unprintables and CTRL-keys 50975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(unprintable||evt.ctrlKey){ 50985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var c = unprintable ? 0 : k; 50995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(evt.ctrlKey){ 51005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(k==3 || k==13){ 51015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively 51025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(c>95 && c<106){ 51035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c -= 48; // map CTRL-[numpad 0-9] to ASCII 51045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if((!evt.shiftKey)&&(c>=65&&c<=90)){ 51055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c += 32; // map CTRL-[A-Z] to lowercase 51065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 51075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII 51085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 51095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 51105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // simulate a keypress event 51115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var faux = del._synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c}); 51125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) kp.call(evt.currentTarget, faux); 51135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){ 51145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.cancelBubble = faux.cancelBubble; 51155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 51165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt.returnValue = faux.returnValue; 51175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _trySetKeyCode(evt, faux.keyCode); 51185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 51195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 51205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Called in Event scope 51215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _stopPropagation: function(){ 51225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.cancelBubble = true; 51235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 51245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _preventDefault: function(){ 51255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Setting keyCode to 0 is the only way to prevent certain keypresses (namely 51265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ctrl-combinations that correspond to menu accelerator keys). 51275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Otoh, it prevents upstream listeners from getting this information 51285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Try to split the difference here by clobbering keyCode only for ctrl 51295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // combinations. If you still need to access the key upstream, bubbledKeyCode is 51305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // provided as a workaround. 51315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.bubbledKeyCode = this.keyCode; 51325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(this.ctrlKey){_trySetKeyCode(this, 0);} 51335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.returnValue = false; 51345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 51355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 51365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 51375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // override stopEvent for IE 51385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.stopEvent = (dojo.isIE < 9 || dojo.isQuirks) ? function(evt){ 51395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evt = evt || window.event; 51405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) del._stopPropagation.call(evt); 51415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) del._preventDefault.call(evt); 51425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } : dojo.stopEvent; 51435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 51445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 51455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) del._synthesizeEvent = function(evt, props){ 51465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var faux = dojo.mixin({}, evt, props); 51475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) del._setKeyChar(faux); 51485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: would prefer to use dojo.hitch: dojo.hitch(evt, evt.preventDefault); 51495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // but it throws an error when preventDefault is invoked on Safari 51505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // does Event.preventDefault not support "apply" on Safari? 51515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) faux.preventDefault = function(){ evt.preventDefault(); }; 51525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) faux.stopPropagation = function(){ evt.stopPropagation(); }; 51535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return faux; 51545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 51555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 51565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Opera event normalization 51575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.isOpera){ 51585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.mixin(del, { 51595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _fixEvent: function(evt, sender){ 51605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch(evt.type){ 51615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "keypress": 51625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var c = evt.which; 51635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(c==3){ 51645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c=99; // Mozilla maps CTRL-BREAK to CTRL-c 51655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 51665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can't trap some keys at all, like INSERT and DELETE 51675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // there is no differentiating info between DELETE and ".", or INSERT and "-" 51685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c = c<41 && !evt.shiftKey ? 0 : c; 51695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(evt.ctrlKey && !evt.shiftKey && c>=65 && c<=90){ 51705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // lowercase CTRL-[A-Z] keys 51715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c += 32; 51725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 51735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return del._synthesizeEvent(evt, { charCode: c }); 51745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 51755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return evt; 51765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 51775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 51785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 51795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 51805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Webkit event normalization 51815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.isWebKit){ 51825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) del._add = del.add; 51835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) del._remove = del.remove; 51845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 51855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.mixin(del, { 51865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) add: function(/*DOMNode*/ node, /*String*/ event, /*Function*/ fp){ 51875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!node){return;} // undefined 51885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var handle = del._add(node, event, fp); 51895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(del._normalizeEventName(event) == "keypress"){ 51905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we need to listen to onkeydown to synthesize 51915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // keypress events that otherwise won't fire 51925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in Safari 3.1+: https://lists.webkit.org/pipermail/webkit-dev/2007-December/002992.html 51935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) handle._stealthKeyDownHandle = del._add(node, "keydown", function(evt){ 51945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //A variation on the IE _stealthKeydown function 51955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Synthesize an onkeypress event, but only for unprintable characters. 51965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var k=evt.keyCode; 51975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // These are Windows Virtual Key Codes 51985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp 51995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var unprintable = k!=13 && k!=32 && (k<48 || k>90) && (k<96 || k>111) && (k<186 || k>192) && (k<219 || k>222); 52005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // synthesize keypress for most unprintables and CTRL-keys 52015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(unprintable || evt.ctrlKey){ 52025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var c = unprintable ? 0 : k; 52035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(evt.ctrlKey){ 52045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(k==3 || k==13){ 52055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively 52065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(c>95 && c<106){ 52075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c -= 48; // map CTRL-[numpad 0-9] to ASCII 52085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(!evt.shiftKey && c>=65 && c<=90){ 52095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c += 32; // map CTRL-[A-Z] to lowercase 52105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 52115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII 52125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 52135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 52145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // simulate a keypress event 52155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var faux = del._synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c}); 52165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fp.call(evt.currentTarget, faux); 52175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 52185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 52195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 52205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return handle; /*Handle*/ 52215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 52225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){ 52245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(node){ 52255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(handle._stealthKeyDownHandle){ 52265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) del._remove(node, "keydown", handle._stealthKeyDownHandle); 52275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 52285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) del._remove(node, event, handle); 52295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 52305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 52315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _fixEvent: function(evt, sender){ 52325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch(evt.type){ 52335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "keypress": 52345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(evt.faux){ return evt; } 52355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var c = evt.charCode; 52365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c = c>=32 ? c : 0; 52375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return del._synthesizeEvent(evt, {charCode: c, faux: true}); 52385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 52395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return evt; 52405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 52415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 52425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 52435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) })(); 52445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(dojo.isIE){ 52465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // keep this out of the closure 52475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // closing over 'iel' or 'ieh' b0rks leak prevention 52485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ls[i] is an index into the master handler array 52495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._ieDispatcher = function(args, sender){ 52505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ap = Array.prototype, 52515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) h = dojo._ie_listener.handlers, 52525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c = args.callee, 52535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ls = c[dojo._ieListenersName], 52545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = h[c.target]; 52555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return value comes from original target function 52565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var r = t && t.apply(sender, args); 52575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // make local copy of listener array so it's immutable during processing 52585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var lls = [].concat(ls); 52595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // invoke listeners after target function 52605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i in lls){ 52615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var f = h[lls[i]]; 52625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!(i in ap) && f){ 52635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) f.apply(sender, args); 52645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 52655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 52665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return r; 52675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 52685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getIeDispatcher = function(){ 52695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ensure the returned function closes over nothing ("new Function" apparently doesn't close) 52705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return new Function(dojo._scopeName + "._ieDispatcher(arguments, this)"); // function 52715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 52725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // keep this out of the closure to reduce RAM allocation 52735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._event_listener._fixCallback = function(fp){ 52745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var f = dojo._event_listener._fixEvent; 52755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(e){ return fp.call(this, f(e, this)); }; 52765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 52775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 52785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 52805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 52825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.html"] = true; 52835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.html"); 52845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: need to add unit tests for all the semi-public methods 52885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)try{ 52905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) document.execCommand("BackgroundImageCache", false, true); 52915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}catch(e){ 52925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sane browsers don't have cache "issues" 52935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 52945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ============================= 52965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// DOM Functions 52975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ============================= 52985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*===== 53005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.byId = function(id, doc){ 53015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 53025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns DOM node with matching `id` attribute or `null` 53035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if not found. If `id` is a DomNode, this function is a no-op. 53045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 53055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id: String|DOMNode 53065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A string to match an HTML id attribute or a reference to a DOM Node 53075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 53085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // doc: Document? 53095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Document to work in. Defaults to the current value of 53105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.doc. Can be used to retrieve 53115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node references from other documents. 53125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 53135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 53145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Look up a node by ID: 53155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var n = dojo.byId("foo"); 53165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 53175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 53185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Check if a node exists, and use it. 53195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var n = dojo.byId("bar"); 53205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(n){ doStuff() ... } 53215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 53225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 53235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Allow string or DomNode references to be passed to a custom function: 53245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var foo = function(nodeOrId){ 53255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | nodeOrId = dojo.byId(nodeOrId); 53265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ... more stuff 53275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 53285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=====*/ 53295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 53305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(dojo.isIE){ 53315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.byId = function(id, doc){ 53325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof id != "string"){ 53335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return id; 53345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 53355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _d = doc || dojo.doc, te = _d.getElementById(id); 53365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // attributes.id.value is better than just id in case the 53375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // user has a name=id inside a form 53385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(te && (te.attributes.id.value == id || te.id == id)){ 53395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return te; 53405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 53415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var eles = _d.all[id]; 53425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!eles || eles.nodeName){ 53435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) eles = [eles]; 53445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 53455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if more than 1, choose first with the correct id 53465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var i=0; 53475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while((te=eles[i++])){ 53485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if((te.attributes && te.attributes.id && te.attributes.id.value == id) 53495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || te.id == id){ 53505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return te; 53515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 53525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 53535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 53545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 53555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}else{ 53565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.byId = function(id, doc){ 53575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // inline'd type check. 53585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be sure to return null per documentation, to match IE branch. 53595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ((typeof id == "string") ? (doc || dojo.doc).getElementById(id) : id) || null; // DomNode 53605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 53615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 53625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*===== 53635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 53645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=====*/ 53655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 53665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 53675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var d = dojo; 53685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var byId = d.byId; 53695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 53705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _destroyContainer = null, 53715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _destroyDoc; 53725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.addOnWindowUnload(function(){ 53735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _destroyContainer = null; //prevent IE leak 53745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 53755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 53765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*===== 53775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._destroyElement = function(node){ 53785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 53795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Existing alias for `dojo.destroy`. Deprecated, will be removed 53805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in 2.0 53815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 53825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=====*/ 53835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._destroyElement = dojo.destroy = function(/*String|DomNode*/node){ 53845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 53855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Removes a node from its parent, clobbering it and all of its 53865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // children. 53875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 53885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 53895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Removes a node from its parent, clobbering it and all of its 53905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // children. Function only works with DomNodes, and returns nothing. 53915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 53925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 53935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A String ID or DomNode reference of the element to be destroyed 53945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 53955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 53965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Destroy a node byId: 53975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.destroy("someId"); 53985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 53995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 54005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Destroy all nodes in a list by reference: 54015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".someNode").forEach(dojo.destroy); 54025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 54035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = byId(node); 54045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 54055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var doc = node.ownerDocument; 54065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cannot use _destroyContainer.ownerDocument since this can throw an exception on IE 54075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_destroyContainer || _destroyDoc != doc){ 54085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _destroyContainer = doc.createElement("div"); 54095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _destroyDoc = doc; 54105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 54115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _destroyContainer.appendChild(node.parentNode ? node.parentNode.removeChild(node) : node); 54125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE: see http://trac.dojotoolkit.org/ticket/2931. This may be a bug and not a feature 54135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _destroyContainer.innerHTML = ""; 54145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 54155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /* squelch */ 54165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 54175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 54185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 54195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.isDescendant = function(/*DomNode|String*/node, /*DomNode|String*/ancestor){ 54205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 54215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns true if node is a descendant of ancestor 54225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: string id or node reference to test 54235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ancestor: string id or node reference of potential parent to test against 54245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 54255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 54265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Test is node id="bar" is a descendant of node id="foo" 54275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(dojo.isDescendant("bar", "foo")){ ... } 54285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 54295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = byId(node); 54305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ancestor = byId(ancestor); 54315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(node){ 54325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(node == ancestor){ 54335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; // Boolean 54345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 54355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = node.parentNode; 54365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 54375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ /* squelch, return false */ } 54385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; // Boolean 54395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 54405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 54415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.setSelectable = function(/*DomNode|String*/node, /*Boolean*/selectable){ 54425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 54435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Enable or disable selection on a node 54445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 54455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id or reference to node 54465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // selectable: 54475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // state to put the node in. false indicates unselectable, true 54485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // allows selection. 54495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 54505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make the node id="bar" unselectable 54515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.setSelectable("bar"); 54525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 54535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make the node id="bar" selectable 54545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.setSelectable("bar", true); 54555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = byId(node); 54565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isMozilla){ 54575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.style.MozUserSelect = selectable ? "" : "none"; 54585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(d.isKhtml || d.isWebKit){ 54595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.style.KhtmlUserSelect = selectable ? "auto" : "none"; 54605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(d.isIE){ 54615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var v = (node.unselectable = selectable ? "" : "on"); 54625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.query("*", node).forEach("item.unselectable = '"+v+"'"); 54635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 54645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //FIXME: else? Opera? 54655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 54665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 54675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _insertBefore = function(/*DomNode*/node, /*DomNode*/ref){ 54685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var parent = ref.parentNode; 54695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(parent){ 54705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parent.insertBefore(node, ref); 54715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 54725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 54735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 54745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _insertAfter = function(/*DomNode*/node, /*DomNode*/ref){ 54755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 54765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Try to insert node after ref 54775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var parent = ref.parentNode; 54785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(parent){ 54795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(parent.lastChild == ref){ 54805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parent.appendChild(node); 54815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 54825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parent.insertBefore(node, ref.nextSibling); 54835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 54845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 54855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 54865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 54875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.place = function(node, refNode, position){ 54885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 54895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Attempt to insert node into the DOM, choosing from various positioning options. 54905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the first argument resolved to a DOM node. 54915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 54925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: String|DomNode 54935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id or node reference, or HTML fragment starting with "<" to place relative to refNode 54945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 54955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // refNode: String|DomNode 54965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id or node reference to use as basis for placement 54975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 54985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // position: String|Number? 54995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // string noting the position of node relative to refNode or a 55005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // number indicating the location in the childNodes collection of refNode. 55015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Accepted string values are: 55025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * before 55035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * after 55045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * replace 55055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * only 55065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * first 55075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * last 55085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "first" and "last" indicate positions as children of refNode, "replace" replaces refNode, 55095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "only" replaces all children. position defaults to "last" if not specified 55105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 55115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: DomNode 55125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returned values is the first argument resolved to a DOM node. 55135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 55145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // .place() is also a method of `dojo.NodeList`, allowing `dojo.query` node lookups. 55155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 55165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 55175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Place a node by string id as the last child of another node by string id: 55185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.place("someNode", "anotherNode"); 55195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 55205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 55215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Place a node by string id before another node by string id 55225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.place("someNode", "anotherNode", "before"); 55235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 55245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 55255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create a Node, and place it in the body element (last child): 55265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.place("<div></div>", dojo.body()); 55275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 55285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 55295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Put a new LI as the first child of a list by id: 55305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.place("<li></li>", "someUl", "first"); 55315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) refNode = byId(refNode); 55335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof node == "string"){ // inline'd type check 55345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = /^\s*</.test(node) ? d._toDom(node, refNode.ownerDocument) : byId(node); 55355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 55365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof position == "number"){ // inline'd type check 55375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cn = refNode.childNodes; 55385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!cn.length || cn.length <= position){ 55395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) refNode.appendChild(node); 55405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 55415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _insertBefore(node, cn[position < 0 ? 0 : position]); 55425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 55435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 55445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch(position){ 55455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "before": 55465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _insertBefore(node, refNode); 55475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 55485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "after": 55495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _insertAfter(node, refNode); 55505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 55515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "replace": 55525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) refNode.parentNode.replaceChild(node, refNode); 55535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 55545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "only": 55555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.empty(refNode); 55565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) refNode.appendChild(node); 55575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 55585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "first": 55595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(refNode.firstChild){ 55605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _insertBefore(node, refNode.firstChild); 55615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 55625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 55635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // else fallthrough... 55645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: // aka: last 55655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) refNode.appendChild(node); 55665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 55675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 55685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node; // DomNode 55695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 55705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Box functions will assume this model. 55725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // On IE/Opera, BORDER_BOX will be set if the primary document is in quirks mode. 55735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Can be set to change behavior of box setters. 55745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can be either: 55765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "border-box" 55775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "content-box" (default) 55785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.boxModel = "content-box"; 55795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We punt per-node box mode testing completely. 55815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If anybody cares, we can provide an additional (optional) unit 55825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that overrides existing code to include per-node box sensitivity. 55835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Opera documentation claims that Opera 9 uses border-box in BackCompat mode. 55855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // but experiments (Opera 9.10.8679 on Windows Vista) indicate that it actually continues to use content-box. 55865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // IIRC, earlier versions of Opera did in fact use border-box. 55875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Opera guys, this is really confusing. Opera being broken in quirks mode is not our fault. 55885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isIE /*|| dojo.isOpera*/){ 55905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // client code may have to adjust if compatMode varies across iframes 55915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.boxModel = document.compatMode == "BackCompat" ? "border-box" : "content-box"; 55925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 55935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ============================= 55955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Style Functions 55965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ============================= 55975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // getComputedStyle drives most of the style code. 55995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Wherever possible, reuse the returned object. 56005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 56015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // API functions below that need to access computed styles accept an 56025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // optional computedStyle parameter. 56035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If this parameter is omitted, the functions will call getComputedStyle themselves. 56045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This way, calling code can access computedStyle once, and then pass the reference to 56055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // multiple API functions. 56065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 56075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*===== 56085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.getComputedStyle = function(node){ 56095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 56105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a "computed style" object. 56115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 56125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 56135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Gets a "computed style" object which can be used to gather 56145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // information about the current state of the rendered node. 56155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 56165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note that this may behave differently on different browsers. 56175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Values may have different formats and value encodings across 56185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // browsers. 56195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 56205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note also that this method is expensive. Wherever possible, 56215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // reuse the returned object. 56225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 56235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Use the dojo.style() method for more consistent (pixelized) 56245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return values. 56255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 56265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: DOMNode 56275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A reference to a DOM node. Does NOT support taking an 56285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ID string for speed reasons. 56295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 56305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.getComputedStyle(dojo.byId('foo')).borderWidth; 56315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 56325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 56335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Reusing the returned object, avoiding multiple lookups: 56345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var cs = dojo.getComputedStyle(dojo.byId("someNode")); 56355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var w = cs.width, h = cs.height; 56365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // CSS2Properties 56375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 56385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=====*/ 56395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 56405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Although we normally eschew argument validation at this 56415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // level, here we test argument 'node' for (duck)type, 56425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // by testing nodeType, ecause 'document' is the 'parentNode' of 'body' 56435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it is frequently sent to this function even 56445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // though it is not Element. 56455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var gcs; 56465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isWebKit){ 56475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gcs = function(/*DomNode*/node){ 56485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var s; 56495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(node.nodeType == 1){ 56505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var dv = node.ownerDocument.defaultView; 56515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s = dv.getComputedStyle(node, null); 56525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!s && node.style){ 56535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.style.display = ""; 56545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s = dv.getComputedStyle(node, null); 56555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 56565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 56575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return s || {}; 56585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 56595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(d.isIE){ 56605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gcs = function(node){ 56615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // IE (as of 7) doesn't expose Element like sane browsers 56625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node.nodeType == 1 /* ELEMENT_NODE*/ ? node.currentStyle : {}; 56635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 56645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 56655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gcs = function(node){ 56665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node.nodeType == 1 ? 56675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.ownerDocument.defaultView.getComputedStyle(node, null) : {}; 56685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 56695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 56705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.getComputedStyle = gcs; 56715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 56725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!d.isIE){ 56735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._toPixelValue = function(element, value){ 56745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // style values can be floats, client code may want 56755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to round for integer pixels. 56765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return parseFloat(value) || 0; 56775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 56785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 56795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._toPixelValue = function(element, avalue){ 56805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!avalue){ return 0; } 56815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // on IE7, medium is usually 4 pixels 56825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(avalue == "medium"){ return 4; } 56835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // style values can be floats, client code may 56845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // want to round this value for integer pixels. 56855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(avalue.slice && avalue.slice(-2) == 'px'){ return parseFloat(avalue); } 56865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) with(element){ 56875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var sLeft = style.left; 56885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var rsLeft = runtimeStyle.left; 56895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) runtimeStyle.left = currentStyle.left; 56905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 56915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 'avalue' may be incompatible with style.left, which can cause IE to throw 56925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this has been observed for border widths using "thin", "medium", "thick" constants 56935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // those particular constants could be trapped by a lookup 56945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // but perhaps there are more 56955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) style.left = avalue; 56965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) avalue = style.pixelLeft; 56975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 56985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) avalue = 0; 56995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 57005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) style.left = sLeft; 57015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) runtimeStyle.left = rsLeft; 57025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 57035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return avalue; 57045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 57055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 57065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var px = d._toPixelValue; 57075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: there opacity quirks on FF that we haven't ported over. Hrm. 57095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 57105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getOpacity = function(node){ 57115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 57125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the current opacity of the passed node as a 57135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // floating-point value between 0 and 1. 57145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: DomNode 57155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a reference to a DOM node. Does NOT support taking an 57165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ID string for speed reasons. 57175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: Number between 0 and 1 57185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // Number 57195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 57205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 57215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var astr = "DXImageTransform.Microsoft.Alpha"; 57235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var af = function(n, f){ 57245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 57255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return n.filters.item(astr); 57265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 57275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return f ? {} : null; 57285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 57295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 57305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getOpacity = 57325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isIE < 9 ? function(node){ 57335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 57345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return af(node).Opacity / 100; // Number 57355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 57365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 1; // Number 57375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 57385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } : 57395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function(node){ 57405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return gcs(node).opacity; 57415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 57425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 57445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._setOpacity = function(node, opacity){ 57455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 57465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // set the opacity of the passed node portably. Returns the 57475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // new opacity of the node. 57485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: DOMNode 57495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a reference to a DOM node. Does NOT support taking an 57505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ID string for performance reasons. 57515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // opacity: Number 57525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A Number between 0 and 1. 0 specifies transparent. 57535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: Number between 0 and 1 57545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // Number 57555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 57565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 57575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._setOpacity = 57595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isIE < 9 ? function(/*DomNode*/node, /*Number*/opacity){ 57605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ov = opacity * 100, opaque = opacity == 1; 57615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.style.zoom = opaque ? "" : 1; 57625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!af(node)){ 57645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(opaque){ 57655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return opacity; 57665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 57675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.style.filter += " progid:" + astr + "(Opacity=" + ov + ")"; 57685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 57695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) af(node, 1).Opacity = ov; 57705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 57715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // on IE7 Alpha(Filter opacity=100) makes text look fuzzy so disable it altogether (bug #2661), 57735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //but still update the opacity value so we can get a correct reading if it is read later. 57745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) af(node, 1).Enabled = !opaque; 57755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(node.nodeName.toLowerCase() == "tr"){ 57775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.query("> td", node).forEach(function(i){ 57785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._setOpacity(i, opacity); 57795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 57805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 57815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return opacity; 57825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } : 57835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function(node, opacity){ 57845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node.style.opacity = opacity; 57855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 57865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _pixelNamesCache = { 57885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) left: true, top: true 57895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 57905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _pixelRegExp = /margin|padding|width|height|max|min|offset/; // |border 57915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _toStyleValue = function(node, type, value){ 57925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = type.toLowerCase(); // FIXME: should we really be doing string case conversion here? Should we cache it? Need to profile! 57935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isIE){ 57945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(value == "auto"){ 57955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(type == "height"){ return node.offsetHeight; } 57965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(type == "width"){ return node.offsetWidth; } 57975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 57985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(type == "fontweight"){ 57995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch(value){ 58005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case 700: return "bold"; 58015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case 400: 58025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: return "normal"; 58035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 58045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 58055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 58065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!(type in _pixelNamesCache)){ 58075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _pixelNamesCache[type] = _pixelRegExp.test(type); 58085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 58095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _pixelNamesCache[type] ? px(node, value) : value; 58105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 58115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 58125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _floatStyle = d.isIE ? "styleFloat" : "cssFloat", 58135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _floatAliases = { "cssFloat": _floatStyle, "styleFloat": _floatStyle, "float": _floatStyle } 58145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ; 58155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 58165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // public API 58175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 58185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.style = function( /*DomNode|String*/ node, 58195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*String?|Object?*/ style, 58205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*String?*/ value){ 58215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 58225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Accesses styles on a node. If 2 arguments are 58235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // passed, acts as a getter. If 3 arguments are passed, acts 58245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // as a setter. 58255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 58265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Getting the style value uses the computed style for the node, so the value 58275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will be a calculated value, not just the immediate node.style value. 58285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Also when getting values, use specific style names, 58295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // like "borderBottomWidth" instead of "border" since compound values like 58305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "border" are not necessarily reflected as expected. 58315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If you want to get node dimensions, use `dojo.marginBox()`, 58325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.contentBox()` or `dojo.position()`. 58335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 58345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id or reference to node to get/set style for 58355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // style: 58365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the style property to set in DOM-accessor format 58375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ("borderWidth", not "border-width") or an object with key/value 58385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // pairs suitable for setting each property. 58395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // value: 58405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If passed, sets value on the node for style, handling 58415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cross-browser concerns. When setting a pixel value, 58425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be sure to include "px" in the value. For instance, top: "200px". 58435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Otherwise, in some cases, some browsers will not apply the style. 58445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 58455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Passing only an ID or node returns the computed style object of 58465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the node: 58475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.style("thinger"); 58485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 58495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Passing a node and a style property returns the current 58505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // normalized, computed value for that property: 58515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.style("thinger", "opacity"); // 1 by default 58525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 58535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 58545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Passing a node, a style property, and a value changes the 58555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // current display of the node and returns the new computed value 58565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.style("thinger", "opacity", 0.5); // == 0.5 58575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 58585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 58595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node: 58605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.style("thinger", { 58615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "opacity": 0.5, 58625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "border": "3px solid black", 58635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "height": "300px" 58645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 58655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 58665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 58675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When the CSS style property is hyphenated, the JavaScript property is camelCased. 58685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // font-size becomes fontSize, and so on. 58695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.style("thinger",{ 58705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | fontSize:"14pt", 58715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | letterSpacing:"1.2em" 58725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 58735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 58745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 58755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.NodeList implements .style() using the same syntax, omitting the "node" parameter, calling 58765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.style() on every element of the list. See: `dojo.query()` and `dojo.NodeList()` 58775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".someClassName").style("visibility","hidden"); 58785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // or 58795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("#baz > div").style({ 58805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | opacity:0.75, 58815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | fontSize:"13pt" 58825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 58835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 58845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var n = byId(node), args = arguments.length, op = (style == "opacity"); 58855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) style = _floatAliases[style] || style; 58865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(args == 3){ 58875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return op ? d._setOpacity(n, value) : n.style[style] = value; /*Number*/ 58885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 58895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(args == 2 && op){ 58905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d._getOpacity(n); 58915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 58925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var s = gcs(n); 58935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(args == 2 && typeof style != "string"){ // inline'd type check 58945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var x in style){ 58955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.style(node, x, style[x]); 58965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 58975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return s; 58985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 58995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (args == 1) ? s : _toStyleValue(n, style, s[style] || n.style[style]); /* CSS2Properties||String||Number */ 59005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 59015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 59025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ============================= 59035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Box Functions 59045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ============================= 59055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 59065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getPadExtents = function(/*DomNode*/n, /*Object*/computedStyle){ 59075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 59085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns object with special values specifically useful for node 59095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fitting. 59105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 59115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an object with `w`, `h`, `l`, `t` properties: 59125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | l/t = left/top padding (respectively) 59135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | w = the total of the left and right padding 59145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | h = the total of the top and bottom padding 59155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If 'node' has position, l/t forms the origin for child nodes. 59165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The w/h are used for calculating boxes. 59175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Normally application code will not need to invoke this 59185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // directly, and will use the ...box... functions instead. 59195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var 59205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s = computedStyle||gcs(n), 59215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l = px(n, s.paddingLeft), 59225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = px(n, s.paddingTop); 59235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 59245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l: l, 59255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t: t, 59265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) w: l+px(n, s.paddingRight), 59275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) h: t+px(n, s.paddingBottom) 59285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 59295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 59305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 59315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){ 59325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 59335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns an object with properties useful for noting the border 59345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dimensions. 59355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 59365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * l/t = the sum of left/top border (respectively) 59375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * w = the sum of the left and right border 59385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * h = the sum of the top and bottom border 59395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 59405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The w/h are used for calculating boxes. 59415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Normally application code will not need to invoke this 59425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // directly, and will use the ...box... functions instead. 59435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var 59445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ne = "none", 59455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s = computedStyle||gcs(n), 59465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bl = (s.borderLeftStyle != ne ? px(n, s.borderLeftWidth) : 0), 59475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bt = (s.borderTopStyle != ne ? px(n, s.borderTopWidth) : 0); 59485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 59495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l: bl, 59505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t: bt, 59515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) w: bl + (s.borderRightStyle!=ne ? px(n, s.borderRightWidth) : 0), 59525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) h: bt + (s.borderBottomStyle!=ne ? px(n, s.borderBottomWidth) : 0) 59535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 59545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 59555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 59565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getPadBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){ 59575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 59585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns object with properties useful for box fitting with 59595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // regards to padding. 59605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 59615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * l/t = the sum of left/top padding and left/top border (respectively) 59625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * w = the sum of the left and right padding and border 59635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * h = the sum of the top and bottom padding and border 59645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 59655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The w/h are used for calculating boxes. 59665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Normally application code will not need to invoke this 59675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // directly, and will use the ...box... functions instead. 59685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var 59695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s = computedStyle||gcs(n), 59705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) p = d._getPadExtents(n, s), 59715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) b = d._getBorderExtents(n, s); 59725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 59735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l: p.l + b.l, 59745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t: p.t + b.t, 59755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) w: p.w + b.w, 59765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) h: p.h + b.h 59775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 59785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 59795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 59805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getMarginExtents = function(n, computedStyle){ 59815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 59825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns object with properties useful for box fitting with 59835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // regards to box margins (i.e., the outer-box). 59845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 59855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * l/t = marginLeft, marginTop, respectively 59865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * w = total width, margin inclusive 59875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * h = total height, margin inclusive 59885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 59895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The w/h are used for calculating boxes. 59905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Normally application code will not need to invoke this 59915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // directly, and will use the ...box... functions instead. 59925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var 59935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s = computedStyle||gcs(n), 59945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l = px(n, s.marginLeft), 59955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = px(n, s.marginTop), 59965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) r = px(n, s.marginRight), 59975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) b = px(n, s.marginBottom); 59985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isWebKit && (s.position != "absolute")){ 59995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Safari's version of the computed right margin 60005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is the space between our right edge and the right edge 60015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of our offsetParent. 60025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // What we are looking for is the actual margin value as 60035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // determined by CSS. 60045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Hack solution is to assume left/right margins are the same. 60055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) r = l; 60065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 60075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 60085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l: l, 60095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t: t, 60105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) w: l+r, 60115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) h: t+b 60125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 60135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 60145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 60155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Box getters work in any box context because offsetWidth/clientWidth 60165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // are invariant wrt box context 60175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 60185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // They do *not* work for display: inline objects that have padding styles 60195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // because the user agent ignores padding (it's bogus styling in any case) 60205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 60215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Be careful with IMGs because they are inline or block depending on 60225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // browser and browser mode. 60235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 60245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Although it would be easier to read, there are not separate versions of 60255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // _getMarginBox for each browser because: 60265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1. the branching is not expensive 60275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 2. factoring the shared code wastes cycles (function call overhead) 60285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 3. duplicating the shared code wastes bytes 60295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 60305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getMarginBox = function(/*DomNode*/node, /*Object*/computedStyle){ 60315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 60325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns an object that encodes the width, height, left and top 60335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // positions of the node's margin box. 60345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var s = computedStyle || gcs(node), me = d._getMarginExtents(node, s); 60355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var l = node.offsetLeft - me.l, t = node.offsetTop - me.t, p = node.parentNode; 60365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isMoz){ 60375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Mozilla: 60385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If offsetParent has a computed overflow != visible, the offsetLeft is decreased 60395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // by the parent's border. 60405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We don't want to compute the parent's style, so instead we examine node's 60415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // computed left/top which is more stable. 60425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var sl = parseFloat(s.left), st = parseFloat(s.top); 60435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!isNaN(sl) && !isNaN(st)){ 60445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l = sl, t = st; 60455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 60465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If child's computed left/top are not parseable as a number (e.g. "auto"), we 60475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // have no choice but to examine the parent's computed style. 60485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(p && p.style){ 60495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var pcs = gcs(p); 60505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(pcs.overflow != "visible"){ 60515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var be = d._getBorderExtents(p, pcs); 60525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l += be.l, t += be.t; 60535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 60545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 60555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 60565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(d.isOpera || (d.isIE > 7 && !d.isQuirks)){ 60575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // On Opera and IE 8, offsetLeft/Top includes the parent's border 60585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(p){ 60595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) be = d._getBorderExtents(p); 60605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l -= be.l; 60615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t -= be.t; 60625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 60635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 60645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 60655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l: l, 60665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t: t, 60675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) w: node.offsetWidth + me.w, 60685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) h: node.offsetHeight + me.h 60695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 60705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 60715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 60725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getMarginSize = function(/*DomNode*/node, /*Object*/computedStyle){ 60735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 60745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns an object that encodes the width and height of 60755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the node's margin box 60765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = byId(node); 60775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var me = d._getMarginExtents(node, computedStyle || gcs(node)); 60785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 60795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var size = node.getBoundingClientRect(); 60805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 60815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) w: (size.right - size.left) + me.w, 60825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) h: (size.bottom - size.top) + me.h 60835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 60845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 60855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 60865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getContentBox = function(node, computedStyle){ 60875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 60885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an object that encodes the width, height, left and top 60895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // positions of the node's content box, irrespective of the 60905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // current box model. 60915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 60925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // clientWidth/Height are important since the automatically account for scrollbars 60935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fallback to offsetWidth/Height for special cases (see #3378) 60945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var s = computedStyle || gcs(node), 60955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pe = d._getPadExtents(node, s), 60965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) be = d._getBorderExtents(node, s), 60975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) w = node.clientWidth, 60985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) h 60995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ; 61005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!w){ 61015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) w = node.offsetWidth, h = node.offsetHeight; 61025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 61035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) h = node.clientHeight, be.w = be.h = 0; 61045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 61055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // On Opera, offsetLeft includes the parent's border 61065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isOpera){ pe.l += be.l; pe.t += be.t; }; 61075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 61085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l: pe.l, 61095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t: pe.t, 61105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) w: w - pe.w - be.w, 61115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) h: h - pe.h - be.h 61125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 61135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 61145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getBorderBox = function(node, computedStyle){ 61165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var s = computedStyle || gcs(node), 61175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pe = d._getPadExtents(node, s), 61185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cb = d._getContentBox(node, s) 61195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ; 61205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 61215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l: cb.l - pe.l, 61225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t: cb.t - pe.t, 61235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) w: cb.w + pe.w, 61245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) h: cb.h + pe.h 61255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 61265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 61275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Box setters depend on box context because interpretation of width/height styles 61295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // vary wrt box context. 61305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 61315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The value of dojo.boxModel is used to determine box context. 61325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.boxModel can be set directly to change behavior. 61335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 61345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Beware of display: inline objects that have padding styles 61355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // because the user agent ignores padding (it's a bogus setup anyway) 61365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 61375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Be careful with IMGs because they are inline or block depending on 61385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // browser and browser mode. 61395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 61405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Elements other than DIV may have special quirks, like built-in 61415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // margins or padding, or values not detectable via computedStyle. 61425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In particular, margins on TABLE do not seems to appear 61435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // at all in computedStyle on Mozilla. 61445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._setBox = function(/*DomNode*/node, /*Number?*/l, /*Number?*/t, /*Number?*/w, /*Number?*/h, /*String?*/u){ 61465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 61475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sets width/height/left/top in the current (native) box-model 61485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dimentions. Uses the unit passed in u. 61495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 61505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM Node reference. Id string not supported for performance 61515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // reasons. 61525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // l: 61535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // left offset from parent. 61545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // t: 61555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // top offset from parent. 61565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // w: 61575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // width in current box model. 61585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // h: 61595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // width in current box model. 61605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // u: 61615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // unit measure to use for other measures. Defaults to "px". 61625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) u = u || "px"; 61635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var s = node.style; 61645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!isNaN(l)){ s.left = l + u; } 61655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!isNaN(t)){ s.top = t + u; } 61665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(w >= 0){ s.width = w + u; } 61675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(h >= 0){ s.height = h + u; } 61685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 61695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._isButtonTag = function(/*DomNode*/node) { 61715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 61725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // True if the node is BUTTON or INPUT.type="button". 61735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node.tagName == "BUTTON" 61745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || node.tagName=="INPUT" && (node.getAttribute("type")||'').toUpperCase() == "BUTTON"; // boolean 61755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 61765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._usesBorderBox = function(/*DomNode*/node){ 61785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 61795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // True if the node uses border-box layout. 61805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We could test the computed style of node to see if a particular box 61825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // has been specified, but there are details and we choose not to bother. 61835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // TABLE and BUTTON (and INPUT type=button) are always border-box by default. 61855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If you have assigned a different box to either one via CSS then 61865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // box functions will break. 61875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var n = node.tagName; 61895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.boxModel=="border-box" || n=="TABLE" || d._isButtonTag(node); // boolean 61905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 61915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._setContentSize = function(/*DomNode*/node, /*Number*/widthPx, /*Number*/heightPx, /*Object*/computedStyle){ 61935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 61945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sets the size of the node's contents, irrespective of margins, 61955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // padding, or borders. 61965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d._usesBorderBox(node)){ 61975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var pb = d._getPadBorderExtents(node, computedStyle); 61985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(widthPx >= 0){ widthPx += pb.w; } 61995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(heightPx >= 0){ heightPx += pb.h; } 62005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 62015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._setBox(node, NaN, NaN, widthPx, heightPx); 62025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 62035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 62045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._setMarginBox = function(/*DomNode*/node, /*Number?*/leftPx, /*Number?*/topPx, 62055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Number?*/widthPx, /*Number?*/heightPx, 62065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Object*/computedStyle){ 62075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 62085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sets the size of the node's margin box and placement 62095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (left/top), irrespective of box model. Think of it as a 62105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // passthrough to dojo._setBox that handles box-model vagaries for 62115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // you. 62125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 62135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var s = computedStyle || gcs(node), 62145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Some elements have special padding, margin, and box-model settings. 62155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // To use box functions you may need to set padding, margin explicitly. 62165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Controlling box-model is harder, in a pinch you might set dojo.boxModel. 62175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bb = d._usesBorderBox(node), 62185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pb = bb ? _nilExtents : d._getPadBorderExtents(node, s) 62195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ; 62205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isWebKit){ 62215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // on Safari (3.1.2), button nodes with no explicit size have a default margin 62225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // setting an explicit size eliminates the margin. 62235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We have to swizzle the width to get correct margin reading. 62245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d._isButtonTag(node)){ 62255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ns = node.style; 62265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(widthPx >= 0 && !ns.width) { ns.width = "4px"; } 62275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(heightPx >= 0 && !ns.height) { ns.height = "4px"; } 62285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 62295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 62305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mb = d._getMarginExtents(node, s); 62315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(widthPx >= 0){ widthPx = Math.max(widthPx - pb.w - mb.w, 0); } 62325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(heightPx >= 0){ heightPx = Math.max(heightPx - pb.h - mb.h, 0); } 62335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._setBox(node, leftPx, topPx, widthPx, heightPx); 62345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 62355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 62365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _nilExtents = { l:0, t:0, w:0, h:0 }; 62375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 62385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // public API 62395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 62405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.marginBox = function(/*DomNode|String*/node, /*Object?*/box){ 62415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 62425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Getter/setter for the margin-box of node. 62435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 62445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Getter/setter for the margin-box of node. 62455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an object in the expected format of box (regardless 62465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if box is passed). The object might look like: 62475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `{ l: 50, t: 200, w: 300: h: 150 }` 62485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for a node offset from its parent 50px to the left, 200px from 62495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the top with a margin width of 300px and a margin-height of 62505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 150px. 62515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 62525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id or reference to DOM Node to get/set box for 62535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // box: 62545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If passed, denotes that dojo.marginBox() should 62555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // update/set the margin box for node. Box is an object in the 62565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // above format. All properties are optional if passed. 62575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 62585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Retrieve the marginbox of a passed node 62595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var box = dojo.marginBox("someNodeId"); 62605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.dir(box); 62615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 62625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 62635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Set a node's marginbox to the size of another node 62645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var box = dojo.marginBox("someNodeId"); 62655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.marginBox("someOtherNode", box); 62665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 62675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var n = byId(node), s = gcs(n), b = box; 62685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !b ? d._getMarginBox(n, s) : d._setMarginBox(n, b.l, b.t, b.w, b.h, s); // Object 62695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 62705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 62715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.contentBox = function(/*DomNode|String*/node, /*Object?*/box){ 62725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 62735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Getter/setter for the content-box of node. 62745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 62755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an object in the expected format of box (regardless if box is passed). 62765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The object might look like: 62775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `{ l: 50, t: 200, w: 300: h: 150 }` 62785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for a node offset from its parent 50px to the left, 200px from 62795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the top with a content width of 300px and a content-height of 62805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 150px. Note that the content box may have a much larger border 62815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or margin box, depending on the box model currently in use and 62825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // CSS values set/inherited for node. 62835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // While the getter will return top and left values, the 62845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // setter only accepts setting the width and height. 62855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 62865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id or reference to DOM Node to get/set box for 62875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // box: 62885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If passed, denotes that dojo.contentBox() should 62895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // update/set the content box for node. Box is an object in the 62905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // above format, but only w (width) and h (height) are supported. 62915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // All properties are optional if passed. 62925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var n = byId(node), s = gcs(n), b = box; 62935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !b ? d._getContentBox(n, s) : d._setContentSize(n, b.w, b.h, s); // Object 62945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 62955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 62965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ============================= 62975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Positioning 62985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ============================= 62995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _sumAncestorProperties = function(node, prop){ 63015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!(node = (node||0).parentNode)){return 0;} 63025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var val, retVal = 0, _b = d.body(); 63035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(node && node.style){ 63045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(gcs(node).position == "fixed"){ 63055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 63065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 63075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) val = node[prop]; 63085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(val){ 63095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) retVal += val - 0; 63105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // opera and khtml #body & #html has the same values, we only 63115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // need one value 63125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(node == _b){ break; } 63135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 63145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = node.parentNode; 63155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 63165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return retVal; // integer 63175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 63185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._docScroll = function(){ 63205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var n = d.global; 63215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return "pageXOffset" in n 63225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ? { x:n.pageXOffset, y:n.pageYOffset } 63235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : (n = d.isQuirks? d.doc.body : d.doc.documentElement, { x:d._fixIeBiDiScrollLeft(n.scrollLeft || 0), y:n.scrollTop || 0 }); 63245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 63255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._isBodyLtr = function(){ 63275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return "_bodyLtr" in d? d._bodyLtr : 63285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._bodyLtr = (d.body().dir || d.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean 63295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 63305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._getIeDocumentElementOffset = function(){ 63325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 63335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns the offset in x and y from the document body to the 63345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // visual edge of the page 63355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 63365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The following values in IE contain an offset: 63375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | event.clientX 63385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | event.clientY 63395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | node.getBoundingClientRect().left 63405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | node.getBoundingClientRect().top 63415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // But other position related values do not contain this offset, 63425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // such as node.offsetLeft, node.offsetTop, node.style.left and 63435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node.style.top. The offset is always (2, 2) in LTR direction. 63445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When the body is in RTL direction, the offset counts the width 63455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of left scroll bar's width. This function computes the actual 63465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // offset. 63475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //NOTE: assumes we're being called in an IE browser 63495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var de = d.doc.documentElement; // only deal with HTML element here, _abs handles body/quirks 63515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isIE < 8){ 63535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var r = de.getBoundingClientRect(); // works well for IE6+ 63545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //console.debug('rect left,top = ' + r.left+','+r.top + ', html client left/top = ' + de.clientLeft+','+de.clientTop + ', rtl = ' + (!d._isBodyLtr()) + ', quirks = ' + d.isQuirks); 63555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var l = r.left, 63565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t = r.top; 63575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isIE < 7){ 63585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) l += de.clientLeft; // scrollbar size in strict/RTL, or, 63595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) t += de.clientTop; // HTML border size in strict 63605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 63615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 63625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) x: l < 0? 0 : l, // FRAME element border size can lead to inaccurate negative values 63635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) y: t < 0? 0 : t 63645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 63655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 63665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 63675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) x: 0, 63685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) y: 0 63695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 63705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 63715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 63735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._fixIeBiDiScrollLeft = function(/*Integer*/ scrollLeft){ 63755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In RTL direction, scrollLeft should be a negative value, but IE 63765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns a positive one. All codes using documentElement.scrollLeft 63775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // must call this function to fix this error, otherwise the position 63785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will offset to right when there is a horizontal scrollbar. 63795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ie = d.isIE; 63815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(ie && !d._isBodyLtr()){ 63825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var qk = d.isQuirks, 63835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) de = qk ? d.doc.body : d.doc.documentElement; 63845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(ie == 6 && !qk && d.global.frameElement && de.scrollHeight > de.clientHeight){ 63855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollLeft += de.clientLeft; // workaround ie6+strict+rtl+iframe+vertical-scrollbar bug where clientWidth is too small by clientLeft pixels 63865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 63875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (ie < 8 || qk) ? (scrollLeft + de.clientWidth - de.scrollWidth) : -scrollLeft; // Integer 63885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 63895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return scrollLeft; // Integer 63905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 63915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: need a setter for coords or a moveTo!! 63935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._abs = dojo.position = function(/*DomNode*/node, /*Boolean?*/includeScroll){ 63945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 63955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Gets the position and size of the passed element relative to 63965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the viewport (if includeScroll==false), or relative to the 63975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // document root (if includeScroll==true). 63985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 63995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 64005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an object of the form: 64015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // { x: 100, y: 300, w: 20, h: 15 } 64025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If includeScroll==true, the x and y values will include any 64035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // document offsets that may affect the position relative to the 64045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // viewport. 64055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Uses the border-box model (inclusive of border and padding but 64065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not margin). Does not act as a setter. 64075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 64085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = byId(node); 64095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var db = d.body(), 64105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dh = db.parentNode, 64115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret = node.getBoundingClientRect(); 64125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret = { x: ret.left, y: ret.top, w: ret.right - ret.left, h: ret.bottom - ret.top }; 64135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isIE){ 64145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // On IE there's a 2px offset that we need to adjust for, see _getIeDocumentElementOffset() 64155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var offset = d._getIeDocumentElementOffset(); 64165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 64175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fixes the position in IE, quirks mode 64185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.x -= offset.x + (d.isQuirks ? db.clientLeft+db.offsetLeft : 0); 64195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.y -= offset.y + (d.isQuirks ? db.clientTop+db.offsetTop : 0); 64205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(d.isFF == 3){ 64215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In FF3 you have to subtract the document element margins. 64225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fixed in FF3.5 though. 64235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cs = gcs(dh); 64245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth); 64255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth); 64265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 64275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // account for document scrolling 64285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(includeScroll){ 64295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scroll = d._docScroll(); 64305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.x += scroll.x; 64315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.y += scroll.y; 64325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 64335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 64345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; // Object 64355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 64365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 64375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){ 64385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 64395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Deprecated: Use position() for border-box x/y/w/h 64405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or marginBox() for margin-box w/h/l/t. 64415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an object representing a node's size and position. 64425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 64435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 64445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an object that measures margin-box (w)idth/(h)eight 64455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and absolute position x/y of the border-box. Also returned 64465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is computed (l)eft and (t)op values in pixels from the 64475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node's offsetParent as returned from marginBox(). 64485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Return value will be in the form: 64495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //| { l: 50, t: 200, w: 300: h: 150, x: 100, y: 300 } 64505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Does not act as a setter. If includeScroll is passed, the x and 64515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // y params are affected as one would expect in dojo.position(). 64525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var n = byId(node), s = gcs(n), mb = d._getMarginBox(n, s); 64535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var abs = d.position(n, includeScroll); 64545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mb.x = abs.x; 64555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mb.y = abs.y; 64565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return mb; 64575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 64585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 64595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ============================= 64605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Element attribute Functions 64615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ============================= 64625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 64635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.attr() should conform to http://www.w3.org/TR/DOM-Level-2-Core/ 64645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 64655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _propNames = { 64665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // properties renamed to avoid clashes with reserved words 64675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "class": "className", 64685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "for": "htmlFor", 64695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // properties written as camelCase 64705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tabindex: "tabIndex", 64715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) readonly: "readOnly", 64725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) colspan: "colSpan", 64735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) frameborder: "frameBorder", 64745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) rowspan: "rowSpan", 64755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) valuetype: "valueType" 64765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 64775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _attrNames = { 64785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // original attribute names 64795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) classname: "class", 64805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) htmlfor: "for", 64815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for IE 64825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tabindex: "tabIndex", 64835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) readonly: "readOnly" 64845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 64855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _forcePropNames = { 64865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) innerHTML: 1, 64875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) className: 1, 64885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) htmlFor: d.isIE, 64895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value: 1 64905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 64915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 64925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _fixAttrName = function(/*String*/ name){ 64935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _attrNames[name.toLowerCase()] || name; 64945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 64955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 64965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _hasAttr = function(node, name){ 64975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var attr = node.getAttributeNode && node.getAttributeNode(name); 64985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return attr && attr.specified; // Boolean 64995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 65005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 65015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // There is a difference in the presence of certain properties and their default values 65025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // between browsers. For example, on IE "disabled" is present on all elements, 65035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // but it is value is "false"; "tabIndex" of <div> returns 0 by default on IE, yet other browsers 65045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can return -1. 65055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 65065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.hasAttr = function(/*DomNode|String*/node, /*String*/name){ 65075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 65085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns true if the requested attribute is specified on the 65095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // given element, and false otherwise. 65105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 65115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id or reference to the element to check 65125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name: 65135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the name of the attribute 65145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 65155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // true if the requested attribute is specified on the 65165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // given element, and false otherwise 65175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var lc = name.toLowerCase(); 65185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _forcePropNames[_propNames[lc] || name] || _hasAttr(byId(node), _attrNames[lc] || name); // Boolean 65195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 65205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 65215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _evtHdlrMap = {}, _ctr = 0, 65225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _attrId = dojo._scopeName + "attrid", 65235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the next dictionary lists elements with read-only innerHTML on IE 65245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _roInnerHtml = {col: 1, colgroup: 1, 65255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // frameset: 1, head: 1, html: 1, style: 1, 65265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) table: 1, tbody: 1, tfoot: 1, thead: 1, tr: 1, title: 1}; 65275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 65285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.attr = function(/*DomNode|String*/node, /*String|Object*/name, /*String?*/value){ 65295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 65305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Gets or sets an attribute on an HTML element. 65315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 65325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Handles normalized getting and setting of attributes on DOM 65335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Nodes. If 2 arguments are passed, and a the second argumnt is a 65345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // string, acts as a getter. 65355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 65365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If a third argument is passed, or if the second argument is a 65375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // map of attributes, acts as a setter. 65385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 65395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When passing functions as values, note that they will not be 65405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // directly assigned to slots on the node, but rather the default 65415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // behavior will be removed and the new behavior will be added 65425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // using `dojo.connect()`, meaning that event handler properties 65435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will be normalized and that some caveats with regards to 65445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // non-standard behaviors for onsubmit apply. Namely that you 65455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // should cancel form submission using `dojo.stopEvent()` on the 65465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // passed event object instead of returning a boolean value from 65475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the handler itself. 65485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 65495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id or reference to the element to get or set the attribute on 65505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name: 65515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the name of the attribute to get or set. 65525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // value: 65535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The value to set for the attribute 65545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 65555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // when used as a getter, the value of the requested attribute 65565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or null if that attribute does not have a specified or 65575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // default value; 65585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 65595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // when used as a setter, the DOM node 65605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 65615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 65625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // get the current value of the "foo" attribute on a node 65635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.attr(dojo.byId("nodeId"), "foo"); 65645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // or we can just pass the id: 65655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.attr("nodeId", "foo"); 65665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 65675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 65685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // use attr() to set the tab index 65695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.attr("nodeId", "tabIndex", 3); 65705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 65715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 65725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 65735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Set multiple values at once, including event handlers: 65745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.attr("formId", { 65755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "foo": "bar", 65765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "tabIndex": -1, 65775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "method": "POST", 65785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "onsubmit": function(e){ 65795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // stop submitting the form. Note that the IE behavior 65805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // of returning true or false will have no effect here 65815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // since our handler is connect()ed to the built-in 65825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // onsubmit behavior and so we need to use 65835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // dojo.stopEvent() to ensure that the submission 65845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // doesn't proceed. 65855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.stopEvent(e); 65865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 65875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // submit the form with Ajax 65885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.xhrPost({ form: "formId" }); 65895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 65905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 65915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 65925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 65935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Style is s special case: Only set with an object hash of styles 65945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.attr("someNode",{ 65955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | id:"bar", 65965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | style:{ 65975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | width:"200px", height:"100px", color:"#000" 65985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 65995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 66005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 66015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 66025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Again, only set style as an object hash of styles: 66035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var obj = { color:"#fff", backgroundColor:"#000" }; 66045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.attr("someNode", "style", obj); 66055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 66065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // though shorter to use `dojo.style()` in this case: 66075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.style("someNode", obj); 66085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 66095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = byId(node); 66105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var args = arguments.length, prop; 66115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(args == 2 && typeof name != "string"){ // inline'd type check 66125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the object form of setter: the 2nd argument is a dictionary 66135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var x in name){ 66145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.attr(node, x, name[x]); 66155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node; // DomNode 66175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var lc = name.toLowerCase(), 66195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) propName = _propNames[lc] || name, 66205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) forceProp = _forcePropNames[propName], 66215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) attrName = _attrNames[lc] || name; 66225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(args == 3){ 66235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // setter 66245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) do{ 66255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(propName == "style" && typeof value != "string"){ // inline'd type check 66265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // special case: setting a style 66275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.style(node, value); 66285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 66295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(propName == "innerHTML"){ 66315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // special case: assigning HTML 66325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isIE && node.tagName.toLowerCase() in _roInnerHtml){ 66335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.empty(node); 66345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.appendChild(d._toDom(value, node.ownerDocument)); 66355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 66365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node[propName] = value; 66375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 66395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isFunction(value)){ 66415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // special case: assigning an event handler 66425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // clobber if we can 66435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var attrId = d.attr(node, _attrId); 66445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!attrId){ 66455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) attrId = _ctr++; 66465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.attr(node, _attrId, attrId); 66475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_evtHdlrMap[attrId]){ 66495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _evtHdlrMap[attrId] = {}; 66505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var h = _evtHdlrMap[attrId][propName]; 66525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(h){ 66535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.disconnect(h); 66545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 66555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 66565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete node[propName]; 66575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){} 66585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ensure that event objects are normalized, etc. 66605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _evtHdlrMap[attrId][propName] = d.connect(node, propName, value); 66615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 66625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(forceProp || typeof value == "boolean"){ 66645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // special case: forcing assignment to the property 66655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // special case: setting boolean to a property instead of attribute 66665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node[propName] = value; 66675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 66685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node's attribute 66705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.setAttribute(attrName, value); 66715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }while(false); 66725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node; // DomNode 66735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // getter 66755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // should we access this attribute via a property or 66765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // via getAttribute()? 66775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value = node[propName]; 66785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(forceProp && typeof value != "undefined"){ 66795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node's property 66805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return value; // Anything 66815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(propName != "href" && (typeof value == "boolean" || d.isFunction(value))){ 66835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node's property 66845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return value; // Anything 66855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 66865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node's attribute 66875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we need _hasAttr() here to guard against IE returning a default value 66885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything 66895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 66905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 66915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.removeAttr = function(/*DomNode|String*/ node, /*String*/ name){ 66925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 66935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Removes an attribute from an HTML element. 66945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 66955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id or reference to the element to remove the attribute from 66965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name: 66975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the name of the attribute to remove 66985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) byId(node).removeAttribute(_fixAttrName(name)); 66995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 67005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 67015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.getNodeProp = function(/*DomNode|String*/ node, /*String*/ name){ 67025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 67035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an effective value of a property or an attribute. 67045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 67055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id or reference to the element to remove the attribute from 67065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name: 67075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the name of the attribute 67085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = byId(node); 67095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var lc = name.toLowerCase(), 67105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) propName = _propNames[lc] || name; 67115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if((propName in node) && propName != "href"){ 67125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node's property 67135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node[propName]; // Anything 67145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 67155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node's attribute 67165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var attrName = _attrNames[lc] || name; 67175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything 67185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 67195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 67205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.create = function(tag, attrs, refNode, pos){ 67215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 67225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create an element, allowing for optional attribute decoration 67235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and placement. 67245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 67255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 67265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A DOM Element creation function. A shorthand method for creating a node or 67275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a fragment, and allowing for a convenient optional attribute setting step, 67285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // as well as an optional DOM placement reference. 67295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //| 67305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Attributes are set by passing the optional object through `dojo.attr`. 67315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See `dojo.attr` for noted caveats and nuances, and API if applicable. 67325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //| 67335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Placement is done via `dojo.place`, assuming the new node to be the action 67345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node, passing along the optional reference node and position. 67355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 67365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // tag: String|DomNode 67375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A string of the element to create (eg: "div", "a", "p", "li", "script", "br"), 67385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or an existing DOM node to process. 67395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 67405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // attrs: Object 67415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An object-hash of attributes to set on the newly created node. 67425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Can be null, if you don't want to set any attributes/styles. 67435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See: `dojo.attr` for a description of available attributes. 67445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 67455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // refNode: String?|DomNode? 67465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Optional reference node. Used by `dojo.place` to place the newly created 67475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node somewhere in the dom relative to refNode. Can be a DomNode reference 67485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or String ID of a node. 67495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 67505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // pos: String? 67515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Optional positional reference. Defaults to "last" by way of `dojo.place`, 67525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // though can be set to "first","after","before","last", "replace" or "only" 67535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to further control the placement of the new node relative to the refNode. 67545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 'refNode' is required if a 'pos' is specified. 67555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 67565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: DomNode 67575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 67585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 67595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create a DIV: 67605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var n = dojo.create("div"); 67615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 67625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 67635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create a DIV with content: 67645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var n = dojo.create("div", { innerHTML:"<p>hi</p>" }); 67655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 67665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 67675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Place a new DIV in the BODY, with no attributes set 67685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var n = dojo.create("div", null, dojo.body()); 67695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 67705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 67715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create an UL, and populate it with LI's. Place the list as the first-child of a 67725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node with id="someId": 67735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var ul = dojo.create("ul", null, "someId", "first"); 67745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var items = ["one", "two", "three", "four"]; 67755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.forEach(items, function(data){ 67765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.create("li", { innerHTML: data }, ul); 67775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 67785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 67795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 67805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create an anchor, with an href. Place in BODY: 67815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.create("a", { href:"foo.html", title:"Goto FOO!" }, dojo.body()); 67825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 67835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 67845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create a `dojo.NodeList()` from a new element (for syntatic sugar): 67855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(dojo.create('div')) 67865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .addClass("newDiv") 67875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .onclick(function(e){ console.log('clicked', e.target) }) 67885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .place("#someNode"); // redundant, but cleaner. 67895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 67905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var doc = d.doc; 67915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(refNode){ 67925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) refNode = byId(refNode); 67935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) doc = refNode.ownerDocument; 67945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 67955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof tag == "string"){ // inline'd type check 67965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tag = doc.createElement(tag); 67975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 67985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(attrs){ d.attr(tag, attrs); } 67995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(refNode){ d.place(tag, refNode, pos); } 68005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return tag; // DomNode 68015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 68025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 68045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.empty = function(node){ 68055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 68065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // safely removes all children of the node. 68075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: DOMNode|String 68085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a reference to a DOM node or an id. 68095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 68105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Destroy node's children byId: 68115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.empty("someId"); 68125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 68135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 68145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Destroy all nodes' children in a list by reference: 68155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".someNode").forEach(dojo.empty); 68165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 68175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 68185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.empty = 68205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isIE ? function(node){ 68215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = byId(node); 68225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var c; c = node.lastChild;){ // intentional assignment 68235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.destroy(c); 68245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 68255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } : 68265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function(node){ 68275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) byId(node).innerHTML = ""; 68285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 68295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 68315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._toDom = function(frag, doc){ 68325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 68335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // instantiates an HTML fragment returning the corresponding DOM. 68345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // frag: String 68355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the HTML fragment 68365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // doc: DocumentNode? 68375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // optional document to use when creating DOM nodes, defaults to 68385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.doc if not specified. 68395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: DocumentFragment 68405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 68415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 68425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create a table row: 68435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var tr = dojo._toDom("<tr><td>First!</td></tr>"); 68445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 68455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 68465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // support stuff for dojo._toDom 68485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tagWrap = { 68495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) option: ["select"], 68505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tbody: ["table"], 68515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) thead: ["table"], 68525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tfoot: ["table"], 68535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tr: ["table", "tbody"], 68545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) td: ["table", "tbody", "tr"], 68555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) th: ["table", "thead", "tr"], 68565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) legend: ["fieldset"], 68575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) caption: ["table"], 68585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) colgroup: ["table"], 68595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) col: ["table", "colgroup"], 68605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) li: ["ul"] 68615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 68625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reTag = /<\s*([\w\:]+)/, 68635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) masterNode = {}, masterNum = 0, 68645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) masterName = "__" + d._scopeName + "ToDomId"; 68655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // generate start/end tag strings to use 68675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for the injection for each special tag wrap case. 68685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var param in tagWrap){ 68695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(tagWrap.hasOwnProperty(param)){ 68705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tw = tagWrap[param]; 68715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tw.pre = param == "option" ? '<select multiple="multiple">' : "<" + tw.join("><") + ">"; 68725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tw.post = "</" + tw.reverse().join("></") + ">"; 68735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the last line is destructive: it reverses the array, 68745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // but we don't care at this point 68755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 68765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 68775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._toDom = function(frag, doc){ 68795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 68805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // converts HTML string into DOM nodes. 68815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) doc = doc || d.doc; 68835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var masterId = doc[masterName]; 68845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!masterId){ 68855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) doc[masterName] = masterId = ++masterNum + ""; 68865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) masterNode[masterId] = doc.createElement("div"); 68875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 68885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // make sure the frag is a string. 68905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) frag += ""; 68915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // find the starting tag, and get node wrapper 68935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var match = frag.match(reTag), 68945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tag = match ? match[1].toLowerCase() : "", 68955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) master = masterNode[masterId], 68965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) wrap, i, fc, df; 68975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(match && tagWrap[tag]){ 68985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) wrap = tagWrap[tag]; 68995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) master.innerHTML = wrap.pre + frag + wrap.post; 69005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(i = wrap.length; i; --i){ 69015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) master = master.firstChild; 69025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 69035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 69045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) master.innerHTML = frag; 69055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 69065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 69075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // one node shortcut => return the node itself 69085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(master.childNodes.length == 1){ 69095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return master.removeChild(master.firstChild); // DOMNode 69105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 69115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 69125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return multiple nodes as a document fragment 69135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) df = doc.createDocumentFragment(); 69145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(fc = master.firstChild){ // intentional assignment 69155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) df.appendChild(fc); 69165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 69175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return df; // DOMNode 69185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 69195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 69205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ============================= 69215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (CSS) Class Functions 69225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ============================= 69235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _className = "className"; 69245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 69255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.hasClass = function(/*DomNode|String*/node, /*String*/classStr){ 69265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 69275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns whether or not the specified classes are a portion of the 69285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // class list currently applied to the node. 69295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 69305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 69315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // String ID or DomNode reference to check the class for. 69325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 69335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // classStr: 69345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A string class name to look for. 69355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 69365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 69375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Do something if a node with id="someNode" has class="aSillyClassName" present 69385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | if(dojo.hasClass("someNode","aSillyClassName")){ ... } 69395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 69405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ((" "+ byId(node)[_className] +" ").indexOf(" " + classStr + " ") >= 0); // Boolean 69415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 69425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 69435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var spaces = /\s+/, a1 = [""], 69445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fakeNode = {}, 69455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) str2array = function(s){ 69465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof s == "string" || s instanceof String){ 69475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(s.indexOf(" ") < 0){ 69485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a1[0] = s; 69495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a1; 69505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 69515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return s.split(spaces); 69525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 69535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 69545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // assumed to be an array 69555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return s || ""; 69565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 69575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 69585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.addClass = function(/*DomNode|String*/node, /*String|Array*/classStr){ 69595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 69605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Adds the specified classes to the end of the class list on the 69615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // passed node. Will not re-apply duplicate classes. 69625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 69635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 69645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // String ID or DomNode reference to add a class string too 69655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 69665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // classStr: 69675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A String class name to add, or several space-separated class names, 69685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or an array of class names. 69695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 69705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 69715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Add a class to some node: 69725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addClass("someNode", "anewClass"); 69735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 69745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 69755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Add two classes at once: 69765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addClass("someNode", "firstClass secondClass"); 69775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 69785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 69795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Add two classes at once (using array): 69805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.addClass("someNode", ["firstClass", "secondClass"]); 69815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 69825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 69835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Available in `dojo.NodeList` for multiple additions 69845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("ul > li").addClass("firstLevel"); 69855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 69865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = byId(node); 69875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) classStr = str2array(classStr); 69885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cls = node[_className], oldLen; 69895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cls = cls ? " " + cls + " " : " "; 69905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) oldLen = cls.length; 69915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = 0, len = classStr.length, c; i < len; ++i){ 69925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c = classStr[i]; 69935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(c && cls.indexOf(" " + c + " ") < 0){ 69945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cls += c + " "; 69955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 69965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 69975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(oldLen < cls.length){ 69985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node[_className] = cls.substr(1, cls.length - 2); 69995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 70005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 70015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 70025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.removeClass = function(/*DomNode|String*/node, /*String|Array?*/classStr){ 70035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 70045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Removes the specified classes from node. No `dojo.hasClass` 70055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // check is required. 70065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 70085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // String ID or DomNode reference to remove the class from. 70095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // classStr: 70115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An optional String class name to remove, or several space-separated 70125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // class names, or an array of class names. If omitted, all class names 70135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will be deleted. 70145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 70165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Remove a class from some node: 70175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.removeClass("someNode", "firstClass"); 70185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 70205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Remove two classes from some node: 70215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.removeClass("someNode", "firstClass secondClass"); 70225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 70245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Remove two classes from some node (using array): 70255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.removeClass("someNode", ["firstClass", "secondClass"]); 70265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 70285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Remove all classes from some node: 70295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.removeClass("someNode"); 70305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 70325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Available in `dojo.NodeList()` for multiple removal 70335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".foo").removeClass("foo"); 70345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 70355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = byId(node); 70365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cls; 70375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(classStr !== undefined){ 70385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) classStr = str2array(classStr); 70395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cls = " " + node[_className] + " "; 70405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = 0, len = classStr.length; i < len; ++i){ 70415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cls = cls.replace(" " + classStr[i] + " ", " "); 70425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 70435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cls = d.trim(cls); 70445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 70455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cls = ""; 70465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 70475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(node[_className] != cls){ node[_className] = cls; } 70485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 70495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 70505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.replaceClass = function(/*DomNode|String*/node, /*String|Array*/addClassStr, /*String|Array?*/removeClassStr){ 70515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 70525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Replaces one or more classes on a node if not present. 70535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Operates more quickly than calling dojo.removeClass and dojo.addClass 70545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 70555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // String ID or DomNode reference to remove the class from. 70565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // addClassStr: 70575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A String class name to add, or several space-separated class names, 70585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or an array of class names. 70595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // removeClassStr: 70605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A String class name to remove, or several space-separated class names, 70615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or an array of class names. 70625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 70645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.replaceClass("someNode", "add1 add2", "remove1 remove2"); 70655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 70675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Replace all classes with addMe 70685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.replaceClass("someNode", "addMe"); 70695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 70715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Available in `dojo.NodeList()` for multiple toggles 70725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".findMe").replaceClass("addMe", "removeMe"); 70735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 70745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = byId(node); 70755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fakeNode.className = node.className; 70765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.removeClass(fakeNode, removeClassStr); 70775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.addClass(fakeNode, addClassStr); 70785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(node.className !== fakeNode.className){ 70795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.className = fakeNode.className; 70805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 70815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 70825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 70835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.toggleClass = function(/*DomNode|String*/node, /*String|Array*/classStr, /*Boolean?*/condition){ 70845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 70855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Adds a class to node if not present, or removes if present. 70865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Pass a boolean condition if you want to explicitly add or remove. 70875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // condition: 70885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If passed, true means to add the class, false means to remove. 70895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 70915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.toggleClass("someNode", "hovered"); 70925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 70945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Forcefully add a class 70955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.toggleClass("someNode", "hovered", true); 70965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 70975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 70985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Available in `dojo.NodeList()` for multiple toggles 70995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".toggleMe").toggleClass("toggleMe"); 71005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(condition === undefined){ 71025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) condition = !d.hasClass(node, classStr); 71035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 71045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d[condition ? "addClass" : "removeClass"](node, classStr); 71055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 71065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 71085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 71105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.NodeList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 71125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.NodeList"] = true; 71135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.NodeList"); 71145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 71215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var d = dojo; 71235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ap = Array.prototype, aps = ap.slice, apc = ap.concat; 71255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tnl = function(/*Array*/ a, /*dojo.NodeList?*/ parent, /*Function?*/ NodeListCtor){ 71275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 71285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // decorate an array to make it look like a `dojo.NodeList`. 71295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a: 71305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Array of nodes to decorate. 71315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // parent: 71325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An optional parent NodeList that generated the current 71335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // list of nodes. Used to call _stash() so the parent NodeList 71345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can be accessed via end() later. 71355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NodeListCtor: 71365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An optional constructor function to use for any 71375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // new NodeList calls. This allows a certain chain of 71385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NodeList calls to use a different object than dojo.NodeList. 71395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!a.sort){ 71405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // make sure it's a real array before we pass it on to be wrapped 71415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a = aps.call(a, 0); 71425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 71435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ctor = NodeListCtor || this._NodeListCtor || d._NodeListCtor; 71445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a.constructor = ctor; 71455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._mixin(a, ctor.prototype); 71465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a._NodeListCtor = ctor; 71475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return parent ? a._stash(parent) : a; 71485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 71495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var loopBody = function(f, a, o){ 71515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a = [0].concat(aps.call(a, 0)); 71525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) o = o || d.global; 71535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(node){ 71545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a[0] = node; 71555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return f.apply(o, a); 71565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 71575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 71585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // adapters 71605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var adaptAsForEach = function(f, o){ 71625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 71635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // adapts a single node function to be used in the forEach-type 71645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // actions. The initial object is returned from the specialized 71655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // function. 71665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // f: Function 71675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a function to adapt 71685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // o: Object? 71695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an optional context for f 71705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(){ 71715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.forEach(loopBody(f, arguments, o)); 71725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; // Object 71735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 71745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 71755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var adaptAsMap = function(f, o){ 71775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 71785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // adapts a single node function to be used in the map-type 71795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // actions. The return is a new array of values, as via `dojo.map` 71805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // f: Function 71815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a function to adapt 71825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // o: Object? 71835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an optional context for f 71845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(){ 71855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.map(loopBody(f, arguments, o)); 71865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 71875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 71885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var adaptAsFilter = function(f, o){ 71905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 71915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // adapts a single node function to be used in the filter-type actions 71925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // f: Function 71935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a function to adapt 71945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // o: Object? 71955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an optional context for f 71965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(){ 71975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.filter(loopBody(f, arguments, o)); 71985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 71995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 72005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 72015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var adaptWithCondition = function(f, g, o){ 72025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 72035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // adapts a single node function to be used in the map-type 72045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // actions, behaves like forEach() or map() depending on arguments 72055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // f: Function 72065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a function to adapt 72075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // g: Function 72085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a condition function, if true runs as map(), otherwise runs as forEach() 72095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // o: Object? 72105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an optional context for f and g 72115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(){ 72125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var a = arguments, body = loopBody(f, a, o); 72135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(g.call(o || d.global, a)){ 72145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.map(body); // self 72155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 72165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.forEach(body); 72175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; // self 72185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 72195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 72205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 72215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var magicGuard = function(a){ 72225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 72235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the guard function for dojo.attr() and dojo.style() 72245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a.length == 1 && (typeof a[0] == "string"); // inline'd type check 72255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 72265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 72275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var orphan = function(node){ 72285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 72295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // function to orphan nodes 72305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var p = node.parentNode; 72315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(p){ 72325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) p.removeChild(node); 72335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 72345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 72355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: should we move orphan() to dojo.html? 72365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 72375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.NodeList = function(){ 72385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 72395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.NodeList is an of Array subclass which adds syntactic 72405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sugar for chaining, common iteration operations, animation, and 72415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node manipulation. NodeLists are most often returned as the 72425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // result of dojo.query() calls. 72435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 72445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.NodeList instances provide many utilities that reflect 72455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // core Dojo APIs for Array iteration and manipulation, DOM 72465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // manipulation, and event handling. Instead of needing to dig up 72475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // functions in the dojo.* namespace, NodeLists generally make the 72485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // full power of Dojo available for DOM manipulation tasks in a 72495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // simple, chainable way. 72505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 72515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // create a node list from a node 72525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | new dojo.NodeList(dojo.byId("foo")); 72535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 72545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // get a NodeList from a CSS query and iterate on it 72555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var l = dojo.query(".thinger"); 72565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | l.forEach(function(node, index, nodeList){ 72575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(index, node.innerHTML); 72585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 72595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 72605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // use native and Dojo-provided array methods to manipulate a 72615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NodeList without needing to use dojo.* functions explicitly: 72625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var l = dojo.query(".thinger"); 72635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // since NodeLists are real arrays, they have a length 72645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // property that is both readable and writable and 72655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // push/pop/shift/unshift methods 72665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(l.length); 72675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | l.push(dojo.create("span")); 72685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 72695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // dojo's normalized array methods work too: 72705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log( l.indexOf(dojo.byId("foo")) ); 72715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ...including the special "function as string" shorthand 72725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log( l.every("item.nodeType == 1") ); 72735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 72745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // NodeLists can be [..] indexed, or you can use the at() 72755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // function to get specific items wrapped in a new NodeList: 72765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var node = l[3]; // the 4th element 72775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var newList = l.at(1, 3); // the 2nd and 4th elements 72785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 72795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the style functions you expect are all there too: 72805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // style() as a getter... 72815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var borders = dojo.query(".thinger").style("border"); 72825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // ...and as a setter: 72835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".thinger").style("border", "1px solid black"); 72845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // class manipulation 72855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("li:nth-child(even)").addClass("even"); 72865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // even getting the coordinates of all the items 72875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var coords = dojo.query(".thinger").coords(); 72885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 72895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM manipulation functions from the dojo.* namespace area also 72905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // available: 72915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // remove all of the elements in the list from their 72925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // parents (akin to "deleting" them from the document) 72935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".thinger").orphan(); 72945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // place all elements in the list at the front of #foo 72955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".thinger").place("foo", "first"); 72965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 72975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Event handling couldn't be easier. `dojo.connect` is mapped in, 72985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and shortcut handlers are provided for most DOM events: 72995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // like dojo.connect(), but with implicit scope 73005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("li").connect("onclick", console, "log"); 73015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 73025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // many common event handlers are already available directly: 73035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("li").onclick(console, "log"); 73045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var toggleHovered = dojo.hitch(dojo, "toggleClass", "hovered"); 73055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("p") 73065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .onmouseenter(toggleHovered) 73075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .onmouseleave(toggleHovered); 73085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 73095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // chainability is a key advantage of NodeLists: 73105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".thinger") 73115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .onclick(function(e){ /* ... */ }) 73125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .at(1, 3, 8) // get a subset 73135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .style("padding", "5px") 73145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .forEach(console.log); 73155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return tnl(Array.apply(null, arguments)); 73175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 73185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Allow things that new up a NodeList to use a delegated or alternate NodeList implementation. 73205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._NodeListCtor = d.NodeList; 73215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var nl = d.NodeList, nlp = nl.prototype; 73235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // expose adapters and the wrapper as private functions 73255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nl._wrap = nlp._wrap = tnl; 73275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nl._adaptAsMap = adaptAsMap; 73285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nl._adaptAsForEach = adaptAsForEach; 73295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nl._adaptAsFilter = adaptAsFilter; 73305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nl._adaptWithCondition = adaptWithCondition; 73315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // mass assignment 73335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add array redirectors 73355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.forEach(["slice", "splice"], function(name){ 73365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var f = ap[name]; 73375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Use a copy of the this array via this.slice() to allow .end() to work right in the splice case. 73385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // CANNOT apply ._stash()/end() to splice since it currently modifies 73395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the existing this array -- it would break backward compatibility if we copy the array before 73405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the splice so that we can use .end(). So only doing the stash option to this._wrap for slice. 73415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nlp[name] = function(){ return this._wrap(f.apply(this, arguments), name == "slice" ? this : null); }; 73425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 73435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // concat should be here but some browsers with native NodeList have problems with it 73445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add array.js redirectors 73465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.forEach(["indexOf", "lastIndexOf", "every", "some"], function(name){ 73475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var f = d[name]; 73485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nlp[name] = function(){ return f.apply(d, [this].concat(aps.call(arguments, 0))); }; 73495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 73505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add conditional methods 73525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.forEach(["attr", "style"], function(name){ 73535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nlp[name] = adaptWithCondition(d[name], magicGuard); 73545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 73555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add forEach actions 73575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.forEach(["connect", "addClass", "removeClass", "replaceClass", "toggleClass", "empty", "removeAttr"], function(name){ 73585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nlp[name] = adaptAsForEach(d[name]); 73595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 73605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.extend(dojo.NodeList, { 73625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _normalize: function(/*String||Element||Object||NodeList*/content, /*DOMNode?*/refNode){ 73635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 73645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // normalizes data to an array of items to insert. 73655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 73665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If content is an object, it can have special properties "template" and 73675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "parse". If "template" is defined, then the template value is run through 73685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.string.substitute (if dojo.string.substitute has been dojo.required elsewhere), 73695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or if templateFunc is a function on the content, that function will be used to 73705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // transform the template into a final string to be used for for passing to dojo._toDom. 73715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If content.parse is true, then it is remembered for later, for when the content 73725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // nodes are inserted into the DOM. At that point, the nodes will be parsed for widgets 73735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (if dojo.parser has been dojo.required elsewhere). 73745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Wanted to just use a DocumentFragment, but for the array/NodeList 73765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //case that meant using cloneNode, but we may not want that. 73775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Cloning should only happen if the node operations span 73785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //multiple refNodes. Also, need a real array, not a NodeList from the 73795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //DOM since the node movements could change those NodeLists. 73805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var parse = content.parse === true ? true : false; 73825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Do we have an object that needs to be run through a template? 73845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof content.template == "string"){ 73855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var templateFunc = content.templateFunc || (dojo.string && dojo.string.substitute); 73865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) content = templateFunc ? templateFunc(content.template, content) : content; 73875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 73885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var type = (typeof content); 73905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(type == "string" || type == "number"){ 73915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) content = dojo._toDom(content, (refNode && refNode.ownerDocument)); 73925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(content.nodeType == 11){ 73935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //DocumentFragment. It cannot handle cloneNode calls, so pull out the children. 73945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) content = dojo._toArray(content.childNodes); 73955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 73965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) content = [content]; 73975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 73985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(!dojo.isArrayLike(content)){ 73995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) content = [content]; 74005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(!dojo.isArray(content)){ 74015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //To get to this point, content is array-like, but 74025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //not an array, which likely means a DOM NodeList. Convert it now. 74035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) content = dojo._toArray(content); 74045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 74055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 74065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Pass around the parse info 74075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(parse){ 74085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) content._runParse = true; 74095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 74105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return content; //Array 74115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 74125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 74135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _cloneNode: function(/*DOMNode*/ node){ 74145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 74155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // private utility to clone a node. Not very interesting in the vanilla 74165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.NodeList case, but delegates could do interesting things like 74175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // clone event handlers if that is derivable from the node. 74185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node.cloneNode(true); 74195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 74205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 74215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _place: function(/*Array*/ary, /*DOMNode*/refNode, /*String*/position, /*Boolean*/useClone){ 74225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 74235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // private utility to handle placing an array of nodes relative to another node. 74245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 74255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Allows for cloning the nodes in the array, and for 74265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // optionally parsing widgets, if ary._runParse is true. 74275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 74285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Avoid a disallowed operation if trying to do an innerHTML on a non-element node. 74295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(refNode.nodeType != 1 && position == "only"){ 74305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 74315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 74325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var rNode = refNode, tempNode; 74335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 74345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Always cycle backwards in case the array is really a 74355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //DOM NodeList and the DOM operations take it out of the live collection. 74365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var length = ary.length; 74375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = length - 1; i >= 0; i--){ 74385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var node = (useClone ? this._cloneNode(ary[i]) : ary[i]); 74395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 74405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //If need widget parsing, use a temp node, instead of waiting after inserting into 74415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //real DOM because we need to start widget parsing at one node up from current node, 74425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //which could cause some already parsed widgets to be parsed again. 74435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(ary._runParse && dojo.parser && dojo.parser.parse){ 74445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!tempNode){ 74455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tempNode = rNode.ownerDocument.createElement("div"); 74465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 74475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tempNode.appendChild(node); 74485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.parser.parse(tempNode); 74495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = tempNode.firstChild; 74505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(tempNode.firstChild){ 74515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tempNode.removeChild(tempNode.firstChild); 74525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 74535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 74545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 74555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(i == length - 1){ 74565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.place(node, rNode, position); 74575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 74585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) rNode.parentNode.insertBefore(node, rNode); 74595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 74605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) rNode = node; 74615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 74625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 74635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 74645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _stash: function(parent){ 74655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 74665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // private function to hold to a parent NodeList. end() to return the parent NodeList. 74675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 74685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 74695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // How to make a `dojo.NodeList` method that only returns the third node in 74705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the dojo.NodeList but allows access to the original NodeList by using this._stash: 74715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.extend(dojo.NodeList, { 74725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | third: function(){ 74735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var newNodeList = dojo.NodeList(this[2]); 74745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return newNodeList._stash(this); 74755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 74765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 74775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // then see how _stash applies a sub-list, to be .end()'ed out of 74785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".foo") 74795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .third() 74805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .addClass("thirdFoo") 74815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .end() 74825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // access to the orig .foo list 74835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .removeClass("foo") 74845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | 74855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 74865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._parent = parent; 74875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; //dojo.NodeList 74885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 74895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 74905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) end: function(){ 74915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 74925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ends use of the current `dojo.NodeList` by returning the previous dojo.NodeList 74935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that generated the current dojo.NodeList. 74945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 74955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the `dojo.NodeList` that generated the current `dojo.NodeList`. If there 74965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is no parent dojo.NodeList, an empty dojo.NodeList is returned. 74975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 74985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("a") 74995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .filter(".disabled") 75005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // operate on the anchors that only have a disabled class 75015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .style("color", "grey") 75025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .end() 75035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // jump back to the list of anchors 75045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | .style(...) 75055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 75065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(this._parent){ 75075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._parent; 75085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 75095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Just return empty list. 75105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return new this._NodeListCtor(); 75115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 75125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 75135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods 75155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: handle return values for #3244 75175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://trac.dojotoolkit.org/ticket/3244 75185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: 75205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // need to wrap or implement: 75215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // join (perhaps w/ innerHTML/outerHTML overload for toString() of items?) 75225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // reduce 75235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // reduceRight 75245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 75265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) slice: function(begin, end){ 75275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 75285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a new NodeList, maintaining this one in place 75295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 75305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This method behaves exactly like the Array.slice method 75315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // with the caveat that it returns a dojo.NodeList and not a 75325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // raw Array. For more details, see Mozilla's (slice 75335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:slice] 75345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // begin: Integer 75355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Can be a positive or negative integer, with positive 75365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // integers noting the offset to begin at, and negative 75375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // integers denoting an offset from the end (i.e., to the left 75385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of the end) 75395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // end: Integer? 75405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Optional parameter to describe what position relative to 75415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the NodeList's zero index to end the slice at. Like begin, 75425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can be positive or negative. 75435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._wrap(a.slice.apply(this, arguments)); 75445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 75455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) splice: function(index, howmany, item){ 75475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 75485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a new NodeList, manipulating this NodeList based on 75495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the arguments passed, potentially splicing in new elements 75505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // at an offset, optionally deleting elements 75515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 75525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This method behaves exactly like the Array.splice method 75535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // with the caveat that it returns a dojo.NodeList and not a 75545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // raw Array. For more details, see Mozilla's (splice 75555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:splice] 75565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For backwards compatibility, calling .end() on the spliced NodeList 75575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // does not return the original NodeList -- splice alters the NodeList in place. 75585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // index: Integer 75595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // begin can be a positive or negative integer, with positive 75605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // integers noting the offset to begin at, and negative 75615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // integers denoting an offset from the end (i.e., to the left 75625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of the end) 75635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // howmany: Integer? 75645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Optional parameter to describe what position relative to 75655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the NodeList's zero index to end the slice at. Like begin, 75665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can be positive or negative. 75675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // item: Object...? 75685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Any number of optional parameters may be passed in to be 75695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // spliced into the NodeList 75705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 75715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.NodeList 75725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._wrap(a.splice.apply(this, arguments)); 75735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 75745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) indexOf: function(value, fromIndex){ 75765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 75775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // see dojo.indexOf(). The primary difference is that the acted-on 75785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // array is implicitly this NodeList 75795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // value: Object: 75805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The value to search for. 75815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fromIndex: Integer?: 75825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The location to start searching from. Optional. Defaults to 0. 75835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 75845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For more details on the behavior of indexOf, see Mozilla's 75855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (indexOf 75865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf] 75875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 75885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Positive Integer or 0 for a match, -1 of not found. 75895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.indexOf(this, value, fromIndex); // Integer 75905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 75915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lastIndexOf: function(value, fromIndex){ 75935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 75945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // see dojo.lastIndexOf(). The primary difference is that the 75955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // acted-on array is implicitly this NodeList 75965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 75975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For more details on the behavior of lastIndexOf, see 75985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Mozilla's (lastIndexOf 75995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:lastIndexOf] 76005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // value: Object 76015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The value to search for. 76025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fromIndex: Integer? 76035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The location to start searching from. Optional. Defaults to 0. 76045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 76055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Positive Integer or 0 for a match, -1 of not found. 76065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.lastIndexOf(this, value, fromIndex); // Integer 76075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 76085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) every: function(callback, thisObject){ 76105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 76115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // see `dojo.every()` and the (Array.every 76125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every]. 76135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Takes the same structure of arguments and returns as 76145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.every() with the caveat that the passed array is 76155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // implicitly this NodeList 76165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // callback: Function: the callback 76175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // thisObject: Object?: the context 76185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.every(this, callback, thisObject); // Boolean 76195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 76205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) some: function(callback, thisObject){ 76225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 76235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Takes the same structure of arguments and returns as 76245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.some()` with the caveat that the passed array is 76255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // implicitly this NodeList. See `dojo.some()` and Mozilla's 76265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (Array.some 76275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some]. 76285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // callback: Function: the callback 76295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // thisObject: Object?: the context 76305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.some(this, callback, thisObject); // Boolean 76315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 76325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 76335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) concat: function(item){ 76355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 76365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a new NodeList comprised of items in this NodeList 76375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // as well as items passed in as parameters 76385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 76395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This method behaves exactly like the Array.concat method 76405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // with the caveat that it returns a `dojo.NodeList` and not a 76415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // raw Array. For more details, see the (Array.concat 76425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:concat] 76435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // item: Object? 76445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Any number of optional parameters may be passed in to be 76455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // spliced into the NodeList 76465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 76475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.NodeList 76485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //return this._wrap(apc.apply(this, arguments)); 76505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the line above won't work for the native NodeList :-( 76515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // implementation notes: 76535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1) Native NodeList is not an array, and cannot be used directly 76545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in concat() --- the latter doesn't recognize it as an array, and 76555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // does not inline it, but append as a single entity. 76565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 2) On some browsers (e.g., Safari) the "constructor" property is 76575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // read-only and cannot be changed. So we have to test for both 76585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // native NodeList and dojo.NodeList in this property to recognize 76595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the node list. 76605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var t = d.isArray(this) ? this : aps.call(this, 0), 76625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m = d.map(arguments, function(a){ 76635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a && !d.isArray(a) && 76645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (typeof NodeList != "undefined" && a.constructor === NodeList || a.constructor === this._NodeListCtor) ? 76655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) aps.call(a, 0) : a; 76665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 76675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._wrap(apc.apply(t, m), this); // dojo.NodeList 76685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 76695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) map: function(/*Function*/ func, /*Function?*/ obj){ 76715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 76725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // see dojo.map(). The primary difference is that the acted-on 76735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // array is implicitly this NodeList and the return is a 76745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.NodeList (a subclass of Array) 76755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ///return d.map(this, func, obj, d.NodeList); // dojo.NodeList 76765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._wrap(d.map(this, func, obj), this); // dojo.NodeList 76775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 76785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) forEach: function(callback, thisObj){ 76805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 76815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // see `dojo.forEach()`. The primary difference is that the acted-on 76825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // array is implicitly this NodeList. If you want the option to break out 76835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of the forEach loop, use every() or some() instead. 76845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.forEach(this, callback, thisObj); 76855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // non-standard return to allow easier chaining 76865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; // dojo.NodeList 76875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 76885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 76905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) coords: function(){ 76915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 76925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the box objects of all elements in a node list as 76935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an Array (*not* a NodeList). Acts like `dojo.coords`, though assumes 76945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the node passed is each node in this list. 76955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.map(this, d.coords); // Array 76975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 76985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) position: function(){ 77005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 77015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns border-box objects (x/y/w/h) of all elements in a node list 77025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // as an Array (*not* a NodeList). Acts like `dojo.position`, though 77035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // assumes the node passed is each node in this list. 77045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 77055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.map(this, d.position); // Array 77065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 77075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 77085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) attr: function(property, value){ 77095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 77105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // gets or sets the DOM attribute for every element in the 77115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NodeList. See also `dojo.attr` 77125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // property: String 77135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the attribute to get/set 77145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // value: String? 77155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // optional. The value to set the property to 77165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 77175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if no value is passed, the result is an array of attribute values 77185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If a value is passed, the return is this NodeList 77195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 77205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make all nodes with a particular class focusable: 77215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".focusable").attr("tabIndex", -1); 77225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 77235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Disable a group of buttons: 77245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("button.group").attr("disabled", true); 77255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 77265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // innerHTML can be assigned or retrieved as well: 77275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // get the innerHTML (as an array) for each list item 77285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var ih = dojo.query("li.replaceable").attr("innerHTML"); 77295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // dojo.NodeList 77305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // Array 77315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 77325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 77335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) style: function(property, value){ 77345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 77355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // gets or sets the CSS property for every element in the NodeList 77365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // property: String 77375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the CSS property to get/set, in JavaScript notation 77385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ("lineHieght" instead of "line-height") 77395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // value: String? 77405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // optional. The value to set the property to 77415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 77425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if no value is passed, the result is an array of strings. 77435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If a value is passed, the return is this NodeList 77445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // dojo.NodeList 77455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // Array 77465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 77475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 77485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) addClass: function(className){ 77495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 77505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // adds the specified class to every node in the list 77515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // className: String|Array 77525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A String class name to add, or several space-separated class names, 77535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or an array of class names. 77545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // dojo.NodeList 77555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 77565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 77575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) removeClass: function(className){ 77585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 77595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // removes the specified class from every node in the list 77605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // className: String|Array? 77615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An optional String class name to remove, or several space-separated 77625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // class names, or an array of class names. If omitted, all class names 77635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will be deleted. 77645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 77655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.NodeList, this list 77665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // dojo.NodeList 77675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 77685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 77695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toggleClass: function(className, condition){ 77705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 77715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Adds a class to node if not present, or removes if present. 77725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Pass a boolean condition if you want to explicitly add or remove. 77735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // condition: Boolean? 77745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If passed, true means to add the class, false means to remove. 77755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // className: String 77765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the CSS class to add 77775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // dojo.NodeList 77785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 77795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 77805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) connect: function(methodName, objOrFunc, funcName){ 77815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 77825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // attach event handlers to every item of the NodeList. Uses dojo.connect() 77835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // so event properties are normalized 77845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // methodName: String 77855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the name of the method to attach to. For DOM events, this should be 77865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the lower-case name of the event 77875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // objOrFunc: Object|Function|String 77885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if 2 arguments are passed (methodName, objOrFunc), objOrFunc should 77895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // reference a function or be the name of the function in the global 77905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // namespace to attach. If 3 arguments are provided 77915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (methodName, objOrFunc, funcName), objOrFunc must be the scope to 77925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // locate the bound function in 77935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // funcName: String? 77945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // optional. A string naming the function in objOrFunc to bind to the 77955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // event. May also be a function reference. 77965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 77975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add an onclick handler to every button on the page 77985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("div:nth-child(odd)").connect("onclick", function(e){ 77995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("clicked!"); 78005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 78015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 78025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // attach foo.bar() to every odd div's onmouseover 78035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("div:nth-child(odd)").connect("onmouseover", foo, "bar"); 78045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 78055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 78065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) empty: function(){ 78075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 78085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // clears all content from each node in the list. Effectively 78095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // equivalent to removing all child nodes from every item in 78105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the list. 78115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.forEach("item.innerHTML='';"); // dojo.NodeList 78125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: should we be checking for and/or disposing of widgets below these nodes? 78135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 78145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 78155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 78165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // useful html methods 78175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) coords: adaptAsMap(d.coords), 78185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) position: adaptAsMap(d.position), 78195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 78205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: connectPublisher()? connectRunOnce()? 78215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 78225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /* 78235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) destroy: function(){ 78245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 78255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // destroys every item in the list. 78265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.forEach(d.destroy); 78275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: should we be checking for and/or disposing of widgets below these nodes? 78285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 78295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 78305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 78315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) place: function(/*String||Node*/ queryOrNode, /*String*/ position){ 78325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 78335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // places elements of this node list relative to the first element matched 78345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // by queryOrNode. Returns the original NodeList. See: `dojo.place` 78355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // queryOrNode: 78365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // may be a string representing any valid CSS3 selector or a DOM node. 78375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In the selector case, only the first matching element will be used 78385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for relative positioning. 78395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // position: 78405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can be one of: 78415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "last" (default) 78425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "first" 78435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "before" 78445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "after" 78455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "only" 78465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "replace" 78475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or an offset in the childNodes property 78485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var item = d.query(queryOrNode)[0]; 78495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.forEach(function(node){ d.place(node, item, position); }); // dojo.NodeList 78505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 78515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 78525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) orphan: function(/*String?*/ filter){ 78535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 78545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // removes elements in this list that match the filter 78555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // from their parents and returns them as a new NodeList. 78565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // filter: 78575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // CSS selector like ".foo" or "div > span" 78585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 78595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.NodeList` containing the orphaned elements 78605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (filter ? d._filterQueryResult(this, filter) : this).forEach(orphan); // dojo.NodeList 78615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 78625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 78635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) adopt: function(/*String||Array||DomNode*/ queryOrListOrNode, /*String?*/ position){ 78645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 78655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // places any/all elements in queryOrListOrNode at a 78665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // position relative to the first element in this list. 78675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a dojo.NodeList of the adopted elements. 78685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // queryOrListOrNode: 78695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a DOM node or a query string or a query result. 78705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Represents the nodes to be adopted relative to the 78715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // first element of this NodeList. 78725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // position: 78735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can be one of: 78745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "last" (default) 78755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "first" 78765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "before" 78775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "after" 78785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "only" 78795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "replace" 78805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or an offset in the childNodes property 78815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.query(queryOrListOrNode).place(this[0], position)._stash(this); // dojo.NodeList 78825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 78835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 78845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: do we need this? 78855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) query: function(/*String*/ queryStr){ 78865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 78875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a new list whose members match the passed query, 78885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // assuming elements of the current NodeList as the root for 78895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // each search. 78905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 78915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // assume a DOM created by this markup: 78925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <div id="foo"> 78935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <p> 78945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | bacon is tasty, <span>dontcha think?</span> 78955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | </p> 78965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | </div> 78975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <div id="bar"> 78985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <p>great comedians may not be funny <span>in person</span></p> 78995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | </div> 79005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we are presented with the following definition for a NodeList: 79015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var l = new dojo.NodeList(dojo.byId("foo"), dojo.byId("bar")); 79025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it's possible to find all span elements under paragraphs 79035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // contained by these elements with this sub-query: 79045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var spans = l.query("p span"); 79055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 79065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: probably slow 79075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!queryStr){ return this; } 79085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ret = this.map(function(node){ 79095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: why would we ever get undefined here? 79105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.query(queryStr, node).filter(function(subNode){ return subNode !== undefined; }); 79115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 79125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._wrap(apc.apply([], ret), this); // dojo.NodeList 79135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 79145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 79155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) filter: function(/*String|Function*/ filter){ 79165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 79175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "masks" the built-in javascript filter() method (supported 79185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in Dojo via `dojo.filter`) to support passing a simple 79195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // string filter in addition to supporting filtering function 79205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // objects. 79215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // filter: 79225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If a string, a CSS rule like ".thinger" or "div > span". 79235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 79245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "regular" JS filter syntax as exposed in dojo.filter: 79255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("*").filter(function(item){ 79265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // highlight every paragraph 79275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return (item.nodeName == "p"); 79285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }).style("backgroundColor", "yellow"); 79295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 79305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the same filtering using a CSS selector 79315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("*").filter("p").styles("backgroundColor", "yellow"); 79325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 79335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var a = arguments, items = this, start = 0; 79345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof filter == "string"){ // inline'd type check 79355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) items = d._filterQueryResult(this, a[0]); 79365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(a.length == 1){ 79375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if we only got a string query, pass back the filtered results 79385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return items._stash(this); // dojo.NodeList 79395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 79405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if we got a callback, run it over the filtered items 79415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) start = 1; 79425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 79435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._wrap(d.filter(items, a[start], a[start + 1]), this); // dojo.NodeList 79445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 79455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 79465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /* 79475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: should this be "copyTo" and include parenting info? 79485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clone: function(){ 79495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 79505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // creates node clones of each element of this list 79515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and returns a new list containing the clones 79525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 79535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 79545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 79555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) addContent: function(/*String||DomNode||Object||dojo.NodeList*/ content, /*String||Integer?*/ position){ 79565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 79575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add a node, NodeList or some HTML as a string to every item in the 79585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // list. Returns the original list. 79595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 79605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a copy of the HTML content is added to each item in the 79615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // list, with an optional position argument. If no position 79625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // argument is provided, the content is appended to the end of 79635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // each item. 79645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // content: 79655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM node, HTML in string format, a NodeList or an Object. If a DOM node or 79665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NodeList, the content will be cloned if the current NodeList has more than one 79675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // element. Only the DOM nodes are cloned, no event handlers. If it is an Object, 79685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it should be an object with at "template" String property that has the HTML string 79695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to insert. If dojo.string has already been dojo.required, then dojo.string.substitute 79705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will be used on the "template" to generate the final HTML string. Other allowed 79715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // properties on the object are: "parse" if the HTML 79725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // string should be parsed for widgets (dojo.require("dojo.parser") to get that 79735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // option to work), and "templateFunc" if a template function besides dojo.string.substitute 79745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // should be used to transform the "template". 79755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // position: 79765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can be one of: 79775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "last"||"end" (default) 79785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "first||"start" 79795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "before" 79805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "after" 79815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "replace" (replaces nodes in this NodeList with new content) 79825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "only" (removes other children of the nodes so new content is the only child) 79835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or an offset in the childNodes property 79845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 79855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // appends content to the end if the position is omitted 79865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("h3 > p").addContent("hey there!"); 79875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 79885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add something to the front of each element that has a 79895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "thinger" property: 79905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("[thinger]").addContent("...", "first"); 79915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 79925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // adds a header before each element of the list 79935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".note").addContent("<h4>NOTE:</h4>", "before"); 79945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 79955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add a clone of a DOM node to the end of every element in 79965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the list, removing it from its existing parent. 79975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".note").addContent(dojo.byId("foo")); 79985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 79995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Append nodes from a templatized string. 80005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.require("dojo.string"); 80015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.query(".note").addContent({ 80025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // template: '<b>${id}: </b><span>${name}</span>', 80035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id: "user332", 80045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name: "Mr. Anderson" 80055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // }); 80065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 80075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Append nodes from a templatized string that also has widgets parsed. 80085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.require("dojo.string"); 80095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.require("dojo.parser"); 80105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // var notes = dojo.query(".note").addContent({ 80115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // template: '<button dojoType="dijit.form.Button">${text}</button>', 80125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // parse: true, 80135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // text: "Send" 80145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // }); 80155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) content = this._normalize(content, this[0]); 80165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = 0, node; (node = this[i]); i++){ 80175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._place(content, node, position, i > 0); 80185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 80195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; //dojo.NodeList 80205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 80215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 80225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) instantiate: function(/*String|Object*/ declaredClass, /*Object?*/ properties){ 80235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 80245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create a new instance of a specified class, using the 80255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // specified properties and each node in the nodeList as a 80265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // srcNodeRef. 80275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 80285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Grabs all buttons in the page and converts them to diji.form.Buttons. 80295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var buttons = dojo.query("button").instantiate("dijit.form.Button", {showLabel: true}); 80305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var c = d.isFunction(declaredClass) ? declaredClass : d.getObject(declaredClass); 80315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) properties = properties || {}; 80325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.forEach(function(node){ 80335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) new c(properties, node); 80345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); // dojo.NodeList 80355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 80365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 80375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) at: function(/*===== index =====*/){ 80385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 80395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a new NodeList comprised of items in this NodeList 80405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // at the given index or indices. 80415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 80425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // index: Integer... 80435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // One or more 0-based indices of items in the current 80445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NodeList. A negative index will start at the end of the 80455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // list and go backwards. 80465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 80475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 80485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Shorten the list to the first, second, and third elements 80495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("a").at(0, 1, 2).forEach(fn); 80505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 80515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 80525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Retrieve the first and last elements of a unordered list: 80535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("ul > li").at(0, -1).forEach(cb); 80545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 80555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 80565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Do something for the first element only, but end() out back to 80575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the original list and continue chaining: 80585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("a").at(0).onclick(fn).end().forEach(function(n){ 80595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log(n); // all anchors on the page. 80605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }) 80615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 80625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: 80635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.NodeList 80645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var t = new this._NodeListCtor(); 80655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.forEach(arguments, function(i){ 80665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(i < 0){ i = this.length + i } 80675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(this[i]){ t.push(this[i]); } 80685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, this); 80695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return t._stash(this); // dojo.NodeList 80705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 80715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 80725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 80735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 80745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nl.events = [ 80755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 80765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // list of all DOM events used in NodeList 80775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "blur", "focus", "change", "click", "error", "keydown", "keypress", 80785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "keyup", "load", "mousedown", "mouseenter", "mouseleave", "mousemove", 80795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "mouseout", "mouseover", "mouseup", "submit" 80805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ]; 80815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 80825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: pseudo-doc the above automatically generated on-event functions 80835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 80845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // syntactic sugar for DOM events 80855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.forEach(nl.events, function(evt){ 80865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _oe = "on" + evt; 80875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nlp[_oe] = function(a, b){ 80885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this.connect(_oe, a, b); 80895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 80905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: should these events trigger publishes? 80915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /* 80925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (a ? this.connect(_oe, a, b) : 80935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.forEach(function(n){ 80945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: 80955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // listeners get buried by 80965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // addEventListener and can't be dug back 80975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // out to be triggered externally. 80985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // see: 80995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://developer.mozilla.org/en/docs/DOM:element 81005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) console.log(n, evt, _oe); 81025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: need synthetic event support! 81045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _e = { target: n, faux: true, type: evt }; 81055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo._event_listener._synthesizeEvent({}, { target: n, faux: true, type: evt }); 81065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ n[evt](_e); }catch(e){ console.log(e); } 81075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ n[_oe](_e); }catch(e){ console.log(e); } 81085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }) 81095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ); 81105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 81115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 81125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ); 81135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 81155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 81175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.query"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 81195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.query"] = true; 81205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 81215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 81235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.query() architectural overview: 81245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.query is a relatively full-featured CSS3 query library. It is 81265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) designed to take any valid CSS3 selector and return the nodes matching 81275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) the selector. To do this quickly, it processes queries in several 81285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) steps, applying caching where profitable. 81295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) The steps (roughly in reverse order of the way they appear in the code): 81315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1.) check to see if we already have a "query dispatcher" 81325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) - if so, use that with the given parameterization. Skip to step 4. 81335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2.) attempt to determine which branch to dispatch the query to: 81345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) - JS (optimized DOM iteration) 81355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) - native (FF3.1+, Safari 3.1+, IE 8+) 81365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3.) tokenize and convert to executable "query dispatcher" 81375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) - this is where the lion's share of the complexity in the 81385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) system lies. In the DOM version, the query dispatcher is 81395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assembled as a chain of "yes/no" test functions pertaining to 81405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a section of a simple query statement (".blah:nth-child(odd)" 81415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) but not "div div", which is 2 simple statements). Individual 81425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) statement dispatchers are cached (to prevent re-definition) 81435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) as are entire dispatch chains (to make re-execution of the 81445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) same query fast) 81455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4.) the resulting query dispatcher is called in the passed scope 81465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (by default the top-level document) 81475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) - for DOM queries, this results in a recursive, top-down 81485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evaluation of nodes based on each simple query section 81495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) - for native implementations, this may mean working around spec 81505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bugs. So be it. 81515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5.) matched nodes are pruned to ensure they are unique (if necessary) 81525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/ 81535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var defineQuery= function(d){ 81555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // define everything in a closure for compressability reasons. "d" is an 81565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // alias to "dojo" (or the toolkit alias object, e.g., "acme"). 81575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //////////////////////////////////////////////////////////////////////// 81595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Toolkit aliases 81605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //////////////////////////////////////////////////////////////////////// 81615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if you are extracting dojo.query for use in your own system, you will 81635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // need to provide these methods and properties. No other porting should be 81645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // necessary, save for configuring the system to use a class other than 81655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.NodeList as the return instance instantiator 81665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var trim = d.trim; 81675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var each = d.forEach; 81685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // d.isIE; // float 81695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // d.isSafari; // float 81705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // d.isOpera; // float 81715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // d.isWebKit; // float 81725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // d.doc ; // document element 81735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var qlc = (d._NodeListCtor = d.NodeList); 81745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var getDoc = function(){ return d.doc; }; 81765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE(alex): the spec is idiotic. CSS queries should ALWAYS be case-sensitive, but nooooooo 81775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cssCaseBug = ((d.isWebKit||d.isMozilla) && ((getDoc().compatMode) == "BackCompat")); 81785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //////////////////////////////////////////////////////////////////////// 81805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Global utilities 81815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //////////////////////////////////////////////////////////////////////// 81825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // on browsers that support the "children" collection we can avoid a lot of 81855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // iteration on chaff (non-element) nodes. 81865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // why. 81875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var childNodesName = !!getDoc().firstChild["children"] ? "children" : "childNodes"; 81885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var specials = ">~+"; 81905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // global thunk to determine whether we should treat the current query as 81925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // case sensitive or not. This switch is flipped by the query evaluator 81935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // based on the document passed as the context to search. 81945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var caseSensitive = false; 81955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // how high? 81975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var yesman = function(){ return true; }; 81985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //////////////////////////////////////////////////////////////////////// 82005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Tokenizer 82015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //////////////////////////////////////////////////////////////////////// 82025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var getQueryParts = function(query){ 82045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 82055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // state machine for query tokenization 82065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 82075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // instead of using a brittle and slow regex-based CSS parser, 82085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.query implements an AST-style query representation. This 82095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // representation is only generated once per query. For example, 82105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the same query run multiple times or under different root nodes 82115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // does not re-parse the selector expression but instead uses the 82125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cached data structure. The state machine implemented here 82135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // terminates on the last " " (space) character and returns an 82145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ordered array of query component structures (or "parts"). Each 82155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // part represents an operator or a simple CSS filtering 82165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // expression. The structure for parts is documented in the code 82175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // below. 82185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE: 82215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this code is designed to run fast and compress well. Sacrifices 82225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to readability and maintainability have been made. Your best 82235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // bet when hacking the tokenizer is to put The Donnas on *really* 82245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // loud (may we recommend their "Spend The Night" release?) and 82255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // just assume you're gonna make mistakes. Keep the unit tests 82265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // open and run them frequently. Knowing is half the battle ;-) 82275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(specials.indexOf(query.slice(-1)) >= 0){ 82285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if we end with a ">", "+", or "~", that means we're implicitly 82295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // searching all children, so make it explicit 82305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) query += " * " 82315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 82325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if you have not provided a terminator, one will be provided for 82335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // you... 82345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) query += " "; 82355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 82365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ts = function(/*Integer*/ s, /*Integer*/ e){ 82385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // trim and slice. 82395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // take an index to start a string slice from and an end position 82415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and return a trimmed copy of that sub-string 82425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return trim(query.slice(s, e)); 82435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 82445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the overall data graph of the full query, as represented by queryPart objects 82465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var queryParts = []; 82475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // state keeping vars 82505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var inBrackets = -1, inParens = -1, inMatchFor = -1, 82515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inPseudo = -1, inClass = -1, inId = -1, inTag = -1, 82525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lc = "", cc = "", pStart; 82535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // iteration vars 82555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var x = 0, // index in the query 82565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ql = query.length, 82575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart = null, // data structure representing the entire clause 82585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _cp = null; // the current pseudo or attr matcher 82595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // several temporary variables are assigned to this structure during a 82615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // potential sub-expression match: 82625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // attr: 82635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a string representing the current full attribute match in a 82645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // bracket expression 82655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // type: 82665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if there's an operator in a bracket expression, this is 82675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // used to keep track of it 82685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // value: 82695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the internals of parenthetical expression for a pseudo. for 82705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // :nth-child(2n+1), value might be "2n+1" 82715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var endTag = function(){ 82735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // called when the tokenizer hits the end of a particular tag name. 82745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Re-sets state variables for tag matching and sets up the matcher 82755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to handle the next type of token (tag or operator). 82765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(inTag >= 0){ 82775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tv = (inTag == x) ? null : ts(inTag, x); // .toLowerCase(); 82785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart[ (specials.indexOf(tv) < 0) ? "tag" : "oper" ] = tv; 82795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inTag = -1; 82805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 82815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 82825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var endId = function(){ 82845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // called when the tokenizer might be at the end of an ID portion of a match 82855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(inId >= 0){ 82865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.id = ts(inId, x).replace(/\\/g, ""); 82875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inId = -1; 82885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 82895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 82905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var endClass = function(){ 82925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // called when the tokenizer might be at the end of a class name 82935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // match. CSS allows for multiple classes, so we augment the 82945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // current item with another class in its list 82955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(inClass >= 0){ 82965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.classes.push(ts(inClass+1, x).replace(/\\/g, "")); 82975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inClass = -1; 82985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 82995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 83005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var endAll = function(){ 83025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // at the end of a simple fragment, so wall off the matches 83035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endId(); endTag(); endClass(); 83045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 83055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var endPart = function(){ 83075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endAll(); 83085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(inPseudo >= 0){ 83095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.pseudos.push({ name: ts(inPseudo+1, x) }); 83105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 83115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // hint to the selector engine to tell it whether or not it 83125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // needs to do any iteration. Many simple selectors don't, and 83135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we can avoid significant construction-time work by advising 83145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the system to skip them 83155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.loops = ( 83165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.pseudos.length || 83175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.attrs.length || 83185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.classes.length ); 83195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.oquery = currentPart.query = ts(pStart, x); // save the full expression as a string 83215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // otag/tag are hints to suggest to the system whether or not 83245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it's an operator or a tag. We save a copy of otag since the 83255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // tag name is cast to upper-case in regular HTML matches. The 83265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // system has a global switch to figure out if the current 83275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // expression needs to be case sensitive or not and it will use 83285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // otag or tag accordingly 83295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.otag = currentPart.tag = (currentPart["oper"]) ? null : (currentPart.tag || "*"); 83305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(currentPart.tag){ 83325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if we're in a case-insensitive HTML doc, we likely want 83335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the toUpperCase when matching on element.tagName. If we 83345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // do it here, we can skip the string op per node 83355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // comparison 83365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.tag = currentPart.tag.toUpperCase(); 83375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 83385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add the part to the list 83405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(queryParts.length && (queryParts[queryParts.length-1].oper)){ 83415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // operators are always infix, so we remove them from the 83425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // list and attach them to the next match. The evaluator is 83435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // responsible for sorting out how to handle them. 83445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.infixOper = queryParts.pop(); 83455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.query = currentPart.infixOper.query + " " + currentPart.query; 83465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /* 83475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) console.debug( "swapping out the infix", 83485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.infixOper, 83495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "and attaching it to", 83505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart); 83515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 83525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 83535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) queryParts.push(currentPart); 83545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart = null; 83565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 83575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // iterate over the query, character by character, building up a 83595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // list of query part objects 83605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(; lc=cc, cc=query.charAt(x), x < ql; x++){ 83615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cc: the current character in the match 83625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // lc: the last character (if any) 83635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // someone is trying to escape something, so don't try to match any 83655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fragments. We assume we're inside a literal. 83665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(lc == "\\"){ continue; } 83675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!currentPart){ // a part was just ended or none has yet been created 83685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE: I hate all this alloc, but it's shorter than writing tons of if's 83695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pStart = x; 83705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // rules describe full CSS sub-expressions, like: 83715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // #someId 83725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // .className:first-child 83735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // but not: 83745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // thinger > div.howdy[type=thinger] 83755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the indidual components of the previous query would be 83765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // split into 3 parts that would be represented a structure 83775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // like: 83785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // [ 83795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // { 83805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // query: "thinger", 83815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // tag: "thinger", 83825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // }, 83835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // { 83845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // query: "div.howdy[type=thinger]", 83855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // classes: ["howdy"], 83865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // infixOper: { 83875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // query: ">", 83885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // oper: ">", 83895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // } 83905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // }, 83915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ] 83925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart = { 83935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) query: null, // the full text of the part's rule 83945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pseudos: [], // CSS supports multiple pseud-class matches in a single rule 83955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) attrs: [], // CSS supports multi-attribute match, so we need an array 83965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) classes: [], // class matches may be additive, e.g.: .thinger.blah.howdy 83975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tag: null, // only one tag... 83985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) oper: null, // ...or operator per component. Note that these wind up being exclusive. 83995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) id: null, // the id component of a rule 84005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) getTag: function(){ 84015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (caseSensitive) ? this.otag : this.tag; 84025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 84035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 84045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 84055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if we don't have a part, we assume we're going to start at 84065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the beginning of a match, which should be a tag name. This 84075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // might fault a little later on, but we detect that and this 84085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // iteration will still be fine. 84095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inTag = x; 84105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 84115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 84125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(inBrackets >= 0){ 84135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // look for a the close first 84145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cc == "]"){ // if we're in a [...] clause and we end, do assignment 84155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_cp.attr){ 84165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // no attribute match was previously begun, so we 84175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // assume this is an attribute existence match in the 84185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // form of [someAttributeName] 84195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _cp.attr = ts(inBrackets+1, x); 84205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 84215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we had an attribute already, so we know that we're 84225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // matching some sort of value, as in [attrName=howdy] 84235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _cp.matchFor = ts((inMatchFor||inBrackets+1), x); 84245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 84255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cmf = _cp.matchFor; 84265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cmf){ 84275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // try to strip quotes from the matchFor value. We want 84285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // [attrName=howdy] to match the same 84295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // as [attrName = 'howdy' ] 84305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if( (cmf.charAt(0) == '"') || (cmf.charAt(0) == "'") ){ 84315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _cp.matchFor = cmf.slice(1, -1); 84325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 84335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 84345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // end the attribute by adding it to the list of attributes. 84355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.attrs.push(_cp); 84365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _cp = null; // necessary? 84375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inBrackets = inMatchFor = -1; 84385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(cc == "="){ 84395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if the last char was an operator prefix, make sure we 84405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // record it along with the "=" operator. 84415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : ""; 84425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _cp.type = addToCc+cc; 84435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _cp.attr = ts(inBrackets+1, x-addToCc.length); 84445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inMatchFor = x+1; 84455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 84465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // now look for other clause parts 84475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(inParens >= 0){ 84485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if we're in a parenthetical expression, we need to figure 84495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // out if it's attached to a pseudo-selector rule like 84505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // :nth-child(1) 84515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cc == ")"){ 84525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(inPseudo >= 0){ 84535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _cp.value = ts(inParens+1, x); 84545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 84555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inPseudo = inParens = -1; 84565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 84575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(cc == "#"){ 84585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // start of an ID match 84595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endAll(); 84605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inId = x+1; 84615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(cc == "."){ 84625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // start of a class match 84635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endAll(); 84645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inClass = x; 84655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(cc == ":"){ 84665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // start of a pseudo-selector match 84675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endAll(); 84685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inPseudo = x; 84695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(cc == "["){ 84705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // start of an attribute match. 84715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endAll(); 84725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inBrackets = x; 84735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // provide a new structure for the attribute match to fill-in 84745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _cp = { 84755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 84765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) attr: null, type: null, matchFor: null 84775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 84785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 84795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(cc == "("){ 84805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we really only care if we've entered a parenthetical 84815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // expression if we're already inside a pseudo-selector match 84825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(inPseudo >= 0){ 84835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // provide a new structure for the pseudo match to fill-in 84845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _cp = { 84855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name: ts(inPseudo+1, x), 84865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value: null 84875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 84885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentPart.pseudos.push(_cp); 84895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 84905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inParens = x; 84915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if( 84925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (cc == " ") && 84935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if it's a space char and the last char is too, consume the 84945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // current one without doing more work 84955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (lc != cc) 84965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ){ 84975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endPart(); 84985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 84995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 85005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return queryParts; 85015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 85025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //////////////////////////////////////////////////////////////////////// 85055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM query infrastructure 85065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //////////////////////////////////////////////////////////////////////// 85075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var agree = function(first, second){ 85095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the basic building block of the yes/no chaining system. agree(f1, 85105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // f2) generates a new function which returns the boolean results of 85115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // both of the passed functions to a single logical-anded result. If 85125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // either are not passed, the other is used exclusively. 85135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!first){ return second; } 85145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!second){ return first; } 85155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(){ 85175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return first.apply(window, arguments) && second.apply(window, arguments); 85185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 85195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 85205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var getArr = function(i, arr){ 85225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // helps us avoid array alloc when we don't need it 85235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var r = arr||[]; // FIXME: should this be 'new d._NodeListCtor()' ? 85245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(i){ r.push(i); } 85255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return r; 85265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 85275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _isElement = function(n){ return (1 == n.nodeType); }; 85295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: need to coalesce _getAttr with defaultGetter 85315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var blank = ""; 85325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _getAttr = function(elem, attr){ 85335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!elem){ return blank; } 85345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(attr == "class"){ 85355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return elem.className || blank; 85365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 85375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(attr == "for"){ 85385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return elem.htmlFor || blank; 85395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 85405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(attr == "style"){ 85415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return elem.style.cssText || blank; 85425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 85435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (caseSensitive ? elem.getAttribute(attr) : elem.getAttribute(attr, 2)) || blank; 85445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 85455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var attrs = { 85475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "*=": function(attr, value){ 85485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 85495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // E[foo*="bar"] 85505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an E element whose "foo" attribute value contains 85515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the substring "bar" 85525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (_getAttr(elem, attr).indexOf(value)>=0); 85535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 85545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 85555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "^=": function(attr, value){ 85565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // E[foo^="bar"] 85575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an E element whose "foo" attribute value begins exactly 85585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // with the string "bar" 85595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 85605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (_getAttr(elem, attr).indexOf(value)==0); 85615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 85625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 85635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "$=": function(attr, value){ 85645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // E[foo$="bar"] 85655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an E element whose "foo" attribute value ends exactly 85665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // with the string "bar" 85675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tval = " "+value; 85685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 85695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ea = " "+_getAttr(elem, attr); 85705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (ea.lastIndexOf(value)==(ea.length-value.length)); 85715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 85725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 85735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "~=": function(attr, value){ 85745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // E[foo~="bar"] 85755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an E element whose "foo" attribute value is a list of 85765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // space-separated values, one of which is exactly equal 85775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to "bar" 85785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return "[contains(concat(' ',@"+attr+",' '), ' "+ value +" ')]"; 85805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tval = " "+value+" "; 85815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 85825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ea = " "+_getAttr(elem, attr)+" "; 85835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (ea.indexOf(tval)>=0); 85845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 85855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 85865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "|=": function(attr, value){ 85875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // E[hreflang|="en"] 85885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an E element whose "hreflang" attribute has a 85895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // hyphen-separated list of values beginning (from the 85905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // left) with "en" 85915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var valueDash = " "+value+"-"; 85925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 85935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ea = " "+_getAttr(elem, attr); 85945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ( 85955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (ea == value) || 85965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (ea.indexOf(valueDash)==0) 85975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ); 85985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 85995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 86005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "=": function(attr, value){ 86015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 86025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (_getAttr(elem, attr) == value); 86035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 86045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 86055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 86065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 86075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // avoid testing for node type if we can. Defining this in the negative 86085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // here to avoid negation in the fast path. 86095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _noNES = (typeof getDoc().firstChild.nextElementSibling == "undefined"); 86105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _ns = !_noNES ? "nextElementSibling" : "nextSibling"; 86115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _ps = !_noNES ? "previousElementSibling" : "previousSibling"; 86125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _simpleNodeTest = (_noNES ? _isElement : yesman); 86135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 86145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _lookLeft = function(node){ 86155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // look left 86165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(node = node[_ps]){ 86175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_simpleNodeTest(node)){ return false; } 86185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 86195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 86205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 86215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 86225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _lookRight = function(node){ 86235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // look right 86245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(node = node[_ns]){ 86255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_simpleNodeTest(node)){ return false; } 86265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 86275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 86285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 86295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 86305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var getNodeIndex = function(node){ 86315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var root = node.parentNode; 86325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var i = 0, 86335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tret = root[childNodesName], 86345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ci = (node["_i"]||-1), 86355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cl = (root["_l"]||-1); 86365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 86375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!tret){ return -1; } 86385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var l = tret.length; 86395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 86405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we calculate the parent length as a cheap way to invalidate the 86415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cache. It's not 100% accurate, but it's much more honest than what 86425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // other libraries do 86435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if( cl == l && ci >= 0 && cl >= 0 ){ 86445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if it's legit, tag and release 86455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ci; 86465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 86475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 86485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // else re-key things 86495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) root["_l"] = l; 86505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ci = -1; 86515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var te = root["firstElementChild"]||root["firstChild"]; te; te = te[_ns]){ 86525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_simpleNodeTest(te)){ 86535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) te["_i"] = ++i; 86545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(node === te){ 86555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE: 86565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // shortcutting the return at this step in indexing works 86575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // very well for benchmarking but we avoid it here since 86585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it leads to potential O(n^2) behavior in sequential 86595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // getNodexIndex operations on a previously un-indexed 86605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // parent. We may revisit this at a later time, but for 86615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // now we just want to get the right answer more often 86625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // than not. 86635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ci = i; 86645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 86655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 86665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 86675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ci; 86685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 86695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 86705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var isEven = function(elem){ 86715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !((getNodeIndex(elem)) % 2); 86725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 86735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 86745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var isOdd = function(elem){ 86755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ((getNodeIndex(elem)) % 2); 86765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 86775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 86785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var pseudos = { 86795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "checked": function(name, condition){ 86805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 86815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !!("checked" in elem ? elem.checked : elem.selected); 86825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 86835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 86845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "first-child": function(){ return _lookLeft; }, 86855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "last-child": function(){ return _lookRight; }, 86865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "only-child": function(name, condition){ 86875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(node){ 86885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_lookLeft(node)){ return false; } 86895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_lookRight(node)){ return false; } 86905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 86915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 86925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 86935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "empty": function(name, condition){ 86945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 86955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DomQuery and jQuery get this wrong, oddly enough. 86965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The CSS 3 selectors spec is pretty explicit about it, too. 86975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cn = elem.childNodes; 86985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cnl = elem.childNodes.length; 86995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if(!cnl){ return true; } 87005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var x=cnl-1; x >= 0; x--){ 87015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var nt = cn[x].nodeType; 87025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if((nt === 1)||(nt == 3)){ return false; } 87035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 87055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 87075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "contains": function(name, condition){ 87085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cz = condition.charAt(0); 87095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if( cz == '"' || cz == "'" ){ //remove quote 87105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) condition = condition.slice(1, -1); 87115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 87135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (elem.innerHTML.indexOf(condition) >= 0); 87145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 87165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "not": function(name, condition){ 87175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var p = getQueryParts(condition)[0]; 87185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ignores = { el: 1 }; 87195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(p.tag != "*"){ 87205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ignores.tag = 1; 87215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!p.classes.length){ 87235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ignores.classes = 1; 87245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ntf = getSimpleFilterFunc(p, ignores); 87265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 87275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (!ntf(elem)); 87285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 87305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "nth-child": function(name, condition){ 87315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var pi = parseInt; 87325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // avoid re-defining function objects if we can 87335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(condition == "odd"){ 87345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isOdd; 87355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(condition == "even"){ 87365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isEven; 87375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: can we shorten this? 87395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(condition.indexOf("n") != -1){ 87405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tparts = condition.split("n", 2); 87415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var pred = tparts[0] ? ((tparts[0] == '-') ? -1 : pi(tparts[0])) : 1; 87425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var idx = tparts[1] ? pi(tparts[1]) : 0; 87435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var lb = 0, ub = -1; 87445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(pred > 0){ 87455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(idx < 0){ 87465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) idx = (idx % pred) && (pred + (idx % pred)); 87475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(idx>0){ 87485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(idx >= pred){ 87495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lb = idx - idx % pred; 87505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) idx = idx % pred; 87525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(pred<0){ 87545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pred *= -1; 87555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // idx has to be greater than 0 when pred is negative; 87565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // shall we throw an error here? 87575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(idx > 0){ 87585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ub = idx; 87595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) idx = idx % pred; 87605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(pred > 0){ 87635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 87645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var i = getNodeIndex(elem); 87655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (i>=lb) && (ub<0 || i<=ub) && ((i % pred) == idx); 87665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 87685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) condition = idx; 87695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ncount = pi(condition); 87725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 87735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (getNodeIndex(elem) == ncount); 87745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 87775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 87785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var defaultGetter = (d.isIE < 9 || (dojo.isIE && dojo.isQuirks)) ? function(cond){ 87795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var clc = cond.toLowerCase(); 87805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(clc == "class"){ cond = "className"; } 87815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 87825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (caseSensitive ? elem.getAttribute(cond) : elem[cond]||elem[clc]); 87835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } : function(cond){ 87855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(elem){ 87865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (elem && elem.getAttribute && elem.hasAttribute(cond)); 87875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 87885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 87895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 87905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var getSimpleFilterFunc = function(query, ignores){ 87915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // generates a node tester function based on the passed query part. The 87925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // query part is one of the structures generated by the query parser 87935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // when it creates the query AST. The "ignores" object specifies which 87945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (if any) tests to skip, allowing the system to avoid duplicating 87955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // work where it may have already been taken into account by other 87965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // factors such as how the nodes to test were fetched in the first 87975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // place 87985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!query){ return yesman; } 87995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ignores = ignores||{}; 88005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 88015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ff = null; 88025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 88035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!("el" in ignores)){ 88045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ff = agree(ff, _isElement); 88055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 88075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!("tag" in ignores)){ 88085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(query.tag != "*"){ 88095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ff = agree(ff, function(elem){ 88105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (elem && (elem.tagName == query.getTag())); 88115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 88125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 88155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!("classes" in ignores)){ 88165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) each(query.classes, function(cname, idx, arr){ 88175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // get the class name 88185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /* 88195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var isWildcard = cname.charAt(cname.length-1) == "*"; 88205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(isWildcard){ 88215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cname = cname.substr(0, cname.length-1); 88225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // I dislike the regex thing, even if memoized in a cache, but it's VERY short 88245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var re = new RegExp("(?:^|\\s)" + cname + (isWildcard ? ".*" : "") + "(?:\\s|$)"); 88255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 88265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var re = new RegExp("(?:^|\\s)" + cname + "(?:\\s|$)"); 88275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ff = agree(ff, function(elem){ 88285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return re.test(elem.className); 88295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 88305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ff.count = idx; 88315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 88325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 88345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!("pseudos" in ignores)){ 88355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) each(query.pseudos, function(pseudo){ 88365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var pn = pseudo.name; 88375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(pseudos[pn]){ 88385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ff = agree(ff, pseudos[pn](pn, pseudo.value)); 88395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 88415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 88435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!("attrs" in ignores)){ 88445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) each(query.attrs, function(attr){ 88455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var matcher; 88465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var a = attr.attr; 88475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // type, attr, matchFor 88485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(attr.type && attrs[attr.type]){ 88495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) matcher = attrs[attr.type](a, attr.matchFor); 88505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(a.length){ 88515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) matcher = defaultGetter(a); 88525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(matcher){ 88545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ff = agree(ff, matcher); 88555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 88575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 88595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!("id" in ignores)){ 88605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(query.id){ 88615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ff = agree(ff, function(elem){ 88625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (!!elem && (elem.id == query.id)); 88635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 88645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 88675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!ff){ 88685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!("default" in ignores)){ 88695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ff = yesman; 88705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ff; 88735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 88745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 88755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _nextSibling = function(filterFunc){ 88765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(node, ret, bag){ 88775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(node = node[_ns]){ 88785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_noNES && (!_isElement(node))){ continue; } 88795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if( 88805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (!bag || _isUnique(node, bag)) && 88815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) filterFunc(node) 88825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ){ 88835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.push(node); 88845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 88865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; 88885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 88905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 88915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _nextSiblings = function(filterFunc){ 88925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(root, ret, bag){ 88935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var te = root[_ns]; 88945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(te){ 88955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_simpleNodeTest(te)){ 88965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(bag && !_isUnique(te, bag)){ 88975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 88985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 88995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(filterFunc(te)){ 89005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.push(te); 89015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 89025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 89035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) te = te[_ns]; 89045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 89055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; 89065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 89075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 89085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 89095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // get an array of child *elements*, skipping text and comment nodes 89105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _childElements = function(filterFunc){ 89115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) filterFunc = filterFunc||yesman; 89125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(root, ret, bag){ 89135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // get an array of child elements, skipping text and comment nodes 89145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var te, x = 0, tret = root[childNodesName]; 89155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(te = tret[x++]){ 89165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if( 89175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _simpleNodeTest(te) && 89185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (!bag || _isUnique(te, bag)) && 89195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (filterFunc(te, x)) 89205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ){ 89215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.push(te); 89225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 89235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 89245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; 89255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 89265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 89275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 89285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /* 89295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // thanks, Dean! 89305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var itemIsAfterRoot = d.isIE ? function(item, root){ 89315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (item.sourceIndex > root.sourceIndex); 89325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } : function(item, root){ 89335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (item.compareDocumentPosition(root) == 2); 89345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 89355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 89365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 89375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // test to see if node is below root 89385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _isDescendant = function(node, root){ 89395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var pn = node.parentNode; 89405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while(pn){ 89415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(pn == root){ 89425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 89435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 89445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pn = pn.parentNode; 89455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 89465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !!pn; 89475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 89485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 89495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _getElementsFuncCache = {}; 89505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 89515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var getElementsFunc = function(query){ 89525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var retFunc = _getElementsFuncCache[query.query]; 89535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if we've got a cached dispatcher, just use that 89545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(retFunc){ return retFunc; } 89555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // else, generate a new on 89565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 89575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE: 89585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this function returns a function that searches for nodes and 89595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // filters them. The search may be specialized by infix operators 89605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (">", "~", or "+") else it will default to searching all 89615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // descendants (the " " selector). Once a group of children is 89625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // found, a test function is applied to weed out the ones we 89635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // don't want. Many common cases can be fast-pathed. We spend a 89645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // lot of cycles to create a dispatcher that doesn't do more work 89655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // than necessary at any point since, unlike this function, the 89665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dispatchers will be called every time. The logic of generating 89675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // efficient dispatchers looks like this in pseudo code: 89685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 89695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // # if it's a purely descendant query (no ">", "+", or "~" modifiers) 89705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if infixOperator == " ": 89715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if only(id): 89725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return def(root): 89735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return d.byId(id, root); 89745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 89755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // elif id: 89765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return def(root): 89775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return filter(d.byId(id, root)); 89785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 89795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // elif cssClass && getElementsByClassName: 89805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return def(root): 89815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return filter(root.getElementsByClassName(cssClass)); 89825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 89835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // elif only(tag): 89845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return def(root): 89855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return root.getElementsByTagName(tagName); 89865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 89875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // else: 89885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // # search by tag name, then filter 89895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return def(root): 89905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return filter(root.getElementsByTagName(tagName||"*")); 89915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 89925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // elif infixOperator == ">": 89935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // # search direct children 89945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return def(root): 89955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return filter(root.children); 89965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 89975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // elif infixOperator == "+": 89985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // # search next sibling 89995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return def(root): 90005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return filter(root.nextElementSibling); 90015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 90025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // elif infixOperator == "~": 90035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // # search rightward siblings 90045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return def(root): 90055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return filter(nextSiblings(root)); 90065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 90075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var io = query.infixOper; 90085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var oper = (io ? io.oper : ""); 90095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the default filter func which tests for all conditions in the query 90105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // part. This is potentially inefficient, so some optimized paths may 90115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // re-define it to test fewer things. 90125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var filterFunc = getSimpleFilterFunc(query, { el: 1 }); 90135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var qt = query.tag; 90145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var wildcardTag = ("*" == qt); 90155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ecs = getDoc()["getElementsByClassName"]; 90165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 90175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!oper){ 90185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if there's no infix operator, then it's a descendant query. ID 90195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and "elements by class name" variants can be accelerated so we 90205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // call them out explicitly: 90215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(query.id){ 90225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // testing shows that the overhead of yesman() is acceptable 90235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and can save us some bytes vs. re-defining the function 90245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // everywhere. 90255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) filterFunc = (!query.loops && wildcardTag) ? 90265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) yesman : 90275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) getSimpleFilterFunc(query, { el: 1, id: 1 }); 90285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 90295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) retFunc = function(root, arr){ 90305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var te = d.byId(query.id, (root.ownerDocument||root)); 90315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!te || !filterFunc(te)){ return; } 90325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(9 == root.nodeType){ // if root's a doc, we just return directly 90335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getArr(te, arr); 90345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ // otherwise check ancestry 90355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_isDescendant(te, root)){ 90365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getArr(te, arr); 90375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 90385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 90395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 90405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if( 90415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ecs && 90425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // isAlien check. Workaround for Prototype.js being totally evil/dumb. 90435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /\{\s*\[native code\]\s*\}/.test(String(ecs)) && 90445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) query.classes.length && 90455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) !cssCaseBug 90465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ){ 90475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it's a class-based query and we've got a fast way to run it. 90485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 90495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ignore class and ID filters since we will have handled both 90505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) filterFunc = getSimpleFilterFunc(query, { el: 1, classes: 1, id: 1 }); 90515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var classesString = query.classes.join(" "); 90525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) retFunc = function(root, arr, bag){ 90535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ret = getArr(0, arr), te, x=0; 90545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tret = root.getElementsByClassName(classesString); 90555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while((te = tret[x++])){ 90565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(filterFunc(te, root) && _isUnique(te, bag)){ 90575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.push(te); 90585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 90595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 90605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; 90615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 90625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 90635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(!wildcardTag && !query.loops){ 90645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it's tag only. Fast-path it. 90655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) retFunc = function(root, arr, bag){ 90665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ret = getArr(0, arr), te, x=0; 90675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tret = root.getElementsByTagName(query.getTag()); 90685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while((te = tret[x++])){ 90695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_isUnique(te, bag)){ 90705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.push(te); 90715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 90725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 90735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; 90745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 90755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 90765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the common case: 90775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a descendant selector without a fast path. By now it's got 90785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to have a tag selector, even if it's just "*" so we query 90795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // by that and filter 90805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) filterFunc = getSimpleFilterFunc(query, { el: 1, tag: 1, id: 1 }); 90815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) retFunc = function(root, arr, bag){ 90825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ret = getArr(0, arr), te, x=0; 90835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we use getTag() to avoid case sensitivity issues 90845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tret = root.getElementsByTagName(query.getTag()); 90855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while((te = tret[x++])){ 90865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(filterFunc(te, root) && _isUnique(te, bag)){ 90875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.push(te); 90885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 90895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 90905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; 90915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 90925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 90935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 90945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the query is scoped in some way. Instead of querying by tag we 90955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // use some other collection to find candidate nodes 90965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var skipFilters = { el: 1 }; 90975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(wildcardTag){ 90985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) skipFilters.tag = 1; 90995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 91005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) filterFunc = getSimpleFilterFunc(query, skipFilters); 91015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if("+" == oper){ 91025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) retFunc = _nextSibling(filterFunc); 91035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if("~" == oper){ 91045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) retFunc = _nextSiblings(filterFunc); 91055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(">" == oper){ 91065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) retFunc = _childElements(filterFunc); 91075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 91085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 91095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cache it and return 91105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _getElementsFuncCache[query.query] = retFunc; 91115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 91125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 91135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var filterDown = function(root, queryParts){ 91145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE: 91155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this is the guts of the DOM query system. It takes a list of 91165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // parsed query parts and a root and finds children which match 91175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the selector represented by the parts 91185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var candidates = getArr(root), qp, x, te, qpl = queryParts.length, bag, ret; 91195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 91205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = 0; i < qpl; i++){ 91215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret = []; 91225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) qp = queryParts[i]; 91235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) x = candidates.length - 1; 91245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(x > 0){ 91255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if we have more than one root at this level, provide a new 91265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // hash to use for checking group membership but tell the 91275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // system not to post-filter us since we will already have been 91285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // gauranteed to be unique 91295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bag = {}; 91305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.nozip = true; 91315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 91325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var gef = getElementsFunc(qp); 91335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var j = 0; (te = candidates[j]); j++){ 91345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for every root, get the elements that match the descendant 91355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // selector, adding them to the "ret" array and filtering them 91365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // via membership in this level's bag. If there are more query 91375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // parts, then this level's return will be used as the next 91385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // level's candidates 91395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gef(te, ret, bag); 91405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 91415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!ret.length){ break; } 91425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) candidates = ret; 91435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 91445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; 91455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 91465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 91475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //////////////////////////////////////////////////////////////////////// 91485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the query runner 91495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //////////////////////////////////////////////////////////////////////// 91505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 91515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // these are the primary caches for full-query results. The query 91525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dispatcher functions are generated then stored here for hash lookup in 91535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the future 91545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _queryFuncCacheDOM = {}, 91555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _queryFuncCacheQSA = {}; 91565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 91575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this is the second level of spliting, from full-length queries (e.g., 91585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "div.foo .bar") into simple query expressions (e.g., ["div.foo", 91595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ".bar"]) 91605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var getStepQueryFunc = function(query){ 91615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var qparts = getQueryParts(trim(query)); 91625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 91635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if it's trivial, avoid iteration and zipping costs 91645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(qparts.length == 1){ 91655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we optimize this case here to prevent dispatch further down the 91665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // chain, potentially slowing things down. We could more elegantly 91675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handle this in filterDown(), but it's slower for simple things 91685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that need to be fast (e.g., "#someId"). 91695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tef = getElementsFunc(qparts[0]); 91705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(root){ 91715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var r = tef(root, new qlc()); 91725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(r){ r.nozip = true; } 91735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return r; 91745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 91755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 91765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 91775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // otherwise, break it up and return a runner that iterates over the parts recursively 91785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return function(root){ 91795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return filterDown(root, qparts); 91805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 91815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 91825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 91835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTES: 91845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * we can't trust QSA for anything but document-rooted queries, so 91855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // caching is split into DOM query evaluators and QSA query evaluators 91865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * caching query results is dirty and leak-prone (or, at a minimum, 91875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // prone to unbounded growth). Other toolkits may go this route, but 91885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // they totally destroy their own ability to manage their memory 91895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // footprint. If we implement it, it should only ever be with a fixed 91905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // total element reference # limit and an LRU-style algorithm since JS 91915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // has no weakref support. Caching compiled query evaluators is also 91925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // potentially problematic, but even on large documents the size of the 91935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // query evaluators is often < 100 function objects per evaluator (and 91945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // LRU can be applied if it's ever shown to be an issue). 91955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * since IE's QSA support is currently only for HTML documents and even 91965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // then only in IE 8's "standards mode", we have to detect our dispatch 91975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // route at query time and keep 2 separate caches. Ugg. 91985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 91995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we need to determine if we think we can run a given query via 92005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // querySelectorAll or if we'll need to fall back on DOM queries to get 92015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // there. We need a lot of information about the environment and the query 92025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to make the determiniation (e.g. does it support QSA, does the query in 92035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // question work in the native QSA impl, etc.). 92045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var nua = navigator.userAgent; 92055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // some versions of Safari provided QSA, but it was buggy and crash-prone. 92065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We need te detect the right "internal" webkit version to make this work. 92075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var wk = "WebKit/"; 92085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var is525 = ( 92095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isWebKit && 92105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (nua.indexOf(wk) > 0) && 92115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (parseFloat(nua.split(wk)[1]) > 528) 92125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ); 92135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // IE QSA queries may incorrectly include comment nodes, so we throw the 92155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // zipping function into "remove" comments mode instead of the normal "skip 92165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it" which every other QSA-clued browser enjoys 92175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var noZip = d.isIE ? "commentStrip" : "nozip"; 92185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var qsa = "querySelectorAll"; 92205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var qsaAvail = ( 92215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) !!getDoc()[qsa] && 92225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // see #5832 92235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (!d.isSafari || (d.isSafari > 3.1) || is525 ) 92245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ); 92255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Don't bother with n+3 type of matches, IE complains if we modify those. 92275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var infixSpaceRe = /n\+\d|([^ ])?([>~+])([^ =])?/g; 92285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var infixSpaceFunc = function(match, pre, ch, post) { 92295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ch ? (pre ? pre + " " : "") + ch + (post ? " " + post : "") : /*n+3*/ match; 92305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 92315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var getQueryFunc = function(query, forceDOM){ 92335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Normalize query. The CSS3 selectors spec allows for omitting spaces around 92345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //infix operators, >, ~ and + 92355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Do the work here since detection for spaces is used as a simple "not use QSA" 92365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //test below. 92375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) query = query.replace(infixSpaceRe, infixSpaceFunc); 92385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(qsaAvail){ 92405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if we've got a cached variant and we think we can do it, run it! 92415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var qsaCached = _queryFuncCacheQSA[query]; 92425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(qsaCached && !forceDOM){ return qsaCached; } 92435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 92445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // else if we've got a DOM cached variant, assume that we already know 92465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // all we need to and use it 92475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var domCached = _queryFuncCacheDOM[query]; 92485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(domCached){ return domCached; } 92495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // TODO: 92515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // today we're caching DOM and QSA branches separately so we 92525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // recalc useQSA every time. If we had a way to tag root+query 92535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // efficiently, we'd be in good shape to do a global cache. 92545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var qcz = query.charAt(0); 92565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var nospace = (-1 == query.indexOf(" ")); 92575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // byId searches are wicked fast compared to QSA, even when filtering 92595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is required 92605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if( (query.indexOf("#") >= 0) && (nospace) ){ 92615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) forceDOM = true; 92625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 92635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var useQSA = ( 92655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) qsaAvail && (!forceDOM) && 92665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // as per CSS 3, we can't currently start w/ combinator: 92675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://www.w3.org/TR/css3-selectors/#w3cselgrammar 92685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (specials.indexOf(qcz) == -1) && 92695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // IE's QSA impl sucks on pseudos 92705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (!d.isIE || (query.indexOf(":") == -1)) && 92715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (!(cssCaseBug && (query.indexOf(".") >= 0))) && 92735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: 92755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // need to tighten up browser rules on ":contains" and "|=" to 92765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // figure out which aren't good 92775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Latest webkit (around 531.21.8) does not seem to do well with :checked on option 92785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // elements, even though according to spec, selected options should 92795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // match :checked. So go nonQSA for it: 92805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://bugs.dojotoolkit.org/ticket/5179 92815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (query.indexOf(":contains") == -1) && (query.indexOf(":checked") == -1) && 92825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (query.indexOf("|=") == -1) // some browsers don't grok it 92835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ); 92845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // TODO: 92865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if we've got a descendant query (e.g., "> .thinger" instead of 92875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // just ".thinger") in a QSA-able doc, but are passed a child as a 92885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // root, it should be possible to give the item a synthetic ID and 92895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // trivially rewrite the query to the form "#synid > .thinger" to 92905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // use the QSA branch 92915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(useQSA){ 92945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ? 92955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (query + " *") : query; 92965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _queryFuncCacheQSA[query] = function(root){ 92975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 92985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the QSA system contains an egregious spec bug which 92995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // limits us, effectively, to only running QSA queries over 93005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // entire documents. See: 93015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://ejohn.org/blog/thoughts-on-queryselectorall/ 93025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // despite this, we can also handle QSA runs on simple 93035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // selectors, but we don't want detection to be expensive 93045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // so we're just checking for the presence of a space char 93055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // right now. Not elegant, but it's cheaper than running 93065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the query parser when we might not need to 93075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!((9 == root.nodeType) || nospace)){ throw ""; } 93085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var r = root[qsa](tq); 93095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // skip expensive duplication checks and just wrap in a NodeList 93105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) r[noZip] = true; 93115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return r; 93125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 93135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // else run the DOM branch on this query, ensuring that we 93145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // default that way in the future 93155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getQueryFunc(query, true)(root); 93165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 93175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 93185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 93195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM branch 93205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var parts = query.split(/\s*,\s*/); 93215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _queryFuncCacheDOM[query] = ((parts.length < 2) ? 93225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher 93235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) getStepQueryFunc(query) : 93245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if it *is* a complex query, break it up into its 93255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // constituent parts and return a dispatcher that will 93265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // merge the parts when run 93275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function(root){ 93285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var pindex = 0, // avoid array alloc for every invocation 93295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret = [], 93305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tp; 93315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while((tp = parts[pindex++])){ 93325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret = ret.concat(getStepQueryFunc(tp)(root)); 93335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 93345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; 93355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 93365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ); 93375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 93385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 93395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 93405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _zipIdx = 0; 93415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 93425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE: 93435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this function is Moo inspired, but our own impl to deal correctly 93445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // with XML in IE 93455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _nodeUID = d.isIE ? function(node){ 93465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(caseSensitive){ 93475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // XML docs don't have uniqueID on their nodes 93485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (node.getAttribute("_uid") || node.setAttribute("_uid", ++_zipIdx) || _zipIdx); 93495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 93505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 93515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node.uniqueID; 93525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 93535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } : 93545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function(node){ 93555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (node._uid || (node._uid = ++_zipIdx)); 93565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 93575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 93585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // determine if a node in is unique in a "bag". In this case we don't want 93595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to flatten a list of unique items, but rather just tell if the item in 93605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // question is already in the bag. Normally we'd just use hash lookup to do 93615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this for us but IE's DOM is busted so we can't really count on that. On 93625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the upside, it gives us a built in unique ID function. 93635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _isUnique = function(node, bag){ 93645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!bag){ return 1; } 93655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var id = _nodeUID(node); 93665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!bag[id]){ return bag[id] = 1; } 93675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 93685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 93695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 93705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // attempt to efficiently determine if an item in a list is a dupe, 93715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returning a list of "uniques", hopefully in doucment order 93725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _zipIdxName = "_zipIdx"; 93735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _zip = function(arr){ 93745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(arr && arr.nozip){ 93755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (qlc._wrap) ? qlc._wrap(arr) : arr; 93765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 93775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // var ret = new d._NodeListCtor(); 93785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ret = new qlc(); 93795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!arr || !arr.length){ return ret; } 93805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(arr[0]){ 93815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.push(arr[0]); 93825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 93835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(arr.length < 2){ return ret; } 93845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 93855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _zipIdx++; 93865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 93875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we have to fork here for IE and XML docs because we can't set 93885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // expandos on their nodes (apparently). *sigh* 93895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isIE && caseSensitive){ 93905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var szidx = _zipIdx+""; 93915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) arr[0].setAttribute(_zipIdxName, szidx); 93925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var x = 1, te; te = arr[x]; x++){ 93935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(arr[x].getAttribute(_zipIdxName) != szidx){ 93945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.push(te); 93955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 93965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) te.setAttribute(_zipIdxName, szidx); 93975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 93985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(d.isIE && arr.commentStrip){ 93995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 94005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var x = 1, te; te = arr[x]; x++){ 94015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_isElement(te)){ 94025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.push(te); 94035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 94045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 94055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ /* squelch */ } 94065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 94075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(arr[0]){ arr[0][_zipIdxName] = _zipIdx; } 94085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var x = 1, te; te = arr[x]; x++){ 94095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(arr[x][_zipIdxName] != _zipIdx){ 94105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.push(te); 94115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 94125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) te[_zipIdxName] = _zipIdx; 94135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 94145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 94155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; 94165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 94175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 94185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the main executor 94195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.query = function(/*String*/ query, /*String|DOMNode?*/ root){ 94205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 94215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns nodes which match the given CSS3 selector, searching the 94225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // entire document by default but optionally taking a node to scope 94235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the search by. Returns an instance of dojo.NodeList. 94245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 94255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.query() is the swiss army knife of DOM node manipulation in 94265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Dojo. Much like Prototype's "$$" (bling-bling) function or JQuery's 94275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "$" function, dojo.query provides robust, high-performance 94285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // CSS-based node selector support with the option of scoping searches 94295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to a particular sub-tree of a document. 94305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 94315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Supported Selectors: 94325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // -------------------- 94335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 94345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.query() supports a rich set of CSS3 selectors, including: 94355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 94365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * class selectors (e.g., `.foo`) 94375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * node type selectors like `span` 94385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * ` ` descendant selectors 94395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * `>` child element selectors 94405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * `#foo` style ID selectors 94415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * `*` universal selector 94425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * `~`, the preceded-by sibling selector 94435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * `+`, the immediately preceded-by sibling selector 94445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * attribute queries: 94455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * `[foo]` attribute presence selector 94465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * `[foo='bar']` attribute value exact match 94475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * `[foo~='bar']` attribute value list item match 94485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * `[foo^='bar']` attribute start match 94495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * `[foo$='bar']` attribute end match 94505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * `[foo*='bar']` attribute substring match 94515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * `:first-child`, `:last-child`, and `:only-child` positional selectors 94525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * `:empty` content emtpy selector 94535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * `:checked` pseudo selector 94545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * `:nth-child(n)`, `:nth-child(2n+1)` style positional calculations 94555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * `:nth-child(even)`, `:nth-child(odd)` positional selectors 94565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * `:not(...)` negation pseudo selectors 94575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 94585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Any legal combination of these selectors will work with 94595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.query()`, including compound selectors ("," delimited). 94605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Very complex and useful searches can be constructed with this 94615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // palette of selectors and when combined with functions for 94625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // manipulation presented by dojo.NodeList, many types of DOM 94635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // manipulation operations become very straightforward. 94645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 94655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Unsupported Selectors: 94665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ---------------------- 94675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 94685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // While dojo.query handles many CSS3 selectors, some fall outside of 94695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // what's reasonable for a programmatic node querying engine to 94705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handle. Currently unsupported selectors include: 94715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 94725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * namespace-differentiated selectors of any form 94735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * all `::` pseduo-element selectors 94745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * certain pseduo-selectors which don't get a lot of day-to-day use: 94755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * `:root`, `:lang()`, `:target`, `:focus` 94765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * all visual and state selectors: 94775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | * `:root`, `:active`, `:hover`, `:visisted`, `:link`, 94785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `:enabled`, `:disabled` 94795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // * `:*-of-type` pseudo selectors 94805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 94815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.query and XML Documents: 94825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ----------------------------- 94835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 94845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.query` (as of dojo 1.2) supports searching XML documents 94855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in a case-sensitive manner. If an HTML document is served with 94865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a doctype that forces case-sensitivity (e.g., XHTML 1.1 94875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Strict), dojo.query() will detect this and "do the right 94885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // thing". Case sensitivity is dependent upon the document being 94895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // searched and not the query used. It is therefore possible to 94905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // use case-sensitive queries on strict sub-documents (iframes, 94915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // etc.) or XML documents while still assuming case-insensitivity 94925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for a host/root document. 94935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 94945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Non-selector Queries: 94955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // --------------------- 94965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 94975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If something other than a String is passed for the query, 94985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.query` will return a new `dojo.NodeList` instance 94995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // constructed from that parameter alone and all further 95005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // processing will stop. This means that if you have a reference 95015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to a node or NodeList, you can quickly construct a new NodeList 95025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // from the original by calling `dojo.query(node)` or 95035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.query(list)`. 95045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 95055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // query: 95065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The CSS3 expression to match against. For details on the syntax of 95075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // CSS3 selectors, see <http://www.w3.org/TR/css3-selectors/#selectors> 95085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // root: 95095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A DOMNode (or node id) to scope the search from. Optional. 95105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: dojo.NodeList 95115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An instance of `dojo.NodeList`. Many methods are available on 95125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NodeLists for searching, iterating, manipulating, and handling 95135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // events on the matched nodes in the returned list. 95145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 95155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // search the entire document for elements with the class "foo": 95165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".foo"); 95175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // these elements will match: 95185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <span class="foo"></span> 95195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <span class="foo bar"></span> 95205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <p class="thud foo"></p> 95215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 95225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // search the entire document for elements with the classes "foo" *and* "bar": 95235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query(".foo.bar"); 95245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // these elements will match: 95255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <span class="foo bar"></span> 95265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // while these will not: 95275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <span class="foo"></span> 95285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <p class="thud foo"></p> 95295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 95305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // find `<span>` elements which are descendants of paragraphs and 95315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // which have a "highlighted" class: 95325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("p span.highlighted"); 95335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the innermost span in this fragment matches: 95345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <p class="foo"> 95355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <span>... 95365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <span class="highlighted foo bar">...</span> 95375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | </span> 95385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | </p> 95395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 95405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // set an "odd" class on all odd table rows inside of the table 95415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `#tabular_data`, using the `>` (direct child) selector to avoid 95425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // affecting any nested tables: 95435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("#tabular_data > tbody > tr:nth-child(odd)").addClass("odd"); 95445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 95455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // remove all elements with the class "error" from the document 95465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and store them in a list: 95475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var errors = dojo.query(".error").orphan(); 95485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 95495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add an onclick handler to every submit button in the document 95505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // which causes the form to be sent via Ajax instead: 95515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.query("input[type='submit']").onclick(function(e){ 95525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.stopEvent(e); // prevent sending the form 95535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var btn = e.target; 95545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.xhrPost({ 95555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | form: btn.form, 95565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | load: function(data){ 95575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // replace the form with the response 95585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var div = dojo.doc.createElement("div"); 95595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.place(div, btn.form, "after"); 95605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | div.innerHTML = data; 95615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.style(btn.form, "display", "none"); 95625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 95635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 95645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 95655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 95665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Set list constructor to desired value. This can change 95675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //between calls, so always re-assign here. 95685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) qlc = d._NodeListCtor; 95695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 95705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!query){ 95715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return new qlc(); 95725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 95735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 95745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(query.constructor == qlc){ 95755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return query; 95765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 95775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof query != "string"){ // inline'd type check 95785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return new qlc(query); // dojo.NodeList 95795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 95805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof root == "string"){ // inline'd type check 95815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) root = d.byId(root); 95825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!root){ return new qlc(); } 95835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 95845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 95855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) root = root||getDoc(); 95865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var od = root.ownerDocument||root.documentElement; 95875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 95885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // throw the big case sensitivity switch 95895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 95905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE: 95915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Opera in XHTML mode doesn't detect case-sensitivity correctly 95925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and it's not clear that there's any way to test for it 95935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) caseSensitive = (root.contentType && root.contentType=="application/xml") || 95945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (d.isOpera && (root.doctype || od.toString() == "[object XMLDocument]")) || 95955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (!!od) && 95965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (d.isIE ? od.xml : (root.xmlVersion||od.xmlVersion)); 95975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 95985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE: 95995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // adding "true" as the 2nd argument to getQueryFunc is useful for 96005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // testing the DOM branch without worrying about the 96015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // behavior/performance of the QSA branch. 96025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var r = getQueryFunc(query)(root); 96035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: 96055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // need to investigate this branch WRT #8074 and #8075 96065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(r && r.nozip && !qlc._wrap){ 96075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return r; 96085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 96095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _zip(r); // dojo.NodeList 96105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 96115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: need to add infrastructure for post-filtering pseudos, ala :last 96135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.query.pseudos = pseudos; 96145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // function for filtering a NodeList based on a selector, optimized for simple selectors 96165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._filterQueryResult = function(/*NodeList*/ nodeList, /*String*/ filter, /*String|DOMNode?*/ root){ 96175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tmpNodeList = new d._NodeListCtor(), 96185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parts = getQueryParts(filter), 96195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) filterFunc = 96205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (parts.length == 1 && !/[^\w#\.]/.test(filter)) ? 96215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) getSimpleFilterFunc(parts[0]) : 96225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function(node) { 96235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dojo.query(filter, root).indexOf(node) != -1; 96245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 96255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var x = 0, te; te = nodeList[x]; x++){ 96265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(filterFunc(te)){ tmpNodeList.push(te); } 96275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 96285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return tmpNodeList; 96295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 96305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};//end defineQuery 96315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var defineAcme= function(){ 96335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a self-sufficient query impl 96345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) acme = { 96355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) trim: function(/*String*/ str){ 96365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 96375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // trims whitespaces from both sides of the string 96385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) str = str.replace(/^\s+/, ''); 96395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = str.length - 1; i >= 0; i--){ 96405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(/\S/.test(str.charAt(i))){ 96415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) str = str.substring(0, i + 1); 96425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 96435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 96445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 96455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return str; // String 96465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 96475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) forEach: function(/*String*/ arr, /*Function*/ callback, /*Object?*/ thisObject){ 96485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 96495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an iterator function that passes items, indexes, 96505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and the array to a callback 96515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!arr || !arr.length){ return; } 96525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i=0,l=arr.length; i<l; ++i){ 96535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) callback.call(thisObject||window, arr[i], i, arr); 96545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 96555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 96565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) byId: function(id, doc){ 96575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 96585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a function that return an element by ID, but also 96595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // accepts nodes safely 96605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof id == "string"){ 96615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (doc||document).getElementById(id); // DomNode 96625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 96635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return id; // DomNode 96645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 96655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 96665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the default document to search 96675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) doc: document, 96685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the constructor for node list objects returned from query() 96695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeList: Array 96705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 96715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // define acme.isIE, acme.isSafari, acme.isOpera, etc. 96735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var n = navigator; 96745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var dua = n.userAgent; 96755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var dav = n.appVersion; 96765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var tv = parseFloat(dav); 96775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) acme.isOpera = (dua.indexOf("Opera") >= 0) ? tv: undefined; 96785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) acme.isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : undefined; 96795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) acme.isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined; 96805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) acme.isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined; 96815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0); 96825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(index && !acme.isChrome){ 96835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) acme.isSafari = parseFloat(dav.split("Version/")[1]); 96845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!acme.isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){ 96855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) acme.isSafari = 2; 96865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 96875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 96885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(document.all && !acme.isOpera){ 96895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) acme.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined; 96905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 96915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Array._wrap = function(arr){ return arr; }; 96935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return acme; 96945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 96955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //prefers queryPortability, then acme, then dojo 96975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(this["dojo"]){ 96985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.provide("dojo._base.query"); 96995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) defineQuery(this["queryPortability"]||this["acme"]||dojo); 97025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 97035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) defineQuery(this["queryPortability"]||this["acme"]||defineAcme()); 97045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 97055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 97075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 97095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/ 97105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 97125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.xhr"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 97145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.xhr"] = true; 97155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.xhr"); 97165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 97235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _d = dojo, cfg = _d.config; 97245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function setValue(/*Object*/obj, /*String*/name, /*String*/value){ 97265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //summary: 97275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For the named property in object, set the value. If a value 97285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // already exists and it is a string, convert the value to be an 97295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // array of values. 97305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Skip it if there is no value 97325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(value === null){ 97335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 97345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 97355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var val = obj[name]; 97375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof val == "string"){ // inline'd type check 97385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) obj[name] = [val, value]; 97395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(_d.isArray(val)){ 97405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) val.push(value); 97415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 97425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) obj[name] = value; 97435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 97445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 97455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.fieldToObject = function(/*DOMNode||String*/ inputNode){ 97475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 97485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Serialize a form field to a JavaScript object. 97495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 97505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 97515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the value encoded in a form field as 97525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // as a string or an array of strings. Disabled form elements 97535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and unchecked radio and checkboxes are skipped. Multi-select 97545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // elements are returned as an array of string values. 97555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ret = null; 97565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var item = _d.byId(inputNode); 97575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(item){ 97585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _in = item.name; 97595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var type = (item.type||"").toLowerCase(); 97605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_in && type && !item.disabled){ 97615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(type == "radio" || type == "checkbox"){ 97625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(item.checked){ ret = item.value; } 97635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(item.multiple){ 97645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret = []; 97655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d.query("option", item).forEach(function(opt){ 97665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(opt.selected){ 97675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret.push(opt.value); 97685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 97695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 97705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 97715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret = item.value; 97725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 97735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 97745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 97755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; // Object 97765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 97775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.formToObject = function(/*DOMNode||String*/ formNode){ 97795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 97805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Serialize a form node to a JavaScript object. 97815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 97825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the values encoded in an HTML form as 97835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // string properties in an object which it then returns. Disabled form 97845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // elements, buttons, and other non-value form elements are skipped. 97855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Multi-select elements are returned as an array of string values. 97865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 97875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 97885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This form: 97895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <form id="test_form"> 97905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <input type="text" name="blah" value="blah"> 97915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <input type="text" name="no_value" value="blah" disabled> 97925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <input type="button" name="no_value2" value="blah"> 97935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <select type="select" multiple name="multi" size="5"> 97945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <option value="blah">blah</option> 97955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <option value="thud" selected>thud</option> 97965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | <option value="thonk" selected>thonk</option> 97975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | </select> 97985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | </form> 97995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 98005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // yields this object structure as the result of a call to 98015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // formToObject(): 98025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 98035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | { 98045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | blah: "blah", 98055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | multi: [ 98065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "thud", 98075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "thonk" 98085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ] 98095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }; 98105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 98115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ret = {}; 98125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var exclude = "file|submit|image|reset|button|"; 98135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d.forEach(dojo.byId(formNode).elements, function(item){ 98145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _in = item.name; 98155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var type = (item.type||"").toLowerCase(); 98165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_in && type && exclude.indexOf(type) == -1 && !item.disabled){ 98175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setValue(ret, _in, _d.fieldToObject(item)); 98185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(type == "image"){ 98195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret[_in+".x"] = ret[_in+".y"] = ret[_in].x = ret[_in].y = 0; 98205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 98215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 98225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 98235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; // Object 98245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 98255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 98265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.objectToQuery = function(/*Object*/ map){ 98275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 98285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // takes a name/value mapping object and returns a string representing 98295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a URL-encoded version of that object. 98305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 98315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this object: 98325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 98335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | { 98345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | blah: "blah", 98355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | multi: [ 98365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "thud", 98375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "thonk" 98385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | ] 98395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }; 98405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 98415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // yields the following query string: 98425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 98435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "blah=blah&multi=thud&multi=thonk" 98445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 98455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: need to implement encodeAscii!! 98465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var enc = encodeURIComponent; 98475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var pairs = []; 98485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var backstop = {}; 98495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var name in map){ 98505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var value = map[name]; 98515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(value != backstop[name]){ 98525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var assign = enc(name) + "="; 98535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_d.isArray(value)){ 98545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i=0; i < value.length; i++){ 98555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pairs.push(assign + enc(value[i])); 98565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 98575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 98585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pairs.push(assign + enc(value)); 98595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 98605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 98615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 98625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return pairs.join("&"); // String 98635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 98645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 98655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.formToQuery = function(/*DOMNode||String*/ formNode){ 98665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 98675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a URL-encoded string representing the form passed as either a 98685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node or string ID identifying the form to serialize 98695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _d.objectToQuery(_d.formToObject(formNode)); // String 98705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 98715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 98725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.formToJson = function(/*DOMNode||String*/ formNode, /*Boolean?*/prettyPrint){ 98735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 98745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create a serialized JSON string from a form node or string 98755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ID identifying the form to serialize 98765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _d.toJson(_d.formToObject(formNode), prettyPrint); // String 98775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 98785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 98795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.queryToObject = function(/*String*/ str){ 98805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 98815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create an object representing a de-serialized query section of a 98825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // URL. Query keys with multiple values are returned in an array. 98835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 98845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 98855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This string: 98865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 98875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&" 98885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 98895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // results in this object structure: 98905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 98915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | { 98925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | foo: [ "bar", "baz" ], 98935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | thinger: " spaces =blah", 98945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | zonk: "blarg" 98955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 98965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 98975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note that spaces and other urlencoded entities are correctly 98985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handled. 98995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 99005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: should we grab the URL string if we're not passed one? 99015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ret = {}; 99025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var qp = str.split("&"); 99035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var dec = decodeURIComponent; 99045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d.forEach(qp, function(item){ 99055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(item.length){ 99065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var parts = item.split("="); 99075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var name = dec(parts.shift()); 99085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var val = dec(parts.join("=")); 99095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(typeof ret[name] == "string"){ // inline'd type check 99105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret[name] = [ret[name]]; 99115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 99125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 99135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_d.isArray(ret[name])){ 99145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret[name].push(val); 99155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 99165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret[name] = val; 99175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 99185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 99195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 99205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; // Object 99215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 99225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 99235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // need to block async callbacks from snatching this thread as the result 99245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of an async callback might call another sync XHR, this hangs khtml forever 99255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // must checked by watchInFlight() 99265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 99275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._blockAsync = false; 99285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 99295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // MOW: remove dojo._contentHandlers alias in 2.0 99305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var handlers = _d._contentHandlers = dojo.contentHandlers = { 99315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 99325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A map of availble XHR transport handle types. Name matches the 99335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `handleAs` attribute passed to XHR calls. 99345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 99355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 99365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A map of availble XHR transport handle types. Name matches the 99375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `handleAs` attribute passed to XHR calls. Each contentHandler is 99385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // called, passing the xhr object for manipulation. The return value 99395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // from the contentHandler will be passed to the `load` or `handle` 99405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // functions defined in the original xhr call. 99415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 99425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 99435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Creating a custom content-handler: 99445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.contentHandlers.makeCaps = function(xhr){ 99455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return xhr.responseText.toUpperCase(); 99465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 99475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // and later: 99485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.xhrGet({ 99495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | url:"foo.txt", 99505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | handleAs:"makeCaps", 99515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | load: function(data){ /* data is a toUpper version of foo.txt */ } 99525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 99535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 99545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) text: function(xhr){ 99555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: A contentHandler which simply returns the plaintext response data 99565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return xhr.responseText; 99575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 99585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) json: function(xhr){ 99595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: A contentHandler which returns a JavaScript object created from the response data 99605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _d.fromJson(xhr.responseText || null); 99615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 99625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "json-comment-filtered": function(xhr){ 99635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: A contentHandler which expects comment-filtered JSON. 99645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 99655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A contentHandler which expects comment-filtered JSON. 99665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the json-comment-filtered option was implemented to prevent 99675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "JavaScript Hijacking", but it is less secure than standard JSON. Use 99685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // standard JSON instead. JSON prefixing can be used to subvert hijacking. 99695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 99705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Will throw a notice suggesting to use application/json mimetype, as 99715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // json-commenting can introduce security issues. To decrease the chances of hijacking, 99725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // use the standard `json` contentHandler, and prefix your "JSON" with: {}&& 99735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 99745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // use djConfig.useCommentedJson = true to turn off the notice 99755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!dojo.config.useCommentedJson){ 99765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) console.warn("Consider using the standard mimetype:application/json." 99775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) + " json-commenting can introduce security issues. To" 99785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) + " decrease the chances of hijacking, use the standard the 'json' handler and" 99795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) + " prefix your json with: {}&&\n" 99805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) + "Use djConfig.useCommentedJson=true to turn off this message."); 99815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 99825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 99835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var value = xhr.responseText; 99845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cStartIdx = value.indexOf("\/*"); 99855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var cEndIdx = value.lastIndexOf("*\/"); 99865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cStartIdx == -1 || cEndIdx == -1){ 99875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw new Error("JSON was not comment filtered"); 99885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 99895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _d.fromJson(value.substring(cStartIdx+2, cEndIdx)); 99905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 99915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) javascript: function(xhr){ 99925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: A contentHandler which evaluates the response data, expecting it to be valid JavaScript 99935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 99945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: try Moz and IE specific eval variants? 99955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _d.eval(xhr.responseText); 99965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 99975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xml: function(xhr){ 99985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: A contentHandler returning an XML Document parsed from the response data 99995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = xhr.responseXML; 100005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_d.isIE && (!result || !result.documentElement)){ 100015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //WARNING: this branch used by the xml handling in dojo.io.iframe, 100025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //so be sure to test dojo.io.iframe if making changes below. 100035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ms = function(n){ return "MSXML" + n + ".DOMDocument"; }; 100045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var dp = ["Microsoft.XMLDOM", ms(6), ms(4), ms(3), ms(2)]; 100055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d.some(dp, function(p){ 100065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 100075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var dom = new ActiveXObject(p); 100085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dom.async = false; 100095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dom.loadXML(xhr.responseText); 100105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result = dom; 100115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ return false; } 100125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 100135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 100145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 100155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; // DOMDocument 100165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 100175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "json-comment-optional": function(xhr){ 100185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: A contentHandler which checks the presence of comment-filtered JSON and 100195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // alternates between the `json` and `json-comment-filtered` contentHandlers. 100205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(xhr.responseText && /^[^{\[]*\/\*/.test(xhr.responseText)){ 100215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return handlers["json-comment-filtered"](xhr); 100225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 100235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return handlers["json"](xhr); 100245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 100255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 100265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 100275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 100285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 100295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.__IoArgs = function(){ 100305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // url: String 100315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // URL to server endpoint. 100325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // content: Object? 100335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Contains properties with string values. These 100345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // properties will be serialized as name1=value2 and 100355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // passed in the request. 100365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // timeout: Integer? 100375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Milliseconds to wait for the response. If this time 100385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // passes, the then error callbacks are called. 100395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // form: DOMNode? 100405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM node for a form. Used to extract the form values 100415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and send to the server. 100425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // preventCache: Boolean? 100435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Default is false. If true, then a 100445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "dojo.preventCache" parameter is sent in the request 100455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // with a value that changes with each request 100465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (timestamp). Useful only with GET-type requests. 100475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handleAs: String? 100485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Acceptable values depend on the type of IO 100495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // transport (see specific IO calls for more information). 100505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // rawBody: String? 100515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sets the raw body for an HTTP request. If this is used, then the content 100525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // property is ignored. This is mostly useful for HTTP methods that have 100535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a body to their requests, like PUT or POST. This property can be used instead 100545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of postData and putData for dojo.rawXhrPost and dojo.rawXhrPut respectively. 100555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ioPublish: Boolean? 100565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Set this explicitly to false to prevent publishing of topics related to 100575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // IO operations. Otherwise, if djConfig.ioPublish is set to true, topics 100585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will be published via dojo.publish for different phases of an IO operation. 100595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See dojo.__IoPublish for a list of topics that are published. 100605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // load: Function? 100615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function will be 100625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // called on a successful HTTP response code. 100635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // error: Function? 100645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function will 100655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be called when the request fails due to a network or server error, the url 100665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is invalid, etc. It will also be called if the load or handle callback throws an 100675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // exception, unless djConfig.debugAtAllCosts is true. This allows deployed applications 100685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to continue to run even when a logic error happens in the callback, while making 100695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it easier to troubleshoot while in debug mode. 100705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handle: Function? 100715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function will 100725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be called at the end of every request, whether or not an error occurs. 100735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.url = url; 100745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.content = content; 100755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.timeout = timeout; 100765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.form = form; 100775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.preventCache = preventCache; 100785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.handleAs = handleAs; 100795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.ioPublish = ioPublish; 100805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.load = function(response, ioArgs){ 100815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ioArgs: dojo.__IoCallbackArgs 100825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Provides additional information about the request. 100835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // response: Object 100845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The response in the format as defined with handleAs. 100855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 100865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.error = function(response, ioArgs){ 100875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ioArgs: dojo.__IoCallbackArgs 100885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Provides additional information about the request. 100895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // response: Object 100905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The response in the format as defined with handleAs. 100915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 100925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.handle = function(loadOrError, response, ioArgs){ 100935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // loadOrError: String 100945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Provides a string that tells you whether this function 100955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // was called because of success (load) or failure (error). 100965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // response: Object 100975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The response in the format as defined with handleAs. 100985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ioArgs: dojo.__IoCallbackArgs 100995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Provides additional information about the request. 101005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 101015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 101025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 101035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 101045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 101055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.__IoCallbackArgs = function(args, xhr, url, query, handleAs, id, canDelete, json){ 101065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // args: Object 101075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the original object argument to the IO call. 101085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // xhr: XMLHttpRequest 101095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For XMLHttpRequest calls only, the 101105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // XMLHttpRequest object that was used for the 101115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // request. 101125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // url: String 101135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The final URL used for the call. Many times it 101145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will be different than the original args.url 101155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // value. 101165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // query: String 101175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For non-GET requests, the 101185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // name1=value1&name2=value2 parameters sent up in 101195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the request. 101205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handleAs: String 101215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The final indicator on how the response will be 101225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handled. 101235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // id: String 101245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For dojo.io.script calls only, the internal 101255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // script ID used for the request. 101265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // canDelete: Boolean 101275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For dojo.io.script calls only, indicates 101285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // whether the script tag that represents the 101295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // request can be deleted after callbacks have 101305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // been called. Used internally to know when 101315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // cleanup can happen on JSONP-type requests. 101325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // json: Object 101335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For dojo.io.script calls only: holds the JSON 101345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // response for JSONP-type requests. Used 101355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // internally to hold on to the JSON responses. 101365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // You should not need to access it directly -- 101375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the same object should be passed to the success 101385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // callbacks directly. 101395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.args = args; 101405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.xhr = xhr; 101415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.url = url; 101425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.query = query; 101435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.handleAs = handleAs; 101445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.id = id; 101455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.canDelete = canDelete; 101465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.json = json; 101475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 101485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 101495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 101505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 101515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 101525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.__IoPublish = function(){ 101535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 101545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This is a list of IO topics that can be published 101555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if djConfig.ioPublish is set to true. IO topics can be 101565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // published for any Input/Output, network operation. So, 101575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.xhr, dojo.io.script and dojo.io.iframe can all 101585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // trigger these topics to be published. 101595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // start: String 101605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "/dojo/io/start" is sent when there are no outstanding IO 101615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // requests, and a new IO request is started. No arguments 101625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // are passed with this topic. 101635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // send: String 101645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "/dojo/io/send" is sent whenever a new IO request is started. 101655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It passes the dojo.Deferred for the request with the topic. 101665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // load: String 101675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "/dojo/io/load" is sent whenever an IO request has loaded 101685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // successfully. It passes the response and the dojo.Deferred 101695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for the request with the topic. 101705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // error: String 101715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "/dojo/io/error" is sent whenever an IO request has errored. 101725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It passes the error and the dojo.Deferred 101735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for the request with the topic. 101745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // done: String 101755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "/dojo/io/done" is sent whenever an IO request has completed, 101765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // either by loading or by erroring. It passes the error and 101775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the dojo.Deferred for the request with the topic. 101785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // stop: String 101795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // "/dojo/io/stop" is sent when all outstanding IO requests have 101805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // finished. No arguments are passed with this topic. 101815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.start = "/dojo/io/start"; 101825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.send = "/dojo/io/send"; 101835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.load = "/dojo/io/load"; 101845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.error = "/dojo/io/error"; 101855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.done = "/dojo/io/done"; 101865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.stop = "/dojo/io/stop"; 101875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 101885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 101895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 101905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 101915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._ioSetArgs = function(/*dojo.__IoArgs*/args, 101925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Function*/canceller, 101935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Function*/okHandler, 101945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Function*/errHandler){ 101955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 101965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sets up the Deferred and ioArgs property on the Deferred so it 101975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can be used in an io call. 101985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // args: 101995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The args object passed into the public io call. Recognized properties on 102005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the args object are: 102015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // canceller: 102025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The canceller function used for the Deferred object. The function 102035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // will receive one argument, the Deferred object that is related to the 102045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // canceller. 102055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // okHandler: 102065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The first OK callback to be registered with Deferred. It has the opportunity 102075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to transform the OK response. It will receive one argument -- the Deferred 102085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // object returned from this function. 102095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // errHandler: 102105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The first error callback to be registered with Deferred. It has the opportunity 102115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to do cleanup on an error. It will receive two arguments: error (the 102125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Error object) and dfd, the Deferred object returned from this function. 102135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ioArgs = {args: args, url: args.url}; 102155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Get values from form if requestd. 102175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var formObject = null; 102185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(args.form){ 102195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var form = _d.byId(args.form); 102205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //IE requires going through getAttributeNode instead of just getAttribute in some form cases, 102215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //so use it for all. See #2844 102225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var actnNode = form.getAttributeNode("action"); 102235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null); 102245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) formObject = _d.formToObject(form); 102255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 102265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // set up the query params 102285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var miArgs = [{}]; 102295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(formObject){ 102315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // potentially over-ride url-provided params w/ form values 102325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) miArgs.push(formObject); 102335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 102345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(args.content){ 102355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // stuff in content over-rides what's set by form 102365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) miArgs.push(args.content); 102375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 102385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(args.preventCache){ 102395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) miArgs.push({"dojo.preventCache": new Date().valueOf()}); 102405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 102415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ioArgs.query = _d.objectToQuery(_d.mixin.apply(null, miArgs)); 102425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // .. and the real work of getting the deferred in order, etc. 102445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ioArgs.handleAs = args.handleAs || "text"; 102455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var d = new _d.Deferred(canceller); 102465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.addCallbacks(okHandler, function(error){ 102475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return errHandler(error, d); 102485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 102495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Support specifying load, error and handle callback functions from the args. 102515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //For those callbacks, the "this" object will be the args object. 102525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //The callbacks will get the deferred result value as the 102535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //first argument and the ioArgs object as the second argument. 102545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ld = args.load; 102555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(ld && _d.isFunction(ld)){ 102565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.addCallback(function(value){ 102575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ld.call(args, value, ioArgs); 102585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 102595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 102605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var err = args.error; 102615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(err && _d.isFunction(err)){ 102625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.addErrback(function(value){ 102635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return err.call(args, value, ioArgs); 102645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 102655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 102665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var handle = args.handle; 102675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(handle && _d.isFunction(handle)){ 102685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.addBoth(function(value){ 102695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return handle.call(args, value, ioArgs); 102705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 102715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 102725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Plug in topic publishing, if dojo.publish is loaded. 102745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cfg.ioPublish && _d.publish && ioArgs.args.ioPublish !== false){ 102755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.addCallbacks( 102765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function(res){ 102775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d.publish("/dojo/io/load", [d, res]); 102785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return res; 102795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 102805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function(res){ 102815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d.publish("/dojo/io/error", [d, res]); 102825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return res; 102835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 102845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ); 102855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.addBoth(function(res){ 102865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d.publish("/dojo/io/done", [d, res]); 102875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return res; 102885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 102895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 102905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.ioArgs = ioArgs; 102925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: need to wire up the xhr object's abort method to something 102945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // analagous in the Deferred 102955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d; 102965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 102975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _deferredCancel = function(/*Deferred*/dfd){ 102995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: canceller function for dojo._ioSetArgs call. 103005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dfd.canceled = true; 103025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var xhr = dfd.ioArgs.xhr; 103035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _at = typeof xhr.abort; 103045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_at == "function" || _at == "object" || _at == "unknown"){ 103055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xhr.abort(); 103065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 103075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var err = dfd.ioArgs.error; 103085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!err){ 103095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err = new Error("xhr cancelled"); 103105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err.dojoType="cancel"; 103115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 103125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return err; 103135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 103145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _deferredOk = function(/*Deferred*/dfd){ 103155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: okHandler function for dojo._ioSetArgs call. 103165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ret = handlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr); 103185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret === undefined ? null : ret; 103195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 103205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _deferError = function(/*Error*/error, /*Deferred*/dfd){ 103215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: errHandler function for dojo._ioSetArgs call. 103225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!dfd.ioArgs.args.failOk){ 103245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) console.error(error); 103255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 103265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return error; 103275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 103285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // avoid setting a timer per request. It degrades performance on IE 103305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // something fierece if we don't use unified loops. 103315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _inFlightIntvl = null; 103325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _inFlight = []; 103335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Use a separate count for knowing if we are starting/stopping io calls. 103365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Cannot use _inFlight.length since it can change at a different time than 103375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //when we want to do this kind of test. We only want to decrement the count 103385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //after a callback/errback has finished, since the callback/errback should be 103395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //considered as part of finishing a request. 103405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _pubCount = 0; 103415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _checkPubCount = function(dfd){ 103425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_pubCount <= 0){ 103435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _pubCount = 0; 103445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cfg.ioPublish && _d.publish && (!dfd || dfd && dfd.ioArgs.args.ioPublish !== false)){ 103455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d.publish("/dojo/io/stop"); 103465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 103475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 103485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 103495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _watchInFlight = function(){ 103515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //summary: 103525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // internal method that checks each inflight XMLHttpRequest to see 103535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if it has completed or if the timeout situation applies. 103545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var now = (new Date()).getTime(); 103565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // make sure sync calls stay thread safe, if this callback is called 103575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // during a sync call and this results in another sync call before the 103585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // first sync call ends the browser hangs 103595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_d._blockAsync){ 103605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we need manual loop because we often modify _inFlight (and therefore 'i') while iterating 103615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // note: the second clause is an assigment on purpose, lint may complain 103625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var i = 0, tif; i < _inFlight.length && (tif = _inFlight[i]); i++){ 103635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var dfd = tif.dfd; 103645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var func = function(){ 103655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!dfd || dfd.canceled || !tif.validCheck(dfd)){ 103665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _inFlight.splice(i--, 1); 103675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _pubCount -= 1; 103685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(tif.ioCheck(dfd)){ 103695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _inFlight.splice(i--, 1); 103705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) tif.resHandle(dfd); 103715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _pubCount -= 1; 103725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(dfd.startTime){ 103735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //did we timeout? 103745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dfd.startTime + (dfd.ioArgs.args.timeout || 0) < now){ 103755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _inFlight.splice(i--, 1); 103765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var err = new Error("timeout exceeded"); 103775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err.dojoType = "timeout"; 103785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dfd.errback(err); 103795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Cancel the request so the io module can do appropriate cleanup. 103805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dfd.cancel(); 103815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _pubCount -= 1; 103825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 103835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 103845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 103855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.config.debugAtAllCosts){ 103865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) func.call(this); 103875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 103885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 103895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) func.call(this); 103905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 103915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dfd.errback(e); 103925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 103935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 103945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 103955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 103965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _checkPubCount(dfd); 103985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_inFlight.length){ 104005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearInterval(_inFlightIntvl); 104015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _inFlightIntvl = null; 104025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 104035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 104045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 104055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 104065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._ioCancelAll = function(){ 104075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //summary: Cancels all pending IO requests, regardless of IO type 104085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //(xhr, script, iframe). 104095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 104105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d.forEach(_inFlight, function(i){ 104115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 104125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) i.dfd.cancel(); 104135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){/*squelch*/} 104145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 104155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){/*squelch*/} 104165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 104175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 104185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Automatically call cancel all io calls on unload 104195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //in IE for trac issue #2357. 104205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_d.isIE){ 104215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d.addOnWindowUnload(_d._ioCancelAll); 104225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 104235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 104245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d._ioNotifyStart = function(/*Deferred*/dfd){ 104255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 104265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If dojo.publish is available, publish topics 104275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // about the start of a request queue and/or the 104285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the beginning of request. 104295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 104305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Used by IO transports. An IO transport should 104315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // call this method before making the network connection. 104325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(cfg.ioPublish && _d.publish && dfd.ioArgs.args.ioPublish !== false){ 104335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_pubCount){ 104345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d.publish("/dojo/io/start"); 104355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 104365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _pubCount += 1; 104375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d.publish("/dojo/io/send", [dfd]); 104385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 104395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 104405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 104415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d._ioWatch = function(dfd, validCheck, ioCheck, resHandle){ 104425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 104435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Watches the io request represented by dfd to see if it completes. 104445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dfd: Deferred 104455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The Deferred object to watch. 104465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // validCheck: Function 104475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Function used to check if the IO request is still valid. Gets the dfd 104485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // object as its only argument. 104495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ioCheck: Function 104505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Function used to check if basic IO call worked. Gets the dfd 104515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // object as its only argument. 104525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // resHandle: Function 104535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Function used to process response. Gets the dfd 104545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // object as its only argument. 104555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var args = dfd.ioArgs.args; 104565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(args.timeout){ 104575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dfd.startTime = (new Date()).getTime(); 104585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 104595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 104605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _inFlight.push({dfd: dfd, validCheck: validCheck, ioCheck: ioCheck, resHandle: resHandle}); 104615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_inFlightIntvl){ 104625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _inFlightIntvl = setInterval(_watchInFlight, 50); 104635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 104645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handle sync requests 104655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //A weakness: async calls in flight 104665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //could have their handlers called as part of the 104675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //_watchInFlight call, before the sync's callbacks 104685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // are called. 104695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(args.sync){ 104705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _watchInFlight(); 104715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 104725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 104735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 104745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _defaultContentType = "application/x-www-form-urlencoded"; 104755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 104765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _validCheck = function(/*Deferred*/dfd){ 104775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dfd.ioArgs.xhr.readyState; //boolean 104785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 104795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _ioCheck = function(/*Deferred*/dfd){ 104805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 4 == dfd.ioArgs.xhr.readyState; //boolean 104815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 104825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _resHandle = function(/*Deferred*/dfd){ 104835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var xhr = dfd.ioArgs.xhr; 104845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_d._isDocumentOk(xhr)){ 104855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dfd.callback(dfd); 104865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 104875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var err = new Error("Unable to load " + dfd.ioArgs.url + " status:" + xhr.status); 104885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err.status = xhr.status; 104895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) err.responseText = xhr.responseText; 104905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dfd.errback(err); 104915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 104925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 104935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 104945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._ioAddQueryToUrl = function(/*dojo.__IoCallbackArgs*/ioArgs){ 104955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //summary: Adds query params discovered by the io deferred construction to the URL. 104965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Only use this for operations which are fundamentally GET-type operations. 104975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(ioArgs.query.length){ 104985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ioArgs.url += (ioArgs.url.indexOf("?") == -1 ? "?" : "&") + ioArgs.query; 104995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ioArgs.query = null; 105005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 105015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 105025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 105035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 105045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.declare("dojo.__XhrArgs", dojo.__IoArgs, { 105055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) constructor: function(){ 105065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 105075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In addition to the properties listed for the dojo._IoArgs type, 105085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the following properties are allowed for dojo.xhr* methods. 105095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handleAs: String? 105105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Acceptable values are: text (default), json, json-comment-optional, 105115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // json-comment-filtered, javascript, xml. See `dojo.contentHandlers` 105125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sync: Boolean? 105135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // false is default. Indicates whether the request should 105145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be a synchronous (blocking) request. 105155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // headers: Object? 105165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Additional HTTP headers to send in the request. 105175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // failOk: Boolean? 105185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // false is default. Indicates whether a request should be 105195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // allowed to fail (and therefore no console error message in 105205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the event of a failure) 105215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.handleAs = handleAs; 105225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.sync = sync; 105235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.headers = headers; 105245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.failOk = failOk; 105255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 105265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 105275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 105285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 105295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.xhr = function(/*String*/ method, /*dojo.__XhrArgs*/ args, /*Boolean?*/ hasBody){ 105305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 105315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sends an HTTP request with the given method. 105325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 105335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sends an HTTP request with the given method. 105345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See also dojo.xhrGet(), xhrPost(), xhrPut() and dojo.xhrDelete() for shortcuts 105355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for those HTTP methods. There are also methods for "raw" PUT and POST methods 105365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // via dojo.rawXhrPut() and dojo.rawXhrPost() respectively. 105375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // method: 105385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // HTTP method to be used, such as GET, POST, PUT, DELETE. Should be uppercase. 105395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // hasBody: 105405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the request has an HTTP body, then pass true for hasBody. 105415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 105425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Make the Deferred object for this xhr request. 105435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var dfd = _d._ioSetArgs(args, _deferredCancel, _deferredOk, _deferError); 105445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ioArgs = dfd.ioArgs; 105455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 105465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Pass the args to _xhrObj, to allow alternate XHR calls based specific calls, like 105475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //the one used for iframe proxies. 105485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var xhr = ioArgs.xhr = _d._xhrObj(ioArgs.args); 105495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //If XHR factory fails, cancel the deferred. 105505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!xhr){ 105515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dfd.cancel(); 105525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dfd; 105535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 105545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 105555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Allow for specifying the HTTP body completely. 105565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if("postData" in args){ 105575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ioArgs.query = args.postData; 105585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if("putData" in args){ 105595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ioArgs.query = args.putData; 105605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if("rawBody" in args){ 105615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ioArgs.query = args.rawBody; 105625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if((arguments.length > 2 && !hasBody) || "POST|PUT".indexOf(method.toUpperCase()) == -1){ 105635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Check for hasBody being passed. If no hasBody, 105645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //then only append query string if not a POST or PUT request. 105655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d._ioAddQueryToUrl(ioArgs); 105665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 105675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 105685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // IE 6 is a steaming pile. It won't let you call apply() on the native function (xhr.open). 105695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // workaround for IE6's apply() "issues" 105705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xhr.open(method, ioArgs.url, args.sync !== true, args.user || undefined, args.password || undefined); 105715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(args.headers){ 105725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var hdr in args.headers){ 105735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(hdr.toLowerCase() === "content-type" && !args.contentType){ 105745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) args.contentType = args.headers[hdr]; 105755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(args.headers[hdr]){ 105765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Only add header if it has a value. This allows for instnace, skipping 105775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //insertion of X-Requested-With by specifying empty value. 105785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xhr.setRequestHeader(hdr, args.headers[hdr]); 105795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 105805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 105815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 105825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: is this appropriate for all content types? 105835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xhr.setRequestHeader("Content-Type", args.contentType || _defaultContentType); 105845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!args.headers || !("X-Requested-With" in args.headers)){ 105855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 105865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 105875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: set other headers here! 105885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d._ioNotifyStart(dfd); 105895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.config.debugAtAllCosts){ 105905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xhr.send(ioArgs.query); 105915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 105925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 105935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xhr.send(ioArgs.query); 105945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 105955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ioArgs.error = e; 105965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dfd.cancel(); 105975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 105985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 105995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _d._ioWatch(dfd, _validCheck, _ioCheck, _resHandle); 106005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xhr = null; 106015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dfd; // dojo.Deferred 106025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 106035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){ 106055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 106065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sends an HTTP GET request to the server. 106075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _d.xhr("GET", args); // dojo.Deferred 106085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 106095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.rawXhrPost = dojo.xhrPost = function(/*dojo.__XhrArgs*/ args){ 106115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 106125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sends an HTTP POST request to the server. In addtion to the properties 106135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // listed for the dojo.__XhrArgs type, the following property is allowed: 106145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // postData: 106155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // String. Send raw data in the body of the POST request. 106165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _d.xhr("POST", args, true); // dojo.Deferred 106175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 106185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.rawXhrPut = dojo.xhrPut = function(/*dojo.__XhrArgs*/ args){ 106205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 106215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sends an HTTP PUT request to the server. In addtion to the properties 106225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // listed for the dojo.__XhrArgs type, the following property is allowed: 106235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // putData: 106245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // String. Send raw data in the body of the PUT request. 106255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _d.xhr("PUT", args, true); // dojo.Deferred 106265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 106275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.xhrDelete = function(/*dojo.__XhrArgs*/ args){ 106295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 106305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sends an HTTP DELETE request to the server. 106315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _d.xhr("DELETE", args); //dojo.Deferred 106325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 106335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /* 106355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.wrapForm = function(formNode){ 106365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //summary: 106375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A replacement for FormBind, but not implemented yet. 106385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: need to think harder about what extensions to this we might 106405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // want. What should we allow folks to do w/ this? What events to 106415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // set/send? 106425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw new Error("dojo.wrapForm not yet implemented"); 106435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 106445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 106455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 106465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 106485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 106505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.fx"] = true; 106515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.fx"); 106525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 106595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Animation loosely package based on Dan Pupius' work, contributed under CLA: 106605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) http://pupius.co.uk/js/Toolkit.Drawing.js 106615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/ 106625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){ 106635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var d = dojo; 106645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _mixin = d._mixin; 106655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._Line = function(/*int*/ start, /*int*/ end){ 106675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 106685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo._Line is the object used to generate values from a start value 106695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to an end value 106705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // start: int 106715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Beginning value for range 106725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // end: int 106735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ending value for range 106745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.start = start; 106755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.end = end; 106765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 106775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._Line.prototype.getValue = function(/*float*/ n){ 106795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: Returns the point on the line 106805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // n: a floating point number greater than 0 and less than 1 106815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ((this.end - this.start) * n) + this.start; // Decimal 106825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 106835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.Animation = function(args){ 106855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 106865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A generic animation class that fires callbacks into its handlers 106875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // object at various states. 106885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 106895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A generic animation class that fires callbacks into its handlers 106905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // object at various states. Nearly all dojo animation functions 106915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // return an instance of this method, usually without calling the 106925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // .play() method beforehand. Therefore, you will likely need to 106935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // call .play() on instances of `dojo.Animation` when one is 106945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returned. 106955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // args: Object 106965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The 'magic argument', mixing all the properties into this 106975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // animation instance. 106985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _mixin(this, args); 107005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isArray(this.curve)){ 107015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.curve = new d._Line(this.curve[0], this.curve[1]); 107025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 107035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 107055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Alias to drop come 2.0: 107075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d._Animation = d.Animation; 107085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.extend(dojo.Animation, { 107105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // duration: Integer 107115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The time in milliseonds the animation will take to run 107125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) duration: 350, 107135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 107155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // curve: dojo._Line|Array 107165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A two element array of start and end values, or a `dojo._Line` instance to be 107175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // used in the Animation. 107185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) curve: null, 107195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // easing: Function? 107215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A Function to adjust the acceleration (or deceleration) of the progress 107225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // across a dojo._Line 107235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) easing: null, 107245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 107255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // repeat: Integer? 107275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The number of times to loop the animation 107285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) repeat: 0, 107295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // rate: Integer? 107315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the time in milliseconds to wait before advancing to next frame 107325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (used as a fps timer: 1000/rate = fps) 107335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) rate: 20 /* 50 fps */, 107345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 107365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // delay: Integer? 107375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The time in milliseconds to wait before starting animation after it 107385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // has been .play()'ed 107395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delay: null, 107405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // beforeBegin: Event? 107425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Synthetic event fired before a dojo.Animation begins playing (synchronous) 107435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) beforeBegin: null, 107445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // onBegin: Event? 107465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Synthetic event fired as a dojo.Animation begins playing (useful?) 107475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) onBegin: null, 107485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // onAnimate: Event? 107505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Synthetic event fired at each interval of a `dojo.Animation` 107515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) onAnimate: null, 107525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // onEnd: Event? 107545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Synthetic event fired after the final frame of a `dojo.Animation` 107555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) onEnd: null, 107565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // onPlay: Event? 107585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Synthetic event fired any time a `dojo.Animation` is play()'ed 107595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) onPlay: null, 107605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // onPause: Event? 107625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Synthetic event fired when a `dojo.Animation` is paused 107635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) onPause: null, 107645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // onStop: Event 107665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Synthetic event fires when a `dojo.Animation` is stopped 107675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) onStop: null, 107685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 107705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _percent: 0, 107725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _startRepeatCount: 0, 107735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _getStep: function(){ 107755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _p = this._percent, 107765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _e = this.easing 107775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ; 107785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _e ? _e(_p) : _p; 107795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 107805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _fire: function(/*Event*/ evt, /*Array?*/ args){ 107815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 107825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Convenience function. Fire event "evt" and pass it the 107835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // arguments specified in "args". 107845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 107855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Convenience function. Fire event "evt" and pass it the 107865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // arguments specified in "args". 107875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fires the callback in the scope of the `dojo.Animation` 107885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // instance. 107895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // evt: 107905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The event to fire. 107915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // args: 107925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The arguments to pass to the event. 107935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var a = args||[]; 107945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(this[evt]){ 107955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.config.debugAtAllCosts){ 107965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this[evt].apply(this, a); 107975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 107985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try{ 107995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this[evt].apply(this, a); 108005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }catch(e){ 108015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // squelch and log because we shouldn't allow exceptions in 108025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // synthetic event handlers to cause the internal timer to run 108035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // amuck, potentially pegging the CPU. I'm not a fan of this 108045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // squelch, but hopefully logging will make it clear what's 108055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // going on 108065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) console.error("exception in animation handler for:", evt); 108075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) console.error(e); 108085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 108095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 108105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 108115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; // dojo.Animation 108125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 108135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){ 108155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 108165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Start the animation. 108175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // delay: 108185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // How many milliseconds to delay before starting. 108195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // gotoStart: 108205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If true, starts the animation from the beginning; otherwise, 108215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // starts it from its current position. 108225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // returns: dojo.Animation 108235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The instance to allow chaining. 108245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _t = this; 108265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_t._delayTimer){ _t._clearTimer(); } 108275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(gotoStart){ 108285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._stopTimer(); 108295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._active = _t._paused = false; 108305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._percent = 0; 108315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(_t._active && !_t._paused){ 108325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _t; 108335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 108345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._fire("beforeBegin", [_t.node]); 108365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var de = delay || _t.delay, 108385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _p = dojo.hitch(_t, "_play", gotoStart); 108395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(de > 0){ 108415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._delayTimer = setTimeout(_p, de); 108425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _t; 108435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 108445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _p(); 108455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _t; 108465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 108475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _play: function(gotoStart){ 108495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _t = this; 108505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_t._delayTimer){ _t._clearTimer(); } 108515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._startTime = new Date().valueOf(); 108525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_t._paused){ 108535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._startTime -= _t.duration * _t._percent; 108545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 108555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._active = true; 108575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._paused = false; 108585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var value = _t.curve.getValue(_t._getStep()); 108595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_t._percent){ 108605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_t._startRepeatCount){ 108615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._startRepeatCount = _t.repeat; 108625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 108635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._fire("onBegin", [value]); 108645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 108655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._fire("onPlay", [value]); 108675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._cycle(); 108695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _t; // dojo.Animation 108705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 108715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pause: function(){ 108735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: Pauses a running animation. 108745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _t = this; 108755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_t._delayTimer){ _t._clearTimer(); } 108765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._stopTimer(); 108775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_t._active){ return _t; /*dojo.Animation*/ } 108785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._paused = true; 108795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._fire("onPause", [_t.curve.getValue(_t._getStep())]); 108805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _t; // dojo.Animation 108815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 108825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gotoPercent: function(/*Decimal*/ percent, /*Boolean?*/ andPlay){ 108845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 108855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sets the progress of the animation. 108865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // percent: 108875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A percentage in decimal notation (between and including 0.0 and 1.0). 108885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // andPlay: 108895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If true, play the animation after setting the progress. 108905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _t = this; 108915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._stopTimer(); 108925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._active = _t._paused = true; 108935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._percent = percent; 108945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(andPlay){ _t.play(); } 108955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _t; // dojo.Animation 108965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 108975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) stop: function(/*boolean?*/ gotoEnd){ 108995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: Stops a running animation. 109005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // gotoEnd: If true, the animation will end. 109015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _t = this; 109025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_t._delayTimer){ _t._clearTimer(); } 109035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!_t._timer){ return _t; /* dojo.Animation */ } 109045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._stopTimer(); 109055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(gotoEnd){ 109065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._percent = 1; 109075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 109085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._fire("onStop", [_t.curve.getValue(_t._getStep())]); 109095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._active = _t._paused = false; 109105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _t; // dojo.Animation 109115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 109125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) status: function(){ 109145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 109155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a string token representation of the status of 109165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the animation, one of: "paused", "playing", "stopped" 109175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(this._active){ 109185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._paused ? "paused" : "playing"; // String 109195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 109205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return "stopped"; // String 109215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 109225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _cycle: function(){ 109245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _t = this; 109255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_t._active){ 109265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var curr = new Date().valueOf(); 109275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var step = (curr - _t._startTime) / (_t.duration); 109285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(step >= 1){ 109305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) step = 1; 109315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 109325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._percent = step; 109335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Perform easing 109355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_t.easing){ 109365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) step = _t.easing(step); 109375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 109385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._fire("onAnimate", [_t.curve.getValue(step)]); 109405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_t._percent < 1){ 109425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._startTimer(); 109435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 109445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._active = false; 109455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_t.repeat > 0){ 109475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t.repeat--; 109485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t.play(null, true); 109495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(_t.repeat == -1){ 109505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t.play(null, true); 109515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 109525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(_t._startRepeatCount){ 109535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t.repeat = _t._startRepeatCount; 109545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._startRepeatCount = 0; 109555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 109565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 109575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._percent = 0; 109585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _t._fire("onEnd", [_t.node]); 109595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) !_t.repeat && _t._stopTimer(); 109605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 109615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 109625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _t; // dojo.Animation 109635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 109645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _clearTimer: function(){ 109665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: Clear the play delay timer 109675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearTimeout(this._delayTimer); 109685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete this._delayTimer; 109695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 109705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 109725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the local timer, stubbed into all Animation instances 109745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ctr = 0, 109755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) timer = null, 109765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) runner = { 109775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) run: function(){} 109785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 109795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.extend(d.Animation, { 109815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _startTimer: function(){ 109835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!this._timer){ 109845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._timer = d.connect(runner, "run", this, "_cycle"); 109855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ctr++; 109865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 109875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!timer){ 109885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) timer = setInterval(d.hitch(runner, "run"), this.rate); 109895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 109905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 109915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 109925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _stopTimer: function(){ 109935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(this._timer){ 109945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.disconnect(this._timer); 109955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._timer = null; 109965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ctr--; 109975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 109985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(ctr <= 0){ 109995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearInterval(timer); 110005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) timer = null; 110015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ctr = 0; 110025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 110035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 110045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 110065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var _makeFadeable = 110085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.isIE ? function(node){ 110095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // only set the zoom if the "tickle" value would be the same as the 110105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // default 110115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ns = node.style; 110125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // don't set the width to auto if it didn't already cascade that way. 110135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We don't want to f anyones designs 110145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!ns.width.length && d.style(node, "width") == "auto"){ 110155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ns.width = "auto"; 110165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 110175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } : 110185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function(){}; 110195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._fade = function(/*Object*/ args){ 110215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 110225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an animation that will fade the node defined by 110235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // args.node from the start to end values passed (args.start 110245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // args.end) (end is mandatory, start is optional) 110255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) args.node = d.byId(args.node); 110275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var fArgs = _mixin({ properties: {} }, args), 110285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) props = (fArgs.properties.opacity = {}); 110295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) props.start = !("start" in fArgs) ? 110315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function(){ 110325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return +d.style(fArgs.node, "opacity")||0; 110335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } : fArgs.start; 110345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) props.end = fArgs.end; 110355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var anim = d.animateProperty(fArgs); 110375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.connect(anim, "beforeBegin", d.partial(_makeFadeable, fArgs.node)); 110385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return anim; // dojo.Animation 110405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 110415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 110435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.__FadeArgs = function(node, duration, easing){ 110445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: DOMNode|String 110455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The node referenced in the animation 110465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // duration: Integer? 110475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Duration of the animation in milliseconds. 110485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // easing: Function? 110495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An easing function. 110505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.node = node; 110515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.duration = duration; 110525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.easing = easing; 110535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 110545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 110555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.fadeIn = function(/*dojo.__FadeArgs*/ args){ 110575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 110585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an animation that will fade node defined in 'args' from 110595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // its current opacity to fully opaque. 110605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d._fade(_mixin({ end: 1 }, args)); // dojo.Animation 110615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 110625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.fadeOut = function(/*dojo.__FadeArgs*/ args){ 110645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 110655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an animation that will fade node defined in 'args' 110665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // from its current opacity to fully transparent. 110675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d._fade(_mixin({ end: 0 }, args)); // dojo.Animation 110685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 110695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo._defaultEasing = function(/*Decimal?*/ n){ 110715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: The default easing function for dojo.Animation(s) 110725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0.5 + ((Math.sin((n + 1.5) * Math.PI)) / 2); 110735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 110745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var PropLine = function(properties){ 110765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // PropLine is an internal class which is used to model the values of 110775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an a group of CSS properties across an animation lifecycle. In 110785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // particular, the "getValue" function handles getting interpolated 110795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // values between start and end for a particular CSS value. 110805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._properties = properties; 110815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var p in properties){ 110825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var prop = properties[p]; 110835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(prop.start instanceof d.Color){ 110845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // create a reusable temp color object to keep intermediate results 110855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prop.tempColor = new d.Color(); 110865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 110875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 110885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 110895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PropLine.prototype.getValue = function(r){ 110915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var ret = {}; 110925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var p in this._properties){ 110935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var prop = this._properties[p], 110945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) start = prop.start; 110955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(start instanceof d.Color){ 110965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret[p] = d.blendColors(start, prop.end, r, prop.tempColor).toCss(); 110975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(!d.isArray(start)){ 110985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ret[p] = ((prop.end - start) * r) + start + (p != "opacity" ? prop.units || "px" : 0); 110995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 111005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 111015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; 111025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 111035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 111045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*===== 111055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.declare("dojo.__AnimArgs", [dojo.__FadeArgs], { 111065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Properties: Object? 111075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A hash map of style properties to Objects describing the transition, 111085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // such as the properties of dojo._Line with an additional 'units' property 111095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) properties: {} 111105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 111115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //TODOC: add event callbacks 111125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 111135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) =====*/ 111145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 111155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.animateProperty = function(/*dojo.__AnimArgs*/ args){ 111165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 111175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an animation that will transition the properties of 111185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node defined in `args` depending how they are defined in 111195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `args.properties` 111205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 111215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 111225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.animateProperty` is the foundation of most `dojo.fx` 111235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // animations. It takes an object of "properties" corresponding to 111245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // style properties, and animates them in parallel over a set 111255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // duration. 111265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 111275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 111285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A simple animation that changes the width of the specified node. 111295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.animateProperty({ 111305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | node: "nodeId", 111315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | properties: { width: 400 }, 111325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }).play(); 111335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Dojo figures out the start value for the width and converts the 111345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // integer specified for the width to the more expressive but 111355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // verbose form `{ width: { end: '400', units: 'px' } }` which you 111365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can also specify directly. Defaults to 'px' if ommitted. 111375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 111385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 111395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Animate width, height, and padding over 2 seconds... the 111405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // pedantic way: 111415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.animateProperty({ node: node, duration:2000, 111425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | properties: { 111435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | width: { start: '200', end: '400', units:"px" }, 111445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | height: { start:'200', end: '400', units:"px" }, 111455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | paddingTop: { start:'5', end:'50', units:"px" } 111465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 111475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }).play(); 111485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note 'paddingTop' is used over 'padding-top'. Multi-name CSS properties 111495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // are written using "mixed case", as the hyphen is illegal as an object key. 111505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 111515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 111525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Plug in a different easing function and register a callback for 111535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // when the animation ends. Easing functions accept values between 111545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // zero and one and return a value on that basis. In this case, an 111555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // exponential-in curve. 111565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.animateProperty({ 111575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | node: "nodeId", 111585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // dojo figures out the start value 111595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | properties: { width: { end: 400 } }, 111605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | easing: function(n){ 111615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return (n==0) ? 0 : Math.pow(2, 10 * (n - 1)); 111625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 111635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | onEnd: function(node){ 111645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // called when the animation finishes. The animation 111655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // target is passed to this function 111665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 111675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }).play(500); // delay playing half a second 111685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 111695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 111705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Like all `dojo.Animation`s, animateProperty returns a handle to the 111715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Animation instance, which fires the events common to Dojo FX. Use `dojo.connect` 111725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to access these events outside of the Animation definiton: 111735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | var anim = dojo.animateProperty({ 111745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | node:"someId", 111755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | properties:{ 111765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | width:400, height:500 111775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 111785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 111795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.connect(anim,"onEnd", function(){ 111805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | console.log("animation ended"); 111815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }); 111825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // play the animation now: 111835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | anim.play(); 111845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 111855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 111865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Each property can be a function whose return value is substituted along. 111875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Additionally, each measurement (eg: start, end) can be a function. The node 111885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // reference is passed direcly to callbacks. 111895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.animateProperty({ 111905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | node:"mine", 111915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | properties:{ 111925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | height:function(node){ 111935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | // shrink this node by 50% 111945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | return dojo.position(node).h / 2 111955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }, 111965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | width:{ 111975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | start:function(node){ return 100; }, 111985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | end:function(node){ return 200; } 111995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 112005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | } 112015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | }).play(); 112025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 112035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 112045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var n = args.node = d.byId(args.node); 112055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!args.easing){ args.easing = d._defaultEasing; } 112065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 112075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var anim = new d.Animation(args); 112085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.connect(anim, "beforeBegin", anim, function(){ 112095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var pm = {}; 112105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(var p in this.properties){ 112115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make shallow copy of properties into pm because we overwrite 112125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // some values below. In particular if start/end are functions 112135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we don't want to overwrite them or the functions won't be 112145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // called if the animation is reused. 112155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(p == "width" || p == "height"){ 112165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.node.display = "block"; 112175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 112185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var prop = this.properties[p]; 112195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isFunction(prop)){ 112205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prop = prop(n); 112215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 112225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prop = pm[p] = _mixin({}, (d.isObject(prop) ? prop: { end: prop })); 112235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 112245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isFunction(prop.start)){ 112255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prop.start = prop.start(n); 112265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 112275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(d.isFunction(prop.end)){ 112285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prop.end = prop.end(n); 112295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 112305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var isColor = (p.toLowerCase().indexOf("color") >= 0); 112315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function getStyle(node, p){ 112325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dojo.style(node, "height") can return "auto" or "" on IE; this is more reliable: 112335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var v = { height: node.offsetHeight, width: node.offsetWidth }[p]; 112345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(v !== undefined){ return v; } 112355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v = d.style(node, p); 112365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (p == "opacity") ? +v : (isColor ? v : parseFloat(v)); 112375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 112385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(!("end" in prop)){ 112395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prop.end = getStyle(n, p); 112405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else if(!("start" in prop)){ 112415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prop.start = getStyle(n, p); 112425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 112435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 112445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(isColor){ 112455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prop.start = new d.Color(prop.start); 112465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prop.end = new d.Color(prop.end); 112475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }else{ 112485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prop.start = (p == "opacity") ? +prop.start : parseFloat(prop.start); 112495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 112505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 112515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.curve = new PropLine(pm); 112525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 112535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) d.connect(anim, "onAnimate", d.hitch(d, "style", anim.node)); 112545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return anim; // dojo.Animation 112555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 112565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 112575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.anim = function( /*DOMNode|String*/ node, 112585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Object*/ properties, 112595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Integer?*/ duration, 112605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Function?*/ easing, 112615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Function?*/ onEnd, 112625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /*Integer?*/ delay){ 112635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // summary: 112645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A simpler interface to `dojo.animateProperty()`, also returns 112655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // an instance of `dojo.Animation` but begins the animation 112665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // immediately, unlike nearly every other Dojo animation API. 112675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // description: 112685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // `dojo.anim` is a simpler (but somewhat less powerful) version 112695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // of `dojo.animateProperty`. It uses defaults for many basic properties 112705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and allows for positional parameters to be used in place of the 112715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // packed "property bag" which is used for other Dojo animation 112725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // methods. 112735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 112745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The `dojo.Animation` object returned from `dojo.anim` will be 112755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // already playing when it is returned from this function, so 112765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // calling play() on it again is (usually) a no-op. 112775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node: 112785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a DOM node or the id of a node to animate CSS properties on 112795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // duration: 112805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The number of milliseconds over which the animation 112815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // should run. Defaults to the global animation default duration 112825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (350ms). 112835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // easing: 112845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An easing function over which to calculate acceleration 112855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and deceleration of the animation through its duration. 112865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A default easing algorithm is provided, but you may 112875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // plug in any you wish. A large selection of easing algorithms 112885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // are available in `dojo.fx.easing`. 112895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // onEnd: 112905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A function to be called when the animation finishes 112915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // running. 112925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // delay: 112935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The number of milliseconds to delay beginning the 112945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // animation by. The default is 0. 112955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 112965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fade out a node 112975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.anim("id", { opacity: 0 }); 112985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // example: 112995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fade out a node over a full second 113005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // | dojo.anim("id", { opacity: 0 }, 1000); 113015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return d.animateProperty({ // dojo.Animation 113025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node: node, 113035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) duration: duration || d.Animation.prototype.duration, 113045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) properties: properties, 113055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) easing: easing, 113065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) onEnd: onEnd 113075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }).play(delay || 0); 113085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 113095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 113105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 113125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base.browser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 113145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base.browser"] = true; 113155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base.browser"); 113165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Need this to be the last code segment in base, so do not place any 113265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //dojo/requireIf calls in this file/ Otherwise, due to how the build system 113275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //puts all requireIf dependencies after the current file, the require calls 113285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //could be called before all of base is defined/ 113295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo.forEach(dojo.config.require, function(i){ 113305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dojo["require"](i); 113315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }); 113325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 113345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if(!dojo._hasResource["dojo._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. 113365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo._hasResource["dojo._base"] = true; 113375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dojo.provide("dojo._base"); 113385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 113505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //INSERT dojo.i18n._preloadLocalizations HERE 113525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //Check if document already complete, and if so, just trigger page load 113545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //listeners. NOTE: does not work with Firefox before 3.6. To support 113555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //those browsers, set djConfig.afterOnLoad = true when you know Dojo is added 113565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //after page load. Using a timeout so the rest of this 113575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //script gets evaluated properly. This work needs to happen after the 113585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //dojo.config.require work done in dojo._base. 113595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(dojo.isBrowser && (document.readyState === "complete" || dojo.config.afterOnLoad)){ 113605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) window.setTimeout(dojo._loadInit, 100); 113615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 113625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 113635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11364