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