Sujeet Kumar

initial commit

Showing 1000 changed files with 4941 additions and 0 deletions

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

1 +{
2 + "name": "docker-panel-demo",
3 + "description": "Dynamic docking panels",
4 + "version": "0.0.1",
5 + "keywords": [
6 + "css",
7 + "js",
8 + "front-end",
9 + "framework",
10 + "web",
11 + "dynamic"
12 + ],
13 + "homepage": "http://docker.webcabin.org/",
14 + "main": [
15 + "Build",
16 + "Build/Themes"
17 + ],
18 + "ignore": [
19 + "/.*",
20 + "index.html",
21 + "Code",
22 + "Compiler",
23 + "images",
24 + "Themes",
25 + "package.json"
26 + ],
27 + "dependencies": {
28 + "jquery": "1.11.1",
29 + "jQuery-contextMenu": "1.6.6",
30 + "font-awesome": "4.6.0"
31 + },
32 + "devDependencies": {
33 + "dcl": "1.1.2",
34 + "requirejs": "2.1.x",
35 + "requirejs-domready": "2.0.x",
36 + "almond": "0.3.1",
37 + "lodash-compat": "3.10.1-amd",
38 + "dojo": "1.9.1"
39 + },
40 + "license": "MIT"
41 +}
1 +{
2 + "name": "almond",
3 + "version": "0.3.1",
4 + "main": "almond.js",
5 + "ignore": [
6 + "tests",
7 + "shrinktest.sh"
8 + ],
9 + "homepage": "https://github.com/jrburke/almond",
10 + "_release": "0.3.1",
11 + "_resolution": {
12 + "type": "version",
13 + "tag": "0.3.1",
14 + "commit": "8336992b1a3fee8d10310822d4222fb82d24f097"
15 + },
16 + "_source": "https://github.com/jrburke/almond.git",
17 + "_target": "0.3.1",
18 + "_originalSource": "almond"
19 +}
...\ No newline at end of file ...\ No newline at end of file
1 +language: node_js
2 +node_js: 0.10
3 +
4 +before_script:
5 + - node tests/server.js &
6 + - sleep 1
7 +
8 +script: phantomjs tests/runner.js
9 +
10 +after_script:
11 + - kill -9 `cat tests/pid.txt`
12 + - rm tests/pid.txt
1 +almond is released under two licenses: new BSD, and MIT. You may pick the
2 +license that best suits your development needs. The text of both licenses are
3 +provided below.
4 +
5 +
6 +The "New" BSD License:
7 +----------------------
8 +
9 +Copyright (c) 2010-2011, The Dojo Foundation
10 +All rights reserved.
11 +
12 +Redistribution and use in source and binary forms, with or without
13 +modification, are permitted provided that the following conditions are met:
14 +
15 + * Redistributions of source code must retain the above copyright notice, this
16 + list of conditions and the following disclaimer.
17 + * Redistributions in binary form must reproduce the above copyright notice,
18 + this list of conditions and the following disclaimer in the documentation
19 + and/or other materials provided with the distribution.
20 + * Neither the name of the Dojo Foundation nor the names of its contributors
21 + may be used to endorse or promote products derived from this software
22 + without specific prior written permission.
23 +
24 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
25 +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
28 +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 +
35 +
36 +
37 +MIT License
38 +-----------
39 +
40 +Copyright (c) 2010-2011, The Dojo Foundation
41 +
42 +Permission is hereby granted, free of charge, to any person obtaining a copy
43 +of this software and associated documentation files (the "Software"), to deal
44 +in the Software without restriction, including without limitation the rights
45 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
46 +copies of the Software, and to permit persons to whom the Software is
47 +furnished to do so, subject to the following conditions:
48 +
49 +The above copyright notice and this permission notice shall be included in
50 +all copies or substantial portions of the Software.
51 +
52 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
53 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
54 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
55 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
56 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
57 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
58 +THE SOFTWARE.
1 +#almond
2 +
3 +A replacement [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) loader for
4 +[RequireJS](http://requirejs.org). It provides a minimal AMD API footprint that includes [loader plugin](http://requirejs.org/docs/plugins.html) support. Only useful for built/bundled AMD modules, does not do dynamic loading.
5 +
6 +## Why
7 +
8 +Some developers like to use the AMD API to code modular JavaScript, but after doing an optimized build,
9 +they do not want to include a full AMD loader like RequireJS, since they do not need all that functionality.
10 +Some use cases, like mobile, are very sensitive to file sizes.
11 +
12 +By including almond in the built file, there is no need for RequireJS.
13 +almond is around **1 kilobyte** when minified with Closure Compiler and gzipped.
14 +
15 +Since it can support certain types of loader plugin-optimized resources, it is a great
16 +fit for a library that wants to use [text templates](http://requirejs.org/docs/api.html#text)
17 +or [CoffeeScript](https://github.com/jrburke/require-cs) as part of
18 +their project, but get a tiny download in one file after using the
19 +[RequireJS Optimizer](http://requirejs.org/docs/optimization.html).
20 +
21 +If you are building a library, the wrap=true support in the RequireJS optimizer
22 +will wrap the optimized file in a closure, so the define/require AMD API does not
23 +escape the file. Users of your optimized file will only see the global API you decide
24 +to export, not the AMD API. See the usage section below for more details.
25 +
26 +So, you get great code cleanliness with AMD and the use of powerful loader plugins
27 +in a tiny wrapper that makes it easy for others to use your code even if they do not use AMD.
28 +
29 +If you want a single file build output but without the module APIs included, you might want to consider [AMDclean](https://github.com/gfranko/amdclean).
30 +
31 +## Restrictions
32 +
33 +It is best used for libraries or apps that use AMD and:
34 +
35 +* optimize all the modules into one file -- no dynamic code loading.
36 +* all modules have IDs and dependency arrays in their define() calls -- the RequireJS optimizer will take care of this for you.
37 +* only have **one** requirejs.config() or require.config() call.
38 +* the requirejs.config/require.config call needs to be included in the build output. This is particularly important for making sure any [map config](http://requirejs.org/docs/api.html#config-map) use still works.
39 +* do not use the `var require = {};` style of [passing config](http://requirejs.org/docs/api.html#config).
40 +* do not use [RequireJS multiversion support/contexts](http://requirejs.org/docs/api.html#multiversion).
41 +* do not use require.toUrl() or require.nameToUrl().
42 +* do not use [packages/packagePaths config](http://requirejs.org/docs/api.html#packages). If you need to use packages that have a main property, [volo](https://github.com/volojs/volo) can create an adapter module so that it can work without this config. Use the `amdify add` command to add the dependency to your project.
43 +
44 +What is supported:
45 +
46 +* dependencies with relative IDs.
47 +* define('id', {}) definitions.
48 +* define(), require() and requirejs() calls.
49 +* loader plugins that can inline their resources into optimized files, and
50 +can access those inlined resources synchronously after the optimization pass.
51 +The [text](http://requirejs.org/docs/api.html#text) and
52 +[CoffeeScript](https://github.com/jrburke/require-cs) plugins are two such plugins.
53 +
54 +## Download
55 +
56 +[Latest release](https://github.com/jrburke/almond/raw/latest/almond.js)
57 +
58 +
59 +## Usage
60 +
61 +[Download the RequireJS optimizer](http://requirejs.org/docs/download.html#rjs).
62 +
63 +[Download the current release of almond.js](https://github.com/jrburke/almond/raw/latest/almond.js).
64 +
65 +Run the optimizer using [Node](http://nodejs.org) (also [works in Java](https://github.com/jrburke/r.js/blob/master/README.md)):
66 +
67 + node r.js -o baseUrl=. name=path/to/almond include=main out=main-built.js wrap=true
68 +
69 +This assumes your project's top-level script file is called main.js and the command
70 +above is run from the directory containing main.js. If you prefer to use a build.js build profile instead of command line arguments, [this RequireJS optimization section](http://requirejs.org/docs/optimization.html#pitfalls) has info on how to do that.
71 +
72 +wrap=true will add this wrapper around the main-built.js contents (which will be minified by UglifyJS:
73 +
74 + (function () {
75 + //almond will be here
76 + //main and its nested dependencies will be here
77 + }());
78 +
79 +If you do not want that wrapper, leave off the wrap=true argument.
80 +
81 +These optimizer arguments can also be used in a build config object, so it can be used
82 +in [runtime-generated server builds](https://github.com/jrburke/r.js/blob/master/build/tests/http/httpBuild.js).
83 +
84 +
85 +## Triggering module execution <a name="execution"></a>
86 +
87 +As of RequireJS 2.0 and almond 0.1, modules are only executed if they are
88 +called by a top level require call. The data-main attribute on a script tag
89 +for require.js counts as a top level require call.
90 +
91 +However with almond, it does not look for a data-main attribute, and if your
92 +main JS module does not use a top level require() or requirejs() call to
93 +trigger module loading/execution, after a build, it may appear that the code
94 +broke -- no modules execute.
95 +
96 +The 2.0 RequireJS optimizer has a build config, option **insertRequire** that you
97 +can use to specify that a require([]) call is inserted at the end of the built
98 +file to trigger module loading. Example:
99 +
100 + node r.js -o baseUrl=. name=path/to/almond.js include=main insertRequire=main out=main-built.js wrap=true
101 +
102 +or, if using a build config file:
103 +
104 +```javascript
105 +{
106 + baseUrl: '.',
107 + name: 'path/to/almond',
108 + include: ['main'],
109 + insertRequire: ['main'],
110 + out: 'main-built.js',
111 + wrap: true
112 +}
113 +```
114 +
115 +This will result with `require(["main"]);` at the bottom of main-built.js.
116 +
117 +## Exporting a public API
118 +
119 +If you are making a library that is made up of AMD modules in source form, but will be built with almond into one file, and you want to export a small public
120 +API for that library, you can use the `wrap` build config to do so. Build
121 +config:
122 +
123 +```javascript
124 +{
125 + baseUrl: '.',
126 + name: 'path/to/almond',
127 + include: ['main'],
128 + out: 'lib-built.js',
129 + wrap: {
130 + startFile: 'path/to/start.frag',
131 + endFile: 'path/to/end.frag'
132 + }
133 +}
134 +```
135 +
136 +Where start.frag could look like this:
137 +
138 +```javascript
139 +(function (root, factory) {
140 + if (typeof define === 'function' && define.amd) {
141 + //Allow using this built library as an AMD module
142 + //in another project. That other project will only
143 + //see this AMD call, not the internal modules in
144 + //the closure below.
145 + define([], factory);
146 + } else {
147 + //Browser globals case. Just assign the
148 + //result to a property on the global.
149 + root.libGlobalName = factory();
150 + }
151 +}(this, function () {
152 + //almond, and your modules will be inlined here
153 +```
154 +
155 +and end.frag is like this:
156 +```javascript
157 + //The modules for your project will be inlined above
158 + //this snippet. Ask almond to synchronously require the
159 + //module value for 'main' here and return it as the
160 + //value to use for the public API for the built file.
161 + return require('main');
162 +}));
163 +```
164 +
165 +After the build, then the built file should be structured like so:
166 +
167 +* start.frag
168 +* almond.js
169 +* modules for your lib, including 'main'
170 +* end.frag
171 +
172 +## Common errors
173 +
174 +Explanations of common errors:
175 +
176 +### incorrect module build, no module name
177 +
178 +In almond 3.0.0 and earlier, this would show up as "deps is undefined", where
179 +this line is mentioned:
180 +
181 + if (!deps.splice) {
182 +
183 +In 3.0.1+ the error is explicitly: "incorrect module build, no module name".
184 +
185 +This means that there is a define()'d module, but it is missing a name,
186 +something that looks like this:
187 +
188 + define(function () {});
189 + //or
190 + define([], function () {});
191 +
192 +
193 +when it should look like:
194 +
195 + define('someName', function () {});
196 + //or
197 + define('someName', [], function () {});
198 +
199 +
200 +This is usually a sign that the tool you used to combine all the modules
201 +together did not properly name an anonymous AMD module.
202 +
203 +Multiple modules built into a single file **must** have names in the define calls.
204 +Otherwise almond has no way to assign the module to a name key for use in the code.
205 +
206 +The fix is to use a build tool that understand AMD modules and inserts the module
207 +IDs in the build. The
208 +[requirejs optimizer](http://requirejs.org/docs/optimization.html) is a build tool
209 +that can do this correctly.
210 +
211 +### x missing y
212 +
213 +It means that module 'x' asked for module 'y', but module 'y' was not available.
214 +
215 +This usually means that 'y' was not included in the built file that includes almond.
216 +
217 +almond can only handle modules built in with it, it cannot dynamically load
218 +modules from the network.
219 +
220 +
221 +### No y
222 +
223 +It means that a `require('y')` call was done but y was not available.
224 +
225 +This usually means that 'y' was not included in the built file that includes almond.
226 +
227 +almond can only handle modules built in with it, it cannot dynamically load
228 +modules from the network.
229 +
230 +## How to get help
231 +
232 +* Contact the [requirejs list](https://groups.google.com/group/requirejs).
233 +* Open issues in the [issue tracker](https://github.com/jrburke/almond/issues).
234 +
235 +## Contributing
236 +
237 +Almond follows the
238 +[same contribution model as requirejs](http://requirejs.org/docs/contributing.html)
239 +and is considered a sub-project of requirejs.
...\ No newline at end of file ...\ No newline at end of file
This diff is collapsed. Click to expand it.
1 +{
2 + "name": "almond",
3 + "version": "0.3.1",
4 + "main": "almond.js",
5 + "ignore": [
6 + "tests",
7 + "shrinktest.sh"
8 + ]
9 +}
1 +{
2 + "name": "almond",
3 + "description": "A minimal AMD API implementation for use in optimized browser builds.",
4 + "version": "0.3.1",
5 + "homepage": "http://github.com/jrburke/almond",
6 + "author": "James Burke <jrburke@gmail.com> (http://github.com/jrburke)",
7 + "repository": {
8 + "type": "git",
9 + "url": "git://github.com/jrburke/almond.git"
10 + },
11 + "licenses": [
12 + {
13 + "type": "BSD",
14 + "url": "https://github.com/jrburke/almond/blob/master/LICENSE"
15 + },
16 + {
17 + "type": "MIT",
18 + "url": "https://github.com/jrburke/almond/blob/master/LICENSE"
19 + }
20 + ],
21 + "main": "almond.js",
22 + "engines": {
23 + "node": ">=0.4.0"
24 + },
25 + "devDependencies": {
26 + "connect": "^3.3.4",
27 + "serve-static": "^1.9.1"
28 + }
29 +}
1 +{
2 + "name": "dcl",
3 + "version": "1.1.2",
4 + "main": "dcl.js",
5 + "ignore": [
6 + "**/.*",
7 + "node_modules",
8 + "bower_components",
9 + "test",
10 + "tests"
11 + ],
12 + "homepage": "https://github.com/uhop/dcl",
13 + "_release": "1.1.2",
14 + "_resolution": {
15 + "type": "version",
16 + "tag": "1.1.2",
17 + "commit": "64bfb2b736e787b1c2323ac31e1c7042bb7388c3"
18 + },
19 + "_source": "https://github.com/uhop/dcl.git",
20 + "_target": "1.1.2",
21 + "_originalSource": "dcl"
22 +}
...\ No newline at end of file ...\ No newline at end of file
1 +Eugene Lazutkin <eugene.lazutkin@gmail.com> (http://lazutkin.com/)
1 +Contribution guidelines
2 +=======================
3 +
4 +## For end-users
5 +
6 +If you are experiencing problems, and need help, please start with [the support web site](http://www.dcljs.org/support/).
7 +
8 +## For contributors
9 +
10 +* Please search the [issue tracker](https://github.com/uhop/dcl/issues) before submitting new issues
11 + to avoid duplicates.
12 +* For any non-trivial contributions (new features, etc.), please create a new issue in the issue tracker
13 + to track discussion prior to submitting a [pull request](http://help.github.com/send-pull-requests).
14 +* For the time being, you must have a signed [Dojo Foundation CLA](http://dojofoundation.org/about/claForm)
15 + for any non-trivial patches to be accepted.
16 +* Any submitted code should conform to the project’s code style guidelines.
17 +* If appropriate, a test case should be part of the pull request.
18 +* Thank you for your contribution!
19 +
20 +## For committers
21 +
22 +* Provide rigorous code review for contributors.
23 +* When in doubt, ask for a second review; don’t commit code that smells wrong just because it exists.
24 +* Squash all pull requests into a single commit.
25 +* Put `[ci skip]` at the end of commit messages for commits that do not modify any code
26 + (readme changes, etc.)
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define(["../dcl"], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory(require("../dcl"));
6 + }else{
7 + dclAdvicesCounter = factory(dcl);
8 + }
9 +})(function(dcl){
10 + "use strict";
11 + var Counter = new dcl(null, {
12 + declaredClass: "dcl/advices/counter/Counter",
13 + constructor: function(){
14 + this.reset();
15 + },
16 + reset: function(){
17 + this.calls = this.errors = 0;
18 + },
19 + advice: function(){
20 + var self = this;
21 + return {
22 + before: function(){
23 + ++self.calls;
24 + },
25 + after: function(args, result){
26 + if(result instanceof Error){
27 + ++self.errors;
28 + }
29 + }
30 + };
31 + }
32 + });
33 +
34 + return function(){ return new Counter; };
35 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define([], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory();
6 + }else{
7 + dclAdvicesFlow = factory();
8 + }
9 +})(function(){
10 + "use strict";
11 + var flowStack = [], flowCount = {};
12 + return {
13 + advice: function(name){
14 + return {
15 + before: function(){
16 + flowStack.push(name);
17 + if(flowCount[name]){
18 + ++flowCount[name];
19 + }else{
20 + flowCount[name] = 1;
21 + }
22 + },
23 + after: function(){
24 + --flowCount[name];
25 + flowStack.pop();
26 + }
27 + };
28 + },
29 + inFlowOf: function(name){
30 + return flowCount[name];
31 + },
32 + getStack: function(){
33 + return flowStack;
34 + },
35 + getCount: function(){
36 + return flowCount;
37 + }
38 + };
39 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define([], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory();
6 + }else{
7 + dclAdvicesMemoize = factory();
8 + }
9 +})(function(){
10 + "use strict";
11 + return {
12 + advice: function(name, keyMaker){
13 + return keyMaker ?
14 + {
15 + around: function(sup){
16 + return function(){
17 + var key = keyMaker(this, arguments), cache = this.__memoizerCache, dict;
18 + if(!cache){
19 + cache = this.__memoizerCache = {};
20 + }
21 + if(cache.hasOwnProperty(name)){
22 + dict = cache[name];
23 + }else{
24 + dict = cache[name] = {};
25 + }
26 + if(dict.hasOwnProperty(key)){
27 + return dict[key];
28 + }
29 + return dict[key] = sup ? sup.apply(this, arguments) : undefined;
30 + }
31 + }
32 + } :
33 + {
34 + around: function(sup){
35 + return function(first){
36 + var cache = this.__memoizerCache, dict;
37 + if(!cache){
38 + cache = this.__memoizerCache = {};
39 + }
40 + if(cache.hasOwnProperty(name)){
41 + dict = cache[name];
42 + }else{
43 + dict = cache[name] = {};
44 + }
45 + if(dict.hasOwnProperty(first)){
46 + return dict[first];
47 + }
48 + return dict[first] = sup ? sup.apply(this, arguments) : undefined;
49 + }
50 + }
51 + };
52 + },
53 + guard: function(name){
54 + return {
55 + after: function(){
56 + var cache = this.__memoizerCache;
57 + if(cache && name){
58 + delete cache[name]
59 + }else{
60 + this.__memoizerCache = {};
61 + }
62 + }
63 + };
64 + }
65 + };
66 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define([], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory();
6 + }else{
7 + dclAdvicesTime = factory();
8 + }
9 +})(function(){
10 + "use strict";
11 + var uniq = 0;
12 + return function(name){
13 + var inCall = 0, label = name || ("Timer #" + uniq++);
14 + return {
15 + before: function(){
16 + if(!(inCall++)){
17 + console.time(label);
18 + }
19 + },
20 + after: function(){
21 + if(!--inCall){
22 + console.timeEnd(label);
23 + }
24 + }
25 + };
26 + };
27 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define([], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory();
6 + }else{
7 + dclAdvicesTrace = factory();
8 + }
9 +})(function(){
10 + "use strict";
11 + var lvl = 0;
12 + function rep(ch, n){
13 + if(n < 1){ return ""; }
14 + if(n == 1){ return ch; }
15 + var h = rep(ch, Math.floor(n / 2));
16 + return h + h + ((n & 1) ? ch : "");
17 +
18 + }
19 + function pad(value, width, ch){
20 + var v = value.toString();
21 + return v + rep(ch || " ", width - v.length);
22 + }
23 + return function(name, level){
24 + return {
25 + before: function(){
26 + ++lvl;
27 + console.log((level ? pad(lvl, 2 * lvl) : "") + this + " => " +
28 + name + "(" + Array.prototype.join.call(arguments, ", ") + ")");
29 + },
30 + after: function(args, result){
31 + console.log((level ? pad(lvl, 2 * lvl) : "") + this + " => " +
32 + name + (result && result instanceof Error ? " throws" : " returns") +
33 + " " + result);
34 + --lvl;
35 + }
36 + };
37 + };
38 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define([], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory();
6 + }else{
7 + advise = factory();
8 + }
9 +})(function(){
10 + "use strict";
11 +
12 + function Node(instance, name){
13 + this.next_before = this.prev_before = this.next_after = this.prev_after =
14 + this.next_around = this.prev_around = this;
15 + this.instance = instance;
16 + this.name = name;
17 + }
18 + var p = Node.prototype = {
19 + add: function(before, after, around, original){
20 + var node = new Node(this.instance, this.name);
21 + node.parent = this;
22 + node.before = before;
23 + this._add("before", node);
24 + node.after = after;
25 + this._add("after", node);
26 + node.around = around;
27 + this._add("around", node, original);
28 + node.original = original;
29 + if(original){ node.around = advise._instantiate(original, node.prev_around.around, this); }
30 + return node;
31 + },
32 + _add: function(topic, node, flag){
33 + if(node[topic] || flag){
34 + var n = "next_" + topic, p = "prev_" + topic;
35 + (node[p] = this[p])[n] = (node[n] = this)[p] = node;
36 + }
37 + },
38 + remove: function(node){
39 + this._remove("before", node);
40 + this._remove("after", node);
41 + this._remove("around", node);
42 + },
43 + _remove: function(topic, node){
44 + var n = "next_" + topic, p = "prev_" + topic;
45 + node[n][p] = node[p];
46 + node[p][n] = node[n];
47 + },
48 + destroy: function(){
49 + var around = this.prev_around.around, t = this.next_around, parent = this.parent;
50 + this.remove(this);
51 + if(t !== this){
52 + for(; t !== parent; around = t.around, t = t.next_around){
53 + if(t.original){
54 + t.around = advise._instantiate(t.original, around, this);
55 + }
56 + }
57 + }
58 + this.instance = 0;
59 + }
60 + };
61 + p.unadvise = p.destroy; // alias
62 +
63 + function makeAOPStub(node){
64 + var f = function(){
65 + var p, r, t = this, a = arguments, thrown;
66 + // running the before chain
67 + for(p = node.prev_before; p !== node; p = p.prev_before){
68 + p.before.apply(t, a);
69 + }
70 + // running the around chain
71 + try{
72 + if(node.prev_around !== node){ r = node.prev_around.around.apply(t, a); }
73 + }catch(e){
74 + r = e;
75 + thrown = true;
76 + }
77 + // running the after chain
78 + for(p = node.next_after; p !== node; p = p.next_after){
79 + p.after.call(t, a, r);
80 + }
81 + if(thrown){
82 + throw r;
83 + }
84 + return r;
85 + };
86 + f.adviceNode = node;
87 + return f;
88 + }
89 +
90 + function advise(instance, name, advice){
91 + var f = instance[name], node;
92 + if(f && f.adviceNode && f.adviceNode instanceof Node){
93 + node = f.adviceNode;
94 + }else{
95 + node = new Node(instance, name);
96 + if(f && f.advices){
97 + f = f.advices;
98 + node.add(f.before, f.after, f.around);
99 + }else{
100 + node.add(0, 0, f);
101 + }
102 + instance[name] = makeAOPStub(node);
103 + }
104 + if(typeof advice == "function"){ advice = advice(name, instance); }
105 + return node.add(advice.before, advice.after, 0, advice.around);
106 + }
107 +
108 + advise.before = function(instance, name, f){ return advise(instance, name, {before: f}); };
109 + advise.after = function(instance, name, f){ return advise(instance, name, {after: f}); };
110 + advise.around = function(instance, name, f){ return advise(instance, name, {around: f}); };
111 + advise.Node = Node;
112 +
113 + advise._instantiate = function(advice, previous, node){ return advice(previous); };
114 +
115 + return advise;
116 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define(["../mini"], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory(require("../mini"));
6 + }else{
7 + dclBasesMixer = factory(dcl);
8 + }
9 +})(function(dcl){
10 + "use strict";
11 + return dcl(null, {
12 + declaredClass: "dcl/bases/Mixer",
13 + constructor: function(x){
14 + dcl.mix(this, x);
15 + }
16 + });
17 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define(["../mini"], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory(require("../mini"));
6 + }else{
7 + dclBasesReplacer = factory(dcl);
8 + }
9 +})(function(dcl){
10 + "use strict";
11 + return dcl(null, {
12 + declaredClass: "dcl/bases/Replacer",
13 + constructor: function(x){
14 + var empty = {};
15 + dcl.allKeys(x).forEach(function(name){
16 + if(name in this){
17 + var t = x[name], e = empty[name];
18 + if(t !== e){
19 + this[name] = t;
20 + }
21 + }
22 + }, this);
23 + }
24 + });
25 +});
1 +{
2 + "name": "dcl",
3 + "version": "1.1.1",
4 + "main": "dcl.js",
5 + "ignore": [
6 + "**/.*",
7 + "node_modules",
8 + "bower_components",
9 + "test",
10 + "tests"
11 + ]
12 +}
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define(["./mini"], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory(require("./mini"));
6 + }else{
7 + dcl = factory(dcl);
8 + }
9 +})(function(dcl){
10 + "use strict";
11 +
12 + function nop(){}
13 +
14 + var Advice = dcl(dcl.Super, {
15 + //declaredClass: "dcl.Advice",
16 + constructor: function(){
17 + this.before = this.around.before;
18 + this.after = this.around.after;
19 + this.around = this.around.around;
20 + }
21 + });
22 + function advise(advice){ return dcl._makeSuper(advice, Advice); }
23 +
24 + function makeAOPStub(before, after, around){
25 + var beforeChain = before || nop,
26 + afterChain = after || nop,
27 + aroundChain = around || nop,
28 + stub = function(){
29 + var r, thrown;
30 + // running the before chain
31 + beforeChain.apply(this, arguments);
32 + // running the around chain
33 + try{
34 + r = aroundChain.apply(this, arguments);
35 + }catch(e){
36 + r = e;
37 + thrown = true;
38 + }
39 + // running the after chain
40 + afterChain.call(this, arguments, r);
41 + if(thrown){
42 + throw r;
43 + }
44 + return r;
45 + };
46 + stub.advices = {before: before, after: after, around: around};
47 + return stub;
48 + }
49 +
50 + function chain(id){
51 + return function(ctor, name){
52 + var meta = ctor._meta, rule;
53 + if(meta){
54 + rule = +meta.weaver[name] || 0;
55 + if(rule && rule != id){
56 + dcl._error("set chaining", name, ctor, id, rule);
57 + }
58 + meta.weaver[name] = id;
59 + }
60 + };
61 + }
62 +
63 + dcl.mix(dcl, {
64 + // public API
65 + Advice: Advice,
66 + advise: advise,
67 + // expose helper methods
68 + before: function(f){ return dcl.advise({before: f}); },
69 + after: function(f){ return dcl.advise({after: f}); },
70 + around: dcl.superCall,
71 + // chains
72 + chainBefore: chain(1),
73 + chainAfter: chain(2),
74 + isInstanceOf: function(o, ctor){
75 + if(o instanceof ctor){
76 + return true;
77 + }
78 + var t = o.constructor._meta, i;
79 + if(t){
80 + for(t = t.bases, i = t.length - 1; i >= 0; --i){
81 + if(t[i] === ctor){
82 + return true;
83 + }
84 + }
85 + }
86 + return false;
87 + },
88 + // protected API starts with _ (don't use it!)
89 + _stub: /*generic stub*/ function(id, bases, name, chains){
90 + var f = chains[name] = dcl._extractChain(bases, name, "around"),
91 + b = dcl._extractChain(bases, name, "before").reverse(),
92 + a = dcl._extractChain(bases, name, "after");
93 + f = id ? dcl._stubChainSuper(f, id == 1 ? function(f){ return dcl._stubChain(f.reverse()); } : dcl._stubChain, name) : dcl._stubSuper(f, name);
94 + return !b.length && !a.length ? f || function(){} : makeAOPStub(dcl._stubChain(b), dcl._stubChain(a), f);
95 + }
96 + });
97 +
98 + return dcl;
99 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define(["./mini", "./advise"], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory(require("./mini"), require("./advise"));
6 + }else{
7 + dclDebug = factory(dcl, advise);
8 + }
9 +})(function(dcl, advise){
10 + function DclError(message){
11 + if(Error.captureStackTrace){
12 + Error.captureStackTrace(this, DclError);
13 + }
14 + var e = Error.call(this, message), name;
15 + dcl.allKeys(e).forEach(function(name){
16 + if(e.hasOwnProperty(name)){
17 + this[name] = e[name];
18 + }
19 + });
20 + this.message = message;
21 + }
22 + DclError.prototype = dcl.delegate(Error.prototype);
23 + DclError.prototype.constructor = DclError;
24 +
25 + var CycleError = dcl(DclError, {declaredClass: "dcl/debug/CycleError"}),
26 + ChainingError = dcl(DclError, {declaredClass: "dcl/debug/ChainingError"}),
27 + SetChainingError = dcl(DclError, {declaredClass: "dcl/debug/SetChainingError"}),
28 + SuperCallError = dcl(DclError, {declaredClass: "dcl/debug/SuperCallError"}),
29 + SuperError = dcl(DclError, {declaredClass: "dcl/debug/SuperError"}),
30 + SuperResultError = dcl(DclError, {declaredClass: "dcl/debug/SuperResultError"});
31 +
32 + var chainNames = ["UNCHAINED BUT CONTAINS ADVICE(S)", "CHAINED BEFORE", "CHAINED AFTER",
33 + "ERRONEOUSLY CHAINED BEFORE AND AFTER"];
34 + function chainName(id){
35 + return id >= 0 && id <= 3 ? chainNames[id] : "UNKNOWN (" + id + ")";
36 + }
37 +
38 + var noDecls = " (specify 'declaredClass' string in your classes to get better diagnostics)";
39 + advise.around(dcl, "_error", function(/*sup*/){
40 + return function(reason, a1, a2, a3, a4, a5){
41 + var cName, someUnknown, i, base, name, names = [], c = {};
42 + switch(reason){
43 + case "cycle":
44 + cName = a1.hasOwnProperty("declaredClass") && a1.declaredClass;
45 + someUnknown = !cName;
46 + for(i = a2.length - 1; i >= 0; --i){
47 + base = a2[i][0];
48 + name = base.prototype.hasOwnProperty("declaredClass") && base.prototype.declaredClass;
49 + if(!name){
50 + name = "UNNAMED_" + base._uniqueId;
51 + someUnknown = true;
52 + }
53 + if(!c[name]){
54 + names.push(name);
55 + c[name] = 1;
56 + }
57 + }
58 + throw new CycleError("dcl: base class cycle found in: " + (cName || "UNNAMED") +
59 + " - bases: " + names.join(", ") + " are mutually dependent" +
60 + (someUnknown ? noDecls : ""));
61 + case "chain":
62 + cName = a2.prototype.hasOwnProperty("declaredClass") && a2.prototype.declaredClass;
63 + name = a4.prototype.hasOwnProperty("declaredClass") && a4.prototype.declaredClass;
64 + someUnknown = !(cName && name);
65 + throw new ChainingError("dcl: conflicting chain directives from bases found in: " + (cName || ("UNNAMED_" + a2._uniqueId)) +
66 + ", method: " + a1 + " - it was " + chainName(a3) + " yet " +
67 + (name || ("UNNAMED_" + a4._uniqueId)) + " sets it to " + chainName(a5) +
68 + (someUnknown ? noDecls : ""));
69 + case "set chaining":
70 + cName = a2.prototype.hasOwnProperty("declaredClass") && a2.prototype.declaredClass;
71 + someUnknown = !cName;
72 + throw new SetChainingError("dcl: attempt to set conflicting chain directives in: " + (cName || ("UNNAMED_" + a2._uniqueId)) +
73 + ", method: " + a1 + " - it was " + chainName(a4) + " yet being changed to " + chainName(a3) +
74 + (someUnknown ? noDecls : ""));
75 + case "wrong super call":
76 + cName = a1.prototype.hasOwnProperty("declaredClass") && a1.prototype.declaredClass;
77 + someUnknown = !cName;
78 + throw new SuperCallError("dcl: argument of around advice or supercall decorator should be a function in: " +
79 + (cName || ("UNNAMED_" + a1._uniqueId)) + ", method: " + a2 + (someUnknown ? noDecls : ""));
80 + case "wrong super":
81 + cName = a1.prototype.hasOwnProperty("declaredClass") && a1.prototype.declaredClass;
82 + someUnknown = !cName;
83 + throw new SuperError("dcl: super method should be a function in: " +
84 + (cName || ("UNNAMED_" + a1._uniqueId)) + ", method: " + a2 + (someUnknown ? noDecls : ""));
85 + case "wrong super result":
86 + cName = a1.prototype.hasOwnProperty("declaredClass") && a1.prototype.declaredClass;
87 + someUnknown = !cName;
88 + throw new SuperResultError("dcl: around advice or supercall should return a function in: " +
89 + (cName || ("UNNAMED_" + a1._uniqueId)) + ", method: " + a2 + (someUnknown ? noDecls : ""));
90 + }
91 + throw new DclError("dcl: " + reason);
92 + };
93 + });
94 +
95 + advise.after(dcl, "_postprocess", function(args, ctor){
96 + // validate that chaining is consistent
97 + var meta = ctor._meta, weaver = meta.weaver, bases = meta.bases,
98 + name, chain, base, i, rule;
99 + dcl.allKeys(weaver).forEach(function(name){
100 + chain = (+weaver[name] || 0);
101 + for(i = bases.length - 1; i >= 0; --i){
102 + base = bases[i];
103 + meta = base._meta;
104 + if(meta){
105 + rule = (+meta.weaver[name] || 0);
106 + if(chain != rule && (!chain || rule)){
107 + dcl._error("chain", name, ctor, chain, base, rule);
108 + }
109 + }
110 + }
111 + });
112 + });
113 +
114 + advise.around(dcl, "_instantiate", function(/*sup*/){
115 + return function(advice, previous, node){
116 + if(!advice || !advice.spr || typeof advice.spr.around != "function"){
117 + dcl._error("wrong super call", advice.ctr, node);
118 + }
119 + if(previous && typeof previous != "function"){
120 + dcl._error("wrong super", advice.ctr, node);
121 + }
122 + var t = advice.spr.around(previous);
123 + if(typeof t != "function"){
124 + dcl._error("wrong super result", advice.ctr, node);
125 + }
126 + t.ctr = advice.ctr;
127 + return t;
128 + };
129 + });
130 +
131 + advise(advise, "_instantiate", {
132 + before: function(advice, previous, node){
133 + if(typeof advice != "function"){
134 + dcl._error("wrong super call", node.instance.constructor, node.name);
135 + }
136 + if(previous && typeof previous != "function"){
137 + dcl._error("wrong super", node.instance.constructor, node.name);
138 + }
139 + },
140 + after: function(a, result){
141 + if(typeof result != "function"){
142 + dcl._error("wrong super result", a[2].instance.constructor, a[2].name);
143 + }
144 + }
145 + });
146 +
147 + function logCtor(ctor){
148 + var meta = ctor._meta;
149 + if(!meta){
150 + console.log("*** class does not have meta information compatible with dcl");
151 + return;
152 + }
153 + var weaver = meta.weaver, bases = meta.bases, chains = meta.chains, names = [], base, name, someUnknown, i;
154 + for(i = 0; i < bases.length; ++i){
155 + base = bases[i];
156 + name = base.prototype.hasOwnProperty("declaredClass") && base.prototype.declaredClass;
157 + if(!name){
158 + name = "UNNAMED_" + (base.hasOwnProperty("_uniqueId") ? base._uniqueId : "");
159 + someUnknown = true;
160 + }
161 + names.push(name);
162 + }
163 + console.log("*** class " + names[0] + " depends on " + (names.length - 1) + " classes");
164 + if(names.length > 1){
165 + console.log(" dependencies: " + names.slice(1).join(", "));
166 + }
167 + if(someUnknown){
168 + console.log(" " + noDecls);
169 + }
170 + dcl.allKeys(weaver).forEach(function(name){
171 + i = +weaver[name];
172 + if(!isNaN(i)){
173 + var hasStub = typeof ctor.prototype[name].advices == "object";
174 + if(hasStub){
175 + var b = dcl._extractChain(bases, name, "b").length,
176 + f = dcl._extractChain(bases, name, "f").length,
177 + a = dcl._extractChain(bases, name, "a").length;
178 + }
179 + console.log(" class method " + name + " is " + chainName(i) +
180 + (hasStub ?
181 + ", and has an AOP stub (before: " + b + ", around: " + f + ", after: " + a + ")" :
182 + " (length: " + chains[name].length + ")" ));
183 + }
184 + });
185 + }
186 +
187 + function countAdvices(node, chain){
188 + for(var counter = 0, p = node[chain]; p != node; p = p[chain], ++counter);
189 + return counter;
190 + }
191 +
192 + function log(o, suppressCtor){
193 + switch(typeof o){
194 + case "function":
195 + logCtor(o);
196 + return;
197 + case "object":
198 + var base = o.constructor,
199 + name = base.prototype.hasOwnProperty("declaredClass") && base.prototype.declaredClass;
200 + if(!name){
201 + name = "UNNAMED_" + (base.hasOwnProperty("_uniqueId") ? base._uniqueId : "");
202 + }
203 + console.log("*** object of class " + name);
204 + // log the constructor
205 + if(!suppressCtor){
206 + logCtor(base);
207 + }
208 + // log methods
209 + dcl.allKeys(o).forEach(function(name){
210 + var f = o[name], b, r, a;
211 + if(typeof f == "function"){
212 + if(f.adviceNode && f.adviceNode instanceof advise.Node){
213 + b = countAdvices(f.adviceNode, "pb");
214 + r = countAdvices(f.adviceNode, "pf");
215 + a = countAdvices(f.adviceNode, "pa");
216 + console.log(" object method " + name + " has an AOP stub (before: " +
217 + b + ", around: " + r + ", after: " + a + ")");
218 + }
219 + }
220 + });
221 + return;
222 + }
223 + console.log(o);
224 + }
225 +
226 + return {
227 + log: log,
228 + DclError: DclError,
229 + CycleError: CycleError,
230 + ChainingError: ChainingError,
231 + SetChainingError: SetChainingError,
232 + SuperCallError: SuperCallError,
233 + SuperError: SuperError,
234 + SuperResultError: SuperResultError
235 + };
236 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define(["./mini", "./advise"], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory(require("./mini"), require("./advise"));
6 + }else{
7 + factory(dcl, advise);
8 + }
9 +})(function(dcl, advise){
10 + var empty = {}, t;
11 +
12 + function inherited(ctor, name, args){
13 + var callee = arguments.length < 3 && ctor.callee, // callee is truthy if in non-strict mode.
14 + f = get.call(this, callee ? callee.ctr : ctor, callee ? callee.nom : name);
15 + if(f){ return f.apply(this, callee ? ctor || name : args); }
16 + // intentionally no return
17 + }
18 +
19 + function get(ctor, name){
20 + var meta = this.constructor._meta, bases, base, i, l;
21 + if(+meta.weaver[name]){
22 + return; // return undefined
23 + }
24 + if(meta){
25 + if(meta.chains.hasOwnProperty(name)){
26 + if((bases = meta.chains[name])){ // intentional assignment
27 + for(i = bases.length - 1; i >= 0; --i){
28 + base = bases[i];
29 + if(base.ctr === ctor){
30 + return i > 0 ? bases[i - 1] : 0;
31 + }
32 + }
33 + }
34 + return; // return undefined
35 + }
36 + for(bases = meta.bases, i = bases.length - 1; i >= 0; --i){
37 + if(bases[i] === ctor){
38 + break;
39 + }
40 + }
41 + if(i >= 0){
42 + for(++i, l = bases.length; i < l; ++i){
43 + if((meta = (base = bases[i])._meta)){ // intentional assignments
44 + if((meta = meta.ownProps).hasOwnProperty(name)){ // intentional assignment
45 + return meta[name];
46 + }
47 + }else{
48 + return base.prototype[name];
49 + }
50 + }
51 + }
52 + }
53 + return empty[name];
54 + }
55 +
56 + advise.after(dcl, "_postprocess", function(args, ctor){
57 + // decorate all methods with necessary nom/ctr variables
58 + var bases = ctor._meta.bases, i = bases.length - 1, base, meta, name, f;
59 + for(; i >= 0; --i){
60 + base = bases[i];
61 + if((meta = base._meta)){ // intentional assignment
62 + meta = meta.ownProps;
63 + dcl.allKeys(meta).some(function(name){
64 + f = meta[name];
65 + if(typeof f == "function"){
66 + if(f.nom === name){ return 1; }
67 + f.nom = name;
68 + f.ctr = base;
69 + }
70 + });
71 + }
72 + }
73 + ctor.prototype.inherited = inherited;
74 + ctor.prototype.getInherited = get;
75 + });
76 +
77 + dcl.getInherited = inherited.get = get;
78 + return dcl.inherited = inherited; // intentional assignment
79 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define([], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory();
6 + }else{
7 + dcl = factory();
8 + }
9 +})(function(){
10 + "use strict";
11 +
12 + var shadowedNames = ["hasOwnProperty", "valueOf", "isPrototypeOf", "propertyIsEnumerable",
13 + "toLocaleString", "toString", "constructor"], op = Object.prototype;
14 + for(var post in {toString: 1}){
15 + shadowedNames = [];
16 + }
17 +
18 + function allKeys(o){
19 + var keys = [];
20 + for(var name in o){
21 + var t = o[name];
22 + if(t !== op[name] || !(name in op)){
23 + keys.push(name);
24 + }
25 + }
26 + for(var i = 0; name = shadowedNames[i]; ++i){ // intentional assignment
27 + var t = o[name];
28 + if(t !== op[name] || !(name in op)){
29 + keys.push(name);
30 + }
31 + }
32 + return keys;
33 + }
34 +
35 + var counter = 0, cname = "constructor", pname = "prototype", empty = {}, mix;
36 +
37 + function dcl(superClass, props){
38 + var bases = [0], proto, base, ctor, meta, connectionMap,
39 + output, vector, superClasses, i, j = 0, n;
40 +
41 + if(superClass){
42 + if(superClass instanceof Array){
43 + // mixins: C3 MRO
44 + connectionMap = {};
45 + superClasses = superClass.slice(0).reverse();
46 + for(i = superClasses.length - 1; i >= 0; --i){
47 + base = superClasses[i];
48 + // pre-process a base
49 + // 1) add a unique id
50 + base._uniqueId = base._uniqueId || counter++;
51 + // 2) build a connection map and the base list
52 + if((proto = base._meta)){ // intentional assignment
53 + for(vector = proto.bases, j = vector.length - 1; j > 0; --j){
54 + n = vector[j]._uniqueId;
55 + connectionMap[n] = (connectionMap[n] || 0) + 1;
56 + }
57 + superClasses[i] = vector.slice(0);
58 + }else{
59 + superClasses[i] = [base];
60 + }
61 + }
62 + // build output
63 + output = {};
64 + c: while(superClasses.length){
65 + for(i = 0; i < superClasses.length; ++i){
66 + vector = superClasses[i];
67 + base = vector[0];
68 + n = base._uniqueId;
69 + if(!connectionMap[n]){
70 + if(!output[n]){
71 + bases.push(base);
72 + output[n] = 1;
73 + }
74 + vector.shift();
75 + if(vector.length){
76 + --connectionMap[vector[0]._uniqueId];
77 + }else{
78 + superClasses.splice(i, 1);
79 + }
80 + continue c;
81 + }
82 + }
83 + // error
84 + dcl._error("cycle", props, superClasses);
85 + }
86 + // calculate a base class
87 + superClass = superClass[0];
88 + j = bases.length - ((meta = superClass._meta) && superClass === bases[bases.length - (j = meta.bases.length)] ? j : 1) - 1; // intentional assignments
89 + }else{
90 + // 1) add a unique id
91 + superClass._uniqueId = superClass._uniqueId || counter++;
92 + // 2) single inheritance
93 + bases = bases.concat((meta = superClass._meta) ? meta.bases : superClass); // intentional assignment
94 + }
95 + }
96 + // create a base class
97 + proto = superClass ? dcl.delegate(superClass[pname]) : {};
98 + // the next line assumes that constructor is actually named "constructor", should be changed if desired
99 + vector = superClass && (meta = superClass._meta) ? dcl.delegate(meta.weaver) : {constructor: 2}; // intentional assignment
100 +
101 + // create prototype: mix in mixins and props
102 + for(; j > 0; --j){
103 + base = bases[j];
104 + meta = base._meta;
105 + dcl.mix(proto, meta && meta.ownProps || base[pname]);
106 + if(meta){
107 + allKeys(superClasses = meta.weaver).forEach(function(n){ // intentional assignment
108 + vector[n] = (+vector[n] || 0) | superClasses[n];
109 + });
110 + }
111 + }
112 + allKeys(props).forEach(function(n){
113 + if(isSuper(meta = props[n])){ // intentional assignment
114 + vector[n] = +vector[n] || 0;
115 + }else{
116 + proto[n] = meta;
117 + }
118 + });
119 +
120 + // create stubs with fake constructor
121 + //
122 + meta = {bases: bases, ownProps: props, weaver: vector, chains: {}};
123 + // meta information is coded like that:
124 + // bases: an array of super classes (bases) and mixins
125 + // ownProps: a bag of immediate prototype properties for the constructor
126 + // weaver: a bag of chain instructions (before is 1, after is 2)
127 + // chains: a bag of chains (ordered arrays)
128 +
129 + bases[0] = {_meta: meta, prototype: proto};
130 + buildStubs(meta, proto);
131 + ctor = proto[cname];
132 +
133 + // put in place all decorations and return a constructor
134 + ctor._meta = meta;
135 + ctor[pname] = proto;
136 + //proto.constructor = ctor; // uncomment if constructor is not named "constructor"
137 + bases[0] = ctor;
138 +
139 + // each constructor may have two properties on it:
140 + // _meta: a meta information object as above
141 + // _uniqueId: a unique number, which is used to id the constructor
142 +
143 + return dcl._postprocess(ctor); // fully prepared constructor
144 + }
145 +
146 + // decorators
147 +
148 + function Super(f){ this.around = f; }
149 + function isSuper(f){ return f && f.spr instanceof Super; }
150 +
151 + // utilities
152 +
153 + (mix = function(a, b){
154 + allKeys(b).forEach(function(n){
155 + a[n] = b[n];
156 + });
157 + })(dcl, {
158 + // piblic API
159 + mix: mix,
160 + delegate: function(o){
161 + return Object.create(o);
162 + },
163 + allKeys: allKeys,
164 + Super: Super,
165 + superCall: function superCall(f){ return dcl._makeSuper(f); },
166 +
167 + // protected API starts with _ (don't use it!)
168 +
169 + // make a Super marker
170 + _makeSuper: function makeSuper(advice, S){ var f = function(){}; f.spr = new (S || Super)(advice); return f; },
171 +
172 + // post-processor for a constructor, can be used to add more functionality
173 + // or augment its behavior
174 + _postprocess: function(ctor){ return ctor; }, // identity, used to hang on advices
175 +
176 + // error function, augmented by debug.js
177 + _error: function(msg){ throw Error("dcl: " + msg); },
178 +
179 + // supercall instantiation, augmented by debug.js
180 + _instantiate: function(advice, previous, node){ var t = advice.spr.around(previous); t.ctr = advice.ctr; return t; },
181 +
182 + // the "buildStubs()" helpers, can be overwritten
183 + _extractChain: function(bases, name, advice){
184 + var i = bases.length - 1, chain = [], base, f, around = advice == "around";
185 + for(; base = bases[i]; --i){
186 + // next line contains 5 intentional assignments
187 + if((f = base._meta) ? (f = f.ownProps).hasOwnProperty(name) && (isSuper(f = f[name]) ? (around ? f.spr.around : (f = f.spr[advice])) : around) : around && (f = name == cname ? base : base[pname][name]) && f !== empty[name]){
188 + f.ctr = base;
189 + chain.push(f);
190 + }
191 + }
192 + return chain;
193 + },
194 + _stubChain: function(chain){ // this is "after" chain
195 + var l = chain.length, f;
196 + return !l ? 0 : l == 1 ?
197 + (f = chain[0], function(){
198 + f.apply(this, arguments);
199 + }) :
200 + function(){
201 + for(var i = 0; i < l; ++i){
202 + chain[i].apply(this, arguments);
203 + }
204 + };
205 + },
206 + _stubSuper: function(chain, name){
207 + var i = 0, f, p = empty[name];
208 + for(; f = chain[i]; ++i){
209 + p = isSuper(f) ? (chain[i] = dcl._instantiate(f, p, name)) : f;
210 + }
211 + return name != cname ? p : function(){ p.apply(this, arguments); };
212 + },
213 + _stubChainSuper: function(chain, stub, name){
214 + var i = 0, f, diff, pi = 0;
215 + for(; f = chain[i]; ++i){
216 + if(isSuper(f)){
217 + diff = i - pi;
218 + chain[i] = dcl._instantiate(f, !diff ? 0 : diff == 1 ? chain[pi] : stub(chain.slice(pi, i)), name);
219 + pi = i;
220 + }
221 + }
222 + diff = i - pi;
223 + return !diff ? 0 : diff == 1 && name != cname ? chain[pi] : stub(pi ? chain.slice(pi) : chain);
224 + },
225 + _stub: /*generic stub*/ function(id, bases, name, chains){
226 + var f = chains[name] = dcl._extractChain(bases, name, "around");
227 + return (id ? dcl._stubChainSuper(f, dcl._stubChain, name) : dcl._stubSuper(f, name)) || function(){};
228 + }
229 + });
230 +
231 + function buildStubs(meta, proto){
232 + var weaver = meta.weaver, bases = meta.bases, chains = meta.chains;
233 + allKeys(weaver).forEach(function(name){
234 + proto[name] = dcl._stub(weaver[name], bases, name, chains);
235 + });
236 + }
237 +
238 + return dcl;
239 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define([], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory();
6 + }else{
7 + dcl = factory();
8 + }
9 +})(function(){
10 + "use strict";
11 +
12 + var counter = 0, cname = "constructor", pname = "prototype", empty = {}, mix;
13 +
14 + function dcl(superClass, props){
15 + var bases = [0], proto, base, ctor, meta, connectionMap,
16 + output, vector, superClasses, i, j = 0, n;
17 +
18 + if(superClass){
19 + if(superClass instanceof Array){
20 + // mixins: C3 MRO
21 + connectionMap = {};
22 + superClasses = superClass.slice(0).reverse();
23 + for(i = superClasses.length - 1; i >= 0; --i){
24 + base = superClasses[i];
25 + // pre-process a base
26 + // 1) add a unique id
27 + base._uniqueId = base._uniqueId || counter++;
28 + // 2) build a connection map and the base list
29 + if((proto = base._meta)){ // intentional assignment
30 + for(vector = proto.bases, j = vector.length - 1; j > 0; --j){
31 + n = vector[j]._uniqueId;
32 + connectionMap[n] = (connectionMap[n] || 0) + 1;
33 + }
34 + superClasses[i] = vector.slice(0);
35 + }else{
36 + superClasses[i] = [base];
37 + }
38 + }
39 + // build output
40 + output = {};
41 + c: while(superClasses.length){
42 + for(i = 0; i < superClasses.length; ++i){
43 + vector = superClasses[i];
44 + base = vector[0];
45 + n = base._uniqueId;
46 + if(!connectionMap[n]){
47 + if(!output[n]){
48 + bases.push(base);
49 + output[n] = 1;
50 + }
51 + vector.shift();
52 + if(vector.length){
53 + --connectionMap[vector[0]._uniqueId];
54 + }else{
55 + superClasses.splice(i, 1);
56 + }
57 + continue c;
58 + }
59 + }
60 + // error
61 + dcl._error("cycle", props, superClasses);
62 + }
63 + // calculate a base class
64 + superClass = superClass[0];
65 + j = bases.length - ((meta = superClass._meta) && superClass === bases[bases.length - (j = meta.bases.length)] ? j : 1) - 1; // intentional assignments
66 + }else{
67 + // 1) add a unique id
68 + superClass._uniqueId = superClass._uniqueId || counter++;
69 + // 2) single inheritance
70 + bases = bases.concat((meta = superClass._meta) ? meta.bases : superClass); // intentional assignment
71 + }
72 + }
73 + // create a base class
74 + proto = superClass ? dcl.delegate(superClass[pname]) : {};
75 + // the next line assumes that constructor is actually named "constructor", should be changed if desired
76 + vector = superClass && (meta = superClass._meta) ? dcl.delegate(meta.weaver) : {constructor: 2}; // intentional assignment
77 +
78 + // create prototype: mix in mixins and props
79 + for(; j > 0; --j){
80 + base = bases[j];
81 + meta = base._meta;
82 + dcl.mix(proto, meta && meta.ownProps || base[pname]);
83 + if(meta){
84 + for(n in (superClasses = meta.weaver)){ // intentional assignment
85 + vector[n] = (+vector[n] || 0) | superClasses[n];
86 + }
87 + }
88 + }
89 + for(n in props){
90 + if(isSuper(meta = props[n])){ // intentional assignment
91 + vector[n] = +vector[n] || 0;
92 + }else{
93 + proto[n] = meta;
94 + }
95 + }
96 +
97 + // create stubs with fake constructor
98 + //
99 + meta = {bases: bases, ownProps: props, weaver: vector, chains: {}};
100 + // meta information is coded like that:
101 + // bases: an array of super classes (bases) and mixins
102 + // ownProps: a bag of immediate prototype properties for the constructor
103 + // weaver: a bag of chain instructions (before is 1, after is 2)
104 + // chains: a bag of chains (ordered arrays)
105 +
106 + bases[0] = {_meta: meta, prototype: proto};
107 + buildStubs(meta, proto);
108 + ctor = proto[cname];
109 +
110 + // put in place all decorations and return a constructor
111 + ctor._meta = meta;
112 + ctor[pname] = proto;
113 + //proto.constructor = ctor; // uncomment if constructor is not named "constructor"
114 + bases[0] = ctor;
115 +
116 + // each constructor may have two properties on it:
117 + // _meta: a meta information object as above
118 + // _uniqueId: a unique number, which is used to id the constructor
119 +
120 + return dcl._postprocess(ctor); // fully prepared constructor
121 + }
122 +
123 + // decorators
124 +
125 + function Super(f){ this.around = f; }
126 + function isSuper(f){ return f && f.spr instanceof Super; }
127 +
128 + // utilities
129 +
130 + function allKeys(o){
131 + var keys = [];
132 + for(var name in o){
133 + keys.push(name);
134 + }
135 + return keys;
136 + }
137 +
138 + (mix = function(a, b){
139 + for(var n in b){
140 + a[n] = b[n];
141 + }
142 + })(dcl, {
143 + // piblic API
144 + mix: mix,
145 + delegate: function(o){
146 + return Object.create(o);
147 + },
148 + allKeys: allKeys,
149 + Super: Super,
150 + superCall: function superCall(f){ return dcl._makeSuper(f); },
151 +
152 + // protected API starts with _ (don't use it!)
153 +
154 + // make a Super marker
155 + _makeSuper: function makeSuper(advice, S){ var f = function(){}; f.spr = new (S || Super)(advice); return f; },
156 +
157 + // post-processor for a constructor, can be used to add more functionality
158 + // or augment its behavior
159 + _postprocess: function(ctor){ return ctor; }, // identity, used to hang on advices
160 +
161 + // error function, augmented by debug.js
162 + _error: function(msg){ throw Error("dcl: " + msg); },
163 +
164 + // supercall instantiation, augmented by debug.js
165 + _instantiate: function(advice, previous, node){ var t = advice.spr.around(previous); t.ctr = advice.ctr; return t; },
166 +
167 + // the "buildStubs()" helpers, can be overwritten
168 + _extractChain: function(bases, name, advice){
169 + var i = bases.length - 1, chain = [], base, f, around = advice == "around";
170 + for(; base = bases[i]; --i){
171 + // next line contains 5 intentional assignments
172 + if((f = base._meta) ? (f = f.ownProps).hasOwnProperty(name) && (isSuper(f = f[name]) ? (around ? f.spr.around : (f = f.spr[advice])) : around) : around && (f = name == cname ? base : base[pname][name]) && f !== empty[name]){
173 + f.ctr = base;
174 + chain.push(f);
175 + }
176 + }
177 + return chain;
178 + },
179 + _stubChain: function(chain){ // this is "after" chain
180 + var l = chain.length, f;
181 + return !l ? 0 : l == 1 ?
182 + (f = chain[0], function(){
183 + f.apply(this, arguments);
184 + }) :
185 + function(){
186 + for(var i = 0; i < l; ++i){
187 + chain[i].apply(this, arguments);
188 + }
189 + };
190 + },
191 + _stubSuper: function(chain, name){
192 + var i = 0, f, p = empty[name];
193 + for(; f = chain[i]; ++i){
194 + p = isSuper(f) ? (chain[i] = dcl._instantiate(f, p, name)) : f;
195 + }
196 + return name != cname ? p : function(){ p.apply(this, arguments); };
197 + },
198 + _stubChainSuper: function(chain, stub, name){
199 + var i = 0, f, diff, pi = 0;
200 + for(; f = chain[i]; ++i){
201 + if(isSuper(f)){
202 + diff = i - pi;
203 + chain[i] = dcl._instantiate(f, !diff ? 0 : diff == 1 ? chain[pi] : stub(chain.slice(pi, i)), name);
204 + pi = i;
205 + }
206 + }
207 + diff = i - pi;
208 + return !diff ? 0 : diff == 1 && name != cname ? chain[pi] : stub(pi ? chain.slice(pi) : chain);
209 + },
210 + _stub: /*generic stub*/ function(id, bases, name, chains){
211 + var f = chains[name] = dcl._extractChain(bases, name, "around");
212 + return (id ? dcl._stubChainSuper(f, dcl._stubChain, name) : dcl._stubSuper(f, name)) || function(){};
213 + }
214 + });
215 +
216 + function buildStubs(meta, proto){
217 + var weaver = meta.weaver, bases = meta.bases, chains = meta.chains;
218 + for(var name in weaver){
219 + proto[name] = dcl._stub(weaver[name], bases, name, chains);
220 + }
221 + }
222 +
223 + return dcl;
224 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define(["../dcl", "./Destroyable"], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory(require("../dcl"), require("./Destroyable"));
6 + }else{
7 + dclMixinsCleanup = factory(dcl, dclMixinsDestroyable);
8 + }
9 +})(function(dcl, Destroyable){
10 + "use strict";
11 + return dcl(Destroyable, {
12 + declaredClass: "dcl/mixins/Cleanup",
13 + constructor: function(){
14 + this.__cleanupStack = [];
15 + },
16 + pushCleanup: function(resource, cleanup){
17 + var f = cleanup ? function(){ cleanup(resource); } : function(){ resource.destroy(); };
18 + this.__cleanupStack.push(f);
19 + return f;
20 + },
21 + popCleanup: function(dontRun){
22 + if(dontRun){
23 + return this.__cleanupStack.pop();
24 + }
25 + this.__cleanupStack.pop()();
26 + },
27 + removeCleanup: function(f){
28 + for(var i = this.__cleanupStack.length - 1; i >= 0; --i){
29 + if(this.__cleanupStack[i] === f){
30 + this.__cleanupStack.splice(i, 1);
31 + return true;
32 + }
33 + }
34 + },
35 + cleanup: function(){
36 + while(this.__cleanupStack.length){
37 + this.__cleanupStack.pop()();
38 + }
39 + },
40 + destroy: function(){
41 + this.cleanup();
42 + }
43 + });
44 +});
1 +(function(factory){
2 + if(typeof define != "undefined"){
3 + define(["../dcl"], factory);
4 + }else if(typeof module != "undefined"){
5 + module.exports = factory(require("../dcl"));
6 + }else{
7 + dclMixinsDestroyable = factory(dcl);
8 + }
9 +})(function(dcl){
10 + "use strict";
11 + var Destroyable = dcl(null, {declaredClass: "dcl/mixins/Destroyable"});
12 + dcl.chainBefore(Destroyable, "destroy");
13 + return Destroyable;
14 +});
1 +var miniExcludes = {
2 + "dcl/AUTHORS": 1,
3 + "dcl/CONTRIBUTING.md": 1,
4 + "dcl/LICENSE": 1,
5 + "dcl/README.md": 1,
6 + "dcl/package": 1
7 + },
8 + isTestRe = /\/tests\//;
9 +
10 +var profile = {
11 + resourceTags: {
12 + test: function(filename, mid){
13 + return isTestRe.test(filename);
14 + },
15 +
16 + miniExclude: function(filename, mid){
17 + return /\/tests\//.test(filename) || mid in miniExcludes;
18 + },
19 +
20 + amd: function(filename, mid){
21 + return /\.js$/.test(filename);
22 + }
23 + }
24 +};
1 +{
2 + "name": "dcl",
3 + "version": "1.1.2",
4 + "description": "Elegant minimalistic implementation of OOP with mixins + AOP.",
5 + "homepage": "http://www.dcljs.org",
6 + "bugs": "http://github.com/uhop/dcl/issues",
7 + "main": "dcl.js",
8 + "directories": {
9 + "test": "tests"
10 + },
11 + "dependencies": {},
12 + "devDependencies": {
13 + "heya-unit": ">=0.1"
14 + },
15 + "scripts": {
16 + "test": "node tests/tests.js"
17 + },
18 + "github": "http://github.com/uhop/dcl",
19 + "repository": {
20 + "type": "git",
21 + "url": "git://github.com/uhop/dcl.git"
22 + },
23 + "keywords": [
24 + "object-oriented",
25 + "programming",
26 + "aspect-oriented",
27 + "OOP",
28 + "AOP",
29 + "OO"
30 + ],
31 + "author": "Eugene Lazutkin <eugene.lazutkin@gmail.com> (http://lazutkin.com/)",
32 + "licenses": [
33 + {
34 + "type": "New BSD",
35 + "url": "http://github.com/uhop/dcl/blob/master/LICENSE"
36 + },
37 + {
38 + "type": "AFL 2.1",
39 + "url": "http://github.com/uhop/dcl/blob/master/LICENSE"
40 + }
41 + ],
42 + "icon": "http://www.dcljs.org/fav144.png",
43 + "dojoBuild": "package.js"
44 +}
1 +{
2 + "name": "dojo",
3 + "homepage": "https://github.com/dojo/dojo",
4 + "version": "1.9.1",
5 + "_release": "1.9.1",
6 + "_resolution": {
7 + "type": "version",
8 + "tag": "1.9.1",
9 + "commit": "b0cf6ea0b62865cd72cb14ccc7bd2478e8867cb8"
10 + },
11 + "_source": "https://github.com/dojo/dojo.git",
12 + "_target": "1.9.1",
13 + "_originalSource": "dojo"
14 +}
...\ No newline at end of file ...\ No newline at end of file
1 +define(["./_base/kernel", "./_base/lang"], function(dojo, lang){
2 +// module:
3 +// dojo/AdapterRegistry
4 +
5 +var AdapterRegistry = dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
6 + // summary:
7 + // A registry to make contextual calling/searching easier.
8 + // description:
9 + // Objects of this class keep list of arrays in the form [name, check,
10 + // wrap, directReturn] that are used to determine what the contextual
11 + // result of a set of checked arguments is. All check/wrap functions
12 + // in this registry should be of the same arity.
13 + // example:
14 + // | // create a new registry
15 + // | var reg = new dojo.AdapterRegistry();
16 + // | reg.register("handleString",
17 + // | dojo.isString,
18 + // | function(str){
19 + // | // do something with the string here
20 + // | }
21 + // | );
22 + // | reg.register("handleArr",
23 + // | dojo.isArray,
24 + // | function(arr){
25 + // | // do something with the array here
26 + // | }
27 + // | );
28 + // |
29 + // | // now we can pass reg.match() *either* an array or a string and
30 + // | // the value we pass will get handled by the right function
31 + // | reg.match("someValue"); // will call the first function
32 + // | reg.match(["someValue"]); // will call the second
33 +
34 + this.pairs = [];
35 + this.returnWrappers = returnWrappers || false; // Boolean
36 +};
37 +
38 +lang.extend(AdapterRegistry, {
39 + register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){
40 + // summary:
41 + // register a check function to determine if the wrap function or
42 + // object gets selected
43 + // name:
44 + // a way to identify this matcher.
45 + // check:
46 + // a function that arguments are passed to from the adapter's
47 + // match() function. The check function should return true if the
48 + // given arguments are appropriate for the wrap function.
49 + // directReturn:
50 + // If directReturn is true, the value passed in for wrap will be
51 + // returned instead of being called. Alternately, the
52 + // AdapterRegistry can be set globally to "return not call" using
53 + // the returnWrappers property. Either way, this behavior allows
54 + // the registry to act as a "search" function instead of a
55 + // function interception library.
56 + // override:
57 + // If override is given and true, the check function will be given
58 + // highest priority. Otherwise, it will be the lowest priority
59 + // adapter.
60 + this.pairs[((override) ? "unshift" : "push")]([name, check, wrap, directReturn]);
61 + },
62 +
63 + match: function(/* ... */){
64 + // summary:
65 + // Find an adapter for the given arguments. If no suitable adapter
66 + // is found, throws an exception. match() accepts any number of
67 + // arguments, all of which are passed to all matching functions
68 + // from the registered pairs.
69 + for(var i = 0; i < this.pairs.length; i++){
70 + var pair = this.pairs[i];
71 + if(pair[1].apply(this, arguments)){
72 + if((pair[3])||(this.returnWrappers)){
73 + return pair[2];
74 + }else{
75 + return pair[2].apply(this, arguments);
76 + }
77 + }
78 + }
79 + throw new Error("No match found");
80 + },
81 +
82 + unregister: function(name){
83 + // summary:
84 + // Remove a named adapter from the registry
85 + // name: String
86 + // The name of the adapter.
87 + // returns: Boolean
88 + // Returns true if operation is successful.
89 + // Returns false if operation fails.
90 +
91 + // FIXME: this is kind of a dumb way to handle this. On a large
92 + // registry this will be slow-ish and we can use the name as a lookup
93 + // should we choose to trade memory for speed.
94 + for(var i = 0; i < this.pairs.length; i++){
95 + var pair = this.pairs[i];
96 + if(pair[0] == name){
97 + this.pairs.splice(i, 1);
98 + return true;
99 + }
100 + }
101 + return false;
102 + }
103 +});
104 +
105 +return AdapterRegistry;
106 +});
1 +define([
2 + "./has",
3 + "./_base/lang",
4 + "./errors/CancelError",
5 + "./promise/Promise",
6 + "./has!config-deferredInstrumentation?./promise/instrumentation"
7 +], function(has, lang, CancelError, Promise, instrumentation){
8 + "use strict";
9 +
10 + // module:
11 + // dojo/Deferred
12 +
13 + var PROGRESS = 0,
14 + RESOLVED = 1,
15 + REJECTED = 2;
16 + var FULFILLED_ERROR_MESSAGE = "This deferred has already been fulfilled.";
17 +
18 + var freezeObject = Object.freeze || function(){};
19 +
20 + var signalWaiting = function(waiting, type, result, rejection, deferred){
21 + if(has("config-deferredInstrumentation")){
22 + if(type === REJECTED && Deferred.instrumentRejected && waiting.length === 0){
23 + Deferred.instrumentRejected(result, false, rejection, deferred);
24 + }
25 + }
26 +
27 + for(var i = 0; i < waiting.length; i++){
28 + signalListener(waiting[i], type, result, rejection);
29 + }
30 + };
31 +
32 + var signalListener = function(listener, type, result, rejection){
33 + var func = listener[type];
34 + var deferred = listener.deferred;
35 + if(func){
36 + try{
37 + var newResult = func(result);
38 + if(type === PROGRESS){
39 + if(typeof newResult !== "undefined"){
40 + signalDeferred(deferred, type, newResult);
41 + }
42 + }else{
43 + if(newResult && typeof newResult.then === "function"){
44 + listener.cancel = newResult.cancel;
45 + newResult.then(
46 + // Only make resolvers if they're actually going to be used
47 + makeDeferredSignaler(deferred, RESOLVED),
48 + makeDeferredSignaler(deferred, REJECTED),
49 + makeDeferredSignaler(deferred, PROGRESS));
50 + return;
51 + }
52 + signalDeferred(deferred, RESOLVED, newResult);
53 + }
54 + }catch(error){
55 + signalDeferred(deferred, REJECTED, error);
56 + }
57 + }else{
58 + signalDeferred(deferred, type, result);
59 + }
60 +
61 + if(has("config-deferredInstrumentation")){
62 + if(type === REJECTED && Deferred.instrumentRejected){
63 + Deferred.instrumentRejected(result, !!func, rejection, deferred.promise);
64 + }
65 + }
66 + };
67 +
68 + var makeDeferredSignaler = function(deferred, type){
69 + return function(value){
70 + signalDeferred(deferred, type, value);
71 + };
72 + };
73 +
74 + var signalDeferred = function(deferred, type, result){
75 + if(!deferred.isCanceled()){
76 + switch(type){
77 + case PROGRESS:
78 + deferred.progress(result);
79 + break;
80 + case RESOLVED:
81 + deferred.resolve(result);
82 + break;
83 + case REJECTED:
84 + deferred.reject(result);
85 + break;
86 + }
87 + }
88 + };
89 +
90 + var Deferred = function(canceler){
91 + // summary:
92 + // Creates a new deferred. This API is preferred over
93 + // `dojo/_base/Deferred`.
94 + // description:
95 + // Creates a new deferred, as an abstraction over (primarily)
96 + // asynchronous operations. The deferred is the private interface
97 + // that should not be returned to calling code. That's what the
98 + // `promise` is for. See `dojo/promise/Promise`.
99 + // canceler: Function?
100 + // Will be invoked if the deferred is canceled. The canceler
101 + // receives the reason the deferred was canceled as its argument.
102 + // The deferred is rejected with its return value, or a new
103 + // `dojo/errors/CancelError` instance.
104 +
105 + // promise: dojo/promise/Promise
106 + // The public promise object that clients can add callbacks to.
107 + var promise = this.promise = new Promise();
108 +
109 + var deferred = this;
110 + var fulfilled, result, rejection;
111 + var canceled = false;
112 + var waiting = [];
113 +
114 + if(has("config-deferredInstrumentation") && Error.captureStackTrace){
115 + Error.captureStackTrace(deferred, Deferred);
116 + Error.captureStackTrace(promise, Deferred);
117 + }
118 +
119 + this.isResolved = promise.isResolved = function(){
120 + // summary:
121 + // Checks whether the deferred has been resolved.
122 + // returns: Boolean
123 +
124 + return fulfilled === RESOLVED;
125 + };
126 +
127 + this.isRejected = promise.isRejected = function(){
128 + // summary:
129 + // Checks whether the deferred has been rejected.
130 + // returns: Boolean
131 +
132 + return fulfilled === REJECTED;
133 + };
134 +
135 + this.isFulfilled = promise.isFulfilled = function(){
136 + // summary:
137 + // Checks whether the deferred has been resolved or rejected.
138 + // returns: Boolean
139 +
140 + return !!fulfilled;
141 + };
142 +
143 + this.isCanceled = promise.isCanceled = function(){
144 + // summary:
145 + // Checks whether the deferred has been canceled.
146 + // returns: Boolean
147 +
148 + return canceled;
149 + };
150 +
151 + this.progress = function(update, strict){
152 + // summary:
153 + // Emit a progress update on the deferred.
154 + // description:
155 + // Emit a progress update on the deferred. Progress updates
156 + // can be used to communicate updates about the asynchronous
157 + // operation before it has finished.
158 + // update: any
159 + // The progress update. Passed to progbacks.
160 + // strict: Boolean?
161 + // If strict, will throw an error if the deferred has already
162 + // been fulfilled and consequently no progress can be emitted.
163 + // returns: dojo/promise/Promise
164 + // Returns the original promise for the deferred.
165 +
166 + if(!fulfilled){
167 + signalWaiting(waiting, PROGRESS, update, null, deferred);
168 + return promise;
169 + }else if(strict === true){
170 + throw new Error(FULFILLED_ERROR_MESSAGE);
171 + }else{
172 + return promise;
173 + }
174 + };
175 +
176 + this.resolve = function(value, strict){
177 + // summary:
178 + // Resolve the deferred.
179 + // description:
180 + // Resolve the deferred, putting it in a success state.
181 + // value: any
182 + // The result of the deferred. Passed to callbacks.
183 + // strict: Boolean?
184 + // If strict, will throw an error if the deferred has already
185 + // been fulfilled and consequently cannot be resolved.
186 + // returns: dojo/promise/Promise
187 + // Returns the original promise for the deferred.
188 +
189 + if(!fulfilled){
190 + // Set fulfilled, store value. After signaling waiting listeners unset
191 + // waiting.
192 + signalWaiting(waiting, fulfilled = RESOLVED, result = value, null, deferred);
193 + waiting = null;
194 + return promise;
195 + }else if(strict === true){
196 + throw new Error(FULFILLED_ERROR_MESSAGE);
197 + }else{
198 + return promise;
199 + }
200 + };
201 +
202 + var reject = this.reject = function(error, strict){
203 + // summary:
204 + // Reject the deferred.
205 + // description:
206 + // Reject the deferred, putting it in an error state.
207 + // error: any
208 + // The error result of the deferred. Passed to errbacks.
209 + // strict: Boolean?
210 + // If strict, will throw an error if the deferred has already
211 + // been fulfilled and consequently cannot be rejected.
212 + // returns: dojo/promise/Promise
213 + // Returns the original promise for the deferred.
214 +
215 + if(!fulfilled){
216 + if(has("config-deferredInstrumentation") && Error.captureStackTrace){
217 + Error.captureStackTrace(rejection = {}, reject);
218 + }
219 + signalWaiting(waiting, fulfilled = REJECTED, result = error, rejection, deferred);
220 + waiting = null;
221 + return promise;
222 + }else if(strict === true){
223 + throw new Error(FULFILLED_ERROR_MESSAGE);
224 + }else{
225 + return promise;
226 + }
227 + };
228 +
229 + this.then = promise.then = function(callback, errback, progback){
230 + // summary:
231 + // Add new callbacks to the deferred.
232 + // description:
233 + // Add new callbacks to the deferred. Callbacks can be added
234 + // before or after the deferred is fulfilled.
235 + // callback: Function?
236 + // Callback to be invoked when the promise is resolved.
237 + // Receives the resolution value.
238 + // errback: Function?
239 + // Callback to be invoked when the promise is rejected.
240 + // Receives the rejection error.
241 + // progback: Function?
242 + // Callback to be invoked when the promise emits a progress
243 + // update. Receives the progress update.
244 + // returns: dojo/promise/Promise
245 + // Returns a new promise for the result of the callback(s).
246 + // This can be used for chaining many asynchronous operations.
247 +
248 + var listener = [progback, callback, errback];
249 + // Ensure we cancel the promise we're waiting for, or if callback/errback
250 + // have returned a promise, cancel that one.
251 + listener.cancel = promise.cancel;
252 + listener.deferred = new Deferred(function(reason){
253 + // Check whether cancel is really available, returned promises are not
254 + // required to expose `cancel`
255 + return listener.cancel && listener.cancel(reason);
256 + });
257 + if(fulfilled && !waiting){
258 + signalListener(listener, fulfilled, result, rejection);
259 + }else{
260 + waiting.push(listener);
261 + }
262 + return listener.deferred.promise;
263 + };
264 +
265 + this.cancel = promise.cancel = function(reason, strict){
266 + // summary:
267 + // Inform the deferred it may cancel its asynchronous operation.
268 + // description:
269 + // Inform the deferred it may cancel its asynchronous operation.
270 + // The deferred's (optional) canceler is invoked and the
271 + // deferred will be left in a rejected state. Can affect other
272 + // promises that originate with the same deferred.
273 + // reason: any
274 + // A message that may be sent to the deferred's canceler,
275 + // explaining why it's being canceled.
276 + // strict: Boolean?
277 + // If strict, will throw an error if the deferred has already
278 + // been fulfilled and consequently cannot be canceled.
279 + // returns: any
280 + // Returns the rejection reason if the deferred was canceled
281 + // normally.
282 +
283 + if(!fulfilled){
284 + // Cancel can be called even after the deferred is fulfilled
285 + if(canceler){
286 + var returnedReason = canceler(reason);
287 + reason = typeof returnedReason === "undefined" ? reason : returnedReason;
288 + }
289 + canceled = true;
290 + if(!fulfilled){
291 + // Allow canceler to provide its own reason, but fall back to a CancelError
292 + if(typeof reason === "undefined"){
293 + reason = new CancelError();
294 + }
295 + reject(reason);
296 + return reason;
297 + }else if(fulfilled === REJECTED && result === reason){
298 + return reason;
299 + }
300 + }else if(strict === true){
301 + throw new Error(FULFILLED_ERROR_MESSAGE);
302 + }
303 + };
304 +
305 + freezeObject(promise);
306 + };
307 +
308 + Deferred.prototype.toString = function(){
309 + // returns: String
310 + // Returns `[object Deferred]`.
311 +
312 + return "[object Deferred]";
313 + };
314 +
315 + if(instrumentation){
316 + instrumentation(Deferred);
317 + }
318 +
319 + return Deferred;
320 +});
1 +define(["./_base/kernel", "./_base/Deferred", "./_base/array"], function(dojo, Deferred, darray){
2 + // module:
3 + // dojo/DeferredList
4 +
5 +
6 +dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){
7 + // summary:
8 + // Deprecated, use dojo/promise/all instead.
9 + // Provides event handling for a group of Deferred objects.
10 + // description:
11 + // DeferredList takes an array of existing deferreds and returns a new deferred of its own
12 + // this new deferred will typically have its callback fired when all of the deferreds in
13 + // the given list have fired their own deferreds. The parameters `fireOnOneCallback` and
14 + // fireOnOneErrback, will fire before all the deferreds as appropriate
15 + // list:
16 + // The list of deferreds to be synchronizied with this DeferredList
17 + // fireOnOneCallback:
18 + // Will cause the DeferredLists callback to be fired as soon as any
19 + // of the deferreds in its list have been fired instead of waiting until
20 + // the entire list has finished
21 + // fireonOneErrback:
22 + // Will cause the errback to fire upon any of the deferreds errback
23 + // canceller:
24 + // A deferred canceller function, see dojo.Deferred
25 + var resultList = [];
26 + Deferred.call(this);
27 + var self = this;
28 + if(list.length === 0 && !fireOnOneCallback){
29 + this.resolve([0, []]);
30 + }
31 + var finished = 0;
32 + darray.forEach(list, function(item, i){
33 + item.then(function(result){
34 + if(fireOnOneCallback){
35 + self.resolve([i, result]);
36 + }else{
37 + addResult(true, result);
38 + }
39 + },function(error){
40 + if(fireOnOneErrback){
41 + self.reject(error);
42 + }else{
43 + addResult(false, error);
44 + }
45 + if(consumeErrors){
46 + return null;
47 + }
48 + throw error;
49 + });
50 + function addResult(succeeded, result){
51 + resultList[i] = [succeeded, result];
52 + finished++;
53 + if(finished === list.length){
54 + self.resolve(resultList);
55 + }
56 +
57 + }
58 + });
59 +};
60 +dojo.DeferredList.prototype = new Deferred();
61 +
62 +dojo.DeferredList.prototype.gatherResults = function(deferredList){
63 + // summary:
64 + // Gathers the results of the deferreds for packaging
65 + // as the parameters to the Deferred Lists' callback
66 + // deferredList: dojo/DeferredList
67 + // The deferred list from which this function gathers results.
68 + // returns: dojo/DeferredList
69 + // The newly created deferred list which packs results as
70 + // parameters to its callback.
71 +
72 + var d = new dojo.DeferredList(deferredList, false, true, false);
73 + d.addCallback(function(results){
74 + var ret = [];
75 + darray.forEach(results, function(result){
76 + ret.push(result[1]);
77 + });
78 + return ret;
79 + });
80 + return d;
81 +};
82 +
83 +return dojo.DeferredList;
84 +});
1 +define(["./aspect", "./on"], function(aspect, on){
2 + // module:
3 + // dojo/Evented
4 +
5 + "use strict";
6 + var after = aspect.after;
7 + function Evented(){
8 + // summary:
9 + // A class that can be used as a mixin or base class,
10 + // to add on() and emit() methods to a class
11 + // for listening for events and emitting events:
12 + //
13 + // | define(["dojo/Evented"], function(Evented){
14 + // | var EventedWidget = dojo.declare([Evented, dijit._Widget], {...});
15 + // | widget = new EventedWidget();
16 + // | widget.on("open", function(event){
17 + // | ... do something with event
18 + // | });
19 + // |
20 + // | widget.emit("open", {name:"some event", ...});
21 + }
22 + Evented.prototype = {
23 + on: function(type, listener){
24 + return on.parse(this, type, listener, function(target, type){
25 + return after(target, 'on' + type, listener, true);
26 + });
27 + },
28 + emit: function(type, event){
29 + var args = [this];
30 + args.push.apply(args, arguments);
31 + return on.emit.apply(on, args);
32 + }
33 + };
34 + return Evented;
35 +});
This diff is collapsed. Click to expand it.
1 +define([
2 + "./_base/kernel", "./query", "./_base/lang", "./_base/array", "./dom-attr"
3 +], function(dojo, query, lang, array, attr){
4 +
5 + // module:
6 + // dojo/NodeList-data
7 +
8 + /*=====
9 + return function(){
10 + // summary:
11 + // Adds data() and removeData() methods to NodeList, and returns NodeList constructor.
12 + };
13 + =====*/
14 +
15 + var NodeList = query.NodeList;
16 +
17 + var dataCache = {}, x = 0, dataattr = "data-dojo-dataid",
18 + dopid = function(node){
19 + // summary:
20 + // Return a uniqueish ID for the passed node reference
21 + var pid = attr.get(node, dataattr);
22 + if(!pid){
23 + pid = "pid" + (x++);
24 + attr.set(node, dataattr, pid);
25 + }
26 + return pid;
27 + }
28 + ;
29 +
30 + //>>excludeStart("debugging", true);
31 + // An alias to the private dataCache for NodeList-data. NEVER USE THIS!
32 + // This private is only exposed for the benefit of unit testing, and is
33 + // removed during the build process.
34 + NodeList._nodeDataCache = dojo._nodeDataCache = dataCache;
35 + //>>excludeEnd("debugging");
36 +
37 + var dodata = dojo._nodeData = function(node, key, value){
38 + // summary:
39 + // Private helper for dojo/NodeList.data for single node data access. Refer to NodeList.data
40 + // documentation for more information.
41 + //
42 + // node: String|DomNode
43 + // The node to associate data with
44 + //
45 + // key: Object|String?
46 + // If an object, act as a setter and iterate over said object setting data items as defined.
47 + // If a string, and `value` present, set the data for defined `key` to `value`
48 + // If a string, and `value` absent, act as a getter, returning the data associated with said `key`
49 + //
50 + // value: Anything?
51 + // The value to set for said `key`, provided `key` is a string (and not an object)
52 + //
53 + var pid = dopid(node), r;
54 + if(!dataCache[pid]){ dataCache[pid] = {}; }
55 +
56 + // API discrepency: calling with only a node returns the whole object. $.data throws
57 + if(arguments.length == 1){ r = dataCache[pid]; }
58 + if(typeof key == "string"){
59 + // either getter or setter, based on `value` presence
60 + if(arguments.length > 2){
61 + dataCache[pid][key] = value;
62 + }else{
63 + r = dataCache[pid][key];
64 + }
65 + }else{
66 + // must be a setter, mix `value` into data hash
67 + // API discrepency: using object as setter works here
68 + r = lang.mixin(dataCache[pid], key);
69 + }
70 +
71 + return r; // Object|Anything|Nothing
72 + };
73 +
74 + var removeData = dojo._removeNodeData = function(node, key){
75 + // summary:
76 + // Remove some data from this node
77 + // node: String|DomNode
78 + // The node reference to remove data from
79 + // key: String?
80 + // If omitted, remove all data in this dataset.
81 + // If passed, remove only the passed `key` in the associated dataset
82 + var pid = dopid(node);
83 + if(dataCache[pid]){
84 + if(key){
85 + delete dataCache[pid][key];
86 + }else{
87 + delete dataCache[pid];
88 + }
89 + }
90 + };
91 +
92 + NodeList._gcNodeData = dojo._gcNodeData = function(){
93 + // summary:
94 + // super expensive: GC all data in the data for nodes that no longer exist in the dom.
95 + // description:
96 + // super expensive: GC all data in the data for nodes that no longer exist in the dom.
97 + // MUCH safer to do this yourself, manually, on a per-node basis (via `NodeList.removeData()`)
98 + // provided as a stop-gap for exceptionally large/complex applications with constantly changing
99 + // content regions (eg: a dijit/layout/ContentPane with replacing data)
100 + // There is NO automatic GC going on. If you dojo.destroy() a node, you should _removeNodeData
101 + // prior to destruction.
102 + var livePids = query("[" + dataattr + "]").map(dopid);
103 + for(var i in dataCache){
104 + if(array.indexOf(livePids, i) < 0){ delete dataCache[i]; }
105 + }
106 + };
107 +
108 + // make nodeData and removeNodeData public on dojo/NodeList:
109 + lang.extend(NodeList, {
110 + data: NodeList._adaptWithCondition(dodata, function(a){
111 + return a.length === 0 || a.length == 1 && (typeof a[0] == "string");
112 + }),
113 + removeData: NodeList._adaptAsForEach(removeData)
114 + });
115 +
116 + /*=====
117 + lang.extend(NodeList, {
118 + data: function(key, value){
119 + // summary:
120 + // stash or get some arbitrary data on/from these nodes.
121 + //
122 + // description:
123 + // Stash or get some arbitrary data on/from these nodes. This private _data function is
124 + // exposed publicly on `dojo/NodeList`, eg: as the result of a `dojo.query` call.
125 + // DIFFERS from jQuery.data in that when used as a getter, the entire list is ALWAYS
126 + // returned. EVEN WHEN THE LIST IS length == 1.
127 + //
128 + // A single-node version of this function is provided as `dojo._nodeData`, which follows
129 + // the same signature, though expects a String ID or DomNode reference in the first
130 + // position, before key/value arguments.
131 + //
132 + // node: String|DomNode
133 + // The node to associate data with
134 + //
135 + // key: Object|String?
136 + // If an object, act as a setter and iterate over said object setting data items as defined.
137 + // If a string, and `value` present, set the data for defined `key` to `value`
138 + // If a string, and `value` absent, act as a getter, returning the data associated with said `key`
139 + //
140 + // value: Anything?
141 + // The value to set for said `key`, provided `key` is a string (and not an object)
142 + //
143 + // example:
144 + // Set a key `bar` to some data, then retrieve it.
145 + // | dojo.query(".foo").data("bar", "touched");
146 + // | var touched = dojo.query(".foo").data("bar");
147 + // | if(touched[0] == "touched"){ alert('win'); }
148 + //
149 + // example:
150 + // Get all the data items for a given node.
151 + // | var list = dojo.query(".foo").data();
152 + // | var first = list[0];
153 + //
154 + // example:
155 + // Set the data to a complex hash. Overwrites existing keys with new value
156 + // | dojo.query(".foo").data({ bar:"baz", foo:"bar" });
157 + // Then get some random key:
158 + // | dojo.query(".foo").data("foo"); // returns [`bar`]
159 + //
160 + // returns: Object|Anything|Nothing
161 + // When used as a setter via `dojo/NodeList`, a NodeList instance is returned
162 + // for further chaining. When used as a getter via `dojo/NodeList` an ARRAY
163 + // of items is returned. The items in the array correspond to the elements
164 + // in the original list. This is true even when the list length is 1, eg:
165 + // when looking up a node by ID (#foo)
166 + },
167 +
168 + removeData: function(key){
169 + // summary:
170 + // Remove the data associated with these nodes.
171 + // key: String?
172 + // If omitted, clean all data for this node.
173 + // If passed, remove the data item found at `key`
174 + }
175 + });
176 + =====*/
177 +
178 +// TODO: this is the basic implementation of adaptWithConditionAndWhenMappedConsiderLength, for lack of a better API name
179 +// it conflicts with the the `dojo/NodeList` way: always always return an arrayLike thinger. Consider for 2.0:
180 +//
181 +// NodeList.prototype.data = function(key, value){
182 +// var a = arguments, r;
183 +// if(a.length === 0 || a.length == 1 && (typeof a[0] == "string")){
184 +// r = this.map(function(node){
185 +// return d._data(node, key);
186 +// });
187 +// if(r.length == 1){ r = r[0]; } // the offending line, and the diff on adaptWithCondition
188 +// }else{
189 +// r = this.forEach(function(node){
190 +// d._data(node, key, value);
191 +// });
192 +// }
193 +// return r; // NodeList|Array|SingleItem
194 +// };
195 +
196 + return NodeList;
197 +
198 +});
This diff is collapsed. Click to expand it.
1 +define(["./query", "./_base/lang", "./aspect", "./_base/fx", "./fx"],
2 +function(query, lang, aspect, baseFx, coreFx){
3 +
4 +// module:
5 +// dojo/NodeList-fx
6 +
7 +/*=====
8 +return function(){
9 + // summary:
10 + // Adds dojo.fx animation support to dojo.query() by extending the NodeList class
11 + // with additional FX functions. NodeList is the array-like object used to hold query results.
12 +};
13 +=====*/
14 +
15 +var NodeList = query.NodeList;
16 +
17 +lang.extend(NodeList, {
18 + _anim: function(obj, method, args){
19 + args = args||{};
20 + var a = coreFx.combine(
21 + this.map(function(item){
22 + var tmpArgs = { node: item };
23 + lang.mixin(tmpArgs, args);
24 + return obj[method](tmpArgs);
25 + })
26 + );
27 + return args.auto ? a.play() && this : a; // dojo/_base/fx.Animation|dojo/NodeList
28 + },
29 +
30 + wipeIn: function(args){
31 + // summary:
32 + // wipe in all elements of this NodeList via `dojo/fx.wipeIn()`
33 + //
34 + // args: Object?
35 + // Additional dojo/_base/fx.Animation arguments to mix into this set with the addition of
36 + // an `auto` parameter.
37 + //
38 + // returns: dojo/_base/fx.Animation|dojo/NodeList
39 + // A special args member `auto` can be passed to automatically play the animation.
40 + // If args.auto is present, the original dojo/NodeList will be returned for further
41 + // chaining. Otherwise the dojo/_base/fx.Animation instance is returned and must be .play()'ed
42 + //
43 + // example:
44 + // Fade in all tables with class "blah":
45 + // | dojo.query("table.blah").wipeIn().play();
46 + //
47 + // example:
48 + // Utilizing `auto` to get the NodeList back:
49 + // | dojo.query(".titles").wipeIn({ auto:true }).onclick(someFunction);
50 + //
51 + return this._anim(coreFx, "wipeIn", args); // dojo/_base/fx.Animation|dojo/NodeList
52 + },
53 +
54 + wipeOut: function(args){
55 + // summary:
56 + // wipe out all elements of this NodeList via `dojo/fx.wipeOut()`
57 + //
58 + // args: Object?
59 + // Additional dojo/_base/fx.Animation arguments to mix into this set with the addition of
60 + // an `auto` parameter.
61 + //
62 + // returns: dojo/_base/fx.Animation|dojo/NodeList
63 + // A special args member `auto` can be passed to automatically play the animation.
64 + // If args.auto is present, the original dojo/NodeList will be returned for further
65 + // chaining. Otherwise the dojo/_base/fx.Animation instance is returned and must be .play()'ed
66 + //
67 + // example:
68 + // Wipe out all tables with class "blah":
69 + // | dojo.query("table.blah").wipeOut().play();
70 + return this._anim(coreFx, "wipeOut", args); // dojo/_base/fx.Animation|dojo/NodeList
71 + },
72 +
73 + slideTo: function(args){
74 + // summary:
75 + // slide all elements of the node list to the specified place via `dojo/fx.slideTo()`
76 + //
77 + // args: Object?
78 + // Additional dojo/_base/fx.Animation arguments to mix into this set with the addition of
79 + // an `auto` parameter.
80 + //
81 + // returns: dojo/_base/fx.Animation|dojo/NodeList
82 + // A special args member `auto` can be passed to automatically play the animation.
83 + // If args.auto is present, the original dojo/NodeList will be returned for further
84 + // chaining. Otherwise the dojo/_base/fx.Animation instance is returned and must be .play()'ed
85 + //
86 + // example:
87 + // | Move all tables with class "blah" to 300/300:
88 + // | dojo.query("table.blah").slideTo({
89 + // | left: 40,
90 + // | top: 50
91 + // | }).play();
92 + return this._anim(coreFx, "slideTo", args); // dojo/_base/fx.Animation|dojo/NodeList
93 + },
94 +
95 +
96 + fadeIn: function(args){
97 + // summary:
98 + // fade in all elements of this NodeList via `dojo.fadeIn`
99 + //
100 + // args: Object?
101 + // Additional dojo/_base/fx.Animation arguments to mix into this set with the addition of
102 + // an `auto` parameter.
103 + //
104 + // returns: dojo/_base/fx.Animation|dojo/NodeList
105 + // A special args member `auto` can be passed to automatically play the animation.
106 + // If args.auto is present, the original dojo/NodeList will be returned for further
107 + // chaining. Otherwise the dojo/_base/fx.Animation instance is returned and must be .play()'ed
108 + //
109 + // example:
110 + // Fade in all tables with class "blah":
111 + // | dojo.query("table.blah").fadeIn().play();
112 + return this._anim(baseFx, "fadeIn", args); // dojo/_base/fx.Animation|dojo/NodeList
113 + },
114 +
115 + fadeOut: function(args){
116 + // summary:
117 + // fade out all elements of this NodeList via `dojo.fadeOut`
118 + //
119 + // args: Object?
120 + // Additional dojo/_base/fx.Animation arguments to mix into this set with the addition of
121 + // an `auto` parameter.
122 + //
123 + // returns: dojo/_base/fx.Animation|dojo/NodeList
124 + // A special args member `auto` can be passed to automatically play the animation.
125 + // If args.auto is present, the original dojo/NodeList will be returned for further
126 + // chaining. Otherwise the dojo/_base/fx.Animation instance is returned and must be .play()'ed
127 + //
128 + // example:
129 + // Fade out all elements with class "zork":
130 + // | dojo.query(".zork").fadeOut().play();
131 + // example:
132 + // Fade them on a delay and do something at the end:
133 + // | var fo = dojo.query(".zork").fadeOut();
134 + // | aspect.after(fo, "onEnd", function(){ /*...*/ }, true);
135 + // | fo.play();
136 + // example:
137 + // Using `auto`:
138 + // | dojo.query("li").fadeOut({ auto:true }).filter(filterFn).forEach(doit);
139 + //
140 + return this._anim(baseFx, "fadeOut", args); // dojo/_base/fx.Animation|dojo/NodeList
141 + },
142 +
143 + animateProperty: function(args){
144 + // summary:
145 + // Animate all elements of this NodeList across the properties specified.
146 + // syntax identical to `dojo.animateProperty`
147 + //
148 + // args: Object?
149 + // Additional dojo/_base/fx.Animation arguments to mix into this set with the addition of
150 + // an `auto` parameter.
151 + //
152 + // returns: dojo/_base/fx.Animation|dojo/NodeList
153 + // A special args member `auto` can be passed to automatically play the animation.
154 + // If args.auto is present, the original dojo/NodeList will be returned for further
155 + // chaining. Otherwise the dojo/_base/fx.Animation instance is returned and must be .play()'ed
156 + //
157 + // example:
158 + // | dojo.query(".zork").animateProperty({
159 + // | duration: 500,
160 + // | properties: {
161 + // | color: { start: "black", end: "white" },
162 + // | left: { end: 300 }
163 + // | }
164 + // | }).play();
165 + //
166 + // example:
167 + // | dojo.query(".grue").animateProperty({
168 + // | auto:true,
169 + // | properties: {
170 + // | height:240
171 + // | }
172 + // | }).onclick(handler);
173 + return this._anim(baseFx, "animateProperty", args); // dojo/_base/fx.Animation|dojo/NodeList
174 + },
175 +
176 + anim: function( /*Object*/ properties,
177 + /*Integer?*/ duration,
178 + /*Function?*/ easing,
179 + /*Function?*/ onEnd,
180 + /*Integer?*/ delay){
181 + // summary:
182 + // Animate one or more CSS properties for all nodes in this list.
183 + // The returned animation object will already be playing when it
184 + // is returned. See the docs for `dojo.anim` for full details.
185 + // properties: Object
186 + // the properties to animate. does NOT support the `auto` parameter like other
187 + // NodeList-fx methods.
188 + // duration: Integer?
189 + // Optional. The time to run the animations for
190 + // easing: Function?
191 + // Optional. The easing function to use.
192 + // onEnd: Function?
193 + // A function to be called when the animation ends
194 + // delay:
195 + // how long to delay playing the returned animation
196 + // example:
197 + // Another way to fade out:
198 + // | dojo.query(".thinger").anim({ opacity: 0 });
199 + // example:
200 + // animate all elements with the "thigner" class to a width of 500
201 + // pixels over half a second
202 + // | dojo.query(".thinger").anim({ width: 500 }, 700);
203 + var canim = coreFx.combine(
204 + this.map(function(item){
205 + return baseFx.animateProperty({
206 + node: item,
207 + properties: properties,
208 + duration: duration||350,
209 + easing: easing
210 + });
211 + })
212 + );
213 + if(onEnd){
214 + aspect.after(canim, "onEnd", onEnd, true);
215 + }
216 + return canim.play(delay||0); // dojo/_base/fx.Animation
217 + }
218 +});
219 +
220 +return NodeList;
221 +});
1 +define(["./query", "./_base/lang", "./html"], function(query, lang, html){
2 +
3 +// module:
4 +// dojo/NodeList-html
5 +
6 +/*=====
7 +return function(){
8 + // summary:
9 + // Adds a chainable html method to dojo.query() / NodeList instances for setting/replacing node content
10 +};
11 +=====*/
12 +
13 +var NodeList = query.NodeList;
14 +
15 +
16 +lang.extend(NodeList, {
17 + html: function(/* String|DomNode|NodeList? */ content, /* Object? */params){
18 + // summary:
19 + // see `dojo/html.set()`. Set the content of all elements of this NodeList
20 + //
21 + // content:
22 + // An html string, node or enumerable list of nodes for insertion into the dom
23 + //
24 + // params:
25 + // Optional flags/properties to configure the content-setting. See dojo/html._ContentSetter
26 + //
27 + // description:
28 + // Based around `dojo/html.set()`, set the content of the Elements in a
29 + // NodeList to the given content (string/node/nodelist), with optional arguments
30 + // to further tune the set content behavior.
31 + //
32 + // example:
33 + // | query(".thingList").html("<li data-dojo-type='dojo/dnd/Moveable'>1</li><li data-dojo-type='dojo/dnd/Moveable'>2</li><li data-dojo-type='dojo/dnd/Moveable'>3</li>",
34 + // | {
35 + // | parseContent: true,
36 + // | onBegin: function(){
37 + // | this.content = this.content.replace(/([0-9])/g, this.id + ": $1");
38 + // | this.inherited("onBegin", arguments);
39 + // | }
40 + // | }).removeClass("notdone").addClass("done");
41 +
42 + var dhs = new html._ContentSetter(params || {});
43 + this.forEach(function(elm){
44 + dhs.node = elm;
45 + dhs.set(content);
46 + dhs.tearDown();
47 + });
48 + return this; // dojo/NodeList
49 + }
50 +});
51 +
52 +return NodeList;
53 +});
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
1 +define(["./query"], function(query){
2 + // This class is just for documentation purposes, so NodeList shows up well in the API viewer,
3 + // and to simplify writing API doc for all the methods that take NodeList as a parameter, or return a NodeList.
4 + return query.NodeList;
5 +});
6 +
1 +/*******************************************************************************
2 + * OpenAjax.js
3 + *
4 + * Reference implementation of the OpenAjax Hub, as specified by OpenAjax Alliance.
5 + * Specification is under development at:
6 + *
7 + * http://www.openajax.org/member/wiki/OpenAjax_Hub_Specification
8 + *
9 + * Copyright 2006-2007 OpenAjax Alliance
10 + *
11 + * Licensed under the Apache License, Version 2.0 (the "License"); you may not
12 + * use this file except in compliance with the License. You may obtain a copy
13 + * of the License at http://www.apache.org/licenses/LICENSE-2.0 . Unless
14 + * required by applicable law or agreed to in writing, software distributed
15 + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
16 + * CONDITIONS OF ANY KIND, either express or implied. See the License for the
17 + * specific language governing permissions and limitations under the License.
18 + *
19 + ******************************************************************************/
20 +
21 +// prevent re-definition of the OpenAjax object
22 +if(!window["OpenAjax"]){
23 + OpenAjax = new function(){
24 + // summary:
25 + // the OpenAjax hub
26 + // description:
27 + // see http://www.openajax.org/member/wiki/OpenAjax_Hub_Specification
28 +
29 + var libs = {};
30 + var ooh = "org.openajax.hub.";
31 +
32 + var h = {};
33 + this.hub = h;
34 + h.implementer = "http://openajax.org";
35 + h.implVersion = "0.6";
36 + h.specVersion = "0.6";
37 + h.implExtraData = {};
38 + h.libraries = libs;
39 +
40 + h.registerLibrary = function(prefix, nsURL, version, extra){
41 + libs[prefix] = {
42 + prefix: prefix,
43 + namespaceURI: nsURL,
44 + version: version,
45 + extraData: extra
46 + };
47 + this.publish(ooh+"registerLibrary", libs[prefix]);
48 + };
49 + h.unregisterLibrary = function(prefix){
50 + this.publish(ooh+"unregisterLibrary", libs[prefix]);
51 + delete libs[prefix];
52 + };
53 +
54 + h._subscriptions = { c:{}, s:[] };
55 + h._cleanup = [];
56 + h._subIndex = 0;
57 + h._pubDepth = 0;
58 +
59 + h.subscribe = function(name, callback, scope, subscriberData, filter){
60 + if(!scope){
61 + scope = window;
62 + }
63 + var handle = name + "." + this._subIndex;
64 + var sub = { scope: scope, cb: callback, fcb: filter, data: subscriberData, sid: this._subIndex++, hdl: handle };
65 + var path = name.split(".");
66 + this._subscribe(this._subscriptions, path, 0, sub);
67 + return handle;
68 + };
69 +
70 + h.publish = function(name, message){
71 + var path = name.split(".");
72 + this._pubDepth++;
73 + this._publish(this._subscriptions, path, 0, name, message);
74 + this._pubDepth--;
75 + if((this._cleanup.length > 0) && (this._pubDepth == 0)){
76 + for(var i = 0; i < this._cleanup.length; i++){
77 + this.unsubscribe(this._cleanup[i].hdl);
78 + }
79 + delete(this._cleanup);
80 + this._cleanup = [];
81 + }
82 + };
83 +
84 + h.unsubscribe = function(sub){
85 + var path = sub.split(".");
86 + var sid = path.pop();
87 + this._unsubscribe(this._subscriptions, path, 0, sid);
88 + };
89 +
90 + h._subscribe = function(tree, path, index, sub){
91 + var token = path[index];
92 + if(index == path.length){
93 + tree.s.push(sub);
94 + }else{
95 + if(typeof tree.c == "undefined"){
96 + tree.c = {};
97 + }
98 + if(typeof tree.c[token] == "undefined"){
99 + tree.c[token] = { c: {}, s: [] };
100 + }
101 + this._subscribe(tree.c[token], path, index + 1, sub);
102 + }
103 + };
104 +
105 + h._publish = function(tree, path, index, name, msg){
106 + if(typeof tree != "undefined"){
107 + var node;
108 + if(index == path.length){
109 + node = tree;
110 + }else{
111 + this._publish(tree.c[path[index]], path, index + 1, name, msg);
112 + this._publish(tree.c["*"], path, index + 1, name, msg);
113 + node = tree.c["**"];
114 + }
115 + if(typeof node != "undefined"){
116 + var callbacks = node.s;
117 + var max = callbacks.length;
118 + for(var i = 0; i < max; i++){
119 + if(callbacks[i].cb){
120 + var sc = callbacks[i].scope;
121 + var cb = callbacks[i].cb;
122 + var fcb = callbacks[i].fcb;
123 + var d = callbacks[i].data;
124 + if(typeof cb == "string"){
125 + // get a function object
126 + cb = sc[cb];
127 + }
128 + if(typeof fcb == "string"){
129 + // get a function object
130 + fcb = sc[fcb];
131 + }
132 + if((!fcb) ||
133 + (fcb.call(sc, name, msg, d))){
134 + cb.call(sc, name, msg, d);
135 + }
136 + }
137 + }
138 + }
139 + }
140 + };
141 +
142 + h._unsubscribe = function(tree, path, index, sid){
143 + if(typeof tree != "undefined"){
144 + if(index < path.length){
145 + var childNode = tree.c[path[index]];
146 + this._unsubscribe(childNode, path, index + 1, sid);
147 + if(childNode.s.length == 0){
148 + for(var x in childNode.c)
149 + return;
150 + delete tree.c[path[index]];
151 + }
152 + return;
153 + }
154 + else{
155 + var callbacks = tree.s;
156 + var max = callbacks.length;
157 + for(var i = 0; i < max; i++){
158 + if(sid == callbacks[i].sid){
159 + if(this._pubDepth > 0){
160 + callbacks[i].cb = null;
161 + this._cleanup.push(callbacks[i]);
162 + }
163 + else
164 + callbacks.splice(i, 1);
165 + return;
166 + }
167 + }
168 + }
169 + }
170 + };
171 +
172 + // The following function is provided for automatic testing purposes.
173 + // It is not expected to be deployed in run-time OpenAjax Hub implementations.
174 + h.reinit = function(){
175 + for (var lib in OpenAjax.hub.libraries){
176 + delete OpenAjax.hub.libraries[lib];
177 + }
178 + OpenAjax.hub.registerLibrary("OpenAjax", "http://openajax.org/hub", "0.6", {});
179 +
180 + delete OpenAjax._subscriptions;
181 + OpenAjax._subscriptions = {c:{},s:[]};
182 + delete OpenAjax._cleanup;
183 + OpenAjax._cleanup = [];
184 + OpenAjax._subIndex = 0;
185 + OpenAjax._pubDepth = 0;
186 + };
187 + };
188 +
189 + // Register the OpenAjax Hub itself as a library.
190 + OpenAjax.hub.registerLibrary("OpenAjax", "http://openajax.org/hub", "0.6", {});
191 +
192 +}
1 +define(["./_base/declare", "./_base/lang", "./_base/array", "./when"], function(declare, lang, array, when){
2 + // module:
3 + // dojo/Stateful
4 +
5 +return declare("dojo.Stateful", null, {
6 + // summary:
7 + // Base class for objects that provide named properties with optional getter/setter
8 + // control and the ability to watch for property changes
9 + //
10 + // The class also provides the functionality to auto-magically manage getters
11 + // and setters for object attributes/properties.
12 + //
13 + // Getters and Setters should follow the format of _xxxGetter or _xxxSetter where
14 + // the xxx is a name of the attribute to handle. So an attribute of "foo"
15 + // would have a custom getter of _fooGetter and a custom setter of _fooSetter.
16 + //
17 + // example:
18 + // | var obj = new dojo.Stateful();
19 + // | obj.watch("foo", function(){
20 + // | console.log("foo changed to " + this.get("foo"));
21 + // | });
22 + // | obj.set("foo","bar");
23 +
24 + // _attrPairNames: Hash
25 + // Used across all instances a hash to cache attribute names and their getter
26 + // and setter names.
27 + _attrPairNames: {},
28 +
29 + _getAttrNames: function(name){
30 + // summary:
31 + // Helper function for get() and set().
32 + // Caches attribute name values so we don't do the string ops every time.
33 + // tags:
34 + // private
35 +
36 + var apn = this._attrPairNames;
37 + if(apn[name]){ return apn[name]; }
38 + return (apn[name] = {
39 + s: "_" + name + "Setter",
40 + g: "_" + name + "Getter"
41 + });
42 + },
43 +
44 + postscript: function(/*Object?*/ params){
45 + // Automatic setting of params during construction
46 + if (params){ this.set(params); }
47 + },
48 +
49 + _get: function(name, names){
50 + // summary:
51 + // Private function that does a get based off a hash of names
52 + // names:
53 + // Hash of names of custom attributes
54 + return typeof this[names.g] === "function" ? this[names.g]() : this[name];
55 + },
56 + get: function(/*String*/name){
57 + // summary:
58 + // Get a property on a Stateful instance.
59 + // name:
60 + // The property to get.
61 + // returns:
62 + // The property value on this Stateful instance.
63 + // description:
64 + // Get a named property on a Stateful object. The property may
65 + // potentially be retrieved via a getter method in subclasses. In the base class
66 + // this just retrieves the object's property.
67 + // For example:
68 + // | stateful = new dojo.Stateful({foo: 3});
69 + // | stateful.get("foo") // returns 3
70 + // | stateful.foo // returns 3
71 +
72 + return this._get(name, this._getAttrNames(name)); //Any
73 + },
74 + set: function(/*String*/name, /*Object*/value){
75 + // summary:
76 + // Set a property on a Stateful instance
77 + // name:
78 + // The property to set.
79 + // value:
80 + // The value to set in the property.
81 + // returns:
82 + // The function returns this dojo.Stateful instance.
83 + // description:
84 + // Sets named properties on a stateful object and notifies any watchers of
85 + // the property. A programmatic setter may be defined in subclasses.
86 + // For example:
87 + // | stateful = new dojo.Stateful();
88 + // | stateful.watch(function(name, oldValue, value){
89 + // | // this will be called on the set below
90 + // | }
91 + // | stateful.set(foo, 5);
92 + //
93 + // set() may also be called with a hash of name/value pairs, ex:
94 + // | myObj.set({
95 + // | foo: "Howdy",
96 + // | bar: 3
97 + // | })
98 + // This is equivalent to calling set(foo, "Howdy") and set(bar, 3)
99 +
100 + // If an object is used, iterate through object
101 + if(typeof name === "object"){
102 + for(var x in name){
103 + if(name.hasOwnProperty(x) && x !="_watchCallbacks"){
104 + this.set(x, name[x]);
105 + }
106 + }
107 + return this;
108 + }
109 +
110 + var names = this._getAttrNames(name),
111 + oldValue = this._get(name, names),
112 + setter = this[names.s],
113 + result;
114 + if(typeof setter === "function"){
115 + // use the explicit setter
116 + result = setter.apply(this, Array.prototype.slice.call(arguments, 1));
117 + }else{
118 + // no setter so set attribute directly
119 + this[name] = value;
120 + }
121 + if(this._watchCallbacks){
122 + var self = this;
123 + // If setter returned a promise, wait for it to complete, otherwise call watches immediatly
124 + when(result, function(){
125 + self._watchCallbacks(name, oldValue, value);
126 + });
127 + }
128 + return this; // dojo/Stateful
129 + },
130 + _changeAttrValue: function(name, value){
131 + // summary:
132 + // Internal helper for directly changing an attribute value.
133 + //
134 + // name: String
135 + // The property to set.
136 + // value: Mixed
137 + // The value to set in the property.
138 + //
139 + // description:
140 + // Directly change the value of an attribute on an object, bypassing any
141 + // accessor setter. Also handles the calling of watch and emitting events.
142 + // It is designed to be used by descendent class when there are two values
143 + // of attributes that are linked, but calling .set() is not appropriate.
144 +
145 + var oldValue = this.get(name);
146 + this[name] = value;
147 + if(this._watchCallbacks){
148 + this._watchCallbacks(name, oldValue, value);
149 + }
150 + return this; // dojo/Stateful
151 + },
152 + watch: function(/*String?*/name, /*Function*/callback){
153 + // summary:
154 + // Watches a property for changes
155 + // name:
156 + // Indicates the property to watch. This is optional (the callback may be the
157 + // only parameter), and if omitted, all the properties will be watched
158 + // returns:
159 + // An object handle for the watch. The unwatch method of this object
160 + // can be used to discontinue watching this property:
161 + // | var watchHandle = obj.watch("foo", callback);
162 + // | watchHandle.unwatch(); // callback won't be called now
163 + // callback:
164 + // The function to execute when the property changes. This will be called after
165 + // the property has been changed. The callback will be called with the |this|
166 + // set to the instance, the first argument as the name of the property, the
167 + // second argument as the old value and the third argument as the new value.
168 +
169 + var callbacks = this._watchCallbacks;
170 + if(!callbacks){
171 + var self = this;
172 + callbacks = this._watchCallbacks = function(name, oldValue, value, ignoreCatchall){
173 + var notify = function(propertyCallbacks){
174 + if(propertyCallbacks){
175 + propertyCallbacks = propertyCallbacks.slice();
176 + for(var i = 0, l = propertyCallbacks.length; i < l; i++){
177 + propertyCallbacks[i].call(self, name, oldValue, value);
178 + }
179 + }
180 + };
181 + notify(callbacks['_' + name]);
182 + if(!ignoreCatchall){
183 + notify(callbacks["*"]); // the catch-all
184 + }
185 + }; // we use a function instead of an object so it will be ignored by JSON conversion
186 + }
187 + if(!callback && typeof name === "function"){
188 + callback = name;
189 + name = "*";
190 + }else{
191 + // prepend with dash to prevent name conflicts with function (like "name" property)
192 + name = '_' + name;
193 + }
194 + var propertyCallbacks = callbacks[name];
195 + if(typeof propertyCallbacks !== "object"){
196 + propertyCallbacks = callbacks[name] = [];
197 + }
198 + propertyCallbacks.push(callback);
199 +
200 + // TODO: Remove unwatch in 2.0
201 + var handle = {};
202 + handle.unwatch = handle.remove = function(){
203 + var index = array.indexOf(propertyCallbacks, callback);
204 + if(index > -1){
205 + propertyCallbacks.splice(index, 1);
206 + }
207 + };
208 + return handle; //Object
209 + }
210 +
211 +});
212 +
213 +});
1 +define(["./kernel", "./lang", "./array", "./config"], function(dojo, lang, ArrayUtil, config){
2 +
3 + var Color = dojo.Color = function(/*Array|String|Object*/ color){
4 + // summary:
5 + // Takes a named string, hex string, array of rgb or rgba values,
6 + // an object with r, g, b, and a properties, or another `Color` object
7 + // and creates a new Color instance to work from.
8 + //
9 + // example:
10 + // Work with a Color instance:
11 + // | var c = new Color();
12 + // | c.setColor([0,0,0]); // black
13 + // | var hex = c.toHex(); // #000000
14 + //
15 + // example:
16 + // Work with a node's color:
17 + // | var color = dojo.style("someNode", "backgroundColor");
18 + // | var n = new Color(color);
19 + // | // adjust the color some
20 + // | n.r *= .5;
21 + // | console.log(n.toString()); // rgb(128, 255, 255);
22 + if(color){ this.setColor(color); }
23 + };
24 +
25 + // FIXME:
26 + // there's got to be a more space-efficient way to encode or discover
27 + // these!! Use hex?
28 + Color.named = {
29 + // summary:
30 + // Dictionary list of all CSS named colors, by name. Values are 3-item arrays with corresponding RG and B values.
31 + "black": [0,0,0],
32 + "silver": [192,192,192],
33 + "gray": [128,128,128],
34 + "white": [255,255,255],
35 + "maroon": [128,0,0],
36 + "red": [255,0,0],
37 + "purple": [128,0,128],
38 + "fuchsia":[255,0,255],
39 + "green": [0,128,0],
40 + "lime": [0,255,0],
41 + "olive": [128,128,0],
42 + "yellow": [255,255,0],
43 + "navy": [0,0,128],
44 + "blue": [0,0,255],
45 + "teal": [0,128,128],
46 + "aqua": [0,255,255],
47 + "transparent": config.transparentColor || [0,0,0,0]
48 + };
49 +
50 + lang.extend(Color, {
51 + r: 255, g: 255, b: 255, a: 1,
52 + _set: function(r, g, b, a){
53 + var t = this; t.r = r; t.g = g; t.b = b; t.a = a;
54 + },
55 + setColor: function(/*Array|String|Object*/ color){
56 + // summary:
57 + // Takes a named string, hex string, array of rgb or rgba values,
58 + // an object with r, g, b, and a properties, or another `Color` object
59 + // and sets this color instance to that value.
60 + //
61 + // example:
62 + // | var c = new Color(); // no color
63 + // | c.setColor("#ededed"); // greyish
64 + if(lang.isString(color)){
65 + Color.fromString(color, this);
66 + }else if(lang.isArray(color)){
67 + Color.fromArray(color, this);
68 + }else{
69 + this._set(color.r, color.g, color.b, color.a);
70 + if(!(color instanceof Color)){ this.sanitize(); }
71 + }
72 + return this; // Color
73 + },
74 + sanitize: function(){
75 + // summary:
76 + // Ensures the object has correct attributes
77 + // description:
78 + // the default implementation does nothing, include dojo.colors to
79 + // augment it with real checks
80 + return this; // Color
81 + },
82 + toRgb: function(){
83 + // summary:
84 + // Returns 3 component array of rgb values
85 + // example:
86 + // | var c = new Color("#000000");
87 + // | console.log(c.toRgb()); // [0,0,0]
88 + var t = this;
89 + return [t.r, t.g, t.b]; // Array
90 + },
91 + toRgba: function(){
92 + // summary:
93 + // Returns a 4 component array of rgba values from the color
94 + // represented by this object.
95 + var t = this;
96 + return [t.r, t.g, t.b, t.a]; // Array
97 + },
98 + toHex: function(){
99 + // summary:
100 + // Returns a CSS color string in hexadecimal representation
101 + // example:
102 + // | console.log(new Color([0,0,0]).toHex()); // #000000
103 + var arr = ArrayUtil.map(["r", "g", "b"], function(x){
104 + var s = this[x].toString(16);
105 + return s.length < 2 ? "0" + s : s;
106 + }, this);
107 + return "#" + arr.join(""); // String
108 + },
109 + toCss: function(/*Boolean?*/ includeAlpha){
110 + // summary:
111 + // Returns a css color string in rgb(a) representation
112 + // example:
113 + // | var c = new Color("#FFF").toCss();
114 + // | console.log(c); // rgb('255','255','255')
115 + var t = this, rgb = t.r + ", " + t.g + ", " + t.b;
116 + return (includeAlpha ? "rgba(" + rgb + ", " + t.a : "rgb(" + rgb) + ")"; // String
117 + },
118 + toString: function(){
119 + // summary:
120 + // Returns a visual representation of the color
121 + return this.toCss(true); // String
122 + }
123 + });
124 +
125 + Color.blendColors = dojo.blendColors = function(
126 + /*Color*/ start,
127 + /*Color*/ end,
128 + /*Number*/ weight,
129 + /*Color?*/ obj
130 + ){
131 + // summary:
132 + // Blend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend,
133 + // can reuse a previously allocated Color object for the result
134 + var t = obj || new Color();
135 + ArrayUtil.forEach(["r", "g", "b", "a"], function(x){
136 + t[x] = start[x] + (end[x] - start[x]) * weight;
137 + if(x != "a"){ t[x] = Math.round(t[x]); }
138 + });
139 + return t.sanitize(); // Color
140 + };
141 +
142 + Color.fromRgb = dojo.colorFromRgb = function(/*String*/ color, /*Color?*/ obj){
143 + // summary:
144 + // Returns a `Color` instance from a string of the form
145 + // "rgb(...)" or "rgba(...)". Optionally accepts a `Color`
146 + // object to update with the parsed value and return instead of
147 + // creating a new object.
148 + // returns:
149 + // A Color object. If obj is passed, it will be the return value.
150 + var m = color.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);
151 + return m && Color.fromArray(m[1].split(/\s*,\s*/), obj); // Color
152 + };
153 +
154 + Color.fromHex = dojo.colorFromHex = function(/*String*/ color, /*Color?*/ obj){
155 + // summary:
156 + // Converts a hex string with a '#' prefix to a color object.
157 + // Supports 12-bit #rgb shorthand. Optionally accepts a
158 + // `Color` object to update with the parsed value.
159 + //
160 + // returns:
161 + // A Color object. If obj is passed, it will be the return value.
162 + //
163 + // example:
164 + // | var thing = dojo.colorFromHex("#ededed"); // grey, longhand
165 + //
166 + // example:
167 + // | var thing = dojo.colorFromHex("#000"); // black, shorthand
168 + var t = obj || new Color(),
169 + bits = (color.length == 4) ? 4 : 8,
170 + mask = (1 << bits) - 1;
171 + color = Number("0x" + color.substr(1));
172 + if(isNaN(color)){
173 + return null; // Color
174 + }
175 + ArrayUtil.forEach(["b", "g", "r"], function(x){
176 + var c = color & mask;
177 + color >>= bits;
178 + t[x] = bits == 4 ? 17 * c : c;
179 + });
180 + t.a = 1;
181 + return t; // Color
182 + };
183 +
184 + Color.fromArray = dojo.colorFromArray = function(/*Array*/ a, /*Color?*/ obj){
185 + // summary:
186 + // Builds a `Color` from a 3 or 4 element array, mapping each
187 + // element in sequence to the rgb(a) values of the color.
188 + // example:
189 + // | var myColor = dojo.colorFromArray([237,237,237,0.5]); // grey, 50% alpha
190 + // returns:
191 + // A Color object. If obj is passed, it will be the return value.
192 + var t = obj || new Color();
193 + t._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3]));
194 + if(isNaN(t.a)){ t.a = 1; }
195 + return t.sanitize(); // Color
196 + };
197 +
198 + Color.fromString = dojo.colorFromString = function(/*String*/ str, /*Color?*/ obj){
199 + // summary:
200 + // Parses `str` for a color value. Accepts hex, rgb, and rgba
201 + // style color values.
202 + // description:
203 + // Acceptable input values for str may include arrays of any form
204 + // accepted by dojo.colorFromArray, hex strings such as "#aaaaaa", or
205 + // rgb or rgba strings such as "rgb(133, 200, 16)" or "rgba(10, 10,
206 + // 10, 50)"
207 + // returns:
208 + // A Color object. If obj is passed, it will be the return value.
209 + var a = Color.named[str];
210 + return a && Color.fromArray(a, obj) || Color.fromRgb(str, obj) || Color.fromHex(str, obj); // Color
211 + };
212 +
213 + return Color;
214 +});
This diff is collapsed. Click to expand it.
1 +define(["./kernel", "../query", "./array", "./html", "../NodeList-dom"], function(dojo, query, array){
2 + // module:
3 + // dojo/_base/NodeList
4 +
5 + /*=====
6 + return {
7 + // summary:
8 + // This module extends dojo/NodeList with the legacy connect(), coords(),
9 + // blur(), focus(), change(), click(), error(), keydown(), keypress(),
10 + // keyup(), load(), mousedown(), mouseenter(), mouseleave(), mousemove(),
11 + // mouseout(), mouseover(), mouseup(), and submit() methods.
12 + };
13 + =====*/
14 +
15 + var NodeList = query.NodeList,
16 + nlp = NodeList.prototype;
17 +
18 + nlp.connect = NodeList._adaptAsForEach(function(){
19 + // don't bind early to dojo.connect since we no longer explicitly depend on it
20 + return dojo.connect.apply(this, arguments);
21 + });
22 + /*=====
23 + nlp.connect = function(methodName, objOrFunc, funcName){
24 + // summary:
25 + // Attach event handlers to every item of the NodeList. Uses dojo.connect()
26 + // so event properties are normalized.
27 + //
28 + // Application must manually require() "dojo/_base/connect" before using this method.
29 + // methodName: String
30 + // the name of the method to attach to. For DOM events, this should be
31 + // the lower-case name of the event
32 + // objOrFunc: Object|Function|String
33 + // if 2 arguments are passed (methodName, objOrFunc), objOrFunc should
34 + // reference a function or be the name of the function in the global
35 + // namespace to attach. If 3 arguments are provided
36 + // (methodName, objOrFunc, funcName), objOrFunc must be the scope to
37 + // locate the bound function in
38 + // funcName: String?
39 + // optional. A string naming the function in objOrFunc to bind to the
40 + // event. May also be a function reference.
41 + // example:
42 + // add an onclick handler to every button on the page
43 + // | query("div:nth-child(odd)").connect("onclick", function(e){
44 + // | console.log("clicked!");
45 + // | });
46 + // example:
47 + // attach foo.bar() to every odd div's onmouseover
48 + // | query("div:nth-child(odd)").connect("onmouseover", foo, "bar");
49 +
50 + return null; // NodeList
51 + };
52 + =====*/
53 +
54 + nlp.coords = NodeList._adaptAsMap(dojo.coords);
55 + /*=====
56 + nlp.coords = function(){
57 + // summary:
58 + // Deprecated: Use position() for border-box x/y/w/h
59 + // or marginBox() for margin-box w/h/l/t.
60 + // Returns the box objects of all elements in a node list as
61 + // an Array (*not* a NodeList). Acts like `domGeom.coords`, though assumes
62 + // the node passed is each node in this list.
63 +
64 + return []; // Array
65 + };
66 + =====*/
67 +
68 + NodeList.events = [
69 + // summary:
70 + // list of all DOM events used in NodeList
71 + "blur", "focus", "change", "click", "error", "keydown", "keypress",
72 + "keyup", "load", "mousedown", "mouseenter", "mouseleave", "mousemove",
73 + "mouseout", "mouseover", "mouseup", "submit"
74 + ];
75 +
76 + // FIXME: pseudo-doc the above automatically generated on-event functions
77 +
78 + // syntactic sugar for DOM events
79 + array.forEach(NodeList.events, function(evt){
80 + var _oe = "on" + evt;
81 + nlp[_oe] = function(a, b){
82 + return this.connect(_oe, a, b);
83 + };
84 + // FIXME: should these events trigger publishes?
85 + /*
86 + return (a ? this.connect(_oe, a, b) :
87 + this.forEach(function(n){
88 + // FIXME:
89 + // listeners get buried by
90 + // addEventListener and can't be dug back
91 + // out to be triggered externally.
92 + // see:
93 + // http://developer.mozilla.org/en/docs/DOM:element
94 +
95 + console.log(n, evt, _oe);
96 +
97 + // FIXME: need synthetic event support!
98 + var _e = { target: n, faux: true, type: evt };
99 + // dojo._event_listener._synthesizeEvent({}, { target: n, faux: true, type: evt });
100 + try{ n[evt](_e); }catch(e){ console.log(e); }
101 + try{ n[_oe](_e); }catch(e){ console.log(e); }
102 + })
103 + );
104 + */
105 + }
106 + );
107 +
108 + dojo.NodeList = NodeList;
109 + return NodeList;
110 +});
This diff is collapsed. Click to expand it.
1 +if(require.has){
2 + require.has.add("config-selectorEngine", "acme");
3 +}
4 +define([
5 + "../ready",
6 + "./kernel",
7 + "./connect", // until we decide if connect is going back into non-browser environments
8 + "./unload",
9 + "./window",
10 + "./event",
11 + "./html",
12 + "./NodeList",
13 + "../query",
14 + "./xhr",
15 + "./fx"], function(dojo){
16 +
17 + // module:
18 + // dojo/_base/browser
19 +
20 + /*=====
21 + return {
22 + // summary:
23 + // This module causes the browser-only base modules to be loaded.
24 + };
25 + =====*/
26 +
27 + return dojo;
28 +});
1 +define(["../has", "require"], function(has, require){
2 + // module:
3 + // dojo/_base/config
4 +
5 +/*=====
6 +return {
7 + // summary:
8 + // This module defines the user configuration during bootstrap.
9 + // description:
10 + // By defining user configuration as a module value, an entire configuration can be specified in a build,
11 + // thereby eliminating the need for sniffing and or explicitly setting in the global variable dojoConfig.
12 + // Also, when multiple instances of dojo exist in a single application, each will necessarily be located
13 + // at an unique absolute module identifier as given by the package configuration. Implementing configuration
14 + // as a module allows for specifying unique, per-instance configurations.
15 + // example:
16 + // Create a second instance of dojo with a different, instance-unique configuration (assume the loader and
17 + // dojo.js are already loaded).
18 + // | // specify a configuration that creates a new instance of dojo at the absolute module identifier "myDojo"
19 + // | require({
20 + // | packages:[{
21 + // | name:"myDojo",
22 + // | location:".", //assume baseUrl points to dojo.js
23 + // | }]
24 + // | });
25 + // |
26 + // | // specify a configuration for the myDojo instance
27 + // | define("myDojo/config", {
28 + // | // normal configuration variables go here, e.g.,
29 + // | locale:"fr-ca"
30 + // | });
31 + // |
32 + // | // load and use the new instance of dojo
33 + // | require(["myDojo"], function(dojo){
34 + // | // dojo is the new instance of dojo
35 + // | // use as required
36 + // | });
37 +
38 + // isDebug: Boolean
39 + // Defaults to `false`. If set to `true`, ensures that Dojo provides
40 + // extended debugging feedback via Firebug. If Firebug is not available
41 + // on your platform, setting `isDebug` to `true` will force Dojo to
42 + // pull in (and display) the version of Firebug Lite which is
43 + // integrated into the Dojo distribution, thereby always providing a
44 + // debugging/logging console when `isDebug` is enabled. Note that
45 + // Firebug's `console.*` methods are ALWAYS defined by Dojo. If
46 + // `isDebug` is false and you are on a platform without Firebug, these
47 + // methods will be defined as no-ops.
48 + isDebug: false,
49 +
50 + // locale: String
51 + // The locale to assume for loading localized resources in this page,
52 + // specified according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
53 + // Must be specified entirely in lowercase, e.g. `en-us` and `zh-cn`.
54 + // See the documentation for `dojo.i18n` and `dojo.requireLocalization`
55 + // for details on loading localized resources. If no locale is specified,
56 + // Dojo assumes the locale of the user agent, according to `navigator.userLanguage`
57 + // or `navigator.language` properties.
58 + locale: undefined,
59 +
60 + // extraLocale: Array
61 + // No default value. Specifies additional locales whose
62 + // resources should also be loaded alongside the default locale when
63 + // calls to `dojo.requireLocalization()` are processed.
64 + extraLocale: undefined,
65 +
66 + // baseUrl: String
67 + // The directory in which `dojo.js` is located. Under normal
68 + // conditions, Dojo auto-detects the correct location from which it
69 + // was loaded. You may need to manually configure `baseUrl` in cases
70 + // where you have renamed `dojo.js` or in which `<base>` tags confuse
71 + // some browsers (e.g. IE 6). The variable `dojo.baseUrl` is assigned
72 + // either the value of `djConfig.baseUrl` if one is provided or the
73 + // auto-detected root if not. Other modules are located relative to
74 + // this path. The path should end in a slash.
75 + baseUrl: undefined,
76 +
77 + // modulePaths: [deprecated] Object
78 + // A map of module names to paths relative to `dojo.baseUrl`. The
79 + // key/value pairs correspond directly to the arguments which
80 + // `dojo.registerModulePath` accepts. Specifying
81 + // `djConfig.modulePaths = { "foo": "../../bar" }` is the equivalent
82 + // of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple
83 + // modules may be configured via `djConfig.modulePaths`.
84 + modulePaths: {},
85 +
86 + // addOnLoad: Function|Array
87 + // Adds a callback via dojo/ready. Useful when Dojo is added after
88 + // the page loads and djConfig.afterOnLoad is true. Supports the same
89 + // arguments as dojo/ready. When using a function reference, use
90 + // `djConfig.addOnLoad = function(){};`. For object with function name use
91 + // `djConfig.addOnLoad = [myObject, "functionName"];` and for object with
92 + // function reference use
93 + // `djConfig.addOnLoad = [myObject, function(){}];`
94 + addOnLoad: null,
95 +
96 + // parseOnLoad: Boolean
97 + // Run the parser after the page is loaded
98 + parseOnLoad: false,
99 +
100 + // require: String[]
101 + // An array of module names to be loaded immediately after dojo.js has been included
102 + // in a page.
103 + require: [],
104 +
105 + // defaultDuration: Number
106 + // Default duration, in milliseconds, for wipe and fade animations within dijits.
107 + // Assigned to dijit.defaultDuration.
108 + defaultDuration: 200,
109 +
110 + // dojoBlankHtmlUrl: String
111 + // Used by some modules to configure an empty iframe. Used by dojo/io/iframe and
112 + // dojo/back, and dijit/popup support in IE where an iframe is needed to make sure native
113 + // controls do not bleed through the popups. Normally this configuration variable
114 + // does not need to be set, except when using cross-domain/CDN Dojo builds.
115 + // Save dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl`
116 + // to the path on your domain your copy of blank.html.
117 + dojoBlankHtmlUrl: undefined,
118 +
119 + // ioPublish: Boolean?
120 + // Set this to true to enable publishing of topics for the different phases of
121 + // IO operations. Publishing is done via dojo/topic.publish(). See dojo/main.__IoPublish for a list
122 + // of topics that are published.
123 + ioPublish: false,
124 +
125 + // useCustomLogger: Anything?
126 + // If set to a value that evaluates to true such as a string or array and
127 + // isDebug is true and Firebug is not available or running, then it bypasses
128 + // the creation of Firebug Lite allowing you to define your own console object.
129 + useCustomLogger: undefined,
130 +
131 + // transparentColor: Array
132 + // Array containing the r, g, b components used as transparent color in dojo.Color;
133 + // if undefined, [255,255,255] (white) will be used.
134 + transparentColor: undefined,
135 +
136 + // deps: Function|Array
137 + // Defines dependencies to be used before the loader has been loaded.
138 + // When provided, they cause the loader to execute require(deps, callback)
139 + // once it has finished loading. Should be used with callback.
140 + deps: undefined,
141 +
142 + // callback: Function|Array
143 + // Defines a callback to be used when dependencies are defined before
144 + // the loader has been loaded. When provided, they cause the loader to
145 + // execute require(deps, callback) once it has finished loading.
146 + // Should be used with deps.
147 + callback: undefined,
148 +
149 + // deferredInstrumentation: Boolean
150 + // Whether deferred instrumentation should be loaded or included
151 + // in builds.
152 + deferredInstrumentation: true,
153 +
154 + // useDeferredInstrumentation: Boolean|String
155 + // Whether the deferred instrumentation should be used.
156 + //
157 + // * `"report-rejections"`: report each rejection as it occurs.
158 + // * `true` or `1` or `"report-unhandled-rejections"`: wait 1 second
159 + // in an attempt to detect unhandled rejections.
160 + useDeferredInstrumentation: "report-unhandled-rejections"
161 +};
162 +=====*/
163 +
164 + var result = {};
165 + if(has("dojo-config-api")){
166 + // must be the dojo loader; take a shallow copy of require.rawConfig
167 + var src = require.rawConfig, p;
168 + for(p in src){
169 + result[p] = src[p];
170 + }
171 + }else{
172 + var adviseHas = function(featureSet, prefix, booting){
173 + for(p in featureSet){
174 + p!="has" && has.add(prefix + p, featureSet[p], 0, booting);
175 + }
176 + };
177 + result = has("dojo-loader") ?
178 + // must be a built version of the dojo loader; all config stuffed in require.rawConfig
179 + require.rawConfig :
180 + // a foreign loader
181 + this.dojoConfig || this.djConfig || {};
182 + adviseHas(result, "config", 1);
183 + adviseHas(result.has, "", 1);
184 + }
185 +
186 + if(!result.locale && typeof navigator != "undefined"){
187 + // Default locale for browsers.
188 + result.locale = (navigator.language || navigator.userLanguage).toLowerCase();
189 + }
190 +
191 + return result;
192 +});
193 +
This diff is collapsed. Click to expand it.
1 +exports.config = function(config){
2 + // summary:
3 + // This module provides bootstrap configuration for running dojo in node.js
4 +
5 + // any command line arguments with the load flag are pushed into deps
6 + for(var deps = [], args = [], i = 0; i < process.argv.length; i++){
7 + var arg = (process.argv[i] + "").split("=");
8 + if(arg[0] == "load"){
9 + deps.push(arg[1]);
10 + }else{
11 + args.push(arg);
12 + }
13 + }
14 +
15 + var fs = require("fs");
16 +
17 + // make sure global require exists
18 + //if (typeof global.require=="undefined"){
19 + // global.require= {};
20 + //}
21 +
22 + // reset the has cache with node-appropriate values;
23 + var hasCache = {
24 + "host-node":1,
25 + "host-browser":0,
26 + "dom":0,
27 + "dojo-has-api":1,
28 + "dojo-xhr-factory":0,
29 + "dojo-inject-api":1,
30 + "dojo-timeout-api":0,
31 + "dojo-trace-api":1,
32 + "dojo-dom-ready-api":0,
33 + "dojo-publish-privates":1,
34 + "dojo-sniff":0,
35 + "dojo-loader":1,
36 + "dojo-test-xd":0,
37 + "dojo-test-sniff":0
38 + };
39 + for(var p in hasCache){
40 + config.hasCache[p] = hasCache[p];
41 + }
42 +
43 + var vm = require('vm'),
44 + path = require('path');
45 +
46 + // reset some configuration switches with node-appropriate values
47 + var nodeConfig = {
48 + baseUrl: path.dirname(process.argv[1]),
49 + commandLineArgs:args,
50 + deps:deps,
51 + timeout:0,
52 +
53 + // TODO: really get the locale
54 + locale:"en-us",
55 +
56 + loaderPatch: {
57 + log:function(item){
58 + // define debug for console messages during dev instead of console.log
59 + // (node's heavy async makes console.log confusing sometimes)
60 + var util = require("util");
61 + util.debug(util.inspect(item));
62 + },
63 +
64 + eval: function(__text, __urlHint){
65 + return vm.runInThisContext(__text, __urlHint);
66 + },
67 +
68 + injectUrl: function(url, callback){
69 + try{
70 + vm.runInThisContext(fs.readFileSync(url, "utf8"), url);
71 + callback();
72 + }catch(e){
73 + this.log("failed to load resource (" + url + ")");
74 + this.log(e);
75 + }
76 + },
77 +
78 + getText: function(url, sync, onLoad){
79 + // TODO: implement async and http/https handling
80 + onLoad(fs.readFileSync(url, "utf8"));
81 + }
82 + }
83 + };
84 + for(p in nodeConfig){
85 + config[p] = nodeConfig[p];
86 + }
87 +};
1 +function rhinoDojoConfig(config, baseUrl, rhinoArgs){
2 + // summary:
3 + // This module provides bootstrap configuration for running dojo in rhino.
4 +
5 + // TODO: v1.6 tries to set dojo.doc and dojo.body in rhino; why?
6 +
7 + // get a minimal console up
8 + var log = function(hint, args){
9 + print((hint ? hint + ":" : "") + args[0]);
10 + for(var i = 1; i < args.length; i++){
11 + print(", " + args[i]);
12 + }
13 + };
14 + // intentionally define console in the global namespace
15 + console= {
16 + log: function(){ log(0, arguments); },
17 + error: function(){ log("ERROR", arguments); },
18 + warn: function(){ log("WARN", arguments); }
19 + };
20 +
21 + // any command line arguments with the load flag are pushed into deps
22 + for(var deps = [], i = 0; i < rhinoArgs.length; i++){
23 + var arg = (rhinoArgs[i] + "").split("=");
24 + if(arg[0] == "load"){
25 + deps.push(arg[1]);
26 + }
27 + }
28 +
29 + // provides timed callbacks using Java threads
30 + if(typeof setTimeout == "undefined" || typeof clearTimeout == "undefined"){
31 + var timeouts = [];
32 + clearTimeout = function(idx){
33 + if(!timeouts[idx]){ return; }
34 + timeouts[idx].stop();
35 + };
36 +
37 + setTimeout = function(func, delay){
38 + var def = {
39 + sleepTime:delay,
40 + hasSlept:false,
41 +
42 + run:function(){
43 + if(!this.hasSlept){
44 + this.hasSlept = true;
45 + java.lang.Thread.currentThread().sleep(this.sleepTime);
46 + }
47 + try{
48 + func();
49 + }catch(e){
50 + console.debug("Error running setTimeout thread:" + e);
51 + }
52 + }
53 + };
54 +
55 + var runnable = new java.lang.Runnable(def);
56 + var thread = new java.lang.Thread(runnable);
57 + thread.start();
58 + return timeouts.push(thread) - 1;
59 + };
60 + }
61 +
62 + var isLocal = function(url){
63 + return (new java.io.File(url)).exists();
64 + };
65 +
66 + // reset the has cache with node-appropriate values;
67 + var hasCache = {
68 + "host-rhino":1,
69 + "host-browser":0,
70 + "dom":0,
71 + "dojo-has-api":1,
72 + "dojo-xhr-factory":0,
73 + "dojo-inject-api":1,
74 + "dojo-timeout-api":0,
75 + "dojo-trace-api":1,
76 + "dojo-loader-catches":1,
77 + "dojo-dom-ready-api":0,
78 + "dojo-publish-privates":1,
79 + "dojo-sniff":0,
80 + "dojo-loader":1,
81 + "dojo-test-xd":0,
82 + "dojo-test-sniff":0
83 + };
84 + for(var p in hasCache){
85 + config.hasCache[p] = hasCache[p];
86 + }
87 +
88 + // reset some configuration switches with rhino-appropriate values
89 + var rhinoConfig = {
90 + baseUrl:baseUrl,
91 + commandLineArgs:rhinoArgs,
92 + deps:deps,
93 + timeout:0,
94 + locale:String(java.util.Locale.getDefault().toString().replace('_', '-').toLowerCase()),
95 +
96 + loaderPatch:{
97 + injectUrl: function(url, callback){
98 + try{
99 + if(isLocal(url)){
100 + load(url);
101 + }else{
102 + require.eval(readUrl(url, "UTF-8"));
103 + }
104 + callback();
105 + }catch(e){
106 + console.log("failed to load resource (" + url + ")");
107 + console.log(e);
108 + }
109 + },
110 +
111 + getText: function(url, sync, onLoad){
112 + // TODO: test https://bugzilla.mozilla.org/show_bug.cgi?id=471005; see v1.6 hostenv_rhino
113 + // note: async mode not supported in rhino
114 + onLoad(isLocal(url) ? readFile(url, "UTF-8") : readUrl(url, "UTF-8"));
115 + }
116 + }
117 + };
118 + for(p in rhinoConfig){
119 + config[p] = rhinoConfig[p];
120 + }
121 +}
1 +// TODO: this file needs to be converted to the v1.7 loader
2 +
3 +// module:
4 +// configSpidermonkey
5 +// summary:
6 +// SpiderMonkey host environment
7 +
8 +if(dojo.config["baseUrl"]){
9 + dojo.baseUrl = dojo.config["baseUrl"];
10 +}else{
11 + dojo.baseUrl = "./";
12 +}
13 +
14 +dojo._name = 'spidermonkey';
15 +
16 +
17 +
18 +dojo.isSpidermonkey = true;
19 +dojo.exit = function(exitcode){
20 + quit(exitcode);
21 +};
22 +
23 +if(typeof print == "function"){
24 + console.debug = print;
25 +}
26 +
27 +if(typeof line2pc == 'undefined'){
28 + throw new Error("attempt to use SpiderMonkey host environment when no 'line2pc' global");
29 +}
30 +
31 +dojo._spidermonkeyCurrentFile = function(depth){
32 + //
33 + // This is a hack that determines the current script file by parsing a
34 + // generated stack trace (relying on the non-standard "stack" member variable
35 + // of the SpiderMonkey Error object).
36 + //
37 + // If param depth is passed in, it'll return the script file which is that far down
38 + // the stack, but that does require that you know how deep your stack is when you are
39 + // calling.
40 + //
41 + var s = '';
42 + try{
43 + throw Error("whatever");
44 + }catch(e){
45 + s = e.stack;
46 + }
47 + // lines are like: bu_getCurrentScriptURI_spidermonkey("ScriptLoader.js")@burst/Runtime.js:101
48 + var matches = s.match(/[^@]*\.js/gi);
49 + if(!matches){
50 + throw Error("could not parse stack string: '" + s + "'");
51 + }
52 + var fname = (typeof depth != 'undefined' && depth) ? matches[depth + 1] : matches[matches.length - 1];
53 + if(!fname){
54 + throw Error("could not find file name in stack string '" + s + "'");
55 + }
56 + //print("SpiderMonkeyRuntime got fname '" + fname + "' from stack string '" + s + "'");
57 + return fname;
58 +};
59 +
60 +// print(dojo._spidermonkeyCurrentFile(0));
61 +
62 +dojo._loadUri = function(uri){
63 + // spidermonkey load() evaluates the contents into the global scope (which
64 + // is what we want).
65 + // TODO: sigh, load() does not return a useful value.
66 + // Perhaps it is returning the value of the last thing evaluated?
67 + // var ok =
68 + load(uri);
69 + // console.log("spidermonkey load(", uri, ") returned ", ok);
70 + return 1;
71 +};
72 +
73 +//Register any module paths set up in djConfig. Need to do this
74 +//in the hostenvs since hostenv_browser can read djConfig from a
75 +//script tag's attribute.
76 +if(dojo.config["modulePaths"]){
77 + for(var param in dojo.config["modulePaths"]){
78 + dojo.registerModulePath(param, dojo.config["modulePaths"][param]);
79 + }
80 +}
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
1 +define(["./kernel", "../on", "../has", "../dom-geometry"], function(dojo, on, has, dom){
2 + // module:
3 + // dojo/_base/event
4 +
5 + if(on._fixEvent){
6 + var fixEvent = on._fixEvent;
7 + on._fixEvent = function(evt, se){
8 + // add some additional normalization for back-compat, this isn't in on.js because it is somewhat more expensive
9 + evt = fixEvent(evt, se);
10 + if(evt){
11 + dom.normalizeEvent(evt);
12 + }
13 + return evt;
14 + };
15 + }
16 +
17 + var ret = {
18 + // summary:
19 + // This module defines dojo DOM event API. Usually you should use dojo/on, and evt.stopPropagation() +
20 + // evt.preventDefault(), rather than this module.
21 +
22 + fix: function(/*Event*/ evt, /*DOMNode*/ sender){
23 + // summary:
24 + // normalizes properties on the event object including event
25 + // bubbling methods, keystroke normalization, and x/y positions
26 + // evt: Event
27 + // native event object
28 + // sender: DOMNode
29 + // node to treat as "currentTarget"
30 + if(on._fixEvent){
31 + return on._fixEvent(evt, sender);
32 + }
33 + return evt; // Event
34 + },
35 +
36 + stop: function(/*Event*/ evt){
37 + // summary:
38 + // prevents propagation and clobbers the default action of the
39 + // passed event
40 + // evt: Event
41 + // The event object. If omitted, window.event is used on IE.
42 + if(has("dom-addeventlistener") || (evt && evt.preventDefault)){
43 + evt.preventDefault();
44 + evt.stopPropagation();
45 + }else{
46 + evt = evt || window.event;
47 + evt.cancelBubble = true;
48 + on._preventDefault.call(evt);
49 + }
50 + }
51 + };
52 +
53 + if(has("extend-dojo")){
54 + dojo.fixEvent = ret.fix;
55 + dojo.stopEvent = ret.stop;
56 + }
57 +
58 + return ret;
59 +});
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
1 +define(["./kernel", "../json"], function(dojo, json){
2 +
3 +// module:
4 +// dojo/_base/json
5 +
6 +/*=====
7 +return {
8 + // summary:
9 + // This module defines the dojo JSON API.
10 +};
11 +=====*/
12 +
13 +dojo.fromJson = function(/*String*/ js){
14 + // summary:
15 + // Parses a JavaScript expression and returns a JavaScript value.
16 + // description:
17 + // Throws for invalid JavaScript expressions. It does not use a strict JSON parser. It
18 + // always delegates to eval(). The content passed to this method must therefore come
19 + // from a trusted source.
20 + // It is recommend that you use dojo/json's parse function for an
21 + // implementation uses the (faster) native JSON parse when available.
22 + // js:
23 + // a string literal of a JavaScript expression, for instance:
24 + // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'`
25 +
26 + return eval("(" + js + ")"); // Object
27 +};
28 +
29 +/*=====
30 +dojo._escapeString = function(){
31 + // summary:
32 + // Adds escape sequences for non-visual characters, double quote and
33 + // backslash and surrounds with double quotes to form a valid string
34 + // literal.
35 +};
36 +=====*/
37 +dojo._escapeString = json.stringify; // just delegate to json.stringify
38 +
39 +dojo.toJsonIndentStr = "\t";
40 +dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint){
41 + // summary:
42 + // Returns a [JSON](http://json.org) serialization of an object.
43 + // description:
44 + // Returns a [JSON](http://json.org) serialization of an object.
45 + // Note that this doesn't check for infinite recursion, so don't do that!
46 + // It is recommend that you use dojo/json's stringify function for an lighter
47 + // and faster implementation that matches the native JSON API and uses the
48 + // native JSON serializer when available.
49 + // it:
50 + // an object to be serialized. Objects may define their own
51 + // serialization via a special "__json__" or "json" function
52 + // property. If a specialized serializer has been defined, it will
53 + // be used as a fallback.
54 + // Note that in 1.6, toJson would serialize undefined, but this no longer supported
55 + // since it is not supported by native JSON serializer.
56 + // prettyPrint:
57 + // if true, we indent objects and arrays to make the output prettier.
58 + // The variable `dojo.toJsonIndentStr` is used as the indent string --
59 + // to use something other than the default (tab), change that variable
60 + // before calling dojo.toJson().
61 + // Note that if native JSON support is available, it will be used for serialization,
62 + // and native implementations vary on the exact spacing used in pretty printing.
63 + // returns:
64 + // A JSON string serialization of the passed-in object.
65 + // example:
66 + // simple serialization of a trivial object
67 + // | var jsonStr = dojo.toJson({ howdy: "stranger!", isStrange: true });
68 + // | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr);
69 + // example:
70 + // a custom serializer for an objects of a particular class:
71 + // | dojo.declare("Furby", null, {
72 + // | furbies: "are strange",
73 + // | furbyCount: 10,
74 + // | __json__: function(){
75 + // | },
76 + // | });
77 +
78 + // use dojo/json
79 + return json.stringify(it, function(key, value){
80 + if(value){
81 + var tf = value.__json__||value.json;
82 + if(typeof tf == "function"){
83 + return tf.call(value);
84 + }
85 + }
86 + return value;
87 + }, prettyPrint && dojo.toJsonIndentStr); // String
88 +};
89 +
90 +return dojo;
91 +});
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
1 +define(["../query", "./NodeList"], function(query){
2 + // module:
3 + // dojo/_base/query
4 +
5 + /*=====
6 + return {
7 + // summary:
8 + // Deprecated. Use dojo/query instead.
9 + };
10 + =====*/
11 +
12 + return query;
13 +});
1 +define(["./kernel", "./lang", "../sniff"], function(dojo, lang, has){
2 + // module:
3 + // dojo/_base/sniff
4 +
5 + /*=====
6 + return {
7 + // summary:
8 + // Deprecated. New code should use dojo/sniff.
9 + // This module populates the dojo browser version sniffing properties like dojo.isIE.
10 + };
11 + =====*/
12 +
13 + if(!has("host-browser")){
14 + return has;
15 + }
16 +
17 + // no idea what this is for, or if it's used
18 + dojo._name = "browser";
19 +
20 + lang.mixin(dojo, {
21 + // isBrowser: Boolean
22 + // True if the client is a web-browser
23 + isBrowser: true,
24 +
25 + // isFF: Number|undefined
26 + // Version as a Number if client is FireFox. undefined otherwise. Corresponds to
27 + // major detected FireFox version (1.5, 2, 3, etc.)
28 + isFF: has("ff"),
29 +
30 + // isIE: Number|undefined
31 + // Version as a Number if client is MSIE(PC). undefined otherwise. Corresponds to
32 + // major detected IE version (6, 7, 8, etc.)
33 + isIE: has("ie"),
34 +
35 + // isKhtml: Number|undefined
36 + // Version as a Number if client is a KHTML browser. undefined otherwise. Corresponds to major
37 + // detected version.
38 + isKhtml: has("khtml"),
39 +
40 + // isWebKit: Number|undefined
41 + // Version as a Number if client is a WebKit-derived browser (Konqueror,
42 + // Safari, Chrome, etc.). undefined otherwise.
43 + isWebKit: has("webkit"),
44 +
45 + // isMozilla: Number|undefined
46 + // Version as a Number if client is a Mozilla-based browser (Firefox,
47 + // SeaMonkey). undefined otherwise. Corresponds to major detected version.
48 + isMozilla: has("mozilla"),
49 + // isMoz: Number|undefined
50 + // Version as a Number if client is a Mozilla-based browser (Firefox,
51 + // SeaMonkey). undefined otherwise. Corresponds to major detected version.
52 + isMoz: has("mozilla"),
53 +
54 + // isOpera: Number|undefined
55 + // Version as a Number if client is Opera. undefined otherwise. Corresponds to
56 + // major detected version.
57 + isOpera: has("opera"),
58 +
59 + // isSafari: Number|undefined
60 + // Version as a Number if client is Safari or iPhone. undefined otherwise.
61 + isSafari: has("safari"),
62 +
63 + // isChrome: Number|undefined
64 + // Version as a Number if client is Chrome browser. undefined otherwise.
65 + isChrome: has("chrome"),
66 +
67 + // isMac: Boolean
68 + // True if the client runs on Mac
69 + isMac: has("mac"),
70 +
71 + // isIos: Number|undefined
72 + // Version as a Number if client is iPhone, iPod, or iPad. undefined otherwise.
73 + isIos: has("ios"),
74 +
75 + // isAndroid: Number|undefined
76 + // Version as a Number if client is android browser. undefined otherwise.
77 + isAndroid: has("android"),
78 +
79 + // isWii: Boolean
80 + // True if client is Wii
81 + isWii: has("wii"),
82 +
83 + // isQuirks: Boolean
84 + // Page is in quirks mode.
85 + isQuirks: has("quirks"),
86 +
87 + // isAir: Boolean
88 + // True if client is Adobe Air
89 + isAir: has("air")
90 + });
91 +
92 + return has;
93 +});
1 +define(["./kernel", "./lang", "../on"], function(dojo, lang, on){
2 +
3 +// module:
4 +// dojo/unload
5 +
6 +var win = window;
7 +
8 +var unload = {
9 + // summary:
10 + // This module contains the document and window unload detection API.
11 +
12 + addOnWindowUnload: function(/*Object|Function?*/ obj, /*String|Function?*/ functionName){
13 + // summary:
14 + // registers a function to be triggered when window.onunload
15 + // fires.
16 + // description:
17 + // The first time that addOnWindowUnload is called Dojo
18 + // will register a page listener to trigger your unload
19 + // handler with. Note that registering these handlers may
20 + // destroy "fastback" page caching in browsers that support
21 + // it. Be careful trying to modify the DOM or access
22 + // JavaScript properties during this phase of page unloading:
23 + // they may not always be available. Consider
24 + // addOnUnload() if you need to modify the DOM or do
25 + // heavy JavaScript work since it fires at the equivalent of
26 + // the page's "onbeforeunload" event.
27 + // example:
28 + // | unload.addOnWindowUnload(functionPointer)
29 + // | unload.addOnWindowUnload(object, "functionName");
30 + // | unload.addOnWindowUnload(object, function(){ /* ... */});
31 +
32 + if (!dojo.windowUnloaded){
33 + on(win, "unload", (dojo.windowUnloaded = function(){
34 + // summary:
35 + // signal fired by impending window destruction. You may use
36 + // dojo.addOnWindowUnload() to register a listener for this
37 + // event. NOTE: if you wish to dojo.connect() to this method
38 + // to perform page/application cleanup, be aware that this
39 + // event WILL NOT fire if no handler has been registered with
40 + // addOnWindowUnload(). This behavior started in Dojo 1.3.
41 + // Previous versions always triggered windowUnloaded(). See
42 + // addOnWindowUnload for more info.
43 + }));
44 + }
45 + on(win, "unload", lang.hitch(obj, functionName));
46 + },
47 +
48 + addOnUnload: function(/*Object?|Function?*/ obj, /*String|Function?*/ functionName){
49 + // summary:
50 + // registers a function to be triggered when the page unloads.
51 + // description:
52 + // The first time that addOnUnload is called Dojo will
53 + // register a page listener to trigger your unload handler
54 + // with.
55 + //
56 + // In a browser environment, the functions will be triggered
57 + // during the window.onbeforeunload event. Be careful of doing
58 + // too much work in an unload handler. onbeforeunload can be
59 + // triggered if a link to download a file is clicked, or if
60 + // the link is a javascript: link. In these cases, the
61 + // onbeforeunload event fires, but the document is not
62 + // actually destroyed. So be careful about doing destructive
63 + // operations in a dojo.addOnUnload callback.
64 + //
65 + // Further note that calling dojo.addOnUnload will prevent
66 + // browsers from using a "fast back" cache to make page
67 + // loading via back button instantaneous.
68 + // example:
69 + // | dojo.addOnUnload(functionPointer)
70 + // | dojo.addOnUnload(object, "functionName")
71 + // | dojo.addOnUnload(object, function(){ /* ... */});
72 +
73 + on(win, "beforeunload", lang.hitch(obj, functionName));
74 + }
75 +};
76 +
77 +dojo.addOnWindowUnload = unload.addOnWindowUnload;
78 +dojo.addOnUnload = unload.addOnUnload;
79 +
80 +return unload;
81 +
82 +});
1 +define(["./kernel"], function(dojo){
2 + // module:
3 + // dojo/url
4 +
5 + var
6 + ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),
7 + ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),
8 + _Url = function(){
9 + var n = null,
10 + _a = arguments,
11 + uri = [_a[0]];
12 + // resolve uri components relative to each other
13 + for(var i = 1; i<_a.length; i++){
14 + if(!_a[i]){ continue; }
15 +
16 + // Safari doesn't support this.constructor so we have to be explicit
17 + // FIXME: Tracked (and fixed) in Webkit bug 3537.
18 + // http://bugs.webkit.org/show_bug.cgi?id=3537
19 + var relobj = new _Url(_a[i]+""),
20 + uriobj = new _Url(uri[0]+"");
21 +
22 + if(
23 + relobj.path == "" &&
24 + !relobj.scheme &&
25 + !relobj.authority &&
26 + !relobj.query
27 + ){
28 + if(relobj.fragment != n){
29 + uriobj.fragment = relobj.fragment;
30 + }
31 + relobj = uriobj;
32 + }else if(!relobj.scheme){
33 + relobj.scheme = uriobj.scheme;
34 +
35 + if(!relobj.authority){
36 + relobj.authority = uriobj.authority;
37 +
38 + if(relobj.path.charAt(0) != "/"){
39 + var path = uriobj.path.substring(0,
40 + uriobj.path.lastIndexOf("/") + 1) + relobj.path;
41 +
42 + var segs = path.split("/");
43 + for(var j = 0; j < segs.length; j++){
44 + if(segs[j] == "."){
45 + // flatten "./" references
46 + if(j == segs.length - 1){
47 + segs[j] = "";
48 + }else{
49 + segs.splice(j, 1);
50 + j--;
51 + }
52 + }else if(j > 0 && !(j == 1 && segs[0] == "") &&
53 + segs[j] == ".." && segs[j-1] != ".."){
54 + // flatten "../" references
55 + if(j == (segs.length - 1)){
56 + segs.splice(j, 1);
57 + segs[j - 1] = "";
58 + }else{
59 + segs.splice(j - 1, 2);
60 + j -= 2;
61 + }
62 + }
63 + }
64 + relobj.path = segs.join("/");
65 + }
66 + }
67 + }
68 +
69 + uri = [];
70 + if(relobj.scheme){
71 + uri.push(relobj.scheme, ":");
72 + }
73 + if(relobj.authority){
74 + uri.push("//", relobj.authority);
75 + }
76 + uri.push(relobj.path);
77 + if(relobj.query){
78 + uri.push("?", relobj.query);
79 + }
80 + if(relobj.fragment){
81 + uri.push("#", relobj.fragment);
82 + }
83 + }
84 +
85 + this.uri = uri.join("");
86 +
87 + // break the uri into its main components
88 + var r = this.uri.match(ore);
89 +
90 + this.scheme = r[2] || (r[1] ? "" : n);
91 + this.authority = r[4] || (r[3] ? "" : n);
92 + this.path = r[5]; // can never be undefined
93 + this.query = r[7] || (r[6] ? "" : n);
94 + this.fragment = r[9] || (r[8] ? "" : n);
95 +
96 + if(this.authority != n){
97 + // server based naming authority
98 + r = this.authority.match(ire);
99 +
100 + this.user = r[3] || n;
101 + this.password = r[4] || n;
102 + this.host = r[6] || r[7]; // ipv6 || ipv4
103 + this.port = r[9] || n;
104 + }
105 + };
106 + _Url.prototype.toString = function(){ return this.uri; };
107 +
108 + return dojo._Url = _Url;
109 +});
1 +define(["./kernel", "./lang", "../sniff"], function(dojo, lang, has){
2 +// module:
3 +// dojo/_base/window
4 +
5 +var ret = {
6 + // summary:
7 + // API to save/set/restore the global/document scope.
8 +
9 + global: dojo.global,
10 + /*=====
11 + global: {
12 + // summary:
13 + // Alias for the current window. 'global' can be modified
14 + // for temporary context shifting. See also withGlobal().
15 + // description:
16 + // Use this rather than referring to 'window' to ensure your code runs
17 + // correctly in managed contexts.
18 + },
19 + =====*/
20 +
21 + doc: this["document"] || null,
22 + /*=====
23 + doc: {
24 + // summary:
25 + // Alias for the current document. 'doc' can be modified
26 + // for temporary context shifting. See also withDoc().
27 + // description:
28 + // Use this rather than referring to 'window.document' to ensure your code runs
29 + // correctly in managed contexts.
30 + // example:
31 + // | n.appendChild(dojo.doc.createElement('div'));
32 + },
33 + =====*/
34 +
35 + body: function(/*Document?*/ doc){
36 + // summary:
37 + // Return the body element of the specified document or of dojo/_base/window::doc.
38 + // example:
39 + // | win.body().appendChild(dojo.doc.createElement('div'));
40 +
41 + // Note: document.body is not defined for a strict xhtml document
42 + // Would like to memoize this, but dojo.doc can change vi dojo.withDoc().
43 + doc = doc || dojo.doc;
44 + return doc.body || doc.getElementsByTagName("body")[0]; // Node
45 + },
46 +
47 + setContext: function(/*Object*/ globalObject, /*DocumentElement*/ globalDocument){
48 + // summary:
49 + // changes the behavior of many core Dojo functions that deal with
50 + // namespace and DOM lookup, changing them to work in a new global
51 + // context (e.g., an iframe). The varibles dojo.global and dojo.doc
52 + // are modified as a result of calling this function and the result of
53 + // `dojo.body()` likewise differs.
54 + dojo.global = ret.global = globalObject;
55 + dojo.doc = ret.doc = globalDocument;
56 + },
57 +
58 + withGlobal: function( /*Object*/ globalObject,
59 + /*Function*/ callback,
60 + /*Object?*/ thisObject,
61 + /*Array?*/ cbArguments){
62 + // summary:
63 + // Invoke callback with globalObject as dojo.global and
64 + // globalObject.document as dojo.doc.
65 + // description:
66 + // Invoke callback with globalObject as dojo.global and
67 + // globalObject.document as dojo.doc. If provided, globalObject
68 + // will be executed in the context of object thisObject
69 + // When callback() returns or throws an error, the dojo.global
70 + // and dojo.doc will be restored to its previous state.
71 +
72 + var oldGlob = dojo.global;
73 + try{
74 + dojo.global = ret.global = globalObject;
75 + return ret.withDoc.call(null, globalObject.document, callback, thisObject, cbArguments);
76 + }finally{
77 + dojo.global = ret.global = oldGlob;
78 + }
79 + },
80 +
81 + withDoc: function( /*DocumentElement*/ documentObject,
82 + /*Function*/ callback,
83 + /*Object?*/ thisObject,
84 + /*Array?*/ cbArguments){
85 + // summary:
86 + // Invoke callback with documentObject as dojo/_base/window::doc.
87 + // description:
88 + // Invoke callback with documentObject as dojo/_base/window::doc. If provided,
89 + // callback will be executed in the context of object thisObject
90 + // When callback() returns or throws an error, the dojo/_base/window::doc will
91 + // be restored to its previous state.
92 +
93 + var oldDoc = ret.doc,
94 + oldQ = has("quirks"),
95 + oldIE = has("ie"), isIE, mode, pwin;
96 +
97 + try{
98 + dojo.doc = ret.doc = documentObject;
99 + // update dojo.isQuirks and the value of the has feature "quirks".
100 + // remove setting dojo.isQuirks and dojo.isIE for 2.0
101 + dojo.isQuirks = has.add("quirks", dojo.doc.compatMode == "BackCompat", true, true); // no need to check for QuirksMode which was Opera 7 only
102 +
103 + if(has("ie")){
104 + if((pwin = documentObject.parentWindow) && pwin.navigator){
105 + // re-run IE detection logic and update dojo.isIE / has("ie")
106 + // (the only time parentWindow/navigator wouldn't exist is if we were not
107 + // passed an actual legitimate document object)
108 + isIE = parseFloat(pwin.navigator.appVersion.split("MSIE ")[1]) || undefined;
109 + mode = documentObject.documentMode;
110 + if(mode && mode != 5 && Math.floor(isIE) != mode){
111 + isIE = mode;
112 + }
113 + dojo.isIE = has.add("ie", isIE, true, true);
114 + }
115 + }
116 +
117 + if(thisObject && typeof callback == "string"){
118 + callback = thisObject[callback];
119 + }
120 +
121 + return callback.apply(thisObject, cbArguments || []);
122 + }finally{
123 + dojo.doc = ret.doc = oldDoc;
124 + dojo.isQuirks = has.add("quirks", oldQ, true, true);
125 + dojo.isIE = has.add("ie", oldIE, true, true);
126 + }
127 + }
128 +};
129 +
130 +has("extend-dojo") && lang.mixin(dojo, ret);
131 +
132 +return ret;
133 +
134 +});
This diff is collapsed. Click to expand it.
1 +License Disclaimer:
2 +
3 +All contents of this directory are Copyright (c) the Dojo Foundation, with the
4 +following exceptions:
5 +-------------------------------------------------------------------------------
6 +
7 +firebug.html, firebug.js, errIcon.png, infoIcon.png, warningIcon.png:
8 + * Copyright (c) 2006-2007, Joe Hewitt, All rights reserved.
9 + Distributed under the terms of the BSD License (see below)
10 +
11 +-------------------------------------------------------------------------------
12 +
13 +Copyright (c) 2006-2007, Joe Hewitt
14 +All rights reserved.
15 +
16 +Redistribution and use in source and binary forms, with or without
17 +modification, are permitted provided that the following conditions are met:
18 +
19 + * Redistributions of source code must retain the above copyright notice, this
20 + list of conditions and the following disclaimer.
21 + * Redistributions in binary form must reproduce the above copyright notice,
22 + this list of conditions and the following disclaimer in the documentation
23 + and/or other materials provided with the distribution.
24 + * Neither the name of the Dojo Foundation nor the names of its contributors
25 + may be used to endorse or promote products derived from this software
26 + without specific prior written permission.
27 +
28 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
29 +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
30 +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
31 +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
32 +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
34 +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
35 +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
36 +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37 +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1 +.firebug {
2 + margin: 0;
3 + background:#fff;
4 + font-family: Lucida Grande, Tahoma, sans-serif;
5 + font-size: 11px;
6 + overflow: hidden;
7 + border: 1px solid black;
8 + position: relative;
9 +}
10 +.firebug a {
11 + text-decoration: none;
12 +}
13 +.firebug a:hover {
14 + text-decoration: underline;
15 +}
16 +.firebug a:visited{
17 + color:#0000FF;
18 +}
19 +.firebug #firebugToolbar {
20 + height: 18px;
21 + line-height:18px;
22 + border-top: 1px solid ThreeDHighlight;
23 + border-bottom: 1px solid ThreeDShadow;
24 + padding: 2px 6px;
25 +
26 + background:#f0f0f0;
27 +}
28 +
29 +.firebug #firebugLog, .firebug #objectLog {
30 + overflow: auto;
31 + position: absolute;
32 + left: 0;
33 + width: 100%;
34 +}
35 +#objectLog{
36 + overflow:scroll;
37 + height:258px;
38 +}
39 +.firebug #firebugCommandLine {
40 + position: absolute;
41 + bottom: 0;
42 + left: 0;
43 + width: 100%;
44 + height: 18px;
45 + border: none;
46 + border-top: 1px solid ThreeDShadow;
47 +}
48 +.firebug .logRow {
49 + position: relative;
50 + border-bottom: 1px solid #D7D7D7;
51 + padding: 2px 4px 1px 6px;
52 + background-color: #FFFFFF;
53 +}
54 +.firebug .logRow-command {
55 + font-family: Monaco, monospace;
56 + color: blue;
57 +}
58 +.firebug .objectBox-null {
59 + padding: 0 2px;
60 + border: 1px solid #666666;
61 + background-color: #888888;
62 + color: #FFFFFF;
63 +}
64 +.firebug .objectBox-string {
65 + font-family: Monaco, monospace;
66 + color: red;
67 + white-space: pre;
68 +}
69 +.firebug .objectBox-number {
70 + color: #000088;
71 +}
72 +.firebug .objectBox-function {
73 + font-family: Monaco, monospace;
74 + color: DarkGreen;
75 +}
76 +.firebug .objectBox-object {
77 + color: DarkGreen;
78 + font-weight: bold;
79 +}
80 +.firebug .logRow-info,
81 +.firebug .logRow-error,
82 +.firebug .logRow-warning
83 + {
84 + background: #00FFFF no-repeat 2px 2px;
85 + padding-left: 20px;
86 + padding-bottom: 3px;
87 +}
88 +.firebug .logRow-info {
89 + background: #FFF url(infoIcon.png) no-repeat 2px 2px;
90 + padding-left: 20px;
91 + padding-bottom: 3px;
92 +}
93 +.firebug .logRow-warning {
94 +
95 + background: #00FFFF url(warningIcon.png) no-repeat 2px 2px;
96 + padding-left: 20px;
97 + padding-bottom: 3px;
98 +}
99 +.firebug .logRow-error {
100 + background: LightYellow url(errorIcon.png) no-repeat 2px 2px;
101 + padding-left: 20px;
102 + padding-bottom: 3px;
103 +}
104 +.firebug .errorMessage {
105 + vertical-align: top;
106 + color: #FF0000;
107 +}
108 +.firebug .objectBox-sourceLink {
109 + position: absolute;
110 + right: 4px;
111 + top: 2px;
112 + padding-left: 8px;
113 + font-family: Lucida Grande, sans-serif;
114 + font-weight: bold;
115 + color: #0000FF;
116 +}
117 +.firebug .logRow-group {
118 + background: #EEEEEE;
119 + border-bottom: none;
120 +}
121 +.firebug .logGroup {
122 + background: #EEEEEE;
123 +}
124 +.firebug .logGroupBox {
125 + margin-left: 24px;
126 + border-top: 1px solid #D7D7D7;
127 + border-left: 1px solid #D7D7D7;
128 +}
129 +.firebug .selectorTag,
130 +.firebug .selectorId,
131 +.firebug .selectorClass {
132 + font-family: Monaco, monospace;
133 + font-weight: normal;
134 +}
135 +.firebug .selectorTag {
136 + color: #0000FF;
137 +}
138 +.firebug .selectorId {
139 + color: DarkBlue;
140 +}
141 +.firebug .selectorClass {
142 + color: red;
143 +}
144 +.firebug .objectBox-element {
145 + font-family: Monaco, monospace;
146 + color: #000088;
147 +}
148 +.firebug .nodeChildren {
149 + margin-left: 16px;
150 +}
151 +.firebug .nodeTag {
152 + color: blue;
153 +}
154 +.firebug .nodeValue {
155 + color: #FF0000;
156 + font-weight: normal;
157 +}
158 +.firebug .nodeText,
159 +.firebug .nodeComment {
160 + margin: 0 2px;
161 + vertical-align: top;
162 +}
163 +.firebug .nodeText {
164 + color: #333333;
165 +}
166 +.firebug .nodeComment {
167 + color: DarkGreen;
168 +}
169 +.firebug .propertyNameCell {
170 + vertical-align: top;
171 +}
172 +.firebug .propertyName {
173 + font-weight: bold;
174 +}
175 +
176 +/* tabs */
177 +#firebugToolbar ul.tabs{
178 + margin:0 !important;
179 + padding:0;
180 +}
181 +#firebugToolbar ul.tabs li{
182 + list-style:none;
183 + background:transparent url(tab_lft_norm.png) no-repeat left;
184 + line-height:18px;
185 + float:left;
186 + margin-left:5px;
187 +}
188 +#firebugToolbar ul.tabs li.right{
189 + float:right;
190 + margin-right:5px;
191 + margin-left:0;
192 +}
193 +#firebugToolbar ul.tabs li.gap{
194 + margin-left:20px;
195 +}
196 +#firebugToolbar .tabs a{
197 + text-decoration:none;
198 + background:transparent url(tab_rgt_norm.png) no-repeat right;
199 + line-height:18px;
200 + padding:3px 9px 4px 0px;
201 + margin-left:9px;
202 + color:#333333;
203 +}
204 +#firebugToolbar .tabs li:hover{
205 + background:transparent url(tab_lft_over.png) no-repeat left;
206 +}
207 +#firebugToolbar .tabs a:hover{
208 + text-decoration:none;
209 + background:transparent url(tab_rgt_over.png) no-repeat right;
210 + color:#FFFFFF;
211 +}
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.