mirror of
https://git.tt-rss.org/git/tt-rss.git
synced 2025-12-13 05:25:56 +00:00
update dojo to 1.7.3
This commit is contained in:
@@ -4,104 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.AdapterRegistry"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.AdapterRegistry"] = true;
|
||||
dojo.provide("dojo.AdapterRegistry");
|
||||
|
||||
|
||||
dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
|
||||
// summary:
|
||||
// A registry to make contextual calling/searching easier.
|
||||
// description:
|
||||
// Objects of this class keep list of arrays in the form [name, check,
|
||||
// wrap, directReturn] that are used to determine what the contextual
|
||||
// result of a set of checked arguments is. All check/wrap functions
|
||||
// in this registry should be of the same arity.
|
||||
// example:
|
||||
// | // create a new registry
|
||||
// | var reg = new dojo.AdapterRegistry();
|
||||
// | reg.register("handleString",
|
||||
// | dojo.isString,
|
||||
// | function(str){
|
||||
// | // do something with the string here
|
||||
// | }
|
||||
// | );
|
||||
// | reg.register("handleArr",
|
||||
// | dojo.isArray,
|
||||
// | function(arr){
|
||||
// | // do something with the array here
|
||||
// | }
|
||||
// | );
|
||||
// |
|
||||
// | // now we can pass reg.match() *either* an array or a string and
|
||||
// | // the value we pass will get handled by the right function
|
||||
// | reg.match("someValue"); // will call the first function
|
||||
// | reg.match(["someValue"]); // will call the second
|
||||
|
||||
this.pairs = [];
|
||||
this.returnWrappers = returnWrappers || false; // Boolean
|
||||
};
|
||||
|
||||
dojo.extend(dojo.AdapterRegistry, {
|
||||
register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){
|
||||
// summary:
|
||||
// register a check function to determine if the wrap function or
|
||||
// object gets selected
|
||||
// name:
|
||||
// a way to identify this matcher.
|
||||
// check:
|
||||
// a function that arguments are passed to from the adapter's
|
||||
// match() function. The check function should return true if the
|
||||
// given arguments are appropriate for the wrap function.
|
||||
// directReturn:
|
||||
// If directReturn is true, the value passed in for wrap will be
|
||||
// returned instead of being called. Alternately, the
|
||||
// AdapterRegistry can be set globally to "return not call" using
|
||||
// the returnWrappers property. Either way, this behavior allows
|
||||
// the registry to act as a "search" function instead of a
|
||||
// function interception library.
|
||||
// override:
|
||||
// If override is given and true, the check function will be given
|
||||
// highest priority. Otherwise, it will be the lowest priority
|
||||
// adapter.
|
||||
this.pairs[((override) ? "unshift" : "push")]([name, check, wrap, directReturn]);
|
||||
},
|
||||
|
||||
match: function(/* ... */){
|
||||
// summary:
|
||||
// Find an adapter for the given arguments. If no suitable adapter
|
||||
// is found, throws an exception. match() accepts any number of
|
||||
// arguments, all of which are passed to all matching functions
|
||||
// from the registered pairs.
|
||||
for(var i = 0; i < this.pairs.length; i++){
|
||||
var pair = this.pairs[i];
|
||||
if(pair[1].apply(this, arguments)){
|
||||
if((pair[3])||(this.returnWrappers)){
|
||||
return pair[2];
|
||||
}else{
|
||||
return pair[2].apply(this, arguments);
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new Error("No match found");
|
||||
},
|
||||
|
||||
unregister: function(name){
|
||||
// summary: Remove a named adapter from the registry
|
||||
|
||||
// FIXME: this is kind of a dumb way to handle this. On a large
|
||||
// registry this will be slow-ish and we can use the name as a lookup
|
||||
// should we choose to trade memory for speed.
|
||||
for(var i = 0; i < this.pairs.length; i++){
|
||||
var pair = this.pairs[i];
|
||||
if(pair[0] == name){
|
||||
this.pairs.splice(i, 1);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/AdapterRegistry",["./_base/kernel","./_base/lang"],function(_1,_2){var _3=_1.AdapterRegistry=function(_4){this.pairs=[];this.returnWrappers=_4||false;};_2.extend(_3,{register:function(_5,_6,_7,_8,_9){this.pairs[((_9)?"unshift":"push")]([_5,_6,_7,_8]);},match:function(){for(var i=0;i<this.pairs.length;i++){var _a=this.pairs[i];if(_a[1].apply(this,arguments)){if((_a[3])||(this.returnWrappers)){return _a[2];}else{return _a[2].apply(this,arguments);}}}throw new Error("No match found");},unregister:function(_b){for(var i=0;i<this.pairs.length;i++){var _c=this.pairs[i];if(_c[0]==_b){this.pairs.splice(i,1);return true;}}return false;}});return _3;});
|
||||
113
lib/dojo/AdapterRegistry.js.uncompressed.js
Normal file
113
lib/dojo/AdapterRegistry.js.uncompressed.js
Normal file
@@ -0,0 +1,113 @@
|
||||
define("dojo/AdapterRegistry", ["./_base/kernel", "./_base/lang"], function(dojo, lang) {
|
||||
// module:
|
||||
// dojo/AdapterRegistry
|
||||
// summary:
|
||||
// TODOC
|
||||
|
||||
var AdapterRegistry = dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
|
||||
// summary:
|
||||
// A registry to make contextual calling/searching easier.
|
||||
// description:
|
||||
// Objects of this class keep list of arrays in the form [name, check,
|
||||
// wrap, directReturn] that are used to determine what the contextual
|
||||
// result of a set of checked arguments is. All check/wrap functions
|
||||
// in this registry should be of the same arity.
|
||||
// example:
|
||||
// | // create a new registry
|
||||
// | var reg = new dojo.AdapterRegistry();
|
||||
// | reg.register("handleString",
|
||||
// | dojo.isString,
|
||||
// | function(str){
|
||||
// | // do something with the string here
|
||||
// | }
|
||||
// | );
|
||||
// | reg.register("handleArr",
|
||||
// | dojo.isArray,
|
||||
// | function(arr){
|
||||
// | // do something with the array here
|
||||
// | }
|
||||
// | );
|
||||
// |
|
||||
// | // now we can pass reg.match() *either* an array or a string and
|
||||
// | // the value we pass will get handled by the right function
|
||||
// | reg.match("someValue"); // will call the first function
|
||||
// | reg.match(["someValue"]); // will call the second
|
||||
|
||||
this.pairs = [];
|
||||
this.returnWrappers = returnWrappers || false; // Boolean
|
||||
};
|
||||
|
||||
/*=====
|
||||
// doc alias helpers:
|
||||
AdapterRegistry = dojo.AdapterRegistry;
|
||||
=====*/
|
||||
|
||||
lang.extend(AdapterRegistry, {
|
||||
register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){
|
||||
// summary:
|
||||
// register a check function to determine if the wrap function or
|
||||
// object gets selected
|
||||
// name:
|
||||
// a way to identify this matcher.
|
||||
// check:
|
||||
// a function that arguments are passed to from the adapter's
|
||||
// match() function. The check function should return true if the
|
||||
// given arguments are appropriate for the wrap function.
|
||||
// directReturn:
|
||||
// If directReturn is true, the value passed in for wrap will be
|
||||
// returned instead of being called. Alternately, the
|
||||
// AdapterRegistry can be set globally to "return not call" using
|
||||
// the returnWrappers property. Either way, this behavior allows
|
||||
// the registry to act as a "search" function instead of a
|
||||
// function interception library.
|
||||
// override:
|
||||
// If override is given and true, the check function will be given
|
||||
// highest priority. Otherwise, it will be the lowest priority
|
||||
// adapter.
|
||||
this.pairs[((override) ? "unshift" : "push")]([name, check, wrap, directReturn]);
|
||||
},
|
||||
|
||||
match: function(/* ... */){
|
||||
// summary:
|
||||
// Find an adapter for the given arguments. If no suitable adapter
|
||||
// is found, throws an exception. match() accepts any number of
|
||||
// arguments, all of which are passed to all matching functions
|
||||
// from the registered pairs.
|
||||
for(var i = 0; i < this.pairs.length; i++){
|
||||
var pair = this.pairs[i];
|
||||
if(pair[1].apply(this, arguments)){
|
||||
if((pair[3])||(this.returnWrappers)){
|
||||
return pair[2];
|
||||
}else{
|
||||
return pair[2].apply(this, arguments);
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new Error("No match found");
|
||||
},
|
||||
|
||||
unregister: function(name){
|
||||
// summary:
|
||||
// Remove a named adapter from the registry
|
||||
// name: String
|
||||
// The name of the adapter.
|
||||
// returns: Boolean
|
||||
// Returns true if operation is successful.
|
||||
// Returns false if operation fails.
|
||||
|
||||
// FIXME: this is kind of a dumb way to handle this. On a large
|
||||
// registry this will be slow-ish and we can use the name as a lookup
|
||||
// should we choose to trade memory for speed.
|
||||
for(var i = 0; i < this.pairs.length; i++){
|
||||
var pair = this.pairs[i];
|
||||
if(pair[0] == name){
|
||||
this.pairs.splice(i, 1);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
return AdapterRegistry;
|
||||
});
|
||||
@@ -4,82 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.DeferredList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.DeferredList"] = true;
|
||||
dojo.provide("dojo.DeferredList");
|
||||
|
||||
|
||||
dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){
|
||||
// summary:
|
||||
// Provides event handling for a group of Deferred objects.
|
||||
// description:
|
||||
// DeferredList takes an array of existing deferreds and returns a new deferred of its own
|
||||
// this new deferred will typically have its callback fired when all of the deferreds in
|
||||
// the given list have fired their own deferreds. The parameters `fireOnOneCallback` and
|
||||
// fireOnOneErrback, will fire before all the deferreds as appropriate
|
||||
//
|
||||
// list:
|
||||
// The list of deferreds to be synchronizied with this DeferredList
|
||||
// fireOnOneCallback:
|
||||
// Will cause the DeferredLists callback to be fired as soon as any
|
||||
// of the deferreds in its list have been fired instead of waiting until
|
||||
// the entire list has finished
|
||||
// fireonOneErrback:
|
||||
// Will cause the errback to fire upon any of the deferreds errback
|
||||
// canceller:
|
||||
// A deferred canceller function, see dojo.Deferred
|
||||
var resultList = [];
|
||||
dojo.Deferred.call(this);
|
||||
var self = this;
|
||||
if(list.length === 0 && !fireOnOneCallback){
|
||||
this.resolve([0, []]);
|
||||
}
|
||||
var finished = 0;
|
||||
dojo.forEach(list, function(item, i){
|
||||
item.then(function(result){
|
||||
if(fireOnOneCallback){
|
||||
self.resolve([i, result]);
|
||||
}else{
|
||||
addResult(true, result);
|
||||
}
|
||||
},function(error){
|
||||
if(fireOnOneErrback){
|
||||
self.reject(error);
|
||||
}else{
|
||||
addResult(false, error);
|
||||
}
|
||||
if(consumeErrors){
|
||||
return null;
|
||||
}
|
||||
throw error;
|
||||
});
|
||||
function addResult(succeeded, result){
|
||||
resultList[i] = [succeeded, result];
|
||||
finished++;
|
||||
if(finished === list.length){
|
||||
self.resolve(resultList);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
};
|
||||
dojo.DeferredList.prototype = new dojo.Deferred();
|
||||
|
||||
dojo.DeferredList.prototype.gatherResults= function(deferredList){
|
||||
// summary:
|
||||
// Gathers the results of the deferreds for packaging
|
||||
// as the parameters to the Deferred Lists' callback
|
||||
|
||||
var d = new dojo.DeferredList(deferredList, false, true, false);
|
||||
d.addCallback(function(results){
|
||||
var ret = [];
|
||||
dojo.forEach(results, function(result){
|
||||
ret.push(result[1]);
|
||||
});
|
||||
return ret;
|
||||
});
|
||||
return d;
|
||||
};
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/DeferredList",["./_base/kernel","./_base/Deferred","./_base/array"],function(_1,_2,_3){_1.DeferredList=function(_4,_5,_6,_7,_8){var _9=[];_2.call(this);var _a=this;if(_4.length===0&&!_5){this.resolve([0,[]]);}var _b=0;_3.forEach(_4,function(_c,i){_c.then(function(_d){if(_5){_a.resolve([i,_d]);}else{_e(true,_d);}},function(_f){if(_6){_a.reject(_f);}else{_e(false,_f);}if(_7){return null;}throw _f;});function _e(_10,_11){_9[i]=[_10,_11];_b++;if(_b===_4.length){_a.resolve(_9);}};});};_1.DeferredList.prototype=new _2();_1.DeferredList.prototype.gatherResults=function(_12){var d=new _1.DeferredList(_12,false,true,false);d.addCallback(function(_13){var ret=[];_3.forEach(_13,function(_14){ret.push(_14[1]);});return ret;});return d;};return _1.DeferredList;});
|
||||
86
lib/dojo/DeferredList.js.uncompressed.js
Normal file
86
lib/dojo/DeferredList.js.uncompressed.js
Normal file
@@ -0,0 +1,86 @@
|
||||
define("dojo/DeferredList", ["./_base/kernel", "./_base/Deferred", "./_base/array"], function(dojo, Deferred, darray) {
|
||||
// module:
|
||||
// dojo/DeferredList
|
||||
// summary:
|
||||
// TODOC
|
||||
|
||||
|
||||
dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){
|
||||
// summary:
|
||||
// Provides event handling for a group of Deferred objects.
|
||||
// description:
|
||||
// DeferredList takes an array of existing deferreds and returns a new deferred of its own
|
||||
// this new deferred will typically have its callback fired when all of the deferreds in
|
||||
// the given list have fired their own deferreds. The parameters `fireOnOneCallback` and
|
||||
// fireOnOneErrback, will fire before all the deferreds as appropriate
|
||||
//
|
||||
// list:
|
||||
// The list of deferreds to be synchronizied with this DeferredList
|
||||
// fireOnOneCallback:
|
||||
// Will cause the DeferredLists callback to be fired as soon as any
|
||||
// of the deferreds in its list have been fired instead of waiting until
|
||||
// the entire list has finished
|
||||
// fireonOneErrback:
|
||||
// Will cause the errback to fire upon any of the deferreds errback
|
||||
// canceller:
|
||||
// A deferred canceller function, see dojo.Deferred
|
||||
var resultList = [];
|
||||
Deferred.call(this);
|
||||
var self = this;
|
||||
if(list.length === 0 && !fireOnOneCallback){
|
||||
this.resolve([0, []]);
|
||||
}
|
||||
var finished = 0;
|
||||
darray.forEach(list, function(item, i){
|
||||
item.then(function(result){
|
||||
if(fireOnOneCallback){
|
||||
self.resolve([i, result]);
|
||||
}else{
|
||||
addResult(true, result);
|
||||
}
|
||||
},function(error){
|
||||
if(fireOnOneErrback){
|
||||
self.reject(error);
|
||||
}else{
|
||||
addResult(false, error);
|
||||
}
|
||||
if(consumeErrors){
|
||||
return null;
|
||||
}
|
||||
throw error;
|
||||
});
|
||||
function addResult(succeeded, result){
|
||||
resultList[i] = [succeeded, result];
|
||||
finished++;
|
||||
if(finished === list.length){
|
||||
self.resolve(resultList);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
};
|
||||
dojo.DeferredList.prototype = new Deferred();
|
||||
|
||||
dojo.DeferredList.prototype.gatherResults = function(deferredList){
|
||||
// summary:
|
||||
// Gathers the results of the deferreds for packaging
|
||||
// as the parameters to the Deferred Lists' callback
|
||||
// deferredList: dojo.DeferredList
|
||||
// The deferred list from which this function gathers results.
|
||||
// returns: dojo.DeferredList
|
||||
// The newly created deferred list which packs results as
|
||||
// parameters to its callback.
|
||||
|
||||
var d = new dojo.DeferredList(deferredList, false, true, false);
|
||||
d.addCallback(function(results){
|
||||
var ret = [];
|
||||
darray.forEach(results, function(result){
|
||||
ret.push(result[1]);
|
||||
});
|
||||
return ret;
|
||||
});
|
||||
return d;
|
||||
};
|
||||
|
||||
return dojo.DeferredList;
|
||||
});
|
||||
8
lib/dojo/Evented.js
Normal file
8
lib/dojo/Evented.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/Evented",["./aspect","./on"],function(_1,on){"use strict";var _2=_1.after;function _3(){};_3.prototype={on:function(_4,_5){return on.parse(this,_4,_5,function(_6,_7){return _2(_6,"on"+_7,_5,true);});},emit:function(_8,_9){var _a=[this];_a.push.apply(_a,arguments);return on.emit.apply(on,_a);}};return _3;});
|
||||
32
lib/dojo/Evented.js.uncompressed.js
Normal file
32
lib/dojo/Evented.js.uncompressed.js
Normal file
@@ -0,0 +1,32 @@
|
||||
define("dojo/Evented", ["./aspect", "./on"], function(aspect, on){
|
||||
// summary:
|
||||
// The export of this module is a class that can be used as a mixin or base class,
|
||||
// to add on() and emit() methods to a class
|
||||
// for listening for events and emiting events:
|
||||
// |define(["dojo/Evented"], function(Evented){
|
||||
// | var EventedWidget = dojo.declare([Evented, dijit._Widget], {...});
|
||||
// | widget = new EventedWidget();
|
||||
// | widget.on("open", function(event){
|
||||
// | ... do something with event
|
||||
// | });
|
||||
// |
|
||||
// | widget.emit("open", {name:"some event", ...});
|
||||
|
||||
"use strict";
|
||||
var after = aspect.after;
|
||||
function Evented(){
|
||||
}
|
||||
Evented.prototype = {
|
||||
on: function(type, listener){
|
||||
return on.parse(this, type, listener, function(target, type){
|
||||
return after(target, 'on' + type, listener, true);
|
||||
});
|
||||
},
|
||||
emit: function(type, event){
|
||||
var args = [this];
|
||||
args.push.apply(args, arguments);
|
||||
return on.emit.apply(on, args);
|
||||
}
|
||||
};
|
||||
return Evented;
|
||||
});
|
||||
@@ -4,172 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.NodeList-data"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.NodeList-data"] = true;
|
||||
dojo.provide("dojo.NodeList-data");
|
||||
|
||||
(function(d){
|
||||
|
||||
/*=====
|
||||
dojo.NodeList.prototype.data = function(key, value){
|
||||
// summary: stash or get some arbitrary data on/from these nodes.
|
||||
//
|
||||
// description:
|
||||
// Stash or get some arbirtrary data on/from these nodes. This private _data function is
|
||||
// exposed publicly on `dojo.NodeList`, eg: as the result of a `dojo.query` call.
|
||||
// DIFFERS from jQuery.data in that when used as a getter, the entire list is ALWAYS
|
||||
// returned. EVEN WHEN THE LIST IS length == 1.
|
||||
//
|
||||
// A single-node version of this function is provided as `dojo._nodeData`, which follows
|
||||
// the same signature, though expects a String ID or DomNode reference in the first
|
||||
// position, before key/value arguments.
|
||||
//
|
||||
// node: String|DomNode
|
||||
// The node to associate data with
|
||||
//
|
||||
// key: Object?|String?
|
||||
// If an object, act as a setter and iterate over said object setting data items as defined.
|
||||
// If a string, and `value` present, set the data for defined `key` to `value`
|
||||
// If a string, and `value` absent, act as a getter, returning the data associated with said `key`
|
||||
//
|
||||
// value: Anything?
|
||||
// The value to set for said `key`, provided `key` is a string (and not an object)
|
||||
//
|
||||
// example:
|
||||
// Set a key `bar` to some data, then retrieve it.
|
||||
// | dojo.query(".foo").data("bar", "touched");
|
||||
// | var touched = dojo.query(".foo").data("bar");
|
||||
// | if(touched[0] == "touched"){ alert('win'); }
|
||||
//
|
||||
// example:
|
||||
// Get all the data items for a given node.
|
||||
// | var list = dojo.query(".foo").data();
|
||||
// | var first = list[0];
|
||||
//
|
||||
// example:
|
||||
// Set the data to a complex hash. Overwrites existing keys with new value
|
||||
// | dojo.query(".foo").data({ bar:"baz", foo:"bar" });
|
||||
// Then get some random key:
|
||||
// | dojo.query(".foo").data("foo"); // returns [`bar`]
|
||||
//
|
||||
// returns: Object|Anything|Nothing
|
||||
// When used as a setter via `dojo.NodeList`, a NodeList instance is returned
|
||||
// for further chaning. When used as a getter via `dojo.NodeList` an ARRAY
|
||||
// of items is returned. The items in the array correspond to the elements
|
||||
// in the original list. This is true even when the list length is 1, eg:
|
||||
// when looking up a node by ID (#foo)
|
||||
};
|
||||
|
||||
dojo.NodeList.prototype.removeData = function(key){
|
||||
// summary: Remove the data associated with these nodes.
|
||||
// key: String?
|
||||
// If ommitted, clean all data for this node.
|
||||
// If passed, remove the data item found at `key`
|
||||
};
|
||||
|
||||
dojo._nodeDataCache = {
|
||||
// summary: An alias to the private dataCache for NodeList-data. NEVER USE THIS!
|
||||
// This private is only exposed for the benefit of unit testing, and is
|
||||
// removed during the build process.
|
||||
};
|
||||
|
||||
=====*/
|
||||
|
||||
var dataCache = {}, x = 0, dataattr = "data-dojo-dataid", nl = d.NodeList,
|
||||
dopid = function(node){
|
||||
// summary: Return a uniqueish ID for the passed node reference
|
||||
var pid = d.attr(node, dataattr);
|
||||
if(!pid){
|
||||
pid = "pid" + (x++);
|
||||
d.attr(node, dataattr, pid);
|
||||
}
|
||||
return pid;
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
var dodata = d._nodeData = function(node, key, value){
|
||||
|
||||
var pid = dopid(node), r;
|
||||
if(!dataCache[pid]){ dataCache[pid] = {}; }
|
||||
|
||||
// API discrepency: calling with only a node returns the whole object. $.data throws
|
||||
if(arguments.length == 1){ r = dataCache[pid]; }
|
||||
if(typeof key == "string"){
|
||||
// either getter or setter, based on `value` presence
|
||||
if(arguments.length > 2){
|
||||
dataCache[pid][key] = value;
|
||||
}else{
|
||||
r = dataCache[pid][key];
|
||||
}
|
||||
}else{
|
||||
// must be a setter, mix `value` into data hash
|
||||
// API discrepency: using object as setter works here
|
||||
r = d._mixin(dataCache[pid], key);
|
||||
}
|
||||
|
||||
return r; // Object|Anything|Nothing
|
||||
};
|
||||
|
||||
var removeData = d._removeNodeData = function(node, key){
|
||||
// summary: Remove some data from this node
|
||||
// node: String|DomNode
|
||||
// The node reference to remove data from
|
||||
// key: String?
|
||||
// If omitted, remove all data in this dataset.
|
||||
// If passed, remove only the passed `key` in the associated dataset
|
||||
var pid = dopid(node);
|
||||
if(dataCache[pid]){
|
||||
if(key){
|
||||
delete dataCache[pid][key];
|
||||
}else{
|
||||
delete dataCache[pid];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
d._gcNodeData = function(){
|
||||
// summary: super expensive: GC all data in the data for nodes that no longer exist in the dom.
|
||||
// description:
|
||||
// super expensive: GC all data in the data for nodes that no longer exist in the dom.
|
||||
// MUCH safer to do this yourself, manually, on a per-node basis (via `NodeList.removeData()`)
|
||||
// provided as a stop-gap for exceptionally large/complex applications with constantly changing
|
||||
// content regions (eg: a dijit.layout.ContentPane with replacing data)
|
||||
// There is NO automatic GC going on. If you dojo.destroy() a node, you should _removeNodeData
|
||||
// prior to destruction.
|
||||
var livePids = dojo.query("[" + dataattr + "]").map(dopid);
|
||||
for(var i in dataCache){
|
||||
if(dojo.indexOf(livePids, i) < 0){ delete dataCache[i]; }
|
||||
}
|
||||
};
|
||||
|
||||
// make nodeData and removeNodeData public on dojo.NodeList:
|
||||
d.extend(nl, {
|
||||
data: nl._adaptWithCondition(dodata, function(a){
|
||||
return a.length === 0 || a.length == 1 && (typeof a[0] == "string");
|
||||
}),
|
||||
removeData: nl._adaptAsForEach(removeData)
|
||||
});
|
||||
|
||||
// TODO: this is the basic implemetation of adaptWithCondtionAndWhenMappedConsiderLength, for lack of a better API name
|
||||
// it conflicts with the the `dojo.NodeList` way: always always return an arrayLike thinger. Consider for 2.0:
|
||||
//
|
||||
// nl.prototype.data = function(key, value){
|
||||
// var a = arguments, r;
|
||||
// if(a.length === 0 || a.length == 1 && (typeof a[0] == "string")){
|
||||
// r = this.map(function(node){
|
||||
// return d._data(node, key);
|
||||
// });
|
||||
// if(r.length == 1){ r = r[0]; } // the offending line, and the diff on adaptWithCondition
|
||||
// }else{
|
||||
// r = this.forEach(function(node){
|
||||
// d._data(node, key, value);
|
||||
// });
|
||||
// }
|
||||
// return r; // dojo.NodeList|Array|SingleItem
|
||||
// };
|
||||
|
||||
})(dojo);
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/NodeList-data",["./_base/kernel","./query","./_base/lang","./_base/array","./dom-attr"],function(_1,_2,_3,_4,_5){var _6=_2.NodeList;var _7={},x=0,_8="data-dojo-dataid",_9=function(_a){var _b=_5.get(_a,_8);if(!_b){_b="pid"+(x++);_5.set(_a,_8,_b);}return _b;};var _c=_1._nodeData=function(_d,_e,_f){var pid=_9(_d),r;if(!_7[pid]){_7[pid]={};}if(arguments.length==1){r=_7[pid];}if(typeof _e=="string"){if(arguments.length>2){_7[pid][_e]=_f;}else{r=_7[pid][_e];}}else{r=_3.mixin(_7[pid],_e);}return r;};var _10=_1._removeNodeData=function(_11,key){var pid=_9(_11);if(_7[pid]){if(key){delete _7[pid][key];}else{delete _7[pid];}}};_1._gcNodeData=function(){var _12=_2("["+_8+"]").map(_9);for(var i in _7){if(_4.indexOf(_12,i)<0){delete _7[i];}}};_3.extend(_6,{data:_6._adaptWithCondition(_c,function(a){return a.length===0||a.length==1&&(typeof a[0]=="string");}),removeData:_6._adaptAsForEach(_10)});return _6;});
|
||||
181
lib/dojo/NodeList-data.js.uncompressed.js
Normal file
181
lib/dojo/NodeList-data.js.uncompressed.js
Normal file
@@ -0,0 +1,181 @@
|
||||
define("dojo/NodeList-data", [
|
||||
"./_base/kernel", "./query", "./_base/lang", "./_base/array", "./dom-attr"
|
||||
], function(dojo, query, lang, array, attr) {
|
||||
// module:
|
||||
// dojo/NodeList-data
|
||||
// summary:
|
||||
// TODOC
|
||||
|
||||
var NodeList = query.NodeList;
|
||||
/*=====
|
||||
// doc alias helpers:
|
||||
var NodeList = dojo.NodeList;
|
||||
|
||||
dojo.NodeList.prototype.data = function(key, value){
|
||||
// summary: stash or get some arbitrary data on/from these nodes.
|
||||
//
|
||||
// description:
|
||||
// Stash or get some arbirtrary data on/from these nodes. This private _data function is
|
||||
// exposed publicly on `dojo.NodeList`, eg: as the result of a `dojo.query` call.
|
||||
// DIFFERS from jQuery.data in that when used as a getter, the entire list is ALWAYS
|
||||
// returned. EVEN WHEN THE LIST IS length == 1.
|
||||
//
|
||||
// A single-node version of this function is provided as `dojo._nodeData`, which follows
|
||||
// the same signature, though expects a String ID or DomNode reference in the first
|
||||
// position, before key/value arguments.
|
||||
//
|
||||
// node: String|DomNode
|
||||
// The node to associate data with
|
||||
//
|
||||
// key: Object?|String?
|
||||
// If an object, act as a setter and iterate over said object setting data items as defined.
|
||||
// If a string, and `value` present, set the data for defined `key` to `value`
|
||||
// If a string, and `value` absent, act as a getter, returning the data associated with said `key`
|
||||
//
|
||||
// value: Anything?
|
||||
// The value to set for said `key`, provided `key` is a string (and not an object)
|
||||
//
|
||||
// example:
|
||||
// Set a key `bar` to some data, then retrieve it.
|
||||
// | dojo.query(".foo").data("bar", "touched");
|
||||
// | var touched = dojo.query(".foo").data("bar");
|
||||
// | if(touched[0] == "touched"){ alert('win'); }
|
||||
//
|
||||
// example:
|
||||
// Get all the data items for a given node.
|
||||
// | var list = dojo.query(".foo").data();
|
||||
// | var first = list[0];
|
||||
//
|
||||
// example:
|
||||
// Set the data to a complex hash. Overwrites existing keys with new value
|
||||
// | dojo.query(".foo").data({ bar:"baz", foo:"bar" });
|
||||
// Then get some random key:
|
||||
// | dojo.query(".foo").data("foo"); // returns [`bar`]
|
||||
//
|
||||
// returns: Object|Anything|Nothing
|
||||
// When used as a setter via `dojo.NodeList`, a NodeList instance is returned
|
||||
// for further chaning. When used as a getter via `dojo.NodeList` an ARRAY
|
||||
// of items is returned. The items in the array correspond to the elements
|
||||
// in the original list. This is true even when the list length is 1, eg:
|
||||
// when looking up a node by ID (#foo)
|
||||
};
|
||||
|
||||
dojo.NodeList.prototype.removeData = function(key){
|
||||
// summary: Remove the data associated with these nodes.
|
||||
// key: String?
|
||||
// If ommitted, clean all data for this node.
|
||||
// If passed, remove the data item found at `key`
|
||||
};
|
||||
|
||||
=====*/
|
||||
|
||||
var dataCache = {}, x = 0, dataattr = "data-dojo-dataid",
|
||||
dopid = function(node){
|
||||
// summary: Return a uniqueish ID for the passed node reference
|
||||
var pid = attr.get(node, dataattr);
|
||||
if(!pid){
|
||||
pid = "pid" + (x++);
|
||||
attr.set(node, dataattr, pid);
|
||||
}
|
||||
return pid;
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
var dodata = dojo._nodeData = function(node, key, value){
|
||||
// summary: Private helper for dojo.NodeList.data for single node data access. Refer to NodeList.data
|
||||
// documentation for more information.
|
||||
//
|
||||
// node: String|DomNode
|
||||
// The node to associate data with
|
||||
//
|
||||
// key: Object?|String?
|
||||
// If an object, act as a setter and iterate over said object setting data items as defined.
|
||||
// If a string, and `value` present, set the data for defined `key` to `value`
|
||||
// If a string, and `value` absent, act as a getter, returning the data associated with said `key`
|
||||
//
|
||||
// value: Anything?
|
||||
// The value to set for said `key`, provided `key` is a string (and not an object)
|
||||
//
|
||||
var pid = dopid(node), r;
|
||||
if(!dataCache[pid]){ dataCache[pid] = {}; }
|
||||
|
||||
// API discrepency: calling with only a node returns the whole object. $.data throws
|
||||
if(arguments.length == 1){ r = dataCache[pid]; }
|
||||
if(typeof key == "string"){
|
||||
// either getter or setter, based on `value` presence
|
||||
if(arguments.length > 2){
|
||||
dataCache[pid][key] = value;
|
||||
}else{
|
||||
r = dataCache[pid][key];
|
||||
}
|
||||
}else{
|
||||
// must be a setter, mix `value` into data hash
|
||||
// API discrepency: using object as setter works here
|
||||
r = lang.mixin(dataCache[pid], key);
|
||||
}
|
||||
|
||||
return r; // Object|Anything|Nothing
|
||||
};
|
||||
|
||||
var removeData = dojo._removeNodeData = function(node, key){
|
||||
// summary: Remove some data from this node
|
||||
// node: String|DomNode
|
||||
// The node reference to remove data from
|
||||
// key: String?
|
||||
// If omitted, remove all data in this dataset.
|
||||
// If passed, remove only the passed `key` in the associated dataset
|
||||
var pid = dopid(node);
|
||||
if(dataCache[pid]){
|
||||
if(key){
|
||||
delete dataCache[pid][key];
|
||||
}else{
|
||||
delete dataCache[pid];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
dojo._gcNodeData = function(){
|
||||
// summary: super expensive: GC all data in the data for nodes that no longer exist in the dom.
|
||||
// description:
|
||||
// super expensive: GC all data in the data for nodes that no longer exist in the dom.
|
||||
// MUCH safer to do this yourself, manually, on a per-node basis (via `NodeList.removeData()`)
|
||||
// provided as a stop-gap for exceptionally large/complex applications with constantly changing
|
||||
// content regions (eg: a dijit.layout.ContentPane with replacing data)
|
||||
// There is NO automatic GC going on. If you dojo.destroy() a node, you should _removeNodeData
|
||||
// prior to destruction.
|
||||
var livePids = query("[" + dataattr + "]").map(dopid);
|
||||
for(var i in dataCache){
|
||||
if(array.indexOf(livePids, i) < 0){ delete dataCache[i]; }
|
||||
}
|
||||
};
|
||||
|
||||
// make nodeData and removeNodeData public on dojo.NodeList:
|
||||
lang.extend(NodeList, {
|
||||
data: NodeList._adaptWithCondition(dodata, function(a){
|
||||
return a.length === 0 || a.length == 1 && (typeof a[0] == "string");
|
||||
}),
|
||||
removeData: NodeList._adaptAsForEach(removeData)
|
||||
});
|
||||
|
||||
// TODO: this is the basic implemetation of adaptWithCondtionAndWhenMappedConsiderLength, for lack of a better API name
|
||||
// it conflicts with the the `dojo.NodeList` way: always always return an arrayLike thinger. Consider for 2.0:
|
||||
//
|
||||
// NodeList.prototype.data = function(key, value){
|
||||
// var a = arguments, r;
|
||||
// if(a.length === 0 || a.length == 1 && (typeof a[0] == "string")){
|
||||
// r = this.map(function(node){
|
||||
// return d._data(node, key);
|
||||
// });
|
||||
// if(r.length == 1){ r = r[0]; } // the offending line, and the diff on adaptWithCondition
|
||||
// }else{
|
||||
// r = this.forEach(function(node){
|
||||
// d._data(node, key, value);
|
||||
// });
|
||||
// }
|
||||
// return r; // dojo.NodeList|Array|SingleItem
|
||||
// };
|
||||
|
||||
return NodeList;
|
||||
|
||||
});
|
||||
8
lib/dojo/NodeList-dom.js
Normal file
8
lib/dojo/NodeList-dom.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/NodeList-dom",["./_base/kernel","./query","./_base/array","./_base/lang","./dom-class","./dom-construct","./dom-geometry","./dom-attr","./dom-style"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){var _a=function(a){return a.length==1&&(typeof a[0]=="string");};var _b=function(_c){var p=_c.parentNode;if(p){p.removeChild(_c);}};var _d=_2.NodeList,_e=_d._adaptWithCondition,_f=_d._adaptAsForEach,aam=_d._adaptAsMap;function _10(_11){return function(_12,_13,_14){if(arguments.length==2){return _11[typeof _13=="string"?"get":"set"](_12,_13);}return _11.set(_12,_13,_14);};};_4.extend(_d,{_normalize:function(_15,_16){var _17=_15.parse===true;if(typeof _15.template=="string"){var _18=_15.templateFunc||(_1.string&&_1.string.substitute);_15=_18?_18(_15.template,_15):_15;}var _19=(typeof _15);if(_19=="string"||_19=="number"){_15=_6.toDom(_15,(_16&&_16.ownerDocument));if(_15.nodeType==11){_15=_4._toArray(_15.childNodes);}else{_15=[_15];}}else{if(!_4.isArrayLike(_15)){_15=[_15];}else{if(!_4.isArray(_15)){_15=_4._toArray(_15);}}}if(_17){_15._runParse=true;}return _15;},_cloneNode:function(_1a){return _1a.cloneNode(true);},_place:function(ary,_1b,_1c,_1d){if(_1b.nodeType!=1&&_1c=="only"){return;}var _1e=_1b,_1f;var _20=ary.length;for(var i=_20-1;i>=0;i--){var _21=(_1d?this._cloneNode(ary[i]):ary[i]);if(ary._runParse&&_1.parser&&_1.parser.parse){if(!_1f){_1f=_1e.ownerDocument.createElement("div");}_1f.appendChild(_21);_1.parser.parse(_1f);_21=_1f.firstChild;while(_1f.firstChild){_1f.removeChild(_1f.firstChild);}}if(i==_20-1){_6.place(_21,_1e,_1c);}else{_1e.parentNode.insertBefore(_21,_1e);}_1e=_21;}},attr:_e(_10(_8),_a),style:_e(_10(_9),_a),addClass:_f(_5.add),removeClass:_f(_5.remove),replaceClass:_f(_5.replace),toggleClass:_f(_5.toggle),empty:_f(_6.empty),removeAttr:_f(_8.remove),position:aam(_7.position),marginBox:aam(_7.getMarginBox),place:function(_22,_23){var _24=_2(_22)[0];return this.forEach(function(_25){_6.place(_25,_24,_23);});},orphan:function(_26){return (_26?_2._filterResult(this,_26):this).forEach(_b);},adopt:function(_27,_28){return _2(_27).place(this[0],_28)._stash(this);},query:function(_29){if(!_29){return this;}var ret=new _d;this.map(function(_2a){_2(_29,_2a).forEach(function(_2b){if(_2b!==undefined){ret.push(_2b);}});});return ret._stash(this);},filter:function(_2c){var a=arguments,_2d=this,_2e=0;if(typeof _2c=="string"){_2d=_2._filterResult(this,a[0]);if(a.length==1){return _2d._stash(this);}_2e=1;}return this._wrap(_3.filter(_2d,a[_2e],a[_2e+1]),this);},addContent:function(_2f,_30){_2f=this._normalize(_2f,this[0]);for(var i=0,_31;(_31=this[i]);i++){this._place(_2f,_31,_30,i>0);}return this;}});return _d;});
|
||||
454
lib/dojo/NodeList-dom.js.uncompressed.js
Normal file
454
lib/dojo/NodeList-dom.js.uncompressed.js
Normal file
@@ -0,0 +1,454 @@
|
||||
define("dojo/NodeList-dom", ["./_base/kernel", "./query", "./_base/array", "./_base/lang", "./dom-class", "./dom-construct", "./dom-geometry", "./dom-attr", "./dom-style"], function(dojo, query, array, lang, domCls, domCtr, domGeom, domAttr, domStyle){
|
||||
/*===== var NodeList = dojo.NodeList; =====*/
|
||||
var magicGuard = function(a){
|
||||
// summary:
|
||||
// the guard function for dojo.attr() and dojo.style()
|
||||
return a.length == 1 && (typeof a[0] == "string"); // inline'd type check
|
||||
};
|
||||
|
||||
var orphan = function(node){
|
||||
// summary:
|
||||
// function to orphan nodes
|
||||
var p = node.parentNode;
|
||||
if(p){
|
||||
p.removeChild(node);
|
||||
}
|
||||
};
|
||||
// FIXME: should we move orphan() to dojo.html?
|
||||
|
||||
var NodeList = query.NodeList,
|
||||
awc = NodeList._adaptWithCondition,
|
||||
aafe = NodeList._adaptAsForEach,
|
||||
aam = NodeList._adaptAsMap;
|
||||
|
||||
function getSet(module){
|
||||
return function(node, name, value){
|
||||
if(arguments.length == 2){
|
||||
return module[typeof name == "string" ? "get" : "set"](node, name);
|
||||
}
|
||||
// setter
|
||||
return module.set(node, name, value);
|
||||
};
|
||||
}
|
||||
|
||||
lang.extend(NodeList, {
|
||||
_normalize: function(/*String||Element||Object||NodeList*/content, /*DOMNode?*/refNode){
|
||||
// summary:
|
||||
// normalizes data to an array of items to insert.
|
||||
// description:
|
||||
// If content is an object, it can have special properties "template" and
|
||||
// "parse". If "template" is defined, then the template value is run through
|
||||
// dojo.string.substitute (if dojo.string.substitute has been dojo.required elsewhere),
|
||||
// or if templateFunc is a function on the content, that function will be used to
|
||||
// transform the template into a final string to be used for for passing to dojo._toDom.
|
||||
// If content.parse is true, then it is remembered for later, for when the content
|
||||
// nodes are inserted into the DOM. At that point, the nodes will be parsed for widgets
|
||||
// (if dojo.parser has been dojo.required elsewhere).
|
||||
|
||||
//Wanted to just use a DocumentFragment, but for the array/NodeList
|
||||
//case that meant using cloneNode, but we may not want that.
|
||||
//Cloning should only happen if the node operations span
|
||||
//multiple refNodes. Also, need a real array, not a NodeList from the
|
||||
//DOM since the node movements could change those NodeLists.
|
||||
|
||||
var parse = content.parse === true;
|
||||
|
||||
//Do we have an object that needs to be run through a template?
|
||||
if(typeof content.template == "string"){
|
||||
var templateFunc = content.templateFunc || (dojo.string && dojo.string.substitute);
|
||||
content = templateFunc ? templateFunc(content.template, content) : content;
|
||||
}
|
||||
|
||||
var type = (typeof content);
|
||||
if(type == "string" || type == "number"){
|
||||
content = domCtr.toDom(content, (refNode && refNode.ownerDocument));
|
||||
if(content.nodeType == 11){
|
||||
//DocumentFragment. It cannot handle cloneNode calls, so pull out the children.
|
||||
content = lang._toArray(content.childNodes);
|
||||
}else{
|
||||
content = [content];
|
||||
}
|
||||
}else if(!lang.isArrayLike(content)){
|
||||
content = [content];
|
||||
}else if(!lang.isArray(content)){
|
||||
//To get to this point, content is array-like, but
|
||||
//not an array, which likely means a DOM NodeList. Convert it now.
|
||||
content = lang._toArray(content);
|
||||
}
|
||||
|
||||
//Pass around the parse info
|
||||
if(parse){
|
||||
content._runParse = true;
|
||||
}
|
||||
return content; //Array
|
||||
},
|
||||
|
||||
_cloneNode: function(/*DOMNode*/ node){
|
||||
// summary:
|
||||
// private utility to clone a node. Not very interesting in the vanilla
|
||||
// dojo.NodeList case, but delegates could do interesting things like
|
||||
// clone event handlers if that is derivable from the node.
|
||||
return node.cloneNode(true);
|
||||
},
|
||||
|
||||
_place: function(/*Array*/ary, /*DOMNode*/refNode, /*String*/position, /*Boolean*/useClone){
|
||||
// summary:
|
||||
// private utility to handle placing an array of nodes relative to another node.
|
||||
// description:
|
||||
// Allows for cloning the nodes in the array, and for
|
||||
// optionally parsing widgets, if ary._runParse is true.
|
||||
|
||||
//Avoid a disallowed operation if trying to do an innerHTML on a non-element node.
|
||||
if(refNode.nodeType != 1 && position == "only"){
|
||||
return;
|
||||
}
|
||||
var rNode = refNode, tempNode;
|
||||
|
||||
//Always cycle backwards in case the array is really a
|
||||
//DOM NodeList and the DOM operations take it out of the live collection.
|
||||
var length = ary.length;
|
||||
for(var i = length - 1; i >= 0; i--){
|
||||
var node = (useClone ? this._cloneNode(ary[i]) : ary[i]);
|
||||
|
||||
//If need widget parsing, use a temp node, instead of waiting after inserting into
|
||||
//real DOM because we need to start widget parsing at one node up from current node,
|
||||
//which could cause some already parsed widgets to be parsed again.
|
||||
if(ary._runParse && dojo.parser && dojo.parser.parse){
|
||||
if(!tempNode){
|
||||
tempNode = rNode.ownerDocument.createElement("div");
|
||||
}
|
||||
tempNode.appendChild(node);
|
||||
dojo.parser.parse(tempNode);
|
||||
node = tempNode.firstChild;
|
||||
while(tempNode.firstChild){
|
||||
tempNode.removeChild(tempNode.firstChild);
|
||||
}
|
||||
}
|
||||
|
||||
if(i == length - 1){
|
||||
domCtr.place(node, rNode, position);
|
||||
}else{
|
||||
rNode.parentNode.insertBefore(node, rNode);
|
||||
}
|
||||
rNode = node;
|
||||
}
|
||||
},
|
||||
|
||||
/*=====
|
||||
position: function(){
|
||||
// summary:
|
||||
// Returns border-box objects (x/y/w/h) of all elements in a node list
|
||||
// as an Array (*not* a NodeList). Acts like `dojo.position`, though
|
||||
// assumes the node passed is each node in this list.
|
||||
|
||||
return dojo.map(this, dojo.position); // Array
|
||||
},
|
||||
|
||||
attr: function(property, value){
|
||||
// summary:
|
||||
// gets or sets the DOM attribute for every element in the
|
||||
// NodeList. See also `dojo.attr`
|
||||
// property: String
|
||||
// the attribute to get/set
|
||||
// value: String?
|
||||
// optional. The value to set the property to
|
||||
// returns:
|
||||
// if no value is passed, the result is an array of attribute values
|
||||
// If a value is passed, the return is this NodeList
|
||||
// example:
|
||||
// Make all nodes with a particular class focusable:
|
||||
// | dojo.query(".focusable").attr("tabIndex", -1);
|
||||
// example:
|
||||
// Disable a group of buttons:
|
||||
// | dojo.query("button.group").attr("disabled", true);
|
||||
// example:
|
||||
// innerHTML can be assigned or retrieved as well:
|
||||
// | // get the innerHTML (as an array) for each list item
|
||||
// | var ih = dojo.query("li.replaceable").attr("innerHTML");
|
||||
return; // dojo.NodeList
|
||||
return; // Array
|
||||
},
|
||||
|
||||
style: function(property, value){
|
||||
// summary:
|
||||
// gets or sets the CSS property for every element in the NodeList
|
||||
// property: String
|
||||
// the CSS property to get/set, in JavaScript notation
|
||||
// ("lineHieght" instead of "line-height")
|
||||
// value: String?
|
||||
// optional. The value to set the property to
|
||||
// returns:
|
||||
// if no value is passed, the result is an array of strings.
|
||||
// If a value is passed, the return is this NodeList
|
||||
return; // dojo.NodeList
|
||||
return; // Array
|
||||
},
|
||||
|
||||
addClass: function(className){
|
||||
// summary:
|
||||
// adds the specified class to every node in the list
|
||||
// className: String|Array
|
||||
// A String class name to add, or several space-separated class names,
|
||||
// or an array of class names.
|
||||
return; // dojo.NodeList
|
||||
},
|
||||
|
||||
removeClass: function(className){
|
||||
// summary:
|
||||
// removes the specified class from every node in the list
|
||||
// className: String|Array?
|
||||
// An optional String class name to remove, or several space-separated
|
||||
// class names, or an array of class names. If omitted, all class names
|
||||
// will be deleted.
|
||||
// returns:
|
||||
// dojo.NodeList, this list
|
||||
return; // dojo.NodeList
|
||||
},
|
||||
|
||||
toggleClass: function(className, condition){
|
||||
// summary:
|
||||
// Adds a class to node if not present, or removes if present.
|
||||
// Pass a boolean condition if you want to explicitly add or remove.
|
||||
// condition: Boolean?
|
||||
// If passed, true means to add the class, false means to remove.
|
||||
// className: String
|
||||
// the CSS class to add
|
||||
return; // dojo.NodeList
|
||||
},
|
||||
|
||||
empty: function(){
|
||||
// summary:
|
||||
// clears all content from each node in the list. Effectively
|
||||
// equivalent to removing all child nodes from every item in
|
||||
// the list.
|
||||
return this.forEach("item.innerHTML='';"); // dojo.NodeList
|
||||
// FIXME: should we be checking for and/or disposing of widgets below these nodes?
|
||||
},
|
||||
=====*/
|
||||
|
||||
// useful html methods
|
||||
attr: awc(getSet(domAttr), magicGuard),
|
||||
style: awc(getSet(domStyle), magicGuard),
|
||||
|
||||
addClass: aafe(domCls.add),
|
||||
removeClass: aafe(domCls.remove),
|
||||
replaceClass: aafe(domCls.replace),
|
||||
toggleClass: aafe(domCls.toggle),
|
||||
|
||||
empty: aafe(domCtr.empty),
|
||||
removeAttr: aafe(domAttr.remove),
|
||||
|
||||
position: aam(domGeom.position),
|
||||
marginBox: aam(domGeom.getMarginBox),
|
||||
|
||||
// FIXME: connectPublisher()? connectRunOnce()?
|
||||
|
||||
/*
|
||||
destroy: function(){
|
||||
// summary:
|
||||
// destroys every item in the list.
|
||||
this.forEach(d.destroy);
|
||||
// FIXME: should we be checking for and/or disposing of widgets below these nodes?
|
||||
},
|
||||
*/
|
||||
|
||||
place: function(/*String||Node*/ queryOrNode, /*String*/ position){
|
||||
// summary:
|
||||
// places elements of this node list relative to the first element matched
|
||||
// by queryOrNode. Returns the original NodeList. See: `dojo.place`
|
||||
// queryOrNode:
|
||||
// may be a string representing any valid CSS3 selector or a DOM node.
|
||||
// In the selector case, only the first matching element will be used
|
||||
// for relative positioning.
|
||||
// position:
|
||||
// can be one of:
|
||||
// | "last" (default)
|
||||
// | "first"
|
||||
// | "before"
|
||||
// | "after"
|
||||
// | "only"
|
||||
// | "replace"
|
||||
// or an offset in the childNodes property
|
||||
var item = query(queryOrNode)[0];
|
||||
return this.forEach(function(node){ domCtr.place(node, item, position); }); // dojo.NodeList
|
||||
},
|
||||
|
||||
orphan: function(/*String?*/ filter){
|
||||
// summary:
|
||||
// removes elements in this list that match the filter
|
||||
// from their parents and returns them as a new NodeList.
|
||||
// filter:
|
||||
// CSS selector like ".foo" or "div > span"
|
||||
// returns:
|
||||
// `dojo.NodeList` containing the orphaned elements
|
||||
return (filter ? query._filterResult(this, filter) : this).forEach(orphan); // dojo.NodeList
|
||||
},
|
||||
|
||||
adopt: function(/*String||Array||DomNode*/ queryOrListOrNode, /*String?*/ position){
|
||||
// summary:
|
||||
// places any/all elements in queryOrListOrNode at a
|
||||
// position relative to the first element in this list.
|
||||
// Returns a dojo.NodeList of the adopted elements.
|
||||
// queryOrListOrNode:
|
||||
// a DOM node or a query string or a query result.
|
||||
// Represents the nodes to be adopted relative to the
|
||||
// first element of this NodeList.
|
||||
// position:
|
||||
// can be one of:
|
||||
// | "last" (default)
|
||||
// | "first"
|
||||
// | "before"
|
||||
// | "after"
|
||||
// | "only"
|
||||
// | "replace"
|
||||
// or an offset in the childNodes property
|
||||
return query(queryOrListOrNode).place(this[0], position)._stash(this); // dojo.NodeList
|
||||
},
|
||||
|
||||
// FIXME: do we need this?
|
||||
query: function(/*String*/ queryStr){
|
||||
// summary:
|
||||
// Returns a new list whose members match the passed query,
|
||||
// assuming elements of the current NodeList as the root for
|
||||
// each search.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo">
|
||||
// | <p>
|
||||
// | bacon is tasty, <span>dontcha think?</span>
|
||||
// | </p>
|
||||
// | </div>
|
||||
// | <div id="bar">
|
||||
// | <p>great comedians may not be funny <span>in person</span></p>
|
||||
// | </div>
|
||||
// If we are presented with the following definition for a NodeList:
|
||||
// | var l = new dojo.NodeList(dojo.byId("foo"), dojo.byId("bar"));
|
||||
// it's possible to find all span elements under paragraphs
|
||||
// contained by these elements with this sub-query:
|
||||
// | var spans = l.query("p span");
|
||||
|
||||
// FIXME: probably slow
|
||||
if(!queryStr){ return this; }
|
||||
var ret = new NodeList;
|
||||
this.map(function(node){
|
||||
// FIXME: why would we ever get undefined here?
|
||||
query(queryStr, node).forEach(function(subNode){
|
||||
if(subNode !== undefined){
|
||||
ret.push(subNode);
|
||||
}
|
||||
});
|
||||
});
|
||||
return ret._stash(this); // dojo.NodeList
|
||||
},
|
||||
|
||||
filter: function(/*String|Function*/ filter){
|
||||
// summary:
|
||||
// "masks" the built-in javascript filter() method (supported
|
||||
// in Dojo via `dojo.filter`) to support passing a simple
|
||||
// string filter in addition to supporting filtering function
|
||||
// objects.
|
||||
// filter:
|
||||
// If a string, a CSS rule like ".thinger" or "div > span".
|
||||
// example:
|
||||
// "regular" JS filter syntax as exposed in dojo.filter:
|
||||
// | dojo.query("*").filter(function(item){
|
||||
// | // highlight every paragraph
|
||||
// | return (item.nodeName == "p");
|
||||
// | }).style("backgroundColor", "yellow");
|
||||
// example:
|
||||
// the same filtering using a CSS selector
|
||||
// | dojo.query("*").filter("p").styles("backgroundColor", "yellow");
|
||||
|
||||
var a = arguments, items = this, start = 0;
|
||||
if(typeof filter == "string"){ // inline'd type check
|
||||
items = query._filterResult(this, a[0]);
|
||||
if(a.length == 1){
|
||||
// if we only got a string query, pass back the filtered results
|
||||
return items._stash(this); // dojo.NodeList
|
||||
}
|
||||
// if we got a callback, run it over the filtered items
|
||||
start = 1;
|
||||
}
|
||||
return this._wrap(array.filter(items, a[start], a[start + 1]), this); // dojo.NodeList
|
||||
},
|
||||
|
||||
/*
|
||||
// FIXME: should this be "copyTo" and include parenting info?
|
||||
clone: function(){
|
||||
// summary:
|
||||
// creates node clones of each element of this list
|
||||
// and returns a new list containing the clones
|
||||
},
|
||||
*/
|
||||
|
||||
addContent: function(/*String||DomNode||Object||dojo.NodeList*/ content, /*String||Integer?*/ position){
|
||||
// summary:
|
||||
// add a node, NodeList or some HTML as a string to every item in the
|
||||
// list. Returns the original list.
|
||||
// description:
|
||||
// a copy of the HTML content is added to each item in the
|
||||
// list, with an optional position argument. If no position
|
||||
// argument is provided, the content is appended to the end of
|
||||
// each item.
|
||||
// content:
|
||||
// DOM node, HTML in string format, a NodeList or an Object. If a DOM node or
|
||||
// NodeList, the content will be cloned if the current NodeList has more than one
|
||||
// element. Only the DOM nodes are cloned, no event handlers. If it is an Object,
|
||||
// it should be an object with at "template" String property that has the HTML string
|
||||
// to insert. If dojo.string has already been dojo.required, then dojo.string.substitute
|
||||
// will be used on the "template" to generate the final HTML string. Other allowed
|
||||
// properties on the object are: "parse" if the HTML
|
||||
// string should be parsed for widgets (dojo.require("dojo.parser") to get that
|
||||
// option to work), and "templateFunc" if a template function besides dojo.string.substitute
|
||||
// should be used to transform the "template".
|
||||
// position:
|
||||
// can be one of:
|
||||
// | "last"||"end" (default)
|
||||
// | "first||"start"
|
||||
// | "before"
|
||||
// | "after"
|
||||
// | "replace" (replaces nodes in this NodeList with new content)
|
||||
// | "only" (removes other children of the nodes so new content is the only child)
|
||||
// or an offset in the childNodes property
|
||||
// example:
|
||||
// appends content to the end if the position is omitted
|
||||
// | dojo.query("h3 > p").addContent("hey there!");
|
||||
// example:
|
||||
// add something to the front of each element that has a
|
||||
// "thinger" property:
|
||||
// | dojo.query("[thinger]").addContent("...", "first");
|
||||
// example:
|
||||
// adds a header before each element of the list
|
||||
// | dojo.query(".note").addContent("<h4>NOTE:</h4>", "before");
|
||||
// example:
|
||||
// add a clone of a DOM node to the end of every element in
|
||||
// the list, removing it from its existing parent.
|
||||
// | dojo.query(".note").addContent(dojo.byId("foo"));
|
||||
// example:
|
||||
// Append nodes from a templatized string.
|
||||
// dojo.require("dojo.string");
|
||||
// dojo.query(".note").addContent({
|
||||
// template: '<b>${id}: </b><span>${name}</span>',
|
||||
// id: "user332",
|
||||
// name: "Mr. Anderson"
|
||||
// });
|
||||
// example:
|
||||
// Append nodes from a templatized string that also has widgets parsed.
|
||||
// dojo.require("dojo.string");
|
||||
// dojo.require("dojo.parser");
|
||||
// var notes = dojo.query(".note").addContent({
|
||||
// template: '<button dojoType="dijit.form.Button">${text}</button>',
|
||||
// parse: true,
|
||||
// text: "Send"
|
||||
// });
|
||||
content = this._normalize(content, this[0]);
|
||||
for(var i = 0, node; (node = this[i]); i++){
|
||||
this._place(content, node, position, i > 0);
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
}
|
||||
});
|
||||
|
||||
/*===== return dojo.NodeList; =====*/
|
||||
return NodeList;
|
||||
});
|
||||
@@ -4,216 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.NodeList-fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.NodeList-fx"] = true;
|
||||
dojo.provide("dojo.NodeList-fx");
|
||||
dojo.require("dojo.fx");
|
||||
|
||||
|
||||
/*=====
|
||||
dojo["NodeList-fx"] = {
|
||||
// summary: Adds dojo.fx animation support to dojo.query()
|
||||
};
|
||||
=====*/
|
||||
|
||||
dojo.extend(dojo.NodeList, {
|
||||
_anim: function(obj, method, args){
|
||||
args = args||{};
|
||||
var a = dojo.fx.combine(
|
||||
this.map(function(item){
|
||||
var tmpArgs = { node: item };
|
||||
dojo.mixin(tmpArgs, args);
|
||||
return obj[method](tmpArgs);
|
||||
})
|
||||
);
|
||||
return args.auto ? a.play() && this : a; // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
wipeIn: function(args){
|
||||
// summary:
|
||||
// wipe in all elements of this NodeList via `dojo.fx.wipeIn`
|
||||
//
|
||||
// args: Object?
|
||||
// Additional dojo.Animation arguments to mix into this set with the addition of
|
||||
// an `auto` parameter.
|
||||
//
|
||||
// returns: dojo.Animation|dojo.NodeList
|
||||
// A special args member `auto` can be passed to automatically play the animation.
|
||||
// If args.auto is present, the original dojo.NodeList will be returned for further
|
||||
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
|
||||
//
|
||||
// example:
|
||||
// Fade in all tables with class "blah":
|
||||
// | dojo.query("table.blah").wipeIn().play();
|
||||
//
|
||||
// example:
|
||||
// Utilizing `auto` to get the NodeList back:
|
||||
// | dojo.query(".titles").wipeIn({ auto:true }).onclick(someFunction);
|
||||
//
|
||||
return this._anim(dojo.fx, "wipeIn", args); // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
wipeOut: function(args){
|
||||
// summary:
|
||||
// wipe out all elements of this NodeList via `dojo.fx.wipeOut`
|
||||
//
|
||||
// args: Object?
|
||||
// Additional dojo.Animation arguments to mix into this set with the addition of
|
||||
// an `auto` parameter.
|
||||
//
|
||||
// returns: dojo.Animation|dojo.NodeList
|
||||
// A special args member `auto` can be passed to automatically play the animation.
|
||||
// If args.auto is present, the original dojo.NodeList will be returned for further
|
||||
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
|
||||
//
|
||||
// example:
|
||||
// Wipe out all tables with class "blah":
|
||||
// | dojo.query("table.blah").wipeOut().play();
|
||||
return this._anim(dojo.fx, "wipeOut", args); // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
slideTo: function(args){
|
||||
// summary:
|
||||
// slide all elements of the node list to the specified place via `dojo.fx.slideTo`
|
||||
//
|
||||
// args: Object?
|
||||
// Additional dojo.Animation arguments to mix into this set with the addition of
|
||||
// an `auto` parameter.
|
||||
//
|
||||
// returns: dojo.Animation|dojo.NodeList
|
||||
// A special args member `auto` can be passed to automatically play the animation.
|
||||
// If args.auto is present, the original dojo.NodeList will be returned for further
|
||||
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
|
||||
//
|
||||
// example:
|
||||
// | Move all tables with class "blah" to 300/300:
|
||||
// | dojo.query("table.blah").slideTo({
|
||||
// | left: 40,
|
||||
// | top: 50
|
||||
// | }).play();
|
||||
return this._anim(dojo.fx, "slideTo", args); // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
|
||||
fadeIn: function(args){
|
||||
// summary:
|
||||
// fade in all elements of this NodeList via `dojo.fadeIn`
|
||||
//
|
||||
// args: Object?
|
||||
// Additional dojo.Animation arguments to mix into this set with the addition of
|
||||
// an `auto` parameter.
|
||||
//
|
||||
// returns: dojo.Animation|dojo.NodeList
|
||||
// A special args member `auto` can be passed to automatically play the animation.
|
||||
// If args.auto is present, the original dojo.NodeList will be returned for further
|
||||
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
|
||||
//
|
||||
// example:
|
||||
// Fade in all tables with class "blah":
|
||||
// | dojo.query("table.blah").fadeIn().play();
|
||||
return this._anim(dojo, "fadeIn", args); // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
fadeOut: function(args){
|
||||
// summary:
|
||||
// fade out all elements of this NodeList via `dojo.fadeOut`
|
||||
//
|
||||
// args: Object?
|
||||
// Additional dojo.Animation arguments to mix into this set with the addition of
|
||||
// an `auto` parameter.
|
||||
//
|
||||
// returns: dojo.Animation|dojo.NodeList
|
||||
// A special args member `auto` can be passed to automatically play the animation.
|
||||
// If args.auto is present, the original dojo.NodeList will be returned for further
|
||||
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
|
||||
//
|
||||
// example:
|
||||
// Fade out all elements with class "zork":
|
||||
// | dojo.query(".zork").fadeOut().play();
|
||||
// example:
|
||||
// Fade them on a delay and do something at the end:
|
||||
// | var fo = dojo.query(".zork").fadeOut();
|
||||
// | dojo.connect(fo, "onEnd", function(){ /*...*/ });
|
||||
// | fo.play();
|
||||
// example:
|
||||
// Using `auto`:
|
||||
// | dojo.query("li").fadeOut({ auto:true }).filter(filterFn).forEach(doit);
|
||||
//
|
||||
return this._anim(dojo, "fadeOut", args); // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
animateProperty: function(args){
|
||||
// summary:
|
||||
// Animate all elements of this NodeList across the properties specified.
|
||||
// syntax identical to `dojo.animateProperty`
|
||||
//
|
||||
// returns: dojo.Animation|dojo.NodeList
|
||||
// A special args member `auto` can be passed to automatically play the animation.
|
||||
// If args.auto is present, the original dojo.NodeList will be returned for further
|
||||
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
|
||||
//
|
||||
// example:
|
||||
// | dojo.query(".zork").animateProperty({
|
||||
// | duration: 500,
|
||||
// | properties: {
|
||||
// | color: { start: "black", end: "white" },
|
||||
// | left: { end: 300 }
|
||||
// | }
|
||||
// | }).play();
|
||||
//
|
||||
// example:
|
||||
// | dojo.query(".grue").animateProperty({
|
||||
// | auto:true,
|
||||
// | properties: {
|
||||
// | height:240
|
||||
// | }
|
||||
// | }).onclick(handler);
|
||||
return this._anim(dojo, "animateProperty", args); // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
anim: function( /*Object*/ properties,
|
||||
/*Integer?*/ duration,
|
||||
/*Function?*/ easing,
|
||||
/*Function?*/ onEnd,
|
||||
/*Integer?*/ delay){
|
||||
// summary:
|
||||
// Animate one or more CSS properties for all nodes in this list.
|
||||
// The returned animation object will already be playing when it
|
||||
// is returned. See the docs for `dojo.anim` for full details.
|
||||
// properties: Object
|
||||
// the properties to animate. does NOT support the `auto` parameter like other
|
||||
// NodeList-fx methods.
|
||||
// duration: Integer?
|
||||
// Optional. The time to run the animations for
|
||||
// easing: Function?
|
||||
// Optional. The easing function to use.
|
||||
// onEnd: Function?
|
||||
// A function to be called when the animation ends
|
||||
// delay:
|
||||
// how long to delay playing the returned animation
|
||||
// example:
|
||||
// Another way to fade out:
|
||||
// | dojo.query(".thinger").anim({ opacity: 0 });
|
||||
// example:
|
||||
// animate all elements with the "thigner" class to a width of 500
|
||||
// pixels over half a second
|
||||
// | dojo.query(".thinger").anim({ width: 500 }, 700);
|
||||
var canim = dojo.fx.combine(
|
||||
this.map(function(item){
|
||||
return dojo.animateProperty({
|
||||
node: item,
|
||||
properties: properties,
|
||||
duration: duration||350,
|
||||
easing: easing
|
||||
});
|
||||
})
|
||||
);
|
||||
if(onEnd){
|
||||
dojo.connect(canim, "onEnd", onEnd);
|
||||
}
|
||||
return canim.play(delay||0); // dojo.Animation
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/NodeList-fx",["dojo/_base/NodeList","./_base/lang","./_base/connect","./_base/fx","./fx"],function(_1,_2,_3,_4,_5){_2.extend(_1,{_anim:function(_6,_7,_8){_8=_8||{};var a=_5.combine(this.map(function(_9){var _a={node:_9};_2.mixin(_a,_8);return _6[_7](_a);}));return _8.auto?a.play()&&this:a;},wipeIn:function(_b){return this._anim(_5,"wipeIn",_b);},wipeOut:function(_c){return this._anim(_5,"wipeOut",_c);},slideTo:function(_d){return this._anim(_5,"slideTo",_d);},fadeIn:function(_e){return this._anim(_4,"fadeIn",_e);},fadeOut:function(_f){return this._anim(_4,"fadeOut",_f);},animateProperty:function(_10){return this._anim(_4,"animateProperty",_10);},anim:function(_11,_12,_13,_14,_15){var _16=_5.combine(this.map(function(_17){return _4.animateProperty({node:_17,properties:_11,duration:_12||350,easing:_13});}));if(_14){_3.connect(_16,"onEnd",_14);}return _16.play(_15||0);}});return _1;});
|
||||
222
lib/dojo/NodeList-fx.js.uncompressed.js
Normal file
222
lib/dojo/NodeList-fx.js.uncompressed.js
Normal file
@@ -0,0 +1,222 @@
|
||||
define("dojo/NodeList-fx", ["dojo/_base/NodeList", "./_base/lang", "./_base/connect", "./_base/fx", "./fx"],
|
||||
function(NodeList, lang, connectLib, baseFx, coreFx) {
|
||||
// module:
|
||||
// dojo/NodeList-fx
|
||||
// summary:
|
||||
// TODOC
|
||||
|
||||
/*=====
|
||||
dojo["NodeList-fx"] = {
|
||||
// summary: Adds dojo.fx animation support to dojo.query() by extending the NodeList class
|
||||
// with additional FX functions. NodeList is the array-like object used to hold query results.
|
||||
};
|
||||
|
||||
// doc alias helpers:
|
||||
NodeList = dojo.NodeList;
|
||||
=====*/
|
||||
|
||||
lang.extend(NodeList, {
|
||||
_anim: function(obj, method, args){
|
||||
args = args||{};
|
||||
var a = coreFx.combine(
|
||||
this.map(function(item){
|
||||
var tmpArgs = { node: item };
|
||||
lang.mixin(tmpArgs, args);
|
||||
return obj[method](tmpArgs);
|
||||
})
|
||||
);
|
||||
return args.auto ? a.play() && this : a; // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
wipeIn: function(args){
|
||||
// summary:
|
||||
// wipe in all elements of this NodeList via `dojo.fx.wipeIn`
|
||||
//
|
||||
// args: Object?
|
||||
// Additional dojo.Animation arguments to mix into this set with the addition of
|
||||
// an `auto` parameter.
|
||||
//
|
||||
// returns: dojo.Animation|dojo.NodeList
|
||||
// A special args member `auto` can be passed to automatically play the animation.
|
||||
// If args.auto is present, the original dojo.NodeList will be returned for further
|
||||
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
|
||||
//
|
||||
// example:
|
||||
// Fade in all tables with class "blah":
|
||||
// | dojo.query("table.blah").wipeIn().play();
|
||||
//
|
||||
// example:
|
||||
// Utilizing `auto` to get the NodeList back:
|
||||
// | dojo.query(".titles").wipeIn({ auto:true }).onclick(someFunction);
|
||||
//
|
||||
return this._anim(coreFx, "wipeIn", args); // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
wipeOut: function(args){
|
||||
// summary:
|
||||
// wipe out all elements of this NodeList via `dojo.fx.wipeOut`
|
||||
//
|
||||
// args: Object?
|
||||
// Additional dojo.Animation arguments to mix into this set with the addition of
|
||||
// an `auto` parameter.
|
||||
//
|
||||
// returns: dojo.Animation|dojo.NodeList
|
||||
// A special args member `auto` can be passed to automatically play the animation.
|
||||
// If args.auto is present, the original dojo.NodeList will be returned for further
|
||||
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
|
||||
//
|
||||
// example:
|
||||
// Wipe out all tables with class "blah":
|
||||
// | dojo.query("table.blah").wipeOut().play();
|
||||
return this._anim(coreFx, "wipeOut", args); // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
slideTo: function(args){
|
||||
// summary:
|
||||
// slide all elements of the node list to the specified place via `dojo.fx.slideTo`
|
||||
//
|
||||
// args: Object?
|
||||
// Additional dojo.Animation arguments to mix into this set with the addition of
|
||||
// an `auto` parameter.
|
||||
//
|
||||
// returns: dojo.Animation|dojo.NodeList
|
||||
// A special args member `auto` can be passed to automatically play the animation.
|
||||
// If args.auto is present, the original dojo.NodeList will be returned for further
|
||||
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
|
||||
//
|
||||
// example:
|
||||
// | Move all tables with class "blah" to 300/300:
|
||||
// | dojo.query("table.blah").slideTo({
|
||||
// | left: 40,
|
||||
// | top: 50
|
||||
// | }).play();
|
||||
return this._anim(coreFx, "slideTo", args); // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
|
||||
fadeIn: function(args){
|
||||
// summary:
|
||||
// fade in all elements of this NodeList via `dojo.fadeIn`
|
||||
//
|
||||
// args: Object?
|
||||
// Additional dojo.Animation arguments to mix into this set with the addition of
|
||||
// an `auto` parameter.
|
||||
//
|
||||
// returns: dojo.Animation|dojo.NodeList
|
||||
// A special args member `auto` can be passed to automatically play the animation.
|
||||
// If args.auto is present, the original dojo.NodeList will be returned for further
|
||||
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
|
||||
//
|
||||
// example:
|
||||
// Fade in all tables with class "blah":
|
||||
// | dojo.query("table.blah").fadeIn().play();
|
||||
return this._anim(baseFx, "fadeIn", args); // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
fadeOut: function(args){
|
||||
// summary:
|
||||
// fade out all elements of this NodeList via `dojo.fadeOut`
|
||||
//
|
||||
// args: Object?
|
||||
// Additional dojo.Animation arguments to mix into this set with the addition of
|
||||
// an `auto` parameter.
|
||||
//
|
||||
// returns: dojo.Animation|dojo.NodeList
|
||||
// A special args member `auto` can be passed to automatically play the animation.
|
||||
// If args.auto is present, the original dojo.NodeList will be returned for further
|
||||
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
|
||||
//
|
||||
// example:
|
||||
// Fade out all elements with class "zork":
|
||||
// | dojo.query(".zork").fadeOut().play();
|
||||
// example:
|
||||
// Fade them on a delay and do something at the end:
|
||||
// | var fo = dojo.query(".zork").fadeOut();
|
||||
// | dojo.connect(fo, "onEnd", function(){ /*...*/ });
|
||||
// | fo.play();
|
||||
// example:
|
||||
// Using `auto`:
|
||||
// | dojo.query("li").fadeOut({ auto:true }).filter(filterFn).forEach(doit);
|
||||
//
|
||||
return this._anim(baseFx, "fadeOut", args); // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
animateProperty: function(args){
|
||||
// summary:
|
||||
// Animate all elements of this NodeList across the properties specified.
|
||||
// syntax identical to `dojo.animateProperty`
|
||||
//
|
||||
// args: Object?
|
||||
// Additional dojo.Animation arguments to mix into this set with the addition of
|
||||
// an `auto` parameter.
|
||||
//
|
||||
// returns: dojo.Animation|dojo.NodeList
|
||||
// A special args member `auto` can be passed to automatically play the animation.
|
||||
// If args.auto is present, the original dojo.NodeList will be returned for further
|
||||
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
|
||||
//
|
||||
// example:
|
||||
// | dojo.query(".zork").animateProperty({
|
||||
// | duration: 500,
|
||||
// | properties: {
|
||||
// | color: { start: "black", end: "white" },
|
||||
// | left: { end: 300 }
|
||||
// | }
|
||||
// | }).play();
|
||||
//
|
||||
// example:
|
||||
// | dojo.query(".grue").animateProperty({
|
||||
// | auto:true,
|
||||
// | properties: {
|
||||
// | height:240
|
||||
// | }
|
||||
// | }).onclick(handler);
|
||||
return this._anim(baseFx, "animateProperty", args); // dojo.Animation|dojo.NodeList
|
||||
},
|
||||
|
||||
anim: function( /*Object*/ properties,
|
||||
/*Integer?*/ duration,
|
||||
/*Function?*/ easing,
|
||||
/*Function?*/ onEnd,
|
||||
/*Integer?*/ delay){
|
||||
// summary:
|
||||
// Animate one or more CSS properties for all nodes in this list.
|
||||
// The returned animation object will already be playing when it
|
||||
// is returned. See the docs for `dojo.anim` for full details.
|
||||
// properties: Object
|
||||
// the properties to animate. does NOT support the `auto` parameter like other
|
||||
// NodeList-fx methods.
|
||||
// duration: Integer?
|
||||
// Optional. The time to run the animations for
|
||||
// easing: Function?
|
||||
// Optional. The easing function to use.
|
||||
// onEnd: Function?
|
||||
// A function to be called when the animation ends
|
||||
// delay:
|
||||
// how long to delay playing the returned animation
|
||||
// example:
|
||||
// Another way to fade out:
|
||||
// | dojo.query(".thinger").anim({ opacity: 0 });
|
||||
// example:
|
||||
// animate all elements with the "thigner" class to a width of 500
|
||||
// pixels over half a second
|
||||
// | dojo.query(".thinger").anim({ width: 500 }, 700);
|
||||
var canim = coreFx.combine(
|
||||
this.map(function(item){
|
||||
return baseFx.animateProperty({
|
||||
node: item,
|
||||
properties: properties,
|
||||
duration: duration||350,
|
||||
easing: easing
|
||||
});
|
||||
})
|
||||
);
|
||||
if(onEnd){
|
||||
connectLib.connect(canim, "onEnd", onEnd);
|
||||
}
|
||||
return canim.play(delay||0); // dojo.Animation
|
||||
}
|
||||
});
|
||||
|
||||
return NodeList;
|
||||
});
|
||||
@@ -4,47 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.NodeList-html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.NodeList-html"] = true;
|
||||
dojo.provide("dojo.NodeList-html");
|
||||
dojo.require("dojo.html");
|
||||
|
||||
|
||||
/*=====
|
||||
dojo["NodeList-html"] = {
|
||||
// summary: Adds a chainable html method to dojo.query() / Nodelist instances for setting/replacing node content
|
||||
};
|
||||
=====*/
|
||||
|
||||
dojo.extend(dojo.NodeList, {
|
||||
html: function(content, /* Object? */params){
|
||||
// summary:
|
||||
// see `dojo.html.set()`. Set the content of all elements of this NodeList
|
||||
//
|
||||
// description:
|
||||
// Based around `dojo.html.set()`, set the content of the Elements in a
|
||||
// NodeList to the given content (string/node/nodelist), with optional arguments
|
||||
// to further tune the set content behavior.
|
||||
//
|
||||
// example:
|
||||
// | dojo.query(".thingList").html("<li dojoType='dojo.dnd.Moveable'>1</li><li dojoType='dojo.dnd.Moveable'>2</li><li dojoType='dojo.dnd.Moveable'>3</li>",
|
||||
// | {
|
||||
// | parseContent: true,
|
||||
// | onBegin: function(){
|
||||
// | this.content = this.content.replace(/([0-9])/g, this.id + ": $1");
|
||||
// | this.inherited("onBegin", arguments);
|
||||
// | }
|
||||
// | }).removeClass("notdone").addClass("done");
|
||||
|
||||
var dhs = new dojo.html._ContentSetter(params || {});
|
||||
this.forEach(function(elm){
|
||||
dhs.node = elm;
|
||||
dhs.set(content);
|
||||
dhs.tearDown();
|
||||
});
|
||||
return this; // dojo.NodeList
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/NodeList-html",["./query","./_base/lang","./html"],function(_1,_2,_3){var _4=_1.NodeList;_2.extend(_4,{html:function(_5,_6){var _7=new _3._ContentSetter(_6||{});this.forEach(function(_8){_7.node=_8;_7.set(_5);_7.tearDown();});return this;}});return _4;});
|
||||
55
lib/dojo/NodeList-html.js.uncompressed.js
Normal file
55
lib/dojo/NodeList-html.js.uncompressed.js
Normal file
@@ -0,0 +1,55 @@
|
||||
define("dojo/NodeList-html", ["./query", "./_base/lang", "./html"], function(query, lang, html) {
|
||||
// module:
|
||||
// dojo/NodeList-html
|
||||
// summary:
|
||||
// TODOC
|
||||
|
||||
var NodeList = query.NodeList;
|
||||
|
||||
/*=====
|
||||
dojo["NodeList-html"] = {
|
||||
// summary: Adds a chainable html method to dojo.query() / Nodelist instances for setting/replacing node content
|
||||
};
|
||||
|
||||
// doc helper aliases:
|
||||
NodeList = dojo.NodeList;
|
||||
=====*/
|
||||
|
||||
lang.extend(NodeList, {
|
||||
html: function(/* String|DomNode|NodeList? */ content, /* Object? */params){
|
||||
// summary:
|
||||
// see `dojo.html.set()`. Set the content of all elements of this NodeList
|
||||
//
|
||||
// content:
|
||||
// An html string, node or enumerable list of nodes for insertion into the dom
|
||||
//
|
||||
// params:
|
||||
// Optional flags/properties to configure the content-setting. See dojo.html._ContentSetter
|
||||
//
|
||||
// description:
|
||||
// Based around `dojo.html.set()`, set the content of the Elements in a
|
||||
// NodeList to the given content (string/node/nodelist), with optional arguments
|
||||
// to further tune the set content behavior.
|
||||
//
|
||||
// example:
|
||||
// | dojo.query(".thingList").html("<li dojoType='dojo.dnd.Moveable'>1</li><li dojoType='dojo.dnd.Moveable'>2</li><li dojoType='dojo.dnd.Moveable'>3</li>",
|
||||
// | {
|
||||
// | parseContent: true,
|
||||
// | onBegin: function(){
|
||||
// | this.content = this.content.replace(/([0-9])/g, this.id + ": $1");
|
||||
// | this.inherited("onBegin", arguments);
|
||||
// | }
|
||||
// | }).removeClass("notdone").addClass("done");
|
||||
|
||||
var dhs = new html._ContentSetter(params || {});
|
||||
this.forEach(function(elm){
|
||||
dhs.node = elm;
|
||||
dhs.set(content);
|
||||
dhs.tearDown();
|
||||
});
|
||||
return this; // dojo.NodeList
|
||||
}
|
||||
});
|
||||
|
||||
return NodeList;
|
||||
});
|
||||
@@ -4,729 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.NodeList-manipulate"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.NodeList-manipulate"] = true;
|
||||
dojo.provide("dojo.NodeList-manipulate");
|
||||
|
||||
|
||||
/*=====
|
||||
dojo["NodeList-manipulate"] = {
|
||||
// summary: Adds a chainable methods to dojo.query() / Nodelist instances for manipulating HTML
|
||||
// and DOM nodes and their properties.
|
||||
};
|
||||
=====*/
|
||||
|
||||
//TODO: add a way to parse for widgets in the injected markup?
|
||||
|
||||
(function(){
|
||||
function getText(/*DOMNode*/node){
|
||||
// summary:
|
||||
// recursion method for text() to use. Gets text value for a node.
|
||||
// description:
|
||||
// Juse uses nodedValue so things like <br/> tags do not end up in
|
||||
// the text as any sort of line return.
|
||||
var text = "", ch = node.childNodes;
|
||||
for(var i = 0, n; n = ch[i]; i++){
|
||||
//Skip comments.
|
||||
if(n.nodeType != 8){
|
||||
if(n.nodeType == 1){
|
||||
text += getText(n);
|
||||
}else{
|
||||
text += n.nodeValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
function getWrapInsertion(/*DOMNode*/node){
|
||||
// summary:
|
||||
// finds the innermost element to use for wrap insertion.
|
||||
|
||||
//Make it easy, assume single nesting, no siblings.
|
||||
while(node.childNodes[0] && node.childNodes[0].nodeType == 1){
|
||||
node = node.childNodes[0];
|
||||
}
|
||||
return node; //DOMNode
|
||||
}
|
||||
|
||||
function makeWrapNode(/*DOMNode||String*/html, /*DOMNode*/refNode){
|
||||
// summary:
|
||||
// convert HTML into nodes if it is not already a node.
|
||||
if(typeof html == "string"){
|
||||
html = dojo._toDom(html, (refNode && refNode.ownerDocument));
|
||||
if(html.nodeType == 11){
|
||||
//DocumentFragment cannot handle cloneNode, so choose first child.
|
||||
html = html.childNodes[0];
|
||||
}
|
||||
}else if(html.nodeType == 1 && html.parentNode){
|
||||
//This element is already in the DOM clone it, but not its children.
|
||||
html = html.cloneNode(false);
|
||||
}
|
||||
return html; /*DOMNode*/
|
||||
}
|
||||
|
||||
dojo.extend(dojo.NodeList, {
|
||||
_placeMultiple: function(/*String||Node||NodeList*/query, /*String*/position){
|
||||
// summary:
|
||||
// private method for inserting queried nodes into all nodes in this NodeList
|
||||
// at different positions. Differs from NodeList.place because it will clone
|
||||
// the nodes in this NodeList if the query matches more than one element.
|
||||
var nl2 = typeof query == "string" || query.nodeType ? dojo.query(query) : query;
|
||||
var toAdd = [];
|
||||
for(var i = 0; i < nl2.length; i++){
|
||||
//Go backwards in DOM to make dom insertions easier via insertBefore
|
||||
var refNode = nl2[i];
|
||||
var length = this.length;
|
||||
for(var j = length - 1, item; item = this[j]; j--){
|
||||
if(i > 0){
|
||||
//Need to clone the item. This also means
|
||||
//it needs to be added to the current NodeList
|
||||
//so it can also be the target of other chaining operations.
|
||||
item = this._cloneNode(item);
|
||||
toAdd.unshift(item);
|
||||
}
|
||||
if(j == length - 1){
|
||||
dojo.place(item, refNode, position);
|
||||
}else{
|
||||
refNode.parentNode.insertBefore(item, refNode);
|
||||
}
|
||||
refNode = item;
|
||||
}
|
||||
}
|
||||
|
||||
if(toAdd.length){
|
||||
//Add the toAdd items to the current NodeList. Build up list of args
|
||||
//to pass to splice.
|
||||
toAdd.unshift(0);
|
||||
toAdd.unshift(this.length - 1);
|
||||
Array.prototype.splice.apply(this, toAdd);
|
||||
}
|
||||
|
||||
return this; //dojo.NodeList
|
||||
},
|
||||
|
||||
innerHTML: function(/*String?||DOMNode?|NodeList?*/value){
|
||||
// summary:
|
||||
// allows setting the innerHTML of each node in the NodeList,
|
||||
// if there is a value passed in, otherwise, reads the innerHTML value of the first node.
|
||||
// description:
|
||||
// This method is simpler than the dojo.NodeList.html() method provided by
|
||||
// `dojo.NodeList-html`. This method just does proper innerHTML insertion of HTML fragments,
|
||||
// and it allows for the innerHTML to be read for the first node in the node list.
|
||||
// Since dojo.NodeList-html already took the "html" name, this method is called
|
||||
// "innerHTML". However, if dojo.NodeList-html has not been loaded yet, this
|
||||
// module will define an "html" method that can be used instead. Be careful if you
|
||||
// are working in an environment where it is possible that dojo.NodeList-html could
|
||||
// have been loaded, since its definition of "html" will take precedence.
|
||||
// The nodes represented by the value argument will be cloned if more than one
|
||||
// node is in this NodeList. The nodes in this NodeList are returned in the "set"
|
||||
// usage of this method, not the HTML that was inserted.
|
||||
// returns:
|
||||
// if no value is passed, the result is String, the innerHTML of the first node.
|
||||
// If a value is passed, the return is this dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"></div>
|
||||
// | <div id="bar"></div>
|
||||
// This code inserts <p>Hello World</p> into both divs:
|
||||
// | dojo.query("div").innerHTML("<p>Hello World</p>");
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"><p>Hello Mars</p></div>
|
||||
// | <div id="bar"><p>Hello World</p></div>
|
||||
// This code returns "<p>Hello Mars</p>":
|
||||
// | var message = dojo.query("div").innerHTML();
|
||||
if(arguments.length){
|
||||
return this.addContent(value, "only"); //dojo.NodeList
|
||||
}else{
|
||||
return this[0].innerHTML; //String
|
||||
}
|
||||
},
|
||||
|
||||
/*=====
|
||||
html: function(value){
|
||||
// summary:
|
||||
// see the information for "innerHTML". "html" is an alias for "innerHTML", but is
|
||||
// only defined if dojo.NodeList-html has not been loaded.
|
||||
// description:
|
||||
// An alias for the "innerHTML" method, but only defined if there is not an existing
|
||||
// "html" method on dojo.NodeList. Be careful if you are working in an environment
|
||||
// where it is possible that dojo.NodeList-html could have been loaded, since its
|
||||
// definition of "html" will take precedence. If you are not sure if dojo.NodeList-html
|
||||
// could be loaded, use the "innerHTML" method.
|
||||
// value: String?||DOMNode?||NodeList?
|
||||
// optional. The HTML fragment to use as innerHTML. If value is not passed, then the innerHTML
|
||||
// of the first element in this NodeList is returned.
|
||||
// returns:
|
||||
// if no value is passed, the result is String, the innerHTML of the first node.
|
||||
// If a value is passed, the return is this dojo.NodeList
|
||||
return; // dojo.NodeList
|
||||
return; // String
|
||||
},
|
||||
=====*/
|
||||
|
||||
text: function(/*String*/value){
|
||||
// summary:
|
||||
// allows setting the text value of each node in the NodeList,
|
||||
// if there is a value passed in, otherwise, returns the text value for all the
|
||||
// nodes in the NodeList in one string.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"></div>
|
||||
// | <div id="bar"></div>
|
||||
// This code inserts "Hello World" into both divs:
|
||||
// | dojo.query("div").text("Hello World");
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"><p>Hello Mars <span>today</span></p></div>
|
||||
// | <div id="bar"><p>Hello World</p></div>
|
||||
// This code returns "Hello Mars today":
|
||||
// | var message = dojo.query("div").text();
|
||||
// returns:
|
||||
// if no value is passed, the result is String, the text value of the first node.
|
||||
// If a value is passed, the return is this dojo.NodeList
|
||||
if(arguments.length){
|
||||
for(var i = 0, node; node = this[i]; i++){
|
||||
if(node.nodeType == 1){
|
||||
dojo.empty(node);
|
||||
node.appendChild(node.ownerDocument.createTextNode(value));
|
||||
}
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
}else{
|
||||
var result = "";
|
||||
for(i = 0; node = this[i]; i++){
|
||||
result += getText(node);
|
||||
}
|
||||
return result; //String
|
||||
}
|
||||
},
|
||||
|
||||
val: function(/*String||Array*/value){
|
||||
// summary:
|
||||
// If a value is passed, allows seting the value property of form elements in this
|
||||
// NodeList, or properly selecting/checking the right value for radio/checkbox/select
|
||||
// elements. If no value is passed, the value of the first node in this NodeList
|
||||
// is returned.
|
||||
// returns:
|
||||
// if no value is passed, the result is String or an Array, for the value of the
|
||||
// first node.
|
||||
// If a value is passed, the return is this dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <input type="text" value="foo">
|
||||
// | <select multiple>
|
||||
// | <option value="red" selected>Red</option>
|
||||
// | <option value="blue">Blue</option>
|
||||
// | <option value="yellow" selected>Yellow</option>
|
||||
// | </select>
|
||||
// This code gets and sets the values for the form fields above:
|
||||
// | dojo.query('[type="text"]').val(); //gets value foo
|
||||
// | dojo.query('[type="text"]').val("bar"); //sets the input's value to "bar"
|
||||
// | dojo.query("select").val() //gets array value ["red", "yellow"]
|
||||
// | dojo.query("select").val(["blue", "yellow"]) //Sets the blue and yellow options to selected.
|
||||
|
||||
//Special work for input elements.
|
||||
if(arguments.length){
|
||||
var isArray = dojo.isArray(value);
|
||||
for(var index = 0, node; node = this[index]; index++){
|
||||
var name = node.nodeName.toUpperCase();
|
||||
var type = node.type;
|
||||
var newValue = isArray ? value[index] : value;
|
||||
|
||||
if(name == "SELECT"){
|
||||
var opts = node.options;
|
||||
for(var i = 0; i < opts.length; i++){
|
||||
var opt = opts[i];
|
||||
if(node.multiple){
|
||||
opt.selected = (dojo.indexOf(value, opt.value) != -1);
|
||||
}else{
|
||||
opt.selected = (opt.value == newValue);
|
||||
}
|
||||
}
|
||||
}else if(type == "checkbox" || type == "radio"){
|
||||
node.checked = (node.value == newValue);
|
||||
}else{
|
||||
node.value = newValue;
|
||||
}
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
}else{
|
||||
//node already declared above.
|
||||
node = this[0];
|
||||
if(!node || node.nodeType != 1){
|
||||
return undefined;
|
||||
}
|
||||
value = node.value || "";
|
||||
if(node.nodeName.toUpperCase() == "SELECT" && node.multiple){
|
||||
//A multivalued selectbox. Do the pain.
|
||||
value = [];
|
||||
//opts declared above in if block.
|
||||
opts = node.options;
|
||||
//i declared above in if block;
|
||||
for(i = 0; i < opts.length; i++){
|
||||
//opt declared above in if block
|
||||
opt = opts[i];
|
||||
if(opt.selected){
|
||||
value.push(opt.value);
|
||||
}
|
||||
}
|
||||
if(!value.length){
|
||||
value = null;
|
||||
}
|
||||
}
|
||||
return value; //String||Array
|
||||
}
|
||||
},
|
||||
|
||||
append: function(/*String||DOMNode||NodeList*/content){
|
||||
// summary:
|
||||
// appends the content to every node in the NodeList.
|
||||
// description:
|
||||
// The content will be cloned if the length of NodeList
|
||||
// is greater than 1. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the appended content.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"><p>Hello Mars</p></div>
|
||||
// | <div id="bar"><p>Hello World</p></div>
|
||||
// Running this code:
|
||||
// | dojo.query("div").append("<span>append</span>");
|
||||
// Results in this DOM structure:
|
||||
// | <div id="foo"><p>Hello Mars</p><span>append</span></div>
|
||||
// | <div id="bar"><p>Hello World</p><span>append</span></div>
|
||||
return this.addContent(content, "last"); //dojo.NodeList
|
||||
},
|
||||
|
||||
appendTo: function(/*String*/query){
|
||||
// summary:
|
||||
// appends nodes in this NodeList to the nodes matched by
|
||||
// the query passed to appendTo.
|
||||
// description:
|
||||
// The nodes in this NodeList will be cloned if the query
|
||||
// matches more than one element. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the matched nodes from the query.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <span>append</span>
|
||||
// | <p>Hello Mars</p>
|
||||
// | <p>Hello World</p>
|
||||
// Running this code:
|
||||
// | dojo.query("span").appendTo("p");
|
||||
// Results in this DOM structure:
|
||||
// | <p>Hello Mars<span>append</span></p>
|
||||
// | <p>Hello World<span>append</span></p>
|
||||
return this._placeMultiple(query, "last"); //dojo.NodeList
|
||||
},
|
||||
|
||||
prepend: function(/*String||DOMNode||NodeList*/content){
|
||||
// summary:
|
||||
// prepends the content to every node in the NodeList.
|
||||
// description:
|
||||
// The content will be cloned if the length of NodeList
|
||||
// is greater than 1. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the appended content.
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"><p>Hello Mars</p></div>
|
||||
// | <div id="bar"><p>Hello World</p></div>
|
||||
// Running this code:
|
||||
// | dojo.query("div").prepend("<span>prepend</span>");
|
||||
// Results in this DOM structure:
|
||||
// | <div id="foo"><span>prepend</span><p>Hello Mars</p></div>
|
||||
// | <div id="bar"><span>prepend</span><p>Hello World</p></div>
|
||||
return this.addContent(content, "first"); //dojo.NodeList
|
||||
},
|
||||
|
||||
prependTo: function(/*String*/query){
|
||||
// summary:
|
||||
// prepends nodes in this NodeList to the nodes matched by
|
||||
// the query passed to prependTo.
|
||||
// description:
|
||||
// The nodes in this NodeList will be cloned if the query
|
||||
// matches more than one element. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the matched nodes from the query.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <span>prepend</span>
|
||||
// | <p>Hello Mars</p>
|
||||
// | <p>Hello World</p>
|
||||
// Running this code:
|
||||
// | dojo.query("span").prependTo("p");
|
||||
// Results in this DOM structure:
|
||||
// | <p><span>prepend</span>Hello Mars</p>
|
||||
// | <p><span>prepend</span>Hello World</p>
|
||||
return this._placeMultiple(query, "first"); //dojo.NodeList
|
||||
},
|
||||
|
||||
after: function(/*String||Element||NodeList*/content){
|
||||
// summary:
|
||||
// Places the content after every node in the NodeList.
|
||||
// description:
|
||||
// The content will be cloned if the length of NodeList
|
||||
// is greater than 1. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the appended content.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"><p>Hello Mars</p></div>
|
||||
// | <div id="bar"><p>Hello World</p></div>
|
||||
// Running this code:
|
||||
// | dojo.query("div").after("<span>after</span>");
|
||||
// Results in this DOM structure:
|
||||
// | <div id="foo"><p>Hello Mars</p></div><span>after</span>
|
||||
// | <div id="bar"><p>Hello World</p></div><span>after</span>
|
||||
return this.addContent(content, "after"); //dojo.NodeList
|
||||
},
|
||||
|
||||
insertAfter: function(/*String*/query){
|
||||
// summary:
|
||||
// The nodes in this NodeList will be placed after the nodes
|
||||
// matched by the query passed to insertAfter.
|
||||
// description:
|
||||
// The nodes in this NodeList will be cloned if the query
|
||||
// matches more than one element. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the matched nodes from the query.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <span>after</span>
|
||||
// | <p>Hello Mars</p>
|
||||
// | <p>Hello World</p>
|
||||
// Running this code:
|
||||
// | dojo.query("span").insertAfter("p");
|
||||
// Results in this DOM structure:
|
||||
// | <p>Hello Mars</p><span>after</span>
|
||||
// | <p>Hello World</p><span>after</span>
|
||||
return this._placeMultiple(query, "after"); //dojo.NodeList
|
||||
},
|
||||
|
||||
before: function(/*String||DOMNode||NodeList*/content){
|
||||
// summary:
|
||||
// Places the content before every node in the NodeList.
|
||||
// description:
|
||||
// The content will be cloned if the length of NodeList
|
||||
// is greater than 1. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the appended content.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"><p>Hello Mars</p></div>
|
||||
// | <div id="bar"><p>Hello World</p></div>
|
||||
// Running this code:
|
||||
// | dojo.query("div").before("<span>before</span>");
|
||||
// Results in this DOM structure:
|
||||
// | <span>before</span><div id="foo"><p>Hello Mars</p></div>
|
||||
// | <span>before</span><div id="bar"><p>Hello World</p></div>
|
||||
return this.addContent(content, "before"); //dojo.NodeList
|
||||
},
|
||||
|
||||
insertBefore: function(/*String*/query){
|
||||
// summary:
|
||||
// The nodes in this NodeList will be placed after the nodes
|
||||
// matched by the query passed to insertAfter.
|
||||
// description:
|
||||
// The nodes in this NodeList will be cloned if the query
|
||||
// matches more than one element. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the matched nodes from the query.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <span>before</span>
|
||||
// | <p>Hello Mars</p>
|
||||
// | <p>Hello World</p>
|
||||
// Running this code:
|
||||
// | dojo.query("span").insertBefore("p");
|
||||
// Results in this DOM structure:
|
||||
// | <span>before</span><p>Hello Mars</p>
|
||||
// | <span>before</span><p>Hello World</p>
|
||||
return this._placeMultiple(query, "before"); //dojo.NodeList
|
||||
},
|
||||
|
||||
/*=====
|
||||
remove: function(simpleFilter){
|
||||
// summary:
|
||||
// alias for dojo.NodeList's orphan method. Removes elements
|
||||
// in this list that match the simple filter from their parents
|
||||
// and returns them as a new NodeList.
|
||||
// simpleFilter: String
|
||||
// single-expression CSS rule. For example, ".thinger" or
|
||||
// "#someId[attrName='value']" but not "div > span". In short,
|
||||
// anything which does not invoke a descent to evaluate but
|
||||
// can instead be used to test a single node is acceptable.
|
||||
// returns:
|
||||
// dojo.NodeList
|
||||
return; // dojo.NodeList
|
||||
},
|
||||
=====*/
|
||||
remove: dojo.NodeList.prototype.orphan,
|
||||
|
||||
wrap: function(/*String||DOMNode*/html){
|
||||
// summary:
|
||||
// Wrap each node in the NodeList with html passed to wrap.
|
||||
// description:
|
||||
// html will be cloned if the NodeList has more than one
|
||||
// element. Only DOM nodes are cloned, not any attached
|
||||
// event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes in the current NodeList will be returned,
|
||||
// not the nodes from html argument.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <b>one</b>
|
||||
// | <b>two</b>
|
||||
// Running this code:
|
||||
// | dojo.query("b").wrap("<div><span></span></div>");
|
||||
// Results in this DOM structure:
|
||||
// | <div><span><b>one</b></span></div>
|
||||
// | <div><span><b>two</b></span></div>
|
||||
if(this[0]){
|
||||
html = makeWrapNode(html, this[0]);
|
||||
|
||||
//Now cycle through the elements and do the insertion.
|
||||
for(var i = 0, node; node = this[i]; i++){
|
||||
//Always clone because if html is used to hold one of
|
||||
//the "this" nodes, then on the clone of html it will contain
|
||||
//that "this" node, and that would be bad.
|
||||
var clone = this._cloneNode(html);
|
||||
if(node.parentNode){
|
||||
node.parentNode.replaceChild(clone, node);
|
||||
}
|
||||
//Find deepest element and insert old node in it.
|
||||
var insertion = getWrapInsertion(clone);
|
||||
insertion.appendChild(node);
|
||||
}
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
},
|
||||
|
||||
wrapAll: function(/*String||DOMNode*/html){
|
||||
// summary:
|
||||
// Insert html where the first node in this NodeList lives, then place all
|
||||
// nodes in this NodeList as the child of the html.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes in the current NodeList will be returned,
|
||||
// not the nodes from html argument.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".red").wrapAll('<div class="allRed"></div>');
|
||||
// Results in this DOM structure:
|
||||
// | <div class="container">
|
||||
// | <div class="allRed">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | </div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
if(this[0]){
|
||||
html = makeWrapNode(html, this[0]);
|
||||
|
||||
//Place the wrap HTML in place of the first node.
|
||||
this[0].parentNode.replaceChild(html, this[0]);
|
||||
|
||||
//Now cycle through the elements and move them inside
|
||||
//the wrap.
|
||||
var insertion = getWrapInsertion(html);
|
||||
for(var i = 0, node; node = this[i]; i++){
|
||||
insertion.appendChild(node);
|
||||
}
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
},
|
||||
|
||||
wrapInner: function(/*String||DOMNode*/html){
|
||||
// summary:
|
||||
// For each node in the NodeList, wrap all its children with the passed in html.
|
||||
// description:
|
||||
// html will be cloned if the NodeList has more than one
|
||||
// element. Only DOM nodes are cloned, not any attached
|
||||
// event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes in the current NodeList will be returned,
|
||||
// not the nodes from html argument.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".red").wrapInner('<span class="special"></span>');
|
||||
// Results in this DOM structure:
|
||||
// | <div class="container">
|
||||
// | <div class="red"><span class="special">Red One</span></div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red"><span class="special">Red Two</span></div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
if(this[0]){
|
||||
html = makeWrapNode(html, this[0]);
|
||||
for(var i = 0; i < this.length; i++){
|
||||
//Always clone because if html is used to hold one of
|
||||
//the "this" nodes, then on the clone of html it will contain
|
||||
//that "this" node, and that would be bad.
|
||||
var clone = this._cloneNode(html);
|
||||
|
||||
//Need to convert the childNodes to an array since wrapAll modifies the
|
||||
//DOM and can change the live childNodes NodeList.
|
||||
this._wrap(dojo._toArray(this[i].childNodes), null, this._NodeListCtor).wrapAll(clone);
|
||||
}
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
},
|
||||
|
||||
replaceWith: function(/*String||DOMNode||NodeList*/content){
|
||||
// summary:
|
||||
// Replaces each node in ths NodeList with the content passed to replaceWith.
|
||||
// description:
|
||||
// The content will be cloned if the length of NodeList
|
||||
// is greater than 1. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// The nodes currently in this NodeList will be returned, not the replacing content.
|
||||
// Note that the returned nodes have been removed from the DOM.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".red").replaceWith('<div class="green">Green</div>');
|
||||
// Results in this DOM structure:
|
||||
// | <div class="container">
|
||||
// | <div class="green">Green</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="green">Green</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
content = this._normalize(content, this[0]);
|
||||
for(var i = 0, node; node = this[i]; i++){
|
||||
this._place(content, node, "before", i > 0);
|
||||
node.parentNode.removeChild(node);
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
},
|
||||
|
||||
replaceAll: function(/*String*/query){
|
||||
// summary:
|
||||
// replaces nodes matched by the query passed to replaceAll with the nodes
|
||||
// in this NodeList.
|
||||
// description:
|
||||
// The nodes in this NodeList will be cloned if the query
|
||||
// matches more than one element. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// The nodes currently in this NodeList will be returned, not the matched nodes
|
||||
// from the query. The nodes currently in this NodeLIst could have
|
||||
// been cloned, so the returned NodeList will include the cloned nodes.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".red").replaceAll(".blue");
|
||||
// Results in this DOM structure:
|
||||
// | <div class="container">
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | </div>
|
||||
var nl = dojo.query(query);
|
||||
var content = this._normalize(this, this[0]);
|
||||
for(var i = 0, node; node = nl[i]; i++){
|
||||
this._place(content, node, "before", i > 0);
|
||||
node.parentNode.removeChild(node);
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
},
|
||||
|
||||
clone: function(){
|
||||
// summary:
|
||||
// Clones all the nodes in this NodeList and returns them as a new NodeList.
|
||||
// description:
|
||||
// Only the DOM nodes are cloned, not any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, a cloned set of the original nodes.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".red").clone().appendTo(".container");
|
||||
// Results in this DOM structure:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | </div>
|
||||
|
||||
//TODO: need option to clone events?
|
||||
var ary = [];
|
||||
for(var i = 0; i < this.length; i++){
|
||||
ary.push(this._cloneNode(this[i]));
|
||||
}
|
||||
return this._wrap(ary, this, this._NodeListCtor); //dojo.NodeList
|
||||
}
|
||||
});
|
||||
|
||||
//set up html method if one does not exist
|
||||
if(!dojo.NodeList.prototype.html){
|
||||
dojo.NodeList.prototype.html = dojo.NodeList.prototype.innerHTML;
|
||||
}
|
||||
})();
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/NodeList-manipulate",["./query","./_base/lang","./_base/array","./dom-construct","./NodeList-dom"],function(_1,_2,_3,_4){var _5=_1.NodeList;function _6(_7){var _8="",ch=_7.childNodes;for(var i=0,n;n=ch[i];i++){if(n.nodeType!=8){if(n.nodeType==1){_8+=_6(n);}else{_8+=n.nodeValue;}}}return _8;};function _9(_a){while(_a.childNodes[0]&&_a.childNodes[0].nodeType==1){_a=_a.childNodes[0];}return _a;};function _b(_c,_d){if(typeof _c=="string"){_c=_4.toDom(_c,(_d&&_d.ownerDocument));if(_c.nodeType==11){_c=_c.childNodes[0];}}else{if(_c.nodeType==1&&_c.parentNode){_c=_c.cloneNode(false);}}return _c;};_2.extend(_5,{_placeMultiple:function(_e,_f){var nl2=typeof _e=="string"||_e.nodeType?_1(_e):_e;var _10=[];for(var i=0;i<nl2.length;i++){var _11=nl2[i];var _12=this.length;for(var j=_12-1,_13;_13=this[j];j--){if(i>0){_13=this._cloneNode(_13);_10.unshift(_13);}if(j==_12-1){_4.place(_13,_11,_f);}else{_11.parentNode.insertBefore(_13,_11);}_11=_13;}}if(_10.length){_10.unshift(0);_10.unshift(this.length-1);Array.prototype.splice.apply(this,_10);}return this;},innerHTML:function(_14){if(arguments.length){return this.addContent(_14,"only");}else{return this[0].innerHTML;}},text:function(_15){if(arguments.length){for(var i=0,_16;_16=this[i];i++){if(_16.nodeType==1){_4.empty(_16);_16.appendChild(_16.ownerDocument.createTextNode(_15));}}return this;}else{var _17="";for(i=0;_16=this[i];i++){_17+=_6(_16);}return _17;}},val:function(_18){if(arguments.length){var _19=_2.isArray(_18);for(var _1a=0,_1b;_1b=this[_1a];_1a++){var _1c=_1b.nodeName.toUpperCase();var _1d=_1b.type;var _1e=_19?_18[_1a]:_18;if(_1c=="SELECT"){var _1f=_1b.options;for(var i=0;i<_1f.length;i++){var opt=_1f[i];if(_1b.multiple){opt.selected=(_3.indexOf(_18,opt.value)!=-1);}else{opt.selected=(opt.value==_1e);}}}else{if(_1d=="checkbox"||_1d=="radio"){_1b.checked=(_1b.value==_1e);}else{_1b.value=_1e;}}}return this;}else{_1b=this[0];if(!_1b||_1b.nodeType!=1){return undefined;}_18=_1b.value||"";if(_1b.nodeName.toUpperCase()=="SELECT"&&_1b.multiple){_18=[];_1f=_1b.options;for(i=0;i<_1f.length;i++){opt=_1f[i];if(opt.selected){_18.push(opt.value);}}if(!_18.length){_18=null;}}return _18;}},append:function(_20){return this.addContent(_20,"last");},appendTo:function(_21){return this._placeMultiple(_21,"last");},prepend:function(_22){return this.addContent(_22,"first");},prependTo:function(_23){return this._placeMultiple(_23,"first");},after:function(_24){return this.addContent(_24,"after");},insertAfter:function(_25){return this._placeMultiple(_25,"after");},before:function(_26){return this.addContent(_26,"before");},insertBefore:function(_27){return this._placeMultiple(_27,"before");},remove:_5.prototype.orphan,wrap:function(_28){if(this[0]){_28=_b(_28,this[0]);for(var i=0,_29;_29=this[i];i++){var _2a=this._cloneNode(_28);if(_29.parentNode){_29.parentNode.replaceChild(_2a,_29);}var _2b=_9(_2a);_2b.appendChild(_29);}}return this;},wrapAll:function(_2c){if(this[0]){_2c=_b(_2c,this[0]);this[0].parentNode.replaceChild(_2c,this[0]);var _2d=_9(_2c);for(var i=0,_2e;_2e=this[i];i++){_2d.appendChild(_2e);}}return this;},wrapInner:function(_2f){if(this[0]){_2f=_b(_2f,this[0]);for(var i=0;i<this.length;i++){var _30=this._cloneNode(_2f);this._wrap(_2._toArray(this[i].childNodes),null,this._NodeListCtor).wrapAll(_30);}}return this;},replaceWith:function(_31){_31=this._normalize(_31,this[0]);for(var i=0,_32;_32=this[i];i++){this._place(_31,_32,"before",i>0);_32.parentNode.removeChild(_32);}return this;},replaceAll:function(_33){var nl=_1(_33);var _34=this._normalize(this,this[0]);for(var i=0,_35;_35=nl[i];i++){this._place(_34,_35,"before",i>0);_35.parentNode.removeChild(_35);}return this;},clone:function(){var ary=[];for(var i=0;i<this.length;i++){ary.push(this._cloneNode(this[i]));}return this._wrap(ary,this,this._NodeListCtor);}});if(!_5.prototype.html){_5.prototype.html=_5.prototype.innerHTML;}return _5;});
|
||||
730
lib/dojo/NodeList-manipulate.js.uncompressed.js
Normal file
730
lib/dojo/NodeList-manipulate.js.uncompressed.js
Normal file
@@ -0,0 +1,730 @@
|
||||
define("dojo/NodeList-manipulate", ["./query", "./_base/lang", "./_base/array", "./dom-construct", "./NodeList-dom"], function(dquery, lang, array, construct) {
|
||||
// module:
|
||||
// dojo/NodeList-manipulate
|
||||
// summary:
|
||||
// TODOC
|
||||
|
||||
var NodeList = dquery.NodeList;
|
||||
|
||||
/*=====
|
||||
dojo["NodeList-manipulate"] = {
|
||||
// summary: Adds a chainable methods to dojo.query() / Nodelist instances for manipulating HTML
|
||||
// and DOM nodes and their properties.
|
||||
};
|
||||
|
||||
// doc alias helpers:
|
||||
NodeList = dojo.NodeList;
|
||||
=====*/
|
||||
|
||||
//TODO: add a way to parse for widgets in the injected markup?
|
||||
|
||||
function getText(/*DOMNode*/node){
|
||||
// summary:
|
||||
// recursion method for text() to use. Gets text value for a node.
|
||||
// description:
|
||||
// Juse uses nodedValue so things like <br/> tags do not end up in
|
||||
// the text as any sort of line return.
|
||||
var text = "", ch = node.childNodes;
|
||||
for(var i = 0, n; n = ch[i]; i++){
|
||||
//Skip comments.
|
||||
if(n.nodeType != 8){
|
||||
if(n.nodeType == 1){
|
||||
text += getText(n);
|
||||
}else{
|
||||
text += n.nodeValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
function getWrapInsertion(/*DOMNode*/node){
|
||||
// summary:
|
||||
// finds the innermost element to use for wrap insertion.
|
||||
|
||||
//Make it easy, assume single nesting, no siblings.
|
||||
while(node.childNodes[0] && node.childNodes[0].nodeType == 1){
|
||||
node = node.childNodes[0];
|
||||
}
|
||||
return node; //DOMNode
|
||||
}
|
||||
|
||||
function makeWrapNode(/*DOMNode||String*/html, /*DOMNode*/refNode){
|
||||
// summary:
|
||||
// convert HTML into nodes if it is not already a node.
|
||||
if(typeof html == "string"){
|
||||
html = construct.toDom(html, (refNode && refNode.ownerDocument));
|
||||
if(html.nodeType == 11){
|
||||
//DocumentFragment cannot handle cloneNode, so choose first child.
|
||||
html = html.childNodes[0];
|
||||
}
|
||||
}else if(html.nodeType == 1 && html.parentNode){
|
||||
//This element is already in the DOM clone it, but not its children.
|
||||
html = html.cloneNode(false);
|
||||
}
|
||||
return html; /*DOMNode*/
|
||||
}
|
||||
|
||||
lang.extend(NodeList, {
|
||||
_placeMultiple: function(/*String||Node||NodeList*/query, /*String*/position){
|
||||
// summary:
|
||||
// private method for inserting queried nodes into all nodes in this NodeList
|
||||
// at different positions. Differs from NodeList.place because it will clone
|
||||
// the nodes in this NodeList if the query matches more than one element.
|
||||
var nl2 = typeof query == "string" || query.nodeType ? dquery(query) : query;
|
||||
var toAdd = [];
|
||||
for(var i = 0; i < nl2.length; i++){
|
||||
//Go backwards in DOM to make dom insertions easier via insertBefore
|
||||
var refNode = nl2[i];
|
||||
var length = this.length;
|
||||
for(var j = length - 1, item; item = this[j]; j--){
|
||||
if(i > 0){
|
||||
//Need to clone the item. This also means
|
||||
//it needs to be added to the current NodeList
|
||||
//so it can also be the target of other chaining operations.
|
||||
item = this._cloneNode(item);
|
||||
toAdd.unshift(item);
|
||||
}
|
||||
if(j == length - 1){
|
||||
construct.place(item, refNode, position);
|
||||
}else{
|
||||
refNode.parentNode.insertBefore(item, refNode);
|
||||
}
|
||||
refNode = item;
|
||||
}
|
||||
}
|
||||
|
||||
if(toAdd.length){
|
||||
//Add the toAdd items to the current NodeList. Build up list of args
|
||||
//to pass to splice.
|
||||
toAdd.unshift(0);
|
||||
toAdd.unshift(this.length - 1);
|
||||
Array.prototype.splice.apply(this, toAdd);
|
||||
}
|
||||
|
||||
return this; //dojo.NodeList
|
||||
},
|
||||
|
||||
innerHTML: function(/*String?||DOMNode?|NodeList?*/value){
|
||||
// summary:
|
||||
// allows setting the innerHTML of each node in the NodeList,
|
||||
// if there is a value passed in, otherwise, reads the innerHTML value of the first node.
|
||||
// description:
|
||||
// This method is simpler than the dojo.NodeList.html() method provided by
|
||||
// `dojo.NodeList-html`. This method just does proper innerHTML insertion of HTML fragments,
|
||||
// and it allows for the innerHTML to be read for the first node in the node list.
|
||||
// Since dojo.NodeList-html already took the "html" name, this method is called
|
||||
// "innerHTML". However, if dojo.NodeList-html has not been loaded yet, this
|
||||
// module will define an "html" method that can be used instead. Be careful if you
|
||||
// are working in an environment where it is possible that dojo.NodeList-html could
|
||||
// have been loaded, since its definition of "html" will take precedence.
|
||||
// The nodes represented by the value argument will be cloned if more than one
|
||||
// node is in this NodeList. The nodes in this NodeList are returned in the "set"
|
||||
// usage of this method, not the HTML that was inserted.
|
||||
// returns:
|
||||
// if no value is passed, the result is String, the innerHTML of the first node.
|
||||
// If a value is passed, the return is this dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"></div>
|
||||
// | <div id="bar"></div>
|
||||
// This code inserts <p>Hello World</p> into both divs:
|
||||
// | dojo.query("div").innerHTML("<p>Hello World</p>");
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"><p>Hello Mars</p></div>
|
||||
// | <div id="bar"><p>Hello World</p></div>
|
||||
// This code returns "<p>Hello Mars</p>":
|
||||
// | var message = dojo.query("div").innerHTML();
|
||||
if(arguments.length){
|
||||
return this.addContent(value, "only"); //dojo.NodeList
|
||||
}else{
|
||||
return this[0].innerHTML; //String
|
||||
}
|
||||
},
|
||||
|
||||
/*=====
|
||||
html: function(value){
|
||||
// summary:
|
||||
// see the information for "innerHTML". "html" is an alias for "innerHTML", but is
|
||||
// only defined if dojo.NodeList-html has not been loaded.
|
||||
// description:
|
||||
// An alias for the "innerHTML" method, but only defined if there is not an existing
|
||||
// "html" method on dojo.NodeList. Be careful if you are working in an environment
|
||||
// where it is possible that dojo.NodeList-html could have been loaded, since its
|
||||
// definition of "html" will take precedence. If you are not sure if dojo.NodeList-html
|
||||
// could be loaded, use the "innerHTML" method.
|
||||
// value: String?||DOMNode?||NodeList?
|
||||
// optional. The HTML fragment to use as innerHTML. If value is not passed, then the innerHTML
|
||||
// of the first element in this NodeList is returned.
|
||||
// returns:
|
||||
// if no value is passed, the result is String, the innerHTML of the first node.
|
||||
// If a value is passed, the return is this dojo.NodeList
|
||||
return; // dojo.NodeList
|
||||
return; // String
|
||||
},
|
||||
=====*/
|
||||
|
||||
text: function(/*String*/value){
|
||||
// summary:
|
||||
// allows setting the text value of each node in the NodeList,
|
||||
// if there is a value passed in, otherwise, returns the text value for all the
|
||||
// nodes in the NodeList in one string.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"></div>
|
||||
// | <div id="bar"></div>
|
||||
// This code inserts "Hello World" into both divs:
|
||||
// | dojo.query("div").text("Hello World");
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"><p>Hello Mars <span>today</span></p></div>
|
||||
// | <div id="bar"><p>Hello World</p></div>
|
||||
// This code returns "Hello Mars today":
|
||||
// | var message = dojo.query("div").text();
|
||||
// returns:
|
||||
// if no value is passed, the result is String, the text value of the first node.
|
||||
// If a value is passed, the return is this dojo.NodeList
|
||||
if(arguments.length){
|
||||
for(var i = 0, node; node = this[i]; i++){
|
||||
if(node.nodeType == 1){
|
||||
construct.empty(node);
|
||||
node.appendChild(node.ownerDocument.createTextNode(value));
|
||||
}
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
}else{
|
||||
var result = "";
|
||||
for(i = 0; node = this[i]; i++){
|
||||
result += getText(node);
|
||||
}
|
||||
return result; //String
|
||||
}
|
||||
},
|
||||
|
||||
val: function(/*String||Array*/value){
|
||||
// summary:
|
||||
// If a value is passed, allows seting the value property of form elements in this
|
||||
// NodeList, or properly selecting/checking the right value for radio/checkbox/select
|
||||
// elements. If no value is passed, the value of the first node in this NodeList
|
||||
// is returned.
|
||||
// returns:
|
||||
// if no value is passed, the result is String or an Array, for the value of the
|
||||
// first node.
|
||||
// If a value is passed, the return is this dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <input type="text" value="foo">
|
||||
// | <select multiple>
|
||||
// | <option value="red" selected>Red</option>
|
||||
// | <option value="blue">Blue</option>
|
||||
// | <option value="yellow" selected>Yellow</option>
|
||||
// | </select>
|
||||
// This code gets and sets the values for the form fields above:
|
||||
// | dojo.query('[type="text"]').val(); //gets value foo
|
||||
// | dojo.query('[type="text"]').val("bar"); //sets the input's value to "bar"
|
||||
// | dojo.query("select").val() //gets array value ["red", "yellow"]
|
||||
// | dojo.query("select").val(["blue", "yellow"]) //Sets the blue and yellow options to selected.
|
||||
|
||||
//Special work for input elements.
|
||||
if(arguments.length){
|
||||
var isArray = lang.isArray(value);
|
||||
for(var index = 0, node; node = this[index]; index++){
|
||||
var name = node.nodeName.toUpperCase();
|
||||
var type = node.type;
|
||||
var newValue = isArray ? value[index] : value;
|
||||
|
||||
if(name == "SELECT"){
|
||||
var opts = node.options;
|
||||
for(var i = 0; i < opts.length; i++){
|
||||
var opt = opts[i];
|
||||
if(node.multiple){
|
||||
opt.selected = (array.indexOf(value, opt.value) != -1);
|
||||
}else{
|
||||
opt.selected = (opt.value == newValue);
|
||||
}
|
||||
}
|
||||
}else if(type == "checkbox" || type == "radio"){
|
||||
node.checked = (node.value == newValue);
|
||||
}else{
|
||||
node.value = newValue;
|
||||
}
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
}else{
|
||||
//node already declared above.
|
||||
node = this[0];
|
||||
if(!node || node.nodeType != 1){
|
||||
return undefined;
|
||||
}
|
||||
value = node.value || "";
|
||||
if(node.nodeName.toUpperCase() == "SELECT" && node.multiple){
|
||||
//A multivalued selectbox. Do the pain.
|
||||
value = [];
|
||||
//opts declared above in if block.
|
||||
opts = node.options;
|
||||
//i declared above in if block;
|
||||
for(i = 0; i < opts.length; i++){
|
||||
//opt declared above in if block
|
||||
opt = opts[i];
|
||||
if(opt.selected){
|
||||
value.push(opt.value);
|
||||
}
|
||||
}
|
||||
if(!value.length){
|
||||
value = null;
|
||||
}
|
||||
}
|
||||
return value; //String||Array
|
||||
}
|
||||
},
|
||||
|
||||
append: function(/*String||DOMNode||NodeList*/content){
|
||||
// summary:
|
||||
// appends the content to every node in the NodeList.
|
||||
// description:
|
||||
// The content will be cloned if the length of NodeList
|
||||
// is greater than 1. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the appended content.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"><p>Hello Mars</p></div>
|
||||
// | <div id="bar"><p>Hello World</p></div>
|
||||
// Running this code:
|
||||
// | dojo.query("div").append("<span>append</span>");
|
||||
// Results in this DOM structure:
|
||||
// | <div id="foo"><p>Hello Mars</p><span>append</span></div>
|
||||
// | <div id="bar"><p>Hello World</p><span>append</span></div>
|
||||
return this.addContent(content, "last"); //dojo.NodeList
|
||||
},
|
||||
|
||||
appendTo: function(/*String*/query){
|
||||
// summary:
|
||||
// appends nodes in this NodeList to the nodes matched by
|
||||
// the query passed to appendTo.
|
||||
// description:
|
||||
// The nodes in this NodeList will be cloned if the query
|
||||
// matches more than one element. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the matched nodes from the query.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <span>append</span>
|
||||
// | <p>Hello Mars</p>
|
||||
// | <p>Hello World</p>
|
||||
// Running this code:
|
||||
// | dojo.query("span").appendTo("p");
|
||||
// Results in this DOM structure:
|
||||
// | <p>Hello Mars<span>append</span></p>
|
||||
// | <p>Hello World<span>append</span></p>
|
||||
return this._placeMultiple(query, "last"); //dojo.NodeList
|
||||
},
|
||||
|
||||
prepend: function(/*String||DOMNode||NodeList*/content){
|
||||
// summary:
|
||||
// prepends the content to every node in the NodeList.
|
||||
// description:
|
||||
// The content will be cloned if the length of NodeList
|
||||
// is greater than 1. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the appended content.
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"><p>Hello Mars</p></div>
|
||||
// | <div id="bar"><p>Hello World</p></div>
|
||||
// Running this code:
|
||||
// | dojo.query("div").prepend("<span>prepend</span>");
|
||||
// Results in this DOM structure:
|
||||
// | <div id="foo"><span>prepend</span><p>Hello Mars</p></div>
|
||||
// | <div id="bar"><span>prepend</span><p>Hello World</p></div>
|
||||
return this.addContent(content, "first"); //dojo.NodeList
|
||||
},
|
||||
|
||||
prependTo: function(/*String*/query){
|
||||
// summary:
|
||||
// prepends nodes in this NodeList to the nodes matched by
|
||||
// the query passed to prependTo.
|
||||
// description:
|
||||
// The nodes in this NodeList will be cloned if the query
|
||||
// matches more than one element. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the matched nodes from the query.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <span>prepend</span>
|
||||
// | <p>Hello Mars</p>
|
||||
// | <p>Hello World</p>
|
||||
// Running this code:
|
||||
// | dojo.query("span").prependTo("p");
|
||||
// Results in this DOM structure:
|
||||
// | <p><span>prepend</span>Hello Mars</p>
|
||||
// | <p><span>prepend</span>Hello World</p>
|
||||
return this._placeMultiple(query, "first"); //dojo.NodeList
|
||||
},
|
||||
|
||||
after: function(/*String||Element||NodeList*/content){
|
||||
// summary:
|
||||
// Places the content after every node in the NodeList.
|
||||
// description:
|
||||
// The content will be cloned if the length of NodeList
|
||||
// is greater than 1. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the appended content.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"><p>Hello Mars</p></div>
|
||||
// | <div id="bar"><p>Hello World</p></div>
|
||||
// Running this code:
|
||||
// | dojo.query("div").after("<span>after</span>");
|
||||
// Results in this DOM structure:
|
||||
// | <div id="foo"><p>Hello Mars</p></div><span>after</span>
|
||||
// | <div id="bar"><p>Hello World</p></div><span>after</span>
|
||||
return this.addContent(content, "after"); //dojo.NodeList
|
||||
},
|
||||
|
||||
insertAfter: function(/*String*/query){
|
||||
// summary:
|
||||
// The nodes in this NodeList will be placed after the nodes
|
||||
// matched by the query passed to insertAfter.
|
||||
// description:
|
||||
// The nodes in this NodeList will be cloned if the query
|
||||
// matches more than one element. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the matched nodes from the query.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <span>after</span>
|
||||
// | <p>Hello Mars</p>
|
||||
// | <p>Hello World</p>
|
||||
// Running this code:
|
||||
// | dojo.query("span").insertAfter("p");
|
||||
// Results in this DOM structure:
|
||||
// | <p>Hello Mars</p><span>after</span>
|
||||
// | <p>Hello World</p><span>after</span>
|
||||
return this._placeMultiple(query, "after"); //dojo.NodeList
|
||||
},
|
||||
|
||||
before: function(/*String||DOMNode||NodeList*/content){
|
||||
// summary:
|
||||
// Places the content before every node in the NodeList.
|
||||
// description:
|
||||
// The content will be cloned if the length of NodeList
|
||||
// is greater than 1. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the appended content.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div id="foo"><p>Hello Mars</p></div>
|
||||
// | <div id="bar"><p>Hello World</p></div>
|
||||
// Running this code:
|
||||
// | dojo.query("div").before("<span>before</span>");
|
||||
// Results in this DOM structure:
|
||||
// | <span>before</span><div id="foo"><p>Hello Mars</p></div>
|
||||
// | <span>before</span><div id="bar"><p>Hello World</p></div>
|
||||
return this.addContent(content, "before"); //dojo.NodeList
|
||||
},
|
||||
|
||||
insertBefore: function(/*String*/query){
|
||||
// summary:
|
||||
// The nodes in this NodeList will be placed after the nodes
|
||||
// matched by the query passed to insertAfter.
|
||||
// description:
|
||||
// The nodes in this NodeList will be cloned if the query
|
||||
// matches more than one element. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes currently in this NodeList will be returned,
|
||||
// not the matched nodes from the query.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <span>before</span>
|
||||
// | <p>Hello Mars</p>
|
||||
// | <p>Hello World</p>
|
||||
// Running this code:
|
||||
// | dojo.query("span").insertBefore("p");
|
||||
// Results in this DOM structure:
|
||||
// | <span>before</span><p>Hello Mars</p>
|
||||
// | <span>before</span><p>Hello World</p>
|
||||
return this._placeMultiple(query, "before"); //dojo.NodeList
|
||||
},
|
||||
|
||||
/*=====
|
||||
remove: function(simpleFilter){
|
||||
// summary:
|
||||
// alias for dojo.NodeList's orphan method. Removes elements
|
||||
// in this list that match the simple filter from their parents
|
||||
// and returns them as a new NodeList.
|
||||
// simpleFilter: String
|
||||
// single-expression CSS rule. For example, ".thinger" or
|
||||
// "#someId[attrName='value']" but not "div > span". In short,
|
||||
// anything which does not invoke a descent to evaluate but
|
||||
// can instead be used to test a single node is acceptable.
|
||||
// returns:
|
||||
// dojo.NodeList
|
||||
return; // dojo.NodeList
|
||||
},
|
||||
=====*/
|
||||
remove: NodeList.prototype.orphan,
|
||||
|
||||
wrap: function(/*String||DOMNode*/html){
|
||||
// summary:
|
||||
// Wrap each node in the NodeList with html passed to wrap.
|
||||
// description:
|
||||
// html will be cloned if the NodeList has more than one
|
||||
// element. Only DOM nodes are cloned, not any attached
|
||||
// event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes in the current NodeList will be returned,
|
||||
// not the nodes from html argument.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <b>one</b>
|
||||
// | <b>two</b>
|
||||
// Running this code:
|
||||
// | dojo.query("b").wrap("<div><span></span></div>");
|
||||
// Results in this DOM structure:
|
||||
// | <div><span><b>one</b></span></div>
|
||||
// | <div><span><b>two</b></span></div>
|
||||
if(this[0]){
|
||||
html = makeWrapNode(html, this[0]);
|
||||
|
||||
//Now cycle through the elements and do the insertion.
|
||||
for(var i = 0, node; node = this[i]; i++){
|
||||
//Always clone because if html is used to hold one of
|
||||
//the "this" nodes, then on the clone of html it will contain
|
||||
//that "this" node, and that would be bad.
|
||||
var clone = this._cloneNode(html);
|
||||
if(node.parentNode){
|
||||
node.parentNode.replaceChild(clone, node);
|
||||
}
|
||||
//Find deepest element and insert old node in it.
|
||||
var insertion = getWrapInsertion(clone);
|
||||
insertion.appendChild(node);
|
||||
}
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
},
|
||||
|
||||
wrapAll: function(/*String||DOMNode*/html){
|
||||
// summary:
|
||||
// Insert html where the first node in this NodeList lives, then place all
|
||||
// nodes in this NodeList as the child of the html.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes in the current NodeList will be returned,
|
||||
// not the nodes from html argument.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".red").wrapAll('<div class="allRed"></div>');
|
||||
// Results in this DOM structure:
|
||||
// | <div class="container">
|
||||
// | <div class="allRed">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | </div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
if(this[0]){
|
||||
html = makeWrapNode(html, this[0]);
|
||||
|
||||
//Place the wrap HTML in place of the first node.
|
||||
this[0].parentNode.replaceChild(html, this[0]);
|
||||
|
||||
//Now cycle through the elements and move them inside
|
||||
//the wrap.
|
||||
var insertion = getWrapInsertion(html);
|
||||
for(var i = 0, node; node = this[i]; i++){
|
||||
insertion.appendChild(node);
|
||||
}
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
},
|
||||
|
||||
wrapInner: function(/*String||DOMNode*/html){
|
||||
// summary:
|
||||
// For each node in the NodeList, wrap all its children with the passed in html.
|
||||
// description:
|
||||
// html will be cloned if the NodeList has more than one
|
||||
// element. Only DOM nodes are cloned, not any attached
|
||||
// event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, the nodes in the current NodeList will be returned,
|
||||
// not the nodes from html argument.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".red").wrapInner('<span class="special"></span>');
|
||||
// Results in this DOM structure:
|
||||
// | <div class="container">
|
||||
// | <div class="red"><span class="special">Red One</span></div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red"><span class="special">Red Two</span></div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
if(this[0]){
|
||||
html = makeWrapNode(html, this[0]);
|
||||
for(var i = 0; i < this.length; i++){
|
||||
//Always clone because if html is used to hold one of
|
||||
//the "this" nodes, then on the clone of html it will contain
|
||||
//that "this" node, and that would be bad.
|
||||
var clone = this._cloneNode(html);
|
||||
|
||||
//Need to convert the childNodes to an array since wrapAll modifies the
|
||||
//DOM and can change the live childNodes NodeList.
|
||||
this._wrap(lang._toArray(this[i].childNodes), null, this._NodeListCtor).wrapAll(clone);
|
||||
}
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
},
|
||||
|
||||
replaceWith: function(/*String||DOMNode||NodeList*/content){
|
||||
// summary:
|
||||
// Replaces each node in ths NodeList with the content passed to replaceWith.
|
||||
// description:
|
||||
// The content will be cloned if the length of NodeList
|
||||
// is greater than 1. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// The nodes currently in this NodeList will be returned, not the replacing content.
|
||||
// Note that the returned nodes have been removed from the DOM.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".red").replaceWith('<div class="green">Green</div>');
|
||||
// Results in this DOM structure:
|
||||
// | <div class="container">
|
||||
// | <div class="green">Green</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="green">Green</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
content = this._normalize(content, this[0]);
|
||||
for(var i = 0, node; node = this[i]; i++){
|
||||
this._place(content, node, "before", i > 0);
|
||||
node.parentNode.removeChild(node);
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
},
|
||||
|
||||
replaceAll: function(/*String*/query){
|
||||
// summary:
|
||||
// replaces nodes matched by the query passed to replaceAll with the nodes
|
||||
// in this NodeList.
|
||||
// description:
|
||||
// The nodes in this NodeList will be cloned if the query
|
||||
// matches more than one element. Only the DOM nodes are cloned, not
|
||||
// any attached event handlers.
|
||||
// returns:
|
||||
// The nodes currently in this NodeList will be returned, not the matched nodes
|
||||
// from the query. The nodes currently in this NodeLIst could have
|
||||
// been cloned, so the returned NodeList will include the cloned nodes.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".red").replaceAll(".blue");
|
||||
// Results in this DOM structure:
|
||||
// | <div class="container">
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="spacer">___</div>
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | </div>
|
||||
var nl = dquery(query);
|
||||
var content = this._normalize(this, this[0]);
|
||||
for(var i = 0, node; node = nl[i]; i++){
|
||||
this._place(content, node, "before", i > 0);
|
||||
node.parentNode.removeChild(node);
|
||||
}
|
||||
return this; //dojo.NodeList
|
||||
},
|
||||
|
||||
clone: function(){
|
||||
// summary:
|
||||
// Clones all the nodes in this NodeList and returns them as a new NodeList.
|
||||
// description:
|
||||
// Only the DOM nodes are cloned, not any attached event handlers.
|
||||
// returns:
|
||||
// dojo.NodeList, a cloned set of the original nodes.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".red").clone().appendTo(".container");
|
||||
// Results in this DOM structure:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | </div>
|
||||
|
||||
//TODO: need option to clone events?
|
||||
var ary = [];
|
||||
for(var i = 0; i < this.length; i++){
|
||||
ary.push(this._cloneNode(this[i]));
|
||||
}
|
||||
return this._wrap(ary, this, this._NodeListCtor); //dojo.NodeList
|
||||
}
|
||||
});
|
||||
|
||||
//set up html method if one does not exist
|
||||
if(!NodeList.prototype.html){
|
||||
NodeList.prototype.html = NodeList.prototype.innerHTML;
|
||||
}
|
||||
|
||||
return NodeList;
|
||||
});
|
||||
@@ -4,505 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.NodeList-traverse"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.NodeList-traverse"] = true;
|
||||
dojo.provide("dojo.NodeList-traverse");
|
||||
|
||||
|
||||
/*=====
|
||||
dojo["NodeList-traverse"] = {
|
||||
// summary: Adds a chainable methods to dojo.query() / Nodelist instances for traversing the DOM
|
||||
};
|
||||
=====*/
|
||||
|
||||
dojo.extend(dojo.NodeList, {
|
||||
_buildArrayFromCallback: function(/*Function*/callback){
|
||||
// summary:
|
||||
// builds a new array of possibly differing size based on the input list.
|
||||
// Since the returned array is likely of different size than the input array,
|
||||
// the array's map function cannot be used.
|
||||
var ary = [];
|
||||
for(var i = 0; i < this.length; i++){
|
||||
var items = callback.call(this[i], this[i], ary);
|
||||
if(items){
|
||||
ary = ary.concat(items);
|
||||
}
|
||||
}
|
||||
return ary;
|
||||
},
|
||||
|
||||
_getUniqueAsNodeList: function(nodes){
|
||||
// summary:
|
||||
// given a list of nodes, make sure only unique
|
||||
// elements are returned as our NodeList object.
|
||||
// Does not call _stash().
|
||||
var ary = [];
|
||||
//Using for loop for better speed.
|
||||
for(var i = 0, node; node = nodes[i]; i++){
|
||||
//Should be a faster way to do this. dojo.query has a private
|
||||
//_zip function that may be inspirational, but there are pathways
|
||||
//in query that force nozip?
|
||||
if(node.nodeType == 1 && dojo.indexOf(ary, node) == -1){
|
||||
ary.push(node);
|
||||
}
|
||||
}
|
||||
return this._wrap(ary, null, this._NodeListCtor); //dojo.NodeList
|
||||
},
|
||||
|
||||
_getUniqueNodeListWithParent: function(nodes, query){
|
||||
// summary:
|
||||
// gets unique element nodes, filters them further
|
||||
// with an optional query and then calls _stash to track parent NodeList.
|
||||
var ary = this._getUniqueAsNodeList(nodes);
|
||||
ary = (query ? dojo._filterQueryResult(ary, query) : ary);
|
||||
return ary._stash(this); //dojo.NodeList
|
||||
},
|
||||
|
||||
_getRelatedUniqueNodes: function(/*String?*/query, /*Function*/callback){
|
||||
// summary:
|
||||
// cycles over all the nodes and calls a callback
|
||||
// to collect nodes for a possible inclusion in a result.
|
||||
// The callback will get two args: callback(node, ary),
|
||||
// where ary is the array being used to collect the nodes.
|
||||
return this._getUniqueNodeListWithParent(this._buildArrayFromCallback(callback), query); //dojo.NodeList
|
||||
},
|
||||
|
||||
children: function(/*String?*/query){
|
||||
// summary:
|
||||
// Returns all immediate child elements for nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the child elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, all immediate child elements for the nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".container").children();
|
||||
// returns the four divs that are children of the container div.
|
||||
// Running this code:
|
||||
// | dojo.query(".container").children(".red");
|
||||
// returns the two divs that have the class "red".
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
return dojo._toArray(node.childNodes);
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
closest: function(/*String*/query, /*String|DOMNode?*/ root){
|
||||
// summary:
|
||||
// Returns closest parent that matches query, including current node in this
|
||||
// dojo.NodeList if it matches the query.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// root:
|
||||
// If specified, query is relative to "root" rather than document body.
|
||||
// returns:
|
||||
// dojo.NodeList, the closest parent that matches the query, including the current
|
||||
// node in this dojo.NodeList if it matches the query.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".red").closest(".container");
|
||||
// returns the div with class "container".
|
||||
return this._getRelatedUniqueNodes(null, function(node, ary){
|
||||
do{
|
||||
if(dojo._filterQueryResult([node], query, root).length){
|
||||
return node;
|
||||
}
|
||||
}while(node != root && (node = node.parentNode) && node.nodeType == 1);
|
||||
return null; //To make rhino strict checking happy.
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
parent: function(/*String?*/query){
|
||||
// summary:
|
||||
// Returns immediate parent elements for nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the parent elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, immediate parent elements for nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue first"><span class="text">Blue One</span></div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue"><span class="text">Blue Two</span></div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".text").parent();
|
||||
// returns the two divs with class "blue".
|
||||
// Running this code:
|
||||
// | dojo.query(".text").parent(".first");
|
||||
// returns the one div with class "blue" and "first".
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
return node.parentNode;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
parents: function(/*String?*/query){
|
||||
// summary:
|
||||
// Returns all parent elements for nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the child elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, all parent elements for nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue first"><span class="text">Blue One</span></div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue"><span class="text">Blue Two</span></div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".text").parents();
|
||||
// returns the two divs with class "blue", the div with class "container",
|
||||
// | the body element and the html element.
|
||||
// Running this code:
|
||||
// | dojo.query(".text").parents(".container");
|
||||
// returns the one div with class "container".
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
var pary = []
|
||||
while(node.parentNode){
|
||||
node = node.parentNode;
|
||||
pary.push(node);
|
||||
}
|
||||
return pary;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
siblings: function(/*String?*/query){
|
||||
// summary:
|
||||
// Returns all sibling elements for nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the sibling elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, all sibling elements for nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue first">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".first").siblings();
|
||||
// returns the two divs with class "red" and the other div
|
||||
// | with class "blue" that does not have "first".
|
||||
// Running this code:
|
||||
// | dojo.query(".first").siblings(".red");
|
||||
// returns the two div with class "red".
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
var pary = []
|
||||
var nodes = (node.parentNode && node.parentNode.childNodes);
|
||||
for(var i = 0; i < nodes.length; i++){
|
||||
if(nodes[i] != node){
|
||||
pary.push(nodes[i]);
|
||||
}
|
||||
}
|
||||
return pary;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
next: function(/*String?*/query){
|
||||
// summary:
|
||||
// Returns the next element for nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the next elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, the next element for nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue first">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue last">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".first").next();
|
||||
// returns the div with class "red" and has innerHTML of "Red Two".
|
||||
// Running this code:
|
||||
// | dojo.query(".last").next(".red");
|
||||
// does not return any elements.
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
var next = node.nextSibling;
|
||||
while(next && next.nodeType != 1){
|
||||
next = next.nextSibling;
|
||||
}
|
||||
return next;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
nextAll: function(/*String?*/query){
|
||||
// summary:
|
||||
// Returns all sibling elements that come after the nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the sibling elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, all sibling elements that come after the nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue first">Blue One</div>
|
||||
// | <div class="red next">Red Two</div>
|
||||
// | <div class="blue next">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".first").nextAll();
|
||||
// returns the two divs with class of "next".
|
||||
// Running this code:
|
||||
// | dojo.query(".first").nextAll(".red");
|
||||
// returns the one div with class "red" and innerHTML "Red Two".
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
var pary = []
|
||||
var next = node;
|
||||
while((next = next.nextSibling)){
|
||||
if(next.nodeType == 1){
|
||||
pary.push(next);
|
||||
}
|
||||
}
|
||||
return pary;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
prev: function(/*String?*/query){
|
||||
// summary:
|
||||
// Returns the previous element for nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the previous elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, the previous element for nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue first">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".first").prev();
|
||||
// returns the div with class "red" and has innerHTML of "Red One".
|
||||
// Running this code:
|
||||
// | dojo.query(".first").prev(".blue");
|
||||
// does not return any elements.
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
var prev = node.previousSibling;
|
||||
while(prev && prev.nodeType != 1){
|
||||
prev = prev.previousSibling;
|
||||
}
|
||||
return prev;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
prevAll: function(/*String?*/query){
|
||||
// summary:
|
||||
// Returns all sibling elements that come before the nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the sibling elements.
|
||||
// description:
|
||||
// The returned nodes will be in reverse DOM order -- the first node in the list will
|
||||
// be the node closest to the original node/NodeList.
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, all sibling elements that come before the nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red prev">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue prev">Blue One</div>
|
||||
// | <div class="red second">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".second").prevAll();
|
||||
// returns the two divs with class of "prev".
|
||||
// Running this code:
|
||||
// | dojo.query(".first").prevAll(".red");
|
||||
// returns the one div with class "red prev" and innerHTML "Red One".
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
var pary = []
|
||||
var prev = node;
|
||||
while((prev = prev.previousSibling)){
|
||||
if(prev.nodeType == 1){
|
||||
pary.push(prev);
|
||||
}
|
||||
}
|
||||
return pary;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
andSelf: function(){
|
||||
// summary:
|
||||
// Adds the nodes from the previous dojo.NodeList to the current dojo.NodeList.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// returns:
|
||||
// dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red prev">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue prev">Blue One</div>
|
||||
// | <div class="red second">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".second").prevAll().andSelf();
|
||||
// returns the two divs with class of "prev", as well as the div with class "second".
|
||||
return this.concat(this._parent);
|
||||
},
|
||||
|
||||
//Alternate methods for the :first/:last/:even/:odd pseudos.
|
||||
first: function(){
|
||||
// summary:
|
||||
// Returns the first node in this dojo.NodeList as a dojo.NodeList.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// returns:
|
||||
// dojo.NodeList, with the first node in this dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue first">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue last">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".blue").first();
|
||||
// returns the div with class "blue" and "first".
|
||||
return this._wrap(((this[0] && [this[0]]) || []), this); //dojo.NodeList
|
||||
},
|
||||
|
||||
last: function(){
|
||||
// summary:
|
||||
// Returns the last node in this dojo.NodeList as a dojo.NodeList.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// returns:
|
||||
// dojo.NodeList, with the last node in this dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue first">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue last">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".blue").last();
|
||||
// returns the last div with class "blue",
|
||||
return this._wrap((this.length ? [this[this.length - 1]] : []), this); //dojo.NodeList
|
||||
},
|
||||
|
||||
even: function(){
|
||||
// summary:
|
||||
// Returns the even nodes in this dojo.NodeList as a dojo.NodeList.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// returns:
|
||||
// dojo.NodeList, with the even nodes in this dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="interior red">Red One</div>
|
||||
// | <div class="interior blue">Blue One</div>
|
||||
// | <div class="interior red">Red Two</div>
|
||||
// | <div class="interior blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".interior").even();
|
||||
// returns the two divs with class "blue"
|
||||
return this.filter(function(item, i){
|
||||
return i % 2 != 0;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
odd: function(){
|
||||
// summary:
|
||||
// Returns the odd nodes in this dojo.NodeList as a dojo.NodeList.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// returns:
|
||||
// dojo.NodeList, with the odd nodes in this dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="interior red">Red One</div>
|
||||
// | <div class="interior blue">Blue One</div>
|
||||
// | <div class="interior red">Red Two</div>
|
||||
// | <div class="interior blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".interior").odd();
|
||||
// returns the two divs with class "red"
|
||||
return this.filter(function(item, i){
|
||||
return i % 2 == 0;
|
||||
}); //dojo.NodeList
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/NodeList-traverse",["./query","./_base/lang","./_base/array"],function(_1,_2,_3){var _4=_1.NodeList;_2.extend(_4,{_buildArrayFromCallback:function(_5){var _6=[];for(var i=0;i<this.length;i++){var _7=_5.call(this[i],this[i],_6);if(_7){_6=_6.concat(_7);}}return _6;},_getUniqueAsNodeList:function(_8){var _9=[];for(var i=0,_a;_a=_8[i];i++){if(_a.nodeType==1&&_3.indexOf(_9,_a)==-1){_9.push(_a);}}return this._wrap(_9,null,this._NodeListCtor);},_getUniqueNodeListWithParent:function(_b,_c){var _d=this._getUniqueAsNodeList(_b);_d=(_c?_1._filterResult(_d,_c):_d);return _d._stash(this);},_getRelatedUniqueNodes:function(_e,_f){return this._getUniqueNodeListWithParent(this._buildArrayFromCallback(_f),_e);},children:function(_10){return this._getRelatedUniqueNodes(_10,function(_11,ary){return _2._toArray(_11.childNodes);});},closest:function(_12,_13){return this._getRelatedUniqueNodes(null,function(_14,ary){do{if(_1._filterResult([_14],_12,_13).length){return _14;}}while(_14!=_13&&(_14=_14.parentNode)&&_14.nodeType==1);return null;});},parent:function(_15){return this._getRelatedUniqueNodes(_15,function(_16,ary){return _16.parentNode;});},parents:function(_17){return this._getRelatedUniqueNodes(_17,function(_18,ary){var _19=[];while(_18.parentNode){_18=_18.parentNode;_19.push(_18);}return _19;});},siblings:function(_1a){return this._getRelatedUniqueNodes(_1a,function(_1b,ary){var _1c=[];var _1d=(_1b.parentNode&&_1b.parentNode.childNodes);for(var i=0;i<_1d.length;i++){if(_1d[i]!=_1b){_1c.push(_1d[i]);}}return _1c;});},next:function(_1e){return this._getRelatedUniqueNodes(_1e,function(_1f,ary){var _20=_1f.nextSibling;while(_20&&_20.nodeType!=1){_20=_20.nextSibling;}return _20;});},nextAll:function(_21){return this._getRelatedUniqueNodes(_21,function(_22,ary){var _23=[];var _24=_22;while((_24=_24.nextSibling)){if(_24.nodeType==1){_23.push(_24);}}return _23;});},prev:function(_25){return this._getRelatedUniqueNodes(_25,function(_26,ary){var _27=_26.previousSibling;while(_27&&_27.nodeType!=1){_27=_27.previousSibling;}return _27;});},prevAll:function(_28){return this._getRelatedUniqueNodes(_28,function(_29,ary){var _2a=[];var _2b=_29;while((_2b=_2b.previousSibling)){if(_2b.nodeType==1){_2a.push(_2b);}}return _2a;});},andSelf:function(){return this.concat(this._parent);},first:function(){return this._wrap(((this[0]&&[this[0]])||[]),this);},last:function(){return this._wrap((this.length?[this[this.length-1]]:[]),this);},even:function(){return this.filter(function(_2c,i){return i%2!=0;});},odd:function(){return this.filter(function(_2d,i){return i%2==0;});}});return _4;});
|
||||
508
lib/dojo/NodeList-traverse.js.uncompressed.js
Normal file
508
lib/dojo/NodeList-traverse.js.uncompressed.js
Normal file
@@ -0,0 +1,508 @@
|
||||
define("dojo/NodeList-traverse", ["./query", "./_base/lang", "./_base/array"], function(dquery, lang, array) {
|
||||
// module:
|
||||
// dojo/NodeList-traverse
|
||||
// summary:
|
||||
// TODOC
|
||||
|
||||
var NodeList = dquery.NodeList;
|
||||
|
||||
/*=====
|
||||
dojo["NodeList-traverse"] = {
|
||||
// summary: Adds a chainable methods to dojo.query() / Nodelist instances for traversing the DOM
|
||||
};
|
||||
|
||||
// doc alias helpers:
|
||||
NodeList = dojo.NodeList;
|
||||
=====*/
|
||||
|
||||
lang.extend(NodeList, {
|
||||
_buildArrayFromCallback: function(/*Function*/callback){
|
||||
// summary:
|
||||
// builds a new array of possibly differing size based on the input list.
|
||||
// Since the returned array is likely of different size than the input array,
|
||||
// the array's map function cannot be used.
|
||||
var ary = [];
|
||||
for(var i = 0; i < this.length; i++){
|
||||
var items = callback.call(this[i], this[i], ary);
|
||||
if(items){
|
||||
ary = ary.concat(items);
|
||||
}
|
||||
}
|
||||
return ary; //Array
|
||||
},
|
||||
|
||||
_getUniqueAsNodeList: function(/*Array*/ nodes){
|
||||
// summary:
|
||||
// given a list of nodes, make sure only unique
|
||||
// elements are returned as our NodeList object.
|
||||
// Does not call _stash().
|
||||
var ary = [];
|
||||
//Using for loop for better speed.
|
||||
for(var i = 0, node; node = nodes[i]; i++){
|
||||
//Should be a faster way to do this. dojo.query has a private
|
||||
//_zip function that may be inspirational, but there are pathways
|
||||
//in query that force nozip?
|
||||
if(node.nodeType == 1 && array.indexOf(ary, node) == -1){
|
||||
ary.push(node);
|
||||
}
|
||||
}
|
||||
return this._wrap(ary, null, this._NodeListCtor); //dojo.NodeList
|
||||
},
|
||||
|
||||
_getUniqueNodeListWithParent: function(/*Array*/ nodes, /*String*/ query){
|
||||
// summary:
|
||||
// gets unique element nodes, filters them further
|
||||
// with an optional query and then calls _stash to track parent NodeList.
|
||||
var ary = this._getUniqueAsNodeList(nodes);
|
||||
ary = (query ? dquery._filterResult(ary, query) : ary);
|
||||
return ary._stash(this); //dojo.NodeList
|
||||
},
|
||||
|
||||
_getRelatedUniqueNodes: function(/*String?*/ query, /*Function*/ callback){
|
||||
// summary:
|
||||
// cycles over all the nodes and calls a callback
|
||||
// to collect nodes for a possible inclusion in a result.
|
||||
// The callback will get two args: callback(node, ary),
|
||||
// where ary is the array being used to collect the nodes.
|
||||
return this._getUniqueNodeListWithParent(this._buildArrayFromCallback(callback), query); //dojo.NodeList
|
||||
},
|
||||
|
||||
children: function(/*String?*/ query){
|
||||
// summary:
|
||||
// Returns all immediate child elements for nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the child elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, all immediate child elements for the nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".container").children();
|
||||
// returns the four divs that are children of the container div.
|
||||
// Running this code:
|
||||
// | dojo.query(".container").children(".red");
|
||||
// returns the two divs that have the class "red".
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
return lang._toArray(node.childNodes);
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
closest: function(/*String*/ query, /*String|DOMNode?*/ root){
|
||||
// summary:
|
||||
// Returns closest parent that matches query, including current node in this
|
||||
// dojo.NodeList if it matches the query.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// root:
|
||||
// If specified, query is relative to "root" rather than document body.
|
||||
// returns:
|
||||
// dojo.NodeList, the closest parent that matches the query, including the current
|
||||
// node in this dojo.NodeList if it matches the query.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".red").closest(".container");
|
||||
// returns the div with class "container".
|
||||
return this._getRelatedUniqueNodes(null, function(node, ary){
|
||||
do{
|
||||
if(dquery._filterResult([node], query, root).length){
|
||||
return node;
|
||||
}
|
||||
}while(node != root && (node = node.parentNode) && node.nodeType == 1);
|
||||
return null; //To make rhino strict checking happy.
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
parent: function(/*String?*/ query){
|
||||
// summary:
|
||||
// Returns immediate parent elements for nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the parent elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, immediate parent elements for nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue first"><span class="text">Blue One</span></div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue"><span class="text">Blue Two</span></div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".text").parent();
|
||||
// returns the two divs with class "blue".
|
||||
// Running this code:
|
||||
// | dojo.query(".text").parent(".first");
|
||||
// returns the one div with class "blue" and "first".
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
return node.parentNode;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
parents: function(/*String?*/ query){
|
||||
// summary:
|
||||
// Returns all parent elements for nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the child elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, all parent elements for nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue first"><span class="text">Blue One</span></div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue"><span class="text">Blue Two</span></div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".text").parents();
|
||||
// returns the two divs with class "blue", the div with class "container",
|
||||
// | the body element and the html element.
|
||||
// Running this code:
|
||||
// | dojo.query(".text").parents(".container");
|
||||
// returns the one div with class "container".
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
var pary = [];
|
||||
while(node.parentNode){
|
||||
node = node.parentNode;
|
||||
pary.push(node);
|
||||
}
|
||||
return pary;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
siblings: function(/*String?*/ query){
|
||||
// summary:
|
||||
// Returns all sibling elements for nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the sibling elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, all sibling elements for nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue first">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".first").siblings();
|
||||
// returns the two divs with class "red" and the other div
|
||||
// | with class "blue" that does not have "first".
|
||||
// Running this code:
|
||||
// | dojo.query(".first").siblings(".red");
|
||||
// returns the two div with class "red".
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
var pary = [];
|
||||
var nodes = (node.parentNode && node.parentNode.childNodes);
|
||||
for(var i = 0; i < nodes.length; i++){
|
||||
if(nodes[i] != node){
|
||||
pary.push(nodes[i]);
|
||||
}
|
||||
}
|
||||
return pary;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
next: function(/*String?*/ query){
|
||||
// summary:
|
||||
// Returns the next element for nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the next elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, the next element for nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue first">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue last">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".first").next();
|
||||
// returns the div with class "red" and has innerHTML of "Red Two".
|
||||
// Running this code:
|
||||
// | dojo.query(".last").next(".red");
|
||||
// does not return any elements.
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
var next = node.nextSibling;
|
||||
while(next && next.nodeType != 1){
|
||||
next = next.nextSibling;
|
||||
}
|
||||
return next;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
nextAll: function(/*String?*/ query){
|
||||
// summary:
|
||||
// Returns all sibling elements that come after the nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the sibling elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, all sibling elements that come after the nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue first">Blue One</div>
|
||||
// | <div class="red next">Red Two</div>
|
||||
// | <div class="blue next">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".first").nextAll();
|
||||
// returns the two divs with class of "next".
|
||||
// Running this code:
|
||||
// | dojo.query(".first").nextAll(".red");
|
||||
// returns the one div with class "red" and innerHTML "Red Two".
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
var pary = [];
|
||||
var next = node;
|
||||
while((next = next.nextSibling)){
|
||||
if(next.nodeType == 1){
|
||||
pary.push(next);
|
||||
}
|
||||
}
|
||||
return pary;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
prev: function(/*String?*/ query){
|
||||
// summary:
|
||||
// Returns the previous element for nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the previous elements.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, the previous element for nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue first">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".first").prev();
|
||||
// returns the div with class "red" and has innerHTML of "Red One".
|
||||
// Running this code:
|
||||
// | dojo.query(".first").prev(".blue");
|
||||
// does not return any elements.
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
var prev = node.previousSibling;
|
||||
while(prev && prev.nodeType != 1){
|
||||
prev = prev.previousSibling;
|
||||
}
|
||||
return prev;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
prevAll: function(/*String?*/ query){
|
||||
// summary:
|
||||
// Returns all sibling elements that come before the nodes in this dojo.NodeList.
|
||||
// Optionally takes a query to filter the sibling elements.
|
||||
// description:
|
||||
// The returned nodes will be in reverse DOM order -- the first node in the list will
|
||||
// be the node closest to the original node/NodeList.
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// query:
|
||||
// a CSS selector.
|
||||
// returns:
|
||||
// dojo.NodeList, all sibling elements that come before the nodes in this dojo.NodeList.
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red prev">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue prev">Blue One</div>
|
||||
// | <div class="red second">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".second").prevAll();
|
||||
// returns the two divs with class of "prev".
|
||||
// Running this code:
|
||||
// | dojo.query(".first").prevAll(".red");
|
||||
// returns the one div with class "red prev" and innerHTML "Red One".
|
||||
return this._getRelatedUniqueNodes(query, function(node, ary){
|
||||
var pary = [];
|
||||
var prev = node;
|
||||
while((prev = prev.previousSibling)){
|
||||
if(prev.nodeType == 1){
|
||||
pary.push(prev);
|
||||
}
|
||||
}
|
||||
return pary;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
andSelf: function(){
|
||||
// summary:
|
||||
// Adds the nodes from the previous dojo.NodeList to the current dojo.NodeList.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// returns:
|
||||
// dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red prev">Red One</div>
|
||||
// | Some Text
|
||||
// | <div class="blue prev">Blue One</div>
|
||||
// | <div class="red second">Red Two</div>
|
||||
// | <div class="blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".second").prevAll().andSelf();
|
||||
// returns the two divs with class of "prev", as well as the div with class "second".
|
||||
return this.concat(this._parent); //dojo.NodeList
|
||||
},
|
||||
|
||||
//Alternate methods for the :first/:last/:even/:odd pseudos.
|
||||
first: function(){
|
||||
// summary:
|
||||
// Returns the first node in this dojo.NodeList as a dojo.NodeList.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// returns:
|
||||
// dojo.NodeList, with the first node in this dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue first">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue last">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".blue").first();
|
||||
// returns the div with class "blue" and "first".
|
||||
return this._wrap(((this[0] && [this[0]]) || []), this); //dojo.NodeList
|
||||
},
|
||||
|
||||
last: function(){
|
||||
// summary:
|
||||
// Returns the last node in this dojo.NodeList as a dojo.NodeList.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// returns:
|
||||
// dojo.NodeList, with the last node in this dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="red">Red One</div>
|
||||
// | <div class="blue first">Blue One</div>
|
||||
// | <div class="red">Red Two</div>
|
||||
// | <div class="blue last">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".blue").last();
|
||||
// returns the last div with class "blue",
|
||||
return this._wrap((this.length ? [this[this.length - 1]] : []), this); //dojo.NodeList
|
||||
},
|
||||
|
||||
even: function(){
|
||||
// summary:
|
||||
// Returns the even nodes in this dojo.NodeList as a dojo.NodeList.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// returns:
|
||||
// dojo.NodeList, with the even nodes in this dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="interior red">Red One</div>
|
||||
// | <div class="interior blue">Blue One</div>
|
||||
// | <div class="interior red">Red Two</div>
|
||||
// | <div class="interior blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".interior").even();
|
||||
// returns the two divs with class "blue"
|
||||
return this.filter(function(item, i){
|
||||
return i % 2 != 0;
|
||||
}); //dojo.NodeList
|
||||
},
|
||||
|
||||
odd: function(){
|
||||
// summary:
|
||||
// Returns the odd nodes in this dojo.NodeList as a dojo.NodeList.
|
||||
// description:
|
||||
// .end() can be used on the returned dojo.NodeList to get back to the
|
||||
// original dojo.NodeList.
|
||||
// returns:
|
||||
// dojo.NodeList, with the odd nodes in this dojo.NodeList
|
||||
// example:
|
||||
// assume a DOM created by this markup:
|
||||
// | <div class="container">
|
||||
// | <div class="interior red">Red One</div>
|
||||
// | <div class="interior blue">Blue One</div>
|
||||
// | <div class="interior red">Red Two</div>
|
||||
// | <div class="interior blue">Blue Two</div>
|
||||
// | </div>
|
||||
// Running this code:
|
||||
// | dojo.query(".interior").odd();
|
||||
// returns the two divs with class "red"
|
||||
return this.filter(function(item, i){
|
||||
return i % 2 == 0;
|
||||
}); //dojo.NodeList
|
||||
}
|
||||
});
|
||||
|
||||
return NodeList;
|
||||
});
|
||||
@@ -1,10 +1,3 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* OpenAjax.js
|
||||
*
|
||||
@@ -54,11 +47,11 @@ if(!window["OpenAjax"]){
|
||||
extraData: extra
|
||||
};
|
||||
this.publish(ooh+"registerLibrary", libs[prefix]);
|
||||
}
|
||||
};
|
||||
h.unregisterLibrary = function(prefix){
|
||||
this.publish(ooh+"unregisterLibrary", libs[prefix]);
|
||||
delete libs[prefix];
|
||||
}
|
||||
};
|
||||
|
||||
h._subscriptions = { c:{}, s:[] };
|
||||
h._cleanup = [];
|
||||
@@ -74,7 +67,7 @@ if(!window["OpenAjax"]){
|
||||
var path = name.split(".");
|
||||
this._subscribe(this._subscriptions, path, 0, sub);
|
||||
return handle;
|
||||
}
|
||||
};
|
||||
|
||||
h.publish = function(name, message){
|
||||
var path = name.split(".");
|
||||
@@ -88,13 +81,13 @@ if(!window["OpenAjax"]){
|
||||
delete(this._cleanup);
|
||||
this._cleanup = [];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
h.unsubscribe = function(sub){
|
||||
var path = sub.split(".");
|
||||
var sid = path.pop();
|
||||
this._unsubscribe(this._subscriptions, path, 0, sid);
|
||||
}
|
||||
};
|
||||
|
||||
h._subscribe = function(tree, path, index, sub){
|
||||
var token = path[index];
|
||||
@@ -102,21 +95,21 @@ if(!window["OpenAjax"]){
|
||||
tree.s.push(sub);
|
||||
}else{
|
||||
if(typeof tree.c == "undefined"){
|
||||
tree.c = {};
|
||||
tree.c = {};
|
||||
}
|
||||
if(typeof tree.c[token] == "undefined"){
|
||||
tree.c[token] = { c: {}, s: [] };
|
||||
this._subscribe(tree.c[token], path, index + 1, sub);
|
||||
}else{
|
||||
this._subscribe( tree.c[token], path, index + 1, sub);
|
||||
this._subscribe(tree.c[token], path, index + 1, sub);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
h._publish = function(tree, path, index, name, msg){
|
||||
if(typeof tree != "undefined"){
|
||||
var node;
|
||||
if(index == path.length) {
|
||||
if(index == path.length){
|
||||
node = tree;
|
||||
}else{
|
||||
this._publish(tree.c[path[index]], path, index + 1, name, msg);
|
||||
@@ -141,33 +134,33 @@ if(!window["OpenAjax"]){
|
||||
fcb = sc[fcb];
|
||||
}
|
||||
if((!fcb) ||
|
||||
(fcb.call(sc, name, msg, d))) {
|
||||
(fcb.call(sc, name, msg, d))){
|
||||
cb.call(sc, name, msg, d);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
h._unsubscribe = function(tree, path, index, sid) {
|
||||
if(typeof tree != "undefined") {
|
||||
if(index < path.length) {
|
||||
h._unsubscribe = function(tree, path, index, sid){
|
||||
if(typeof tree != "undefined"){
|
||||
if(index < path.length){
|
||||
var childNode = tree.c[path[index]];
|
||||
this._unsubscribe(childNode, path, index + 1, sid);
|
||||
if(childNode.s.length == 0) {
|
||||
if(childNode.s.length == 0){
|
||||
for(var x in childNode.c)
|
||||
return;
|
||||
return;
|
||||
delete tree.c[path[index]];
|
||||
}
|
||||
return;
|
||||
}
|
||||
else {
|
||||
else{
|
||||
var callbacks = tree.s;
|
||||
var max = callbacks.length;
|
||||
for(var i = 0; i < max; i++)
|
||||
if(sid == callbacks[i].sid) {
|
||||
if(this._pubDepth > 0) {
|
||||
if(sid == callbacks[i].sid){
|
||||
if(this._pubDepth > 0){
|
||||
callbacks[i].cb = null;
|
||||
this._cleanup.push(callbacks[i]);
|
||||
}
|
||||
@@ -177,7 +170,7 @@ if(!window["OpenAjax"]){
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
// The following function is provided for automatic testing purposes.
|
||||
// It is not expected to be deployed in run-time OpenAjax Hub implementations.
|
||||
h.reinit = function()
|
||||
|
||||
@@ -4,138 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.Stateful"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.Stateful"] = true;
|
||||
dojo.provide("dojo.Stateful");
|
||||
|
||||
|
||||
dojo.declare("dojo.Stateful", null, {
|
||||
// summary:
|
||||
// Base class for objects that provide named properties with optional getter/setter
|
||||
// control and the ability to watch for property changes
|
||||
// example:
|
||||
// | var obj = new dojo.Stateful();
|
||||
// | obj.watch("foo", function(){
|
||||
// | console.log("foo changed to " + this.get("foo"));
|
||||
// | });
|
||||
// | obj.set("foo","bar");
|
||||
postscript: function(mixin){
|
||||
if(mixin){
|
||||
dojo.mixin(this, mixin);
|
||||
}
|
||||
},
|
||||
|
||||
get: function(/*String*/name){
|
||||
// summary:
|
||||
// Get a property on a Stateful instance.
|
||||
// name:
|
||||
// The property to get.
|
||||
// description:
|
||||
// Get a named property on a Stateful object. The property may
|
||||
// potentially be retrieved via a getter method in subclasses. In the base class
|
||||
// this just retrieves the object's property.
|
||||
// For example:
|
||||
// | stateful = new dojo.Stateful({foo: 3});
|
||||
// | stateful.get("foo") // returns 3
|
||||
// | stateful.foo // returns 3
|
||||
|
||||
return this[name];
|
||||
},
|
||||
set: function(/*String*/name, /*Object*/value){
|
||||
// summary:
|
||||
// Set a property on a Stateful instance
|
||||
// name:
|
||||
// The property to set.
|
||||
// value:
|
||||
// The value to set in the property.
|
||||
// description:
|
||||
// Sets named properties on a stateful object and notifies any watchers of
|
||||
// the property. A programmatic setter may be defined in subclasses.
|
||||
// For example:
|
||||
// | stateful = new dojo.Stateful();
|
||||
// | stateful.watch(function(name, oldValue, value){
|
||||
// | // this will be called on the set below
|
||||
// | }
|
||||
// | stateful.set(foo, 5);
|
||||
//
|
||||
// set() may also be called with a hash of name/value pairs, ex:
|
||||
// | myObj.set({
|
||||
// | foo: "Howdy",
|
||||
// | bar: 3
|
||||
// | })
|
||||
// This is equivalent to calling set(foo, "Howdy") and set(bar, 3)
|
||||
if(typeof name === "object"){
|
||||
for(var x in name){
|
||||
this.set(x, name[x]);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
var oldValue = this[name];
|
||||
this[name] = value;
|
||||
if(this._watchCallbacks){
|
||||
this._watchCallbacks(name, oldValue, value);
|
||||
}
|
||||
return this;
|
||||
},
|
||||
watch: function(/*String?*/name, /*Function*/callback){
|
||||
// summary:
|
||||
// Watches a property for changes
|
||||
// name:
|
||||
// Indicates the property to watch. This is optional (the callback may be the
|
||||
// only parameter), and if omitted, all the properties will be watched
|
||||
// returns:
|
||||
// An object handle for the watch. The unwatch method of this object
|
||||
// can be used to discontinue watching this property:
|
||||
// | var watchHandle = obj.watch("foo", callback);
|
||||
// | watchHandle.unwatch(); // callback won't be called now
|
||||
// callback:
|
||||
// The function to execute when the property changes. This will be called after
|
||||
// the property has been changed. The callback will be called with the |this|
|
||||
// set to the instance, the first argument as the name of the property, the
|
||||
// second argument as the old value and the third argument as the new value.
|
||||
|
||||
var callbacks = this._watchCallbacks;
|
||||
if(!callbacks){
|
||||
var self = this;
|
||||
callbacks = this._watchCallbacks = function(name, oldValue, value, ignoreCatchall){
|
||||
var notify = function(propertyCallbacks){
|
||||
if(propertyCallbacks){
|
||||
propertyCallbacks = propertyCallbacks.slice();
|
||||
for(var i = 0, l = propertyCallbacks.length; i < l; i++){
|
||||
try{
|
||||
propertyCallbacks[i].call(self, name, oldValue, value);
|
||||
}catch(e){
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
notify(callbacks['_' + name]);
|
||||
if(!ignoreCatchall){
|
||||
notify(callbacks["*"]); // the catch-all
|
||||
}
|
||||
}; // we use a function instead of an object so it will be ignored by JSON conversion
|
||||
}
|
||||
if(!callback && typeof name === "function"){
|
||||
callback = name;
|
||||
name = "*";
|
||||
}else{
|
||||
// prepend with dash to prevent name conflicts with function (like "name" property)
|
||||
name = '_' + name;
|
||||
}
|
||||
var propertyCallbacks = callbacks[name];
|
||||
if(typeof propertyCallbacks !== "object"){
|
||||
propertyCallbacks = callbacks[name] = [];
|
||||
}
|
||||
propertyCallbacks.push(callback);
|
||||
return {
|
||||
unwatch: function(){
|
||||
propertyCallbacks.splice(dojo.indexOf(propertyCallbacks, callback), 1);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/Stateful",["./_base/kernel","./_base/declare","./_base/lang","./_base/array"],function(_1,_2,_3,_4){return _1.declare("dojo.Stateful",null,{postscript:function(_5){if(_5){_3.mixin(this,_5);}},get:function(_6){return this[_6];},set:function(_7,_8){if(typeof _7==="object"){for(var x in _7){this.set(x,_7[x]);}return this;}var _9=this[_7];this[_7]=_8;if(this._watchCallbacks){this._watchCallbacks(_7,_9,_8);}return this;},watch:function(_a,_b){var _c=this._watchCallbacks;if(!_c){var _d=this;_c=this._watchCallbacks=function(_e,_f,_10,_11){var _12=function(_13){if(_13){_13=_13.slice();for(var i=0,l=_13.length;i<l;i++){try{_13[i].call(_d,_e,_f,_10);}catch(e){console.error(e);}}}};_12(_c["_"+_e]);if(!_11){_12(_c["*"]);}};}if(!_b&&typeof _a==="function"){_b=_a;_a="*";}else{_a="_"+_a;}var _14=_c[_a];if(typeof _14!=="object"){_14=_c[_a]=[];}_14.push(_b);return {unwatch:function(){_14.splice(_4.indexOf(_14,_b),1);}};}});});
|
||||
139
lib/dojo/Stateful.js.uncompressed.js
Normal file
139
lib/dojo/Stateful.js.uncompressed.js
Normal file
@@ -0,0 +1,139 @@
|
||||
define("dojo/Stateful", ["./_base/kernel", "./_base/declare", "./_base/lang", "./_base/array"], function(dojo, declare, lang, array) {
|
||||
// module:
|
||||
// dojo/Stateful
|
||||
// summary:
|
||||
// TODOC
|
||||
|
||||
return dojo.declare("dojo.Stateful", null, {
|
||||
// summary:
|
||||
// Base class for objects that provide named properties with optional getter/setter
|
||||
// control and the ability to watch for property changes
|
||||
// example:
|
||||
// | var obj = new dojo.Stateful();
|
||||
// | obj.watch("foo", function(){
|
||||
// | console.log("foo changed to " + this.get("foo"));
|
||||
// | });
|
||||
// | obj.set("foo","bar");
|
||||
postscript: function(mixin){
|
||||
if(mixin){
|
||||
lang.mixin(this, mixin);
|
||||
}
|
||||
},
|
||||
|
||||
get: function(/*String*/name){
|
||||
// summary:
|
||||
// Get a property on a Stateful instance.
|
||||
// name:
|
||||
// The property to get.
|
||||
// returns:
|
||||
// The property value on this Stateful instance.
|
||||
// description:
|
||||
// Get a named property on a Stateful object. The property may
|
||||
// potentially be retrieved via a getter method in subclasses. In the base class
|
||||
// this just retrieves the object's property.
|
||||
// For example:
|
||||
// | stateful = new dojo.Stateful({foo: 3});
|
||||
// | stateful.get("foo") // returns 3
|
||||
// | stateful.foo // returns 3
|
||||
|
||||
return this[name]; //Any
|
||||
},
|
||||
set: function(/*String*/name, /*Object*/value){
|
||||
// summary:
|
||||
// Set a property on a Stateful instance
|
||||
// name:
|
||||
// The property to set.
|
||||
// value:
|
||||
// The value to set in the property.
|
||||
// returns:
|
||||
// The function returns this dojo.Stateful instance.
|
||||
// description:
|
||||
// Sets named properties on a stateful object and notifies any watchers of
|
||||
// the property. A programmatic setter may be defined in subclasses.
|
||||
// For example:
|
||||
// | stateful = new dojo.Stateful();
|
||||
// | stateful.watch(function(name, oldValue, value){
|
||||
// | // this will be called on the set below
|
||||
// | }
|
||||
// | stateful.set(foo, 5);
|
||||
//
|
||||
// set() may also be called with a hash of name/value pairs, ex:
|
||||
// | myObj.set({
|
||||
// | foo: "Howdy",
|
||||
// | bar: 3
|
||||
// | })
|
||||
// This is equivalent to calling set(foo, "Howdy") and set(bar, 3)
|
||||
if(typeof name === "object"){
|
||||
for(var x in name){
|
||||
this.set(x, name[x]);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
var oldValue = this[name];
|
||||
this[name] = value;
|
||||
if(this._watchCallbacks){
|
||||
this._watchCallbacks(name, oldValue, value);
|
||||
}
|
||||
return this; //dojo.Stateful
|
||||
},
|
||||
watch: function(/*String?*/name, /*Function*/callback){
|
||||
// summary:
|
||||
// Watches a property for changes
|
||||
// name:
|
||||
// Indicates the property to watch. This is optional (the callback may be the
|
||||
// only parameter), and if omitted, all the properties will be watched
|
||||
// returns:
|
||||
// An object handle for the watch. The unwatch method of this object
|
||||
// can be used to discontinue watching this property:
|
||||
// | var watchHandle = obj.watch("foo", callback);
|
||||
// | watchHandle.unwatch(); // callback won't be called now
|
||||
// callback:
|
||||
// The function to execute when the property changes. This will be called after
|
||||
// the property has been changed. The callback will be called with the |this|
|
||||
// set to the instance, the first argument as the name of the property, the
|
||||
// second argument as the old value and the third argument as the new value.
|
||||
|
||||
var callbacks = this._watchCallbacks;
|
||||
if(!callbacks){
|
||||
var self = this;
|
||||
callbacks = this._watchCallbacks = function(name, oldValue, value, ignoreCatchall){
|
||||
var notify = function(propertyCallbacks){
|
||||
if(propertyCallbacks){
|
||||
propertyCallbacks = propertyCallbacks.slice();
|
||||
for(var i = 0, l = propertyCallbacks.length; i < l; i++){
|
||||
try{
|
||||
propertyCallbacks[i].call(self, name, oldValue, value);
|
||||
}catch(e){
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
notify(callbacks['_' + name]);
|
||||
if(!ignoreCatchall){
|
||||
notify(callbacks["*"]); // the catch-all
|
||||
}
|
||||
}; // we use a function instead of an object so it will be ignored by JSON conversion
|
||||
}
|
||||
if(!callback && typeof name === "function"){
|
||||
callback = name;
|
||||
name = "*";
|
||||
}else{
|
||||
// prepend with dash to prevent name conflicts with function (like "name" property)
|
||||
name = '_' + name;
|
||||
}
|
||||
var propertyCallbacks = callbacks[name];
|
||||
if(typeof propertyCallbacks !== "object"){
|
||||
propertyCallbacks = callbacks[name] = [];
|
||||
}
|
||||
propertyCallbacks.push(callback);
|
||||
return {
|
||||
unwatch: function(){
|
||||
propertyCallbacks.splice(array.indexOf(propertyCallbacks, callback), 1);
|
||||
}
|
||||
}; //Object
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
@@ -1,22 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base"] = true;
|
||||
dojo.provide("dojo._base");
|
||||
dojo.require("dojo._base.lang");
|
||||
dojo.require("dojo._base.array");
|
||||
dojo.require("dojo._base.declare");
|
||||
dojo.require("dojo._base.connect");
|
||||
dojo.require("dojo._base.Deferred");
|
||||
dojo.require("dojo._base.json");
|
||||
dojo.require("dojo._base.Color");
|
||||
dojo.require("dojo._base.browser");
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -4,225 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base.Color"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base.Color"] = true;
|
||||
dojo.provide("dojo._base.Color");
|
||||
dojo.require("dojo._base.array");
|
||||
dojo.require("dojo._base.lang");
|
||||
|
||||
|
||||
(function(){
|
||||
|
||||
var d = dojo;
|
||||
|
||||
dojo.Color = function(/*Array|String|Object*/ color){
|
||||
// summary:
|
||||
// Takes a named string, hex string, array of rgb or rgba values,
|
||||
// an object with r, g, b, and a properties, or another `dojo.Color` object
|
||||
// and creates a new Color instance to work from.
|
||||
//
|
||||
// example:
|
||||
// Work with a Color instance:
|
||||
// | var c = new dojo.Color();
|
||||
// | c.setColor([0,0,0]); // black
|
||||
// | var hex = c.toHex(); // #000000
|
||||
//
|
||||
// example:
|
||||
// Work with a node's color:
|
||||
// | var color = dojo.style("someNode", "backgroundColor");
|
||||
// | var n = new dojo.Color(color);
|
||||
// | // adjust the color some
|
||||
// | n.r *= .5;
|
||||
// | console.log(n.toString()); // rgb(128, 255, 255);
|
||||
if(color){ this.setColor(color); }
|
||||
};
|
||||
|
||||
// FIXME:
|
||||
// there's got to be a more space-efficient way to encode or discover
|
||||
// these!! Use hex?
|
||||
dojo.Color.named = {
|
||||
black: [0,0,0],
|
||||
silver: [192,192,192],
|
||||
gray: [128,128,128],
|
||||
white: [255,255,255],
|
||||
maroon: [128,0,0],
|
||||
red: [255,0,0],
|
||||
purple: [128,0,128],
|
||||
fuchsia: [255,0,255],
|
||||
green: [0,128,0],
|
||||
lime: [0,255,0],
|
||||
olive: [128,128,0],
|
||||
yellow: [255,255,0],
|
||||
navy: [0,0,128],
|
||||
blue: [0,0,255],
|
||||
teal: [0,128,128],
|
||||
aqua: [0,255,255],
|
||||
transparent: d.config.transparentColor || [255,255,255]
|
||||
};
|
||||
|
||||
dojo.extend(dojo.Color, {
|
||||
r: 255, g: 255, b: 255, a: 1,
|
||||
_set: function(r, g, b, a){
|
||||
var t = this; t.r = r; t.g = g; t.b = b; t.a = a;
|
||||
},
|
||||
setColor: function(/*Array|String|Object*/ color){
|
||||
// summary:
|
||||
// Takes a named string, hex string, array of rgb or rgba values,
|
||||
// an object with r, g, b, and a properties, or another `dojo.Color` object
|
||||
// and sets this color instance to that value.
|
||||
//
|
||||
// example:
|
||||
// | var c = new dojo.Color(); // no color
|
||||
// | c.setColor("#ededed"); // greyish
|
||||
if(d.isString(color)){
|
||||
d.colorFromString(color, this);
|
||||
}else if(d.isArray(color)){
|
||||
d.colorFromArray(color, this);
|
||||
}else{
|
||||
this._set(color.r, color.g, color.b, color.a);
|
||||
if(!(color instanceof d.Color)){ this.sanitize(); }
|
||||
}
|
||||
return this; // dojo.Color
|
||||
},
|
||||
sanitize: function(){
|
||||
// summary:
|
||||
// Ensures the object has correct attributes
|
||||
// description:
|
||||
// the default implementation does nothing, include dojo.colors to
|
||||
// augment it with real checks
|
||||
return this; // dojo.Color
|
||||
},
|
||||
toRgb: function(){
|
||||
// summary:
|
||||
// Returns 3 component array of rgb values
|
||||
// example:
|
||||
// | var c = new dojo.Color("#000000");
|
||||
// | console.log(c.toRgb()); // [0,0,0]
|
||||
var t = this;
|
||||
return [t.r, t.g, t.b]; // Array
|
||||
},
|
||||
toRgba: function(){
|
||||
// summary:
|
||||
// Returns a 4 component array of rgba values from the color
|
||||
// represented by this object.
|
||||
var t = this;
|
||||
return [t.r, t.g, t.b, t.a]; // Array
|
||||
},
|
||||
toHex: function(){
|
||||
// summary:
|
||||
// Returns a CSS color string in hexadecimal representation
|
||||
// example:
|
||||
// | console.log(new dojo.Color([0,0,0]).toHex()); // #000000
|
||||
var arr = d.map(["r", "g", "b"], function(x){
|
||||
var s = this[x].toString(16);
|
||||
return s.length < 2 ? "0" + s : s;
|
||||
}, this);
|
||||
return "#" + arr.join(""); // String
|
||||
},
|
||||
toCss: function(/*Boolean?*/ includeAlpha){
|
||||
// summary:
|
||||
// Returns a css color string in rgb(a) representation
|
||||
// example:
|
||||
// | var c = new dojo.Color("#FFF").toCss();
|
||||
// | console.log(c); // rgb('255','255','255')
|
||||
var t = this, rgb = t.r + ", " + t.g + ", " + t.b;
|
||||
return (includeAlpha ? "rgba(" + rgb + ", " + t.a : "rgb(" + rgb) + ")"; // String
|
||||
},
|
||||
toString: function(){
|
||||
// summary:
|
||||
// Returns a visual representation of the color
|
||||
return this.toCss(true); // String
|
||||
}
|
||||
});
|
||||
|
||||
dojo.blendColors = function(
|
||||
/*dojo.Color*/ start,
|
||||
/*dojo.Color*/ end,
|
||||
/*Number*/ weight,
|
||||
/*dojo.Color?*/ obj
|
||||
){
|
||||
// summary:
|
||||
// Blend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend,
|
||||
// can reuse a previously allocated dojo.Color object for the result
|
||||
var t = obj || new d.Color();
|
||||
d.forEach(["r", "g", "b", "a"], function(x){
|
||||
t[x] = start[x] + (end[x] - start[x]) * weight;
|
||||
if(x != "a"){ t[x] = Math.round(t[x]); }
|
||||
});
|
||||
return t.sanitize(); // dojo.Color
|
||||
};
|
||||
|
||||
dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
|
||||
// summary:
|
||||
// Returns a `dojo.Color` instance from a string of the form
|
||||
// "rgb(...)" or "rgba(...)". Optionally accepts a `dojo.Color`
|
||||
// object to update with the parsed value and return instead of
|
||||
// creating a new object.
|
||||
// returns:
|
||||
// A dojo.Color object. If obj is passed, it will be the return value.
|
||||
var m = color.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);
|
||||
return m && dojo.colorFromArray(m[1].split(/\s*,\s*/), obj); // dojo.Color
|
||||
};
|
||||
|
||||
dojo.colorFromHex = function(/*String*/ color, /*dojo.Color?*/ obj){
|
||||
// summary:
|
||||
// Converts a hex string with a '#' prefix to a color object.
|
||||
// Supports 12-bit #rgb shorthand. Optionally accepts a
|
||||
// `dojo.Color` object to update with the parsed value.
|
||||
//
|
||||
// returns:
|
||||
// A dojo.Color object. If obj is passed, it will be the return value.
|
||||
//
|
||||
// example:
|
||||
// | var thing = dojo.colorFromHex("#ededed"); // grey, longhand
|
||||
//
|
||||
// example:
|
||||
// | var thing = dojo.colorFromHex("#000"); // black, shorthand
|
||||
var t = obj || new d.Color(),
|
||||
bits = (color.length == 4) ? 4 : 8,
|
||||
mask = (1 << bits) - 1;
|
||||
color = Number("0x" + color.substr(1));
|
||||
if(isNaN(color)){
|
||||
return null; // dojo.Color
|
||||
}
|
||||
d.forEach(["b", "g", "r"], function(x){
|
||||
var c = color & mask;
|
||||
color >>= bits;
|
||||
t[x] = bits == 4 ? 17 * c : c;
|
||||
});
|
||||
t.a = 1;
|
||||
return t; // dojo.Color
|
||||
};
|
||||
|
||||
dojo.colorFromArray = function(/*Array*/ a, /*dojo.Color?*/ obj){
|
||||
// summary:
|
||||
// Builds a `dojo.Color` from a 3 or 4 element array, mapping each
|
||||
// element in sequence to the rgb(a) values of the color.
|
||||
// example:
|
||||
// | var myColor = dojo.colorFromArray([237,237,237,0.5]); // grey, 50% alpha
|
||||
// returns:
|
||||
// A dojo.Color object. If obj is passed, it will be the return value.
|
||||
var t = obj || new d.Color();
|
||||
t._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3]));
|
||||
if(isNaN(t.a)){ t.a = 1; }
|
||||
return t.sanitize(); // dojo.Color
|
||||
};
|
||||
|
||||
dojo.colorFromString = function(/*String*/ str, /*dojo.Color?*/ obj){
|
||||
// summary:
|
||||
// Parses `str` for a color value. Accepts hex, rgb, and rgba
|
||||
// style color values.
|
||||
// description:
|
||||
// Acceptable input values for str may include arrays of any form
|
||||
// accepted by dojo.colorFromArray, hex strings such as "#aaaaaa", or
|
||||
// rgb or rgba strings such as "rgb(133, 200, 16)" or "rgba(10, 10,
|
||||
// 10, 50)"
|
||||
// returns:
|
||||
// A dojo.Color object. If obj is passed, it will be the return value.
|
||||
var a = d.Color.named[str];
|
||||
return a && d.colorFromArray(a, obj) || d.colorFromRgb(str, obj) || d.colorFromHex(str, obj);
|
||||
};
|
||||
})();
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/_base/Color",["./kernel","./lang","./array","./config"],function(_1,_2,_3,_4){var _5=_1.Color=function(_6){if(_6){this.setColor(_6);}};_5.named={"black":[0,0,0],"silver":[192,192,192],"gray":[128,128,128],"white":[255,255,255],"maroon":[128,0,0],"red":[255,0,0],"purple":[128,0,128],"fuchsia":[255,0,255],"green":[0,128,0],"lime":[0,255,0],"olive":[128,128,0],"yellow":[255,255,0],"navy":[0,0,128],"blue":[0,0,255],"teal":[0,128,128],"aqua":[0,255,255],"transparent":_4.transparentColor||[0,0,0,0]};_2.extend(_5,{r:255,g:255,b:255,a:1,_set:function(r,g,b,a){var t=this;t.r=r;t.g=g;t.b=b;t.a=a;},setColor:function(_7){if(_2.isString(_7)){_5.fromString(_7,this);}else{if(_2.isArray(_7)){_5.fromArray(_7,this);}else{this._set(_7.r,_7.g,_7.b,_7.a);if(!(_7 instanceof _5)){this.sanitize();}}}return this;},sanitize:function(){return this;},toRgb:function(){var t=this;return [t.r,t.g,t.b];},toRgba:function(){var t=this;return [t.r,t.g,t.b,t.a];},toHex:function(){var _8=_3.map(["r","g","b"],function(x){var s=this[x].toString(16);return s.length<2?"0"+s:s;},this);return "#"+_8.join("");},toCss:function(_9){var t=this,_a=t.r+", "+t.g+", "+t.b;return (_9?"rgba("+_a+", "+t.a:"rgb("+_a)+")";},toString:function(){return this.toCss(true);}});_5.blendColors=_1.blendColors=function(_b,_c,_d,_e){var t=_e||new _5();_3.forEach(["r","g","b","a"],function(x){t[x]=_b[x]+(_c[x]-_b[x])*_d;if(x!="a"){t[x]=Math.round(t[x]);}});return t.sanitize();};_5.fromRgb=_1.colorFromRgb=function(_f,obj){var m=_f.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);return m&&_5.fromArray(m[1].split(/\s*,\s*/),obj);};_5.fromHex=_1.colorFromHex=function(_10,obj){var t=obj||new _5(),_11=(_10.length==4)?4:8,_12=(1<<_11)-1;_10=Number("0x"+_10.substr(1));if(isNaN(_10)){return null;}_3.forEach(["b","g","r"],function(x){var c=_10&_12;_10>>=_11;t[x]=_11==4?17*c:c;});t.a=1;return t;};_5.fromArray=_1.colorFromArray=function(a,obj){var t=obj||new _5();t._set(Number(a[0]),Number(a[1]),Number(a[2]),Number(a[3]));if(isNaN(t.a)){t.a=1;}return t.sanitize();};_5.fromString=_1.colorFromString=function(str,obj){var a=_5.named[str];return a&&_5.fromArray(a,obj)||_5.fromRgb(str,obj)||_5.fromHex(str,obj);};return _5;});
|
||||
220
lib/dojo/_base/Color.js.uncompressed.js
Normal file
220
lib/dojo/_base/Color.js.uncompressed.js
Normal file
@@ -0,0 +1,220 @@
|
||||
define("dojo/_base/Color", ["./kernel", "./lang", "./array", "./config"], function(dojo, lang, ArrayUtil, config){
|
||||
|
||||
var Color = dojo.Color = function(/*Array|String|Object*/ color){
|
||||
// summary:
|
||||
// Takes a named string, hex string, array of rgb or rgba values,
|
||||
// an object with r, g, b, and a properties, or another `dojo.Color` object
|
||||
// and creates a new Color instance to work from.
|
||||
//
|
||||
// example:
|
||||
// Work with a Color instance:
|
||||
// | var c = new dojo.Color();
|
||||
// | c.setColor([0,0,0]); // black
|
||||
// | var hex = c.toHex(); // #000000
|
||||
//
|
||||
// example:
|
||||
// Work with a node's color:
|
||||
// | var color = dojo.style("someNode", "backgroundColor");
|
||||
// | var n = new dojo.Color(color);
|
||||
// | // adjust the color some
|
||||
// | n.r *= .5;
|
||||
// | console.log(n.toString()); // rgb(128, 255, 255);
|
||||
if(color){ this.setColor(color); }
|
||||
};
|
||||
|
||||
/*=====
|
||||
lang.mixin(dojo.Color,{
|
||||
named:{
|
||||
// summary: Dictionary list of all CSS named colors, by name. Values are 3-item arrays with corresponding RG and B values.
|
||||
}
|
||||
});
|
||||
=====*/
|
||||
|
||||
// FIXME:
|
||||
// there's got to be a more space-efficient way to encode or discover
|
||||
// these!! Use hex?
|
||||
Color.named = {
|
||||
"black": [0,0,0],
|
||||
"silver": [192,192,192],
|
||||
"gray": [128,128,128],
|
||||
"white": [255,255,255],
|
||||
"maroon": [128,0,0],
|
||||
"red": [255,0,0],
|
||||
"purple": [128,0,128],
|
||||
"fuchsia":[255,0,255],
|
||||
"green": [0,128,0],
|
||||
"lime": [0,255,0],
|
||||
"olive": [128,128,0],
|
||||
"yellow": [255,255,0],
|
||||
"navy": [0,0,128],
|
||||
"blue": [0,0,255],
|
||||
"teal": [0,128,128],
|
||||
"aqua": [0,255,255],
|
||||
"transparent": config.transparentColor || [0,0,0,0]
|
||||
};
|
||||
|
||||
lang.extend(Color, {
|
||||
r: 255, g: 255, b: 255, a: 1,
|
||||
_set: function(r, g, b, a){
|
||||
var t = this; t.r = r; t.g = g; t.b = b; t.a = a;
|
||||
},
|
||||
setColor: function(/*Array|String|Object*/ color){
|
||||
// summary:
|
||||
// Takes a named string, hex string, array of rgb or rgba values,
|
||||
// an object with r, g, b, and a properties, or another `dojo.Color` object
|
||||
// and sets this color instance to that value.
|
||||
//
|
||||
// example:
|
||||
// | var c = new dojo.Color(); // no color
|
||||
// | c.setColor("#ededed"); // greyish
|
||||
if(lang.isString(color)){
|
||||
Color.fromString(color, this);
|
||||
}else if(lang.isArray(color)){
|
||||
Color.fromArray(color, this);
|
||||
}else{
|
||||
this._set(color.r, color.g, color.b, color.a);
|
||||
if(!(color instanceof Color)){ this.sanitize(); }
|
||||
}
|
||||
return this; // dojo.Color
|
||||
},
|
||||
sanitize: function(){
|
||||
// summary:
|
||||
// Ensures the object has correct attributes
|
||||
// description:
|
||||
// the default implementation does nothing, include dojo.colors to
|
||||
// augment it with real checks
|
||||
return this; // dojo.Color
|
||||
},
|
||||
toRgb: function(){
|
||||
// summary:
|
||||
// Returns 3 component array of rgb values
|
||||
// example:
|
||||
// | var c = new dojo.Color("#000000");
|
||||
// | console.log(c.toRgb()); // [0,0,0]
|
||||
var t = this;
|
||||
return [t.r, t.g, t.b]; // Array
|
||||
},
|
||||
toRgba: function(){
|
||||
// summary:
|
||||
// Returns a 4 component array of rgba values from the color
|
||||
// represented by this object.
|
||||
var t = this;
|
||||
return [t.r, t.g, t.b, t.a]; // Array
|
||||
},
|
||||
toHex: function(){
|
||||
// summary:
|
||||
// Returns a CSS color string in hexadecimal representation
|
||||
// example:
|
||||
// | console.log(new dojo.Color([0,0,0]).toHex()); // #000000
|
||||
var arr = ArrayUtil.map(["r", "g", "b"], function(x){
|
||||
var s = this[x].toString(16);
|
||||
return s.length < 2 ? "0" + s : s;
|
||||
}, this);
|
||||
return "#" + arr.join(""); // String
|
||||
},
|
||||
toCss: function(/*Boolean?*/ includeAlpha){
|
||||
// summary:
|
||||
// Returns a css color string in rgb(a) representation
|
||||
// example:
|
||||
// | var c = new dojo.Color("#FFF").toCss();
|
||||
// | console.log(c); // rgb('255','255','255')
|
||||
var t = this, rgb = t.r + ", " + t.g + ", " + t.b;
|
||||
return (includeAlpha ? "rgba(" + rgb + ", " + t.a : "rgb(" + rgb) + ")"; // String
|
||||
},
|
||||
toString: function(){
|
||||
// summary:
|
||||
// Returns a visual representation of the color
|
||||
return this.toCss(true); // String
|
||||
}
|
||||
});
|
||||
|
||||
Color.blendColors = dojo.blendColors = function(
|
||||
/*dojo.Color*/ start,
|
||||
/*dojo.Color*/ end,
|
||||
/*Number*/ weight,
|
||||
/*dojo.Color?*/ obj
|
||||
){
|
||||
// summary:
|
||||
// Blend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend,
|
||||
// can reuse a previously allocated dojo.Color object for the result
|
||||
var t = obj || new Color();
|
||||
ArrayUtil.forEach(["r", "g", "b", "a"], function(x){
|
||||
t[x] = start[x] + (end[x] - start[x]) * weight;
|
||||
if(x != "a"){ t[x] = Math.round(t[x]); }
|
||||
});
|
||||
return t.sanitize(); // dojo.Color
|
||||
};
|
||||
|
||||
Color.fromRgb = dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
|
||||
// summary:
|
||||
// Returns a `dojo.Color` instance from a string of the form
|
||||
// "rgb(...)" or "rgba(...)". Optionally accepts a `dojo.Color`
|
||||
// object to update with the parsed value and return instead of
|
||||
// creating a new object.
|
||||
// returns:
|
||||
// A dojo.Color object. If obj is passed, it will be the return value.
|
||||
var m = color.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);
|
||||
return m && Color.fromArray(m[1].split(/\s*,\s*/), obj); // dojo.Color
|
||||
};
|
||||
|
||||
Color.fromHex = dojo.colorFromHex = function(/*String*/ color, /*dojo.Color?*/ obj){
|
||||
// summary:
|
||||
// Converts a hex string with a '#' prefix to a color object.
|
||||
// Supports 12-bit #rgb shorthand. Optionally accepts a
|
||||
// `dojo.Color` object to update with the parsed value.
|
||||
//
|
||||
// returns:
|
||||
// A dojo.Color object. If obj is passed, it will be the return value.
|
||||
//
|
||||
// example:
|
||||
// | var thing = dojo.colorFromHex("#ededed"); // grey, longhand
|
||||
//
|
||||
// example:
|
||||
// | var thing = dojo.colorFromHex("#000"); // black, shorthand
|
||||
var t = obj || new Color(),
|
||||
bits = (color.length == 4) ? 4 : 8,
|
||||
mask = (1 << bits) - 1;
|
||||
color = Number("0x" + color.substr(1));
|
||||
if(isNaN(color)){
|
||||
return null; // dojo.Color
|
||||
}
|
||||
ArrayUtil.forEach(["b", "g", "r"], function(x){
|
||||
var c = color & mask;
|
||||
color >>= bits;
|
||||
t[x] = bits == 4 ? 17 * c : c;
|
||||
});
|
||||
t.a = 1;
|
||||
return t; // dojo.Color
|
||||
};
|
||||
|
||||
Color.fromArray = dojo.colorFromArray = function(/*Array*/ a, /*dojo.Color?*/ obj){
|
||||
// summary:
|
||||
// Builds a `dojo.Color` from a 3 or 4 element array, mapping each
|
||||
// element in sequence to the rgb(a) values of the color.
|
||||
// example:
|
||||
// | var myColor = dojo.colorFromArray([237,237,237,0.5]); // grey, 50% alpha
|
||||
// returns:
|
||||
// A dojo.Color object. If obj is passed, it will be the return value.
|
||||
var t = obj || new Color();
|
||||
t._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3]));
|
||||
if(isNaN(t.a)){ t.a = 1; }
|
||||
return t.sanitize(); // dojo.Color
|
||||
};
|
||||
|
||||
Color.fromString = dojo.colorFromString = function(/*String*/ str, /*dojo.Color?*/ obj){
|
||||
// summary:
|
||||
// Parses `str` for a color value. Accepts hex, rgb, and rgba
|
||||
// style color values.
|
||||
// description:
|
||||
// Acceptable input values for str may include arrays of any form
|
||||
// accepted by dojo.colorFromArray, hex strings such as "#aaaaaa", or
|
||||
// rgb or rgba strings such as "rgb(133, 200, 16)" or "rgba(10, 10,
|
||||
// 10, 50)"
|
||||
// returns:
|
||||
// A dojo.Color object. If obj is passed, it will be the return value.
|
||||
var a = Color.named[str];
|
||||
return a && Color.fromArray(a, obj) || Color.fromRgb(str, obj) || Color.fromHex(str, obj); // dojo.Color
|
||||
};
|
||||
|
||||
return Color;
|
||||
});
|
||||
@@ -4,343 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base.Deferred"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base.Deferred"] = true;
|
||||
dojo.provide("dojo._base.Deferred");
|
||||
dojo.require("dojo._base.lang");
|
||||
|
||||
|
||||
(function(){
|
||||
var mutator = function(){};
|
||||
var freeze = Object.freeze || function(){};
|
||||
// A deferred provides an API for creating and resolving a promise.
|
||||
dojo.Deferred = function(/*Function?*/canceller){
|
||||
// summary:
|
||||
// Deferreds provide a generic means for encapsulating an asynchronous
|
||||
// operation and notifying users of the completion and result of the operation.
|
||||
// description:
|
||||
// The dojo.Deferred API is based on the concept of promises that provide a
|
||||
// generic interface into the eventual completion of an asynchronous action.
|
||||
// The motivation for promises fundamentally is about creating a
|
||||
// separation of concerns that allows one to achieve the same type of
|
||||
// call patterns and logical data flow in asynchronous code as can be
|
||||
// achieved in synchronous code. Promises allows one
|
||||
// to be able to call a function purely with arguments needed for
|
||||
// execution, without conflating the call with concerns of whether it is
|
||||
// sync or async. One shouldn't need to alter a call's arguments if the
|
||||
// implementation switches from sync to async (or vice versa). By having
|
||||
// async functions return promises, the concerns of making the call are
|
||||
// separated from the concerns of asynchronous interaction (which are
|
||||
// handled by the promise).
|
||||
//
|
||||
// The dojo.Deferred is a type of promise that provides methods for fulfilling the
|
||||
// promise with a successful result or an error. The most important method for
|
||||
// working with Dojo's promises is the then() method, which follows the
|
||||
// CommonJS proposed promise API. An example of using a Dojo promise:
|
||||
//
|
||||
// | var resultingPromise = someAsyncOperation.then(function(result){
|
||||
// | ... handle result ...
|
||||
// | },
|
||||
// | function(error){
|
||||
// | ... handle error ...
|
||||
// | });
|
||||
//
|
||||
// The .then() call returns a new promise that represents the result of the
|
||||
// execution of the callback. The callbacks will never affect the original promises value.
|
||||
//
|
||||
// The dojo.Deferred instances also provide the following functions for backwards compatibility:
|
||||
//
|
||||
// * addCallback(handler)
|
||||
// * addErrback(handler)
|
||||
// * callback(result)
|
||||
// * errback(result)
|
||||
//
|
||||
// Callbacks are allowed to return promises themselves, so
|
||||
// you can build complicated sequences of events with ease.
|
||||
//
|
||||
// The creator of the Deferred may specify a canceller. The canceller
|
||||
// is a function that will be called if Deferred.cancel is called
|
||||
// before the Deferred fires. You can use this to implement clean
|
||||
// aborting of an XMLHttpRequest, etc. Note that cancel will fire the
|
||||
// deferred with a CancelledError (unless your canceller returns
|
||||
// another kind of error), so the errbacks should be prepared to
|
||||
// handle that error for cancellable Deferreds.
|
||||
// example:
|
||||
// | var deferred = new dojo.Deferred();
|
||||
// | setTimeout(function(){ deferred.callback({success: true}); }, 1000);
|
||||
// | return deferred;
|
||||
// example:
|
||||
// Deferred objects are often used when making code asynchronous. It
|
||||
// may be easiest to write functions in a synchronous manner and then
|
||||
// split code using a deferred to trigger a response to a long-lived
|
||||
// operation. For example, instead of register a callback function to
|
||||
// denote when a rendering operation completes, the function can
|
||||
// simply return a deferred:
|
||||
//
|
||||
// | // callback style:
|
||||
// | function renderLotsOfData(data, callback){
|
||||
// | var success = false
|
||||
// | try{
|
||||
// | for(var x in data){
|
||||
// | renderDataitem(data[x]);
|
||||
// | }
|
||||
// | success = true;
|
||||
// | }catch(e){ }
|
||||
// | if(callback){
|
||||
// | callback(success);
|
||||
// | }
|
||||
// | }
|
||||
//
|
||||
// | // using callback style
|
||||
// | renderLotsOfData(someDataObj, function(success){
|
||||
// | // handles success or failure
|
||||
// | if(!success){
|
||||
// | promptUserToRecover();
|
||||
// | }
|
||||
// | });
|
||||
// | // NOTE: no way to add another callback here!!
|
||||
// example:
|
||||
// Using a Deferred doesn't simplify the sending code any, but it
|
||||
// provides a standard interface for callers and senders alike,
|
||||
// providing both with a simple way to service multiple callbacks for
|
||||
// an operation and freeing both sides from worrying about details
|
||||
// such as "did this get called already?". With Deferreds, new
|
||||
// callbacks can be added at any time.
|
||||
//
|
||||
// | // Deferred style:
|
||||
// | function renderLotsOfData(data){
|
||||
// | var d = new dojo.Deferred();
|
||||
// | try{
|
||||
// | for(var x in data){
|
||||
// | renderDataitem(data[x]);
|
||||
// | }
|
||||
// | d.callback(true);
|
||||
// | }catch(e){
|
||||
// | d.errback(new Error("rendering failed"));
|
||||
// | }
|
||||
// | return d;
|
||||
// | }
|
||||
//
|
||||
// | // using Deferred style
|
||||
// | renderLotsOfData(someDataObj).then(null, function(){
|
||||
// | promptUserToRecover();
|
||||
// | });
|
||||
// | // NOTE: addErrback and addCallback both return the Deferred
|
||||
// | // again, so we could chain adding callbacks or save the
|
||||
// | // deferred for later should we need to be notified again.
|
||||
// example:
|
||||
// In this example, renderLotsOfData is synchronous and so both
|
||||
// versions are pretty artificial. Putting the data display on a
|
||||
// timeout helps show why Deferreds rock:
|
||||
//
|
||||
// | // Deferred style and async func
|
||||
// | function renderLotsOfData(data){
|
||||
// | var d = new dojo.Deferred();
|
||||
// | setTimeout(function(){
|
||||
// | try{
|
||||
// | for(var x in data){
|
||||
// | renderDataitem(data[x]);
|
||||
// | }
|
||||
// | d.callback(true);
|
||||
// | }catch(e){
|
||||
// | d.errback(new Error("rendering failed"));
|
||||
// | }
|
||||
// | }, 100);
|
||||
// | return d;
|
||||
// | }
|
||||
//
|
||||
// | // using Deferred style
|
||||
// | renderLotsOfData(someDataObj).then(null, function(){
|
||||
// | promptUserToRecover();
|
||||
// | });
|
||||
//
|
||||
// Note that the caller doesn't have to change his code at all to
|
||||
// handle the asynchronous case.
|
||||
var result, finished, isError, head, nextListener;
|
||||
var promise = (this.promise = {});
|
||||
|
||||
function complete(value){
|
||||
if(finished){
|
||||
throw new Error("This deferred has already been resolved");
|
||||
}
|
||||
result = value;
|
||||
finished = true;
|
||||
notify();
|
||||
}
|
||||
function notify(){
|
||||
var mutated;
|
||||
while(!mutated && nextListener){
|
||||
var listener = nextListener;
|
||||
nextListener = nextListener.next;
|
||||
if((mutated = (listener.progress == mutator))){ // assignment and check
|
||||
finished = false;
|
||||
}
|
||||
var func = (isError ? listener.error : listener.resolved);
|
||||
if (func) {
|
||||
try {
|
||||
var newResult = func(result);
|
||||
if (newResult && typeof newResult.then === "function") {
|
||||
newResult.then(dojo.hitch(listener.deferred, "resolve"), dojo.hitch(listener.deferred, "reject"));
|
||||
continue;
|
||||
}
|
||||
var unchanged = mutated && newResult === undefined;
|
||||
if(mutated && !unchanged){
|
||||
isError = newResult instanceof Error;
|
||||
}
|
||||
listener.deferred[unchanged && isError ? "reject" : "resolve"](unchanged ? result : newResult);
|
||||
}
|
||||
catch (e) {
|
||||
listener.deferred.reject(e);
|
||||
}
|
||||
}else {
|
||||
if(isError){
|
||||
listener.deferred.reject(result);
|
||||
}else{
|
||||
listener.deferred.resolve(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// calling resolve will resolve the promise
|
||||
this.resolve = this.callback = function(value){
|
||||
// summary:
|
||||
// Fulfills the Deferred instance successfully with the provide value
|
||||
this.fired = 0;
|
||||
this.results = [value, null];
|
||||
complete(value);
|
||||
};
|
||||
|
||||
|
||||
// calling error will indicate that the promise failed
|
||||
this.reject = this.errback = function(error){
|
||||
// summary:
|
||||
// Fulfills the Deferred instance as an error with the provided error
|
||||
isError = true;
|
||||
this.fired = 1;
|
||||
complete(error);
|
||||
this.results = [null, error];
|
||||
if(!error || error.log !== false){
|
||||
(dojo.config.deferredOnError || function(x){ console.error(x); })(error);
|
||||
}
|
||||
};
|
||||
// call progress to provide updates on the progress on the completion of the promise
|
||||
this.progress = function(update){
|
||||
// summary
|
||||
// Send progress events to all listeners
|
||||
var listener = nextListener;
|
||||
while(listener){
|
||||
var progress = listener.progress;
|
||||
progress && progress(update);
|
||||
listener = listener.next;
|
||||
}
|
||||
};
|
||||
this.addCallbacks = function(/*Function?*/callback, /*Function?*/errback){
|
||||
this.then(callback, errback, mutator);
|
||||
return this;
|
||||
};
|
||||
// provide the implementation of the promise
|
||||
this.then = promise.then = function(/*Function?*/resolvedCallback, /*Function?*/errorCallback, /*Function?*/progressCallback){
|
||||
// summary:
|
||||
// Adds a fulfilledHandler, errorHandler, and progressHandler to be called for
|
||||
// completion of a promise. The fulfilledHandler is called when the promise
|
||||
// is fulfilled. The errorHandler is called when a promise fails. The
|
||||
// progressHandler is called for progress events. All arguments are optional
|
||||
// and non-function values are ignored. The progressHandler is not only an
|
||||
// optional argument, but progress events are purely optional. Promise
|
||||
// providers are not required to ever create progress events.
|
||||
//
|
||||
// This function will return a new promise that is fulfilled when the given
|
||||
// fulfilledHandler or errorHandler callback is finished. This allows promise
|
||||
// operations to be chained together. The value returned from the callback
|
||||
// handler is the fulfillment value for the returned promise. If the callback
|
||||
// throws an error, the returned promise will be moved to failed state.
|
||||
//
|
||||
// example:
|
||||
// An example of using a CommonJS compliant promise:
|
||||
// | asyncComputeTheAnswerToEverything().
|
||||
// | then(addTwo).
|
||||
// | then(printResult, onError);
|
||||
// | >44
|
||||
//
|
||||
var returnDeferred = progressCallback == mutator ? this : new dojo.Deferred(promise.cancel);
|
||||
var listener = {
|
||||
resolved: resolvedCallback,
|
||||
error: errorCallback,
|
||||
progress: progressCallback,
|
||||
deferred: returnDeferred
|
||||
};
|
||||
if(nextListener){
|
||||
head = head.next = listener;
|
||||
}
|
||||
else{
|
||||
nextListener = head = listener;
|
||||
}
|
||||
if(finished){
|
||||
notify();
|
||||
}
|
||||
return returnDeferred.promise;
|
||||
};
|
||||
var deferred = this;
|
||||
this.cancel = promise.cancel = function () {
|
||||
// summary:
|
||||
// Cancels the asynchronous operation
|
||||
if(!finished){
|
||||
var error = canceller && canceller(deferred);
|
||||
if(!finished){
|
||||
if (!(error instanceof Error)) {
|
||||
error = new Error(error);
|
||||
}
|
||||
error.log = false;
|
||||
deferred.reject(error);
|
||||
}
|
||||
}
|
||||
};
|
||||
freeze(promise);
|
||||
};
|
||||
dojo.extend(dojo.Deferred, {
|
||||
addCallback: function (/*Function*/callback) {
|
||||
return this.addCallbacks(dojo.hitch.apply(dojo, arguments));
|
||||
},
|
||||
|
||||
addErrback: function (/*Function*/errback) {
|
||||
return this.addCallbacks(null, dojo.hitch.apply(dojo, arguments));
|
||||
},
|
||||
|
||||
addBoth: function (/*Function*/callback) {
|
||||
var enclosed = dojo.hitch.apply(dojo, arguments);
|
||||
return this.addCallbacks(enclosed, enclosed);
|
||||
},
|
||||
fired: -1
|
||||
});
|
||||
})();
|
||||
dojo.when = function(promiseOrValue, /*Function?*/callback, /*Function?*/errback, /*Function?*/progressHandler){
|
||||
// summary:
|
||||
// This provides normalization between normal synchronous values and
|
||||
// asynchronous promises, so you can interact with them in a common way
|
||||
// example:
|
||||
// | function printFirstAndList(items){
|
||||
// | dojo.when(findFirst(items), console.log);
|
||||
// | dojo.when(findLast(items), console.log);
|
||||
// | }
|
||||
// | function findFirst(items){
|
||||
// | return dojo.when(items, function(items){
|
||||
// | return items[0];
|
||||
// | });
|
||||
// | }
|
||||
// | function findLast(items){
|
||||
// | return dojo.when(items, function(items){
|
||||
// | return items[items.length];
|
||||
// | });
|
||||
// | }
|
||||
// And now all three of his functions can be used sync or async.
|
||||
// | printFirstAndLast([1,2,3,4]) will work just as well as
|
||||
// | printFirstAndLast(dojo.xhrGet(...));
|
||||
|
||||
if(promiseOrValue && typeof promiseOrValue.then === "function"){
|
||||
return promiseOrValue.then(callback, errback, progressHandler);
|
||||
}
|
||||
return callback(promiseOrValue);
|
||||
};
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/_base/Deferred",["./kernel","./lang"],function(_1,_2){var _3=function(){};var _4=Object.freeze||function(){};_1.Deferred=function(_5){var _6,_7,_8,_9,_a;var _b=(this.promise={});function _c(_d){if(_7){throw new Error("This deferred has already been resolved");}_6=_d;_7=true;_e();};function _e(){var _f;while(!_f&&_a){var _10=_a;_a=_a.next;if((_f=(_10.progress==_3))){_7=false;}var _11=(_8?_10.error:_10.resolved);if(_11){try{var _12=_11(_6);if(_12&&typeof _12.then==="function"){_12.then(_2.hitch(_10.deferred,"resolve"),_2.hitch(_10.deferred,"reject"),_2.hitch(_10.deferred,"progress"));continue;}var _13=_f&&_12===undefined;if(_f&&!_13){_8=_12 instanceof Error;}_10.deferred[_13&&_8?"reject":"resolve"](_13?_6:_12);}catch(e){_10.deferred.reject(e);}}else{if(_8){_10.deferred.reject(_6);}else{_10.deferred.resolve(_6);}}}};this.resolve=this.callback=function(_14){this.fired=0;this.results=[_14,null];_c(_14);};this.reject=this.errback=function(_15){_8=true;this.fired=1;_c(_15);this.results=[null,_15];if(!_15||_15.log!==false){(_1.config.deferredOnError||function(x){console.error(x);})(_15);}};this.progress=function(_16){var _17=_a;while(_17){var _18=_17.progress;_18&&_18(_16);_17=_17.next;}};this.addCallbacks=function(_19,_1a){this.then(_19,_1a,_3);return this;};_b.then=this.then=function(_1b,_1c,_1d){var _1e=_1d==_3?this:new _1.Deferred(_b.cancel);var _1f={resolved:_1b,error:_1c,progress:_1d,deferred:_1e};if(_a){_9=_9.next=_1f;}else{_a=_9=_1f;}if(_7){_e();}return _1e.promise;};var _20=this;_b.cancel=this.cancel=function(){if(!_7){var _21=_5&&_5(_20);if(!_7){if(!(_21 instanceof Error)){_21=new Error(_21);}_21.log=false;_20.reject(_21);}}};_4(_b);};_2.extend(_1.Deferred,{addCallback:function(_22){return this.addCallbacks(_2.hitch.apply(_1,arguments));},addErrback:function(_23){return this.addCallbacks(null,_2.hitch.apply(_1,arguments));},addBoth:function(_24){var _25=_2.hitch.apply(_1,arguments);return this.addCallbacks(_25,_25);},fired:-1});_1.Deferred.when=_1.when=function(_26,_27,_28,_29){if(_26&&typeof _26.then==="function"){return _26.then(_27,_28,_29);}return _27?_27(_26):_26;};return _1.Deferred;});
|
||||
366
lib/dojo/_base/Deferred.js.uncompressed.js
Normal file
366
lib/dojo/_base/Deferred.js.uncompressed.js
Normal file
@@ -0,0 +1,366 @@
|
||||
define("dojo/_base/Deferred", ["./kernel", "./lang"], function(dojo, lang){
|
||||
// module:
|
||||
// dojo/_base/Deferred
|
||||
// summary:
|
||||
// This module defines dojo.Deferred.
|
||||
|
||||
var mutator = function(){};
|
||||
var freeze = Object.freeze || function(){};
|
||||
// A deferred provides an API for creating and resolving a promise.
|
||||
dojo.Deferred = function(/*Function?*/ canceller){
|
||||
// summary:
|
||||
// Deferreds provide a generic means for encapsulating an asynchronous
|
||||
// operation and notifying users of the completion and result of the operation.
|
||||
// description:
|
||||
// The dojo.Deferred API is based on the concept of promises that provide a
|
||||
// generic interface into the eventual completion of an asynchronous action.
|
||||
// The motivation for promises fundamentally is about creating a
|
||||
// separation of concerns that allows one to achieve the same type of
|
||||
// call patterns and logical data flow in asynchronous code as can be
|
||||
// achieved in synchronous code. Promises allows one
|
||||
// to be able to call a function purely with arguments needed for
|
||||
// execution, without conflating the call with concerns of whether it is
|
||||
// sync or async. One shouldn't need to alter a call's arguments if the
|
||||
// implementation switches from sync to async (or vice versa). By having
|
||||
// async functions return promises, the concerns of making the call are
|
||||
// separated from the concerns of asynchronous interaction (which are
|
||||
// handled by the promise).
|
||||
//
|
||||
// The dojo.Deferred is a type of promise that provides methods for fulfilling the
|
||||
// promise with a successful result or an error. The most important method for
|
||||
// working with Dojo's promises is the then() method, which follows the
|
||||
// CommonJS proposed promise API. An example of using a Dojo promise:
|
||||
//
|
||||
// | var resultingPromise = someAsyncOperation.then(function(result){
|
||||
// | ... handle result ...
|
||||
// | },
|
||||
// | function(error){
|
||||
// | ... handle error ...
|
||||
// | });
|
||||
//
|
||||
// The .then() call returns a new promise that represents the result of the
|
||||
// execution of the callback. The callbacks will never affect the original promises value.
|
||||
//
|
||||
// The dojo.Deferred instances also provide the following functions for backwards compatibility:
|
||||
//
|
||||
// * addCallback(handler)
|
||||
// * addErrback(handler)
|
||||
// * callback(result)
|
||||
// * errback(result)
|
||||
//
|
||||
// Callbacks are allowed to return promises themselves, so
|
||||
// you can build complicated sequences of events with ease.
|
||||
//
|
||||
// The creator of the Deferred may specify a canceller. The canceller
|
||||
// is a function that will be called if Deferred.cancel is called
|
||||
// before the Deferred fires. You can use this to implement clean
|
||||
// aborting of an XMLHttpRequest, etc. Note that cancel will fire the
|
||||
// deferred with a CancelledError (unless your canceller returns
|
||||
// another kind of error), so the errbacks should be prepared to
|
||||
// handle that error for cancellable Deferreds.
|
||||
// example:
|
||||
// | var deferred = new dojo.Deferred();
|
||||
// | setTimeout(function(){ deferred.callback({success: true}); }, 1000);
|
||||
// | return deferred;
|
||||
// example:
|
||||
// Deferred objects are often used when making code asynchronous. It
|
||||
// may be easiest to write functions in a synchronous manner and then
|
||||
// split code using a deferred to trigger a response to a long-lived
|
||||
// operation. For example, instead of register a callback function to
|
||||
// denote when a rendering operation completes, the function can
|
||||
// simply return a deferred:
|
||||
//
|
||||
// | // callback style:
|
||||
// | function renderLotsOfData(data, callback){
|
||||
// | var success = false
|
||||
// | try{
|
||||
// | for(var x in data){
|
||||
// | renderDataitem(data[x]);
|
||||
// | }
|
||||
// | success = true;
|
||||
// | }catch(e){ }
|
||||
// | if(callback){
|
||||
// | callback(success);
|
||||
// | }
|
||||
// | }
|
||||
//
|
||||
// | // using callback style
|
||||
// | renderLotsOfData(someDataObj, function(success){
|
||||
// | // handles success or failure
|
||||
// | if(!success){
|
||||
// | promptUserToRecover();
|
||||
// | }
|
||||
// | });
|
||||
// | // NOTE: no way to add another callback here!!
|
||||
// example:
|
||||
// Using a Deferred doesn't simplify the sending code any, but it
|
||||
// provides a standard interface for callers and senders alike,
|
||||
// providing both with a simple way to service multiple callbacks for
|
||||
// an operation and freeing both sides from worrying about details
|
||||
// such as "did this get called already?". With Deferreds, new
|
||||
// callbacks can be added at any time.
|
||||
//
|
||||
// | // Deferred style:
|
||||
// | function renderLotsOfData(data){
|
||||
// | var d = new dojo.Deferred();
|
||||
// | try{
|
||||
// | for(var x in data){
|
||||
// | renderDataitem(data[x]);
|
||||
// | }
|
||||
// | d.callback(true);
|
||||
// | }catch(e){
|
||||
// | d.errback(new Error("rendering failed"));
|
||||
// | }
|
||||
// | return d;
|
||||
// | }
|
||||
//
|
||||
// | // using Deferred style
|
||||
// | renderLotsOfData(someDataObj).then(null, function(){
|
||||
// | promptUserToRecover();
|
||||
// | });
|
||||
// | // NOTE: addErrback and addCallback both return the Deferred
|
||||
// | // again, so we could chain adding callbacks or save the
|
||||
// | // deferred for later should we need to be notified again.
|
||||
// example:
|
||||
// In this example, renderLotsOfData is synchronous and so both
|
||||
// versions are pretty artificial. Putting the data display on a
|
||||
// timeout helps show why Deferreds rock:
|
||||
//
|
||||
// | // Deferred style and async func
|
||||
// | function renderLotsOfData(data){
|
||||
// | var d = new dojo.Deferred();
|
||||
// | setTimeout(function(){
|
||||
// | try{
|
||||
// | for(var x in data){
|
||||
// | renderDataitem(data[x]);
|
||||
// | }
|
||||
// | d.callback(true);
|
||||
// | }catch(e){
|
||||
// | d.errback(new Error("rendering failed"));
|
||||
// | }
|
||||
// | }, 100);
|
||||
// | return d;
|
||||
// | }
|
||||
//
|
||||
// | // using Deferred style
|
||||
// | renderLotsOfData(someDataObj).then(null, function(){
|
||||
// | promptUserToRecover();
|
||||
// | });
|
||||
//
|
||||
// Note that the caller doesn't have to change his code at all to
|
||||
// handle the asynchronous case.
|
||||
|
||||
var result, finished, isError, head, nextListener;
|
||||
var promise = (this.promise = {});
|
||||
|
||||
function complete(value){
|
||||
if(finished){
|
||||
throw new Error("This deferred has already been resolved");
|
||||
}
|
||||
result = value;
|
||||
finished = true;
|
||||
notify();
|
||||
}
|
||||
function notify(){
|
||||
var mutated;
|
||||
while(!mutated && nextListener){
|
||||
var listener = nextListener;
|
||||
nextListener = nextListener.next;
|
||||
if((mutated = (listener.progress == mutator))){ // assignment and check
|
||||
finished = false;
|
||||
}
|
||||
var func = (isError ? listener.error : listener.resolved);
|
||||
if(func){
|
||||
try{
|
||||
var newResult = func(result);
|
||||
if (newResult && typeof newResult.then === "function"){
|
||||
newResult.then(lang.hitch(listener.deferred, "resolve"), lang.hitch(listener.deferred, "reject"), lang.hitch(listener.deferred, "progress"));
|
||||
continue;
|
||||
}
|
||||
var unchanged = mutated && newResult === undefined;
|
||||
if(mutated && !unchanged){
|
||||
isError = newResult instanceof Error;
|
||||
}
|
||||
listener.deferred[unchanged && isError ? "reject" : "resolve"](unchanged ? result : newResult);
|
||||
}catch(e){
|
||||
listener.deferred.reject(e);
|
||||
}
|
||||
}else{
|
||||
if(isError){
|
||||
listener.deferred.reject(result);
|
||||
}else{
|
||||
listener.deferred.resolve(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// calling resolve will resolve the promise
|
||||
this.resolve = this.callback = function(value){
|
||||
// summary:
|
||||
// Fulfills the Deferred instance successfully with the provide value
|
||||
this.fired = 0;
|
||||
this.results = [value, null];
|
||||
complete(value);
|
||||
};
|
||||
|
||||
|
||||
// calling error will indicate that the promise failed
|
||||
this.reject = this.errback = function(error){
|
||||
// summary:
|
||||
// Fulfills the Deferred instance as an error with the provided error
|
||||
isError = true;
|
||||
this.fired = 1;
|
||||
complete(error);
|
||||
this.results = [null, error];
|
||||
if(!error || error.log !== false){
|
||||
(dojo.config.deferredOnError || function(x){ console.error(x); })(error);
|
||||
}
|
||||
};
|
||||
// call progress to provide updates on the progress on the completion of the promise
|
||||
this.progress = function(update){
|
||||
// summary:
|
||||
// Send progress events to all listeners
|
||||
var listener = nextListener;
|
||||
while(listener){
|
||||
var progress = listener.progress;
|
||||
progress && progress(update);
|
||||
listener = listener.next;
|
||||
}
|
||||
};
|
||||
this.addCallbacks = function(callback, errback){
|
||||
// summary:
|
||||
// Adds callback and error callback for this deferred instance.
|
||||
// callback: Function?
|
||||
// The callback attached to this deferred object.
|
||||
// errback: Function?
|
||||
// The error callback attached to this deferred object.
|
||||
// returns:
|
||||
// Returns this deferred object.
|
||||
this.then(callback, errback, mutator);
|
||||
return this; // dojo.Deferred
|
||||
};
|
||||
// provide the implementation of the promise
|
||||
promise.then = this.then = function(/*Function?*/resolvedCallback, /*Function?*/errorCallback, /*Function?*/progressCallback){
|
||||
// summary:
|
||||
// Adds a fulfilledHandler, errorHandler, and progressHandler to be called for
|
||||
// completion of a promise. The fulfilledHandler is called when the promise
|
||||
// is fulfilled. The errorHandler is called when a promise fails. The
|
||||
// progressHandler is called for progress events. All arguments are optional
|
||||
// and non-function values are ignored. The progressHandler is not only an
|
||||
// optional argument, but progress events are purely optional. Promise
|
||||
// providers are not required to ever create progress events.
|
||||
//
|
||||
// This function will return a new promise that is fulfilled when the given
|
||||
// fulfilledHandler or errorHandler callback is finished. This allows promise
|
||||
// operations to be chained together. The value returned from the callback
|
||||
// handler is the fulfillment value for the returned promise. If the callback
|
||||
// throws an error, the returned promise will be moved to failed state.
|
||||
//
|
||||
// returns:
|
||||
// Returns a new promise that represents the result of the
|
||||
// execution of the callback. The callbacks will never affect the original promises value.
|
||||
// example:
|
||||
// An example of using a CommonJS compliant promise:
|
||||
// | asyncComputeTheAnswerToEverything().
|
||||
// | then(addTwo).
|
||||
// | then(printResult, onError);
|
||||
// | >44
|
||||
//
|
||||
var returnDeferred = progressCallback == mutator ? this : new dojo.Deferred(promise.cancel);
|
||||
var listener = {
|
||||
resolved: resolvedCallback,
|
||||
error: errorCallback,
|
||||
progress: progressCallback,
|
||||
deferred: returnDeferred
|
||||
};
|
||||
if(nextListener){
|
||||
head = head.next = listener;
|
||||
}
|
||||
else{
|
||||
nextListener = head = listener;
|
||||
}
|
||||
if(finished){
|
||||
notify();
|
||||
}
|
||||
return returnDeferred.promise; // Promise
|
||||
};
|
||||
var deferred = this;
|
||||
promise.cancel = this.cancel = function (){
|
||||
// summary:
|
||||
// Cancels the asynchronous operation
|
||||
if(!finished){
|
||||
var error = canceller && canceller(deferred);
|
||||
if(!finished){
|
||||
if (!(error instanceof Error)){
|
||||
error = new Error(error);
|
||||
}
|
||||
error.log = false;
|
||||
deferred.reject(error);
|
||||
}
|
||||
}
|
||||
};
|
||||
freeze(promise);
|
||||
};
|
||||
lang.extend(dojo.Deferred, {
|
||||
addCallback: function (/*Function*/ callback){
|
||||
// summary:
|
||||
// Adds successful callback for this deferred instance.
|
||||
// returns:
|
||||
// Returns this deferred object.
|
||||
return this.addCallbacks(lang.hitch.apply(dojo, arguments)); // dojo.Deferred
|
||||
},
|
||||
|
||||
addErrback: function (/*Function*/ errback){
|
||||
// summary:
|
||||
// Adds error callback for this deferred instance.
|
||||
// returns:
|
||||
// Returns this deferred object.
|
||||
return this.addCallbacks(null, lang.hitch.apply(dojo, arguments)); // dojo.Deferred
|
||||
},
|
||||
|
||||
addBoth: function (/*Function*/ callback){
|
||||
// summary:
|
||||
// Add handler as both successful callback and error callback for this deferred instance.
|
||||
// returns:
|
||||
// Returns this deferred object.
|
||||
var enclosed = lang.hitch.apply(dojo, arguments);
|
||||
return this.addCallbacks(enclosed, enclosed); // dojo.Deferred
|
||||
},
|
||||
fired: -1
|
||||
});
|
||||
|
||||
dojo.Deferred.when = dojo.when = function(promiseOrValue, /*Function?*/ callback, /*Function?*/ errback, /*Function?*/ progressHandler){
|
||||
// summary:
|
||||
// This provides normalization between normal synchronous values and
|
||||
// asynchronous promises, so you can interact with them in a common way
|
||||
// returns:
|
||||
// Returns a new promise that represents the result of the execution of callback
|
||||
// when parameter "promiseOrValue" is promise.
|
||||
// Returns the execution result of callback when parameter "promiseOrValue" is value.
|
||||
// example:
|
||||
// | function printFirstAndLast(items){
|
||||
// | dojo.when(findFirst(items), console.log);
|
||||
// | dojo.when(findLast(items), console.log);
|
||||
// | }
|
||||
// | function findFirst(items){
|
||||
// | return dojo.when(items, function(items){
|
||||
// | return items[0];
|
||||
// | });
|
||||
// | }
|
||||
// | function findLast(items){
|
||||
// | return dojo.when(items, function(items){
|
||||
// | return items[items.length - 1];
|
||||
// | });
|
||||
// | }
|
||||
// And now all three of his functions can be used sync or async.
|
||||
// | printFirstAndLast([1,2,3,4]) will work just as well as
|
||||
// | printFirstAndLast(dojo.xhrGet(...));
|
||||
|
||||
if(promiseOrValue && typeof promiseOrValue.then === "function"){
|
||||
return promiseOrValue.then(callback, errback, progressHandler);
|
||||
}
|
||||
return callback ? callback(promiseOrValue) : promiseOrValue; // Promise
|
||||
};
|
||||
|
||||
return dojo.Deferred;
|
||||
});
|
||||
File diff suppressed because it is too large
Load Diff
100
lib/dojo/_base/NodeList.js.uncompressed.js
Normal file
100
lib/dojo/_base/NodeList.js.uncompressed.js
Normal file
@@ -0,0 +1,100 @@
|
||||
define("dojo/_base/NodeList", ["./kernel", "../query", "./array", "./html", "../NodeList-dom"], function(dojo, query, array){
|
||||
// module:
|
||||
// dojo/_base/NodeList
|
||||
// summary:
|
||||
// This module defines dojo.NodeList.
|
||||
|
||||
var NodeList = query.NodeList;
|
||||
|
||||
/*=====
|
||||
dojo.extend(dojo.NodeList, {
|
||||
connect: function(methodName, objOrFunc, funcName){
|
||||
// summary:
|
||||
// attach event handlers to every item of the NodeList. Uses dojo.connect()
|
||||
// so event properties are normalized
|
||||
// methodName: String
|
||||
// the name of the method to attach to. For DOM events, this should be
|
||||
// the lower-case name of the event
|
||||
// objOrFunc: Object|Function|String
|
||||
// if 2 arguments are passed (methodName, objOrFunc), objOrFunc should
|
||||
// reference a function or be the name of the function in the global
|
||||
// namespace to attach. If 3 arguments are provided
|
||||
// (methodName, objOrFunc, funcName), objOrFunc must be the scope to
|
||||
// locate the bound function in
|
||||
// funcName: String?
|
||||
// optional. A string naming the function in objOrFunc to bind to the
|
||||
// event. May also be a function reference.
|
||||
// example:
|
||||
// add an onclick handler to every button on the page
|
||||
// | dojo.query("div:nth-child(odd)").connect("onclick", function(e){
|
||||
// | console.log("clicked!");
|
||||
// | });
|
||||
// example:
|
||||
// attach foo.bar() to every odd div's onmouseover
|
||||
// | dojo.query("div:nth-child(odd)").connect("onmouseover", foo, "bar");
|
||||
},
|
||||
coords: function(){
|
||||
// summary:
|
||||
// Deprecated: Use position() for border-box x/y/w/h
|
||||
// or marginBox() for margin-box w/h/l/t.
|
||||
// Returns the box objects of all elements in a node list as
|
||||
// an Array (*not* a NodeList). Acts like `dojo.coords`, though assumes
|
||||
// the node passed is each node in this list.
|
||||
|
||||
return dojo.map(this, dojo.coords); // Array
|
||||
}
|
||||
});
|
||||
|
||||
var NodeList = dojo.NodeList;
|
||||
=====*/
|
||||
var nlp = NodeList.prototype;
|
||||
|
||||
// don't bind early to dojo.connect since we no longer explicitly depend on it
|
||||
nlp.connect = NodeList._adaptAsForEach(function(){
|
||||
return dojo.connect.apply(this, arguments);
|
||||
});
|
||||
nlp.coords = NodeList._adaptAsMap(dojo.coords);
|
||||
|
||||
NodeList.events = [
|
||||
// summary:
|
||||
// list of all DOM events used in NodeList
|
||||
"blur", "focus", "change", "click", "error", "keydown", "keypress",
|
||||
"keyup", "load", "mousedown", "mouseenter", "mouseleave", "mousemove",
|
||||
"mouseout", "mouseover", "mouseup", "submit"
|
||||
];
|
||||
|
||||
// FIXME: pseudo-doc the above automatically generated on-event functions
|
||||
|
||||
// syntactic sugar for DOM events
|
||||
array.forEach(NodeList.events, function(evt){
|
||||
var _oe = "on" + evt;
|
||||
nlp[_oe] = function(a, b){
|
||||
return this.connect(_oe, a, b);
|
||||
};
|
||||
// FIXME: should these events trigger publishes?
|
||||
/*
|
||||
return (a ? this.connect(_oe, a, b) :
|
||||
this.forEach(function(n){
|
||||
// FIXME:
|
||||
// listeners get buried by
|
||||
// addEventListener and can't be dug back
|
||||
// out to be triggered externally.
|
||||
// see:
|
||||
// http://developer.mozilla.org/en/docs/DOM:element
|
||||
|
||||
console.log(n, evt, _oe);
|
||||
|
||||
// FIXME: need synthetic event support!
|
||||
var _e = { target: n, faux: true, type: evt };
|
||||
// dojo._event_listener._synthesizeEvent({}, { target: n, faux: true, type: evt });
|
||||
try{ n[evt](_e); }catch(e){ console.log(e); }
|
||||
try{ n[_oe](_e); }catch(e){ console.log(e); }
|
||||
})
|
||||
);
|
||||
*/
|
||||
}
|
||||
);
|
||||
|
||||
dojo.NodeList = NodeList;
|
||||
return dojo.NodeList;
|
||||
});
|
||||
505
lib/dojo/_base/_loader/bootstrap.js
vendored
505
lib/dojo/_base/_loader/bootstrap.js
vendored
@@ -1,505 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
/*=====
|
||||
// note:
|
||||
// 'djConfig' does not exist under 'dojo.*' so that it can be set before the
|
||||
// 'dojo' variable exists.
|
||||
// note:
|
||||
// Setting any of these variables *after* the library has loaded does
|
||||
// nothing at all.
|
||||
|
||||
djConfig = {
|
||||
// summary:
|
||||
// Application code can set the global 'djConfig' prior to loading
|
||||
// the library to override certain global settings for how dojo works.
|
||||
//
|
||||
// isDebug: Boolean
|
||||
// Defaults to `false`. If set to `true`, ensures that Dojo provides
|
||||
// extended debugging feedback via Firebug. If Firebug is not available
|
||||
// on your platform, setting `isDebug` to `true` will force Dojo to
|
||||
// pull in (and display) the version of Firebug Lite which is
|
||||
// integrated into the Dojo distribution, thereby always providing a
|
||||
// debugging/logging console when `isDebug` is enabled. Note that
|
||||
// Firebug's `console.*` methods are ALWAYS defined by Dojo. If
|
||||
// `isDebug` is false and you are on a platform without Firebug, these
|
||||
// methods will be defined as no-ops.
|
||||
isDebug: false,
|
||||
// debugAtAllCosts: Boolean
|
||||
// Defaults to `false`. If set to `true`, this triggers an alternate
|
||||
// mode of the package system in which dependencies are detected and
|
||||
// only then are resources evaluated in dependency order via
|
||||
// `<script>` tag inclusion. This may double-request resources and
|
||||
// cause problems with scripts which expect `dojo.require()` to
|
||||
// preform synchronously. `debugAtAllCosts` can be an invaluable
|
||||
// debugging aid, but when using it, ensure that all code which
|
||||
// depends on Dojo modules is wrapped in `dojo.addOnLoad()` handlers.
|
||||
// Due to the somewhat unpredictable side-effects of using
|
||||
// `debugAtAllCosts`, it is strongly recommended that you enable this
|
||||
// flag as a last resort. `debugAtAllCosts` has no effect when loading
|
||||
// resources across domains. For usage information, see the
|
||||
// [Dojo Book](http://dojotoolkit.org/book/book-dojo/part-4-meta-dojo-making-your-dojo-code-run-faster-and-better/debugging-facilities/deb)
|
||||
debugAtAllCosts: false,
|
||||
// locale: String
|
||||
// The locale to assume for loading localized resources in this page,
|
||||
// specified according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
|
||||
// Must be specified entirely in lowercase, e.g. `en-us` and `zh-cn`.
|
||||
// See the documentation for `dojo.i18n` and `dojo.requireLocalization`
|
||||
// for details on loading localized resources. If no locale is specified,
|
||||
// Dojo assumes the locale of the user agent, according to `navigator.userLanguage`
|
||||
// or `navigator.language` properties.
|
||||
locale: undefined,
|
||||
// extraLocale: Array
|
||||
// No default value. Specifies additional locales whose
|
||||
// resources should also be loaded alongside the default locale when
|
||||
// calls to `dojo.requireLocalization()` are processed.
|
||||
extraLocale: undefined,
|
||||
// baseUrl: String
|
||||
// The directory in which `dojo.js` is located. Under normal
|
||||
// conditions, Dojo auto-detects the correct location from which it
|
||||
// was loaded. You may need to manually configure `baseUrl` in cases
|
||||
// where you have renamed `dojo.js` or in which `<base>` tags confuse
|
||||
// some browsers (e.g. IE 6). The variable `dojo.baseUrl` is assigned
|
||||
// either the value of `djConfig.baseUrl` if one is provided or the
|
||||
// auto-detected root if not. Other modules are located relative to
|
||||
// this path. The path should end in a slash.
|
||||
baseUrl: undefined,
|
||||
// modulePaths: Object
|
||||
// A map of module names to paths relative to `dojo.baseUrl`. The
|
||||
// key/value pairs correspond directly to the arguments which
|
||||
// `dojo.registerModulePath` accepts. Specifiying
|
||||
// `djConfig.modulePaths = { "foo": "../../bar" }` is the equivalent
|
||||
// of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple
|
||||
// modules may be configured via `djConfig.modulePaths`.
|
||||
modulePaths: {},
|
||||
// afterOnLoad: Boolean
|
||||
// Indicates Dojo was added to the page after the page load. In this case
|
||||
// Dojo will not wait for the page DOMContentLoad/load events and fire
|
||||
// its dojo.addOnLoad callbacks after making sure all outstanding
|
||||
// dojo.required modules have loaded. Only works with a built dojo.js,
|
||||
// it does not work the dojo.js directly from source control.
|
||||
afterOnLoad: false,
|
||||
// addOnLoad: Function or Array
|
||||
// Adds a callback via dojo.addOnLoad. Useful when Dojo is added after
|
||||
// the page loads and djConfig.afterOnLoad is true. Supports the same
|
||||
// arguments as dojo.addOnLoad. When using a function reference, use
|
||||
// `djConfig.addOnLoad = function(){};`. For object with function name use
|
||||
// `djConfig.addOnLoad = [myObject, "functionName"];` and for object with
|
||||
// function reference use
|
||||
// `djConfig.addOnLoad = [myObject, function(){}];`
|
||||
addOnLoad: null,
|
||||
// require: Array
|
||||
// An array of module names to be loaded immediately after dojo.js has been included
|
||||
// in a page.
|
||||
require: [],
|
||||
// defaultDuration: Array
|
||||
// Default duration, in milliseconds, for wipe and fade animations within dijits.
|
||||
// Assigned to dijit.defaultDuration.
|
||||
defaultDuration: 200,
|
||||
// dojoBlankHtmlUrl: String
|
||||
// Used by some modules to configure an empty iframe. Used by dojo.io.iframe and
|
||||
// dojo.back, and dijit popup support in IE where an iframe is needed to make sure native
|
||||
// controls do not bleed through the popups. Normally this configuration variable
|
||||
// does not need to be set, except when using cross-domain/CDN Dojo builds.
|
||||
// Save dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl`
|
||||
// to the path on your domain your copy of blank.html.
|
||||
dojoBlankHtmlUrl: undefined,
|
||||
// ioPublish: Boolean?
|
||||
// Set this to true to enable publishing of topics for the different phases of
|
||||
// IO operations. Publishing is done via dojo.publish. See dojo.__IoPublish for a list
|
||||
// of topics that are published.
|
||||
ioPublish: false,
|
||||
// useCustomLogger: Anything?
|
||||
// If set to a value that evaluates to true such as a string or array and
|
||||
// isDebug is true and Firebug is not available or running, then it bypasses
|
||||
// the creation of Firebug Lite allowing you to define your own console object.
|
||||
useCustomLogger: undefined,
|
||||
// transparentColor: Array
|
||||
// Array containing the r, g, b components used as transparent color in dojo.Color;
|
||||
// if undefined, [255,255,255] (white) will be used.
|
||||
transparentColor: undefined,
|
||||
// skipIeDomLoaded: Boolean
|
||||
// For IE only, skip the DOMContentLoaded hack used. Sometimes it can cause an Operation
|
||||
// Aborted error if the rest of the page triggers script defers before the DOM is ready.
|
||||
// If this is config value is set to true, then dojo.addOnLoad callbacks will not be
|
||||
// triggered until the page load event, which is after images and iframes load. If you
|
||||
// want to trigger the callbacks sooner, you can put a script block in the bottom of
|
||||
// your HTML that calls dojo._loadInit();. If you are using multiversion support, change
|
||||
// "dojo." to the appropriate scope name for dojo.
|
||||
skipIeDomLoaded: false
|
||||
}
|
||||
=====*/
|
||||
|
||||
(function(){
|
||||
// firebug stubs
|
||||
|
||||
if(typeof this["loadFirebugConsole"] == "function"){
|
||||
// for Firebug 1.2
|
||||
this["loadFirebugConsole"]();
|
||||
}else{
|
||||
this.console = this.console || {};
|
||||
|
||||
// Be careful to leave 'log' always at the end
|
||||
var cn = [
|
||||
"assert", "count", "debug", "dir", "dirxml", "error", "group",
|
||||
"groupEnd", "info", "profile", "profileEnd", "time", "timeEnd",
|
||||
"trace", "warn", "log"
|
||||
];
|
||||
var i = 0, tn;
|
||||
while((tn=cn[i++])){
|
||||
if(!console[tn]){
|
||||
(function(){
|
||||
var tcn = tn+"";
|
||||
console[tcn] = ('log' in console) ? function(){
|
||||
var a = Array.apply({}, arguments);
|
||||
a.unshift(tcn+":");
|
||||
console["log"](a.join(" "));
|
||||
} : function(){}
|
||||
console[tcn]._fake = true;
|
||||
})();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//TODOC: HOW TO DOC THIS?
|
||||
// dojo is the root variable of (almost all) our public symbols -- make sure it is defined.
|
||||
if(typeof dojo == "undefined"){
|
||||
dojo = {
|
||||
_scopeName: "dojo",
|
||||
_scopePrefix: "",
|
||||
_scopePrefixArgs: "",
|
||||
_scopeSuffix: "",
|
||||
_scopeMap: {},
|
||||
_scopeMapRev: {}
|
||||
};
|
||||
}
|
||||
|
||||
var d = dojo;
|
||||
|
||||
//Need placeholders for dijit and dojox for scoping code.
|
||||
if(typeof dijit == "undefined"){
|
||||
dijit = {_scopeName: "dijit"};
|
||||
}
|
||||
if(typeof dojox == "undefined"){
|
||||
dojox = {_scopeName: "dojox"};
|
||||
}
|
||||
|
||||
if(!d._scopeArgs){
|
||||
d._scopeArgs = [dojo, dijit, dojox];
|
||||
}
|
||||
|
||||
/*=====
|
||||
dojo.global = {
|
||||
// summary:
|
||||
// Alias for the global scope
|
||||
// (e.g. the window object in a browser).
|
||||
// description:
|
||||
// Refer to 'dojo.global' rather than referring to window to ensure your
|
||||
// code runs correctly in contexts other than web browsers (e.g. Rhino on a server).
|
||||
}
|
||||
=====*/
|
||||
d.global = this;
|
||||
|
||||
d.config =/*===== djConfig = =====*/{
|
||||
isDebug: false,
|
||||
debugAtAllCosts: false
|
||||
};
|
||||
|
||||
// FIXME: 2.0, drop djConfig support. Use dojoConfig exclusively for global config.
|
||||
var cfg = typeof djConfig != "undefined" ? djConfig :
|
||||
typeof dojoConfig != "undefined" ? dojoConfig : null;
|
||||
|
||||
if(cfg){
|
||||
for(var c in cfg){
|
||||
d.config[c] = cfg[c];
|
||||
}
|
||||
}
|
||||
|
||||
/*=====
|
||||
// Override locale setting, if specified
|
||||
dojo.locale = {
|
||||
// summary: the locale as defined by Dojo (read-only)
|
||||
};
|
||||
=====*/
|
||||
dojo.locale = d.config.locale;
|
||||
|
||||
var rev = "$Rev: 24595 $".match(/\d+/);
|
||||
|
||||
/*=====
|
||||
dojo.version = function(){
|
||||
// summary:
|
||||
// Version number of the Dojo Toolkit
|
||||
// major: Integer
|
||||
// Major version. If total version is "1.2.0beta1", will be 1
|
||||
// minor: Integer
|
||||
// Minor version. If total version is "1.2.0beta1", will be 2
|
||||
// patch: Integer
|
||||
// Patch version. If total version is "1.2.0beta1", will be 0
|
||||
// flag: String
|
||||
// Descriptor flag. If total version is "1.2.0beta1", will be "beta1"
|
||||
// revision: Number
|
||||
// The SVN rev from which dojo was pulled
|
||||
this.major = 0;
|
||||
this.minor = 0;
|
||||
this.patch = 0;
|
||||
this.flag = "";
|
||||
this.revision = 0;
|
||||
}
|
||||
=====*/
|
||||
dojo.version = {
|
||||
major: 1, minor: 6, patch: 1, flag: "",
|
||||
revision: rev ? +rev[0] : NaN,
|
||||
toString: function(){
|
||||
with(d.version){
|
||||
return major + "." + minor + "." + patch + flag + " (" + revision + ")"; // String
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Register with the OpenAjax hub
|
||||
if(typeof OpenAjax != "undefined"){
|
||||
OpenAjax.hub.registerLibrary(dojo._scopeName, "http://dojotoolkit.org", d.version.toString());
|
||||
}
|
||||
|
||||
var extraNames, extraLen, empty = {};
|
||||
for(var i in {toString: 1}){ extraNames = []; break; }
|
||||
dojo._extraNames = extraNames = extraNames || ["hasOwnProperty", "valueOf", "isPrototypeOf",
|
||||
"propertyIsEnumerable", "toLocaleString", "toString", "constructor"];
|
||||
extraLen = extraNames.length;
|
||||
|
||||
dojo._mixin = function(/*Object*/ target, /*Object*/ source){
|
||||
// summary:
|
||||
// Adds all properties and methods of source to target. This addition
|
||||
// is "prototype extension safe", so that instances of objects
|
||||
// will not pass along prototype defaults.
|
||||
var name, s, i;
|
||||
for(name in source){
|
||||
// the "tobj" condition avoid copying properties in "source"
|
||||
// inherited from Object.prototype. For example, if target has a custom
|
||||
// toString() method, don't overwrite it with the toString() method
|
||||
// that source inherited from Object.prototype
|
||||
s = source[name];
|
||||
if(!(name in target) || (target[name] !== s && (!(name in empty) || empty[name] !== s))){
|
||||
target[name] = s;
|
||||
}
|
||||
}
|
||||
// IE doesn't recognize some custom functions in for..in
|
||||
if(extraLen && source){
|
||||
for(i = 0; i < extraLen; ++i){
|
||||
name = extraNames[i];
|
||||
s = source[name];
|
||||
if(!(name in target) || (target[name] !== s && (!(name in empty) || empty[name] !== s))){
|
||||
target[name] = s;
|
||||
}
|
||||
}
|
||||
}
|
||||
return target; // Object
|
||||
}
|
||||
|
||||
dojo.mixin = function(/*Object*/obj, /*Object...*/props){
|
||||
// summary:
|
||||
// Adds all properties and methods of props to obj and returns the
|
||||
// (now modified) obj.
|
||||
// description:
|
||||
// `dojo.mixin` can mix multiple source objects into a
|
||||
// destination object which is then returned. Unlike regular
|
||||
// `for...in` iteration, `dojo.mixin` is also smart about avoiding
|
||||
// extensions which other toolkits may unwisely add to the root
|
||||
// object prototype
|
||||
// obj:
|
||||
// The object to mix properties into. Also the return value.
|
||||
// props:
|
||||
// One or more objects whose values are successively copied into
|
||||
// obj. If more than one of these objects contain the same value,
|
||||
// the one specified last in the function call will "win".
|
||||
// example:
|
||||
// make a shallow copy of an object
|
||||
// | var copy = dojo.mixin({}, source);
|
||||
// example:
|
||||
// many class constructors often take an object which specifies
|
||||
// values to be configured on the object. In this case, it is
|
||||
// often simplest to call `dojo.mixin` on the `this` object:
|
||||
// | dojo.declare("acme.Base", null, {
|
||||
// | constructor: function(properties){
|
||||
// | // property configuration:
|
||||
// | dojo.mixin(this, properties);
|
||||
// |
|
||||
// | console.log(this.quip);
|
||||
// | // ...
|
||||
// | },
|
||||
// | quip: "I wasn't born yesterday, you know - I've seen movies.",
|
||||
// | // ...
|
||||
// | });
|
||||
// |
|
||||
// | // create an instance of the class and configure it
|
||||
// | var b = new acme.Base({quip: "That's what it does!" });
|
||||
// example:
|
||||
// copy in properties from multiple objects
|
||||
// | var flattened = dojo.mixin(
|
||||
// | {
|
||||
// | name: "Frylock",
|
||||
// | braces: true
|
||||
// | },
|
||||
// | {
|
||||
// | name: "Carl Brutanananadilewski"
|
||||
// | }
|
||||
// | );
|
||||
// |
|
||||
// | // will print "Carl Brutanananadilewski"
|
||||
// | console.log(flattened.name);
|
||||
// | // will print "true"
|
||||
// | console.log(flattened.braces);
|
||||
if(!obj){ obj = {}; }
|
||||
for(var i=1, l=arguments.length; i<l; i++){
|
||||
d._mixin(obj, arguments[i]);
|
||||
}
|
||||
return obj; // Object
|
||||
}
|
||||
|
||||
dojo._getProp = function(/*Array*/parts, /*Boolean*/create, /*Object*/context){
|
||||
var obj=context || d.global;
|
||||
for(var i=0, p; obj && (p=parts[i]); i++){
|
||||
if(i == 0 && d._scopeMap[p]){
|
||||
p = d._scopeMap[p];
|
||||
}
|
||||
obj = (p in obj ? obj[p] : (create ? obj[p]={} : undefined));
|
||||
}
|
||||
return obj; // mixed
|
||||
}
|
||||
|
||||
dojo.setObject = function(/*String*/name, /*Object*/value, /*Object?*/context){
|
||||
// summary:
|
||||
// Set a property from a dot-separated string, such as "A.B.C"
|
||||
// description:
|
||||
// Useful for longer api chains where you have to test each object in
|
||||
// the chain, or when you have an object reference in string format.
|
||||
// Objects are created as needed along `path`. Returns the passed
|
||||
// value if setting is successful or `undefined` if not.
|
||||
// name:
|
||||
// Path to a property, in the form "A.B.C".
|
||||
// context:
|
||||
// Optional. Object to use as root of path. Defaults to
|
||||
// `dojo.global`.
|
||||
// example:
|
||||
// set the value of `foo.bar.baz`, regardless of whether
|
||||
// intermediate objects already exist:
|
||||
// | dojo.setObject("foo.bar.baz", value);
|
||||
// example:
|
||||
// without `dojo.setObject`, we often see code like this:
|
||||
// | // ensure that intermediate objects are available
|
||||
// | if(!obj["parent"]){ obj.parent = {}; }
|
||||
// | if(!obj.parent["child"]){ obj.parent.child= {}; }
|
||||
// | // now we can safely set the property
|
||||
// | obj.parent.child.prop = "some value";
|
||||
// wheras with `dojo.setObject`, we can shorten that to:
|
||||
// | dojo.setObject("parent.child.prop", "some value", obj);
|
||||
var parts=name.split("."), p=parts.pop(), obj=d._getProp(parts, true, context);
|
||||
return obj && p ? (obj[p]=value) : undefined; // Object
|
||||
}
|
||||
|
||||
dojo.getObject = function(/*String*/name, /*Boolean?*/create, /*Object?*/context){
|
||||
// summary:
|
||||
// Get a property from a dot-separated string, such as "A.B.C"
|
||||
// description:
|
||||
// Useful for longer api chains where you have to test each object in
|
||||
// the chain, or when you have an object reference in string format.
|
||||
// name:
|
||||
// Path to an property, in the form "A.B.C".
|
||||
// create:
|
||||
// Optional. Defaults to `false`. If `true`, Objects will be
|
||||
// created at any point along the 'path' that is undefined.
|
||||
// context:
|
||||
// Optional. Object to use as root of path. Defaults to
|
||||
// 'dojo.global'. Null may be passed.
|
||||
return d._getProp(name.split("."), create, context); // Object
|
||||
}
|
||||
|
||||
dojo.exists = function(/*String*/name, /*Object?*/obj){
|
||||
// summary:
|
||||
// determine if an object supports a given method
|
||||
// description:
|
||||
// useful for longer api chains where you have to test each object in
|
||||
// the chain. Useful for object and method detection.
|
||||
// name:
|
||||
// Path to an object, in the form "A.B.C".
|
||||
// obj:
|
||||
// Object to use as root of path. Defaults to
|
||||
// 'dojo.global'. Null may be passed.
|
||||
// example:
|
||||
// | // define an object
|
||||
// | var foo = {
|
||||
// | bar: { }
|
||||
// | };
|
||||
// |
|
||||
// | // search the global scope
|
||||
// | dojo.exists("foo.bar"); // true
|
||||
// | dojo.exists("foo.bar.baz"); // false
|
||||
// |
|
||||
// | // search from a particular scope
|
||||
// | dojo.exists("bar", foo); // true
|
||||
// | dojo.exists("bar.baz", foo); // false
|
||||
return d.getObject(name, false, obj) !== undefined; // Boolean
|
||||
}
|
||||
|
||||
dojo["eval"] = function(/*String*/ scriptFragment){
|
||||
// summary:
|
||||
// A legacy method created for use exclusively by internal Dojo methods. Do not use
|
||||
// this method directly, the behavior of this eval will differ from the normal
|
||||
// browser eval.
|
||||
// description:
|
||||
// Placed in a separate function to minimize size of trapped
|
||||
// exceptions. Calling eval() directly from some other scope may
|
||||
// complicate tracebacks on some platforms.
|
||||
// returns:
|
||||
// The result of the evaluation. Often `undefined`
|
||||
return d.global.eval ? d.global.eval(scriptFragment) : eval(scriptFragment); // Object
|
||||
}
|
||||
|
||||
/*=====
|
||||
dojo.deprecated = function(behaviour, extra, removal){
|
||||
// summary:
|
||||
// Log a debug message to indicate that a behavior has been
|
||||
// deprecated.
|
||||
// behaviour: String
|
||||
// The API or behavior being deprecated. Usually in the form
|
||||
// of "myApp.someFunction()".
|
||||
// extra: String?
|
||||
// Text to append to the message. Often provides advice on a
|
||||
// new function or facility to achieve the same goal during
|
||||
// the deprecation period.
|
||||
// removal: String?
|
||||
// Text to indicate when in the future the behavior will be
|
||||
// removed. Usually a version number.
|
||||
// example:
|
||||
// | dojo.deprecated("myApp.getTemp()", "use myApp.getLocaleTemp() instead", "1.0");
|
||||
}
|
||||
|
||||
dojo.experimental = function(moduleName, extra){
|
||||
// summary: Marks code as experimental.
|
||||
// description:
|
||||
// This can be used to mark a function, file, or module as
|
||||
// experimental. Experimental code is not ready to be used, and the
|
||||
// APIs are subject to change without notice. Experimental code may be
|
||||
// completed deleted without going through the normal deprecation
|
||||
// process.
|
||||
// moduleName: String
|
||||
// The name of a module, or the name of a module file or a specific
|
||||
// function
|
||||
// extra: String?
|
||||
// some additional message for the user
|
||||
// example:
|
||||
// | dojo.experimental("dojo.data.Result");
|
||||
// example:
|
||||
// | dojo.experimental("dojo.weather.toKelvin()", "PENDING approval from NOAA");
|
||||
}
|
||||
=====*/
|
||||
|
||||
//Real functions declared in dojo._firebug.firebug.
|
||||
d.deprecated = d.experimental = function(){};
|
||||
|
||||
})();
|
||||
// vim:ai:ts=4:noet
|
||||
@@ -1,477 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
/*=====
|
||||
dojo.isBrowser = {
|
||||
// example:
|
||||
// | if(dojo.isBrowser){ ... }
|
||||
};
|
||||
|
||||
dojo.isFF = {
|
||||
// example:
|
||||
// | if(dojo.isFF > 1){ ... }
|
||||
};
|
||||
|
||||
dojo.isIE = {
|
||||
// example:
|
||||
// | if(dojo.isIE > 6){
|
||||
// | // we are IE7
|
||||
// | }
|
||||
};
|
||||
|
||||
dojo.isSafari = {
|
||||
// example:
|
||||
// | if(dojo.isSafari){ ... }
|
||||
// example:
|
||||
// Detect iPhone:
|
||||
// | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){
|
||||
// | // we are iPhone. Note, iPod touch reports "iPod" above and fails this test.
|
||||
// | }
|
||||
};
|
||||
|
||||
dojo = {
|
||||
// isBrowser: Boolean
|
||||
// True if the client is a web-browser
|
||||
isBrowser: true,
|
||||
// isFF: Number | undefined
|
||||
// Version as a Number if client is FireFox. undefined otherwise. Corresponds to
|
||||
// major detected FireFox version (1.5, 2, 3, etc.)
|
||||
isFF: 2,
|
||||
// isIE: Number | undefined
|
||||
// Version as a Number if client is MSIE(PC). undefined otherwise. Corresponds to
|
||||
// major detected IE version (6, 7, 8, etc.)
|
||||
isIE: 6,
|
||||
// isKhtml: Number | undefined
|
||||
// Version as a Number if client is a KHTML browser. undefined otherwise. Corresponds to major
|
||||
// detected version.
|
||||
isKhtml: 0,
|
||||
// isWebKit: Number | undefined
|
||||
// Version as a Number if client is a WebKit-derived browser (Konqueror,
|
||||
// Safari, Chrome, etc.). undefined otherwise.
|
||||
isWebKit: 0,
|
||||
// isMozilla: Number | undefined
|
||||
// Version as a Number if client is a Mozilla-based browser (Firefox,
|
||||
// SeaMonkey). undefined otherwise. Corresponds to major detected version.
|
||||
isMozilla: 0,
|
||||
// isOpera: Number | undefined
|
||||
// Version as a Number if client is Opera. undefined otherwise. Corresponds to
|
||||
// major detected version.
|
||||
isOpera: 0,
|
||||
// isSafari: Number | undefined
|
||||
// Version as a Number if client is Safari or iPhone. undefined otherwise.
|
||||
isSafari: 0,
|
||||
// isChrome: Number | undefined
|
||||
// Version as a Number if client is Chrome browser. undefined otherwise.
|
||||
isChrome: 0
|
||||
// isMac: Boolean
|
||||
// True if the client runs on Mac
|
||||
}
|
||||
=====*/
|
||||
if(typeof window != 'undefined'){
|
||||
dojo.isBrowser = true;
|
||||
dojo._name = "browser";
|
||||
|
||||
|
||||
// attempt to figure out the path to dojo if it isn't set in the config
|
||||
(function(){
|
||||
var d = dojo;
|
||||
|
||||
// this is a scope protection closure. We set browser versions and grab
|
||||
// the URL we were loaded from here.
|
||||
|
||||
// grab the node we were loaded from
|
||||
if(document && document.getElementsByTagName){
|
||||
var scripts = document.getElementsByTagName("script");
|
||||
var rePkg = /dojo(\.xd)?\.js(\W|$)/i;
|
||||
for(var i = 0; i < scripts.length; i++){
|
||||
var src = scripts[i].getAttribute("src");
|
||||
if(!src){ continue; }
|
||||
var m = src.match(rePkg);
|
||||
if(m){
|
||||
// find out where we came from
|
||||
if(!d.config.baseUrl){
|
||||
d.config.baseUrl = src.substring(0, m.index);
|
||||
}
|
||||
// and find out if we need to modify our behavior
|
||||
var cfg = (scripts[i].getAttribute("djConfig") || scripts[i].getAttribute("data-dojo-config"));
|
||||
if(cfg){
|
||||
var cfgo = eval("({ "+cfg+" })");
|
||||
for(var x in cfgo){
|
||||
dojo.config[x] = cfgo[x];
|
||||
}
|
||||
}
|
||||
break; // "first Dojo wins"
|
||||
}
|
||||
}
|
||||
}
|
||||
d.baseUrl = d.config.baseUrl;
|
||||
|
||||
// fill in the rendering support information in dojo.render.*
|
||||
var n = navigator;
|
||||
var dua = n.userAgent,
|
||||
dav = n.appVersion,
|
||||
tv = parseFloat(dav);
|
||||
|
||||
if(dua.indexOf("Opera") >= 0){ d.isOpera = tv; }
|
||||
if(dua.indexOf("AdobeAIR") >= 0){ d.isAIR = 1; }
|
||||
d.isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : 0;
|
||||
d.isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined;
|
||||
d.isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined;
|
||||
d.isMac = dav.indexOf("Macintosh") >= 0;
|
||||
|
||||
// safari detection derived from:
|
||||
// http://developer.apple.com/internet/safari/faq.html#anchor2
|
||||
// http://developer.apple.com/internet/safari/uamatrix.html
|
||||
var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);
|
||||
if(index && !dojo.isChrome){
|
||||
// try to grab the explicit Safari version first. If we don't get
|
||||
// one, look for less than 419.3 as the indication that we're on something
|
||||
// "Safari 2-ish".
|
||||
d.isSafari = parseFloat(dav.split("Version/")[1]);
|
||||
if(!d.isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){
|
||||
d.isSafari = 2;
|
||||
}
|
||||
}
|
||||
|
||||
if(dua.indexOf("Gecko") >= 0 && !d.isKhtml && !d.isWebKit){ d.isMozilla = d.isMoz = tv; }
|
||||
if(d.isMoz){
|
||||
//We really need to get away from this. Consider a sane isGecko approach for the future.
|
||||
d.isFF = parseFloat(dua.split("Firefox/")[1] || dua.split("Minefield/")[1]) || undefined;
|
||||
}
|
||||
if(document.all && !d.isOpera){
|
||||
d.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;
|
||||
//In cases where the page has an HTTP header or META tag with
|
||||
//X-UA-Compatible, then it is in emulation mode.
|
||||
//Make sure isIE reflects the desired version.
|
||||
//document.documentMode of 5 means quirks mode.
|
||||
//Only switch the value if documentMode's major version
|
||||
//is different from isIE's major version.
|
||||
var mode = document.documentMode;
|
||||
if(mode && mode != 5 && Math.floor(d.isIE) != mode){
|
||||
d.isIE = mode;
|
||||
}
|
||||
}
|
||||
|
||||
//Workaround to get local file loads of dojo to work on IE 7
|
||||
//by forcing to not use native xhr.
|
||||
if(dojo.isIE && window.location.protocol === "file:"){
|
||||
dojo.config.ieForceActiveXXhr=true;
|
||||
}
|
||||
|
||||
d.isQuirks = document.compatMode == "BackCompat";
|
||||
|
||||
// TODO: is the HTML LANG attribute relevant?
|
||||
d.locale = dojo.config.locale || (d.isIE ? n.userLanguage : n.language).toLowerCase();
|
||||
|
||||
// These are in order of decreasing likelihood; this will change in time.
|
||||
d._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
|
||||
|
||||
d._xhrObj = function(){
|
||||
// summary:
|
||||
// does the work of portably generating a new XMLHTTPRequest object.
|
||||
var http, last_e;
|
||||
if(!dojo.isIE || !dojo.config.ieForceActiveXXhr){
|
||||
try{ http = new XMLHttpRequest(); }catch(e){}
|
||||
}
|
||||
if(!http){
|
||||
for(var i=0; i<3; ++i){
|
||||
var progid = d._XMLHTTP_PROGIDS[i];
|
||||
try{
|
||||
http = new ActiveXObject(progid);
|
||||
}catch(e){
|
||||
last_e = e;
|
||||
}
|
||||
|
||||
if(http){
|
||||
d._XMLHTTP_PROGIDS = [progid]; // so faster next time
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!http){
|
||||
throw new Error("XMLHTTP not available: "+last_e);
|
||||
}
|
||||
|
||||
return http; // XMLHTTPRequest instance
|
||||
}
|
||||
|
||||
d._isDocumentOk = function(http){
|
||||
var stat = http.status || 0,
|
||||
lp = location.protocol;
|
||||
return (stat >= 200 && stat < 300) || // Boolean
|
||||
stat == 304 || // allow any 2XX response code
|
||||
stat == 1223 || // get it out of the cache
|
||||
// Internet Explorer mangled the status code
|
||||
// Internet Explorer mangled the status code OR we're Titanium/browser chrome/chrome extension requesting a local file
|
||||
(!stat && (lp == "file:" || lp == "chrome:" || lp == "chrome-extension:" || lp == "app:"));
|
||||
}
|
||||
|
||||
//See if base tag is in use.
|
||||
//This is to fix http://trac.dojotoolkit.org/ticket/3973,
|
||||
//but really, we need to find out how to get rid of the dojo._Url reference
|
||||
//below and still have DOH work with the dojo.i18n test following some other
|
||||
//test that uses the test frame to load a document (trac #2757).
|
||||
//Opera still has problems, but perhaps a larger issue of base tag support
|
||||
//with XHR requests (hasBase is true, but the request is still made to document
|
||||
//path, not base path).
|
||||
var owloc = window.location+"";
|
||||
var base = document.getElementsByTagName("base");
|
||||
var hasBase = (base && base.length > 0);
|
||||
|
||||
d._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){
|
||||
// summary: Read the contents of the specified uri and return those contents.
|
||||
// uri:
|
||||
// A relative or absolute uri. If absolute, it still must be in
|
||||
// the same "domain" as we are.
|
||||
// fail_ok:
|
||||
// Default false. If fail_ok and loading fails, return null
|
||||
// instead of throwing.
|
||||
// returns: The response text. null is returned when there is a
|
||||
// failure and failure is okay (an exception otherwise)
|
||||
|
||||
// NOTE: must be declared before scope switches ie. this._xhrObj()
|
||||
var http = d._xhrObj();
|
||||
|
||||
if(!hasBase && dojo._Url){
|
||||
uri = (new dojo._Url(owloc, uri)).toString();
|
||||
}
|
||||
|
||||
if(d.config.cacheBust){
|
||||
//Make sure we have a string before string methods are used on uri
|
||||
uri += "";
|
||||
uri += (uri.indexOf("?") == -1 ? "?" : "&") + String(d.config.cacheBust).replace(/\W+/g,"");
|
||||
}
|
||||
|
||||
http.open('GET', uri, false);
|
||||
try{
|
||||
http.send(null);
|
||||
if(!d._isDocumentOk(http)){
|
||||
var err = Error("Unable to load "+uri+" status:"+ http.status);
|
||||
err.status = http.status;
|
||||
err.responseText = http.responseText;
|
||||
throw err;
|
||||
}
|
||||
}catch(e){
|
||||
if(fail_ok){ return null; } // null
|
||||
// rethrow the exception
|
||||
throw e;
|
||||
}
|
||||
return http.responseText; // String
|
||||
}
|
||||
|
||||
|
||||
var _w = window;
|
||||
var _handleNodeEvent = function(/*String*/evtName, /*Function*/fp){
|
||||
// summary:
|
||||
// non-destructively adds the specified function to the node's
|
||||
// evtName handler.
|
||||
// evtName: should be in the form "onclick" for "onclick" handlers.
|
||||
// Make sure you pass in the "on" part.
|
||||
var _a = _w.attachEvent || _w.addEventListener;
|
||||
evtName = _w.attachEvent ? evtName : evtName.substring(2);
|
||||
_a(evtName, function(){
|
||||
fp.apply(_w, arguments);
|
||||
}, false);
|
||||
};
|
||||
|
||||
|
||||
d._windowUnloaders = [];
|
||||
|
||||
d.windowUnloaded = function(){
|
||||
// summary:
|
||||
// signal fired by impending window destruction. You may use
|
||||
// dojo.addOnWindowUnload() to register a listener for this
|
||||
// event. NOTE: if you wish to dojo.connect() to this method
|
||||
// to perform page/application cleanup, be aware that this
|
||||
// event WILL NOT fire if no handler has been registered with
|
||||
// dojo.addOnWindowUnload. This behavior started in Dojo 1.3.
|
||||
// Previous versions always triggered dojo.windowUnloaded. See
|
||||
// dojo.addOnWindowUnload for more info.
|
||||
var mll = d._windowUnloaders;
|
||||
while(mll.length){
|
||||
(mll.pop())();
|
||||
}
|
||||
d = null;
|
||||
};
|
||||
|
||||
var _onWindowUnloadAttached = 0;
|
||||
d.addOnWindowUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
|
||||
// summary:
|
||||
// registers a function to be triggered when window.onunload
|
||||
// fires.
|
||||
// description:
|
||||
// The first time that addOnWindowUnload is called Dojo
|
||||
// will register a page listener to trigger your unload
|
||||
// handler with. Note that registering these handlers may
|
||||
// destory "fastback" page caching in browsers that support
|
||||
// it. Be careful trying to modify the DOM or access
|
||||
// JavaScript properties during this phase of page unloading:
|
||||
// they may not always be available. Consider
|
||||
// dojo.addOnUnload() if you need to modify the DOM or do
|
||||
// heavy JavaScript work since it fires at the eqivalent of
|
||||
// the page's "onbeforeunload" event.
|
||||
// example:
|
||||
// | dojo.addOnWindowUnload(functionPointer)
|
||||
// | dojo.addOnWindowUnload(object, "functionName");
|
||||
// | dojo.addOnWindowUnload(object, function(){ /* ... */});
|
||||
|
||||
d._onto(d._windowUnloaders, obj, functionName);
|
||||
if(!_onWindowUnloadAttached){
|
||||
_onWindowUnloadAttached = 1;
|
||||
_handleNodeEvent("onunload", d.windowUnloaded);
|
||||
}
|
||||
};
|
||||
|
||||
var _onUnloadAttached = 0;
|
||||
d.addOnUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
|
||||
// summary:
|
||||
// registers a function to be triggered when the page unloads.
|
||||
// description:
|
||||
// The first time that addOnUnload is called Dojo will
|
||||
// register a page listener to trigger your unload handler
|
||||
// with.
|
||||
//
|
||||
// In a browser enviroment, the functions will be triggered
|
||||
// during the window.onbeforeunload event. Be careful of doing
|
||||
// too much work in an unload handler. onbeforeunload can be
|
||||
// triggered if a link to download a file is clicked, or if
|
||||
// the link is a javascript: link. In these cases, the
|
||||
// onbeforeunload event fires, but the document is not
|
||||
// actually destroyed. So be careful about doing destructive
|
||||
// operations in a dojo.addOnUnload callback.
|
||||
//
|
||||
// Further note that calling dojo.addOnUnload will prevent
|
||||
// browsers from using a "fast back" cache to make page
|
||||
// loading via back button instantaneous.
|
||||
// example:
|
||||
// | dojo.addOnUnload(functionPointer)
|
||||
// | dojo.addOnUnload(object, "functionName")
|
||||
// | dojo.addOnUnload(object, function(){ /* ... */});
|
||||
|
||||
d._onto(d._unloaders, obj, functionName);
|
||||
if(!_onUnloadAttached){
|
||||
_onUnloadAttached = 1;
|
||||
_handleNodeEvent("onbeforeunload", dojo.unloaded);
|
||||
}
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
//START DOMContentLoaded
|
||||
dojo._initFired = false;
|
||||
dojo._loadInit = function(e){
|
||||
if(dojo._scrollIntervalId){
|
||||
clearInterval(dojo._scrollIntervalId);
|
||||
dojo._scrollIntervalId = 0;
|
||||
}
|
||||
|
||||
if(!dojo._initFired){
|
||||
dojo._initFired = true;
|
||||
|
||||
//Help out IE to avoid memory leak.
|
||||
if(!dojo.config.afterOnLoad && window.detachEvent){
|
||||
window.detachEvent("onload", dojo._loadInit);
|
||||
}
|
||||
|
||||
if(dojo._inFlightCount == 0){
|
||||
dojo._modulesLoaded();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!dojo.config.afterOnLoad){
|
||||
if(document.addEventListener){
|
||||
//Standards. Hooray! Assumption here that if standards based,
|
||||
//it knows about DOMContentLoaded. It is OK if it does not, the fall through
|
||||
//to window onload should be good enough.
|
||||
document.addEventListener("DOMContentLoaded", dojo._loadInit, false);
|
||||
window.addEventListener("load", dojo._loadInit, false);
|
||||
}else if(window.attachEvent){
|
||||
window.attachEvent("onload", dojo._loadInit);
|
||||
|
||||
//DOMContentLoaded approximation. Diego Perini found this MSDN article
|
||||
//that indicates doScroll is available after DOM ready, so do a setTimeout
|
||||
//to check when it is available.
|
||||
//http://msdn.microsoft.com/en-us/library/ms531426.aspx
|
||||
if(!dojo.config.skipIeDomLoaded && self === self.top){
|
||||
dojo._scrollIntervalId = setInterval(function (){
|
||||
try{
|
||||
//When dojo is loaded into an iframe in an IE HTML Application
|
||||
//(HTA), such as in a selenium test, javascript in the iframe
|
||||
//can't see anything outside of it, so self===self.top is true,
|
||||
//but the iframe is not the top window and doScroll will be
|
||||
//available before document.body is set. Test document.body
|
||||
//before trying the doScroll trick
|
||||
if(document.body){
|
||||
document.documentElement.doScroll("left");
|
||||
dojo._loadInit();
|
||||
}
|
||||
}catch (e){}
|
||||
}, 30);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(dojo.isIE){
|
||||
try{
|
||||
(function(){
|
||||
document.namespaces.add("v", "urn:schemas-microsoft-com:vml");
|
||||
var vmlElems = ["*", "group", "roundrect", "oval", "shape", "rect", "imagedata", "path", "textpath", "text"],
|
||||
i = 0, l = 1, s = document.createStyleSheet();
|
||||
if(dojo.isIE >= 8){
|
||||
i = 1;
|
||||
l = vmlElems.length;
|
||||
}
|
||||
for(; i < l; ++i){
|
||||
s.addRule("v\\:" + vmlElems[i], "behavior:url(#default#VML); display:inline-block");
|
||||
}
|
||||
})();
|
||||
}catch(e){}
|
||||
}
|
||||
//END DOMContentLoaded
|
||||
|
||||
|
||||
/*
|
||||
OpenAjax.subscribe("OpenAjax", "onload", function(){
|
||||
if(dojo._inFlightCount == 0){
|
||||
dojo._modulesLoaded();
|
||||
}
|
||||
});
|
||||
|
||||
OpenAjax.subscribe("OpenAjax", "onunload", function(){
|
||||
dojo.unloaded();
|
||||
});
|
||||
*/
|
||||
} //if (typeof window != 'undefined')
|
||||
|
||||
//Register any module paths set up in djConfig. Need to do this
|
||||
//in the hostenvs since hostenv_browser can read djConfig from a
|
||||
//script tag's attribute.
|
||||
(function(){
|
||||
var mp = dojo.config["modulePaths"];
|
||||
if(mp){
|
||||
for(var param in mp){
|
||||
dojo.registerModulePath(param, mp[param]);
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
//Load debug code if necessary.
|
||||
if(dojo.config.isDebug){
|
||||
dojo.require("dojo._firebug.firebug");
|
||||
}
|
||||
|
||||
if(dojo.config.debugAtAllCosts){
|
||||
// this breaks the new AMD based module loader. The XDomain won't be necessary
|
||||
// anyway if you switch to the asynchronous loader
|
||||
//dojo.config.useXDomain = true;
|
||||
//dojo.require("dojo._base._loader.loader_xd");
|
||||
dojo.require("dojo._base._loader.loader_debug");
|
||||
dojo.require("dojo.i18n");
|
||||
}
|
||||
|
||||
@@ -1,214 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Rhino host environment
|
||||
*/
|
||||
|
||||
if(dojo.config["baseUrl"]){
|
||||
dojo.baseUrl = dojo.config["baseUrl"];
|
||||
}else{
|
||||
dojo.baseUrl = "./";
|
||||
}
|
||||
|
||||
dojo.locale = dojo.locale || String(java.util.Locale.getDefault().toString().replace('_','-').toLowerCase());
|
||||
dojo._name = 'rhino';
|
||||
dojo.isRhino = true;
|
||||
|
||||
if(typeof print == "function"){
|
||||
console.debug = print;
|
||||
}
|
||||
|
||||
if(!("byId" in dojo)){
|
||||
dojo.byId = function(id, doc){
|
||||
if(id && (typeof id == "string" || id instanceof String)){
|
||||
if(!doc){ doc = document; }
|
||||
return doc.getElementById(id);
|
||||
}
|
||||
return id; // assume it's a node
|
||||
}
|
||||
}
|
||||
|
||||
dojo._isLocalUrl = function(/*String*/ uri) {
|
||||
// summary:
|
||||
// determines if URI is local or not.
|
||||
|
||||
var local = (new java.io.File(uri)).exists();
|
||||
if(!local){
|
||||
var stream;
|
||||
//Try remote URL. Allow this method to throw,
|
||||
//but still do cleanup.
|
||||
try{
|
||||
// try it as a file first, URL second
|
||||
stream = (new java.net.URL(uri)).openStream();
|
||||
// close the stream so we don't leak resources
|
||||
stream.close();
|
||||
}finally{
|
||||
if(stream && stream.close){
|
||||
stream.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
return local;
|
||||
}
|
||||
|
||||
// see comments in spidermonkey loadUri
|
||||
dojo._loadUri = function(uri, cb){
|
||||
if(dojo._loadedUrls[uri]){
|
||||
return true; // Boolean
|
||||
}
|
||||
try{
|
||||
var local;
|
||||
try{
|
||||
local = dojo._isLocalUrl(uri);
|
||||
}catch(e){
|
||||
// no debug output; this failure just means the uri was not found.
|
||||
return false;
|
||||
}
|
||||
|
||||
dojo._loadedUrls[uri] = true;
|
||||
//FIXME: Use Rhino 1.6 native readFile/readUrl if available?
|
||||
if(cb){
|
||||
var contents = (local ? readText : readUri)(uri, "UTF-8");
|
||||
|
||||
// patch up the input to eval until https://bugzilla.mozilla.org/show_bug.cgi?id=471005 is fixed.
|
||||
if(!eval("'\u200f'").length){
|
||||
contents = String(contents).replace(/[\u200E\u200F\u202A-\u202E]/g, function(match){
|
||||
return "\\u" + match.charCodeAt(0).toString(16);
|
||||
})
|
||||
}
|
||||
contents = /^define\(/.test(contents) ? contents : '('+contents+')';
|
||||
cb(eval(contents));
|
||||
}else{
|
||||
load(uri);
|
||||
}
|
||||
dojo._loadedUrls.push(uri);
|
||||
return true;
|
||||
}catch(e){
|
||||
dojo._loadedUrls[uri] = false;
|
||||
console.debug("rhino load('" + uri + "') failed. Exception: " + e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
dojo.exit = function(exitcode){
|
||||
quit(exitcode);
|
||||
}
|
||||
|
||||
// reading a file from disk in Java is a humiliating experience by any measure.
|
||||
// Lets avoid that and just get the freaking text
|
||||
function readText(path, encoding){
|
||||
encoding = encoding || "utf-8";
|
||||
// NOTE: we intentionally avoid handling exceptions, since the caller will
|
||||
// want to know
|
||||
var jf = new java.io.File(path);
|
||||
var is = new java.io.FileInputStream(jf);
|
||||
return dj_readInputStream(is, encoding);
|
||||
}
|
||||
|
||||
function readUri(uri, encoding){
|
||||
var conn = (new java.net.URL(uri)).openConnection();
|
||||
encoding = encoding || conn.getContentEncoding() || "utf-8";
|
||||
var is = conn.getInputStream();
|
||||
return dj_readInputStream(is, encoding);
|
||||
}
|
||||
|
||||
function dj_readInputStream(is, encoding){
|
||||
var input = new java.io.BufferedReader(new java.io.InputStreamReader(is, encoding));
|
||||
try {
|
||||
var sb = new java.lang.StringBuffer();
|
||||
var line = "";
|
||||
while((line = input.readLine()) !== null){
|
||||
sb.append(line);
|
||||
sb.append(java.lang.System.getProperty("line.separator"));
|
||||
}
|
||||
return sb.toString();
|
||||
} finally {
|
||||
input.close();
|
||||
}
|
||||
}
|
||||
|
||||
dojo._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){
|
||||
// summary: Read the contents of the specified uri and return those contents.
|
||||
// uri:
|
||||
// A relative or absolute uri.
|
||||
// fail_ok:
|
||||
// Default false. If fail_ok and loading fails, return null
|
||||
// instead of throwing.
|
||||
// returns: The response text. null is returned when there is a
|
||||
// failure and failure is okay (an exception otherwise)
|
||||
try{
|
||||
var local = dojo._isLocalUrl(uri);
|
||||
var text = (local ? readText : readUri)(uri, "UTF-8");
|
||||
if(text !== null){
|
||||
//Force JavaScript string.
|
||||
text += "";
|
||||
}
|
||||
return text;
|
||||
}catch(e){
|
||||
if(fail_ok){
|
||||
return null;
|
||||
}else{
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// summary:
|
||||
// return the document object associated with the dojo.global
|
||||
dojo.doc = typeof document != "undefined" ? document : null;
|
||||
|
||||
dojo.body = function(){
|
||||
return document.body;
|
||||
}
|
||||
|
||||
// Supply setTimeout/clearTimeout implementations if they aren't already there
|
||||
// Note: this assumes that we define both if one is not provided... there might
|
||||
// be a better way to do this if there is a use case where one is defined but
|
||||
// not the other
|
||||
if(typeof setTimeout == "undefined" || typeof clearTimeout == "undefined"){
|
||||
dojo._timeouts = [];
|
||||
clearTimeout = function(idx){
|
||||
if(!dojo._timeouts[idx]){ return; }
|
||||
dojo._timeouts[idx].stop();
|
||||
}
|
||||
|
||||
setTimeout = function(func, delay){
|
||||
// summary: provides timed callbacks using Java threads
|
||||
|
||||
var def={
|
||||
sleepTime:delay,
|
||||
hasSlept:false,
|
||||
|
||||
run:function(){
|
||||
if(!this.hasSlept){
|
||||
this.hasSlept=true;
|
||||
java.lang.Thread.currentThread().sleep(this.sleepTime);
|
||||
}
|
||||
try{
|
||||
func();
|
||||
}catch(e){
|
||||
console.debug("Error running setTimeout thread:" + e);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var runnable = new java.lang.Runnable(def);
|
||||
var thread = new java.lang.Thread(runnable);
|
||||
thread.start();
|
||||
return dojo._timeouts.push(thread)-1;
|
||||
}
|
||||
}
|
||||
|
||||
//Register any module paths set up in djConfig. Need to do this
|
||||
//in the hostenvs since hostenv_browser can read djConfig from a
|
||||
//script tag's attribute.
|
||||
if(dojo.config["modulePaths"]){
|
||||
for(var param in dojo.config["modulePaths"]){
|
||||
dojo.registerModulePath(param, dojo.config["modulePaths"][param]);
|
||||
}
|
||||
}
|
||||
@@ -1,816 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.foo"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.foo"] = true;
|
||||
/*
|
||||
* loader.js - A bootstrap module. Runs before the hostenv_*.js file. Contains
|
||||
* all of the package loading methods.
|
||||
*/
|
||||
(function(){
|
||||
var d = dojo, currentModule;
|
||||
|
||||
d.mixin(d, {
|
||||
_loadedModules: {},
|
||||
_inFlightCount: 0,
|
||||
_hasResource: {},
|
||||
|
||||
_modulePrefixes: {
|
||||
dojo: { name: "dojo", value: "." },
|
||||
// dojox: { name: "dojox", value: "../dojox" },
|
||||
// dijit: { name: "dijit", value: "../dijit" },
|
||||
doh: { name: "doh", value: "../util/doh" },
|
||||
tests: { name: "tests", value: "tests" }
|
||||
},
|
||||
|
||||
_moduleHasPrefix: function(/*String*/module){
|
||||
// summary: checks to see if module has been established
|
||||
var mp = d._modulePrefixes;
|
||||
return !!(mp[module] && mp[module].value); // Boolean
|
||||
},
|
||||
|
||||
_getModulePrefix: function(/*String*/module){
|
||||
// summary: gets the prefix associated with module
|
||||
var mp = d._modulePrefixes;
|
||||
if(d._moduleHasPrefix(module)){
|
||||
return mp[module].value; // String
|
||||
}
|
||||
return module; // String
|
||||
},
|
||||
|
||||
_loadedUrls: [],
|
||||
|
||||
//WARNING:
|
||||
// This variable is referenced by packages outside of bootstrap:
|
||||
// FloatingPane.js and undo/browser.js
|
||||
_postLoad: false,
|
||||
|
||||
//Egad! Lots of test files push on this directly instead of using dojo.addOnLoad.
|
||||
_loaders: [],
|
||||
_unloaders: [],
|
||||
_loadNotifying: false
|
||||
});
|
||||
|
||||
|
||||
dojo._loadPath = function(/*String*/relpath, /*String?*/module, /*Function?*/cb){
|
||||
// summary:
|
||||
// Load a Javascript module given a relative path
|
||||
//
|
||||
// description:
|
||||
// Loads and interprets the script located at relpath, which is
|
||||
// relative to the script root directory. If the script is found but
|
||||
// its interpretation causes a runtime exception, that exception is
|
||||
// not caught by us, so the caller will see it. We return a true
|
||||
// value if and only if the script is found.
|
||||
//
|
||||
// relpath:
|
||||
// A relative path to a script (no leading '/', and typically ending
|
||||
// in '.js').
|
||||
// module:
|
||||
// A module whose existance to check for after loading a path. Can be
|
||||
// used to determine success or failure of the load.
|
||||
// cb:
|
||||
// a callback function to pass the result of evaluating the script
|
||||
|
||||
var uri = ((relpath.charAt(0) == '/' || relpath.match(/^\w+:/)) ? "" : d.baseUrl) + relpath;
|
||||
try{
|
||||
currentModule = module;
|
||||
return !module ? d._loadUri(uri, cb) : d._loadUriAndCheck(uri, module, cb); // Boolean
|
||||
}catch(e){
|
||||
console.error(e);
|
||||
return false; // Boolean
|
||||
}finally{
|
||||
currentModule = null;
|
||||
}
|
||||
}
|
||||
|
||||
dojo._loadUri = function(/*String*/uri, /*Function?*/cb){
|
||||
// summary:
|
||||
// Loads JavaScript from a URI
|
||||
// description:
|
||||
// Reads the contents of the URI, and evaluates the contents. This is
|
||||
// used to load modules as well as resource bundles. Returns true if
|
||||
// it succeeded. Returns false if the URI reading failed. Throws if
|
||||
// the evaluation throws.
|
||||
// uri: a uri which points at the script to be loaded
|
||||
// cb:
|
||||
// a callback function to process the result of evaluating the script
|
||||
// as an expression, typically used by the resource bundle loader to
|
||||
// load JSON-style resources
|
||||
|
||||
if(d._loadedUrls[uri]){
|
||||
return true; // Boolean
|
||||
}
|
||||
d._inFlightCount++; // block addOnLoad calls that arrive while we're busy downloading
|
||||
var contents = d._getText(uri, true);
|
||||
if(contents){ // not 404, et al
|
||||
d._loadedUrls[uri] = true;
|
||||
d._loadedUrls.push(uri);
|
||||
if(cb){
|
||||
//conditional to support script-inject i18n bundle format
|
||||
contents = /^define\(/.test(contents) ? contents : '('+contents+')';
|
||||
}else{
|
||||
//Only do the scoping if no callback. If a callback is specified,
|
||||
//it is most likely the i18n bundle stuff.
|
||||
contents = d._scopePrefix + contents + d._scopeSuffix;
|
||||
}
|
||||
if(!d.isIE){ contents += "\r\n//@ sourceURL=" + uri; } // debugging assist for Firebug
|
||||
var value = d["eval"](contents);
|
||||
if(cb){ cb(value); }
|
||||
}
|
||||
// Check to see if we need to call _callLoaded() due to an addOnLoad() that arrived while we were busy downloading
|
||||
if(--d._inFlightCount == 0 && d._postLoad && d._loaders.length){
|
||||
// We shouldn't be allowed to get here but Firefox allows an event
|
||||
// (mouse, keybd, async xhrGet) to interrupt a synchronous xhrGet.
|
||||
// If the current script block contains multiple require() statements, then after each
|
||||
// require() returns, inFlightCount == 0, but we want to hold the _callLoaded() until
|
||||
// all require()s are done since the out-of-sequence addOnLoad() presumably needs them all.
|
||||
// setTimeout allows the next require() to start (if needed), and then we check this again.
|
||||
setTimeout(function(){
|
||||
// If inFlightCount > 0, then multiple require()s are running sequentially and
|
||||
// the next require() started after setTimeout() was executed but before we got here.
|
||||
if(d._inFlightCount == 0){
|
||||
d._callLoaded();
|
||||
}
|
||||
}, 0);
|
||||
}
|
||||
return !!contents; // Boolean: contents? true : false
|
||||
}
|
||||
|
||||
// FIXME: probably need to add logging to this method
|
||||
dojo._loadUriAndCheck = function(/*String*/uri, /*String*/moduleName, /*Function?*/cb){
|
||||
// summary: calls loadUri then findModule and returns true if both succeed
|
||||
var ok = false;
|
||||
try{
|
||||
ok = d._loadUri(uri, cb);
|
||||
}catch(e){
|
||||
console.error("failed loading " + uri + " with error: " + e);
|
||||
}
|
||||
return !!(ok && d._loadedModules[moduleName]); // Boolean
|
||||
}
|
||||
|
||||
dojo.loaded = function(){
|
||||
// summary:
|
||||
// signal fired when initial environment and package loading is
|
||||
// complete. You should use dojo.addOnLoad() instead of doing a
|
||||
// direct dojo.connect() to this method in order to handle
|
||||
// initialization tasks that require the environment to be
|
||||
// initialized. In a browser host, declarative widgets will
|
||||
// be constructed when this function finishes runing.
|
||||
d._loadNotifying = true;
|
||||
d._postLoad = true;
|
||||
var mll = d._loaders;
|
||||
|
||||
//Clear listeners so new ones can be added
|
||||
//For other xdomain package loads after the initial load.
|
||||
d._loaders = [];
|
||||
|
||||
for(var x = 0; x < mll.length; x++){
|
||||
mll[x]();
|
||||
}
|
||||
|
||||
d._loadNotifying = false;
|
||||
|
||||
//Make sure nothing else got added to the onload queue
|
||||
//after this first run. If something did, and we are not waiting for any
|
||||
//more inflight resources, run again.
|
||||
if(d._postLoad && d._inFlightCount == 0 && mll.length){
|
||||
d._callLoaded();
|
||||
}
|
||||
}
|
||||
|
||||
dojo.unloaded = function(){
|
||||
// summary:
|
||||
// signal fired by impending environment destruction. You should use
|
||||
// dojo.addOnUnload() instead of doing a direct dojo.connect() to this
|
||||
// method to perform page/application cleanup methods. See
|
||||
// dojo.addOnUnload for more info.
|
||||
var mll = d._unloaders;
|
||||
while(mll.length){
|
||||
(mll.pop())();
|
||||
}
|
||||
}
|
||||
|
||||
d._onto = function(arr, obj, fn){
|
||||
if(!fn){
|
||||
arr.push(obj);
|
||||
}else if(fn){
|
||||
var func = (typeof fn == "string") ? obj[fn] : fn;
|
||||
arr.push(function(){ func.call(obj); });
|
||||
}
|
||||
}
|
||||
|
||||
dojo.ready = dojo.addOnLoad = function(/*Object*/obj, /*String|Function?*/functionName){
|
||||
// summary:
|
||||
// Registers a function to be triggered after the DOM and dojo.require() calls
|
||||
// have finished loading.
|
||||
//
|
||||
// description:
|
||||
// Registers a function to be triggered after the DOM has finished
|
||||
// loading and `dojo.require` modules have loaded. Widgets declared in markup
|
||||
// have been instantiated if `djConfig.parseOnLoad` is true when this fires.
|
||||
//
|
||||
// Images and CSS files may or may not have finished downloading when
|
||||
// the specified function is called. (Note that widgets' CSS and HTML
|
||||
// code is guaranteed to be downloaded before said widgets are
|
||||
// instantiated, though including css resouces BEFORE any script elements
|
||||
// is highly recommended).
|
||||
//
|
||||
// example:
|
||||
// Register an anonymous function to run when everything is ready
|
||||
// | dojo.addOnLoad(function(){ doStuff(); });
|
||||
//
|
||||
// example:
|
||||
// Register a function to run when everything is ready by pointer:
|
||||
// | var init = function(){ doStuff(); }
|
||||
// | dojo.addOnLoad(init);
|
||||
//
|
||||
// example:
|
||||
// Register a function to run scoped to `object`, either by name or anonymously:
|
||||
// | dojo.addOnLoad(object, "functionName");
|
||||
// | dojo.addOnLoad(object, function(){ doStuff(); });
|
||||
|
||||
d._onto(d._loaders, obj, functionName);
|
||||
|
||||
//Added for xdomain loading. dojo.addOnLoad is used to
|
||||
//indicate callbacks after doing some dojo.require() statements.
|
||||
//In the xdomain case, if all the requires are loaded (after initial
|
||||
//page load), then immediately call any listeners.
|
||||
if(d._postLoad && d._inFlightCount == 0 && !d._loadNotifying){
|
||||
d._callLoaded();
|
||||
}
|
||||
}
|
||||
|
||||
//Support calling dojo.addOnLoad via djConfig.addOnLoad. Support all the
|
||||
//call permutations of dojo.addOnLoad. Mainly useful when dojo is added
|
||||
//to the page after the page has loaded.
|
||||
var dca = d.config.addOnLoad;
|
||||
if(dca){
|
||||
d.addOnLoad[(dca instanceof Array ? "apply" : "call")](d, dca);
|
||||
}
|
||||
|
||||
dojo._modulesLoaded = function(){
|
||||
if(d._postLoad){ return; }
|
||||
if(d._inFlightCount > 0){
|
||||
console.warn("files still in flight!");
|
||||
return;
|
||||
}
|
||||
d._callLoaded();
|
||||
}
|
||||
|
||||
dojo._callLoaded = function(){
|
||||
|
||||
// The "object" check is for IE, and the other opera check fixes an
|
||||
// issue in Opera where it could not find the body element in some
|
||||
// widget test cases. For 0.9, maybe route all browsers through the
|
||||
// setTimeout (need protection still for non-browser environments
|
||||
// though). This might also help the issue with FF 2.0 and freezing
|
||||
// issues where we try to do sync xhr while background css images are
|
||||
// being loaded (trac #2572)? Consider for 0.9.
|
||||
if(typeof setTimeout == "object" || (d.config.useXDomain && d.isOpera)){
|
||||
setTimeout(
|
||||
d.isAIR ? function(){ d.loaded(); } : d._scopeName + ".loaded();",
|
||||
0);
|
||||
}else{
|
||||
d.loaded();
|
||||
}
|
||||
}
|
||||
|
||||
dojo._getModuleSymbols = function(/*String*/modulename){
|
||||
// summary:
|
||||
// Converts a module name in dotted JS notation to an array
|
||||
// representing the path in the source tree
|
||||
var syms = modulename.split(".");
|
||||
for(var i = syms.length; i>0; i--){
|
||||
var parentModule = syms.slice(0, i).join(".");
|
||||
if(i == 1 && !d._moduleHasPrefix(parentModule)){
|
||||
// Support default module directory (sibling of dojo) for top-level modules
|
||||
syms[0] = "../" + syms[0];
|
||||
}else{
|
||||
var parentModulePath = d._getModulePrefix(parentModule);
|
||||
if(parentModulePath != parentModule){
|
||||
syms.splice(0, i, parentModulePath);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return syms; // Array
|
||||
}
|
||||
|
||||
dojo._global_omit_module_check = false;
|
||||
|
||||
dojo.loadInit = function(/*Function*/init){
|
||||
// summary:
|
||||
// Executes a function that needs to be executed for the loader's dojo.requireIf
|
||||
// resolutions to work. This is needed mostly for the xdomain loader case where
|
||||
// a function needs to be executed to set up the possible values for a dojo.requireIf
|
||||
// call.
|
||||
// init:
|
||||
// a function reference. Executed immediately.
|
||||
// description: This function is mainly a marker for the xdomain loader to know parts of
|
||||
// code that needs be executed outside the function wrappper that is placed around modules.
|
||||
// The init function could be executed more than once, and it should make no assumptions
|
||||
// on what is loaded, or what modules are available. Only the functionality in Dojo Base
|
||||
// is allowed to be used. Avoid using this method. For a valid use case,
|
||||
// see the source for dojox.gfx.
|
||||
init();
|
||||
}
|
||||
|
||||
dojo._loadModule = dojo.require = function(/*String*/moduleName, /*Boolean?*/omitModuleCheck){
|
||||
// summary:
|
||||
// loads a Javascript module from the appropriate URI
|
||||
//
|
||||
// moduleName: String
|
||||
// module name to load, using periods for separators,
|
||||
// e.g. "dojo.date.locale". Module paths are de-referenced by dojo's
|
||||
// internal mapping of locations to names and are disambiguated by
|
||||
// longest prefix. See `dojo.registerModulePath()` for details on
|
||||
// registering new modules.
|
||||
//
|
||||
// omitModuleCheck: Boolean?
|
||||
// if `true`, omitModuleCheck skips the step of ensuring that the
|
||||
// loaded file actually defines the symbol it is referenced by.
|
||||
// For example if it called as `dojo.require("a.b.c")` and the
|
||||
// file located at `a/b/c.js` does not define an object `a.b.c`,
|
||||
// and exception will be throws whereas no exception is raised
|
||||
// when called as `dojo.require("a.b.c", true)`
|
||||
//
|
||||
// description:
|
||||
// Modules are loaded via dojo.require by using one of two loaders: the normal loader
|
||||
// and the xdomain loader. The xdomain loader is used when dojo was built with a
|
||||
// custom build that specified loader=xdomain and the module lives on a modulePath
|
||||
// that is a whole URL, with protocol and a domain. The versions of Dojo that are on
|
||||
// the Google and AOL CDNs use the xdomain loader.
|
||||
//
|
||||
// If the module is loaded via the xdomain loader, it is an asynchronous load, since
|
||||
// the module is added via a dynamically created script tag. This
|
||||
// means that dojo.require() can return before the module has loaded. However, this
|
||||
// should only happen in the case where you do dojo.require calls in the top-level
|
||||
// HTML page, or if you purposely avoid the loader checking for dojo.require
|
||||
// dependencies in your module by using a syntax like dojo["require"] to load the module.
|
||||
//
|
||||
// Sometimes it is useful to not have the loader detect the dojo.require calls in the
|
||||
// module so that you can dynamically load the modules as a result of an action on the
|
||||
// page, instead of right at module load time.
|
||||
//
|
||||
// Also, for script blocks in an HTML page, the loader does not pre-process them, so
|
||||
// it does not know to download the modules before the dojo.require calls occur.
|
||||
//
|
||||
// So, in those two cases, when you want on-the-fly module loading or for script blocks
|
||||
// in the HTML page, special care must be taken if the dojo.required code is loaded
|
||||
// asynchronously. To make sure you can execute code that depends on the dojo.required
|
||||
// modules, be sure to add the code that depends on the modules in a dojo.addOnLoad()
|
||||
// callback. dojo.addOnLoad waits for all outstanding modules to finish loading before
|
||||
// executing.
|
||||
//
|
||||
// This type of syntax works with both xdomain and normal loaders, so it is good
|
||||
// practice to always use this idiom for on-the-fly code loading and in HTML script
|
||||
// blocks. If at some point you change loaders and where the code is loaded from,
|
||||
// it will all still work.
|
||||
//
|
||||
// More on how dojo.require
|
||||
// `dojo.require("A.B")` first checks to see if symbol A.B is
|
||||
// defined. If it is, it is simply returned (nothing to do).
|
||||
//
|
||||
// If it is not defined, it will look for `A/B.js` in the script root
|
||||
// directory.
|
||||
//
|
||||
// `dojo.require` throws an exception if it cannot find a file
|
||||
// to load, or if the symbol `A.B` is not defined after loading.
|
||||
//
|
||||
// It returns the object `A.B`, but note the caveats above about on-the-fly loading and
|
||||
// HTML script blocks when the xdomain loader is loading a module.
|
||||
//
|
||||
// `dojo.require()` does nothing about importing symbols into
|
||||
// the current namespace. It is presumed that the caller will
|
||||
// take care of that.
|
||||
//
|
||||
// example:
|
||||
// To use dojo.require in conjunction with dojo.ready:
|
||||
//
|
||||
// | dojo.require("foo");
|
||||
// | dojo.require("bar");
|
||||
// | dojo.addOnLoad(function(){
|
||||
// | //you can now safely do something with foo and bar
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// For example, to import all symbols into a local block, you might write:
|
||||
//
|
||||
// | with (dojo.require("A.B")) {
|
||||
// | ...
|
||||
// | }
|
||||
//
|
||||
// And to import just the leaf symbol to a local variable:
|
||||
//
|
||||
// | var B = dojo.require("A.B");
|
||||
// | ...
|
||||
//
|
||||
// returns:
|
||||
// the required namespace object
|
||||
omitModuleCheck = d._global_omit_module_check || omitModuleCheck;
|
||||
|
||||
//Check if it is already loaded.
|
||||
var module = d._loadedModules[moduleName];
|
||||
if(module){
|
||||
return module;
|
||||
}
|
||||
|
||||
// convert periods to slashes
|
||||
var relpath = d._getModuleSymbols(moduleName).join("/") + '.js';
|
||||
var modArg = !omitModuleCheck ? moduleName : null;
|
||||
var ok = d._loadPath(relpath, modArg);
|
||||
if(!ok && !omitModuleCheck){
|
||||
throw new Error("Could not load '" + moduleName + "'; last tried '" + relpath + "'");
|
||||
}
|
||||
|
||||
// check that the symbol was defined
|
||||
// Don't bother if we're doing xdomain (asynchronous) loading.
|
||||
if(!omitModuleCheck && !d._isXDomain){
|
||||
// pass in false so we can give better error
|
||||
module = d._loadedModules[moduleName];
|
||||
if(!module){
|
||||
throw new Error("symbol '" + moduleName + "' is not defined after loading '" + relpath + "'");
|
||||
}
|
||||
}
|
||||
|
||||
return module;
|
||||
}
|
||||
|
||||
dojo.provide = function(/*String*/ resourceName){
|
||||
// summary:
|
||||
// Register a resource with the package system. Works in conjunction with `dojo.require`
|
||||
//
|
||||
// description:
|
||||
// Each javascript source file is called a resource. When a
|
||||
// resource is loaded by the browser, `dojo.provide()` registers
|
||||
// that it has been loaded.
|
||||
//
|
||||
// Each javascript source file must have at least one
|
||||
// `dojo.provide()` call at the top of the file, corresponding to
|
||||
// the file name. For example, `js/dojo/foo.js` must have
|
||||
// `dojo.provide("dojo.foo");` before any calls to
|
||||
// `dojo.require()` are made.
|
||||
//
|
||||
// For backwards compatibility reasons, in addition to registering
|
||||
// the resource, `dojo.provide()` also ensures that the javascript
|
||||
// object for the module exists. For example,
|
||||
// `dojo.provide("dojox.data.FlickrStore")`, in addition to
|
||||
// registering that `FlickrStore.js` is a resource for the
|
||||
// `dojox.data` module, will ensure that the `dojox.data`
|
||||
// javascript object exists, so that calls like
|
||||
// `dojo.data.foo = function(){ ... }` don't fail.
|
||||
//
|
||||
// In the case of a build where multiple javascript source files
|
||||
// are combined into one bigger file (similar to a .lib or .jar
|
||||
// file), that file may contain multiple dojo.provide() calls, to
|
||||
// note that it includes multiple resources.
|
||||
//
|
||||
// resourceName: String
|
||||
// A dot-sperated string identifying a resource.
|
||||
//
|
||||
// example:
|
||||
// Safely create a `my` object, and make dojo.require("my.CustomModule") work
|
||||
// | dojo.provide("my.CustomModule");
|
||||
|
||||
//Make sure we have a string.
|
||||
resourceName = resourceName + "";
|
||||
return (d._loadedModules[resourceName] = d.getObject(resourceName, true)); // Object
|
||||
}
|
||||
|
||||
//Start of old bootstrap2:
|
||||
|
||||
dojo.platformRequire = function(/*Object*/modMap){
|
||||
// summary:
|
||||
// require one or more modules based on which host environment
|
||||
// Dojo is currently operating in
|
||||
// description:
|
||||
// This method takes a "map" of arrays which one can use to
|
||||
// optionally load dojo modules. The map is indexed by the
|
||||
// possible dojo.name_ values, with two additional values:
|
||||
// "default" and "common". The items in the "default" array will
|
||||
// be loaded if none of the other items have been choosen based on
|
||||
// dojo.name_, set by your host environment. The items in the
|
||||
// "common" array will *always* be loaded, regardless of which
|
||||
// list is chosen.
|
||||
// example:
|
||||
// | dojo.platformRequire({
|
||||
// | browser: [
|
||||
// | "foo.sample", // simple module
|
||||
// | "foo.test",
|
||||
// | ["foo.bar.baz", true] // skip object check in _loadModule (dojo.require)
|
||||
// | ],
|
||||
// | default: [ "foo.sample._base" ],
|
||||
// | common: [ "important.module.common" ]
|
||||
// | });
|
||||
|
||||
var common = modMap.common || [];
|
||||
var result = common.concat(modMap[d._name] || modMap["default"] || []);
|
||||
|
||||
for(var x=0; x<result.length; x++){
|
||||
var curr = result[x];
|
||||
if(curr.constructor == Array){
|
||||
d._loadModule.apply(d, curr);
|
||||
}else{
|
||||
d._loadModule(curr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dojo.requireIf = function(/*Boolean*/ condition, /*String*/ resourceName){
|
||||
// summary:
|
||||
// If the condition is true then call `dojo.require()` for the specified
|
||||
// resource
|
||||
//
|
||||
// example:
|
||||
// | dojo.requireIf(dojo.isBrowser, "my.special.Module");
|
||||
|
||||
if(condition === true){
|
||||
// FIXME: why do we support chained require()'s here? does the build system?
|
||||
var args = [];
|
||||
for(var i = 1; i < arguments.length; i++){
|
||||
args.push(arguments[i]);
|
||||
}
|
||||
d.require.apply(d, args);
|
||||
}
|
||||
}
|
||||
|
||||
dojo.requireAfterIf = d.requireIf;
|
||||
|
||||
dojo.registerModulePath = function(/*String*/module, /*String*/prefix){
|
||||
// summary:
|
||||
// Maps a module name to a path
|
||||
// description:
|
||||
// An unregistered module is given the default path of ../[module],
|
||||
// relative to Dojo root. For example, module acme is mapped to
|
||||
// ../acme. If you want to use a different module name, use
|
||||
// dojo.registerModulePath.
|
||||
// example:
|
||||
// If your dojo.js is located at this location in the web root:
|
||||
// | /myapp/js/dojo/dojo/dojo.js
|
||||
// and your modules are located at:
|
||||
// | /myapp/js/foo/bar.js
|
||||
// | /myapp/js/foo/baz.js
|
||||
// | /myapp/js/foo/thud/xyzzy.js
|
||||
// Your application can tell Dojo to locate the "foo" namespace by calling:
|
||||
// | dojo.registerModulePath("foo", "../../foo");
|
||||
// At which point you can then use dojo.require() to load the
|
||||
// modules (assuming they provide() the same things which are
|
||||
// required). The full code might be:
|
||||
// | <script type="text/javascript"
|
||||
// | src="/myapp/js/dojo/dojo/dojo.js"></script>
|
||||
// | <script type="text/javascript">
|
||||
// | dojo.registerModulePath("foo", "../../foo");
|
||||
// | dojo.require("foo.bar");
|
||||
// | dojo.require("foo.baz");
|
||||
// | dojo.require("foo.thud.xyzzy");
|
||||
// | </script>
|
||||
d._modulePrefixes[module] = { name: module, value: prefix };
|
||||
};
|
||||
|
||||
dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){
|
||||
// summary:
|
||||
// Declares translated resources and loads them if necessary, in the
|
||||
// same style as dojo.require. Contents of the resource bundle are
|
||||
// typically strings, but may be any name/value pair, represented in
|
||||
// JSON format. See also `dojo.i18n.getLocalization`.
|
||||
//
|
||||
// description:
|
||||
// Load translated resource bundles provided underneath the "nls"
|
||||
// directory within a package. Translated resources may be located in
|
||||
// different packages throughout the source tree.
|
||||
//
|
||||
// Each directory is named for a locale as specified by RFC 3066,
|
||||
// (http://www.ietf.org/rfc/rfc3066.txt), normalized in lowercase.
|
||||
// Note that the two bundles in the example do not define all the
|
||||
// same variants. For a given locale, bundles will be loaded for
|
||||
// that locale and all more general locales above it, including a
|
||||
// fallback at the root directory. For example, a declaration for
|
||||
// the "de-at" locale will first load `nls/de-at/bundleone.js`,
|
||||
// then `nls/de/bundleone.js` and finally `nls/bundleone.js`. The
|
||||
// data will be flattened into a single Object so that lookups
|
||||
// will follow this cascading pattern. An optional build step can
|
||||
// preload the bundles to avoid data redundancy and the multiple
|
||||
// network hits normally required to load these resources.
|
||||
//
|
||||
// moduleName:
|
||||
// name of the package containing the "nls" directory in which the
|
||||
// bundle is found
|
||||
//
|
||||
// bundleName:
|
||||
// bundle name, i.e. the filename without the '.js' suffix. Using "nls" as a
|
||||
// a bundle name is not supported, since "nls" is the name of the folder
|
||||
// that holds bundles. Using "nls" as the bundle name will cause problems
|
||||
// with the custom build.
|
||||
//
|
||||
// locale:
|
||||
// the locale to load (optional) By default, the browser's user
|
||||
// locale as defined by dojo.locale
|
||||
//
|
||||
// availableFlatLocales:
|
||||
// A comma-separated list of the available, flattened locales for this
|
||||
// bundle. This argument should only be set by the build process.
|
||||
//
|
||||
// example:
|
||||
// A particular widget may define one or more resource bundles,
|
||||
// structured in a program as follows, where moduleName is
|
||||
// mycode.mywidget and bundleNames available include bundleone and
|
||||
// bundletwo:
|
||||
// | ...
|
||||
// | mycode/
|
||||
// | mywidget/
|
||||
// | nls/
|
||||
// | bundleone.js (the fallback translation, English in this example)
|
||||
// | bundletwo.js (also a fallback translation)
|
||||
// | de/
|
||||
// | bundleone.js
|
||||
// | bundletwo.js
|
||||
// | de-at/
|
||||
// | bundleone.js
|
||||
// | en/
|
||||
// | (empty; use the fallback translation)
|
||||
// | en-us/
|
||||
// | bundleone.js
|
||||
// | en-gb/
|
||||
// | bundleone.js
|
||||
// | es/
|
||||
// | bundleone.js
|
||||
// | bundletwo.js
|
||||
// | ...etc
|
||||
// | ...
|
||||
//
|
||||
|
||||
d.require("dojo.i18n");
|
||||
d.i18n._requireLocalization.apply(d.hostenv, arguments);
|
||||
};
|
||||
|
||||
|
||||
var ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),
|
||||
ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$");
|
||||
|
||||
dojo._Url = function(/*dojo._Url|String...*/){
|
||||
// summary:
|
||||
// Constructor to create an object representing a URL.
|
||||
// It is marked as private, since we might consider removing
|
||||
// or simplifying it.
|
||||
// description:
|
||||
// Each argument is evaluated in order relative to the next until
|
||||
// a canonical uri is produced. To get an absolute Uri relative to
|
||||
// the current document use:
|
||||
// new dojo._Url(document.baseURI, url)
|
||||
|
||||
var n = null,
|
||||
_a = arguments,
|
||||
uri = [_a[0]];
|
||||
// resolve uri components relative to each other
|
||||
for(var i = 1; i<_a.length; i++){
|
||||
if(!_a[i]){ continue; }
|
||||
|
||||
// Safari doesn't support this.constructor so we have to be explicit
|
||||
// FIXME: Tracked (and fixed) in Webkit bug 3537.
|
||||
// http://bugs.webkit.org/show_bug.cgi?id=3537
|
||||
var relobj = new d._Url(_a[i]+""),
|
||||
uriobj = new d._Url(uri[0]+"");
|
||||
|
||||
if(
|
||||
relobj.path == "" &&
|
||||
!relobj.scheme &&
|
||||
!relobj.authority &&
|
||||
!relobj.query
|
||||
){
|
||||
if(relobj.fragment != n){
|
||||
uriobj.fragment = relobj.fragment;
|
||||
}
|
||||
relobj = uriobj;
|
||||
}else if(!relobj.scheme){
|
||||
relobj.scheme = uriobj.scheme;
|
||||
|
||||
if(!relobj.authority){
|
||||
relobj.authority = uriobj.authority;
|
||||
|
||||
if(relobj.path.charAt(0) != "/"){
|
||||
var path = uriobj.path.substring(0,
|
||||
uriobj.path.lastIndexOf("/") + 1) + relobj.path;
|
||||
|
||||
var segs = path.split("/");
|
||||
for(var j = 0; j < segs.length; j++){
|
||||
if(segs[j] == "."){
|
||||
// flatten "./" references
|
||||
if(j == segs.length - 1){
|
||||
segs[j] = "";
|
||||
}else{
|
||||
segs.splice(j, 1);
|
||||
j--;
|
||||
}
|
||||
}else if(j > 0 && !(j == 1 && segs[0] == "") &&
|
||||
segs[j] == ".." && segs[j-1] != ".."){
|
||||
// flatten "../" references
|
||||
if(j == (segs.length - 1)){
|
||||
segs.splice(j, 1);
|
||||
segs[j - 1] = "";
|
||||
}else{
|
||||
segs.splice(j - 1, 2);
|
||||
j -= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
relobj.path = segs.join("/");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uri = [];
|
||||
if(relobj.scheme){
|
||||
uri.push(relobj.scheme, ":");
|
||||
}
|
||||
if(relobj.authority){
|
||||
uri.push("//", relobj.authority);
|
||||
}
|
||||
uri.push(relobj.path);
|
||||
if(relobj.query){
|
||||
uri.push("?", relobj.query);
|
||||
}
|
||||
if(relobj.fragment){
|
||||
uri.push("#", relobj.fragment);
|
||||
}
|
||||
}
|
||||
|
||||
this.uri = uri.join("");
|
||||
|
||||
// break the uri into its main components
|
||||
var r = this.uri.match(ore);
|
||||
|
||||
this.scheme = r[2] || (r[1] ? "" : n);
|
||||
this.authority = r[4] || (r[3] ? "" : n);
|
||||
this.path = r[5]; // can never be undefined
|
||||
this.query = r[7] || (r[6] ? "" : n);
|
||||
this.fragment = r[9] || (r[8] ? "" : n);
|
||||
|
||||
if(this.authority != n){
|
||||
// server based naming authority
|
||||
r = this.authority.match(ire);
|
||||
|
||||
this.user = r[3] || n;
|
||||
this.password = r[4] || n;
|
||||
this.host = r[6] || r[7]; // ipv6 || ipv4
|
||||
this.port = r[9] || n;
|
||||
}
|
||||
}
|
||||
|
||||
dojo._Url.prototype.toString = function(){ return this.uri; };
|
||||
|
||||
dojo.moduleUrl = function(/*String*/module, /*dojo._Url||String*/url){
|
||||
// summary:
|
||||
// Returns a `dojo._Url` object relative to a module.
|
||||
// example:
|
||||
// | var pngPath = dojo.moduleUrl("acme","images/small.png");
|
||||
// | console.dir(pngPath); // list the object properties
|
||||
// | // create an image and set it's source to pngPath's value:
|
||||
// | var img = document.createElement("img");
|
||||
// | // NOTE: we assign the string representation of the url object
|
||||
// | img.src = pngPath.toString();
|
||||
// | // add our image to the document
|
||||
// | dojo.body().appendChild(img);
|
||||
// example:
|
||||
// you may de-reference as far as you like down the package
|
||||
// hierarchy. This is sometimes handy to avoid lenghty relative
|
||||
// urls or for building portable sub-packages. In this example,
|
||||
// the `acme.widget` and `acme.util` directories may be located
|
||||
// under different roots (see `dojo.registerModulePath`) but the
|
||||
// the modules which reference them can be unaware of their
|
||||
// relative locations on the filesystem:
|
||||
// | // somewhere in a configuration block
|
||||
// | dojo.registerModulePath("acme.widget", "../../acme/widget");
|
||||
// | dojo.registerModulePath("acme.util", "../../util");
|
||||
// |
|
||||
// | // ...
|
||||
// |
|
||||
// | // code in a module using acme resources
|
||||
// | var tmpltPath = dojo.moduleUrl("acme.widget","templates/template.html");
|
||||
// | var dataPath = dojo.moduleUrl("acme.util","resources/data.json");
|
||||
|
||||
var loc = d._getModuleSymbols(module).join('/');
|
||||
if(!loc){ return null; }
|
||||
if(loc.lastIndexOf("/") != loc.length-1){
|
||||
loc += "/";
|
||||
}
|
||||
|
||||
//If the path is an absolute path (starts with a / or is on another
|
||||
//domain/xdomain) then don't add the baseUrl.
|
||||
var colonIndex = loc.indexOf(":");
|
||||
if(loc.charAt(0) != "/" && (colonIndex == -1 || colonIndex > loc.indexOf("/"))){
|
||||
loc = d.baseUrl + loc;
|
||||
}
|
||||
|
||||
return new d._Url(loc, url); // dojo._Url
|
||||
};
|
||||
|
||||
|
||||
|
||||
})();
|
||||
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base._loader.loader_debug"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base._loader.loader_debug"] = true;
|
||||
dojo.provide("dojo._base._loader.loader_debug");
|
||||
|
||||
//Override dojo.provide, so we can trigger the next
|
||||
//script tag for the next local module. We can only add one
|
||||
//at a time because there are browsers that execute script tags
|
||||
//in the order that the code is received, and not in the DOM order.
|
||||
dojo.nonDebugProvide = dojo.provide;
|
||||
|
||||
dojo.provide = function(resourceName){
|
||||
var dbgQueue = dojo["_xdDebugQueue"];
|
||||
if(dbgQueue && dbgQueue.length > 0 && resourceName == dbgQueue["currentResourceName"]){
|
||||
//Set a timeout so the module can be executed into existence. Normally the
|
||||
//dojo.provide call in a module is the first line. Don't want to risk attaching
|
||||
//another script tag until the current one finishes executing.
|
||||
if(dojo.isAIR){
|
||||
window.setTimeout(function(){dojo._xdDebugFileLoaded(resourceName);}, 1);
|
||||
}else{
|
||||
window.setTimeout(dojo._scopeName + "._xdDebugFileLoaded('" + resourceName + "')", 1);
|
||||
}
|
||||
}
|
||||
|
||||
return dojo.nonDebugProvide.apply(dojo, arguments);
|
||||
}
|
||||
|
||||
dojo._xdDebugFileLoaded = function(resourceName){
|
||||
|
||||
if(!dojo._xdDebugScopeChecked){
|
||||
//If using a scoped dojo, we need to expose dojo as a real global
|
||||
//for the debugAtAllCosts stuff to work.
|
||||
if(dojo._scopeName != "dojo"){
|
||||
window.dojo = window[dojo.config.scopeMap[0][1]];
|
||||
window.dijit = window[dojo.config.scopeMap[1][1]];
|
||||
window.dojox = window[dojo.config.scopeMap[2][1]];
|
||||
}
|
||||
|
||||
dojo._xdDebugScopeChecked = true;
|
||||
}
|
||||
|
||||
var dbgQueue = dojo._xdDebugQueue;
|
||||
|
||||
if(resourceName && resourceName == dbgQueue.currentResourceName){
|
||||
dbgQueue.shift();
|
||||
}
|
||||
|
||||
if(dbgQueue.length == 0){
|
||||
//Check for more modules that need debug loading.
|
||||
//dojo._xdWatchInFlight will add more things to the debug
|
||||
//queue if they just recently loaded but it was not detected
|
||||
//between the dojo._xdWatchInFlight intervals.
|
||||
dojo._xdWatchInFlight();
|
||||
}
|
||||
|
||||
if(dbgQueue.length == 0){
|
||||
dbgQueue.currentResourceName = null;
|
||||
|
||||
//Make sure nothing else is in flight.
|
||||
//If something is still in flight, then it still
|
||||
//needs to be added to debug queue after it loads.
|
||||
for(var param in dojo._xdInFlight){
|
||||
if(dojo._xdInFlight[param] === true){
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
dojo._xdNotifyLoaded();
|
||||
}else{
|
||||
if(resourceName == dbgQueue.currentResourceName){
|
||||
dbgQueue.currentResourceName = dbgQueue[0].resourceName;
|
||||
var element = document.createElement("script");
|
||||
element.type = "text/javascript";
|
||||
element.src = dbgQueue[0].resourcePath;
|
||||
document.getElementsByTagName("head")[0].appendChild(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,727 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base._loader.loader_xd"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base._loader.loader_xd"] = true;
|
||||
//Cross-domain resource loader.
|
||||
dojo.provide("dojo._base._loader.loader_xd");
|
||||
|
||||
dojo._xdReset = function(){
|
||||
//summary: Internal xd loader function. Resets the xd state.
|
||||
|
||||
//This flag indicates where or not we have crossed into xdomain territory. Once any resource says
|
||||
//it is cross domain, then the rest of the resources have to be treated as xdomain because we need
|
||||
//to evaluate resources in order. If there is a xdomain resource followed by a xhr resource, we can't load
|
||||
//the xhr resource until the one before it finishes loading. The text of the xhr resource will be converted
|
||||
//to match the format for a xd resource and put in the xd load queue.
|
||||
dojo._isXDomain = dojo.config.useXDomain || false;
|
||||
|
||||
dojo._xdClearInterval();
|
||||
dojo._xdInFlight = {};
|
||||
dojo._xdOrderedReqs = [];
|
||||
dojo._xdDepMap = {};
|
||||
dojo._xdContents = [];
|
||||
dojo._xdDefList = [];
|
||||
}
|
||||
|
||||
dojo._xdClearInterval = function(){
|
||||
//summary: Internal xd loader function.
|
||||
//Clears the interval timer used to check on the
|
||||
//status of in-flight xd module resource requests.
|
||||
if(dojo._xdTimer){
|
||||
clearInterval(dojo._xdTimer);
|
||||
dojo._xdTimer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Call reset immediately to set the state.
|
||||
dojo._xdReset();
|
||||
|
||||
dojo._xdCreateResource = function(/*String*/contents, /*String*/resourceName, /*String*/resourcePath){
|
||||
//summary: Internal xd loader function. Creates an xd module source given an
|
||||
//non-xd module contents.
|
||||
|
||||
//Remove comments. Not perfect, but good enough for dependency resolution.
|
||||
var depContents = contents.replace(/(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg , "");
|
||||
|
||||
//Find dependencies.
|
||||
var deps = [];
|
||||
var depRegExp = /dojo.(require|requireIf|provide|requireAfterIf|platformRequire|requireLocalization)\s*\(([\w\W]*?)\)/mg;
|
||||
var match;
|
||||
while((match = depRegExp.exec(depContents)) != null){
|
||||
if(match[1] == "requireLocalization"){
|
||||
//Need to load the local bundles asap, since they are not
|
||||
//part of the list of modules watched for loading.
|
||||
eval(match[0]);
|
||||
}else{
|
||||
deps.push('"' + match[1] + '", ' + match[2]);
|
||||
}
|
||||
}
|
||||
|
||||
//Create resource object and the call to _xdResourceLoaded.
|
||||
var output = [];
|
||||
output.push(dojo._scopeName + "._xdResourceLoaded(function(" + dojo._scopePrefixArgs + "){\n");
|
||||
|
||||
//See if there are any dojo.loadInit calls
|
||||
var loadInitCalls = dojo._xdExtractLoadInits(contents);
|
||||
if(loadInitCalls){
|
||||
//Adjust fileContents since extractLoadInits removed something.
|
||||
contents = loadInitCalls[0];
|
||||
|
||||
//Add any loadInit calls to the top of the xd file.
|
||||
for(var i = 1; i < loadInitCalls.length; i++){
|
||||
output.push(loadInitCalls[i] + ";\n");
|
||||
}
|
||||
}
|
||||
|
||||
output.push("return {");
|
||||
|
||||
//Add dependencies
|
||||
if(deps.length > 0){
|
||||
output.push("depends: [");
|
||||
for(i = 0; i < deps.length; i++){
|
||||
if(i > 0){
|
||||
output.push(",\n");
|
||||
}
|
||||
output.push("[" + deps[i] + "]");
|
||||
}
|
||||
output.push("],");
|
||||
}
|
||||
|
||||
//Add the contents of the file inside a function.
|
||||
//Pass in scope arguments so we can support multiple versions of the
|
||||
//same module on a page.
|
||||
output.push("\ndefineResource: function(" + dojo._scopePrefixArgs + "){");
|
||||
|
||||
//Don't put in the contents in the debugAtAllCosts case
|
||||
//since the contents may have syntax errors. Let those
|
||||
//get pushed up when the script tags are added to the page
|
||||
//in the debugAtAllCosts case.
|
||||
if(!dojo.config["debugAtAllCosts"] || resourceName == "dojo._base._loader.loader_debug"){
|
||||
output.push(contents);
|
||||
}
|
||||
//Add isLocal property so we know if we have to do something different
|
||||
//in debugAtAllCosts situations.
|
||||
output.push("\n}, resourceName: '" + resourceName + "', resourcePath: '" + resourcePath + "'};});");
|
||||
|
||||
return output.join(""); //String
|
||||
}
|
||||
|
||||
dojo._xdExtractLoadInits = function(/*String*/fileContents){
|
||||
//Extracts
|
||||
var regexp = /dojo.loadInit\s*\(/g;
|
||||
regexp.lastIndex = 0;
|
||||
|
||||
var parenRe = /[\(\)]/g;
|
||||
parenRe.lastIndex = 0;
|
||||
|
||||
var results = [];
|
||||
var matches;
|
||||
while((matches = regexp.exec(fileContents))){
|
||||
//Find end of the call by finding the matching end paren
|
||||
parenRe.lastIndex = regexp.lastIndex;
|
||||
var matchCount = 1;
|
||||
var parenMatch;
|
||||
while((parenMatch = parenRe.exec(fileContents))){
|
||||
if(parenMatch[0] == ")"){
|
||||
matchCount -= 1;
|
||||
}else{
|
||||
matchCount += 1;
|
||||
}
|
||||
if(matchCount == 0){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(matchCount != 0){
|
||||
throw "unmatched paren around character " + parenRe.lastIndex + " in: " + fileContents;
|
||||
}
|
||||
|
||||
//Put the master matching string in the results.
|
||||
var startIndex = regexp.lastIndex - matches[0].length;
|
||||
results.push(fileContents.substring(startIndex, parenRe.lastIndex));
|
||||
|
||||
//Remove the matching section.
|
||||
var remLength = parenRe.lastIndex - startIndex;
|
||||
fileContents = fileContents.substring(0, startIndex) + fileContents.substring(parenRe.lastIndex, fileContents.length);
|
||||
|
||||
//Move the master regexp past the last matching paren point.
|
||||
regexp.lastIndex = parenRe.lastIndex - remLength;
|
||||
|
||||
regexp.lastIndex = parenRe.lastIndex;
|
||||
}
|
||||
|
||||
if(results.length > 0){
|
||||
results.unshift(fileContents);
|
||||
}
|
||||
|
||||
return (results.length ? results : null);
|
||||
}
|
||||
|
||||
dojo._xdIsXDomainPath = function(/*string*/relpath) {
|
||||
//summary: Figure out whether the path is local or x-domain
|
||||
//If there is a colon before the first / then, we have a URL with a protocol.
|
||||
|
||||
var colonIndex = relpath.indexOf(":");
|
||||
var slashIndex = relpath.indexOf("/");
|
||||
|
||||
if(colonIndex > 0 && colonIndex < slashIndex || relpath.indexOf("//") === 0){
|
||||
return true;
|
||||
}else{
|
||||
//Is the base script URI-based URL a cross domain URL?
|
||||
//If so, then the relpath will be evaluated relative to
|
||||
//baseUrl, and therefore qualify as xdomain.
|
||||
//Only treat it as xdomain if the page does not have a
|
||||
//host (file:// url), if the baseUrl does not match the
|
||||
//current window's domain, or if the baseUrl starts with //.
|
||||
//If baseUrl starts with // then it probably means that xdomain
|
||||
//is wanted since it is such a specific path request. This is not completely robust,
|
||||
//but something more robust would require normalizing the protocol on baseUrl and on the location
|
||||
//to see if they differ. However, that requires more code, and // as a start path is unusual.
|
||||
var url = dojo.baseUrl;
|
||||
colonIndex = url.indexOf(":");
|
||||
slashIndex = url.indexOf("/");
|
||||
if(url.indexOf("//") === 0 || (colonIndex > 0 && colonIndex < slashIndex && (!location.host || url.indexOf("http://" + location.host) != 0))){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
dojo._loadPath = function(/*String*/relpath, /*String?*/module, /*Function?*/cb){
|
||||
//summary: Internal xd loader function. Overrides loadPath() from loader.js.
|
||||
//xd loading requires slightly different behavior from loadPath().
|
||||
|
||||
var currentIsXDomain = dojo._xdIsXDomainPath(relpath);
|
||||
dojo._isXDomain |= currentIsXDomain;
|
||||
|
||||
var uri = ((relpath.charAt(0) == '/' || relpath.match(/^\w+:/)) ? "" : dojo.baseUrl) + relpath;
|
||||
|
||||
try{
|
||||
return ((!module || dojo._isXDomain) ? dojo._loadUri(uri, cb, currentIsXDomain, module) : dojo._loadUriAndCheck(uri, module, cb)); //Boolean
|
||||
}catch(e){
|
||||
console.error(e);
|
||||
return false; //Boolean
|
||||
}
|
||||
}
|
||||
|
||||
dojo._xdCharSet = "utf-8";
|
||||
|
||||
dojo._loadUri = function(/*String*/uri, /*Function?*/cb, /*boolean*/currentIsXDomain, /*String?*/module){
|
||||
//summary: Internal xd loader function. Overrides loadUri() from loader.js.
|
||||
// xd loading requires slightly different behavior from loadPath().
|
||||
//description: Wanted to override getText(), but it is used by
|
||||
// the widget code in too many, synchronous ways right now.
|
||||
if(dojo._loadedUrls[uri]){
|
||||
return 1; //Boolean
|
||||
}
|
||||
|
||||
//Add the module (resource) to the list of modules.
|
||||
//Only do this work if we have a modlue name. Otherwise,
|
||||
//it is a non-xd i18n bundle, which can load immediately and does not
|
||||
//need to be tracked. Also, don't track dojo.i18n, since it is a prerequisite
|
||||
//and will be loaded correctly if we load it right away: it has no dependencies.
|
||||
if(dojo._isXDomain && module && module != "dojo.i18n"){
|
||||
dojo._xdOrderedReqs.push(module);
|
||||
|
||||
//Add to waiting resources if it is an xdomain resource.
|
||||
//Don't add non-xdomain i18n bundles, those get evaled immediately.
|
||||
if(currentIsXDomain || uri.indexOf("/nls/") == -1){
|
||||
dojo._xdInFlight[module] = true;
|
||||
|
||||
//Increment inFlightCount
|
||||
//This will stop the modulesLoaded from firing all the way.
|
||||
dojo._inFlightCount++;
|
||||
}
|
||||
|
||||
//Start timer
|
||||
if(!dojo._xdTimer){
|
||||
if(dojo.isAIR){
|
||||
dojo._xdTimer = setInterval(function(){dojo._xdWatchInFlight();}, 100);
|
||||
}else{
|
||||
dojo._xdTimer = setInterval(dojo._scopeName + "._xdWatchInFlight();", 100);
|
||||
}
|
||||
}
|
||||
dojo._xdStartTime = (new Date()).getTime();
|
||||
}
|
||||
|
||||
if (currentIsXDomain){
|
||||
//Fix name to be a .xd.fileextension name.
|
||||
var lastIndex = uri.lastIndexOf('.');
|
||||
if(lastIndex <= 0){
|
||||
lastIndex = uri.length - 1;
|
||||
}
|
||||
|
||||
var xdUri = uri.substring(0, lastIndex) + ".xd";
|
||||
if(lastIndex != uri.length - 1){
|
||||
xdUri += uri.substring(lastIndex, uri.length);
|
||||
}
|
||||
|
||||
if (dojo.isAIR){
|
||||
xdUri = xdUri.replace("app:/", "/");
|
||||
}
|
||||
|
||||
//Add to script src
|
||||
var element = document.createElement("script");
|
||||
element.type = "text/javascript";
|
||||
if(dojo._xdCharSet){
|
||||
element.charset = dojo._xdCharSet;
|
||||
}
|
||||
element.src = xdUri;
|
||||
if(!dojo.headElement){
|
||||
dojo._headElement = document.getElementsByTagName("head")[0];
|
||||
|
||||
//Head element may not exist, particularly in html
|
||||
//html 4 or tag soup cases where the page does not
|
||||
//have a head tag in it. Use html element, since that will exist.
|
||||
//Seems to be an issue mostly with Opera 9 and to lesser extent Safari 2
|
||||
if(!dojo._headElement){
|
||||
dojo._headElement = document.getElementsByTagName("html")[0];
|
||||
}
|
||||
}
|
||||
dojo._headElement.appendChild(element);
|
||||
}else{
|
||||
var contents = dojo._getText(uri, null, true);
|
||||
if(contents == null){ return 0; /*boolean*/}
|
||||
|
||||
//If this is not xdomain, or if loading a i18n resource bundle, then send it down
|
||||
//the normal eval/callback path.
|
||||
if(dojo._isXDomain
|
||||
&& uri.indexOf("/nls/") == -1
|
||||
&& module != "dojo.i18n"){
|
||||
var res = dojo._xdCreateResource(contents, module, uri);
|
||||
dojo.eval(res);
|
||||
}else{
|
||||
if(cb){
|
||||
contents = '('+contents+')';
|
||||
}else{
|
||||
//Only do the scoping if no callback. If a callback is specified,
|
||||
//it is most likely the i18n bundle stuff.
|
||||
contents = dojo._scopePrefix + contents + dojo._scopeSuffix;
|
||||
}
|
||||
var value = dojo["eval"](contents+"\r\n//@ sourceURL="+uri);
|
||||
if(cb){
|
||||
cb(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//These steps are done in the non-xd loader version of this function.
|
||||
//Maintain these steps to fit in with the existing system.
|
||||
dojo._loadedUrls[uri] = true;
|
||||
dojo._loadedUrls.push(uri);
|
||||
return true; //Boolean
|
||||
}
|
||||
|
||||
dojo._xdResourceLoaded = function(/*Object*/res){
|
||||
//summary: Internal xd loader function. Called by an xd module resource when
|
||||
//it has been loaded via a script tag.
|
||||
|
||||
//Evaluate the function with scopeArgs for multiversion support.
|
||||
res = res.apply(dojo.global, dojo._scopeArgs);
|
||||
|
||||
//Work through dependencies.
|
||||
var deps = res.depends;
|
||||
var requireList = null;
|
||||
var requireAfterList = null;
|
||||
var provideList = [];
|
||||
if(deps && deps.length > 0){
|
||||
var dep = null;
|
||||
var insertHint = 0;
|
||||
var attachedResource = false;
|
||||
for(var i = 0; i < deps.length; i++){
|
||||
dep = deps[i];
|
||||
|
||||
//Look for specific dependency indicators.
|
||||
if (dep[0] == "provide"){
|
||||
provideList.push(dep[1]);
|
||||
}else{
|
||||
if(!requireList){
|
||||
requireList = [];
|
||||
}
|
||||
if(!requireAfterList){
|
||||
requireAfterList = [];
|
||||
}
|
||||
|
||||
var unpackedDeps = dojo._xdUnpackDependency(dep);
|
||||
if(unpackedDeps.requires){
|
||||
requireList = requireList.concat(unpackedDeps.requires);
|
||||
}
|
||||
if(unpackedDeps.requiresAfter){
|
||||
requireAfterList = requireAfterList.concat(unpackedDeps.requiresAfter);
|
||||
}
|
||||
}
|
||||
|
||||
//Call the dependency indicator to allow for the normal dojo setup.
|
||||
//Only allow for one dot reference, for the i18n._preloadLocalizations calls
|
||||
//(and maybe future, one-dot things).
|
||||
var depType = dep[0];
|
||||
var objPath = depType.split(".");
|
||||
if(objPath.length == 2){
|
||||
dojo[objPath[0]][objPath[1]].apply(dojo[objPath[0]], dep.slice(1));
|
||||
}else{
|
||||
dojo[depType].apply(dojo, dep.slice(1));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//If loading the debugAtAllCosts module, eval it right away since we need
|
||||
//its functions to properly load the other modules.
|
||||
if(provideList.length == 1 && provideList[0] == "dojo._base._loader.loader_debug"){
|
||||
res.defineResource(dojo);
|
||||
}else{
|
||||
//Save off the resource contents for definition later.
|
||||
var contentIndex = dojo._xdContents.push({
|
||||
content: res.defineResource,
|
||||
resourceName: res["resourceName"],
|
||||
resourcePath: res["resourcePath"],
|
||||
isDefined: false
|
||||
}) - 1;
|
||||
|
||||
//Add provide/requires to dependency map.
|
||||
for(i = 0; i < provideList.length; i++){
|
||||
dojo._xdDepMap[provideList[i]] = { requires: requireList, requiresAfter: requireAfterList, contentIndex: contentIndex };
|
||||
}
|
||||
}
|
||||
|
||||
//Now update the inflight status for any provided resources in this loaded resource.
|
||||
//Do this at the very end (in a *separate* for loop) to avoid shutting down the
|
||||
//inflight timer check too soon.
|
||||
for(i = 0; i < provideList.length; i++){
|
||||
dojo._xdInFlight[provideList[i]] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dojo._xdLoadFlattenedBundle = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*Object*/bundleData){
|
||||
//summary: Internal xd loader function. Used when loading
|
||||
//a flattened localized bundle via a script tag.
|
||||
locale = locale || "root";
|
||||
var jsLoc = dojo.i18n.normalizeLocale(locale).replace('-', '_');
|
||||
var bundleResource = [moduleName, "nls", bundleName].join(".");
|
||||
var bundle = dojo["provide"](bundleResource);
|
||||
bundle[jsLoc] = bundleData;
|
||||
|
||||
//Assign the bundle for the original locale(s) we wanted.
|
||||
var mapName = [moduleName, jsLoc, bundleName].join(".");
|
||||
var bundleMap = dojo._xdBundleMap[mapName];
|
||||
if(bundleMap){
|
||||
for(var param in bundleMap){
|
||||
bundle[param] = bundleData;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
dojo._xdInitExtraLocales = function(){
|
||||
// Simulate the extra locale work that dojo.requireLocalization does.
|
||||
|
||||
var extra = dojo.config.extraLocale;
|
||||
if(extra){
|
||||
if(!extra instanceof Array){
|
||||
extra = [extra];
|
||||
}
|
||||
|
||||
dojo._xdReqLoc = dojo.xdRequireLocalization;
|
||||
dojo.xdRequireLocalization = function(m, b, locale, fLocales){
|
||||
dojo._xdReqLoc(m,b,locale, fLocales);
|
||||
if(locale){return;}
|
||||
for(var i=0; i<extra.length; i++){
|
||||
dojo._xdReqLoc(m,b,extra[i], fLocales);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
dojo._xdBundleMap = {};
|
||||
|
||||
dojo.xdRequireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String*/availableFlatLocales){
|
||||
//summary: Internal xd loader function. The xd version of dojo.requireLocalization.
|
||||
|
||||
|
||||
//Account for allowing multiple extra locales. Do this here inside the function
|
||||
//since dojo._xdInitExtraLocales() depends on djConfig being set up, but that only
|
||||
//happens after hostenv_browser runs. loader_xd has to come before hostenv_browser
|
||||
//though since hostenv_browser can do a dojo.require for the debug module.
|
||||
if(dojo._xdInitExtraLocales){
|
||||
dojo._xdInitExtraLocales();
|
||||
dojo._xdInitExtraLocales = null;
|
||||
dojo.xdRequireLocalization.apply(dojo, arguments);
|
||||
return;
|
||||
}
|
||||
|
||||
var locales = availableFlatLocales.split(",");
|
||||
|
||||
//Find the best-match locale to load.
|
||||
//Assumes dojo.i18n has already been loaded. This is true for xdomain builds,
|
||||
//since it is included in dojo.xd.js.
|
||||
var jsLoc = dojo.i18n.normalizeLocale(locale);
|
||||
|
||||
var bestLocale = "";
|
||||
for(var i = 0; i < locales.length; i++){
|
||||
//Locale must match from start of string.
|
||||
if(jsLoc.indexOf(locales[i]) == 0){
|
||||
if(locales[i].length > bestLocale.length){
|
||||
bestLocale = locales[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var fixedBestLocale = bestLocale.replace('-', '_');
|
||||
//See if the bundle we are going to use is already loaded.
|
||||
var bundleResource = dojo.getObject([moduleName, "nls", bundleName].join("."));
|
||||
if(!bundleResource || !bundleResource[fixedBestLocale]){
|
||||
//Need to remember what locale we wanted and which one we actually use.
|
||||
//Then when we load the one we are actually using, use that bundle for the one
|
||||
//we originally wanted.
|
||||
var mapName = [moduleName, (fixedBestLocale||"root"), bundleName].join(".");
|
||||
var bundleMap = dojo._xdBundleMap[mapName];
|
||||
if(!bundleMap){
|
||||
bundleMap = dojo._xdBundleMap[mapName] = {};
|
||||
}
|
||||
bundleMap[jsLoc.replace('-', '_')] = true;
|
||||
|
||||
//Do just a normal dojo.require so the resource tracking stuff works as usual.
|
||||
dojo.require(moduleName + ".nls" + (bestLocale ? "." + bestLocale : "") + "." + bundleName);
|
||||
}
|
||||
}
|
||||
|
||||
// Replace dojo.requireLocalization with a wrapper
|
||||
dojo._xdRealRequireLocalization = dojo.requireLocalization;
|
||||
dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String*/availableFlatLocales){
|
||||
// summary: loads a bundle intelligently based on whether the module is
|
||||
// local or xd. Overrides the local-case implementation.
|
||||
|
||||
var modulePath = dojo.moduleUrl(moduleName).toString();
|
||||
if (dojo._xdIsXDomainPath(modulePath)) {
|
||||
// call cross-domain loader
|
||||
return dojo.xdRequireLocalization.apply(dojo, arguments);
|
||||
} else {
|
||||
// call local-loader
|
||||
return dojo._xdRealRequireLocalization.apply(dojo, arguments);
|
||||
}
|
||||
}
|
||||
|
||||
//This is a bit brittle: it has to know about the dojo methods that deal with dependencies
|
||||
//It would be ideal to intercept the actual methods and do something fancy at that point,
|
||||
//but I have concern about knowing which provide to match to the dependency in that case,
|
||||
//since scripts can load whenever they want, and trigger new calls to dojo._xdResourceLoaded().
|
||||
dojo._xdUnpackDependency = function(/*Array*/dep){
|
||||
//summary: Internal xd loader function. Determines what to do with a dependency
|
||||
//that was listed in an xd version of a module contents.
|
||||
|
||||
//Extract the dependency(ies).
|
||||
var newDeps = null;
|
||||
var newAfterDeps = null;
|
||||
switch(dep[0]){
|
||||
case "requireIf":
|
||||
case "requireAfterIf":
|
||||
//First arg (dep[1]) is the test. Depedency is dep[2].
|
||||
if(dep[1] === true){
|
||||
newDeps = [{name: dep[2], content: null}];
|
||||
}
|
||||
break;
|
||||
case "platformRequire":
|
||||
var modMap = dep[1];
|
||||
var common = modMap["common"]||[];
|
||||
newDeps = (modMap[dojo.hostenv.name_]) ? common.concat(modMap[dojo.hostenv.name_]||[]) : common.concat(modMap["default"]||[]);
|
||||
//Flatten the array of arrays into a one-level deep array.
|
||||
//Each result could be an array of 3 elements (the 3 arguments to dojo.require).
|
||||
//We only need the first one.
|
||||
if(newDeps){
|
||||
for(var i = 0; i < newDeps.length; i++){
|
||||
if(newDeps[i] instanceof Array){
|
||||
newDeps[i] = {name: newDeps[i][0], content: null};
|
||||
}else{
|
||||
newDeps[i] = {name: newDeps[i], content: null};
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "require":
|
||||
//Just worry about dep[1]
|
||||
newDeps = [{name: dep[1], content: null}];
|
||||
break;
|
||||
case "i18n._preloadLocalizations":
|
||||
//We can eval these immediately, since they load i18n bundles.
|
||||
//Since i18n bundles have no dependencies, whenever they are loaded
|
||||
//in a script tag, they are evaluated immediately, so we do not have to
|
||||
//treat them has an explicit dependency for the dependency mapping.
|
||||
//We can call it immediately since dojo.i18n is part of dojo.xd.js.
|
||||
dojo.i18n._preloadLocalizations.apply(dojo.i18n._preloadLocalizations, dep.slice(1));
|
||||
break;
|
||||
}
|
||||
|
||||
//The requireIf and requireAfterIf needs to be evaluated after the current resource is evaluated.
|
||||
if(dep[0] == "requireAfterIf" || dep[0] == "requireIf"){
|
||||
newAfterDeps = newDeps;
|
||||
newDeps = null;
|
||||
}
|
||||
return {requires: newDeps, requiresAfter: newAfterDeps}; //Object
|
||||
}
|
||||
|
||||
dojo._xdWalkReqs = function(){
|
||||
//summary: Internal xd loader function.
|
||||
//Walks the requires and evaluates module resource contents in
|
||||
//the right order.
|
||||
var reqChain = null;
|
||||
var req;
|
||||
for(var i = 0; i < dojo._xdOrderedReqs.length; i++){
|
||||
req = dojo._xdOrderedReqs[i];
|
||||
if(dojo._xdDepMap[req]){
|
||||
reqChain = [req];
|
||||
reqChain[req] = true; //Allow for fast lookup of the req in the array
|
||||
dojo._xdEvalReqs(reqChain);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dojo._xdEvalReqs = function(/*Array*/reqChain){
|
||||
//summary: Internal xd loader function.
|
||||
//Does a depth first, breadth second search and eval of required modules.
|
||||
while(reqChain.length > 0){
|
||||
var req = reqChain[reqChain.length - 1];
|
||||
var res = dojo._xdDepMap[req];
|
||||
var i, reqs, nextReq;
|
||||
if(res){
|
||||
//Trace down any requires for this resource.
|
||||
//START dojo._xdTraceReqs() inlining for small Safari 2.0 call stack
|
||||
reqs = res.requires;
|
||||
if(reqs && reqs.length > 0){
|
||||
for(i = 0; i < reqs.length; i++){
|
||||
nextReq = reqs[i].name;
|
||||
if(nextReq && !reqChain[nextReq]){
|
||||
//New req depedency. Follow it down.
|
||||
reqChain.push(nextReq);
|
||||
reqChain[nextReq] = true;
|
||||
dojo._xdEvalReqs(reqChain);
|
||||
}
|
||||
}
|
||||
}
|
||||
//END dojo._xdTraceReqs() inlining for small Safari 2.0 call stack
|
||||
|
||||
//Evaluate the resource.
|
||||
var contents = dojo._xdContents[res.contentIndex];
|
||||
if(!contents.isDefined){
|
||||
var content = contents.content;
|
||||
content["resourceName"] = contents["resourceName"];
|
||||
content["resourcePath"] = contents["resourcePath"];
|
||||
dojo._xdDefList.push(content);
|
||||
contents.isDefined = true;
|
||||
}
|
||||
dojo._xdDepMap[req] = null;
|
||||
|
||||
//Trace down any requireAfters for this resource.
|
||||
//START dojo._xdTraceReqs() inlining for small Safari 2.0 call stack
|
||||
reqs = res.requiresAfter;
|
||||
if(reqs && reqs.length > 0){
|
||||
for(i = 0; i < reqs.length; i++){
|
||||
nextReq = reqs[i].name;
|
||||
if(nextReq && !reqChain[nextReq]){
|
||||
//New req depedency. Follow it down.
|
||||
reqChain.push(nextReq);
|
||||
reqChain[nextReq] = true;
|
||||
dojo._xdEvalReqs(reqChain);
|
||||
}
|
||||
}
|
||||
}
|
||||
//END dojo._xdTraceReqs() inlining for small Safari 2.0 call stack
|
||||
}
|
||||
|
||||
//Done with that require. Remove it and go to the next one.
|
||||
reqChain.pop();
|
||||
}
|
||||
}
|
||||
|
||||
dojo._xdWatchInFlight = function(){
|
||||
//summary: Internal xd loader function.
|
||||
//Monitors in-flight requests for xd module resources.
|
||||
|
||||
var noLoads = "";
|
||||
var waitInterval = (dojo.config.xdWaitSeconds || 15) * 1000;
|
||||
var expired = (dojo._xdStartTime + waitInterval) < (new Date()).getTime();
|
||||
|
||||
//If any xdInFlight are true, then still waiting for something to load.
|
||||
//Come back later. If we timed out, report the things that did not load.
|
||||
for(var param in dojo._xdInFlight){
|
||||
if(dojo._xdInFlight[param] === true){
|
||||
if(expired){
|
||||
noLoads += param + " ";
|
||||
}else{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//All done. Clean up and notify.
|
||||
dojo._xdClearInterval();
|
||||
|
||||
if(expired){
|
||||
throw "Could not load cross-domain resources: " + noLoads;
|
||||
}
|
||||
|
||||
dojo._xdWalkReqs();
|
||||
|
||||
var defLength = dojo._xdDefList.length;
|
||||
for(var i= 0; i < defLength; i++){
|
||||
var content = dojo._xdDefList[i];
|
||||
if(dojo.config["debugAtAllCosts"] && content["resourceName"]){
|
||||
if(!dojo["_xdDebugQueue"]){
|
||||
dojo._xdDebugQueue = [];
|
||||
}
|
||||
dojo._xdDebugQueue.push({resourceName: content.resourceName, resourcePath: content.resourcePath});
|
||||
}else{
|
||||
//Evaluate the resource to bring it into being.
|
||||
//Pass in scope args to allow multiple versions of modules in a page.
|
||||
content.apply(dojo.global, dojo._scopeArgs);
|
||||
}
|
||||
}
|
||||
|
||||
//Evaluate any resources that were not evaled before.
|
||||
//This normally shouldn't happen with proper dojo.provide and dojo.require
|
||||
//usage, but providing it just in case. Note that these may not be executed
|
||||
//in the original order that the developer intended.
|
||||
for(i = 0; i < dojo._xdContents.length; i++){
|
||||
var current = dojo._xdContents[i];
|
||||
if(current.content && !current.isDefined){
|
||||
//Pass in scope args to allow multiple versions of modules in a page.
|
||||
current.content.apply(dojo.global, dojo._scopeArgs);
|
||||
}
|
||||
}
|
||||
|
||||
//Clean up for the next round of xd loading.
|
||||
dojo._xdReset();
|
||||
|
||||
if(dojo["_xdDebugQueue"] && dojo._xdDebugQueue.length > 0){
|
||||
dojo._xdDebugFileLoaded();
|
||||
}else{
|
||||
dojo._xdNotifyLoaded();
|
||||
}
|
||||
}
|
||||
|
||||
dojo._xdNotifyLoaded = function(){
|
||||
//Clear inflight count so we will finally do finish work.
|
||||
|
||||
//Just having a legitimate status (true or false) for an inflight item
|
||||
//means that it is still being processed. Do the typeof test
|
||||
//to avoid bad JavaScript that might tinker with Object.prototype.
|
||||
for(var prop in dojo._xdInFlight){
|
||||
if(typeof dojo._xdInFlight[prop] == "boolean"){
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
dojo._inFlightCount = 0;
|
||||
|
||||
//Only trigger call loaded if dj_load_init has run.
|
||||
if(dojo._initFired && !dojo._loadNotifying){
|
||||
dojo._callLoaded();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,260 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base.array"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base.array"] = true;
|
||||
dojo.provide("dojo._base.array");
|
||||
dojo.require("dojo._base.lang");
|
||||
|
||||
|
||||
(function(){
|
||||
var _getParts = function(arr, obj, cb){
|
||||
return [
|
||||
(typeof arr == "string") ? arr.split("") : arr,
|
||||
obj || dojo.global,
|
||||
// FIXME: cache the anonymous functions we create here?
|
||||
(typeof cb == "string") ? new Function("item", "index", "array", cb) : cb
|
||||
];
|
||||
};
|
||||
|
||||
var everyOrSome = function(/*Boolean*/every, /*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
|
||||
var _p = _getParts(arr, thisObject, callback); arr = _p[0];
|
||||
for(var i=0,l=arr.length; i<l; ++i){
|
||||
var result = !!_p[2].call(_p[1], arr[i], i, arr);
|
||||
if(every ^ result){
|
||||
return result; // Boolean
|
||||
}
|
||||
}
|
||||
return every; // Boolean
|
||||
};
|
||||
|
||||
dojo.mixin(dojo, {
|
||||
indexOf: function( /*Array*/ array,
|
||||
/*Object*/ value,
|
||||
/*Integer?*/ fromIndex,
|
||||
/*Boolean?*/ findLast){
|
||||
// summary:
|
||||
// locates the first index of the provided value in the
|
||||
// passed array. If the value is not found, -1 is returned.
|
||||
// description:
|
||||
// This method corresponds to the JavaScript 1.6 Array.indexOf method, with one difference: when
|
||||
// run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript
|
||||
// 1.6's indexOf skips the holes in the sparse array.
|
||||
// For details on this method, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf
|
||||
|
||||
var step = 1, end = array.length || 0, i = 0;
|
||||
if(findLast){
|
||||
i = end - 1;
|
||||
step = end = -1;
|
||||
}
|
||||
if(fromIndex != undefined){ i = fromIndex; }
|
||||
if((findLast && i > end) || i < end){
|
||||
for(; i != end; i += step){
|
||||
if(array[i] == value){ return i; }
|
||||
}
|
||||
}
|
||||
return -1; // Number
|
||||
},
|
||||
|
||||
lastIndexOf: function(/*Array*/array, /*Object*/value, /*Integer?*/fromIndex){
|
||||
// summary:
|
||||
// locates the last index of the provided value in the passed
|
||||
// array. If the value is not found, -1 is returned.
|
||||
// description:
|
||||
// This method corresponds to the JavaScript 1.6 Array.lastIndexOf method, with one difference: when
|
||||
// run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript
|
||||
// 1.6's lastIndexOf skips the holes in the sparse array.
|
||||
// For details on this method, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/lastIndexOf
|
||||
return dojo.indexOf(array, value, fromIndex, true); // Number
|
||||
},
|
||||
|
||||
forEach: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
|
||||
// summary:
|
||||
// for every item in arr, callback is invoked. Return values are ignored.
|
||||
// If you want to break out of the loop, consider using dojo.every() or dojo.some().
|
||||
// forEach does not allow breaking out of the loop over the items in arr.
|
||||
// arr:
|
||||
// the array to iterate over. If a string, operates on individual characters.
|
||||
// callback:
|
||||
// a function is invoked with three arguments: item, index, and array
|
||||
// thisObject:
|
||||
// may be used to scope the call to callback
|
||||
// description:
|
||||
// This function corresponds to the JavaScript 1.6 Array.forEach() method, with one difference: when
|
||||
// run over sparse arrays, this implemenation passes the "holes" in the sparse array to
|
||||
// the callback function with a value of undefined. JavaScript 1.6's forEach skips the holes in the sparse array.
|
||||
// For more details, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach
|
||||
// example:
|
||||
// | // log out all members of the array:
|
||||
// | dojo.forEach(
|
||||
// | [ "thinger", "blah", "howdy", 10 ],
|
||||
// | function(item){
|
||||
// | console.log(item);
|
||||
// | }
|
||||
// | );
|
||||
// example:
|
||||
// | // log out the members and their indexes
|
||||
// | dojo.forEach(
|
||||
// | [ "thinger", "blah", "howdy", 10 ],
|
||||
// | function(item, idx, arr){
|
||||
// | console.log(item, "at index:", idx);
|
||||
// | }
|
||||
// | );
|
||||
// example:
|
||||
// | // use a scoped object member as the callback
|
||||
// |
|
||||
// | var obj = {
|
||||
// | prefix: "logged via obj.callback:",
|
||||
// | callback: function(item){
|
||||
// | console.log(this.prefix, item);
|
||||
// | }
|
||||
// | };
|
||||
// |
|
||||
// | // specifying the scope function executes the callback in that scope
|
||||
// | dojo.forEach(
|
||||
// | [ "thinger", "blah", "howdy", 10 ],
|
||||
// | obj.callback,
|
||||
// | obj
|
||||
// | );
|
||||
// |
|
||||
// | // alternately, we can accomplish the same thing with dojo.hitch()
|
||||
// | dojo.forEach(
|
||||
// | [ "thinger", "blah", "howdy", 10 ],
|
||||
// | dojo.hitch(obj, "callback")
|
||||
// | );
|
||||
|
||||
// match the behavior of the built-in forEach WRT empty arrs
|
||||
if(!arr || !arr.length){ return; }
|
||||
|
||||
// FIXME: there are several ways of handilng thisObject. Is
|
||||
// dojo.global always the default context?
|
||||
var _p = _getParts(arr, thisObject, callback); arr = _p[0];
|
||||
for(var i=0,l=arr.length; i<l; ++i){
|
||||
_p[2].call(_p[1], arr[i], i, arr);
|
||||
}
|
||||
},
|
||||
|
||||
every: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
|
||||
// summary:
|
||||
// Determines whether or not every item in arr satisfies the
|
||||
// condition implemented by callback.
|
||||
// arr:
|
||||
// the array to iterate on. If a string, operates on individual characters.
|
||||
// callback:
|
||||
// a function is invoked with three arguments: item, index,
|
||||
// and array and returns true if the condition is met.
|
||||
// thisObject:
|
||||
// may be used to scope the call to callback
|
||||
// description:
|
||||
// This function corresponds to the JavaScript 1.6 Array.every() method, with one difference: when
|
||||
// run over sparse arrays, this implemenation passes the "holes" in the sparse array to
|
||||
// the callback function with a value of undefined. JavaScript 1.6's every skips the holes in the sparse array.
|
||||
// For more details, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/every
|
||||
// example:
|
||||
// | // returns false
|
||||
// | dojo.every([1, 2, 3, 4], function(item){ return item>1; });
|
||||
// example:
|
||||
// | // returns true
|
||||
// | dojo.every([1, 2, 3, 4], function(item){ return item>0; });
|
||||
return everyOrSome(true, arr, callback, thisObject); // Boolean
|
||||
},
|
||||
|
||||
some: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
|
||||
// summary:
|
||||
// Determines whether or not any item in arr satisfies the
|
||||
// condition implemented by callback.
|
||||
// arr:
|
||||
// the array to iterate over. If a string, operates on individual characters.
|
||||
// callback:
|
||||
// a function is invoked with three arguments: item, index,
|
||||
// and array and returns true if the condition is met.
|
||||
// thisObject:
|
||||
// may be used to scope the call to callback
|
||||
// description:
|
||||
// This function corresponds to the JavaScript 1.6 Array.some() method, with one difference: when
|
||||
// run over sparse arrays, this implemenation passes the "holes" in the sparse array to
|
||||
// the callback function with a value of undefined. JavaScript 1.6's some skips the holes in the sparse array.
|
||||
// For more details, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/some
|
||||
// example:
|
||||
// | // is true
|
||||
// | dojo.some([1, 2, 3, 4], function(item){ return item>1; });
|
||||
// example:
|
||||
// | // is false
|
||||
// | dojo.some([1, 2, 3, 4], function(item){ return item<1; });
|
||||
return everyOrSome(false, arr, callback, thisObject); // Boolean
|
||||
},
|
||||
|
||||
map: function(/*Array|String*/arr, /*Function|String*/callback, /*Function?*/thisObject){
|
||||
// summary:
|
||||
// applies callback to each element of arr and returns
|
||||
// an Array with the results
|
||||
// arr:
|
||||
// the array to iterate on. If a string, operates on
|
||||
// individual characters.
|
||||
// callback:
|
||||
// a function is invoked with three arguments, (item, index,
|
||||
// array), and returns a value
|
||||
// thisObject:
|
||||
// may be used to scope the call to callback
|
||||
// description:
|
||||
// This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when
|
||||
// run over sparse arrays, this implemenation passes the "holes" in the sparse array to
|
||||
// the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array.
|
||||
// For more details, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
|
||||
// example:
|
||||
// | // returns [2, 3, 4, 5]
|
||||
// | dojo.map([1, 2, 3, 4], function(item){ return item+1 });
|
||||
|
||||
var _p = _getParts(arr, thisObject, callback); arr = _p[0];
|
||||
var outArr = (arguments[3] ? (new arguments[3]()) : []);
|
||||
for(var i=0,l=arr.length; i<l; ++i){
|
||||
outArr.push(_p[2].call(_p[1], arr[i], i, arr));
|
||||
}
|
||||
return outArr; // Array
|
||||
},
|
||||
|
||||
filter: function(/*Array*/arr, /*Function|String*/callback, /*Object?*/thisObject){
|
||||
// summary:
|
||||
// Returns a new Array with those items from arr that match the
|
||||
// condition implemented by callback.
|
||||
// arr:
|
||||
// the array to iterate over.
|
||||
// callback:
|
||||
// a function that is invoked with three arguments (item,
|
||||
// index, array). The return of this function is expected to
|
||||
// be a boolean which determines whether the passed-in item
|
||||
// will be included in the returned array.
|
||||
// thisObject:
|
||||
// may be used to scope the call to callback
|
||||
// description:
|
||||
// This function corresponds to the JavaScript 1.6 Array.filter() method, with one difference: when
|
||||
// run over sparse arrays, this implemenation passes the "holes" in the sparse array to
|
||||
// the callback function with a value of undefined. JavaScript 1.6's filter skips the holes in the sparse array.
|
||||
// For more details, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
|
||||
// example:
|
||||
// | // returns [2, 3, 4]
|
||||
// | dojo.filter([1, 2, 3, 4], function(item){ return item>1; });
|
||||
|
||||
var _p = _getParts(arr, thisObject, callback); arr = _p[0];
|
||||
var outArr = [];
|
||||
for(var i=0,l=arr.length; i<l; ++i){
|
||||
if(_p[2].call(_p[1], arr[i], i, arr)){
|
||||
outArr.push(arr[i]);
|
||||
}
|
||||
}
|
||||
return outArr; // Array
|
||||
}
|
||||
});
|
||||
})();
|
||||
/*
|
||||
*/
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/_base/array",["./kernel","../has","./lang"],function(_1,_2,_3){var _4={},u,_5;function _6(){_4={};};function _7(fn){return _4[fn]=new Function("item","index","array",fn);};function _8(_9){var _a=!_9;return function(a,fn,o){var i=0,l=a&&a.length||0,_b;if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_4[fn]||_7(fn);}if(o){for(;i<l;++i){_b=!fn.call(o,a[i],i,a);if(_9^_b){return !_b;}}}else{for(;i<l;++i){_b=!fn(a[i],i,a);if(_9^_b){return !_b;}}}return _a;};};function _c(up){var _d=1,_e=0,_f=0;if(!up){_d=_e=_f=-1;}return function(a,x,_10,_11){if(_11&&_d>0){return _5.lastIndexOf(a,x,_10);}var l=a&&a.length||0,end=up?l+_f:_e,i;if(_10===u){i=up?_e:l+_f;}else{if(_10<0){i=l+_10;if(i<0){i=_e;}}else{i=_10>=l?l+_f:_10;}}if(l&&typeof a=="string"){a=a.split("");}for(;i!=end;i+=_d){if(a[i]==x){return i;}}return -1;};};function _12(a,fn,o){var i=0,l=a&&a.length||0;if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_4[fn]||_7(fn);}if(o){for(;i<l;++i){fn.call(o,a[i],i,a);}}else{for(;i<l;++i){fn(a[i],i,a);}}};function map(a,fn,o,Ctr){var i=0,l=a&&a.length||0,out=new (Ctr||Array)(l);if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_4[fn]||_7(fn);}if(o){for(;i<l;++i){out[i]=fn.call(o,a[i],i,a);}}else{for(;i<l;++i){out[i]=fn(a[i],i,a);}}return out;};function _13(a,fn,o){var i=0,l=a&&a.length||0,out=[],_14;if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_4[fn]||_7(fn);}if(o){for(;i<l;++i){_14=a[i];if(fn.call(o,_14,i,a)){out.push(_14);}}}else{for(;i<l;++i){_14=a[i];if(fn(_14,i,a)){out.push(_14);}}}return out;};_5={every:_8(false),some:_8(true),indexOf:_c(true),lastIndexOf:_c(false),forEach:_12,map:map,filter:_13,clearCache:_6};1&&_3.mixin(_1,_5);return _5;});
|
||||
343
lib/dojo/_base/array.js.uncompressed.js
Normal file
343
lib/dojo/_base/array.js.uncompressed.js
Normal file
@@ -0,0 +1,343 @@
|
||||
define("dojo/_base/array", ["./kernel", "../has", "./lang"], function(dojo, has, lang){
|
||||
// module:
|
||||
// dojo/_base/array
|
||||
// summary:
|
||||
// This module defines the Javascript v1.6 array extensions.
|
||||
|
||||
/*=====
|
||||
dojo.indexOf = function(arr, value, fromIndex, findLast){
|
||||
// summary:
|
||||
// locates the first index of the provided value in the
|
||||
// passed array. If the value is not found, -1 is returned.
|
||||
// description:
|
||||
// This method corresponds to the JavaScript 1.6 Array.indexOf method, with one difference: when
|
||||
// run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript
|
||||
// 1.6's indexOf skips the holes in the sparse array.
|
||||
// For details on this method, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf
|
||||
// arr: Array
|
||||
// value: Object
|
||||
// fromIndex: Integer?
|
||||
// findLast: Boolean?
|
||||
// returns: Number
|
||||
};
|
||||
dojo.lastIndexOf = function(arr, value, fromIndex){
|
||||
// summary:
|
||||
// locates the last index of the provided value in the passed
|
||||
// array. If the value is not found, -1 is returned.
|
||||
// description:
|
||||
// This method corresponds to the JavaScript 1.6 Array.lastIndexOf method, with one difference: when
|
||||
// run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript
|
||||
// 1.6's lastIndexOf skips the holes in the sparse array.
|
||||
// For details on this method, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/lastIndexOf
|
||||
// arr: Array,
|
||||
// value: Object,
|
||||
// fromIndex: Integer?
|
||||
// returns: Number
|
||||
};
|
||||
dojo.forEach = function(arr, callback, thisObject){
|
||||
// summary:
|
||||
// for every item in arr, callback is invoked. Return values are ignored.
|
||||
// If you want to break out of the loop, consider using dojo.every() or dojo.some().
|
||||
// forEach does not allow breaking out of the loop over the items in arr.
|
||||
// arr:
|
||||
// the array to iterate over. If a string, operates on individual characters.
|
||||
// callback:
|
||||
// a function is invoked with three arguments: item, index, and array
|
||||
// thisObject:
|
||||
// may be used to scope the call to callback
|
||||
// description:
|
||||
// This function corresponds to the JavaScript 1.6 Array.forEach() method, with one difference: when
|
||||
// run over sparse arrays, this implementation passes the "holes" in the sparse array to
|
||||
// the callback function with a value of undefined. JavaScript 1.6's forEach skips the holes in the sparse array.
|
||||
// For more details, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach
|
||||
// example:
|
||||
// | // log out all members of the array:
|
||||
// | dojo.forEach(
|
||||
// | [ "thinger", "blah", "howdy", 10 ],
|
||||
// | function(item){
|
||||
// | console.log(item);
|
||||
// | }
|
||||
// | );
|
||||
// example:
|
||||
// | // log out the members and their indexes
|
||||
// | dojo.forEach(
|
||||
// | [ "thinger", "blah", "howdy", 10 ],
|
||||
// | function(item, idx, arr){
|
||||
// | console.log(item, "at index:", idx);
|
||||
// | }
|
||||
// | );
|
||||
// example:
|
||||
// | // use a scoped object member as the callback
|
||||
// |
|
||||
// | var obj = {
|
||||
// | prefix: "logged via obj.callback:",
|
||||
// | callback: function(item){
|
||||
// | console.log(this.prefix, item);
|
||||
// | }
|
||||
// | };
|
||||
// |
|
||||
// | // specifying the scope function executes the callback in that scope
|
||||
// | dojo.forEach(
|
||||
// | [ "thinger", "blah", "howdy", 10 ],
|
||||
// | obj.callback,
|
||||
// | obj
|
||||
// | );
|
||||
// |
|
||||
// | // alternately, we can accomplish the same thing with dojo.hitch()
|
||||
// | dojo.forEach(
|
||||
// | [ "thinger", "blah", "howdy", 10 ],
|
||||
// | dojo.hitch(obj, "callback")
|
||||
// | );
|
||||
// arr: Array|String
|
||||
// callback: Function|String
|
||||
// thisObject: Object?
|
||||
};
|
||||
dojo.every = function(arr, callback, thisObject){
|
||||
// summary:
|
||||
// Determines whether or not every item in arr satisfies the
|
||||
// condition implemented by callback.
|
||||
// arr: Array|String
|
||||
// the array to iterate on. If a string, operates on individual characters.
|
||||
// callback: Function|String
|
||||
// a function is invoked with three arguments: item, index,
|
||||
// and array and returns true if the condition is met.
|
||||
// thisObject: Object?
|
||||
// may be used to scope the call to callback
|
||||
// returns: Boolean
|
||||
// description:
|
||||
// This function corresponds to the JavaScript 1.6 Array.every() method, with one difference: when
|
||||
// run over sparse arrays, this implementation passes the "holes" in the sparse array to
|
||||
// the callback function with a value of undefined. JavaScript 1.6's every skips the holes in the sparse array.
|
||||
// For more details, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/every
|
||||
// example:
|
||||
// | // returns false
|
||||
// | dojo.every([1, 2, 3, 4], function(item){ return item>1; });
|
||||
// example:
|
||||
// | // returns true
|
||||
// | dojo.every([1, 2, 3, 4], function(item){ return item>0; });
|
||||
};
|
||||
dojo.some = function(arr, callback, thisObject){
|
||||
// summary:
|
||||
// Determines whether or not any item in arr satisfies the
|
||||
// condition implemented by callback.
|
||||
// arr: Array|String
|
||||
// the array to iterate over. If a string, operates on individual characters.
|
||||
// callback: Function|String
|
||||
// a function is invoked with three arguments: item, index,
|
||||
// and array and returns true if the condition is met.
|
||||
// thisObject: Object?
|
||||
// may be used to scope the call to callback
|
||||
// returns: Boolean
|
||||
// description:
|
||||
// This function corresponds to the JavaScript 1.6 Array.some() method, with one difference: when
|
||||
// run over sparse arrays, this implementation passes the "holes" in the sparse array to
|
||||
// the callback function with a value of undefined. JavaScript 1.6's some skips the holes in the sparse array.
|
||||
// For more details, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/some
|
||||
// example:
|
||||
// | // is true
|
||||
// | dojo.some([1, 2, 3, 4], function(item){ return item>1; });
|
||||
// example:
|
||||
// | // is false
|
||||
// | dojo.some([1, 2, 3, 4], function(item){ return item<1; });
|
||||
};
|
||||
dojo.map = function(arr, callback, thisObject){
|
||||
// summary:
|
||||
// applies callback to each element of arr and returns
|
||||
// an Array with the results
|
||||
// arr: Array|String
|
||||
// the array to iterate on. If a string, operates on
|
||||
// individual characters.
|
||||
// callback: Function|String
|
||||
// a function is invoked with three arguments, (item, index,
|
||||
// array), and returns a value
|
||||
// thisObject: Object?
|
||||
// may be used to scope the call to callback
|
||||
// returns: Array
|
||||
// description:
|
||||
// This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when
|
||||
// run over sparse arrays, this implementation passes the "holes" in the sparse array to
|
||||
// the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array.
|
||||
// For more details, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
|
||||
// example:
|
||||
// | // returns [2, 3, 4, 5]
|
||||
// | dojo.map([1, 2, 3, 4], function(item){ return item+1 });
|
||||
};
|
||||
dojo.filter = function(arr, callback, thisObject){
|
||||
// summary:
|
||||
// Returns a new Array with those items from arr that match the
|
||||
// condition implemented by callback.
|
||||
// arr: Array
|
||||
// the array to iterate over.
|
||||
// callback: Function|String
|
||||
// a function that is invoked with three arguments (item,
|
||||
// index, array). The return of this function is expected to
|
||||
// be a boolean which determines whether the passed-in item
|
||||
// will be included in the returned array.
|
||||
// thisObject: Object?
|
||||
// may be used to scope the call to callback
|
||||
// returns: Array
|
||||
// description:
|
||||
// This function corresponds to the JavaScript 1.6 Array.filter() method, with one difference: when
|
||||
// run over sparse arrays, this implementation passes the "holes" in the sparse array to
|
||||
// the callback function with a value of undefined. JavaScript 1.6's filter skips the holes in the sparse array.
|
||||
// For more details, see:
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
|
||||
// example:
|
||||
// | // returns [2, 3, 4]
|
||||
// | dojo.filter([1, 2, 3, 4], function(item){ return item>1; });
|
||||
};
|
||||
=====*/
|
||||
|
||||
// our old simple function builder stuff
|
||||
var cache = {}, u, array; // the export object
|
||||
|
||||
function clearCache(){
|
||||
cache = {};
|
||||
}
|
||||
|
||||
function buildFn(fn){
|
||||
return cache[fn] = new Function("item", "index", "array", fn); // Function
|
||||
}
|
||||
// magic snippet: if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
|
||||
|
||||
// every & some
|
||||
|
||||
function everyOrSome(some){
|
||||
var every = !some;
|
||||
return function(a, fn, o){
|
||||
var i = 0, l = a && a.length || 0, result;
|
||||
if(l && typeof a == "string") a = a.split("");
|
||||
if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
|
||||
if(o){
|
||||
for(; i < l; ++i){
|
||||
result = !fn.call(o, a[i], i, a);
|
||||
if(some ^ result){
|
||||
return !result;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
for(; i < l; ++i){
|
||||
result = !fn(a[i], i, a);
|
||||
if(some ^ result){
|
||||
return !result;
|
||||
}
|
||||
}
|
||||
}
|
||||
return every; // Boolean
|
||||
}
|
||||
}
|
||||
// var every = everyOrSome(false), some = everyOrSome(true);
|
||||
|
||||
// indexOf, lastIndexOf
|
||||
|
||||
function index(up){
|
||||
var delta = 1, lOver = 0, uOver = 0;
|
||||
if(!up){
|
||||
delta = lOver = uOver = -1;
|
||||
}
|
||||
return function(a, x, from, last){
|
||||
if(last && delta > 0){
|
||||
// TODO: why do we use a non-standard signature? why do we need "last"?
|
||||
return array.lastIndexOf(a, x, from);
|
||||
}
|
||||
var l = a && a.length || 0, end = up ? l + uOver : lOver, i;
|
||||
if(from === u){
|
||||
i = up ? lOver : l + uOver;
|
||||
}else{
|
||||
if(from < 0){
|
||||
i = l + from;
|
||||
if(i < 0){
|
||||
i = lOver;
|
||||
}
|
||||
}else{
|
||||
i = from >= l ? l + uOver : from;
|
||||
}
|
||||
}
|
||||
if(l && typeof a == "string") a = a.split("");
|
||||
for(; i != end; i += delta){
|
||||
if(a[i] == x){
|
||||
return i; // Number
|
||||
}
|
||||
}
|
||||
return -1; // Number
|
||||
}
|
||||
}
|
||||
// var indexOf = index(true), lastIndexOf = index(false);
|
||||
|
||||
function forEach(a, fn, o){
|
||||
var i = 0, l = a && a.length || 0;
|
||||
if(l && typeof a == "string") a = a.split("");
|
||||
if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
|
||||
if(o){
|
||||
for(; i < l; ++i){
|
||||
fn.call(o, a[i], i, a);
|
||||
}
|
||||
}else{
|
||||
for(; i < l; ++i){
|
||||
fn(a[i], i, a);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function map(a, fn, o, Ctr){
|
||||
// TODO: why do we have a non-standard signature here? do we need "Ctr"?
|
||||
var i = 0, l = a && a.length || 0, out = new (Ctr || Array)(l);
|
||||
if(l && typeof a == "string") a = a.split("");
|
||||
if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
|
||||
if(o){
|
||||
for(; i < l; ++i){
|
||||
out[i] = fn.call(o, a[i], i, a);
|
||||
}
|
||||
}else{
|
||||
for(; i < l; ++i){
|
||||
out[i] = fn(a[i], i, a);
|
||||
}
|
||||
}
|
||||
return out; // Array
|
||||
}
|
||||
|
||||
function filter(a, fn, o){
|
||||
// TODO: do we need "Ctr" here like in map()?
|
||||
var i = 0, l = a && a.length || 0, out = [], value;
|
||||
if(l && typeof a == "string") a = a.split("");
|
||||
if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
|
||||
if(o){
|
||||
for(; i < l; ++i){
|
||||
value = a[i];
|
||||
if(fn.call(o, value, i, a)){
|
||||
out.push(value);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
for(; i < l; ++i){
|
||||
value = a[i];
|
||||
if(fn(value, i, a)){
|
||||
out.push(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return out; // Array
|
||||
}
|
||||
|
||||
array = {
|
||||
every: everyOrSome(false),
|
||||
some: everyOrSome(true),
|
||||
indexOf: index(true),
|
||||
lastIndexOf: index(false),
|
||||
forEach: forEach,
|
||||
map: map,
|
||||
filter: filter,
|
||||
clearCache: clearCache
|
||||
};
|
||||
|
||||
1 && lang.mixin(dojo, array);
|
||||
|
||||
/*===== return dojo.array; =====*/
|
||||
return array;
|
||||
});
|
||||
@@ -4,25 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base.browser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base.browser"] = true;
|
||||
dojo.provide("dojo._base.browser");
|
||||
dojo.require("dojo._base.window");
|
||||
dojo.require("dojo._base.connect");
|
||||
dojo.require("dojo._base.event");
|
||||
dojo.require("dojo._base.html");
|
||||
dojo.require("dojo._base.NodeList");
|
||||
dojo.require("dojo._base.query");
|
||||
dojo.require("dojo._base.xhr");
|
||||
dojo.require("dojo._base.fx");
|
||||
|
||||
//Need this to be the last code segment in base, so do not place any
|
||||
//dojo/requireIf calls in this file/ Otherwise, due to how the build system
|
||||
//puts all requireIf dependencies after the current file, the require calls
|
||||
//could be called before all of base is defined/
|
||||
dojo.forEach(dojo.config.require, function(i){
|
||||
dojo["require"](i);
|
||||
});
|
||||
|
||||
}
|
||||
//>>built
|
||||
if(require.has){require.has.add("config-selectorEngine","acme");}define("dojo/_base/browser",["../ready","./kernel","./connect","./unload","./window","./event","./html","./NodeList","../query","./xhr","./fx"],function(_1){return _1;});
|
||||
21
lib/dojo/_base/browser.js.uncompressed.js
Normal file
21
lib/dojo/_base/browser.js.uncompressed.js
Normal file
@@ -0,0 +1,21 @@
|
||||
if(require.has){
|
||||
require.has.add("config-selectorEngine", "acme");
|
||||
}
|
||||
define("dojo/_base/browser", [
|
||||
"../ready",
|
||||
"./kernel",
|
||||
"./connect", // until we decide if connect is going back into non-browser environments
|
||||
"./unload",
|
||||
"./window",
|
||||
"./event",
|
||||
"./html",
|
||||
"./NodeList",
|
||||
"../query",
|
||||
"./xhr",
|
||||
"./fx"], function(dojo) {
|
||||
// module:
|
||||
// dojo/_base/browser
|
||||
// summary:
|
||||
// This module causes the browser-only base modules to be loaded.
|
||||
return dojo;
|
||||
});
|
||||
8
lib/dojo/_base/config.js
Normal file
8
lib/dojo/_base/config.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/_base/config",["../has","require"],function(_1,_2){var _3={};if(1){var _4=_2.rawConfig,p;for(p in _4){_3[p]=_4[p];}}else{var _5=function(_6,_7,_8){for(p in _6){p!="has"&&_1.add(_7+p,_6[p],0,_8);}};_3=1?_2.rawConfig:this.dojoConfig||this.djConfig||{};_5(_3,"config",1);_5(_3.has,"",1);}return _3;});
|
||||
174
lib/dojo/_base/config.js.uncompressed.js
Normal file
174
lib/dojo/_base/config.js.uncompressed.js
Normal file
@@ -0,0 +1,174 @@
|
||||
define("dojo/_base/config", ["../has", "require"], function(has, require){
|
||||
// module:
|
||||
// dojo/_base/config
|
||||
// summary:
|
||||
// This module defines the user configuration during bootstrap.
|
||||
// description:
|
||||
// By defining user configuration as a module value, an entire configuration can be specified in a build,
|
||||
// thereby eliminating the need for sniffing and or explicitly setting in the global variable dojoConfig.
|
||||
// Also, when multiple instances of dojo exist in a single application, each will necessarily be located
|
||||
// at an unique absolute module identifier as given by the package configuration. Implementing configuration
|
||||
// as a module allows for specifying unique, per-instance configurations.
|
||||
// example:
|
||||
// Create a second instance of dojo with a different, instance-uniqe configuration (assume the loader and
|
||||
// dojo.js are already loaded).
|
||||
// | // specify a configuration that creates a new instance of dojo at the absolute module identifier "myDojo"
|
||||
// | require({
|
||||
// | packages:[{
|
||||
// | name:"myDojo",
|
||||
// | location:".", //assume baseUrl points to dojo.js
|
||||
// | }]
|
||||
// | });
|
||||
// |
|
||||
// | // specify a configuration for the myDojo instance
|
||||
// | define("myDojo/config", {
|
||||
// | // normal configuration variables go here, e.g.,
|
||||
// | locale:"fr-ca"
|
||||
// | });
|
||||
// |
|
||||
// | // load and use the new instance of dojo
|
||||
// | require(["myDojo"], function(dojo) {
|
||||
// | // dojo is the new instance of dojo
|
||||
// | // use as required
|
||||
// | });
|
||||
|
||||
var result = {};
|
||||
if(1){
|
||||
// must be the dojo loader; take a shallow copy of require.rawConfig
|
||||
var src = require.rawConfig, p;
|
||||
for(p in src){
|
||||
result[p] = src[p];
|
||||
}
|
||||
}else{
|
||||
var adviseHas = function(featureSet, prefix, booting){
|
||||
for(p in featureSet){
|
||||
p!="has" && has.add(prefix + p, featureSet[p], 0, booting);
|
||||
}
|
||||
};
|
||||
result = 1 ?
|
||||
// must be a built version of the dojo loader; all config stuffed in require.rawConfig
|
||||
require.rawConfig :
|
||||
// a foreign loader
|
||||
this.dojoConfig || this.djConfig || {};
|
||||
adviseHas(result, "config", 1);
|
||||
adviseHas(result.has, "", 1);
|
||||
}
|
||||
return result;
|
||||
|
||||
/*=====
|
||||
// note:
|
||||
// 'dojoConfig' does not exist under 'dojo.*' so that it can be set before the
|
||||
// 'dojo' variable exists.
|
||||
// note:
|
||||
// Setting any of these variables *after* the library has loaded does
|
||||
// nothing at all.
|
||||
|
||||
// FIXME: can we document these on dojo.config object and explain they must be set via djConfig/dojoConfig global prior to loading dojo.js
|
||||
|
||||
dojoConfig = {
|
||||
// summary:
|
||||
// Application code can set the global 'dojoConfig' prior to loading
|
||||
// the library to control certain global settings for how dojo works.
|
||||
//
|
||||
// isDebug: Boolean
|
||||
// Defaults to `false`. If set to `true`, ensures that Dojo provides
|
||||
// extended debugging feedback via Firebug. If Firebug is not available
|
||||
// on your platform, setting `isDebug` to `true` will force Dojo to
|
||||
// pull in (and display) the version of Firebug Lite which is
|
||||
// integrated into the Dojo distribution, thereby always providing a
|
||||
// debugging/logging console when `isDebug` is enabled. Note that
|
||||
// Firebug's `console.*` methods are ALWAYS defined by Dojo. If
|
||||
// `isDebug` is false and you are on a platform without Firebug, these
|
||||
// methods will be defined as no-ops.
|
||||
isDebug: false,
|
||||
// locale: String
|
||||
// The locale to assume for loading localized resources in this page,
|
||||
// specified according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
|
||||
// Must be specified entirely in lowercase, e.g. `en-us` and `zh-cn`.
|
||||
// See the documentation for `dojo.i18n` and `dojo.requireLocalization`
|
||||
// for details on loading localized resources. If no locale is specified,
|
||||
// Dojo assumes the locale of the user agent, according to `navigator.userLanguage`
|
||||
// or `navigator.language` properties.
|
||||
locale: undefined,
|
||||
// extraLocale: Array
|
||||
// No default value. Specifies additional locales whose
|
||||
// resources should also be loaded alongside the default locale when
|
||||
// calls to `dojo.requireLocalization()` are processed.
|
||||
extraLocale: undefined,
|
||||
// baseUrl: String
|
||||
// The directory in which `dojo.js` is located. Under normal
|
||||
// conditions, Dojo auto-detects the correct location from which it
|
||||
// was loaded. You may need to manually configure `baseUrl` in cases
|
||||
// where you have renamed `dojo.js` or in which `<base>` tags confuse
|
||||
// some browsers (e.g. IE 6). The variable `dojo.baseUrl` is assigned
|
||||
// either the value of `djConfig.baseUrl` if one is provided or the
|
||||
// auto-detected root if not. Other modules are located relative to
|
||||
// this path. The path should end in a slash.
|
||||
baseUrl: undefined,
|
||||
// modulePaths: Object
|
||||
// A map of module names to paths relative to `dojo.baseUrl`. The
|
||||
// key/value pairs correspond directly to the arguments which
|
||||
// `dojo.registerModulePath` accepts. Specifiying
|
||||
// `djConfig.modulePaths = { "foo": "../../bar" }` is the equivalent
|
||||
// of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple
|
||||
// modules may be configured via `djConfig.modulePaths`.
|
||||
modulePaths: {},
|
||||
// afterOnLoad: Boolean
|
||||
// Indicates Dojo was added to the page after the page load. In this case
|
||||
// Dojo will not wait for the page DOMContentLoad/load events and fire
|
||||
// its dojo.addOnLoad callbacks after making sure all outstanding
|
||||
// dojo.required modules have loaded. Only works with a built dojo.js,
|
||||
// it does not work the dojo.js directly from source control.
|
||||
afterOnLoad: false,
|
||||
// addOnLoad: Function or Array
|
||||
// Adds a callback via dojo.addOnLoad. Useful when Dojo is added after
|
||||
// the page loads and djConfig.afterOnLoad is true. Supports the same
|
||||
// arguments as dojo.addOnLoad. When using a function reference, use
|
||||
// `djConfig.addOnLoad = function(){};`. For object with function name use
|
||||
// `djConfig.addOnLoad = [myObject, "functionName"];` and for object with
|
||||
// function reference use
|
||||
// `djConfig.addOnLoad = [myObject, function(){}];`
|
||||
addOnLoad: null,
|
||||
// require: Array
|
||||
// An array of module names to be loaded immediately after dojo.js has been included
|
||||
// in a page.
|
||||
require: [],
|
||||
// defaultDuration: Array
|
||||
// Default duration, in milliseconds, for wipe and fade animations within dijits.
|
||||
// Assigned to dijit.defaultDuration.
|
||||
defaultDuration: 200,
|
||||
// dojoBlankHtmlUrl: String
|
||||
// Used by some modules to configure an empty iframe. Used by dojo.io.iframe and
|
||||
// dojo.back, and dijit popup support in IE where an iframe is needed to make sure native
|
||||
// controls do not bleed through the popups. Normally this configuration variable
|
||||
// does not need to be set, except when using cross-domain/CDN Dojo builds.
|
||||
// Save dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl`
|
||||
// to the path on your domain your copy of blank.html.
|
||||
dojoBlankHtmlUrl: undefined,
|
||||
// ioPublish: Boolean?
|
||||
// Set this to true to enable publishing of topics for the different phases of
|
||||
// IO operations. Publishing is done via dojo.publish. See dojo.__IoPublish for a list
|
||||
// of topics that are published.
|
||||
ioPublish: false,
|
||||
// useCustomLogger: Anything?
|
||||
// If set to a value that evaluates to true such as a string or array and
|
||||
// isDebug is true and Firebug is not available or running, then it bypasses
|
||||
// the creation of Firebug Lite allowing you to define your own console object.
|
||||
useCustomLogger: undefined,
|
||||
// transparentColor: Array
|
||||
// Array containing the r, g, b components used as transparent color in dojo.Color;
|
||||
// if undefined, [255,255,255] (white) will be used.
|
||||
transparentColor: undefined,
|
||||
// skipIeDomLoaded: Boolean
|
||||
// For IE only, skip the DOMContentLoaded hack used. Sometimes it can cause an Operation
|
||||
// Aborted error if the rest of the page triggers script defers before the DOM is ready.
|
||||
// If this is config value is set to true, then dojo.addOnLoad callbacks will not be
|
||||
// triggered until the page load event, which is after images and iframes load. If you
|
||||
// want to trigger the callbacks sooner, you can put a script block in the bottom of
|
||||
// your HTML that calls dojo._loadInit();. If you are using multiversion support, change
|
||||
// "dojo." to the appropriate scope name for dojo.
|
||||
skipIeDomLoaded: false
|
||||
}
|
||||
=====*/
|
||||
});
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
// TODO: this file needs to be converted to the v1.7 loader
|
||||
|
||||
// a host environment specifically built for Mozilla extensions, but derived
|
||||
// from the browser host environment
|
||||
@@ -18,13 +13,12 @@ if(typeof window != 'undefined'){
|
||||
|
||||
// attempt to figure out the path to dojo if it isn't set in the config
|
||||
(function(){
|
||||
var d = dojo;
|
||||
// this is a scope protection closure. We set browser versions and grab
|
||||
// the URL we were loaded from here.
|
||||
|
||||
// FIXME: need to probably use a different reference to "document" to get the hosting XUL environment
|
||||
|
||||
d.baseUrl = d.config.baseUrl;
|
||||
dojo.baseUrl = dojo.config.baseUrl;
|
||||
|
||||
// fill in the rendering support information in dojo.render.*
|
||||
var n = navigator;
|
||||
@@ -32,25 +26,25 @@ if(typeof window != 'undefined'){
|
||||
var dav = n.appVersion;
|
||||
var tv = parseFloat(dav);
|
||||
|
||||
d.isMozilla = d.isMoz = tv;
|
||||
if(d.isMoz){
|
||||
d.isFF = parseFloat(dua.split("Firefox/")[1]) || undefined;
|
||||
dojo.isMozilla = dojo.isMoz = tv;
|
||||
if(dojo.isMoz){
|
||||
dojo.isFF = parseFloat(dua.split("Firefox/")[1]) || undefined;
|
||||
}
|
||||
|
||||
// FIXME
|
||||
d.isQuirks = document.compatMode == "BackCompat";
|
||||
dojo.isQuirks = document.compatMode == "BackCompat";
|
||||
|
||||
// FIXME
|
||||
// TODO: is the HTML LANG attribute relevant?
|
||||
d.locale = dojo.config.locale || n.language.toLowerCase();
|
||||
dojo.locale = dojo.config.locale || n.language.toLowerCase();
|
||||
|
||||
d._xhrObj = function(){
|
||||
dojo._xhrObj = function(){
|
||||
return new XMLHttpRequest();
|
||||
}
|
||||
};
|
||||
|
||||
// monkey-patch _loadUri to handle file://, chrome://, and resource:// url's
|
||||
var oldLoadUri = d._loadUri;
|
||||
d._loadUri = function(uri, cb){
|
||||
var oldLoadUri = dojo._loadUri;
|
||||
dojo._loadUri = function(uri, cb){
|
||||
var handleLocal = ["file:", "chrome:", "resource:"].some(function(prefix){
|
||||
return String(uri).indexOf(prefix) == 0;
|
||||
});
|
||||
@@ -59,23 +53,23 @@ if(typeof window != 'undefined'){
|
||||
// http://developer.mozilla.org/en/mozIJSSubScriptLoader
|
||||
var l = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
|
||||
.getService(Components.interfaces.mozIJSSubScriptLoader);
|
||||
var value = l.loadSubScript(uri, d.global)
|
||||
var value = l.loadSubScript(uri, dojo.global);
|
||||
if(cb){ cb(value); }
|
||||
return true;
|
||||
}else{
|
||||
// otherwise, call the pre-existing version
|
||||
return oldLoadUri.apply(d, arguments);
|
||||
return oldLoadUri.apply(dojo, arguments);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// FIXME: PORTME
|
||||
d._isDocumentOk = function(http){
|
||||
dojo._isDocumentOk = function(http){
|
||||
var stat = http.status || 0;
|
||||
return (stat >= 200 && stat < 300) || // Boolean
|
||||
stat == 304 || // allow any 2XX response code
|
||||
stat == 1223 || // get it out of the cache
|
||||
(!stat && (location.protocol=="file:" || location.protocol=="chrome:") );
|
||||
}
|
||||
(!stat && (location.protocol == "file:" || location.protocol == "chrome:") );
|
||||
};
|
||||
|
||||
// FIXME: PORTME
|
||||
// var owloc = window.location+"";
|
||||
@@ -83,7 +77,7 @@ if(typeof window != 'undefined'){
|
||||
// var hasBase = (base && base.length > 0);
|
||||
var hasBase = false;
|
||||
|
||||
d._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){
|
||||
dojo._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){
|
||||
// summary: Read the contents of the specified uri and return those contents.
|
||||
// uri:
|
||||
// A relative or absolute uri. If absolute, it still must be in
|
||||
@@ -97,15 +91,15 @@ if(typeof window != 'undefined'){
|
||||
// alert("_getText: " + uri);
|
||||
|
||||
// NOTE: must be declared before scope switches ie. this._xhrObj()
|
||||
var http = d._xhrObj();
|
||||
var http = dojo._xhrObj();
|
||||
|
||||
if(!hasBase && dojo._Url){
|
||||
uri = (new dojo._Url(uri)).toString();
|
||||
}
|
||||
if(d.config.cacheBust){
|
||||
if(dojo.config.cacheBust){
|
||||
//Make sure we have a string before string methods are used on uri
|
||||
uri += "";
|
||||
uri += (uri.indexOf("?") == -1 ? "?" : "&") + String(d.config.cacheBust).replace(/\W+/g,"");
|
||||
uri += (uri.indexOf("?") == -1 ? "?" : "&") + String(dojo.config.cacheBust).replace(/\W+/g, "");
|
||||
}
|
||||
var handleLocal = ["file:", "chrome:", "resource:"].some(function(prefix){
|
||||
return String(uri).indexOf(prefix) == 0;
|
||||
@@ -115,7 +109,7 @@ if(typeof window != 'undefined'){
|
||||
// http://forums.mozillazine.org/viewtopic.php?p=921150#921150
|
||||
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
|
||||
.getService(Components.interfaces.nsIIOService);
|
||||
var scriptableStream=Components
|
||||
var scriptableStream = Components
|
||||
.classes["@mozilla.org/scriptableinputstream;1"]
|
||||
.getService(Components.interfaces.nsIScriptableInputStream);
|
||||
|
||||
@@ -131,37 +125,39 @@ if(typeof window != 'undefined'){
|
||||
try{
|
||||
http.send(null);
|
||||
// alert(http);
|
||||
if(!d._isDocumentOk(http)){
|
||||
var err = Error("Unable to load "+uri+" status:"+ http.status);
|
||||
if(!dojo._isDocumentOk(http)){
|
||||
var err = Error("Unable to load " + uri + " status:" + http.status);
|
||||
err.status = http.status;
|
||||
err.responseText = http.responseText;
|
||||
throw err;
|
||||
}
|
||||
}catch(e){
|
||||
if(fail_ok){ return null; } // null
|
||||
if(fail_ok){
|
||||
return null;
|
||||
} // null
|
||||
// rethrow the exception
|
||||
throw e;
|
||||
}
|
||||
return http.responseText; // String
|
||||
}
|
||||
}
|
||||
|
||||
d._windowUnloaders = [];
|
||||
|
||||
};
|
||||
|
||||
dojo._windowUnloaders = [];
|
||||
|
||||
// FIXME: PORTME
|
||||
d.windowUnloaded = function(){
|
||||
dojo.windowUnloaded = function(){
|
||||
// summary:
|
||||
// signal fired by impending window destruction. You may use
|
||||
// dojo.addOnWIndowUnload() or dojo.connect() to this method to perform
|
||||
// page/application cleanup methods. See dojo.addOnWindowUnload for more info.
|
||||
var mll = d._windowUnloaders;
|
||||
var mll = dojo._windowUnloaders;
|
||||
while(mll.length){
|
||||
(mll.pop())();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// FIXME: PORTME
|
||||
d.addOnWindowUnload = function(/*Object?*/obj, /*String|Function?*/functionName){
|
||||
dojo.addOnWindowUnload = function(/*Object?*/obj, /*String|Function?*/functionName){
|
||||
// summary:
|
||||
// registers a function to be triggered when window.onunload fires.
|
||||
// Be careful trying to modify the DOM or access JavaScript properties
|
||||
@@ -172,9 +168,9 @@ if(typeof window != 'undefined'){
|
||||
// | dojo.addOnWindowUnload(functionPointer)
|
||||
// | dojo.addOnWindowUnload(object, "functionName")
|
||||
// | dojo.addOnWindowUnload(object, function(){ /* ... */});
|
||||
|
||||
d._onto(d._windowUnloaders, obj, functionName);
|
||||
}
|
||||
|
||||
dojo._onto(dojo._windowUnloaders, obj, functionName);
|
||||
};
|
||||
|
||||
// XUL specific APIs
|
||||
var contexts = [];
|
||||
@@ -271,7 +267,7 @@ if(typeof window != 'undefined'){
|
||||
if(dojo._inFlightCount == 0){
|
||||
dojo._modulesLoaded();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
(function(){
|
||||
@@ -294,7 +290,7 @@ if(typeof window != 'undefined'){
|
||||
_handleNodeEvent("onunload", function() { dojo.windowUnloaded(); });
|
||||
})();
|
||||
*/
|
||||
|
||||
|
||||
|
||||
// FIXME: PORTME
|
||||
// this event fires a lot, namely for all plugin XUL overlays and for
|
||||
@@ -302,7 +298,7 @@ if(typeof window != 'undefined'){
|
||||
// Dojo's to fire once..but we might care if pages navigate. We'll
|
||||
// probably need an extension-specific API
|
||||
if(!dojo.config.afterOnLoad){
|
||||
window.addEventListener("DOMContentLoaded",function(e){
|
||||
window.addEventListener("DOMContentLoaded", function(e){
|
||||
dojo._loadInit(e);
|
||||
// console.log("DOM content loaded", e);
|
||||
}, false);
|
||||
@@ -328,11 +324,11 @@ if(dojo.config.isDebug){
|
||||
console.log = function(m){
|
||||
var s = Components.classes["@mozilla.org/consoleservice;1"].getService(
|
||||
Components.interfaces.nsIConsoleService
|
||||
);
|
||||
);
|
||||
s.logStringMessage(m);
|
||||
}
|
||||
};
|
||||
console.debug = function(){
|
||||
console.log(dojo._toArray(arguments).join(" "));
|
||||
}
|
||||
};
|
||||
// FIXME: what about the rest of the console.* methods? And is there any way to reach into firebug and log into it directly?
|
||||
}
|
||||
87
lib/dojo/_base/configNode.js
Normal file
87
lib/dojo/_base/configNode.js
Normal file
@@ -0,0 +1,87 @@
|
||||
exports.config = function(config){
|
||||
// summary:
|
||||
// This module provides bootstrap configuration for running dojo in node.js
|
||||
|
||||
// any command line arguments with the load flag are pushed into deps
|
||||
for(var deps = [], args = [], i = 0; i < process.argv.length; i++){
|
||||
var arg = (process.argv[i] + "").split("=");
|
||||
if(arg[0] == "load"){
|
||||
deps.push(arg[1]);
|
||||
}else{
|
||||
args.push(arg);
|
||||
}
|
||||
}
|
||||
|
||||
var fs = require("fs");
|
||||
|
||||
// make sure global require exists
|
||||
//if (typeof global.require=="undefined") {
|
||||
// global.require= {};
|
||||
//}
|
||||
|
||||
// reset the has cache with node-appropriate values;
|
||||
var hasCache = {
|
||||
"host-node":1,
|
||||
"host-browser":0,
|
||||
"dom":0,
|
||||
"dojo-has-api":1,
|
||||
"dojo-xhr-factory":0,
|
||||
"dojo-inject-api":1,
|
||||
"dojo-timeout-api":0,
|
||||
"dojo-trace-api":1,
|
||||
"dojo-dom-ready-api":0,
|
||||
"dojo-publish-privates":1,
|
||||
"dojo-sniff":0,
|
||||
"dojo-loader":1,
|
||||
"dojo-test-xd":0,
|
||||
"dojo-test-sniff":0
|
||||
};
|
||||
for(var p in hasCache){
|
||||
config.hasCache[p] = hasCache[p];
|
||||
}
|
||||
|
||||
var vm = require('vm');
|
||||
|
||||
|
||||
// reset some configuration switches with node-appropriate values
|
||||
var nodeConfig = {
|
||||
baseUrl: __dirname.match(/(.+)[\/\\]_base$/)[1],
|
||||
commandLineArgs:args,
|
||||
deps:deps,
|
||||
timeout:0,
|
||||
|
||||
// TODO: really get the locale
|
||||
locale:"en-us",
|
||||
|
||||
loaderPatch: {
|
||||
log:function(item){
|
||||
// define debug for console messages during dev instead of console.log
|
||||
// (node's heavy async makes console.log confusing sometimes)
|
||||
var util = require("util");
|
||||
util.debug(util.inspect(item));
|
||||
},
|
||||
|
||||
eval: function(__text, __urlHint){
|
||||
return vm.runInThisContext(__text, __urlHint);
|
||||
},
|
||||
|
||||
injectUrl: function(url, callback){
|
||||
try{
|
||||
vm.runInThisContext(fs.readFileSync(url, "utf8"), url);
|
||||
callback();
|
||||
}catch(e){
|
||||
this.log("failed to load resource (" + url + ")");
|
||||
this.log(e);
|
||||
}
|
||||
},
|
||||
|
||||
getText: function(url, sync, onLoad){
|
||||
// TODO: implement async and http/https handling
|
||||
onLoad(fs.readFileSync(url, "utf8"));
|
||||
}
|
||||
}
|
||||
};
|
||||
for(p in nodeConfig){
|
||||
config[p] = nodeConfig[p];
|
||||
}
|
||||
};
|
||||
121
lib/dojo/_base/configRhino.js
Normal file
121
lib/dojo/_base/configRhino.js
Normal file
@@ -0,0 +1,121 @@
|
||||
function rhinoDojoConfig(config, baseUrl, rhinoArgs){
|
||||
// summary:
|
||||
// This module provides bootstrap configuration for running dojo in rhino.
|
||||
|
||||
// TODO: v1.6 tries to set dojo.doc and dojo.body in rhino; why?
|
||||
|
||||
// get a minimal console up
|
||||
var log = function(hint, args){
|
||||
print((hint ? hint + ":" : "") + args[0]);
|
||||
for(var i = 1; i < args.length; i++){
|
||||
print(", " + args[i]);
|
||||
}
|
||||
};
|
||||
// intentionally define console in the global namespace
|
||||
console= {
|
||||
log: function(){ log(0, arguments); },
|
||||
error: function(){ log("ERROR", arguments); },
|
||||
warn: function(){ log("WARN", arguments); }
|
||||
};
|
||||
|
||||
// any command line arguments with the load flag are pushed into deps
|
||||
for(var deps = [], i = 0; i < rhinoArgs.length; i++){
|
||||
var arg = (rhinoArgs[i] + "").split("=");
|
||||
if(arg[0] == "load"){
|
||||
deps.push(arg[1]);
|
||||
}
|
||||
}
|
||||
|
||||
// provides timed callbacks using Java threads
|
||||
if(typeof setTimeout == "undefined" || typeof clearTimeout == "undefined"){
|
||||
var timeouts = [];
|
||||
clearTimeout = function(idx){
|
||||
if(!timeouts[idx]){ return; }
|
||||
timeouts[idx].stop();
|
||||
};
|
||||
|
||||
setTimeout = function(func, delay){
|
||||
var def = {
|
||||
sleepTime:delay,
|
||||
hasSlept:false,
|
||||
|
||||
run:function(){
|
||||
if(!this.hasSlept){
|
||||
this.hasSlept = true;
|
||||
java.lang.Thread.currentThread().sleep(this.sleepTime);
|
||||
}
|
||||
try{
|
||||
func();
|
||||
}catch(e){
|
||||
console.debug("Error running setTimeout thread:" + e);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var runnable = new java.lang.Runnable(def);
|
||||
var thread = new java.lang.Thread(runnable);
|
||||
thread.start();
|
||||
return timeouts.push(thread) - 1;
|
||||
};
|
||||
}
|
||||
|
||||
var isLocal = function(url){
|
||||
return (new java.io.File(url)).exists();
|
||||
};
|
||||
|
||||
// reset the has cache with node-appropriate values;
|
||||
var hasCache = {
|
||||
"host-rhino":1,
|
||||
"host-browser":0,
|
||||
"dom":0,
|
||||
"dojo-has-api":1,
|
||||
"dojo-xhr-factory":0,
|
||||
"dojo-inject-api":1,
|
||||
"dojo-timeout-api":0,
|
||||
"dojo-trace-api":1,
|
||||
"dojo-loader-catches":1,
|
||||
"dojo-dom-ready-api":0,
|
||||
"dojo-publish-privates":1,
|
||||
"dojo-sniff":0,
|
||||
"dojo-loader":1,
|
||||
"dojo-test-xd":0,
|
||||
"dojo-test-sniff":0
|
||||
};
|
||||
for(var p in hasCache){
|
||||
config.hasCache[p] = hasCache[p];
|
||||
}
|
||||
|
||||
// reset some configuration switches with rhino-appropriate values
|
||||
var rhinoConfig = {
|
||||
baseUrl:baseUrl,
|
||||
commandLineArgs:rhinoArgs,
|
||||
deps:deps,
|
||||
timeout:0,
|
||||
locale:String(java.util.Locale.getDefault().toString().replace('_', '-').toLowerCase()),
|
||||
|
||||
loaderPatch:{
|
||||
injectUrl: function(url, callback){
|
||||
try{
|
||||
if(isLocal(url)){
|
||||
load(url);
|
||||
}else{
|
||||
require.eval(readUrl(url, "UTF-8"));
|
||||
}
|
||||
callback();
|
||||
}catch(e){
|
||||
console.log("failed to load resource (" + url + ")");
|
||||
console.log(e);
|
||||
}
|
||||
},
|
||||
|
||||
getText: function(url, sync, onLoad){
|
||||
// TODO: test https://bugzilla.mozilla.org/show_bug.cgi?id=471005; see v1.6 hostenv_rhino
|
||||
// note: async mode not supported in rhino
|
||||
onLoad(isLocal(url) ? readFile(url, "UTF-8") : readUrl(url, "UTF-8"));
|
||||
}
|
||||
}
|
||||
};
|
||||
for(p in rhinoConfig){
|
||||
config[p] = rhinoConfig[p];
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,4 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
// TODO: this file needs to be converted to the v1.7 loader
|
||||
|
||||
|
||||
/*
|
||||
@@ -26,7 +22,7 @@ dojo.isSpidermonkey = {
|
||||
dojo.isSpidermonkey = true;
|
||||
dojo.exit = function(exitcode){
|
||||
quit(exitcode);
|
||||
}
|
||||
};
|
||||
|
||||
if(typeof print == "function"){
|
||||
console.debug = print;
|
||||
@@ -46,24 +42,24 @@ dojo._spidermonkeyCurrentFile = function(depth){
|
||||
// the stack, but that does require that you know how deep your stack is when you are
|
||||
// calling.
|
||||
//
|
||||
var s = '';
|
||||
try{
|
||||
var s = '';
|
||||
try{
|
||||
throw Error("whatever");
|
||||
}catch(e){
|
||||
s = e.stack;
|
||||
}
|
||||
// lines are like: bu_getCurrentScriptURI_spidermonkey("ScriptLoader.js")@burst/Runtime.js:101
|
||||
var matches = s.match(/[^@]*\.js/gi);
|
||||
if(!matches){
|
||||
// lines are like: bu_getCurrentScriptURI_spidermonkey("ScriptLoader.js")@burst/Runtime.js:101
|
||||
var matches = s.match(/[^@]*\.js/gi);
|
||||
if(!matches){
|
||||
throw Error("could not parse stack string: '" + s + "'");
|
||||
}
|
||||
var fname = (typeof depth != 'undefined' && depth) ? matches[depth + 1] : matches[matches.length - 1];
|
||||
if(!fname){
|
||||
var fname = (typeof depth != 'undefined' && depth) ? matches[depth + 1] : matches[matches.length - 1];
|
||||
if(!fname){
|
||||
throw Error("could not find file name in stack string '" + s + "'");
|
||||
}
|
||||
//print("SpiderMonkeyRuntime got fname '" + fname + "' from stack string '" + s + "'");
|
||||
return fname;
|
||||
}
|
||||
//print("SpiderMonkeyRuntime got fname '" + fname + "' from stack string '" + s + "'");
|
||||
return fname;
|
||||
};
|
||||
|
||||
// print(dojo._spidermonkeyCurrentFile(0));
|
||||
|
||||
@@ -72,10 +68,11 @@ dojo._loadUri = function(uri){
|
||||
// is what we want).
|
||||
// TODO: sigh, load() does not return a useful value.
|
||||
// Perhaps it is returning the value of the last thing evaluated?
|
||||
var ok = load(uri);
|
||||
// var ok =
|
||||
load(uri);
|
||||
// console.log("spidermonkey load(", uri, ") returned ", ok);
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
//Register any module paths set up in djConfig. Need to do this
|
||||
//in the hostenvs since hostenv_browser can read djConfig from a
|
||||
@@ -4,308 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base.connect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base.connect"] = true;
|
||||
dojo.provide("dojo._base.connect");
|
||||
dojo.require("dojo._base.lang");
|
||||
|
||||
|
||||
// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA
|
||||
|
||||
// low-level delegation machinery
|
||||
dojo._listener = {
|
||||
// create a dispatcher function
|
||||
getDispatcher: function(){
|
||||
// following comments pulled out-of-line to prevent cloning them
|
||||
// in the returned function.
|
||||
// - indices (i) that are really in the array of listeners (ls) will
|
||||
// not be in Array.prototype. This is the 'sparse array' trick
|
||||
// that keeps us safe from libs that take liberties with built-in
|
||||
// objects
|
||||
// - listener is invoked with current scope (this)
|
||||
return function(){
|
||||
var ap = Array.prototype, c = arguments.callee, ls = c._listeners, t = c.target,
|
||||
// return value comes from original target function
|
||||
r = t && t.apply(this, arguments),
|
||||
// make local copy of listener array so it is immutable during processing
|
||||
i, lls = [].concat(ls)
|
||||
;
|
||||
|
||||
// invoke listeners after target function
|
||||
for(i in lls){
|
||||
if(!(i in ap)){
|
||||
lls[i].apply(this, arguments);
|
||||
}
|
||||
}
|
||||
// return value comes from original target function
|
||||
return r;
|
||||
};
|
||||
},
|
||||
// add a listener to an object
|
||||
add: function(/*Object*/ source, /*String*/ method, /*Function*/ listener){
|
||||
// Whenever 'method' is invoked, 'listener' will have the same scope.
|
||||
// Trying to supporting a context object for the listener led to
|
||||
// complexity.
|
||||
// Non trivial to provide 'once' functionality here
|
||||
// because listener could be the result of a dojo.hitch call,
|
||||
// in which case two references to the same hitch target would not
|
||||
// be equivalent.
|
||||
source = source || dojo.global;
|
||||
// The source method is either null, a dispatcher, or some other function
|
||||
var f = source[method];
|
||||
// Ensure a dispatcher
|
||||
if(!f || !f._listeners){
|
||||
var d = dojo._listener.getDispatcher();
|
||||
// original target function is special
|
||||
d.target = f;
|
||||
// dispatcher holds a list of listeners
|
||||
d._listeners = [];
|
||||
// redirect source to dispatcher
|
||||
f = source[method] = d;
|
||||
}
|
||||
// The contract is that a handle is returned that can
|
||||
// identify this listener for disconnect.
|
||||
//
|
||||
// The type of the handle is private. Here is it implemented as Integer.
|
||||
// DOM event code has this same contract but handle is Function
|
||||
// in non-IE browsers.
|
||||
//
|
||||
// We could have separate lists of before and after listeners.
|
||||
return f._listeners.push(listener); /*Handle*/
|
||||
},
|
||||
// remove a listener from an object
|
||||
remove: function(/*Object*/ source, /*String*/ method, /*Handle*/ handle){
|
||||
var f = (source || dojo.global)[method];
|
||||
// remember that handle is the index+1 (0 is not a valid handle)
|
||||
if(f && f._listeners && handle--){
|
||||
delete f._listeners[handle];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Multiple delegation for arbitrary methods.
|
||||
|
||||
// This unit knows nothing about DOM, but we include DOM aware documentation
|
||||
// and dontFix argument here to help the autodocs. Actual DOM aware code is in
|
||||
// event.js.
|
||||
|
||||
dojo.connect = function(/*Object|null*/ obj,
|
||||
/*String*/ event,
|
||||
/*Object|null*/ context,
|
||||
/*String|Function*/ method,
|
||||
/*Boolean?*/ dontFix){
|
||||
// summary:
|
||||
// `dojo.connect` is the core event handling and delegation method in
|
||||
// Dojo. It allows one function to "listen in" on the execution of
|
||||
// any other, triggering the second whenever the first is called. Many
|
||||
// listeners may be attached to a function, and source functions may
|
||||
// be either regular function calls or DOM events.
|
||||
//
|
||||
// description:
|
||||
// Connects listeners to actions, so that after event fires, a
|
||||
// listener is called with the same arguments passed to the original
|
||||
// function.
|
||||
//
|
||||
// Since `dojo.connect` allows the source of events to be either a
|
||||
// "regular" JavaScript function or a DOM event, it provides a uniform
|
||||
// interface for listening to all the types of events that an
|
||||
// application is likely to deal with though a single, unified
|
||||
// interface. DOM programmers may want to think of it as
|
||||
// "addEventListener for everything and anything".
|
||||
//
|
||||
// When setting up a connection, the `event` parameter must be a
|
||||
// string that is the name of the method/event to be listened for. If
|
||||
// `obj` is null, `dojo.global` is assumed, meaning that connections
|
||||
// to global methods are supported but also that you may inadvertently
|
||||
// connect to a global by passing an incorrect object name or invalid
|
||||
// reference.
|
||||
//
|
||||
// `dojo.connect` generally is forgiving. If you pass the name of a
|
||||
// function or method that does not yet exist on `obj`, connect will
|
||||
// not fail, but will instead set up a stub method. Similarly, null
|
||||
// arguments may simply be omitted such that fewer than 4 arguments
|
||||
// may be required to set up a connection See the examples for details.
|
||||
//
|
||||
// The return value is a handle that is needed to
|
||||
// remove this connection with `dojo.disconnect`.
|
||||
//
|
||||
// obj:
|
||||
// The source object for the event function.
|
||||
// Defaults to `dojo.global` if null.
|
||||
// If obj is a DOM node, the connection is delegated
|
||||
// to the DOM event manager (unless dontFix is true).
|
||||
//
|
||||
// event:
|
||||
// String name of the event function in obj.
|
||||
// I.e. identifies a property `obj[event]`.
|
||||
//
|
||||
// context:
|
||||
// The object that method will receive as "this".
|
||||
//
|
||||
// If context is null and method is a function, then method
|
||||
// inherits the context of event.
|
||||
//
|
||||
// If method is a string then context must be the source
|
||||
// object object for method (context[method]). If context is null,
|
||||
// dojo.global is used.
|
||||
//
|
||||
// method:
|
||||
// A function reference, or name of a function in context.
|
||||
// The function identified by method fires after event does.
|
||||
// method receives the same arguments as the event.
|
||||
// See context argument comments for information on method's scope.
|
||||
//
|
||||
// dontFix:
|
||||
// If obj is a DOM node, set dontFix to true to prevent delegation
|
||||
// of this connection to the DOM event manager.
|
||||
//
|
||||
// example:
|
||||
// When obj.onchange(), do ui.update():
|
||||
// | dojo.connect(obj, "onchange", ui, "update");
|
||||
// | dojo.connect(obj, "onchange", ui, ui.update); // same
|
||||
//
|
||||
// example:
|
||||
// Using return value for disconnect:
|
||||
// | var link = dojo.connect(obj, "onchange", ui, "update");
|
||||
// | ...
|
||||
// | dojo.disconnect(link);
|
||||
//
|
||||
// example:
|
||||
// When onglobalevent executes, watcher.handler is invoked:
|
||||
// | dojo.connect(null, "onglobalevent", watcher, "handler");
|
||||
//
|
||||
// example:
|
||||
// When ob.onCustomEvent executes, customEventHandler is invoked:
|
||||
// | dojo.connect(ob, "onCustomEvent", null, "customEventHandler");
|
||||
// | dojo.connect(ob, "onCustomEvent", "customEventHandler"); // same
|
||||
//
|
||||
// example:
|
||||
// When ob.onCustomEvent executes, customEventHandler is invoked
|
||||
// with the same scope (this):
|
||||
// | dojo.connect(ob, "onCustomEvent", null, customEventHandler);
|
||||
// | dojo.connect(ob, "onCustomEvent", customEventHandler); // same
|
||||
//
|
||||
// example:
|
||||
// When globalEvent executes, globalHandler is invoked
|
||||
// with the same scope (this):
|
||||
// | dojo.connect(null, "globalEvent", null, globalHandler);
|
||||
// | dojo.connect("globalEvent", globalHandler); // same
|
||||
|
||||
// normalize arguments
|
||||
var a=arguments, args=[], i=0;
|
||||
// if a[0] is a String, obj was omitted
|
||||
args.push(dojo.isString(a[0]) ? null : a[i++], a[i++]);
|
||||
// if the arg-after-next is a String or Function, context was NOT omitted
|
||||
var a1 = a[i+1];
|
||||
args.push(dojo.isString(a1)||dojo.isFunction(a1) ? a[i++] : null, a[i++]);
|
||||
// absorb any additional arguments
|
||||
for(var l=a.length; i<l; i++){ args.push(a[i]); }
|
||||
// do the actual work
|
||||
return dojo._connect.apply(this, args); /*Handle*/
|
||||
}
|
||||
|
||||
// used by non-browser hostenvs. always overriden by event.js
|
||||
dojo._connect = function(obj, event, context, method){
|
||||
var l=dojo._listener, h=l.add(obj, event, dojo.hitch(context, method));
|
||||
return [obj, event, h, l]; // Handle
|
||||
};
|
||||
|
||||
dojo.disconnect = function(/*Handle*/ handle){
|
||||
// summary:
|
||||
// Remove a link created by dojo.connect.
|
||||
// description:
|
||||
// Removes the connection between event and the method referenced by handle.
|
||||
// handle:
|
||||
// the return value of the dojo.connect call that created the connection.
|
||||
if(handle && handle[0] !== undefined){
|
||||
dojo._disconnect.apply(this, handle);
|
||||
// let's not keep this reference
|
||||
delete handle[0];
|
||||
}
|
||||
};
|
||||
|
||||
dojo._disconnect = function(obj, event, handle, listener){
|
||||
listener.remove(obj, event, handle);
|
||||
};
|
||||
|
||||
// topic publish/subscribe
|
||||
|
||||
dojo._topics = {};
|
||||
|
||||
dojo.subscribe = function(/*String*/ topic, /*Object|null*/ context, /*String|Function*/ method){
|
||||
// summary:
|
||||
// Attach a listener to a named topic. The listener function is invoked whenever the
|
||||
// named topic is published (see: dojo.publish).
|
||||
// Returns a handle which is needed to unsubscribe this listener.
|
||||
// context:
|
||||
// Scope in which method will be invoked, or null for default scope.
|
||||
// method:
|
||||
// The name of a function in context, or a function reference. This is the function that
|
||||
// is invoked when topic is published.
|
||||
// example:
|
||||
// | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); });
|
||||
// | dojo.publish("alerts", [ "read this", "hello world" ]);
|
||||
|
||||
// support for 2 argument invocation (omitting context) depends on hitch
|
||||
return [topic, dojo._listener.add(dojo._topics, topic, dojo.hitch(context, method))]; /*Handle*/
|
||||
};
|
||||
|
||||
dojo.unsubscribe = function(/*Handle*/ handle){
|
||||
// summary:
|
||||
// Remove a topic listener.
|
||||
// handle:
|
||||
// The handle returned from a call to subscribe.
|
||||
// example:
|
||||
// | var alerter = dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
|
||||
// | ...
|
||||
// | dojo.unsubscribe(alerter);
|
||||
if(handle){
|
||||
dojo._listener.remove(dojo._topics, handle[0], handle[1]);
|
||||
}
|
||||
};
|
||||
|
||||
dojo.publish = function(/*String*/ topic, /*Array*/ args){
|
||||
// summary:
|
||||
// Invoke all listener method subscribed to topic.
|
||||
// topic:
|
||||
// The name of the topic to publish.
|
||||
// args:
|
||||
// An array of arguments. The arguments will be applied
|
||||
// to each topic subscriber (as first class parameters, via apply).
|
||||
// example:
|
||||
// | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
|
||||
// | dojo.publish("alerts", [ "read this", "hello world" ]);
|
||||
|
||||
// Note that args is an array, which is more efficient vs variable length
|
||||
// argument list. Ideally, var args would be implemented via Array
|
||||
// throughout the APIs.
|
||||
var f = dojo._topics[topic];
|
||||
if(f){
|
||||
f.apply(this, args||[]);
|
||||
}
|
||||
};
|
||||
|
||||
dojo.connectPublisher = function( /*String*/ topic,
|
||||
/*Object|null*/ obj,
|
||||
/*String*/ event){
|
||||
// summary:
|
||||
// Ensure that every time obj.event() is called, a message is published
|
||||
// on the topic. Returns a handle which can be passed to
|
||||
// dojo.disconnect() to disable subsequent automatic publication on
|
||||
// the topic.
|
||||
// topic:
|
||||
// The name of the topic to publish.
|
||||
// obj:
|
||||
// The source object for the event function. Defaults to dojo.global
|
||||
// if null.
|
||||
// event:
|
||||
// The name of the event function in obj.
|
||||
// I.e. identifies a property obj[event].
|
||||
// example:
|
||||
// | dojo.connectPublisher("/ajax/start", dojo, "xhrGet");
|
||||
var pf = function(){ dojo.publish(topic, arguments); }
|
||||
return event ? dojo.connect(obj, event, pf) : dojo.connect(obj, pf); //Handle
|
||||
};
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/_base/connect",["./kernel","../on","../topic","../aspect","./event","../mouse","./sniff","./lang","../keys"],function(_1,on,_2,_3,_4,_5,_6,_7){_6.add("events-keypress-typed",function(){var _8={charCode:0};try{_8=document.createEvent("KeyboardEvent");(_8.initKeyboardEvent||_8.initKeyEvent).call(_8,"keypress",true,true,null,false,false,false,false,9,3);}catch(e){}return _8.charCode==0&&!_6("opera");});function _9(_a,_b,_c,_d,_e){_d=_7.hitch(_c,_d);if(!_a||!(_a.addEventListener||_a.attachEvent)){return _3.after(_a||_1.global,_b,_d,true);}if(typeof _b=="string"&&_b.substring(0,2)=="on"){_b=_b.substring(2);}if(!_a){_a=_1.global;}if(!_e){switch(_b){case "keypress":_b=_f;break;case "mouseenter":_b=_5.enter;break;case "mouseleave":_b=_5.leave;break;}}return on(_a,_b,_d,_e);};var _10={106:42,111:47,186:59,187:43,188:44,189:45,190:46,191:47,192:96,219:91,220:92,221:93,222:39,229:113};var _11=_6("mac")?"metaKey":"ctrlKey";var _12=function(evt,_13){var _14=_7.mixin({},evt,_13);_15(_14);_14.preventDefault=function(){evt.preventDefault();};_14.stopPropagation=function(){evt.stopPropagation();};return _14;};function _15(evt){evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";evt.charOrCode=evt.keyChar||evt.keyCode;};var _f;if(_6("events-keypress-typed")){var _16=function(e,_17){try{return (e.keyCode=_17);}catch(e){return 0;}};_f=function(_18,_19){var _1a=on(_18,"keydown",function(evt){var k=evt.keyCode;var _1b=(k!=13||(_6("ie")>=9&&!_6("quirks")))&&k!=32&&(k!=27||!_6("ie"))&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222)&&k!=229;if(_1b||evt.ctrlKey){var c=_1b?0:k;if(evt.ctrlKey){if(k==3||k==13){return _19.call(evt.currentTarget,evt);}else{if(c>95&&c<106){c-=48;}else{if((!evt.shiftKey)&&(c>=65&&c<=90)){c+=32;}else{c=_10[c]||c;}}}}var _1c=_12(evt,{type:"keypress",faux:true,charCode:c});_19.call(evt.currentTarget,_1c);if(_6("ie")){_16(evt,_1c.keyCode);}}});var _1d=on(_18,"keypress",function(evt){var c=evt.charCode;c=c>=32?c:0;evt=_12(evt,{charCode:c,faux:true});return _19.call(this,evt);});return {remove:function(){_1a.remove();_1d.remove();}};};}else{if(_6("opera")){_f=function(_1e,_1f){return on(_1e,"keypress",function(evt){var c=evt.which;if(c==3){c=99;}c=c<32&&!evt.shiftKey?0:c;if(evt.ctrlKey&&!evt.shiftKey&&c>=65&&c<=90){c+=32;}return _1f.call(this,_12(evt,{charCode:c}));});};}else{_f=function(_20,_21){return on(_20,"keypress",function(evt){_15(evt);return _21.call(this,evt);});};}}var _22={_keypress:_f,connect:function(obj,_23,_24,_25,_26){var a=arguments,_27=[],i=0;_27.push(typeof a[0]=="string"?null:a[i++],a[i++]);var a1=a[i+1];_27.push(typeof a1=="string"||typeof a1=="function"?a[i++]:null,a[i++]);for(var l=a.length;i<l;i++){_27.push(a[i]);}return _9.apply(this,_27);},disconnect:function(_28){if(_28){_28.remove();}},subscribe:function(_29,_2a,_2b){return _2.subscribe(_29,_7.hitch(_2a,_2b));},publish:function(_2c,_2d){return _2.publish.apply(_2,[_2c].concat(_2d));},connectPublisher:function(_2e,obj,_2f){var pf=function(){_22.publish(_2e,arguments);};return _2f?_22.connect(obj,_2f,pf):_22.connect(obj,pf);},isCopyKey:function(e){return e[_11];}};_22.unsubscribe=_22.disconnect;1&&_7.mixin(_1,_22);return _22;});
|
||||
400
lib/dojo/_base/connect.js.uncompressed.js
Normal file
400
lib/dojo/_base/connect.js.uncompressed.js
Normal file
@@ -0,0 +1,400 @@
|
||||
define("dojo/_base/connect", ["./kernel", "../on", "../topic", "../aspect", "./event", "../mouse", "./sniff", "./lang", "../keys"], function(kernel, on, hub, aspect, eventModule, mouse, has, lang){
|
||||
// module:
|
||||
// dojo/_base/connect
|
||||
// summary:
|
||||
// This module defines the dojo.connect API.
|
||||
// This modules also provides keyboard event handling helpers.
|
||||
// This module exports an extension event for emulating Firefox's keypress handling.
|
||||
// However, this extension event exists primarily for backwards compatibility and
|
||||
// is not recommended. WebKit and IE uses an alternate keypress handling (only
|
||||
// firing for printable characters, to distinguish from keydown events), and most
|
||||
// consider the WebKit/IE behavior more desirable.
|
||||
has.add("events-keypress-typed", function(){ // keypresses should only occur a printable character is hit
|
||||
var testKeyEvent = {charCode: 0};
|
||||
try{
|
||||
testKeyEvent = document.createEvent("KeyboardEvent");
|
||||
(testKeyEvent.initKeyboardEvent || testKeyEvent.initKeyEvent).call(testKeyEvent, "keypress", true, true, null, false, false, false, false, 9, 3);
|
||||
}catch(e){}
|
||||
return testKeyEvent.charCode == 0 && !has("opera");
|
||||
});
|
||||
|
||||
function connect_(obj, event, context, method, dontFix){
|
||||
method = lang.hitch(context, method);
|
||||
if(!obj || !(obj.addEventListener || obj.attachEvent)){
|
||||
// it is a not a DOM node and we are using the dojo.connect style of treating a
|
||||
// method like an event, must go right to aspect
|
||||
return aspect.after(obj || kernel.global, event, method, true);
|
||||
}
|
||||
if(typeof event == "string" && event.substring(0, 2) == "on"){
|
||||
event = event.substring(2);
|
||||
}
|
||||
if(!obj){
|
||||
obj = kernel.global;
|
||||
}
|
||||
if(!dontFix){
|
||||
switch(event){
|
||||
// dojo.connect has special handling for these event types
|
||||
case "keypress":
|
||||
event = keypress;
|
||||
break;
|
||||
case "mouseenter":
|
||||
event = mouse.enter;
|
||||
break;
|
||||
case "mouseleave":
|
||||
event = mouse.leave;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return on(obj, event, method, dontFix);
|
||||
}
|
||||
|
||||
var _punctMap = {
|
||||
106:42,
|
||||
111:47,
|
||||
186:59,
|
||||
187:43,
|
||||
188:44,
|
||||
189:45,
|
||||
190:46,
|
||||
191:47,
|
||||
192:96,
|
||||
219:91,
|
||||
220:92,
|
||||
221:93,
|
||||
222:39,
|
||||
229:113
|
||||
};
|
||||
var evtCopyKey = has("mac") ? "metaKey" : "ctrlKey";
|
||||
|
||||
|
||||
var _synthesizeEvent = function(evt, props){
|
||||
var faux = lang.mixin({}, evt, props);
|
||||
setKeyChar(faux);
|
||||
// FIXME: would prefer to use lang.hitch: lang.hitch(evt, evt.preventDefault);
|
||||
// but it throws an error when preventDefault is invoked on Safari
|
||||
// does Event.preventDefault not support "apply" on Safari?
|
||||
faux.preventDefault = function(){ evt.preventDefault(); };
|
||||
faux.stopPropagation = function(){ evt.stopPropagation(); };
|
||||
return faux;
|
||||
};
|
||||
function setKeyChar(evt){
|
||||
evt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : '';
|
||||
evt.charOrCode = evt.keyChar || evt.keyCode;
|
||||
}
|
||||
var keypress;
|
||||
if(has("events-keypress-typed")){
|
||||
// this emulates Firefox's keypress behavior where every keydown can correspond to a keypress
|
||||
var _trySetKeyCode = function(e, code){
|
||||
try{
|
||||
// squelch errors when keyCode is read-only
|
||||
// (e.g. if keyCode is ctrl or shift)
|
||||
return (e.keyCode = code);
|
||||
}catch(e){
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
keypress = function(object, listener){
|
||||
var keydownSignal = on(object, "keydown", function(evt){
|
||||
// munge key/charCode
|
||||
var k=evt.keyCode;
|
||||
// These are Windows Virtual Key Codes
|
||||
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp
|
||||
var unprintable = (k!=13 || (has("ie") >= 9 && !has("quirks"))) && k!=32 && (k!=27||!has("ie")) && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222) && k!=229;
|
||||
// synthesize keypress for most unprintables and CTRL-keys
|
||||
if(unprintable||evt.ctrlKey){
|
||||
var c = unprintable ? 0 : k;
|
||||
if(evt.ctrlKey){
|
||||
if(k==3 || k==13){
|
||||
return listener.call(evt.currentTarget, evt); // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively
|
||||
}else if(c>95 && c<106){
|
||||
c -= 48; // map CTRL-[numpad 0-9] to ASCII
|
||||
}else if((!evt.shiftKey)&&(c>=65&&c<=90)){
|
||||
c += 32; // map CTRL-[A-Z] to lowercase
|
||||
}else{
|
||||
c = _punctMap[c] || c; // map other problematic CTRL combinations to ASCII
|
||||
}
|
||||
}
|
||||
// simulate a keypress event
|
||||
var faux = _synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c});
|
||||
listener.call(evt.currentTarget, faux);
|
||||
if(has("ie")){
|
||||
_trySetKeyCode(evt, faux.keyCode);
|
||||
}
|
||||
}
|
||||
});
|
||||
var keypressSignal = on(object, "keypress", function(evt){
|
||||
var c = evt.charCode;
|
||||
c = c>=32 ? c : 0;
|
||||
evt = _synthesizeEvent(evt, {charCode: c, faux: true});
|
||||
return listener.call(this, evt);
|
||||
});
|
||||
return {
|
||||
remove: function(){
|
||||
keydownSignal.remove();
|
||||
keypressSignal.remove();
|
||||
}
|
||||
};
|
||||
};
|
||||
}else{
|
||||
if(has("opera")){
|
||||
keypress = function(object, listener){
|
||||
return on(object, "keypress", function(evt){
|
||||
var c = evt.which;
|
||||
if(c==3){
|
||||
c=99; // Mozilla maps CTRL-BREAK to CTRL-c
|
||||
}
|
||||
// can't trap some keys at all, like INSERT and DELETE
|
||||
// there is no differentiating info between DELETE and ".", or INSERT and "-"
|
||||
c = c<32 && !evt.shiftKey ? 0 : c;
|
||||
if(evt.ctrlKey && !evt.shiftKey && c>=65 && c<=90){
|
||||
// lowercase CTRL-[A-Z] keys
|
||||
c += 32;
|
||||
}
|
||||
return listener.call(this, _synthesizeEvent(evt, { charCode: c }));
|
||||
});
|
||||
};
|
||||
}else{
|
||||
keypress = function(object, listener){
|
||||
return on(object, "keypress", function(evt){
|
||||
setKeyChar(evt);
|
||||
return listener.call(this, evt);
|
||||
});
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
var connect = {
|
||||
_keypress:keypress,
|
||||
|
||||
connect:function(obj, event, context, method, dontFix){
|
||||
// normalize arguments
|
||||
var a=arguments, args=[], i=0;
|
||||
// if a[0] is a String, obj was omitted
|
||||
args.push(typeof a[0] == "string" ? null : a[i++], a[i++]);
|
||||
// if the arg-after-next is a String or Function, context was NOT omitted
|
||||
var a1 = a[i+1];
|
||||
args.push(typeof a1 == "string" || typeof a1 == "function" ? a[i++] : null, a[i++]);
|
||||
// absorb any additional arguments
|
||||
for(var l=a.length; i<l; i++){ args.push(a[i]); }
|
||||
return connect_.apply(this, args);
|
||||
},
|
||||
|
||||
disconnect:function(handle){
|
||||
if(handle){
|
||||
handle.remove();
|
||||
}
|
||||
},
|
||||
|
||||
subscribe:function(topic, context, method){
|
||||
return hub.subscribe(topic, lang.hitch(context, method));
|
||||
},
|
||||
|
||||
publish:function(topic, args){
|
||||
return hub.publish.apply(hub, [topic].concat(args));
|
||||
},
|
||||
|
||||
connectPublisher:function(topic, obj, event){
|
||||
var pf = function(){ connect.publish(topic, arguments); };
|
||||
return event ? connect.connect(obj, event, pf) : connect.connect(obj, pf); //Handle
|
||||
},
|
||||
|
||||
isCopyKey: function(e){
|
||||
return e[evtCopyKey]; // Boolean
|
||||
}
|
||||
};
|
||||
connect.unsubscribe = connect.disconnect;
|
||||
|
||||
1 && lang.mixin(kernel, connect);
|
||||
return connect;
|
||||
|
||||
/*=====
|
||||
dojo.connect = function(obj, event, context, method, dontFix){
|
||||
// summary:
|
||||
// `dojo.connect` is the core event handling and delegation method in
|
||||
// Dojo. It allows one function to "listen in" on the execution of
|
||||
// any other, triggering the second whenever the first is called. Many
|
||||
// listeners may be attached to a function, and source functions may
|
||||
// be either regular function calls or DOM events.
|
||||
//
|
||||
// description:
|
||||
// Connects listeners to actions, so that after event fires, a
|
||||
// listener is called with the same arguments passed to the original
|
||||
// function.
|
||||
//
|
||||
// Since `dojo.connect` allows the source of events to be either a
|
||||
// "regular" JavaScript function or a DOM event, it provides a uniform
|
||||
// interface for listening to all the types of events that an
|
||||
// application is likely to deal with though a single, unified
|
||||
// interface. DOM programmers may want to think of it as
|
||||
// "addEventListener for everything and anything".
|
||||
//
|
||||
// When setting up a connection, the `event` parameter must be a
|
||||
// string that is the name of the method/event to be listened for. If
|
||||
// `obj` is null, `kernel.global` is assumed, meaning that connections
|
||||
// to global methods are supported but also that you may inadvertently
|
||||
// connect to a global by passing an incorrect object name or invalid
|
||||
// reference.
|
||||
//
|
||||
// `dojo.connect` generally is forgiving. If you pass the name of a
|
||||
// function or method that does not yet exist on `obj`, connect will
|
||||
// not fail, but will instead set up a stub method. Similarly, null
|
||||
// arguments may simply be omitted such that fewer than 4 arguments
|
||||
// may be required to set up a connection See the examples for details.
|
||||
//
|
||||
// The return value is a handle that is needed to
|
||||
// remove this connection with `dojo.disconnect`.
|
||||
//
|
||||
// obj: Object|null:
|
||||
// The source object for the event function.
|
||||
// Defaults to `kernel.global` if null.
|
||||
// If obj is a DOM node, the connection is delegated
|
||||
// to the DOM event manager (unless dontFix is true).
|
||||
//
|
||||
// event: String:
|
||||
// String name of the event function in obj.
|
||||
// I.e. identifies a property `obj[event]`.
|
||||
//
|
||||
// context: Object|null
|
||||
// The object that method will receive as "this".
|
||||
//
|
||||
// If context is null and method is a function, then method
|
||||
// inherits the context of event.
|
||||
//
|
||||
// If method is a string then context must be the source
|
||||
// object object for method (context[method]). If context is null,
|
||||
// kernel.global is used.
|
||||
//
|
||||
// method: String|Function:
|
||||
// A function reference, or name of a function in context.
|
||||
// The function identified by method fires after event does.
|
||||
// method receives the same arguments as the event.
|
||||
// See context argument comments for information on method's scope.
|
||||
//
|
||||
// dontFix: Boolean?
|
||||
// If obj is a DOM node, set dontFix to true to prevent delegation
|
||||
// of this connection to the DOM event manager.
|
||||
//
|
||||
// example:
|
||||
// When obj.onchange(), do ui.update():
|
||||
// | dojo.connect(obj, "onchange", ui, "update");
|
||||
// | dojo.connect(obj, "onchange", ui, ui.update); // same
|
||||
//
|
||||
// example:
|
||||
// Using return value for disconnect:
|
||||
// | var link = dojo.connect(obj, "onchange", ui, "update");
|
||||
// | ...
|
||||
// | dojo.disconnect(link);
|
||||
//
|
||||
// example:
|
||||
// When onglobalevent executes, watcher.handler is invoked:
|
||||
// | dojo.connect(null, "onglobalevent", watcher, "handler");
|
||||
//
|
||||
// example:
|
||||
// When ob.onCustomEvent executes, customEventHandler is invoked:
|
||||
// | dojo.connect(ob, "onCustomEvent", null, "customEventHandler");
|
||||
// | dojo.connect(ob, "onCustomEvent", "customEventHandler"); // same
|
||||
//
|
||||
// example:
|
||||
// When ob.onCustomEvent executes, customEventHandler is invoked
|
||||
// with the same scope (this):
|
||||
// | dojo.connect(ob, "onCustomEvent", null, customEventHandler);
|
||||
// | dojo.connect(ob, "onCustomEvent", customEventHandler); // same
|
||||
//
|
||||
// example:
|
||||
// When globalEvent executes, globalHandler is invoked
|
||||
// with the same scope (this):
|
||||
// | dojo.connect(null, "globalEvent", null, globalHandler);
|
||||
// | dojo.connect("globalEvent", globalHandler); // same
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.disconnect = function(handle){
|
||||
// summary:
|
||||
// Remove a link created by dojo.connect.
|
||||
// description:
|
||||
// Removes the connection between event and the method referenced by handle.
|
||||
// handle: Handle:
|
||||
// the return value of the dojo.connect call that created the connection.
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.subscribe = function(topic, context, method){
|
||||
// summary:
|
||||
// Attach a listener to a named topic. The listener function is invoked whenever the
|
||||
// named topic is published (see: dojo.publish).
|
||||
// Returns a handle which is needed to unsubscribe this listener.
|
||||
// topic: String:
|
||||
// The topic to which to subscribe.
|
||||
// context: Object|null:
|
||||
// Scope in which method will be invoked, or null for default scope.
|
||||
// method: String|Function:
|
||||
// The name of a function in context, or a function reference. This is the function that
|
||||
// is invoked when topic is published.
|
||||
// example:
|
||||
// | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); });
|
||||
// | dojo.publish("alerts", [ "read this", "hello world" ]);
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.unsubscribe = function(handle){
|
||||
// summary:
|
||||
// Remove a topic listener.
|
||||
// handle: Handle
|
||||
// The handle returned from a call to subscribe.
|
||||
// example:
|
||||
// | var alerter = dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
|
||||
// | ...
|
||||
// | dojo.unsubscribe(alerter);
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.publish = function(topic, args){
|
||||
// summary:
|
||||
// Invoke all listener method subscribed to topic.
|
||||
// topic: String:
|
||||
// The name of the topic to publish.
|
||||
// args: Array?
|
||||
// An array of arguments. The arguments will be applied
|
||||
// to each topic subscriber (as first class parameters, via apply).
|
||||
// example:
|
||||
// | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
|
||||
// | dojo.publish("alerts", [ "read this", "hello world" ]);
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.connectPublisher = function(topic, obj, event){
|
||||
// summary:
|
||||
// Ensure that every time obj.event() is called, a message is published
|
||||
// on the topic. Returns a handle which can be passed to
|
||||
// dojo.disconnect() to disable subsequent automatic publication on
|
||||
// the topic.
|
||||
// topic: String:
|
||||
// The name of the topic to publish.
|
||||
// obj: Object|null:
|
||||
// The source object for the event function. Defaults to kernel.global
|
||||
// if null.
|
||||
// event: String:
|
||||
// The name of the event function in obj.
|
||||
// I.e. identifies a property obj[event].
|
||||
// example:
|
||||
// | dojo.connectPublisher("/ajax/start", dojo, "xhrGet");
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.isCopyKey = function(e){
|
||||
// summary:
|
||||
// Checks an event for the copy key (meta on Mac, and ctrl anywhere else)
|
||||
// e: Event
|
||||
// Event object to examine
|
||||
}
|
||||
=====*/
|
||||
|
||||
});
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
1050
lib/dojo/_base/declare.js.uncompressed.js
Normal file
1050
lib/dojo/_base/declare.js.uncompressed.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -4,646 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base.event"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base.event"] = true;
|
||||
dojo.provide("dojo._base.event");
|
||||
dojo.require("dojo._base.connect");
|
||||
|
||||
|
||||
// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA
|
||||
|
||||
(function(){
|
||||
// DOM event listener machinery
|
||||
var del = (dojo._event_listener = {
|
||||
add: function(/*DOMNode*/ node, /*String*/ name, /*Function*/ fp){
|
||||
if(!node){return;}
|
||||
name = del._normalizeEventName(name);
|
||||
fp = del._fixCallback(name, fp);
|
||||
if(
|
||||
!dojo.isIE &&
|
||||
(name == "mouseenter" || name == "mouseleave")
|
||||
){
|
||||
var ofp = fp;
|
||||
name = (name == "mouseenter") ? "mouseover" : "mouseout";
|
||||
fp = function(e){
|
||||
if(!dojo.isDescendant(e.relatedTarget, node)){
|
||||
// e.type = oname; // FIXME: doesn't take? SJM: event.type is generally immutable.
|
||||
return ofp.call(this, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
node.addEventListener(name, fp, false);
|
||||
return fp; /*Handle*/
|
||||
},
|
||||
remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
|
||||
// summary:
|
||||
// clobbers the listener from the node
|
||||
// node:
|
||||
// DOM node to attach the event to
|
||||
// event:
|
||||
// the name of the handler to remove the function from
|
||||
// handle:
|
||||
// the handle returned from add
|
||||
if(node){
|
||||
event = del._normalizeEventName(event);
|
||||
if(!dojo.isIE && (event == "mouseenter" || event == "mouseleave")){
|
||||
event = (event == "mouseenter") ? "mouseover" : "mouseout";
|
||||
}
|
||||
|
||||
node.removeEventListener(event, handle, false);
|
||||
}
|
||||
},
|
||||
_normalizeEventName: function(/*String*/ name){
|
||||
// Generally, name should be lower case, unless it is special
|
||||
// somehow (e.g. a Mozilla DOM event).
|
||||
// Remove 'on'.
|
||||
return name.slice(0,2) =="on" ? name.slice(2) : name;
|
||||
},
|
||||
_fixCallback: function(/*String*/ name, fp){
|
||||
// By default, we only invoke _fixEvent for 'keypress'
|
||||
// If code is added to _fixEvent for other events, we have
|
||||
// to revisit this optimization.
|
||||
// This also applies to _fixEvent overrides for Safari and Opera
|
||||
// below.
|
||||
return name != "keypress" ? fp : function(e){ return fp.call(this, del._fixEvent(e, this)); };
|
||||
},
|
||||
_fixEvent: function(evt, sender){
|
||||
// _fixCallback only attaches us to keypress.
|
||||
// Switch on evt.type anyway because we might
|
||||
// be called directly from dojo.fixEvent.
|
||||
switch(evt.type){
|
||||
case "keypress":
|
||||
del._setKeyChar(evt);
|
||||
break;
|
||||
}
|
||||
return evt;
|
||||
},
|
||||
_setKeyChar: function(evt){
|
||||
evt.keyChar = evt.charCode >= 32 ? String.fromCharCode(evt.charCode) : '';
|
||||
evt.charOrCode = evt.keyChar || evt.keyCode;
|
||||
},
|
||||
// For IE and Safari: some ctrl-key combinations (mostly w/punctuation) do not emit a char code in IE
|
||||
// we map those virtual key codes to ascii here
|
||||
// not valid for all (non-US) keyboards, so maybe we shouldn't bother
|
||||
_punctMap: {
|
||||
106:42,
|
||||
111:47,
|
||||
186:59,
|
||||
187:43,
|
||||
188:44,
|
||||
189:45,
|
||||
190:46,
|
||||
191:47,
|
||||
192:96,
|
||||
219:91,
|
||||
220:92,
|
||||
221:93,
|
||||
222:39
|
||||
}
|
||||
});
|
||||
|
||||
// DOM events
|
||||
|
||||
dojo.fixEvent = function(/*Event*/ evt, /*DOMNode*/ sender){
|
||||
// summary:
|
||||
// normalizes properties on the event object including event
|
||||
// bubbling methods, keystroke normalization, and x/y positions
|
||||
// evt: Event
|
||||
// native event object
|
||||
// sender: DOMNode
|
||||
// node to treat as "currentTarget"
|
||||
return del._fixEvent(evt, sender);
|
||||
};
|
||||
|
||||
dojo.stopEvent = function(/*Event*/ evt){
|
||||
// summary:
|
||||
// prevents propagation and clobbers the default action of the
|
||||
// passed event
|
||||
// evt: Event
|
||||
// The event object. If omitted, window.event is used on IE.
|
||||
evt.preventDefault();
|
||||
evt.stopPropagation();
|
||||
// NOTE: below, this method is overridden for IE
|
||||
};
|
||||
|
||||
// the default listener to use on dontFix nodes, overriden for IE
|
||||
var node_listener = dojo._listener;
|
||||
|
||||
// Unify connect and event listeners
|
||||
dojo._connect = function(obj, event, context, method, dontFix){
|
||||
// FIXME: need a more strict test
|
||||
var isNode = obj && (obj.nodeType||obj.attachEvent||obj.addEventListener);
|
||||
// choose one of three listener options: raw (connect.js), DOM event on a Node, custom event on a Node
|
||||
// we need the third option to provide leak prevention on broken browsers (IE)
|
||||
var lid = isNode ? (dontFix ? 2 : 1) : 0, l = [dojo._listener, del, node_listener][lid];
|
||||
// create a listener
|
||||
var h = l.add(obj, event, dojo.hitch(context, method));
|
||||
// formerly, the disconnect package contained "l" directly, but if client code
|
||||
// leaks the disconnect package (by connecting it to a node), referencing "l"
|
||||
// compounds the problem.
|
||||
// instead we return a listener id, which requires custom _disconnect below.
|
||||
// return disconnect package
|
||||
return [ obj, event, h, lid ];
|
||||
};
|
||||
|
||||
dojo._disconnect = function(obj, event, handle, listener){
|
||||
([dojo._listener, del, node_listener][listener]).remove(obj, event, handle);
|
||||
};
|
||||
|
||||
// Constants
|
||||
|
||||
// Public: client code should test
|
||||
// keyCode against these named constants, as the
|
||||
// actual codes can vary by browser.
|
||||
dojo.keys = {
|
||||
// summary:
|
||||
// Definitions for common key values
|
||||
BACKSPACE: 8,
|
||||
TAB: 9,
|
||||
CLEAR: 12,
|
||||
ENTER: 13,
|
||||
SHIFT: 16,
|
||||
CTRL: 17,
|
||||
ALT: 18,
|
||||
META: dojo.isSafari ? 91 : 224, // the apple key on macs
|
||||
PAUSE: 19,
|
||||
CAPS_LOCK: 20,
|
||||
ESCAPE: 27,
|
||||
SPACE: 32,
|
||||
PAGE_UP: 33,
|
||||
PAGE_DOWN: 34,
|
||||
END: 35,
|
||||
HOME: 36,
|
||||
LEFT_ARROW: 37,
|
||||
UP_ARROW: 38,
|
||||
RIGHT_ARROW: 39,
|
||||
DOWN_ARROW: 40,
|
||||
INSERT: 45,
|
||||
DELETE: 46,
|
||||
HELP: 47,
|
||||
LEFT_WINDOW: 91,
|
||||
RIGHT_WINDOW: 92,
|
||||
SELECT: 93,
|
||||
NUMPAD_0: 96,
|
||||
NUMPAD_1: 97,
|
||||
NUMPAD_2: 98,
|
||||
NUMPAD_3: 99,
|
||||
NUMPAD_4: 100,
|
||||
NUMPAD_5: 101,
|
||||
NUMPAD_6: 102,
|
||||
NUMPAD_7: 103,
|
||||
NUMPAD_8: 104,
|
||||
NUMPAD_9: 105,
|
||||
NUMPAD_MULTIPLY: 106,
|
||||
NUMPAD_PLUS: 107,
|
||||
NUMPAD_ENTER: 108,
|
||||
NUMPAD_MINUS: 109,
|
||||
NUMPAD_PERIOD: 110,
|
||||
NUMPAD_DIVIDE: 111,
|
||||
F1: 112,
|
||||
F2: 113,
|
||||
F3: 114,
|
||||
F4: 115,
|
||||
F5: 116,
|
||||
F6: 117,
|
||||
F7: 118,
|
||||
F8: 119,
|
||||
F9: 120,
|
||||
F10: 121,
|
||||
F11: 122,
|
||||
F12: 123,
|
||||
F13: 124,
|
||||
F14: 125,
|
||||
F15: 126,
|
||||
NUM_LOCK: 144,
|
||||
SCROLL_LOCK: 145,
|
||||
// virtual key mapping
|
||||
copyKey: dojo.isMac && !dojo.isAIR ? (dojo.isSafari ? 91 : 224 ) : 17
|
||||
};
|
||||
|
||||
var evtCopyKey = dojo.isMac ? "metaKey" : "ctrlKey";
|
||||
|
||||
dojo.isCopyKey = function(e){
|
||||
// summary:
|
||||
// Checks an event for the copy key (meta on Mac, and ctrl anywhere else)
|
||||
// e: Event
|
||||
// Event object to examine
|
||||
return e[evtCopyKey]; // Boolean
|
||||
};
|
||||
|
||||
// Public: decoding mouse buttons from events
|
||||
|
||||
/*=====
|
||||
dojo.mouseButtons = {
|
||||
// LEFT: Number
|
||||
// Numeric value of the left mouse button for the platform.
|
||||
LEFT: 0,
|
||||
// MIDDLE: Number
|
||||
// Numeric value of the middle mouse button for the platform.
|
||||
MIDDLE: 1,
|
||||
// RIGHT: Number
|
||||
// Numeric value of the right mouse button for the platform.
|
||||
RIGHT: 2,
|
||||
|
||||
isButton: function(e, button){
|
||||
// summary:
|
||||
// Checks an event object for a pressed button
|
||||
// e: Event
|
||||
// Event object to examine
|
||||
// button: Number
|
||||
// The button value (example: dojo.mouseButton.LEFT)
|
||||
return e.button == button; // Boolean
|
||||
},
|
||||
isLeft: function(e){
|
||||
// summary:
|
||||
// Checks an event object for the pressed left button
|
||||
// e: Event
|
||||
// Event object to examine
|
||||
return e.button == 0; // Boolean
|
||||
},
|
||||
isMiddle: function(e){
|
||||
// summary:
|
||||
// Checks an event object for the pressed middle button
|
||||
// e: Event
|
||||
// Event object to examine
|
||||
return e.button == 1; // Boolean
|
||||
},
|
||||
isRight: function(e){
|
||||
// summary:
|
||||
// Checks an event object for the pressed right button
|
||||
// e: Event
|
||||
// Event object to examine
|
||||
return e.button == 2; // Boolean
|
||||
}
|
||||
};
|
||||
=====*/
|
||||
|
||||
if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){
|
||||
dojo.mouseButtons = {
|
||||
LEFT: 1,
|
||||
MIDDLE: 4,
|
||||
RIGHT: 2,
|
||||
// helper functions
|
||||
isButton: function(e, button){ return e.button & button; },
|
||||
isLeft: function(e){ return e.button & 1; },
|
||||
isMiddle: function(e){ return e.button & 4; },
|
||||
isRight: function(e){ return e.button & 2; }
|
||||
};
|
||||
}else{
|
||||
dojo.mouseButtons = {
|
||||
LEFT: 0,
|
||||
MIDDLE: 1,
|
||||
RIGHT: 2,
|
||||
// helper functions
|
||||
isButton: function(e, button){ return e.button == button; },
|
||||
isLeft: function(e){ return e.button == 0; },
|
||||
isMiddle: function(e){ return e.button == 1; },
|
||||
isRight: function(e){ return e.button == 2; }
|
||||
};
|
||||
}
|
||||
|
||||
// IE event normalization
|
||||
if(dojo.isIE){
|
||||
var _trySetKeyCode = function(e, code){
|
||||
try{
|
||||
// squelch errors when keyCode is read-only
|
||||
// (e.g. if keyCode is ctrl or shift)
|
||||
return (e.keyCode = code);
|
||||
}catch(e){
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
// by default, use the standard listener
|
||||
var iel = dojo._listener;
|
||||
var listenersName = (dojo._ieListenersName = "_" + dojo._scopeName + "_listeners");
|
||||
// dispatcher tracking property
|
||||
if(!dojo.config._allow_leaks){
|
||||
// custom listener that handles leak protection for DOM events
|
||||
node_listener = iel = dojo._ie_listener = {
|
||||
// support handler indirection: event handler functions are
|
||||
// referenced here. Event dispatchers hold only indices.
|
||||
handlers: [],
|
||||
// add a listener to an object
|
||||
add: function(/*Object*/ source, /*String*/ method, /*Function*/ listener){
|
||||
source = source || dojo.global;
|
||||
var f = source[method];
|
||||
if(!f||!f[listenersName]){
|
||||
var d = dojo._getIeDispatcher();
|
||||
// original target function is special
|
||||
d.target = f && (ieh.push(f) - 1);
|
||||
// dispatcher holds a list of indices into handlers table
|
||||
d[listenersName] = [];
|
||||
// redirect source to dispatcher
|
||||
f = source[method] = d;
|
||||
}
|
||||
return f[listenersName].push(ieh.push(listener) - 1) ; /*Handle*/
|
||||
},
|
||||
// remove a listener from an object
|
||||
remove: function(/*Object*/ source, /*String*/ method, /*Handle*/ handle){
|
||||
var f = (source||dojo.global)[method], l = f && f[listenersName];
|
||||
if(f && l && handle--){
|
||||
delete ieh[l[handle]];
|
||||
delete l[handle];
|
||||
}
|
||||
}
|
||||
};
|
||||
// alias used above
|
||||
var ieh = iel.handlers;
|
||||
}
|
||||
|
||||
dojo.mixin(del, {
|
||||
add: function(/*DOMNode*/ node, /*String*/ event, /*Function*/ fp){
|
||||
if(!node){return;} // undefined
|
||||
event = del._normalizeEventName(event);
|
||||
if(event=="onkeypress"){
|
||||
// we need to listen to onkeydown to synthesize
|
||||
// keypress events that otherwise won't fire
|
||||
// on IE
|
||||
var kd = node.onkeydown;
|
||||
if(!kd || !kd[listenersName] || !kd._stealthKeydownHandle){
|
||||
var h = del.add(node, "onkeydown", del._stealthKeyDown);
|
||||
kd = node.onkeydown;
|
||||
kd._stealthKeydownHandle = h;
|
||||
kd._stealthKeydownRefs = 1;
|
||||
}else{
|
||||
kd._stealthKeydownRefs++;
|
||||
}
|
||||
}
|
||||
return iel.add(node, event, del._fixCallback(fp));
|
||||
},
|
||||
remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
|
||||
event = del._normalizeEventName(event);
|
||||
iel.remove(node, event, handle);
|
||||
if(event=="onkeypress"){
|
||||
var kd = node.onkeydown;
|
||||
if(--kd._stealthKeydownRefs <= 0){
|
||||
iel.remove(node, "onkeydown", kd._stealthKeydownHandle);
|
||||
delete kd._stealthKeydownHandle;
|
||||
}
|
||||
}
|
||||
},
|
||||
_normalizeEventName: function(/*String*/ eventName){
|
||||
// Generally, eventName should be lower case, unless it is
|
||||
// special somehow (e.g. a Mozilla event)
|
||||
// ensure 'on'
|
||||
return eventName.slice(0,2) != "on" ? "on" + eventName : eventName;
|
||||
},
|
||||
_nop: function(){},
|
||||
_fixEvent: function(/*Event*/ evt, /*DOMNode*/ sender){
|
||||
// summary:
|
||||
// normalizes properties on the event object including event
|
||||
// bubbling methods, keystroke normalization, and x/y positions
|
||||
// evt:
|
||||
// native event object
|
||||
// sender:
|
||||
// node to treat as "currentTarget"
|
||||
if(!evt){
|
||||
var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window;
|
||||
evt = w.event;
|
||||
}
|
||||
if(!evt){return(evt);}
|
||||
evt.target = evt.srcElement;
|
||||
evt.currentTarget = (sender || evt.srcElement);
|
||||
evt.layerX = evt.offsetX;
|
||||
evt.layerY = evt.offsetY;
|
||||
// FIXME: scroll position query is duped from dojo.html to
|
||||
// avoid dependency on that entire module. Now that HTML is in
|
||||
// Base, we should convert back to something similar there.
|
||||
var se = evt.srcElement, doc = (se && se.ownerDocument) || document;
|
||||
// DO NOT replace the following to use dojo.body(), in IE, document.documentElement should be used
|
||||
// here rather than document.body
|
||||
var docBody = ((dojo.isIE < 6) || (doc["compatMode"] == "BackCompat")) ? doc.body : doc.documentElement;
|
||||
var offset = dojo._getIeDocumentElementOffset();
|
||||
evt.pageX = evt.clientX + dojo._fixIeBiDiScrollLeft(docBody.scrollLeft || 0) - offset.x;
|
||||
evt.pageY = evt.clientY + (docBody.scrollTop || 0) - offset.y;
|
||||
if(evt.type == "mouseover"){
|
||||
evt.relatedTarget = evt.fromElement;
|
||||
}
|
||||
if(evt.type == "mouseout"){
|
||||
evt.relatedTarget = evt.toElement;
|
||||
}
|
||||
if (dojo.isIE < 9 || dojo.isQuirks) {
|
||||
evt.stopPropagation = del._stopPropagation;
|
||||
evt.preventDefault = del._preventDefault;
|
||||
}
|
||||
return del._fixKeys(evt);
|
||||
},
|
||||
_fixKeys: function(evt){
|
||||
switch(evt.type){
|
||||
case "keypress":
|
||||
var c = ("charCode" in evt ? evt.charCode : evt.keyCode);
|
||||
if (c==10){
|
||||
// CTRL-ENTER is CTRL-ASCII(10) on IE, but CTRL-ENTER on Mozilla
|
||||
c=0;
|
||||
evt.keyCode = 13;
|
||||
}else if(c==13||c==27){
|
||||
c=0; // Mozilla considers ENTER and ESC non-printable
|
||||
}else if(c==3){
|
||||
c=99; // Mozilla maps CTRL-BREAK to CTRL-c
|
||||
}
|
||||
// Mozilla sets keyCode to 0 when there is a charCode
|
||||
// but that stops the event on IE.
|
||||
evt.charCode = c;
|
||||
del._setKeyChar(evt);
|
||||
break;
|
||||
}
|
||||
return evt;
|
||||
},
|
||||
_stealthKeyDown: function(evt){
|
||||
// IE doesn't fire keypress for most non-printable characters.
|
||||
// other browsers do, we simulate it here.
|
||||
var kp = evt.currentTarget.onkeypress;
|
||||
// only works if kp exists and is a dispatcher
|
||||
if(!kp || !kp[listenersName]){ return; }
|
||||
// munge key/charCode
|
||||
var k=evt.keyCode;
|
||||
// These are Windows Virtual Key Codes
|
||||
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp
|
||||
var unprintable = (k!=13 || (dojo.isIE >= 9 && !dojo.isQuirks)) && k!=32 && k!=27 && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222);
|
||||
|
||||
// synthesize keypress for most unprintables and CTRL-keys
|
||||
if(unprintable||evt.ctrlKey){
|
||||
var c = unprintable ? 0 : k;
|
||||
if(evt.ctrlKey){
|
||||
if(k==3 || k==13){
|
||||
return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively
|
||||
}else if(c>95 && c<106){
|
||||
c -= 48; // map CTRL-[numpad 0-9] to ASCII
|
||||
}else if((!evt.shiftKey)&&(c>=65&&c<=90)){
|
||||
c += 32; // map CTRL-[A-Z] to lowercase
|
||||
}else{
|
||||
c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII
|
||||
}
|
||||
}
|
||||
// simulate a keypress event
|
||||
var faux = del._synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c});
|
||||
kp.call(evt.currentTarget, faux);
|
||||
if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){
|
||||
evt.cancelBubble = faux.cancelBubble;
|
||||
}
|
||||
evt.returnValue = faux.returnValue;
|
||||
_trySetKeyCode(evt, faux.keyCode);
|
||||
}
|
||||
},
|
||||
// Called in Event scope
|
||||
_stopPropagation: function(){
|
||||
this.cancelBubble = true;
|
||||
},
|
||||
_preventDefault: function(){
|
||||
// Setting keyCode to 0 is the only way to prevent certain keypresses (namely
|
||||
// ctrl-combinations that correspond to menu accelerator keys).
|
||||
// Otoh, it prevents upstream listeners from getting this information
|
||||
// Try to split the difference here by clobbering keyCode only for ctrl
|
||||
// combinations. If you still need to access the key upstream, bubbledKeyCode is
|
||||
// provided as a workaround.
|
||||
this.bubbledKeyCode = this.keyCode;
|
||||
if(this.ctrlKey){_trySetKeyCode(this, 0);}
|
||||
this.returnValue = false;
|
||||
}
|
||||
});
|
||||
|
||||
// override stopEvent for IE
|
||||
dojo.stopEvent = (dojo.isIE < 9 || dojo.isQuirks) ? function(evt){
|
||||
evt = evt || window.event;
|
||||
del._stopPropagation.call(evt);
|
||||
del._preventDefault.call(evt);
|
||||
} : dojo.stopEvent;
|
||||
}
|
||||
|
||||
del._synthesizeEvent = function(evt, props){
|
||||
var faux = dojo.mixin({}, evt, props);
|
||||
del._setKeyChar(faux);
|
||||
// FIXME: would prefer to use dojo.hitch: dojo.hitch(evt, evt.preventDefault);
|
||||
// but it throws an error when preventDefault is invoked on Safari
|
||||
// does Event.preventDefault not support "apply" on Safari?
|
||||
faux.preventDefault = function(){ evt.preventDefault(); };
|
||||
faux.stopPropagation = function(){ evt.stopPropagation(); };
|
||||
return faux;
|
||||
};
|
||||
|
||||
// Opera event normalization
|
||||
if(dojo.isOpera){
|
||||
dojo.mixin(del, {
|
||||
_fixEvent: function(evt, sender){
|
||||
switch(evt.type){
|
||||
case "keypress":
|
||||
var c = evt.which;
|
||||
if(c==3){
|
||||
c=99; // Mozilla maps CTRL-BREAK to CTRL-c
|
||||
}
|
||||
// can't trap some keys at all, like INSERT and DELETE
|
||||
// there is no differentiating info between DELETE and ".", or INSERT and "-"
|
||||
c = c<41 && !evt.shiftKey ? 0 : c;
|
||||
if(evt.ctrlKey && !evt.shiftKey && c>=65 && c<=90){
|
||||
// lowercase CTRL-[A-Z] keys
|
||||
c += 32;
|
||||
}
|
||||
return del._synthesizeEvent(evt, { charCode: c });
|
||||
}
|
||||
return evt;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Webkit event normalization
|
||||
if(dojo.isWebKit){
|
||||
del._add = del.add;
|
||||
del._remove = del.remove;
|
||||
|
||||
dojo.mixin(del, {
|
||||
add: function(/*DOMNode*/ node, /*String*/ event, /*Function*/ fp){
|
||||
if(!node){return;} // undefined
|
||||
var handle = del._add(node, event, fp);
|
||||
if(del._normalizeEventName(event) == "keypress"){
|
||||
// we need to listen to onkeydown to synthesize
|
||||
// keypress events that otherwise won't fire
|
||||
// in Safari 3.1+: https://lists.webkit.org/pipermail/webkit-dev/2007-December/002992.html
|
||||
handle._stealthKeyDownHandle = del._add(node, "keydown", function(evt){
|
||||
//A variation on the IE _stealthKeydown function
|
||||
//Synthesize an onkeypress event, but only for unprintable characters.
|
||||
var k=evt.keyCode;
|
||||
// These are Windows Virtual Key Codes
|
||||
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp
|
||||
var unprintable = k!=13 && k!=32 && (k<48 || k>90) && (k<96 || k>111) && (k<186 || k>192) && (k<219 || k>222);
|
||||
// synthesize keypress for most unprintables and CTRL-keys
|
||||
if(unprintable || evt.ctrlKey){
|
||||
var c = unprintable ? 0 : k;
|
||||
if(evt.ctrlKey){
|
||||
if(k==3 || k==13){
|
||||
return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively
|
||||
}else if(c>95 && c<106){
|
||||
c -= 48; // map CTRL-[numpad 0-9] to ASCII
|
||||
}else if(!evt.shiftKey && c>=65 && c<=90){
|
||||
c += 32; // map CTRL-[A-Z] to lowercase
|
||||
}else{
|
||||
c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII
|
||||
}
|
||||
}
|
||||
// simulate a keypress event
|
||||
var faux = del._synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c});
|
||||
fp.call(evt.currentTarget, faux);
|
||||
}
|
||||
});
|
||||
}
|
||||
return handle; /*Handle*/
|
||||
},
|
||||
|
||||
remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
|
||||
if(node){
|
||||
if(handle._stealthKeyDownHandle){
|
||||
del._remove(node, "keydown", handle._stealthKeyDownHandle);
|
||||
}
|
||||
del._remove(node, event, handle);
|
||||
}
|
||||
},
|
||||
_fixEvent: function(evt, sender){
|
||||
switch(evt.type){
|
||||
case "keypress":
|
||||
if(evt.faux){ return evt; }
|
||||
var c = evt.charCode;
|
||||
c = c>=32 ? c : 0;
|
||||
return del._synthesizeEvent(evt, {charCode: c, faux: true});
|
||||
}
|
||||
return evt;
|
||||
}
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
||||
if(dojo.isIE){
|
||||
// keep this out of the closure
|
||||
// closing over 'iel' or 'ieh' b0rks leak prevention
|
||||
// ls[i] is an index into the master handler array
|
||||
dojo._ieDispatcher = function(args, sender){
|
||||
var ap = Array.prototype,
|
||||
h = dojo._ie_listener.handlers,
|
||||
c = args.callee,
|
||||
ls = c[dojo._ieListenersName],
|
||||
t = h[c.target];
|
||||
// return value comes from original target function
|
||||
var r = t && t.apply(sender, args);
|
||||
// make local copy of listener array so it's immutable during processing
|
||||
var lls = [].concat(ls);
|
||||
// invoke listeners after target function
|
||||
for(var i in lls){
|
||||
var f = h[lls[i]];
|
||||
if(!(i in ap) && f){
|
||||
f.apply(sender, args);
|
||||
}
|
||||
}
|
||||
return r;
|
||||
};
|
||||
dojo._getIeDispatcher = function(){
|
||||
// ensure the returned function closes over nothing ("new Function" apparently doesn't close)
|
||||
return new Function(dojo._scopeName + "._ieDispatcher(arguments, this)"); // function
|
||||
};
|
||||
// keep this out of the closure to reduce RAM allocation
|
||||
dojo._event_listener._fixCallback = function(fp){
|
||||
var f = dojo._event_listener._fixEvent;
|
||||
return function(e){ return fp.call(this, f(e, this)); };
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/_base/event",["./kernel","../on","../has","../dom-geometry"],function(_1,on,_2,_3){if(on._fixEvent){var _4=on._fixEvent;on._fixEvent=function(_5,se){_5=_4(_5,se);if(_5){_3.normalizeEvent(_5);}return _5;};}_1.fixEvent=function(_6,_7){if(on._fixEvent){return on._fixEvent(_6,_7);}return _6;};_1.stopEvent=function(_8){if(_2("dom-addeventlistener")||(_8&&_8.preventDefault)){_8.preventDefault();_8.stopPropagation();}else{_8=_8||window.event;_8.cancelBubble=true;on._preventDefault.call(_8);}};return {fix:_1.fixEvent,stop:_1.stopEvent};});
|
||||
51
lib/dojo/_base/event.js.uncompressed.js
Normal file
51
lib/dojo/_base/event.js.uncompressed.js
Normal file
@@ -0,0 +1,51 @@
|
||||
define("dojo/_base/event", ["./kernel", "../on", "../has", "../dom-geometry"], function(dojo, on, has, dom){
|
||||
// module:
|
||||
// dojo/_base/event
|
||||
// summary:
|
||||
// This module defines dojo DOM event API.
|
||||
if(on._fixEvent){
|
||||
var fixEvent = on._fixEvent;
|
||||
on._fixEvent = function(evt, se){
|
||||
// add some additional normalization for back-compat, this isn't in on.js because it is somewhat more expensive
|
||||
evt = fixEvent(evt, se);
|
||||
if(evt){
|
||||
dom.normalizeEvent(evt);
|
||||
}
|
||||
return evt;
|
||||
};
|
||||
}
|
||||
dojo.fixEvent = function(/*Event*/ evt, /*DOMNode*/ sender){
|
||||
// summary:
|
||||
// normalizes properties on the event object including event
|
||||
// bubbling methods, keystroke normalization, and x/y positions
|
||||
// evt: Event
|
||||
// native event object
|
||||
// sender: DOMNode
|
||||
// node to treat as "currentTarget"
|
||||
if(on._fixEvent){
|
||||
return on._fixEvent(evt, sender);
|
||||
}
|
||||
return evt; // Event
|
||||
};
|
||||
|
||||
dojo.stopEvent = function(/*Event*/ evt){
|
||||
// summary:
|
||||
// prevents propagation and clobbers the default action of the
|
||||
// passed event
|
||||
// evt: Event
|
||||
// The event object. If omitted, window.event is used on IE.
|
||||
if(has("dom-addeventlistener") || (evt && evt.preventDefault)){
|
||||
evt.preventDefault();
|
||||
evt.stopPropagation();
|
||||
}else{
|
||||
evt = evt || window.event;
|
||||
evt.cancelBubble = true;
|
||||
on._preventDefault.call(evt);
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
fix: dojo.fixEvent,
|
||||
stop: dojo.stopEvent
|
||||
};
|
||||
});
|
||||
File diff suppressed because one or more lines are too long
666
lib/dojo/_base/fx.js.uncompressed.js
Normal file
666
lib/dojo/_base/fx.js.uncompressed.js
Normal file
@@ -0,0 +1,666 @@
|
||||
define("dojo/_base/fx", ["./kernel", "./lang", "../Evented", "./Color", "./connect", "./sniff", "../dom", "../dom-style"], function(dojo, lang, Evented, Color, connect, has, dom, style){
|
||||
// module:
|
||||
// dojo/_base/fx
|
||||
// summary:
|
||||
// This module defines the base dojo.fx implementation.
|
||||
// notes:
|
||||
// Animation loosely package based on Dan Pupius' work, contributed under CLA; see
|
||||
// http://pupius.co.uk/js/Toolkit.Drawing.js
|
||||
|
||||
var _mixin = lang.mixin;
|
||||
|
||||
dojo._Line = function(/*int*/ start, /*int*/ end){
|
||||
// summary:
|
||||
// dojo._Line is the object used to generate values from a start value
|
||||
// to an end value
|
||||
// start: int
|
||||
// Beginning value for range
|
||||
// end: int
|
||||
// Ending value for range
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
};
|
||||
|
||||
dojo._Line.prototype.getValue = function(/*float*/ n){
|
||||
// summary: Returns the point on the line
|
||||
// n: a floating point number greater than 0 and less than 1
|
||||
return ((this.end - this.start) * n) + this.start; // Decimal
|
||||
};
|
||||
|
||||
dojo.Animation = function(args){
|
||||
// summary:
|
||||
// A generic animation class that fires callbacks into its handlers
|
||||
// object at various states.
|
||||
// description:
|
||||
// A generic animation class that fires callbacks into its handlers
|
||||
// object at various states. Nearly all dojo animation functions
|
||||
// return an instance of this method, usually without calling the
|
||||
// .play() method beforehand. Therefore, you will likely need to
|
||||
// call .play() on instances of `dojo.Animation` when one is
|
||||
// returned.
|
||||
// args: Object
|
||||
// The 'magic argument', mixing all the properties into this
|
||||
// animation instance.
|
||||
|
||||
_mixin(this, args);
|
||||
if(lang.isArray(this.curve)){
|
||||
this.curve = new dojo._Line(this.curve[0], this.curve[1]);
|
||||
}
|
||||
|
||||
};
|
||||
dojo.Animation.prototype = new Evented();
|
||||
// Alias to drop come 2.0:
|
||||
dojo._Animation = dojo.Animation;
|
||||
|
||||
lang.extend(dojo.Animation, {
|
||||
// duration: Integer
|
||||
// The time in milliseonds the animation will take to run
|
||||
duration: 350,
|
||||
|
||||
/*=====
|
||||
// curve: dojo._Line|Array
|
||||
// A two element array of start and end values, or a `dojo._Line` instance to be
|
||||
// used in the Animation.
|
||||
curve: null,
|
||||
|
||||
// easing: Function?
|
||||
// A Function to adjust the acceleration (or deceleration) of the progress
|
||||
// across a dojo._Line
|
||||
easing: null,
|
||||
=====*/
|
||||
|
||||
// repeat: Integer?
|
||||
// The number of times to loop the animation
|
||||
repeat: 0,
|
||||
|
||||
// rate: Integer?
|
||||
// the time in milliseconds to wait before advancing to next frame
|
||||
// (used as a fps timer: 1000/rate = fps)
|
||||
rate: 20 /* 50 fps */,
|
||||
|
||||
/*=====
|
||||
// delay: Integer?
|
||||
// The time in milliseconds to wait before starting animation after it
|
||||
// has been .play()'ed
|
||||
delay: null,
|
||||
|
||||
// beforeBegin: Event?
|
||||
// Synthetic event fired before a dojo.Animation begins playing (synchronous)
|
||||
beforeBegin: null,
|
||||
|
||||
// onBegin: Event?
|
||||
// Synthetic event fired as a dojo.Animation begins playing (useful?)
|
||||
onBegin: null,
|
||||
|
||||
// onAnimate: Event?
|
||||
// Synthetic event fired at each interval of a `dojo.Animation`
|
||||
onAnimate: null,
|
||||
|
||||
// onEnd: Event?
|
||||
// Synthetic event fired after the final frame of a `dojo.Animation`
|
||||
onEnd: null,
|
||||
|
||||
// onPlay: Event?
|
||||
// Synthetic event fired any time a `dojo.Animation` is play()'ed
|
||||
onPlay: null,
|
||||
|
||||
// onPause: Event?
|
||||
// Synthetic event fired when a `dojo.Animation` is paused
|
||||
onPause: null,
|
||||
|
||||
// onStop: Event
|
||||
// Synthetic event fires when a `dojo.Animation` is stopped
|
||||
onStop: null,
|
||||
|
||||
=====*/
|
||||
|
||||
_percent: 0,
|
||||
_startRepeatCount: 0,
|
||||
|
||||
_getStep: function(){
|
||||
var _p = this._percent,
|
||||
_e = this.easing
|
||||
;
|
||||
return _e ? _e(_p) : _p;
|
||||
},
|
||||
_fire: function(/*Event*/ evt, /*Array?*/ args){
|
||||
// summary:
|
||||
// Convenience function. Fire event "evt" and pass it the
|
||||
// arguments specified in "args".
|
||||
// description:
|
||||
// Convenience function. Fire event "evt" and pass it the
|
||||
// arguments specified in "args".
|
||||
// Fires the callback in the scope of the `dojo.Animation`
|
||||
// instance.
|
||||
// evt:
|
||||
// The event to fire.
|
||||
// args:
|
||||
// The arguments to pass to the event.
|
||||
var a = args||[];
|
||||
if(this[evt]){
|
||||
if(dojo.config.debugAtAllCosts){
|
||||
this[evt].apply(this, a);
|
||||
}else{
|
||||
try{
|
||||
this[evt].apply(this, a);
|
||||
}catch(e){
|
||||
// squelch and log because we shouldn't allow exceptions in
|
||||
// synthetic event handlers to cause the internal timer to run
|
||||
// amuck, potentially pegging the CPU. I'm not a fan of this
|
||||
// squelch, but hopefully logging will make it clear what's
|
||||
// going on
|
||||
console.error("exception in animation handler for:", evt);
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
return this; // dojo.Animation
|
||||
},
|
||||
|
||||
play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
|
||||
// summary:
|
||||
// Start the animation.
|
||||
// delay:
|
||||
// How many milliseconds to delay before starting.
|
||||
// gotoStart:
|
||||
// If true, starts the animation from the beginning; otherwise,
|
||||
// starts it from its current position.
|
||||
// returns: dojo.Animation
|
||||
// The instance to allow chaining.
|
||||
|
||||
var _t = this;
|
||||
if(_t._delayTimer){ _t._clearTimer(); }
|
||||
if(gotoStart){
|
||||
_t._stopTimer();
|
||||
_t._active = _t._paused = false;
|
||||
_t._percent = 0;
|
||||
}else if(_t._active && !_t._paused){
|
||||
return _t;
|
||||
}
|
||||
|
||||
_t._fire("beforeBegin", [_t.node]);
|
||||
|
||||
var de = delay || _t.delay,
|
||||
_p = lang.hitch(_t, "_play", gotoStart);
|
||||
|
||||
if(de > 0){
|
||||
_t._delayTimer = setTimeout(_p, de);
|
||||
return _t;
|
||||
}
|
||||
_p();
|
||||
return _t; // dojo.Animation
|
||||
},
|
||||
|
||||
_play: function(gotoStart){
|
||||
var _t = this;
|
||||
if(_t._delayTimer){ _t._clearTimer(); }
|
||||
_t._startTime = new Date().valueOf();
|
||||
if(_t._paused){
|
||||
_t._startTime -= _t.duration * _t._percent;
|
||||
}
|
||||
|
||||
_t._active = true;
|
||||
_t._paused = false;
|
||||
var value = _t.curve.getValue(_t._getStep());
|
||||
if(!_t._percent){
|
||||
if(!_t._startRepeatCount){
|
||||
_t._startRepeatCount = _t.repeat;
|
||||
}
|
||||
_t._fire("onBegin", [value]);
|
||||
}
|
||||
|
||||
_t._fire("onPlay", [value]);
|
||||
|
||||
_t._cycle();
|
||||
return _t; // dojo.Animation
|
||||
},
|
||||
|
||||
pause: function(){
|
||||
// summary: Pauses a running animation.
|
||||
var _t = this;
|
||||
if(_t._delayTimer){ _t._clearTimer(); }
|
||||
_t._stopTimer();
|
||||
if(!_t._active){ return _t; /*dojo.Animation*/ }
|
||||
_t._paused = true;
|
||||
_t._fire("onPause", [_t.curve.getValue(_t._getStep())]);
|
||||
return _t; // dojo.Animation
|
||||
},
|
||||
|
||||
gotoPercent: function(/*Decimal*/ percent, /*Boolean?*/ andPlay){
|
||||
// summary:
|
||||
// Sets the progress of the animation.
|
||||
// percent:
|
||||
// A percentage in decimal notation (between and including 0.0 and 1.0).
|
||||
// andPlay:
|
||||
// If true, play the animation after setting the progress.
|
||||
var _t = this;
|
||||
_t._stopTimer();
|
||||
_t._active = _t._paused = true;
|
||||
_t._percent = percent;
|
||||
if(andPlay){ _t.play(); }
|
||||
return _t; // dojo.Animation
|
||||
},
|
||||
|
||||
stop: function(/*boolean?*/ gotoEnd){
|
||||
// summary: Stops a running animation.
|
||||
// gotoEnd: If true, the animation will end.
|
||||
var _t = this;
|
||||
if(_t._delayTimer){ _t._clearTimer(); }
|
||||
if(!_t._timer){ return _t; /* dojo.Animation */ }
|
||||
_t._stopTimer();
|
||||
if(gotoEnd){
|
||||
_t._percent = 1;
|
||||
}
|
||||
_t._fire("onStop", [_t.curve.getValue(_t._getStep())]);
|
||||
_t._active = _t._paused = false;
|
||||
return _t; // dojo.Animation
|
||||
},
|
||||
|
||||
status: function(){
|
||||
// summary:
|
||||
// Returns a string token representation of the status of
|
||||
// the animation, one of: "paused", "playing", "stopped"
|
||||
if(this._active){
|
||||
return this._paused ? "paused" : "playing"; // String
|
||||
}
|
||||
return "stopped"; // String
|
||||
},
|
||||
|
||||
_cycle: function(){
|
||||
var _t = this;
|
||||
if(_t._active){
|
||||
var curr = new Date().valueOf();
|
||||
var step = (curr - _t._startTime) / (_t.duration);
|
||||
|
||||
if(step >= 1){
|
||||
step = 1;
|
||||
}
|
||||
_t._percent = step;
|
||||
|
||||
// Perform easing
|
||||
if(_t.easing){
|
||||
step = _t.easing(step);
|
||||
}
|
||||
|
||||
_t._fire("onAnimate", [_t.curve.getValue(step)]);
|
||||
|
||||
if(_t._percent < 1){
|
||||
_t._startTimer();
|
||||
}else{
|
||||
_t._active = false;
|
||||
|
||||
if(_t.repeat > 0){
|
||||
_t.repeat--;
|
||||
_t.play(null, true);
|
||||
}else if(_t.repeat == -1){
|
||||
_t.play(null, true);
|
||||
}else{
|
||||
if(_t._startRepeatCount){
|
||||
_t.repeat = _t._startRepeatCount;
|
||||
_t._startRepeatCount = 0;
|
||||
}
|
||||
}
|
||||
_t._percent = 0;
|
||||
_t._fire("onEnd", [_t.node]);
|
||||
!_t.repeat && _t._stopTimer();
|
||||
}
|
||||
}
|
||||
return _t; // dojo.Animation
|
||||
},
|
||||
|
||||
_clearTimer: function(){
|
||||
// summary: Clear the play delay timer
|
||||
clearTimeout(this._delayTimer);
|
||||
delete this._delayTimer;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// the local timer, stubbed into all Animation instances
|
||||
var ctr = 0,
|
||||
timer = null,
|
||||
runner = {
|
||||
run: function(){}
|
||||
};
|
||||
|
||||
lang.extend(dojo.Animation, {
|
||||
|
||||
_startTimer: function(){
|
||||
if(!this._timer){
|
||||
this._timer = connect.connect(runner, "run", this, "_cycle");
|
||||
ctr++;
|
||||
}
|
||||
if(!timer){
|
||||
timer = setInterval(lang.hitch(runner, "run"), this.rate);
|
||||
}
|
||||
},
|
||||
|
||||
_stopTimer: function(){
|
||||
if(this._timer){
|
||||
connect.disconnect(this._timer);
|
||||
this._timer = null;
|
||||
ctr--;
|
||||
}
|
||||
if(ctr <= 0){
|
||||
clearInterval(timer);
|
||||
timer = null;
|
||||
ctr = 0;
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
var _makeFadeable =
|
||||
has("ie") ? function(node){
|
||||
// only set the zoom if the "tickle" value would be the same as the
|
||||
// default
|
||||
var ns = node.style;
|
||||
// don't set the width to auto if it didn't already cascade that way.
|
||||
// We don't want to f anyones designs
|
||||
if(!ns.width.length && style.get(node, "width") == "auto"){
|
||||
ns.width = "auto";
|
||||
}
|
||||
} :
|
||||
function(){};
|
||||
|
||||
dojo._fade = function(/*Object*/ args){
|
||||
// summary:
|
||||
// Returns an animation that will fade the node defined by
|
||||
// args.node from the start to end values passed (args.start
|
||||
// args.end) (end is mandatory, start is optional)
|
||||
|
||||
args.node = dom.byId(args.node);
|
||||
var fArgs = _mixin({ properties: {} }, args),
|
||||
props = (fArgs.properties.opacity = {});
|
||||
|
||||
props.start = !("start" in fArgs) ?
|
||||
function(){
|
||||
return +style.get(fArgs.node, "opacity")||0;
|
||||
} : fArgs.start;
|
||||
props.end = fArgs.end;
|
||||
|
||||
var anim = dojo.animateProperty(fArgs);
|
||||
connect.connect(anim, "beforeBegin", lang.partial(_makeFadeable, fArgs.node));
|
||||
|
||||
return anim; // dojo.Animation
|
||||
};
|
||||
|
||||
/*=====
|
||||
dojo.__FadeArgs = function(node, duration, easing){
|
||||
// node: DOMNode|String
|
||||
// The node referenced in the animation
|
||||
// duration: Integer?
|
||||
// Duration of the animation in milliseconds.
|
||||
// easing: Function?
|
||||
// An easing function.
|
||||
this.node = node;
|
||||
this.duration = duration;
|
||||
this.easing = easing;
|
||||
}
|
||||
=====*/
|
||||
|
||||
dojo.fadeIn = function(/*dojo.__FadeArgs*/ args){
|
||||
// summary:
|
||||
// Returns an animation that will fade node defined in 'args' from
|
||||
// its current opacity to fully opaque.
|
||||
return dojo._fade(_mixin({ end: 1 }, args)); // dojo.Animation
|
||||
};
|
||||
|
||||
dojo.fadeOut = function(/*dojo.__FadeArgs*/ args){
|
||||
// summary:
|
||||
// Returns an animation that will fade node defined in 'args'
|
||||
// from its current opacity to fully transparent.
|
||||
return dojo._fade(_mixin({ end: 0 }, args)); // dojo.Animation
|
||||
};
|
||||
|
||||
dojo._defaultEasing = function(/*Decimal?*/ n){
|
||||
// summary: The default easing function for dojo.Animation(s)
|
||||
return 0.5 + ((Math.sin((n + 1.5) * Math.PI)) / 2); // Decimal
|
||||
};
|
||||
|
||||
var PropLine = function(properties){
|
||||
// PropLine is an internal class which is used to model the values of
|
||||
// an a group of CSS properties across an animation lifecycle. In
|
||||
// particular, the "getValue" function handles getting interpolated
|
||||
// values between start and end for a particular CSS value.
|
||||
this._properties = properties;
|
||||
for(var p in properties){
|
||||
var prop = properties[p];
|
||||
if(prop.start instanceof Color){
|
||||
// create a reusable temp color object to keep intermediate results
|
||||
prop.tempColor = new Color();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
PropLine.prototype.getValue = function(r){
|
||||
var ret = {};
|
||||
for(var p in this._properties){
|
||||
var prop = this._properties[p],
|
||||
start = prop.start;
|
||||
if(start instanceof Color){
|
||||
ret[p] = Color.blendColors(start, prop.end, r, prop.tempColor).toCss();
|
||||
}else if(!lang.isArray(start)){
|
||||
ret[p] = ((prop.end - start) * r) + start + (p != "opacity" ? prop.units || "px" : 0);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
|
||||
/*=====
|
||||
dojo.declare("dojo.__AnimArgs", [dojo.__FadeArgs], {
|
||||
// Properties: Object?
|
||||
// A hash map of style properties to Objects describing the transition,
|
||||
// such as the properties of dojo._Line with an additional 'units' property
|
||||
properties: {}
|
||||
|
||||
//TODOC: add event callbacks
|
||||
});
|
||||
=====*/
|
||||
|
||||
dojo.animateProperty = function(/*dojo.__AnimArgs*/ args){
|
||||
// summary:
|
||||
// Returns an animation that will transition the properties of
|
||||
// node defined in `args` depending how they are defined in
|
||||
// `args.properties`
|
||||
//
|
||||
// description:
|
||||
// `dojo.animateProperty` is the foundation of most `dojo.fx`
|
||||
// animations. It takes an object of "properties" corresponding to
|
||||
// style properties, and animates them in parallel over a set
|
||||
// duration.
|
||||
//
|
||||
// example:
|
||||
// A simple animation that changes the width of the specified node.
|
||||
// | dojo.animateProperty({
|
||||
// | node: "nodeId",
|
||||
// | properties: { width: 400 },
|
||||
// | }).play();
|
||||
// Dojo figures out the start value for the width and converts the
|
||||
// integer specified for the width to the more expressive but
|
||||
// verbose form `{ width: { end: '400', units: 'px' } }` which you
|
||||
// can also specify directly. Defaults to 'px' if ommitted.
|
||||
//
|
||||
// example:
|
||||
// Animate width, height, and padding over 2 seconds... the
|
||||
// pedantic way:
|
||||
// | dojo.animateProperty({ node: node, duration:2000,
|
||||
// | properties: {
|
||||
// | width: { start: '200', end: '400', units:"px" },
|
||||
// | height: { start:'200', end: '400', units:"px" },
|
||||
// | paddingTop: { start:'5', end:'50', units:"px" }
|
||||
// | }
|
||||
// | }).play();
|
||||
// Note 'paddingTop' is used over 'padding-top'. Multi-name CSS properties
|
||||
// are written using "mixed case", as the hyphen is illegal as an object key.
|
||||
//
|
||||
// example:
|
||||
// Plug in a different easing function and register a callback for
|
||||
// when the animation ends. Easing functions accept values between
|
||||
// zero and one and return a value on that basis. In this case, an
|
||||
// exponential-in curve.
|
||||
// | dojo.animateProperty({
|
||||
// | node: "nodeId",
|
||||
// | // dojo figures out the start value
|
||||
// | properties: { width: { end: 400 } },
|
||||
// | easing: function(n){
|
||||
// | return (n==0) ? 0 : Math.pow(2, 10 * (n - 1));
|
||||
// | },
|
||||
// | onEnd: function(node){
|
||||
// | // called when the animation finishes. The animation
|
||||
// | // target is passed to this function
|
||||
// | }
|
||||
// | }).play(500); // delay playing half a second
|
||||
//
|
||||
// example:
|
||||
// Like all `dojo.Animation`s, animateProperty returns a handle to the
|
||||
// Animation instance, which fires the events common to Dojo FX. Use `dojo.connect`
|
||||
// to access these events outside of the Animation definiton:
|
||||
// | var anim = dojo.animateProperty({
|
||||
// | node:"someId",
|
||||
// | properties:{
|
||||
// | width:400, height:500
|
||||
// | }
|
||||
// | });
|
||||
// | dojo.connect(anim,"onEnd", function(){
|
||||
// | console.log("animation ended");
|
||||
// | });
|
||||
// | // play the animation now:
|
||||
// | anim.play();
|
||||
//
|
||||
// example:
|
||||
// Each property can be a function whose return value is substituted along.
|
||||
// Additionally, each measurement (eg: start, end) can be a function. The node
|
||||
// reference is passed direcly to callbacks.
|
||||
// | dojo.animateProperty({
|
||||
// | node:"mine",
|
||||
// | properties:{
|
||||
// | height:function(node){
|
||||
// | // shrink this node by 50%
|
||||
// | return dojo.position(node).h / 2
|
||||
// | },
|
||||
// | width:{
|
||||
// | start:function(node){ return 100; },
|
||||
// | end:function(node){ return 200; }
|
||||
// | }
|
||||
// | }
|
||||
// | }).play();
|
||||
//
|
||||
|
||||
var n = args.node = dom.byId(args.node);
|
||||
if(!args.easing){ args.easing = dojo._defaultEasing; }
|
||||
|
||||
var anim = new dojo.Animation(args);
|
||||
connect.connect(anim, "beforeBegin", anim, function(){
|
||||
var pm = {};
|
||||
for(var p in this.properties){
|
||||
// Make shallow copy of properties into pm because we overwrite
|
||||
// some values below. In particular if start/end are functions
|
||||
// we don't want to overwrite them or the functions won't be
|
||||
// called if the animation is reused.
|
||||
if(p == "width" || p == "height"){
|
||||
this.node.display = "block";
|
||||
}
|
||||
var prop = this.properties[p];
|
||||
if(lang.isFunction(prop)){
|
||||
prop = prop(n);
|
||||
}
|
||||
prop = pm[p] = _mixin({}, (lang.isObject(prop) ? prop: { end: prop }));
|
||||
|
||||
if(lang.isFunction(prop.start)){
|
||||
prop.start = prop.start(n);
|
||||
}
|
||||
if(lang.isFunction(prop.end)){
|
||||
prop.end = prop.end(n);
|
||||
}
|
||||
var isColor = (p.toLowerCase().indexOf("color") >= 0);
|
||||
function getStyle(node, p){
|
||||
// dojo.style(node, "height") can return "auto" or "" on IE; this is more reliable:
|
||||
var v = { height: node.offsetHeight, width: node.offsetWidth }[p];
|
||||
if(v !== undefined){ return v; }
|
||||
v = style.get(node, p);
|
||||
return (p == "opacity") ? +v : (isColor ? v : parseFloat(v));
|
||||
}
|
||||
if(!("end" in prop)){
|
||||
prop.end = getStyle(n, p);
|
||||
}else if(!("start" in prop)){
|
||||
prop.start = getStyle(n, p);
|
||||
}
|
||||
|
||||
if(isColor){
|
||||
prop.start = new Color(prop.start);
|
||||
prop.end = new Color(prop.end);
|
||||
}else{
|
||||
prop.start = (p == "opacity") ? +prop.start : parseFloat(prop.start);
|
||||
}
|
||||
}
|
||||
this.curve = new PropLine(pm);
|
||||
});
|
||||
connect.connect(anim, "onAnimate", lang.hitch(style, "set", anim.node));
|
||||
return anim; // dojo.Animation
|
||||
};
|
||||
|
||||
dojo.anim = function( /*DOMNode|String*/ node,
|
||||
/*Object*/ properties,
|
||||
/*Integer?*/ duration,
|
||||
/*Function?*/ easing,
|
||||
/*Function?*/ onEnd,
|
||||
/*Integer?*/ delay){
|
||||
// summary:
|
||||
// A simpler interface to `dojo.animateProperty()`, also returns
|
||||
// an instance of `dojo.Animation` but begins the animation
|
||||
// immediately, unlike nearly every other Dojo animation API.
|
||||
// description:
|
||||
// `dojo.anim` is a simpler (but somewhat less powerful) version
|
||||
// of `dojo.animateProperty`. It uses defaults for many basic properties
|
||||
// and allows for positional parameters to be used in place of the
|
||||
// packed "property bag" which is used for other Dojo animation
|
||||
// methods.
|
||||
//
|
||||
// The `dojo.Animation` object returned from `dojo.anim` will be
|
||||
// already playing when it is returned from this function, so
|
||||
// calling play() on it again is (usually) a no-op.
|
||||
// node:
|
||||
// a DOM node or the id of a node to animate CSS properties on
|
||||
// duration:
|
||||
// The number of milliseconds over which the animation
|
||||
// should run. Defaults to the global animation default duration
|
||||
// (350ms).
|
||||
// easing:
|
||||
// An easing function over which to calculate acceleration
|
||||
// and deceleration of the animation through its duration.
|
||||
// A default easing algorithm is provided, but you may
|
||||
// plug in any you wish. A large selection of easing algorithms
|
||||
// are available in `dojo.fx.easing`.
|
||||
// onEnd:
|
||||
// A function to be called when the animation finishes
|
||||
// running.
|
||||
// delay:
|
||||
// The number of milliseconds to delay beginning the
|
||||
// animation by. The default is 0.
|
||||
// example:
|
||||
// Fade out a node
|
||||
// | dojo.anim("id", { opacity: 0 });
|
||||
// example:
|
||||
// Fade out a node over a full second
|
||||
// | dojo.anim("id", { opacity: 0 }, 1000);
|
||||
return dojo.animateProperty({ // dojo.Animation
|
||||
node: node,
|
||||
duration: duration || dojo.Animation.prototype.duration,
|
||||
properties: properties,
|
||||
easing: easing,
|
||||
onEnd: onEnd
|
||||
}).play(delay || 0);
|
||||
};
|
||||
|
||||
return {
|
||||
_Line: dojo._Line,
|
||||
Animation: dojo.Animation,
|
||||
_fade: dojo._fade,
|
||||
fadeIn: dojo.fadeIn,
|
||||
fadeOut: dojo.fadeOut,
|
||||
_defaultEasing: dojo._defaultEasing,
|
||||
animateProperty: dojo.animateProperty,
|
||||
anim: dojo.anim
|
||||
};
|
||||
});
|
||||
File diff suppressed because it is too large
Load Diff
389
lib/dojo/_base/html.js.uncompressed.js
Normal file
389
lib/dojo/_base/html.js.uncompressed.js
Normal file
@@ -0,0 +1,389 @@
|
||||
define("dojo/_base/html", ["./kernel", "../dom", "../dom-style", "../dom-attr", "../dom-prop", "../dom-class", "../dom-construct", "../dom-geometry"], function(dojo, dom, style, attr, prop, cls, ctr, geom){
|
||||
// module:
|
||||
// dojo/dom
|
||||
// summary:
|
||||
// This module is a stub for the core dojo DOM API.
|
||||
|
||||
// mix-in dom
|
||||
dojo.byId = dom.byId;
|
||||
dojo.isDescendant = dom.isDescendant;
|
||||
dojo.setSelectable = dom.setSelectable;
|
||||
|
||||
// mix-in dom-attr
|
||||
dojo.getAttr = attr.get;
|
||||
dojo.setAttr = attr.set;
|
||||
dojo.hasAttr = attr.has;
|
||||
dojo.removeAttr = attr.remove;
|
||||
dojo.getNodeProp = attr.getNodeProp;
|
||||
|
||||
dojo.attr = function(node, name, value){
|
||||
// summary:
|
||||
// Gets or sets an attribute on an HTML element.
|
||||
// description:
|
||||
// Handles normalized getting and setting of attributes on DOM
|
||||
// Nodes. If 2 arguments are passed, and a the second argument is a
|
||||
// string, acts as a getter.
|
||||
//
|
||||
// If a third argument is passed, or if the second argument is a
|
||||
// map of attributes, acts as a setter.
|
||||
//
|
||||
// When passing functions as values, note that they will not be
|
||||
// directly assigned to slots on the node, but rather the default
|
||||
// behavior will be removed and the new behavior will be added
|
||||
// using `dojo.connect()`, meaning that event handler properties
|
||||
// will be normalized and that some caveats with regards to
|
||||
// non-standard behaviors for onsubmit apply. Namely that you
|
||||
// should cancel form submission using `dojo.stopEvent()` on the
|
||||
// passed event object instead of returning a boolean value from
|
||||
// the handler itself.
|
||||
// node: DOMNode|String
|
||||
// id or reference to the element to get or set the attribute on
|
||||
// name: String|Object
|
||||
// the name of the attribute to get or set.
|
||||
// value: String?
|
||||
// The value to set for the attribute
|
||||
// returns:
|
||||
// when used as a getter, the value of the requested attribute
|
||||
// or null if that attribute does not have a specified or
|
||||
// default value;
|
||||
//
|
||||
// when used as a setter, the DOM node
|
||||
//
|
||||
// example:
|
||||
// | // get the current value of the "foo" attribute on a node
|
||||
// | dojo.attr(dojo.byId("nodeId"), "foo");
|
||||
// | // or we can just pass the id:
|
||||
// | dojo.attr("nodeId", "foo");
|
||||
//
|
||||
// example:
|
||||
// | // use attr() to set the tab index
|
||||
// | dojo.attr("nodeId", "tabIndex", 3);
|
||||
// |
|
||||
//
|
||||
// example:
|
||||
// Set multiple values at once, including event handlers:
|
||||
// | dojo.attr("formId", {
|
||||
// | "foo": "bar",
|
||||
// | "tabIndex": -1,
|
||||
// | "method": "POST",
|
||||
// | "onsubmit": function(e){
|
||||
// | // stop submitting the form. Note that the IE behavior
|
||||
// | // of returning true or false will have no effect here
|
||||
// | // since our handler is connect()ed to the built-in
|
||||
// | // onsubmit behavior and so we need to use
|
||||
// | // dojo.stopEvent() to ensure that the submission
|
||||
// | // doesn't proceed.
|
||||
// | dojo.stopEvent(e);
|
||||
// |
|
||||
// | // submit the form with Ajax
|
||||
// | dojo.xhrPost({ form: "formId" });
|
||||
// | }
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// Style is s special case: Only set with an object hash of styles
|
||||
// | dojo.attr("someNode",{
|
||||
// | id:"bar",
|
||||
// | style:{
|
||||
// | width:"200px", height:"100px", color:"#000"
|
||||
// | }
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// Again, only set style as an object hash of styles:
|
||||
// | var obj = { color:"#fff", backgroundColor:"#000" };
|
||||
// | dojo.attr("someNode", "style", obj);
|
||||
// |
|
||||
// | // though shorter to use `dojo.style()` in this case:
|
||||
// | dojo.style("someNode", obj);
|
||||
|
||||
if(arguments.length == 2){
|
||||
return attr[typeof name == "string" ? "get" : "set"](node, name);
|
||||
}
|
||||
return attr.set(node, name, value);
|
||||
};
|
||||
|
||||
// mix-in dom-class
|
||||
dojo.hasClass = cls.contains;
|
||||
dojo.addClass = cls.add;
|
||||
dojo.removeClass = cls.remove;
|
||||
dojo.toggleClass = cls.toggle;
|
||||
dojo.replaceClass = cls.replace;
|
||||
|
||||
// mix-in dom-construct
|
||||
dojo._toDom = dojo.toDom = ctr.toDom;
|
||||
dojo.place = ctr.place;
|
||||
dojo.create = ctr.create;
|
||||
dojo.empty = function(node){ ctr.empty(node); };
|
||||
dojo._destroyElement = dojo.destroy = function(node){ ctr.destroy(node); };
|
||||
|
||||
// mix-in dom-geometry
|
||||
dojo._getPadExtents = dojo.getPadExtents = geom.getPadExtents;
|
||||
dojo._getBorderExtents = dojo.getBorderExtents = geom.getBorderExtents;
|
||||
dojo._getPadBorderExtents = dojo.getPadBorderExtents = geom.getPadBorderExtents;
|
||||
dojo._getMarginExtents = dojo.getMarginExtents = geom.getMarginExtents;
|
||||
dojo._getMarginSize = dojo.getMarginSize = geom.getMarginSize;
|
||||
dojo._getMarginBox = dojo.getMarginBox = geom.getMarginBox;
|
||||
dojo.setMarginBox = geom.setMarginBox;
|
||||
dojo._getContentBox = dojo.getContentBox = geom.getContentBox;
|
||||
dojo.setContentSize = geom.setContentSize;
|
||||
dojo._isBodyLtr = dojo.isBodyLtr = geom.isBodyLtr;
|
||||
dojo._docScroll = dojo.docScroll = geom.docScroll;
|
||||
dojo._getIeDocumentElementOffset = dojo.getIeDocumentElementOffset = geom.getIeDocumentElementOffset;
|
||||
dojo._fixIeBiDiScrollLeft = dojo.fixIeBiDiScrollLeft = geom.fixIeBiDiScrollLeft;
|
||||
dojo.position = geom.position;
|
||||
|
||||
dojo.marginBox = function marginBox(/*DomNode|String*/node, /*Object?*/box){
|
||||
// summary:
|
||||
// Getter/setter for the margin-box of node.
|
||||
// description:
|
||||
// Getter/setter for the margin-box of node.
|
||||
// Returns an object in the expected format of box (regardless
|
||||
// if box is passed). The object might look like:
|
||||
// `{ l: 50, t: 200, w: 300: h: 150 }`
|
||||
// for a node offset from its parent 50px to the left, 200px from
|
||||
// the top with a margin width of 300px and a margin-height of
|
||||
// 150px.
|
||||
// node:
|
||||
// id or reference to DOM Node to get/set box for
|
||||
// box:
|
||||
// If passed, denotes that dojo.marginBox() should
|
||||
// update/set the margin box for node. Box is an object in the
|
||||
// above format. All properties are optional if passed.
|
||||
// example:
|
||||
// Retrieve the margin box of a passed node
|
||||
// | var box = dojo.marginBox("someNodeId");
|
||||
// | console.dir(box);
|
||||
//
|
||||
// example:
|
||||
// Set a node's margin box to the size of another node
|
||||
// | var box = dojo.marginBox("someNodeId");
|
||||
// | dojo.marginBox("someOtherNode", box);
|
||||
return box ? geom.setMarginBox(node, box) : geom.getMarginBox(node); // Object
|
||||
};
|
||||
|
||||
dojo.contentBox = function contentBox(/*DomNode|String*/node, /*Object?*/box){
|
||||
// summary:
|
||||
// Getter/setter for the content-box of node.
|
||||
// description:
|
||||
// Returns an object in the expected format of box (regardless if box is passed).
|
||||
// The object might look like:
|
||||
// `{ l: 50, t: 200, w: 300: h: 150 }`
|
||||
// for a node offset from its parent 50px to the left, 200px from
|
||||
// the top with a content width of 300px and a content-height of
|
||||
// 150px. Note that the content box may have a much larger border
|
||||
// or margin box, depending on the box model currently in use and
|
||||
// CSS values set/inherited for node.
|
||||
// While the getter will return top and left values, the
|
||||
// setter only accepts setting the width and height.
|
||||
// node:
|
||||
// id or reference to DOM Node to get/set box for
|
||||
// box:
|
||||
// If passed, denotes that dojo.contentBox() should
|
||||
// update/set the content box for node. Box is an object in the
|
||||
// above format, but only w (width) and h (height) are supported.
|
||||
// All properties are optional if passed.
|
||||
return box ? geom.setContentSize(node, box) : geom.getContentBox(node); // Object
|
||||
};
|
||||
|
||||
dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){
|
||||
// summary:
|
||||
// Deprecated: Use position() for border-box x/y/w/h
|
||||
// or marginBox() for margin-box w/h/l/t.
|
||||
// Returns an object representing a node's size and position.
|
||||
//
|
||||
// description:
|
||||
// Returns an object that measures margin-box (w)idth/(h)eight
|
||||
// and absolute position x/y of the border-box. Also returned
|
||||
// is computed (l)eft and (t)op values in pixels from the
|
||||
// node's offsetParent as returned from marginBox().
|
||||
// Return value will be in the form:
|
||||
//| { l: 50, t: 200, w: 300: h: 150, x: 100, y: 300 }
|
||||
// Does not act as a setter. If includeScroll is passed, the x and
|
||||
// y params are affected as one would expect in dojo.position().
|
||||
dojo.deprecated("dojo.coords()", "Use dojo.position() or dojo.marginBox().");
|
||||
node = dom.byId(node);
|
||||
var s = style.getComputedStyle(node), mb = geom.getMarginBox(node, s);
|
||||
var abs = geom.position(node, includeScroll);
|
||||
mb.x = abs.x;
|
||||
mb.y = abs.y;
|
||||
return mb; // Object
|
||||
};
|
||||
|
||||
// mix-in dom-prop
|
||||
dojo.getProp = prop.get;
|
||||
dojo.setProp = prop.set;
|
||||
|
||||
dojo.prop = function(/*DomNode|String*/node, /*String|Object*/name, /*String?*/value){
|
||||
// summary:
|
||||
// Gets or sets a property on an HTML element.
|
||||
// description:
|
||||
// Handles normalized getting and setting of properties on DOM
|
||||
// Nodes. If 2 arguments are passed, and a the second argument is a
|
||||
// string, acts as a getter.
|
||||
//
|
||||
// If a third argument is passed, or if the second argument is a
|
||||
// map of attributes, acts as a setter.
|
||||
//
|
||||
// When passing functions as values, note that they will not be
|
||||
// directly assigned to slots on the node, but rather the default
|
||||
// behavior will be removed and the new behavior will be added
|
||||
// using `dojo.connect()`, meaning that event handler properties
|
||||
// will be normalized and that some caveats with regards to
|
||||
// non-standard behaviors for onsubmit apply. Namely that you
|
||||
// should cancel form submission using `dojo.stopEvent()` on the
|
||||
// passed event object instead of returning a boolean value from
|
||||
// the handler itself.
|
||||
// node:
|
||||
// id or reference to the element to get or set the property on
|
||||
// name:
|
||||
// the name of the property to get or set.
|
||||
// value:
|
||||
// The value to set for the property
|
||||
// returns:
|
||||
// when used as a getter, the value of the requested property
|
||||
// or null if that attribute does not have a specified or
|
||||
// default value;
|
||||
//
|
||||
// when used as a setter, the DOM node
|
||||
//
|
||||
// example:
|
||||
// | // get the current value of the "foo" property on a node
|
||||
// | dojo.prop(dojo.byId("nodeId"), "foo");
|
||||
// | // or we can just pass the id:
|
||||
// | dojo.prop("nodeId", "foo");
|
||||
//
|
||||
// example:
|
||||
// | // use prop() to set the tab index
|
||||
// | dojo.prop("nodeId", "tabIndex", 3);
|
||||
// |
|
||||
//
|
||||
// example:
|
||||
// Set multiple values at once, including event handlers:
|
||||
// | dojo.prop("formId", {
|
||||
// | "foo": "bar",
|
||||
// | "tabIndex": -1,
|
||||
// | "method": "POST",
|
||||
// | "onsubmit": function(e){
|
||||
// | // stop submitting the form. Note that the IE behavior
|
||||
// | // of returning true or false will have no effect here
|
||||
// | // since our handler is connect()ed to the built-in
|
||||
// | // onsubmit behavior and so we need to use
|
||||
// | // dojo.stopEvent() to ensure that the submission
|
||||
// | // doesn't proceed.
|
||||
// | dojo.stopEvent(e);
|
||||
// |
|
||||
// | // submit the form with Ajax
|
||||
// | dojo.xhrPost({ form: "formId" });
|
||||
// | }
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// Style is s special case: Only set with an object hash of styles
|
||||
// | dojo.prop("someNode",{
|
||||
// | id:"bar",
|
||||
// | style:{
|
||||
// | width:"200px", height:"100px", color:"#000"
|
||||
// | }
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// Again, only set style as an object hash of styles:
|
||||
// | var obj = { color:"#fff", backgroundColor:"#000" };
|
||||
// | dojo.prop("someNode", "style", obj);
|
||||
// |
|
||||
// | // though shorter to use `dojo.style()` in this case:
|
||||
// | dojo.style("someNode", obj);
|
||||
|
||||
if(arguments.length == 2){
|
||||
return prop[typeof name == "string" ? "get" : "set"](node, name);
|
||||
}
|
||||
// setter
|
||||
return prop.set(node, name, value);
|
||||
};
|
||||
|
||||
// mix-in dom-style
|
||||
dojo.getStyle = style.get;
|
||||
dojo.setStyle = style.set;
|
||||
dojo.getComputedStyle = style.getComputedStyle;
|
||||
dojo.__toPixelValue = dojo.toPixelValue = style.toPixelValue;
|
||||
|
||||
dojo.style = function(node, name, value){
|
||||
// summary:
|
||||
// Accesses styles on a node. If 2 arguments are
|
||||
// passed, acts as a getter. If 3 arguments are passed, acts
|
||||
// as a setter.
|
||||
// description:
|
||||
// Getting the style value uses the computed style for the node, so the value
|
||||
// will be a calculated value, not just the immediate node.style value.
|
||||
// Also when getting values, use specific style names,
|
||||
// like "borderBottomWidth" instead of "border" since compound values like
|
||||
// "border" are not necessarily reflected as expected.
|
||||
// If you want to get node dimensions, use `dojo.marginBox()`,
|
||||
// `dojo.contentBox()` or `dojo.position()`.
|
||||
// node: DOMNode|String
|
||||
// id or reference to node to get/set style for
|
||||
// name: String?|Object?
|
||||
// the style property to set in DOM-accessor format
|
||||
// ("borderWidth", not "border-width") or an object with key/value
|
||||
// pairs suitable for setting each property.
|
||||
// value: String?
|
||||
// If passed, sets value on the node for style, handling
|
||||
// cross-browser concerns. When setting a pixel value,
|
||||
// be sure to include "px" in the value. For instance, top: "200px".
|
||||
// Otherwise, in some cases, some browsers will not apply the style.
|
||||
// returns:
|
||||
// when used as a getter, return the computed style of the node if passing in an ID or node,
|
||||
// or return the normalized, computed value for the property when passing in a node and a style property
|
||||
// example:
|
||||
// Passing only an ID or node returns the computed style object of
|
||||
// the node:
|
||||
// | dojo.style("thinger");
|
||||
// example:
|
||||
// Passing a node and a style property returns the current
|
||||
// normalized, computed value for that property:
|
||||
// | dojo.style("thinger", "opacity"); // 1 by default
|
||||
//
|
||||
// example:
|
||||
// Passing a node, a style property, and a value changes the
|
||||
// current display of the node and returns the new computed value
|
||||
// | dojo.style("thinger", "opacity", 0.5); // == 0.5
|
||||
//
|
||||
// example:
|
||||
// Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node:
|
||||
// | dojo.style("thinger", {
|
||||
// | "opacity": 0.5,
|
||||
// | "border": "3px solid black",
|
||||
// | "height": "300px"
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// When the CSS style property is hyphenated, the JavaScript property is camelCased.
|
||||
// font-size becomes fontSize, and so on.
|
||||
// | dojo.style("thinger",{
|
||||
// | fontSize:"14pt",
|
||||
// | letterSpacing:"1.2em"
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// dojo.NodeList implements .style() using the same syntax, omitting the "node" parameter, calling
|
||||
// dojo.style() on every element of the list. See: `dojo.query()` and `dojo.NodeList()`
|
||||
// | dojo.query(".someClassName").style("visibility","hidden");
|
||||
// | // or
|
||||
// | dojo.query("#baz > div").style({
|
||||
// | opacity:0.75,
|
||||
// | fontSize:"13pt"
|
||||
// | });
|
||||
|
||||
switch(arguments.length){
|
||||
case 1:
|
||||
return style.get(node);
|
||||
case 2:
|
||||
return style[typeof name == "string" ? "get" : "set"](node, name);
|
||||
}
|
||||
// setter
|
||||
return style.set(node, name, value);
|
||||
};
|
||||
|
||||
return dojo;
|
||||
});
|
||||
@@ -4,152 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base.json"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base.json"] = true;
|
||||
dojo.provide("dojo._base.json");
|
||||
|
||||
|
||||
dojo.fromJson = function(/*String*/ json){
|
||||
// summary:
|
||||
// Parses a [JSON](http://json.org) string to return a JavaScript object.
|
||||
// description:
|
||||
// Throws for invalid JSON strings, but it does not use a strict JSON parser. It
|
||||
// delegates to eval(). The content passed to this method must therefore come
|
||||
// from a trusted source.
|
||||
// json:
|
||||
// a string literal of a JSON item, for instance:
|
||||
// `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'`
|
||||
|
||||
return eval("(" + json + ")"); // Object
|
||||
};
|
||||
|
||||
dojo._escapeString = function(/*String*/str){
|
||||
//summary:
|
||||
// Adds escape sequences for non-visual characters, double quote and
|
||||
// backslash and surrounds with double quotes to form a valid string
|
||||
// literal.
|
||||
return ('"' + str.replace(/(["\\])/g, '\\$1') + '"').
|
||||
replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n").
|
||||
replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r"); // string
|
||||
};
|
||||
|
||||
dojo.toJsonIndentStr = "\t";
|
||||
dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _indentStr){
|
||||
// summary:
|
||||
// Returns a [JSON](http://json.org) serialization of an object.
|
||||
// description:
|
||||
// Returns a [JSON](http://json.org) serialization of an object.
|
||||
// Note that this doesn't check for infinite recursion, so don't do that!
|
||||
// it:
|
||||
// an object to be serialized. Objects may define their own
|
||||
// serialization via a special "__json__" or "json" function
|
||||
// property. If a specialized serializer has been defined, it will
|
||||
// be used as a fallback.
|
||||
// prettyPrint:
|
||||
// if true, we indent objects and arrays to make the output prettier.
|
||||
// The variable `dojo.toJsonIndentStr` is used as the indent string --
|
||||
// to use something other than the default (tab), change that variable
|
||||
// before calling dojo.toJson().
|
||||
// _indentStr:
|
||||
// private variable for recursive calls when pretty printing, do not use.
|
||||
// example:
|
||||
// simple serialization of a trivial object
|
||||
// | var jsonStr = dojo.toJson({ howdy: "stranger!", isStrange: true });
|
||||
// | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr);
|
||||
// example:
|
||||
// a custom serializer for an objects of a particular class:
|
||||
// | dojo.declare("Furby", null, {
|
||||
// | furbies: "are strange",
|
||||
// | furbyCount: 10,
|
||||
// | __json__: function(){
|
||||
// | },
|
||||
// | });
|
||||
|
||||
if(it === undefined){
|
||||
return "undefined";
|
||||
}
|
||||
var objtype = typeof it;
|
||||
if(objtype == "number" || objtype == "boolean"){
|
||||
return it + "";
|
||||
}
|
||||
if(it === null){
|
||||
return "null";
|
||||
}
|
||||
if(dojo.isString(it)){
|
||||
return dojo._escapeString(it);
|
||||
}
|
||||
// recurse
|
||||
var recurse = arguments.callee;
|
||||
// short-circuit for objects that support "json" serialization
|
||||
// if they return "self" then just pass-through...
|
||||
var newObj;
|
||||
_indentStr = _indentStr || "";
|
||||
var nextIndent = prettyPrint ? _indentStr + dojo.toJsonIndentStr : "";
|
||||
var tf = it.__json__||it.json;
|
||||
if(dojo.isFunction(tf)){
|
||||
newObj = tf.call(it);
|
||||
if(it !== newObj){
|
||||
return recurse(newObj, prettyPrint, nextIndent);
|
||||
}
|
||||
}
|
||||
if(it.nodeType && it.cloneNode){ // isNode
|
||||
// we can't seriailize DOM nodes as regular objects because they have cycles
|
||||
// DOM nodes could be serialized with something like outerHTML, but
|
||||
// that can be provided by users in the form of .json or .__json__ function.
|
||||
throw new Error("Can't serialize DOM nodes");
|
||||
}
|
||||
|
||||
var sep = prettyPrint ? " " : "";
|
||||
var newLine = prettyPrint ? "\n" : "";
|
||||
|
||||
// array
|
||||
if(dojo.isArray(it)){
|
||||
var res = dojo.map(it, function(obj){
|
||||
var val = recurse(obj, prettyPrint, nextIndent);
|
||||
if(typeof val != "string"){
|
||||
val = "undefined";
|
||||
}
|
||||
return newLine + nextIndent + val;
|
||||
});
|
||||
return "[" + res.join("," + sep) + newLine + _indentStr + "]";
|
||||
}
|
||||
/*
|
||||
// look in the registry
|
||||
try {
|
||||
window.o = it;
|
||||
newObj = dojo.json.jsonRegistry.match(it);
|
||||
return recurse(newObj, prettyPrint, nextIndent);
|
||||
}catch(e){
|
||||
// console.log(e);
|
||||
}
|
||||
// it's a function with no adapter, skip it
|
||||
*/
|
||||
if(objtype == "function"){
|
||||
return null; // null
|
||||
}
|
||||
// generic object code path
|
||||
var output = [], key;
|
||||
for(key in it){
|
||||
var keyStr, val;
|
||||
if(typeof key == "number"){
|
||||
keyStr = '"' + key + '"';
|
||||
}else if(typeof key == "string"){
|
||||
keyStr = dojo._escapeString(key);
|
||||
}else{
|
||||
// skip non-string or number keys
|
||||
continue;
|
||||
}
|
||||
val = recurse(it[key], prettyPrint, nextIndent);
|
||||
if(typeof val != "string"){
|
||||
// skip non-serializable values
|
||||
continue;
|
||||
}
|
||||
// FIXME: use += on Moz!!
|
||||
// MOW NOTE: using += is a pain because you have to account for the dangling comma...
|
||||
output.push(newLine + nextIndent + keyStr + ":" + sep + val);
|
||||
}
|
||||
return "{" + output.join("," + sep) + newLine + _indentStr + "}"; // String
|
||||
};
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/_base/json",["./kernel","../json"],function(_1,_2){_1.fromJson=function(js){return eval("("+js+")");};_1._escapeString=_2.stringify;_1.toJsonIndentStr="\t";_1.toJson=function(it,_3){return _2.stringify(it,function(_4,_5){if(_5){var tf=_5.__json__||_5.json;if(typeof tf=="function"){return tf.call(_5);}}return _5;},_3&&_1.toJsonIndentStr);};return _1;});
|
||||
85
lib/dojo/_base/json.js.uncompressed.js
Normal file
85
lib/dojo/_base/json.js.uncompressed.js
Normal file
@@ -0,0 +1,85 @@
|
||||
define("dojo/_base/json", ["./kernel", "../json"], function(dojo, json){
|
||||
// module:
|
||||
// dojo/_base/json
|
||||
// summary:
|
||||
// This module defines the dojo JSON API.
|
||||
|
||||
dojo.fromJson = function(/*String*/ js){
|
||||
// summary:
|
||||
// Parses a JavaScript expression and returns a JavaScript value.
|
||||
// description:
|
||||
// Throws for invalid JavaScript expressions. It does not use a strict JSON parser. It
|
||||
// always delegates to eval(). The content passed to this method must therefore come
|
||||
// from a trusted source.
|
||||
// It is recommend that you use dojo/json's parse function for an
|
||||
// implementation uses the (faster) native JSON parse when available.
|
||||
// js:
|
||||
// a string literal of a JavaScript expression, for instance:
|
||||
// `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'`
|
||||
|
||||
return eval("(" + js + ")"); // Object
|
||||
};
|
||||
|
||||
/*=====
|
||||
dojo._escapeString = function(){
|
||||
// summary:
|
||||
// Adds escape sequences for non-visual characters, double quote and
|
||||
// backslash and surrounds with double quotes to form a valid string
|
||||
// literal.
|
||||
};
|
||||
=====*/
|
||||
dojo._escapeString = json.stringify; // just delegate to json.stringify
|
||||
|
||||
dojo.toJsonIndentStr = "\t";
|
||||
dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint){
|
||||
// summary:
|
||||
// Returns a [JSON](http://json.org) serialization of an object.
|
||||
// description:
|
||||
// Returns a [JSON](http://json.org) serialization of an object.
|
||||
// Note that this doesn't check for infinite recursion, so don't do that!
|
||||
// It is recommend that you use dojo/json's stringify function for an lighter
|
||||
// and faster implementation that matches the native JSON API and uses the
|
||||
// native JSON serializer when available.
|
||||
// it:
|
||||
// an object to be serialized. Objects may define their own
|
||||
// serialization via a special "__json__" or "json" function
|
||||
// property. If a specialized serializer has been defined, it will
|
||||
// be used as a fallback.
|
||||
// Note that in 1.6, toJson would serialize undefined, but this no longer supported
|
||||
// since it is not supported by native JSON serializer.
|
||||
// prettyPrint:
|
||||
// if true, we indent objects and arrays to make the output prettier.
|
||||
// The variable `dojo.toJsonIndentStr` is used as the indent string --
|
||||
// to use something other than the default (tab), change that variable
|
||||
// before calling dojo.toJson().
|
||||
// Note that if native JSON support is available, it will be used for serialization,
|
||||
// and native implementations vary on the exact spacing used in pretty printing.
|
||||
// returns:
|
||||
// A JSON string serialization of the passed-in object.
|
||||
// example:
|
||||
// simple serialization of a trivial object
|
||||
// | var jsonStr = dojo.toJson({ howdy: "stranger!", isStrange: true });
|
||||
// | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr);
|
||||
// example:
|
||||
// a custom serializer for an objects of a particular class:
|
||||
// | dojo.declare("Furby", null, {
|
||||
// | furbies: "are strange",
|
||||
// | furbyCount: 10,
|
||||
// | __json__: function(){
|
||||
// | },
|
||||
// | });
|
||||
|
||||
// use dojo/json
|
||||
return json.stringify(it, function(key, value){
|
||||
if(value){
|
||||
var tf = value.__json__||value.json;
|
||||
if(typeof tf == "function"){
|
||||
return tf.call(value);
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}, prettyPrint && dojo.toJsonIndentStr); // String
|
||||
};
|
||||
|
||||
return dojo;
|
||||
});
|
||||
8
lib/dojo/_base/kernel.js
Normal file
8
lib/dojo/_base/kernel.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/_base/kernel",["../has","./config","require","module"],function(_1,_2,_3,_4){var i,p,_5={},_6={},_7={config:_2,global:this,dijit:_5,dojox:_6};var _8={dojo:["dojo",_7],dijit:["dijit",_5],dojox:["dojox",_6]},_9=(_3.packs&&_3.packs[_4.id.match(/[^\/]+/)[0]].packageMap)||{},_a;for(p in _9){if(_8[p]){_8[p][0]=_9[p];}else{_8[p]=[_9[p],{}];}}for(p in _8){_a=_8[p];_a[1]._scopeName=_a[0];if(!_2.noGlobals){this[_a[0]]=_a[1];}}_7.scopeMap=_8;_7.baseUrl=_7.config.baseUrl=_3.baseUrl;_7.isAsync=!1||_3.async;_7.locale=_2.locale;var _b="$Rev: 28982 $".match(/\d+/);_7.version={major:1,minor:7,patch:3,flag:"",revision:_b?+_b[0]:NaN,toString:function(){var v=_7.version;return v.major+"."+v.minor+"."+v.patch+v.flag+" ("+v.revision+")";}};true||_1.add("extend-dojo",1);_7.eval=function(_c){};(Function("d","d.eval = function(){return d.global.eval ? d.global.eval(arguments[0]) : eval(arguments[0]);}"))(_7);if(0){_7.exit=function(_d){quit(_d);};}else{_7.exit=function(){};}true||_1.add("dojo-guarantee-console",1);if(1){typeof console!="undefined"||(console={});var cn=["assert","count","debug","dir","dirxml","error","group","groupEnd","info","profile","profileEnd","time","timeEnd","trace","warn","log"];var tn;i=0;while((tn=cn[i++])){if(!console[tn]){(function(){var _e=tn+"";console[_e]=("log" in console)?function(){var a=Array.apply({},arguments);a.unshift(_e+":");console["log"](a.join(" "));}:function(){};console[_e]._fake=true;})();}}}_1.add("dojo-debug-messages",!!_2.isDebug);if(_1("dojo-debug-messages")){_7.deprecated=function(_f,_10,_11){var _12="DEPRECATED: "+_f;if(_10){_12+=" "+_10;}if(_11){_12+=" -- will be removed in version: "+_11;}console.warn(_12);};_7.experimental=function(_13,_14){var _15="EXPERIMENTAL: "+_13+" -- APIs subject to change without notice.";if(_14){_15+=" "+_14;}console.warn(_15);};}else{_7.deprecated=_7.experimental=function(){};}true||_1.add("dojo-modulePaths",1);if(1){if(_2.modulePaths){_7.deprecated("dojo.modulePaths","use paths configuration");var _16={};for(p in _2.modulePaths){_16[p.replace(/\./g,"/")]=_2.modulePaths[p];}_3({paths:_16});}}true||_1.add("dojo-moduleUrl",1);if(1){_7.moduleUrl=function(_17,url){_7.deprecated("dojo.moduleUrl()","use require.toUrl","2.0");var _18=null;if(_17){_18=_3.toUrl(_17.replace(/\./g,"/")+(url?("/"+url):"")+"/*.*").replace(/\/\*\.\*/,"")+(url?"":"/");}return _18;};}_7._hasResource={};return _7;});
|
||||
302
lib/dojo/_base/kernel.js.uncompressed.js
Normal file
302
lib/dojo/_base/kernel.js.uncompressed.js
Normal file
@@ -0,0 +1,302 @@
|
||||
define("dojo/_base/kernel", ["../has", "./config", "require", "module"], function(has, config, require, module){
|
||||
// module:
|
||||
// dojo/_base/kernel
|
||||
// summary:
|
||||
// This module is the foundational module of the dojo boot sequence; it defines the dojo object.
|
||||
var
|
||||
// loop variables for this module
|
||||
i, p,
|
||||
|
||||
// create dojo, dijit, and dojox
|
||||
// FIXME: in 2.0 remove dijit, dojox being created by dojo
|
||||
dijit = {},
|
||||
dojox = {},
|
||||
dojo = {
|
||||
// notice dojo takes ownership of the value of the config module
|
||||
config:config,
|
||||
global:this,
|
||||
dijit:dijit,
|
||||
dojox:dojox
|
||||
};
|
||||
|
||||
|
||||
// Configure the scope map. For a 100% AMD application, the scope map is not needed other than to provide
|
||||
// a _scopeName property for the dojo, dijit, and dojox root object so those packages can create
|
||||
// unique names in the global space.
|
||||
//
|
||||
// Built, legacy modules use the scope map to allow those modules to be expressed as if dojo, dijit, and dojox,
|
||||
// where global when in fact they are either global under different names or not global at all. In v1.6-, the
|
||||
// config variable "scopeMap" was used to map names as used within a module to global names. This has been
|
||||
// subsumed by the dojo packageMap configuration variable which relocates packages to different names. See
|
||||
// http://livedocs.dojotoolkit.org/developer/design/loader#legacy-cross-domain-mode for details.
|
||||
//
|
||||
// The following computations contort the packageMap for this dojo instance into a scopeMap.
|
||||
var scopeMap =
|
||||
// a map from a name used in a legacy module to the (global variable name, object addressed by that name)
|
||||
// always map dojo, dijit, and dojox
|
||||
{
|
||||
dojo:["dojo", dojo],
|
||||
dijit:["dijit", dijit],
|
||||
dojox:["dojox", dojox]
|
||||
},
|
||||
|
||||
packageMap =
|
||||
// the package map for this dojo instance; note, a foreign loader or no pacakgeMap results in the above default config
|
||||
(require.packs && require.packs[module.id.match(/[^\/]+/)[0]].packageMap) || {},
|
||||
|
||||
item;
|
||||
|
||||
// process all mapped top-level names for this instance of dojo
|
||||
for(p in packageMap){
|
||||
if(scopeMap[p]){
|
||||
// mapped dojo, dijit, or dojox
|
||||
scopeMap[p][0] = packageMap[p];
|
||||
}else{
|
||||
// some other top-level name
|
||||
scopeMap[p] = [packageMap[p], {}];
|
||||
}
|
||||
}
|
||||
|
||||
// publish those names to _scopeName and, optionally, the global namespace
|
||||
for(p in scopeMap){
|
||||
item = scopeMap[p];
|
||||
item[1]._scopeName = item[0];
|
||||
if(!config.noGlobals){
|
||||
this[item[0]] = item[1];
|
||||
}
|
||||
}
|
||||
dojo.scopeMap = scopeMap;
|
||||
|
||||
// FIXME: dojo.baseUrl and dojo.config.baseUrl should be deprecated
|
||||
dojo.baseUrl = dojo.config.baseUrl = require.baseUrl;
|
||||
dojo.isAsync = !1 || require.async;
|
||||
dojo.locale = config.locale;
|
||||
|
||||
/*=====
|
||||
dojo.version = function(){
|
||||
// summary:
|
||||
// Version number of the Dojo Toolkit
|
||||
// major: Integer
|
||||
// Major version. If total version is "1.2.0beta1", will be 1
|
||||
// minor: Integer
|
||||
// Minor version. If total version is "1.2.0beta1", will be 2
|
||||
// patch: Integer
|
||||
// Patch version. If total version is "1.2.0beta1", will be 0
|
||||
// flag: String
|
||||
// Descriptor flag. If total version is "1.2.0beta1", will be "beta1"
|
||||
// revision: Number
|
||||
// The SVN rev from which dojo was pulled
|
||||
this.major = 0;
|
||||
this.minor = 0;
|
||||
this.patch = 0;
|
||||
this.flag = "";
|
||||
this.revision = 0;
|
||||
}
|
||||
=====*/
|
||||
var rev = "$Rev: 28982 $".match(/\d+/);
|
||||
dojo.version = {
|
||||
major: 1, minor: 7, patch: 3, flag: "",
|
||||
revision: rev ? +rev[0] : NaN,
|
||||
toString: function(){
|
||||
var v = dojo.version;
|
||||
return v.major + "." + v.minor + "." + v.patch + v.flag + " (" + v.revision + ")"; // String
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// If 1 is truthy, then as a dojo module is defined it should push it's definitions
|
||||
// into the dojo object, and conversely. In 2.0, it will likely be unusual to augment another object
|
||||
// as a result of defining a module. This has feature gives a way to force 2.0 behavior as the code
|
||||
// is migrated. Absent specific advice otherwise, set extend-dojo to truthy.
|
||||
true || has.add("extend-dojo", 1);
|
||||
|
||||
|
||||
dojo.eval = function(scriptText){
|
||||
// summary:
|
||||
// A legacy method created for use exclusively by internal Dojo methods. Do not use this method
|
||||
// directly unless you understand its possibly-different implications on the platforms your are targeting.
|
||||
// description:
|
||||
// Makes an attempt to evaluate scriptText in the global scope. The function works correctly for browsers
|
||||
// that support indirect eval.
|
||||
//
|
||||
// As usual, IE does not. On IE, the only way to implement global eval is to
|
||||
// use execScript. Unfortunately, execScript does not return a value and breaks some current usages of dojo.eval.
|
||||
// This implementation uses the technique of executing eval in the scope of a function that is a single scope
|
||||
// frame below the global scope; thereby coming close to the global scope. Note carefully that
|
||||
//
|
||||
// dojo.eval("var pi = 3.14;");
|
||||
//
|
||||
// will define global pi in non-IE environments, but define pi only in a temporary local scope for IE. If you want
|
||||
// to define a global variable using dojo.eval, write something like
|
||||
//
|
||||
// dojo.eval("window.pi = 3.14;")
|
||||
// scriptText:
|
||||
// The text to evaluation.
|
||||
// returns:
|
||||
// The result of the evaluation. Often `undefined`
|
||||
};
|
||||
|
||||
(Function("d", "d.eval = function(){return d.global.eval ? d.global.eval(arguments[0]) : eval(arguments[0]);}"))(dojo);
|
||||
|
||||
|
||||
if(0){
|
||||
dojo.exit = function(exitcode){
|
||||
quit(exitcode);
|
||||
};
|
||||
} else{
|
||||
dojo.exit = function(){
|
||||
};
|
||||
}
|
||||
|
||||
true || has.add("dojo-guarantee-console",
|
||||
// ensure that console.log, console.warn, etc. are defined
|
||||
1
|
||||
);
|
||||
if(1){
|
||||
typeof console != "undefined" || (console = {});
|
||||
// Be careful to leave 'log' always at the end
|
||||
var cn = [
|
||||
"assert", "count", "debug", "dir", "dirxml", "error", "group",
|
||||
"groupEnd", "info", "profile", "profileEnd", "time", "timeEnd",
|
||||
"trace", "warn", "log"
|
||||
];
|
||||
var tn;
|
||||
i = 0;
|
||||
while((tn = cn[i++])){
|
||||
if(!console[tn]){
|
||||
(function(){
|
||||
var tcn = tn + "";
|
||||
console[tcn] = ('log' in console) ? function(){
|
||||
var a = Array.apply({}, arguments);
|
||||
a.unshift(tcn + ":");
|
||||
console["log"](a.join(" "));
|
||||
} : function(){};
|
||||
console[tcn]._fake = true;
|
||||
})();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
has.add("dojo-debug-messages",
|
||||
// include dojo.deprecated/dojo.experimental implementations
|
||||
!!config.isDebug
|
||||
);
|
||||
if(has("dojo-debug-messages")){
|
||||
dojo.deprecated = function(/*String*/ behaviour, /*String?*/ extra, /*String?*/ removal){
|
||||
// summary:
|
||||
// Log a debug message to indicate that a behavior has been
|
||||
// deprecated.
|
||||
// behaviour: String
|
||||
// The API or behavior being deprecated. Usually in the form
|
||||
// of "myApp.someFunction()".
|
||||
// extra: String?
|
||||
// Text to append to the message. Often provides advice on a
|
||||
// new function or facility to achieve the same goal during
|
||||
// the deprecation period.
|
||||
// removal: String?
|
||||
// Text to indicate when in the future the behavior will be
|
||||
// removed. Usually a version number.
|
||||
// example:
|
||||
// | dojo.deprecated("myApp.getTemp()", "use myApp.getLocaleTemp() instead", "1.0");
|
||||
|
||||
var message = "DEPRECATED: " + behaviour;
|
||||
if(extra){ message += " " + extra; }
|
||||
if(removal){ message += " -- will be removed in version: " + removal; }
|
||||
console.warn(message);
|
||||
};
|
||||
|
||||
dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
|
||||
// summary: Marks code as experimental.
|
||||
// description:
|
||||
// This can be used to mark a function, file, or module as
|
||||
// experimental. Experimental code is not ready to be used, and the
|
||||
// APIs are subject to change without notice. Experimental code may be
|
||||
// completed deleted without going through the normal deprecation
|
||||
// process.
|
||||
// moduleName: String
|
||||
// The name of a module, or the name of a module file or a specific
|
||||
// function
|
||||
// extra: String?
|
||||
// some additional message for the user
|
||||
// example:
|
||||
// | dojo.experimental("dojo.data.Result");
|
||||
// example:
|
||||
// | dojo.experimental("dojo.weather.toKelvin()", "PENDING approval from NOAA");
|
||||
|
||||
var message = "EXPERIMENTAL: " + moduleName + " -- APIs subject to change without notice.";
|
||||
if(extra){ message += " " + extra; }
|
||||
console.warn(message);
|
||||
};
|
||||
}else{
|
||||
dojo.deprecated = dojo.experimental = function(){};
|
||||
}
|
||||
|
||||
true || has.add("dojo-modulePaths",
|
||||
// consume dojo.modulePaths processing
|
||||
1
|
||||
);
|
||||
if(1){
|
||||
// notice that modulePaths won't be applied to any require's before the dojo/_base/kernel factory is run;
|
||||
// this is the v1.6- behavior.
|
||||
if(config.modulePaths){
|
||||
dojo.deprecated("dojo.modulePaths", "use paths configuration");
|
||||
var paths = {};
|
||||
for(p in config.modulePaths){
|
||||
paths[p.replace(/\./g, "/")] = config.modulePaths[p];
|
||||
}
|
||||
require({paths:paths});
|
||||
}
|
||||
}
|
||||
|
||||
true || has.add("dojo-moduleUrl",
|
||||
// include dojo.moduleUrl
|
||||
1
|
||||
);
|
||||
if(1){
|
||||
dojo.moduleUrl = function(/*String*/module, /*String?*/url){
|
||||
// summary:
|
||||
// Returns a URL relative to a module.
|
||||
// example:
|
||||
// | var pngPath = dojo.moduleUrl("acme","images/small.png");
|
||||
// | console.dir(pngPath); // list the object properties
|
||||
// | // create an image and set it's source to pngPath's value:
|
||||
// | var img = document.createElement("img");
|
||||
// | img.src = pngPath;
|
||||
// | // add our image to the document
|
||||
// | dojo.body().appendChild(img);
|
||||
// example:
|
||||
// you may de-reference as far as you like down the package
|
||||
// hierarchy. This is sometimes handy to avoid lenghty relative
|
||||
// urls or for building portable sub-packages. In this example,
|
||||
// the `acme.widget` and `acme.util` directories may be located
|
||||
// under different roots (see `dojo.registerModulePath`) but the
|
||||
// the modules which reference them can be unaware of their
|
||||
// relative locations on the filesystem:
|
||||
// | // somewhere in a configuration block
|
||||
// | dojo.registerModulePath("acme.widget", "../../acme/widget");
|
||||
// | dojo.registerModulePath("acme.util", "../../util");
|
||||
// |
|
||||
// | // ...
|
||||
// |
|
||||
// | // code in a module using acme resources
|
||||
// | var tmpltPath = dojo.moduleUrl("acme.widget","templates/template.html");
|
||||
// | var dataPath = dojo.moduleUrl("acme.util","resources/data.json");
|
||||
|
||||
dojo.deprecated("dojo.moduleUrl()", "use require.toUrl", "2.0");
|
||||
|
||||
// require.toUrl requires a filetype; therefore, just append the suffix "/*.*" to guarantee a filetype, then
|
||||
// remove the suffix from the result. This way clients can request a url w/out a filetype. This should be
|
||||
// rare, but it maintains backcompat for the v1.x line (note: dojo.moduleUrl will be removed in v2.0).
|
||||
// Notice * is an illegal filename so it won't conflict with any real path map that may exist the paths config.
|
||||
var result = null;
|
||||
if(module){
|
||||
result = require.toUrl(module.replace(/\./g, "/") + (url ? ("/" + url) : "") + "/*.*").replace(/\/\*\.\*/, "") + (url ? "" : "/");
|
||||
}
|
||||
return result;
|
||||
};
|
||||
}
|
||||
|
||||
dojo._hasResource = {}; // for backward compatibility with layers built with 1.6 tooling
|
||||
|
||||
return dojo;
|
||||
});
|
||||
@@ -4,394 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base.lang"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base.lang"] = true;
|
||||
dojo.provide("dojo._base.lang");
|
||||
|
||||
|
||||
(function(){
|
||||
var d = dojo, opts = Object.prototype.toString;
|
||||
|
||||
// Crockford (ish) functions
|
||||
|
||||
dojo.isString = function(/*anything*/ it){
|
||||
// summary:
|
||||
// Return true if it is a String
|
||||
return (typeof it == "string" || it instanceof String); // Boolean
|
||||
};
|
||||
|
||||
dojo.isArray = function(/*anything*/ it){
|
||||
// summary:
|
||||
// Return true if it is an Array.
|
||||
// Does not work on Arrays created in other windows.
|
||||
return it && (it instanceof Array || typeof it == "array"); // Boolean
|
||||
};
|
||||
|
||||
dojo.isFunction = function(/*anything*/ it){
|
||||
// summary:
|
||||
// Return true if it is a Function
|
||||
return opts.call(it) === "[object Function]";
|
||||
};
|
||||
|
||||
dojo.isObject = function(/*anything*/ it){
|
||||
// summary:
|
||||
// Returns true if it is a JavaScript object (or an Array, a Function
|
||||
// or null)
|
||||
return it !== undefined &&
|
||||
(it === null || typeof it == "object" || d.isArray(it) || d.isFunction(it)); // Boolean
|
||||
};
|
||||
|
||||
dojo.isArrayLike = function(/*anything*/ it){
|
||||
// summary:
|
||||
// similar to dojo.isArray() but more permissive
|
||||
// description:
|
||||
// Doesn't strongly test for "arrayness". Instead, settles for "isn't
|
||||
// a string or number and has a length property". Arguments objects
|
||||
// and DOM collections will return true when passed to
|
||||
// dojo.isArrayLike(), but will return false when passed to
|
||||
// dojo.isArray().
|
||||
// returns:
|
||||
// If it walks like a duck and quacks like a duck, return `true`
|
||||
return it && it !== undefined && // Boolean
|
||||
// keep out built-in constructors (Number, String, ...) which have length
|
||||
// properties
|
||||
!d.isString(it) && !d.isFunction(it) &&
|
||||
!(it.tagName && it.tagName.toLowerCase() == 'form') &&
|
||||
(d.isArray(it) || isFinite(it.length));
|
||||
};
|
||||
|
||||
dojo.isAlien = function(/*anything*/ it){
|
||||
// summary:
|
||||
// Returns true if it is a built-in function or some other kind of
|
||||
// oddball that *should* report as a function but doesn't
|
||||
return it && !d.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean
|
||||
};
|
||||
|
||||
dojo.extend = function(/*Object*/ constructor, /*Object...*/ props){
|
||||
// summary:
|
||||
// Adds all properties and methods of props to constructor's
|
||||
// prototype, making them available to all instances created with
|
||||
// constructor.
|
||||
for(var i=1, l=arguments.length; i<l; i++){
|
||||
d._mixin(constructor.prototype, arguments[i]);
|
||||
}
|
||||
return constructor; // Object
|
||||
};
|
||||
|
||||
dojo._hitchArgs = function(scope, method /*,...*/){
|
||||
var pre = d._toArray(arguments, 2);
|
||||
var named = d.isString(method);
|
||||
return function(){
|
||||
// arrayify arguments
|
||||
var args = d._toArray(arguments);
|
||||
// locate our method
|
||||
var f = named ? (scope||d.global)[method] : method;
|
||||
// invoke with collected args
|
||||
return f && f.apply(scope || this, pre.concat(args)); // mixed
|
||||
}; // Function
|
||||
};
|
||||
|
||||
dojo.hitch = function(/*Object*/scope, /*Function|String*/method /*,...*/){
|
||||
// summary:
|
||||
// Returns a function that will only ever execute in the a given scope.
|
||||
// This allows for easy use of object member functions
|
||||
// in callbacks and other places in which the "this" keyword may
|
||||
// otherwise not reference the expected scope.
|
||||
// Any number of default positional arguments may be passed as parameters
|
||||
// beyond "method".
|
||||
// Each of these values will be used to "placehold" (similar to curry)
|
||||
// for the hitched function.
|
||||
// scope:
|
||||
// The scope to use when method executes. If method is a string,
|
||||
// scope is also the object containing method.
|
||||
// method:
|
||||
// A function to be hitched to scope, or the name of the method in
|
||||
// scope to be hitched.
|
||||
// example:
|
||||
// | dojo.hitch(foo, "bar")();
|
||||
// runs foo.bar() in the scope of foo
|
||||
// example:
|
||||
// | dojo.hitch(foo, myFunction);
|
||||
// returns a function that runs myFunction in the scope of foo
|
||||
// example:
|
||||
// Expansion on the default positional arguments passed along from
|
||||
// hitch. Passed args are mixed first, additional args after.
|
||||
// | var foo = { bar: function(a, b, c){ console.log(a, b, c); } };
|
||||
// | var fn = dojo.hitch(foo, "bar", 1, 2);
|
||||
// | fn(3); // logs "1, 2, 3"
|
||||
// example:
|
||||
// | var foo = { bar: 2 };
|
||||
// | dojo.hitch(foo, function(){ this.bar = 10; })();
|
||||
// execute an anonymous function in scope of foo
|
||||
|
||||
if(arguments.length > 2){
|
||||
return d._hitchArgs.apply(d, arguments); // Function
|
||||
}
|
||||
if(!method){
|
||||
method = scope;
|
||||
scope = null;
|
||||
}
|
||||
if(d.isString(method)){
|
||||
scope = scope || d.global;
|
||||
if(!scope[method]){ throw(['dojo.hitch: scope["', method, '"] is null (scope="', scope, '")'].join('')); }
|
||||
return function(){ return scope[method].apply(scope, arguments || []); }; // Function
|
||||
}
|
||||
return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function
|
||||
};
|
||||
|
||||
/*=====
|
||||
dojo.delegate = function(obj, props){
|
||||
// summary:
|
||||
// Returns a new object which "looks" to obj for properties which it
|
||||
// does not have a value for. Optionally takes a bag of properties to
|
||||
// seed the returned object with initially.
|
||||
// description:
|
||||
// This is a small implementaton of the Boodman/Crockford delegation
|
||||
// pattern in JavaScript. An intermediate object constructor mediates
|
||||
// the prototype chain for the returned object, using it to delegate
|
||||
// down to obj for property lookup when object-local lookup fails.
|
||||
// This can be thought of similarly to ES4's "wrap", save that it does
|
||||
// not act on types but rather on pure objects.
|
||||
// obj:
|
||||
// The object to delegate to for properties not found directly on the
|
||||
// return object or in props.
|
||||
// props:
|
||||
// an object containing properties to assign to the returned object
|
||||
// returns:
|
||||
// an Object of anonymous type
|
||||
// example:
|
||||
// | var foo = { bar: "baz" };
|
||||
// | var thinger = dojo.delegate(foo, { thud: "xyzzy"});
|
||||
// | thinger.bar == "baz"; // delegated to foo
|
||||
// | foo.thud == undefined; // by definition
|
||||
// | thinger.thud == "xyzzy"; // mixed in from props
|
||||
// | foo.bar = "thonk";
|
||||
// | thinger.bar == "thonk"; // still delegated to foo's bar
|
||||
}
|
||||
=====*/
|
||||
|
||||
dojo.delegate = dojo._delegate = (function(){
|
||||
// boodman/crockford delegation w/ cornford optimization
|
||||
function TMP(){}
|
||||
return function(obj, props){
|
||||
TMP.prototype = obj;
|
||||
var tmp = new TMP();
|
||||
TMP.prototype = null;
|
||||
if(props){
|
||||
d._mixin(tmp, props);
|
||||
}
|
||||
return tmp; // Object
|
||||
};
|
||||
})();
|
||||
|
||||
/*=====
|
||||
dojo._toArray = function(obj, offset, startWith){
|
||||
// summary:
|
||||
// Converts an array-like object (i.e. arguments, DOMCollection) to an
|
||||
// array. Returns a new Array with the elements of obj.
|
||||
// obj: Object
|
||||
// the object to "arrayify". We expect the object to have, at a
|
||||
// minimum, a length property which corresponds to integer-indexed
|
||||
// properties.
|
||||
// offset: Number?
|
||||
// the location in obj to start iterating from. Defaults to 0.
|
||||
// Optional.
|
||||
// startWith: Array?
|
||||
// An array to pack with the properties of obj. If provided,
|
||||
// properties in obj are appended at the end of startWith and
|
||||
// startWith is the returned array.
|
||||
}
|
||||
=====*/
|
||||
|
||||
var efficient = function(obj, offset, startWith){
|
||||
return (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0));
|
||||
};
|
||||
|
||||
var slow = function(obj, offset, startWith){
|
||||
var arr = startWith||[];
|
||||
for(var x = offset || 0; x < obj.length; x++){
|
||||
arr.push(obj[x]);
|
||||
}
|
||||
return arr;
|
||||
};
|
||||
|
||||
dojo._toArray =
|
||||
d.isIE ? function(obj){
|
||||
return ((obj.item) ? slow : efficient).apply(this, arguments);
|
||||
} :
|
||||
efficient;
|
||||
|
||||
dojo.partial = function(/*Function|String*/method /*, ...*/){
|
||||
// summary:
|
||||
// similar to hitch() except that the scope object is left to be
|
||||
// whatever the execution context eventually becomes.
|
||||
// description:
|
||||
// Calling dojo.partial is the functional equivalent of calling:
|
||||
// | dojo.hitch(null, funcName, ...);
|
||||
var arr = [ null ];
|
||||
return d.hitch.apply(d, arr.concat(d._toArray(arguments))); // Function
|
||||
};
|
||||
|
||||
var extraNames = d._extraNames, extraLen = extraNames.length, empty = {};
|
||||
|
||||
dojo.clone = function(/*anything*/ o){
|
||||
// summary:
|
||||
// Clones objects (including DOM nodes) and all children.
|
||||
// Warning: do not clone cyclic structures.
|
||||
if(!o || typeof o != "object" || d.isFunction(o)){
|
||||
// null, undefined, any non-object, or function
|
||||
return o; // anything
|
||||
}
|
||||
if(o.nodeType && "cloneNode" in o){
|
||||
// DOM Node
|
||||
return o.cloneNode(true); // Node
|
||||
}
|
||||
if(o instanceof Date){
|
||||
// Date
|
||||
return new Date(o.getTime()); // Date
|
||||
}
|
||||
if(o instanceof RegExp){
|
||||
// RegExp
|
||||
return new RegExp(o); // RegExp
|
||||
}
|
||||
var r, i, l, s, name;
|
||||
if(d.isArray(o)){
|
||||
// array
|
||||
r = [];
|
||||
for(i = 0, l = o.length; i < l; ++i){
|
||||
if(i in o){
|
||||
r.push(d.clone(o[i]));
|
||||
}
|
||||
}
|
||||
// we don't clone functions for performance reasons
|
||||
// }else if(d.isFunction(o)){
|
||||
// // function
|
||||
// r = function(){ return o.apply(this, arguments); };
|
||||
}else{
|
||||
// generic objects
|
||||
r = o.constructor ? new o.constructor() : {};
|
||||
}
|
||||
for(name in o){
|
||||
// the "tobj" condition avoid copying properties in "source"
|
||||
// inherited from Object.prototype. For example, if target has a custom
|
||||
// toString() method, don't overwrite it with the toString() method
|
||||
// that source inherited from Object.prototype
|
||||
s = o[name];
|
||||
if(!(name in r) || (r[name] !== s && (!(name in empty) || empty[name] !== s))){
|
||||
r[name] = d.clone(s);
|
||||
}
|
||||
}
|
||||
// IE doesn't recognize some custom functions in for..in
|
||||
if(extraLen){
|
||||
for(i = 0; i < extraLen; ++i){
|
||||
name = extraNames[i];
|
||||
s = o[name];
|
||||
if(!(name in r) || (r[name] !== s && (!(name in empty) || empty[name] !== s))){
|
||||
r[name] = s; // functions only, we don't clone them
|
||||
}
|
||||
}
|
||||
}
|
||||
return r; // Object
|
||||
};
|
||||
|
||||
/*=====
|
||||
dojo.trim = function(str){
|
||||
// summary:
|
||||
// Trims whitespace from both sides of the string
|
||||
// str: String
|
||||
// String to be trimmed
|
||||
// returns: String
|
||||
// Returns the trimmed string
|
||||
// description:
|
||||
// This version of trim() was selected for inclusion into the base due
|
||||
// to its compact size and relatively good performance
|
||||
// (see [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript)
|
||||
// Uses String.prototype.trim instead, if available.
|
||||
// The fastest but longest version of this function is located at
|
||||
// dojo.string.trim()
|
||||
return ""; // String
|
||||
}
|
||||
=====*/
|
||||
|
||||
dojo.trim = String.prototype.trim ?
|
||||
function(str){ return str.trim(); } :
|
||||
function(str){ return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };
|
||||
|
||||
/*=====
|
||||
dojo.replace = function(tmpl, map, pattern){
|
||||
// summary:
|
||||
// Performs parameterized substitutions on a string. Throws an
|
||||
// exception if any parameter is unmatched.
|
||||
// tmpl: String
|
||||
// String to be used as a template.
|
||||
// map: Object|Function
|
||||
// If an object, it is used as a dictionary to look up substitutions.
|
||||
// If a function, it is called for every substitution with following
|
||||
// parameters: a whole match, a name, an offset, and the whole template
|
||||
// string (see https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace
|
||||
// for more details).
|
||||
// pattern: RegEx?
|
||||
// Optional regular expression objects that overrides the default pattern.
|
||||
// Must be global and match one item. The default is: /\{([^\}]+)\}/g,
|
||||
// which matches patterns like that: "{xxx}", where "xxx" is any sequence
|
||||
// of characters, which doesn't include "}".
|
||||
// returns: String
|
||||
// Returns the substituted string.
|
||||
// example:
|
||||
// | // uses a dictionary for substitutions:
|
||||
// | dojo.replace("Hello, {name.first} {name.last} AKA {nick}!",
|
||||
// | {
|
||||
// | nick: "Bob",
|
||||
// | name: {
|
||||
// | first: "Robert",
|
||||
// | middle: "X",
|
||||
// | last: "Cringely"
|
||||
// | }
|
||||
// | });
|
||||
// | // returns: Hello, Robert Cringely AKA Bob!
|
||||
// example:
|
||||
// | // uses an array for substitutions:
|
||||
// | dojo.replace("Hello, {0} {2}!",
|
||||
// | ["Robert", "X", "Cringely"]);
|
||||
// | // returns: Hello, Robert Cringely!
|
||||
// example:
|
||||
// | // uses a function for substitutions:
|
||||
// | function sum(a){
|
||||
// | var t = 0;
|
||||
// | dojo.forEach(a, function(x){ t += x; });
|
||||
// | return t;
|
||||
// | }
|
||||
// | dojo.replace(
|
||||
// | "{count} payments averaging {avg} USD per payment.",
|
||||
// | dojo.hitch(
|
||||
// | { payments: [11, 16, 12] },
|
||||
// | function(_, key){
|
||||
// | switch(key){
|
||||
// | case "count": return this.payments.length;
|
||||
// | case "min": return Math.min.apply(Math, this.payments);
|
||||
// | case "max": return Math.max.apply(Math, this.payments);
|
||||
// | case "sum": return sum(this.payments);
|
||||
// | case "avg": return sum(this.payments) / this.payments.length;
|
||||
// | }
|
||||
// | }
|
||||
// | )
|
||||
// | );
|
||||
// | // prints: 3 payments averaging 13 USD per payment.
|
||||
// example:
|
||||
// | // uses an alternative PHP-like pattern for substitutions:
|
||||
// | dojo.replace("Hello, ${0} ${2}!",
|
||||
// | ["Robert", "X", "Cringely"], /\$\{([^\}]+)\}/g);
|
||||
// | // returns: Hello, Robert Cringely!
|
||||
return ""; // String
|
||||
}
|
||||
=====*/
|
||||
|
||||
var _pattern = /\{([^\}]+)\}/g;
|
||||
dojo.replace = function(tmpl, map, pattern){
|
||||
return tmpl.replace(pattern || _pattern, d.isFunction(map) ?
|
||||
map : function(_, k){ return d.getObject(k, false, map); });
|
||||
};
|
||||
})();
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/_base/lang",["./kernel","../has","./sniff"],function(_1,_2){_2.add("bug-for-in-skips-shadowed",function(){for(var i in {toString:1}){return 0;}return 1;});var _3=_2("bug-for-in-skips-shadowed")?"hasOwnProperty.valueOf.isPrototypeOf.propertyIsEnumerable.toLocaleString.toString.constructor".split("."):[],_4=_3.length,_5=function(_6,_7,_8){var _9,s,i,_a={};for(_9 in _7){s=_7[_9];if(!(_9 in _6)||(_6[_9]!==s&&(!(_9 in _a)||_a[_9]!==s))){_6[_9]=_8?_8(s):s;}}if(_2("bug-for-in-skips-shadowed")){if(_7){for(i=0;i<_4;++i){_9=_3[i];s=_7[_9];if(!(_9 in _6)||(_6[_9]!==s&&(!(_9 in _a)||_a[_9]!==s))){_6[_9]=_8?_8(s):s;}}}}return _6;},_b=function(_c,_d){if(!_c){_c={};}for(var i=1,l=arguments.length;i<l;i++){_e._mixin(_c,arguments[i]);}return _c;},_f=function(_10,_11,_12){var p,i=0,_13=_1.global;if(!_12){if(!_10.length){return _13;}else{p=_10[i++];try{_12=_1.scopeMap[p]&&_1.scopeMap[p][1];}catch(e){}_12=_12||(p in _13?_13[p]:(_11?_13[p]={}:undefined));}}while(_12&&(p=_10[i++])){_12=(p in _12?_12[p]:(_11?_12[p]={}:undefined));}return _12;},_14=function(_15,_16,_17){var _18=_15.split("."),p=_18.pop(),obj=_f(_18,true,_17);return obj&&p?(obj[p]=_16):undefined;},_19=function(_1a,_1b,_1c){return _f(_1a.split("."),_1b,_1c);},_1d=function(_1e,obj){return _e.getObject(_1e,false,obj)!==undefined;},_1f=Object.prototype.toString,_20=function(it){return (typeof it=="string"||it instanceof String);},_21=function(it){return it&&(it instanceof Array||typeof it=="array");},_22=function(it){return _1f.call(it)==="[object Function]";},_23=function(it){return it!==undefined&&(it===null||typeof it=="object"||_e.isArray(it)||_e.isFunction(it));},_24=function(it){return it&&it!==undefined&&!_e.isString(it)&&!_e.isFunction(it)&&!(it.tagName&&it.tagName.toLowerCase()=="form")&&(_e.isArray(it)||isFinite(it.length));},_25=function(it){return it&&!_e.isFunction(it)&&/\{\s*\[native code\]\s*\}/.test(String(it));},_26=function(_27,_28){for(var i=1,l=arguments.length;i<l;i++){_e._mixin(_27.prototype,arguments[i]);}return _27;},_29=function(_2a,_2b){var pre=_2c(arguments,2);var _2d=_e.isString(_2b);return function(){var _2e=_2c(arguments);var f=_2d?(_2a||_1.global)[_2b]:_2b;return f&&f.apply(_2a||this,pre.concat(_2e));};},_2f=function(_30,_31){if(arguments.length>2){return _e._hitchArgs.apply(_1,arguments);}if(!_31){_31=_30;_30=null;}if(_e.isString(_31)){_30=_30||_1.global;if(!_30[_31]){throw (["dojo.hitch: scope[\"",_31,"\"] is null (scope=\"",_30,"\")"].join(""));}return function(){return _30[_31].apply(_30,arguments||[]);};}return !_30?_31:function(){return _31.apply(_30,arguments||[]);};},_32=(function(){function TMP(){};return function(obj,_33){TMP.prototype=obj;var tmp=new TMP();TMP.prototype=null;if(_33){_e._mixin(tmp,_33);}return tmp;};})(),_34=function(obj,_35,_36){return (_36||[]).concat(Array.prototype.slice.call(obj,_35||0));},_2c=_2("ie")?(function(){function _37(obj,_38,_39){var arr=_39||[];for(var x=_38||0;x<obj.length;x++){arr.push(obj[x]);}return arr;};return function(obj){return ((obj.item)?_37:_34).apply(this,arguments);};})():_34,_3a=function(_3b){var arr=[null];return _e.hitch.apply(_1,arr.concat(_e._toArray(arguments)));},_3c=function(src){if(!src||typeof src!="object"||_e.isFunction(src)){return src;}if(src.nodeType&&"cloneNode" in src){return src.cloneNode(true);}if(src instanceof Date){return new Date(src.getTime());}if(src instanceof RegExp){return new RegExp(src);}var r,i,l;if(_e.isArray(src)){r=[];for(i=0,l=src.length;i<l;++i){if(i in src){r.push(_3c(src[i]));}}}else{r=src.constructor?new src.constructor():{};}return _e._mixin(r,src,_3c);},_3d=String.prototype.trim?function(str){return str.trim();}:function(str){return str.replace(/^\s\s*/,"").replace(/\s\s*$/,"");},_3e=/\{([^\}]+)\}/g,_3f=function(_40,map,_41){return _40.replace(_41||_3e,_e.isFunction(map)?map:function(_42,k){return _19(k,false,map);});},_e={_extraNames:_3,_mixin:_5,mixin:_b,setObject:_14,getObject:_19,exists:_1d,isString:_20,isArray:_21,isFunction:_22,isObject:_23,isArrayLike:_24,isAlien:_25,extend:_26,_hitchArgs:_29,hitch:_2f,delegate:_32,_toArray:_2c,partial:_3a,clone:_3c,trim:_3d,replace:_3f};1&&_b(_1,_e);return _e;});
|
||||
707
lib/dojo/_base/lang.js.uncompressed.js
Normal file
707
lib/dojo/_base/lang.js.uncompressed.js
Normal file
@@ -0,0 +1,707 @@
|
||||
define("dojo/_base/lang", ["./kernel", "../has", "./sniff"], function(dojo, has){
|
||||
// module:
|
||||
// dojo/_base/lang
|
||||
// summary:
|
||||
// This module defines Javascript language extensions.
|
||||
|
||||
has.add("bug-for-in-skips-shadowed", function(){
|
||||
// if true, the for-in interator skips object properties that exist in Object's prototype (IE 6 - ?)
|
||||
for(var i in {toString: 1}){
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
});
|
||||
|
||||
var _extraNames =
|
||||
has("bug-for-in-skips-shadowed") ?
|
||||
"hasOwnProperty.valueOf.isPrototypeOf.propertyIsEnumerable.toLocaleString.toString.constructor".split(".") : [],
|
||||
|
||||
_extraLen = _extraNames.length,
|
||||
|
||||
_mixin = function(dest, source, copyFunc){
|
||||
var name, s, i, empty = {};
|
||||
for(name in source){
|
||||
// the (!(name in empty) || empty[name] !== s) condition avoids copying properties in "source"
|
||||
// inherited from Object.prototype. For example, if dest has a custom toString() method,
|
||||
// don't overwrite it with the toString() method that source inherited from Object.prototype
|
||||
s = source[name];
|
||||
if(!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))){
|
||||
dest[name] = copyFunc ? copyFunc(s) : s;
|
||||
}
|
||||
}
|
||||
|
||||
if(has("bug-for-in-skips-shadowed")){
|
||||
if(source){
|
||||
for(i = 0; i < _extraLen; ++i){
|
||||
name = _extraNames[i];
|
||||
s = source[name];
|
||||
if(!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))){
|
||||
dest[name] = copyFunc ? copyFunc(s) : s;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return dest; // Object
|
||||
},
|
||||
|
||||
mixin = function(dest, sources){
|
||||
if(!dest){ dest = {}; }
|
||||
for(var i = 1, l = arguments.length; i < l; i++){
|
||||
lang._mixin(dest, arguments[i]);
|
||||
}
|
||||
return dest; // Object
|
||||
},
|
||||
|
||||
getProp = function(/*Array*/parts, /*Boolean*/create, /*Object*/context){
|
||||
var p, i = 0, dojoGlobal = dojo.global;
|
||||
if(!context){
|
||||
if(!parts.length){
|
||||
return dojoGlobal;
|
||||
}else{
|
||||
p = parts[i++];
|
||||
try{
|
||||
context = dojo.scopeMap[p] && dojo.scopeMap[p][1];
|
||||
}catch(e){}
|
||||
context = context || (p in dojoGlobal ? dojoGlobal[p] : (create ? dojoGlobal[p] = {} : undefined));
|
||||
}
|
||||
}
|
||||
while(context && (p = parts[i++])){
|
||||
context = (p in context ? context[p] : (create ? context[p] = {} : undefined));
|
||||
}
|
||||
return context; // mixed
|
||||
},
|
||||
|
||||
setObject = function(name, value, context){
|
||||
var parts = name.split("."), p = parts.pop(), obj = getProp(parts, true, context);
|
||||
return obj && p ? (obj[p] = value) : undefined; // Object
|
||||
},
|
||||
|
||||
getObject = function(name, create, context){
|
||||
return getProp(name.split("."), create, context); // Object
|
||||
},
|
||||
|
||||
exists = function(name, obj){
|
||||
return lang.getObject(name, false, obj) !== undefined; // Boolean
|
||||
},
|
||||
|
||||
opts = Object.prototype.toString,
|
||||
|
||||
// Crockford (ish) functions
|
||||
|
||||
isString = function(it){
|
||||
return (typeof it == "string" || it instanceof String); // Boolean
|
||||
},
|
||||
|
||||
isArray = function(it){
|
||||
return it && (it instanceof Array || typeof it == "array"); // Boolean
|
||||
},
|
||||
|
||||
isFunction = function(it){
|
||||
return opts.call(it) === "[object Function]";
|
||||
},
|
||||
|
||||
isObject = function(it){
|
||||
return it !== undefined &&
|
||||
(it === null || typeof it == "object" || lang.isArray(it) || lang.isFunction(it)); // Boolean
|
||||
},
|
||||
|
||||
isArrayLike = function(it){
|
||||
return it && it !== undefined && // Boolean
|
||||
// keep out built-in constructors (Number, String, ...) which have length
|
||||
// properties
|
||||
!lang.isString(it) && !lang.isFunction(it) &&
|
||||
!(it.tagName && it.tagName.toLowerCase() == 'form') &&
|
||||
(lang.isArray(it) || isFinite(it.length));
|
||||
},
|
||||
|
||||
isAlien = function(it){
|
||||
return it && !lang.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean
|
||||
},
|
||||
|
||||
extend = function(constructor, props){
|
||||
for(var i=1, l=arguments.length; i<l; i++){
|
||||
lang._mixin(constructor.prototype, arguments[i]);
|
||||
}
|
||||
return constructor; // Object
|
||||
},
|
||||
|
||||
_hitchArgs = function(scope, method){
|
||||
var pre = _toArray(arguments, 2);
|
||||
var named = lang.isString(method);
|
||||
return function(){
|
||||
// arrayify arguments
|
||||
var args = _toArray(arguments);
|
||||
// locate our method
|
||||
var f = named ? (scope||dojo.global)[method] : method;
|
||||
// invoke with collected args
|
||||
return f && f.apply(scope || this, pre.concat(args)); // mixed
|
||||
}; // Function
|
||||
},
|
||||
|
||||
hitch = function(scope, method){
|
||||
if(arguments.length > 2){
|
||||
return lang._hitchArgs.apply(dojo, arguments); // Function
|
||||
}
|
||||
if(!method){
|
||||
method = scope;
|
||||
scope = null;
|
||||
}
|
||||
if(lang.isString(method)){
|
||||
scope = scope || dojo.global;
|
||||
if(!scope[method]){ throw(['dojo.hitch: scope["', method, '"] is null (scope="', scope, '")'].join('')); }
|
||||
return function(){ return scope[method].apply(scope, arguments || []); }; // Function
|
||||
}
|
||||
return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function
|
||||
},
|
||||
|
||||
delegate = (function(){
|
||||
// boodman/crockford delegation w/ cornford optimization
|
||||
function TMP(){}
|
||||
return function(obj, props){
|
||||
TMP.prototype = obj;
|
||||
var tmp = new TMP();
|
||||
TMP.prototype = null;
|
||||
if(props){
|
||||
lang._mixin(tmp, props);
|
||||
}
|
||||
return tmp; // Object
|
||||
};
|
||||
})(),
|
||||
|
||||
efficient = function(obj, offset, startWith){
|
||||
return (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0));
|
||||
},
|
||||
|
||||
_toArray =
|
||||
has("ie") ?
|
||||
(function(){
|
||||
function slow(obj, offset, startWith){
|
||||
var arr = startWith||[];
|
||||
for(var x = offset || 0; x < obj.length; x++){
|
||||
arr.push(obj[x]);
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
return function(obj){
|
||||
return ((obj.item) ? slow : efficient).apply(this, arguments);
|
||||
};
|
||||
})() : efficient,
|
||||
|
||||
partial = function(/*Function|String*/method /*, ...*/){
|
||||
var arr = [ null ];
|
||||
return lang.hitch.apply(dojo, arr.concat(lang._toArray(arguments))); // Function
|
||||
},
|
||||
|
||||
clone = function(/*anything*/ src){
|
||||
if(!src || typeof src != "object" || lang.isFunction(src)){
|
||||
// null, undefined, any non-object, or function
|
||||
return src; // anything
|
||||
}
|
||||
if(src.nodeType && "cloneNode" in src){
|
||||
// DOM Node
|
||||
return src.cloneNode(true); // Node
|
||||
}
|
||||
if(src instanceof Date){
|
||||
// Date
|
||||
return new Date(src.getTime()); // Date
|
||||
}
|
||||
if(src instanceof RegExp){
|
||||
// RegExp
|
||||
return new RegExp(src); // RegExp
|
||||
}
|
||||
var r, i, l;
|
||||
if(lang.isArray(src)){
|
||||
// array
|
||||
r = [];
|
||||
for(i = 0, l = src.length; i < l; ++i){
|
||||
if(i in src){
|
||||
r.push(clone(src[i]));
|
||||
}
|
||||
}
|
||||
// we don't clone functions for performance reasons
|
||||
// }else if(d.isFunction(src)){
|
||||
// // function
|
||||
// r = function(){ return src.apply(this, arguments); };
|
||||
}else{
|
||||
// generic objects
|
||||
r = src.constructor ? new src.constructor() : {};
|
||||
}
|
||||
return lang._mixin(r, src, clone);
|
||||
},
|
||||
|
||||
|
||||
trim = String.prototype.trim ?
|
||||
function(str){ return str.trim(); } :
|
||||
function(str){ return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); },
|
||||
|
||||
|
||||
_pattern = /\{([^\}]+)\}/g,
|
||||
|
||||
replace = function(tmpl, map, pattern){
|
||||
return tmpl.replace(pattern || _pattern, lang.isFunction(map) ?
|
||||
map : function(_, k){ return getObject(k, false, map); });
|
||||
},
|
||||
|
||||
lang = {
|
||||
_extraNames:_extraNames,
|
||||
_mixin:_mixin,
|
||||
mixin:mixin,
|
||||
setObject:setObject,
|
||||
getObject:getObject,
|
||||
exists:exists,
|
||||
isString:isString,
|
||||
isArray:isArray,
|
||||
isFunction:isFunction,
|
||||
isObject:isObject,
|
||||
isArrayLike:isArrayLike,
|
||||
isAlien:isAlien,
|
||||
extend:extend,
|
||||
_hitchArgs:_hitchArgs,
|
||||
hitch:hitch,
|
||||
delegate:delegate,
|
||||
_toArray:_toArray,
|
||||
partial:partial,
|
||||
clone:clone,
|
||||
trim:trim,
|
||||
replace:replace
|
||||
};
|
||||
|
||||
1 && mixin(dojo, lang);
|
||||
return lang;
|
||||
|
||||
/*=====
|
||||
dojo._extraNames
|
||||
// summary:
|
||||
// Array of strings. Lists property names that must be explicitly processed during for-in interation
|
||||
// in environments that have has("bug-for-in-skips-shadowed") true.
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo._mixin = function(dest, source, copyFunc){
|
||||
// summary:
|
||||
// Copies/adds all properties of source to dest; returns dest.
|
||||
// dest: Object:
|
||||
// The object to which to copy/add all properties contained in source.
|
||||
// source: Object:
|
||||
// The object from which to draw all properties to copy into dest.
|
||||
// copyFunc: Function?:
|
||||
// The process used to copy/add a property in source; defaults to the Javascript assignment operator.
|
||||
// returns:
|
||||
// dest, as modified
|
||||
// description:
|
||||
// All properties, including functions (sometimes termed "methods"), excluding any non-standard extensions
|
||||
// found in Object.prototype, are copied/added to dest. Copying/adding each particular property is
|
||||
// delegated to copyFunc (if any); copyFunc defaults to the Javascript assignment operator if not provided.
|
||||
// Notice that by default, _mixin executes a so-called "shallow copy" and aggregate types are copied/added by reference.
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.mixin = function(dest, sources){
|
||||
// summary:
|
||||
// Copies/adds all properties of one or more sources to dest; returns dest.
|
||||
// dest: Object
|
||||
// The object to which to copy/add all properties contained in source. If dest is falsy, then
|
||||
// a new object is manufactured before copying/adding properties begins.
|
||||
// sources: Object...
|
||||
// One of more objects from which to draw all properties to copy into dest. sources are processed
|
||||
// left-to-right and if more than one of these objects contain the same property name, the right-most
|
||||
// value "wins".
|
||||
// returns: Object
|
||||
// dest, as modified
|
||||
// description:
|
||||
// All properties, including functions (sometimes termed "methods"), excluding any non-standard extensions
|
||||
// found in Object.prototype, are copied/added from sources to dest. sources are processed left to right.
|
||||
// The Javascript assignment operator is used to copy/add each property; therefore, by default, mixin
|
||||
// executes a so-called "shallow copy" and aggregate types are copied/added by reference.
|
||||
// example:
|
||||
// make a shallow copy of an object
|
||||
// | var copy = lang.mixin({}, source);
|
||||
// example:
|
||||
// many class constructors often take an object which specifies
|
||||
// values to be configured on the object. In this case, it is
|
||||
// often simplest to call `lang.mixin` on the `this` object:
|
||||
// | dojo.declare("acme.Base", null, {
|
||||
// | constructor: function(properties){
|
||||
// | // property configuration:
|
||||
// | lang.mixin(this, properties);
|
||||
// |
|
||||
// | console.log(this.quip);
|
||||
// | // ...
|
||||
// | },
|
||||
// | quip: "I wasn't born yesterday, you know - I've seen movies.",
|
||||
// | // ...
|
||||
// | });
|
||||
// |
|
||||
// | // create an instance of the class and configure it
|
||||
// | var b = new acme.Base({quip: "That's what it does!" });
|
||||
// example:
|
||||
// copy in properties from multiple objects
|
||||
// | var flattened = lang.mixin(
|
||||
// | {
|
||||
// | name: "Frylock",
|
||||
// | braces: true
|
||||
// | },
|
||||
// | {
|
||||
// | name: "Carl Brutanananadilewski"
|
||||
// | }
|
||||
// | );
|
||||
// |
|
||||
// | // will print "Carl Brutanananadilewski"
|
||||
// | console.log(flattened.name);
|
||||
// | // will print "true"
|
||||
// | console.log(flattened.braces);
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.setObject = function(name, value, context){
|
||||
// summary:
|
||||
// Set a property from a dot-separated string, such as "A.B.C"
|
||||
// description:
|
||||
// Useful for longer api chains where you have to test each object in
|
||||
// the chain, or when you have an object reference in string format.
|
||||
// Objects are created as needed along `path`. Returns the passed
|
||||
// value if setting is successful or `undefined` if not.
|
||||
// name: String
|
||||
// Path to a property, in the form "A.B.C".
|
||||
// value: anything
|
||||
// value or object to place at location given by name
|
||||
// context: Object?
|
||||
// Optional. Object to use as root of path. Defaults to
|
||||
// `dojo.global`.
|
||||
// example:
|
||||
// set the value of `foo.bar.baz`, regardless of whether
|
||||
// intermediate objects already exist:
|
||||
// | lang.setObject("foo.bar.baz", value);
|
||||
// example:
|
||||
// without `lang.setObject`, we often see code like this:
|
||||
// | // ensure that intermediate objects are available
|
||||
// | if(!obj["parent"]){ obj.parent = {}; }
|
||||
// | if(!obj.parent["child"]){ obj.parent.child = {}; }
|
||||
// | // now we can safely set the property
|
||||
// | obj.parent.child.prop = "some value";
|
||||
// whereas with `lang.setObject`, we can shorten that to:
|
||||
// | lang.setObject("parent.child.prop", "some value", obj);
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.getObject = function(name, create, context){
|
||||
// summary:
|
||||
// Get a property from a dot-separated string, such as "A.B.C"
|
||||
// description:
|
||||
// Useful for longer api chains where you have to test each object in
|
||||
// the chain, or when you have an object reference in string format.
|
||||
// name: String
|
||||
// Path to an property, in the form "A.B.C".
|
||||
// create: Boolean?
|
||||
// Optional. Defaults to `false`. If `true`, Objects will be
|
||||
// created at any point along the 'path' that is undefined.
|
||||
// context: Object?
|
||||
// Optional. Object to use as root of path. Defaults to
|
||||
// 'dojo.global'. Null may be passed.
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.exists = function(name, obj){
|
||||
// summary:
|
||||
// determine if an object supports a given method
|
||||
// description:
|
||||
// useful for longer api chains where you have to test each object in
|
||||
// the chain. Useful for object and method detection.
|
||||
// name: String
|
||||
// Path to an object, in the form "A.B.C".
|
||||
// obj: Object?
|
||||
// Object to use as root of path. Defaults to
|
||||
// 'dojo.global'. Null may be passed.
|
||||
// example:
|
||||
// | // define an object
|
||||
// | var foo = {
|
||||
// | bar: { }
|
||||
// | };
|
||||
// |
|
||||
// | // search the global scope
|
||||
// | lang.exists("foo.bar"); // true
|
||||
// | lang.exists("foo.bar.baz"); // false
|
||||
// |
|
||||
// | // search from a particular scope
|
||||
// | lang.exists("bar", foo); // true
|
||||
// | lang.exists("bar.baz", foo); // false
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.isString = function(it){
|
||||
// summary:
|
||||
// Return true if it is a String
|
||||
// it: anything
|
||||
// Item to test.
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.isArray = function(it){
|
||||
// summary:
|
||||
// Return true if it is an Array.
|
||||
// Does not work on Arrays created in other windows.
|
||||
// it: anything
|
||||
// Item to test.
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.isFunction = function(it){
|
||||
// summary:
|
||||
// Return true if it is a Function
|
||||
// it: anything
|
||||
// Item to test.
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.isObject = function(it){
|
||||
// summary:
|
||||
// Returns true if it is a JavaScript object (or an Array, a Function
|
||||
// or null)
|
||||
// it: anything
|
||||
// Item to test.
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.isArrayLike = function(it){
|
||||
// summary:
|
||||
// similar to dojo.isArray() but more permissive
|
||||
// it: anything
|
||||
// Item to test.
|
||||
// returns:
|
||||
// If it walks like a duck and quacks like a duck, return `true`
|
||||
// description:
|
||||
// Doesn't strongly test for "arrayness". Instead, settles for "isn't
|
||||
// a string or number and has a length property". Arguments objects
|
||||
// and DOM collections will return true when passed to
|
||||
// dojo.isArrayLike(), but will return false when passed to
|
||||
// dojo.isArray().
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.isAlien = function(it){
|
||||
// summary:
|
||||
// Returns true if it is a built-in function or some other kind of
|
||||
// oddball that *should* report as a function but doesn't
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.extend = function(constructor, props){
|
||||
// summary:
|
||||
// Adds all properties and methods of props to constructor's
|
||||
// prototype, making them available to all instances created with
|
||||
// constructor.
|
||||
// constructor: Object
|
||||
// Target constructor to extend.
|
||||
// props: Object...
|
||||
// One or more objects to mix into constructor.prototype
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.hitch = function(scope, method){
|
||||
// summary:
|
||||
// Returns a function that will only ever execute in the a given scope.
|
||||
// This allows for easy use of object member functions
|
||||
// in callbacks and other places in which the "this" keyword may
|
||||
// otherwise not reference the expected scope.
|
||||
// Any number of default positional arguments may be passed as parameters
|
||||
// beyond "method".
|
||||
// Each of these values will be used to "placehold" (similar to curry)
|
||||
// for the hitched function.
|
||||
// scope: Object
|
||||
// The scope to use when method executes. If method is a string,
|
||||
// scope is also the object containing method.
|
||||
// method: Function|String...
|
||||
// A function to be hitched to scope, or the name of the method in
|
||||
// scope to be hitched.
|
||||
// example:
|
||||
// | dojo.hitch(foo, "bar")();
|
||||
// runs foo.bar() in the scope of foo
|
||||
// example:
|
||||
// | dojo.hitch(foo, myFunction);
|
||||
// returns a function that runs myFunction in the scope of foo
|
||||
// example:
|
||||
// Expansion on the default positional arguments passed along from
|
||||
// hitch. Passed args are mixed first, additional args after.
|
||||
// | var foo = { bar: function(a, b, c){ console.log(a, b, c); } };
|
||||
// | var fn = dojo.hitch(foo, "bar", 1, 2);
|
||||
// | fn(3); // logs "1, 2, 3"
|
||||
// example:
|
||||
// | var foo = { bar: 2 };
|
||||
// | dojo.hitch(foo, function(){ this.bar = 10; })();
|
||||
// execute an anonymous function in scope of foo
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.delegate = function(obj, props){
|
||||
// summary:
|
||||
// Returns a new object which "looks" to obj for properties which it
|
||||
// does not have a value for. Optionally takes a bag of properties to
|
||||
// seed the returned object with initially.
|
||||
// description:
|
||||
// This is a small implementaton of the Boodman/Crockford delegation
|
||||
// pattern in JavaScript. An intermediate object constructor mediates
|
||||
// the prototype chain for the returned object, using it to delegate
|
||||
// down to obj for property lookup when object-local lookup fails.
|
||||
// This can be thought of similarly to ES4's "wrap", save that it does
|
||||
// not act on types but rather on pure objects.
|
||||
// obj: Object
|
||||
// The object to delegate to for properties not found directly on the
|
||||
// return object or in props.
|
||||
// props: Object...
|
||||
// an object containing properties to assign to the returned object
|
||||
// returns:
|
||||
// an Object of anonymous type
|
||||
// example:
|
||||
// | var foo = { bar: "baz" };
|
||||
// | var thinger = dojo.delegate(foo, { thud: "xyzzy"});
|
||||
// | thinger.bar == "baz"; // delegated to foo
|
||||
// | foo.thud == undefined; // by definition
|
||||
// | thinger.thud == "xyzzy"; // mixed in from props
|
||||
// | foo.bar = "thonk";
|
||||
// | thinger.bar == "thonk"; // still delegated to foo's bar
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.partial = function(method){
|
||||
// summary:
|
||||
// similar to hitch() except that the scope object is left to be
|
||||
// whatever the execution context eventually becomes.
|
||||
// method: Function|String
|
||||
// description:
|
||||
// Calling dojo.partial is the functional equivalent of calling:
|
||||
// | dojo.hitch(null, funcName, ...);
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.trim = function(str){
|
||||
// summary:
|
||||
// Trims whitespace from both sides of the string
|
||||
// str: String
|
||||
// String to be trimmed
|
||||
// returns: String
|
||||
// Returns the trimmed string
|
||||
// description:
|
||||
// This version of trim() was selected for inclusion into the base due
|
||||
// to its compact size and relatively good performance
|
||||
// (see [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript)
|
||||
// Uses String.prototype.trim instead, if available.
|
||||
// The fastest but longest version of this function is located at
|
||||
// dojo.string.trim()
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.clone = function(src){
|
||||
// summary:
|
||||
// Clones objects (including DOM nodes) and all children.
|
||||
// Warning: do not clone cyclic structures.
|
||||
// src:
|
||||
// The object to clone
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo._toArray = function(obj, offset, startWith){
|
||||
// summary:
|
||||
// Converts an array-like object (i.e. arguments, DOMCollection) to an
|
||||
// array. Returns a new Array with the elements of obj.
|
||||
// obj: Object
|
||||
// the object to "arrayify". We expect the object to have, at a
|
||||
// minimum, a length property which corresponds to integer-indexed
|
||||
// properties.
|
||||
// offset: Number?
|
||||
// the location in obj to start iterating from. Defaults to 0.
|
||||
// Optional.
|
||||
// startWith: Array?
|
||||
// An array to pack with the properties of obj. If provided,
|
||||
// properties in obj are appended at the end of startWith and
|
||||
// startWith is the returned array.
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.replace = function(tmpl, map, pattern){
|
||||
// summary:
|
||||
// Performs parameterized substitutions on a string. Throws an
|
||||
// exception if any parameter is unmatched.
|
||||
// tmpl: String
|
||||
// String to be used as a template.
|
||||
// map: Object|Function
|
||||
// If an object, it is used as a dictionary to look up substitutions.
|
||||
// If a function, it is called for every substitution with following
|
||||
// parameters: a whole match, a name, an offset, and the whole template
|
||||
// string (see https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace
|
||||
// for more details).
|
||||
// pattern: RegEx?
|
||||
// Optional regular expression objects that overrides the default pattern.
|
||||
// Must be global and match one item. The default is: /\{([^\}]+)\}/g,
|
||||
// which matches patterns like that: "{xxx}", where "xxx" is any sequence
|
||||
// of characters, which doesn't include "}".
|
||||
// returns: String
|
||||
// Returns the substituted string.
|
||||
// example:
|
||||
// | // uses a dictionary for substitutions:
|
||||
// | dojo.replace("Hello, {name.first} {name.last} AKA {nick}!",
|
||||
// | {
|
||||
// | nick: "Bob",
|
||||
// | name: {
|
||||
// | first: "Robert",
|
||||
// | middle: "X",
|
||||
// | last: "Cringely"
|
||||
// | }
|
||||
// | });
|
||||
// | // returns: Hello, Robert Cringely AKA Bob!
|
||||
// example:
|
||||
// | // uses an array for substitutions:
|
||||
// | dojo.replace("Hello, {0} {2}!",
|
||||
// | ["Robert", "X", "Cringely"]);
|
||||
// | // returns: Hello, Robert Cringely!
|
||||
// example:
|
||||
// | // uses a function for substitutions:
|
||||
// | function sum(a){
|
||||
// | var t = 0;
|
||||
// | dojo.forEach(a, function(x){ t += x; });
|
||||
// | return t;
|
||||
// | }
|
||||
// | dojo.replace(
|
||||
// | "{count} payments averaging {avg} USD per payment.",
|
||||
// | dojo.hitch(
|
||||
// | { payments: [11, 16, 12] },
|
||||
// | function(_, key){
|
||||
// | switch(key){
|
||||
// | case "count": return this.payments.length;
|
||||
// | case "min": return Math.min.apply(Math, this.payments);
|
||||
// | case "max": return Math.max.apply(Math, this.payments);
|
||||
// | case "sum": return sum(this.payments);
|
||||
// | case "avg": return sum(this.payments) / this.payments.length;
|
||||
// | }
|
||||
// | }
|
||||
// | )
|
||||
// | );
|
||||
// | // prints: 3 payments averaging 13 USD per payment.
|
||||
// example:
|
||||
// | // uses an alternative PHP-like pattern for substitutions:
|
||||
// | dojo.replace("Hello, ${0} ${2}!",
|
||||
// | ["Robert", "X", "Cringely"], /\$\{([^\}]+)\}/g);
|
||||
// | // returns: Hello, Robert Cringely!
|
||||
return ""; // String
|
||||
}
|
||||
=====*/
|
||||
});
|
||||
|
||||
8
lib/dojo/_base/loader.js
Normal file
8
lib/dojo/_base/loader.js
Normal file
File diff suppressed because one or more lines are too long
718
lib/dojo/_base/loader.js.uncompressed.js
Normal file
718
lib/dojo/_base/loader.js.uncompressed.js
Normal file
@@ -0,0 +1,718 @@
|
||||
define("dojo/_base/loader", ["./kernel", "../has", "require", "module", "./json", "./lang", "./array"], function(dojo, has, require, thisModule, json, lang, array) {
|
||||
// module:
|
||||
// dojo/_base/lader
|
||||
// summary:
|
||||
// This module defines the v1.x synchronous loader API.
|
||||
|
||||
// signal the loader in sync mode...
|
||||
//>>pure-amd
|
||||
|
||||
if (!1){
|
||||
console.error("cannot load the Dojo v1.x loader with a foreign loader");
|
||||
return 0;
|
||||
}
|
||||
|
||||
var makeErrorToken = function(id){
|
||||
return {src:thisModule.id, id:id};
|
||||
},
|
||||
|
||||
slashName = function(name){
|
||||
return name.replace(/\./g, "/");
|
||||
},
|
||||
|
||||
buildDetectRe = /\/\/>>built/,
|
||||
|
||||
dojoRequireCallbacks = [],
|
||||
dojoRequireModuleStack = [],
|
||||
|
||||
dojoRequirePlugin = function(mid, require, loaded){
|
||||
dojoRequireCallbacks.push(loaded);
|
||||
array.forEach(mid.split(","), function(mid){
|
||||
var module = getModule(mid, require.module);
|
||||
dojoRequireModuleStack.push(module);
|
||||
injectModule(module);
|
||||
});
|
||||
checkDojoRequirePlugin();
|
||||
},
|
||||
|
||||
// checkDojoRequirePlugin inspects all of the modules demanded by a dojo/require!<module-list> dependency
|
||||
// to see if they have arrived. The loader does not release *any* of these modules to be instantiated
|
||||
// until *all* of these modules are on board, thereby preventing the evaluation of a module with dojo.require's
|
||||
// that reference modules that are not available.
|
||||
//
|
||||
// The algorithm works by traversing the dependency graphs (remember, there can be cycles so they are not trees)
|
||||
// of each module in the dojoRequireModuleStack array (which contains the list of modules demanded by dojo/require!).
|
||||
// The moment a single module is discovered that is missing, the algorithm gives up and indicates that not all
|
||||
// modules are on board. dojo/loadInit! and dojo/require! are ignored because there dependencies are inserted
|
||||
// directly in dojoRequireModuleStack. For example, if "your/module" module depends on "dojo/require!my/module", then
|
||||
// *both* "dojo/require!my/module" and "my/module" will be in dojoRequireModuleStack. Obviously, if "my/module"
|
||||
// is on board, then "dojo/require!my/module" is also satisfied, so the algorithm doesn't check for "dojo/require!my/module".
|
||||
//
|
||||
// Note: inserting a dojo/require!<some-module-list> dependency in the dojoRequireModuleStack achieves nothing
|
||||
// with the current algorithm; however, having such modules present makes it possible to optimize the algorithm
|
||||
//
|
||||
// Note: prior versions of this algorithm had an optimization that signaled loaded on dojo/require! dependencies
|
||||
// individually (rather than waiting for them all to be resolved). The implementation proved problematic with cycles
|
||||
// and plugins. However, it is possible to reattach that strategy in the future.
|
||||
|
||||
// a set from module-id to {undefined | 1 | 0}, where...
|
||||
// undefined => the module has not been inspected
|
||||
// 0 => the module or at least one of its dependencies has not arrived
|
||||
// 1 => the module is a loadInit! or require! plugin resource, or is currently being traversed (therefore, assume
|
||||
// OK until proven otherwise), or has been completely traversed and all dependencies have arrived
|
||||
touched,
|
||||
|
||||
traverse = function(m){
|
||||
touched[m.mid] = 1;
|
||||
for(var t, module, deps = m.deps || [], i= 0; i<deps.length; i++){
|
||||
module = deps[i];
|
||||
if(!(t = touched[module.mid])){
|
||||
if(t===0 || !traverse(module)){
|
||||
touched[m.mid] = 0;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
checkDojoRequirePlugin = function(){
|
||||
// initialize the touched hash with easy-to-compute values that help short circuit recursive algorithm;
|
||||
// recall loadInit/require plugin modules are dependencies of modules in dojoRequireModuleStack...
|
||||
// which would cause a circular dependency chain that would never be resolved if checked here
|
||||
// notice all dependencies of any particular loadInit/require plugin module will already
|
||||
// be checked since those are pushed into dojoRequireModuleStack explicitly by the
|
||||
// plugin...so if a particular loadInitPlugin module's dependencies are not really
|
||||
// on board, that *will* be detected elsewhere in the traversal.
|
||||
var module, mid;
|
||||
touched = {};
|
||||
for(mid in modules){
|
||||
module = modules[mid];
|
||||
// this could be improved by remembering the result of the regex tests
|
||||
if(module.executed || module.noReqPluginCheck){
|
||||
touched[mid] = 1;
|
||||
}else{
|
||||
if(module.noReqPluginCheck!==0){
|
||||
// tag the module as either a loadInit or require plugin or not for future reference
|
||||
module.noReqPluginCheck = /loadInit\!/.test(mid) || /require\!/.test(mid) ? 1 : 0;
|
||||
}
|
||||
if(module.noReqPluginCheck){
|
||||
touched[mid] = 1;
|
||||
}else if(module.injected!==arrived){
|
||||
// not executed, has not arrived, and is not a loadInit or require plugin resource
|
||||
touched[mid] = 0;
|
||||
}// else, leave undefined and we'll traverse the dependencies
|
||||
}
|
||||
}
|
||||
|
||||
for(var t, i = 0, end = dojoRequireModuleStack.length; i<end; i++){
|
||||
module = dojoRequireModuleStack[i];
|
||||
if(!(t = touched[module.mid])){
|
||||
if(t===0 || !traverse(module)){
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
loaderVars.holdIdle();
|
||||
var oldCallbacks = dojoRequireCallbacks;
|
||||
dojoRequireCallbacks = [];
|
||||
array.forEach(oldCallbacks, function(cb){cb(1);});
|
||||
loaderVars.releaseIdle();
|
||||
},
|
||||
|
||||
dojoLoadInitPlugin = function(mid, require, loaded){
|
||||
// mid names a module that defines a "dojo load init" bundle, an object with two properties:
|
||||
//
|
||||
// * names: a vector of module ids that give top-level names to define in the lexical scope of def
|
||||
// * def: a function that contains some some legacy loader API applications
|
||||
//
|
||||
// The point of def is to possibly cause some modules to be loaded (but not executed) by dojo/require! where the module
|
||||
// ids are possibly-determined at runtime. For example, here is dojox.gfx from v1.6 expressed as an AMD module using the dojo/loadInit
|
||||
// and dojo/require plugins.
|
||||
//
|
||||
// // dojox/gfx:
|
||||
//
|
||||
// define("*loadInit_12, {
|
||||
// names:["dojo", "dijit", "dojox"],
|
||||
// def: function(){
|
||||
// dojo.loadInit(function(){
|
||||
// var gfx = lang.getObject("dojox.gfx", true);
|
||||
//
|
||||
// //
|
||||
// // code required to set gfx properties ommitted...
|
||||
// //
|
||||
//
|
||||
// // now use the calculations to include the runtime-dependent module
|
||||
// dojo.require("dojox.gfx." + gfx.renderer);
|
||||
// });
|
||||
// }
|
||||
// });
|
||||
//
|
||||
// define(["dojo", "dojo/loadInit!" + id].concat("dojo/require!dojox/gfx/matric,dojox/gfx/_base"), function(dojo){
|
||||
// // when this AMD factory function is executed, the following modules are guaranteed downloaded but not executed:
|
||||
// // "dojox.gfx." + gfx.renderer
|
||||
// // dojox.gfx.matrix
|
||||
// // dojox.gfx._base
|
||||
// dojo.provide("dojo.gfx");
|
||||
// dojo.require("dojox.gfx.matrix");
|
||||
// dojo.require("dojox.gfx._base");
|
||||
// dojo.require("dojox.gfx." + gfx.renderer);
|
||||
// return lang.getObject("dojo.gfx");
|
||||
// });
|
||||
// })();
|
||||
//
|
||||
// The idea is to run the legacy loader API with global variables shadowed, which allows these variables to
|
||||
// be relocated. For example, dojox and dojo could be relocated to different names by giving a packageMap and the code above will
|
||||
// execute properly (because the plugin below resolves the load init bundle.names module with respect to the module that demanded
|
||||
// the plugin resource).
|
||||
//
|
||||
// Note that the relocation is specified in the runtime configuration; relocated names need not be set at build-time.
|
||||
//
|
||||
// Warning: this is not the best way to express dojox.gfx as and AMD module. In fact, the module has been properly converted in
|
||||
// v1.7. However, this technique allows the builder to convert legacy modules into AMD modules and guarantee the codepath is the
|
||||
// same in the converted AMD module.
|
||||
require([mid], function(bundle){
|
||||
// notice how names is resolved with respect to the module that demanded the plugin resource
|
||||
require(bundle.names, function(){
|
||||
// bring the bundle names into scope
|
||||
for(var scopeText = "", args= [], i = 0; i<arguments.length; i++){
|
||||
scopeText+= "var " + bundle.names[i] + "= arguments[" + i + "]; ";
|
||||
args.push(arguments[i]);
|
||||
}
|
||||
eval(scopeText);
|
||||
|
||||
var callingModule = require.module,
|
||||
deps = [],
|
||||
hold = {},
|
||||
requireList = [],
|
||||
p,
|
||||
syncLoaderApi = {
|
||||
provide:function(moduleName){
|
||||
// mark modules that arrive consequent to multiple provides in this module as arrived since they can't be injected
|
||||
moduleName = slashName(moduleName);
|
||||
var providedModule = getModule(moduleName, callingModule);
|
||||
if(providedModule!==callingModule){
|
||||
setArrived(providedModule);
|
||||
}
|
||||
},
|
||||
require:function(moduleName, omitModuleCheck){
|
||||
moduleName = slashName(moduleName);
|
||||
omitModuleCheck && (getModule(moduleName, callingModule).result = nonmodule);
|
||||
requireList.push(moduleName);
|
||||
},
|
||||
requireLocalization:function(moduleName, bundleName, locale){
|
||||
// since we're going to need dojo/i8n, add it to deps if not already there
|
||||
deps.length || (deps = ["dojo/i18n"]);
|
||||
|
||||
// figure out if the bundle is xdomain; if so, add it to the depsSet
|
||||
locale = (locale || dojo.locale).toLowerCase();
|
||||
moduleName = slashName(moduleName) + "/nls/" + (/root/i.test(locale) ? "" : locale + "/") + slashName(bundleName);
|
||||
if(getModule(moduleName, callingModule).isXd){
|
||||
deps.push("dojo/i18n!" + moduleName);
|
||||
}// else the bundle will be loaded synchronously when the module is evaluated
|
||||
},
|
||||
loadInit:function(f){
|
||||
f();
|
||||
}
|
||||
};
|
||||
|
||||
// hijack the correct dojo and apply bundle.def
|
||||
try{
|
||||
for(p in syncLoaderApi){
|
||||
hold[p] = dojo[p];
|
||||
dojo[p] = syncLoaderApi[p];
|
||||
}
|
||||
bundle.def.apply(null, args);
|
||||
}catch(e){
|
||||
signal("error", [makeErrorToken("failedDojoLoadInit"), e]);
|
||||
}finally{
|
||||
for(p in syncLoaderApi){
|
||||
dojo[p] = hold[p];
|
||||
}
|
||||
}
|
||||
|
||||
// requireList is the list of modules that need to be downloaded but not executed before the callingModule can be executed
|
||||
requireList.length && deps.push("dojo/require!" + requireList.join(","));
|
||||
|
||||
dojoRequireCallbacks.push(loaded);
|
||||
array.forEach(requireList, function(mid){
|
||||
var module = getModule(mid, require.module);
|
||||
dojoRequireModuleStack.push(module);
|
||||
injectModule(module);
|
||||
});
|
||||
checkDojoRequirePlugin();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
extractApplication = function(
|
||||
text, // the text to search
|
||||
startSearch, // the position in text to start looking for the closing paren
|
||||
startApplication // the position in text where the function application expression starts
|
||||
){
|
||||
// find end of the call by finding the matching end paren
|
||||
// Warning: as usual, this will fail in the presense of unmatched right parans contained in strings, regexs, or unremoved comments
|
||||
var parenRe = /\(|\)/g,
|
||||
matchCount = 1,
|
||||
match;
|
||||
parenRe.lastIndex = startSearch;
|
||||
while((match = parenRe.exec(text))){
|
||||
if(match[0] == ")"){
|
||||
matchCount -= 1;
|
||||
}else{
|
||||
matchCount += 1;
|
||||
}
|
||||
if(matchCount == 0){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(matchCount != 0){
|
||||
throw "unmatched paren around character " + parenRe.lastIndex + " in: " + text;
|
||||
}
|
||||
|
||||
//Put the master matching string in the results.
|
||||
return [dojo.trim(text.substring(startApplication, parenRe.lastIndex))+";\n", parenRe.lastIndex];
|
||||
},
|
||||
|
||||
// the following regex is taken from 1.6. It is a very poor technique to remove comments and
|
||||
// will fail in some cases; for example, consider the code...
|
||||
//
|
||||
// var message = "Category-1 */* Category-2";
|
||||
//
|
||||
// The regex that follows will see a /* comment and trash the code accordingly. In fact, there are all
|
||||
// kinds of cases like this with strings and regexs that will cause this design to fail miserably.
|
||||
//
|
||||
// Alternative regex designs exist that will result in less-likely failures, but will still fail in many cases.
|
||||
// The only solution guaranteed 100% correct is to parse the code and that seems overkill for this
|
||||
// backcompat/unbuilt-xdomain layer. In the end, since it's been this way for a while, we won't change it.
|
||||
// See the opening paragraphs of Chapter 7 or ECME-262 which describes the lexical abiguity further.
|
||||
removeCommentRe = /(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg,
|
||||
|
||||
syncLoaderApiRe = /(^|\s)dojo\.(loadInit|require|provide|requireLocalization|requireIf|requireAfterIf|platformRequire)\s*\(/mg,
|
||||
|
||||
amdLoaderApiRe = /(^|\s)(require|define)\s*\(/m,
|
||||
|
||||
extractLegacyApiApplications = function(text, noCommentText){
|
||||
// scan the noCommentText for any legacy loader API applications. Copy such applications into result (this is
|
||||
// used by the builder). Move dojo.loadInit applications to loadInitApplications string. Copy all other applications
|
||||
// to otherApplications string. If no applications were found, return 0, signalling an AMD module. Otherwise, return
|
||||
// loadInitApplications + otherApplications. Fixup text by replacing
|
||||
//
|
||||
// dojo.loadInit(// etc...
|
||||
//
|
||||
// with
|
||||
//
|
||||
// \n 0 && dojo.loadInit(// etc...
|
||||
//
|
||||
// Which results in the dojo.loadInit from *not* being applied. This design goes a long way towards protecting the
|
||||
// code from an over-agressive removeCommentRe. However...
|
||||
//
|
||||
// WARNING: the removeCommentRe will cause an error if a detected comment removes all or part of a legacy-loader application
|
||||
// that is not in a comment.
|
||||
|
||||
var match, startSearch, startApplication, application,
|
||||
loadInitApplications = [],
|
||||
otherApplications = [],
|
||||
allApplications = [];
|
||||
|
||||
// noCommentText may be provided by a build app with comments extracted by a better method than regex (hopefully)
|
||||
noCommentText = noCommentText || text.replace(removeCommentRe, function(match){
|
||||
// remove iff the detected comment has text that looks like a sync loader API application; this helps by
|
||||
// removing as little as possible, minimizing the changes the janky regex will kill the module
|
||||
syncLoaderApiRe.lastIndex = amdLoaderApiRe.lastIndex = 0;
|
||||
return (syncLoaderApiRe.test(match) || amdLoaderApiRe.test(match)) ? "" : match;
|
||||
});
|
||||
|
||||
// find and extract all dojo.loadInit applications
|
||||
while((match = syncLoaderApiRe.exec(noCommentText))){
|
||||
startSearch = syncLoaderApiRe.lastIndex;
|
||||
startApplication = startSearch - match[0].length;
|
||||
application = extractApplication(noCommentText, startSearch, startApplication);
|
||||
if(match[2]=="loadInit"){
|
||||
loadInitApplications.push(application[0]);
|
||||
}else{
|
||||
otherApplications.push(application[0]);
|
||||
}
|
||||
syncLoaderApiRe.lastIndex = application[1];
|
||||
}
|
||||
allApplications = loadInitApplications.concat(otherApplications);
|
||||
if(allApplications.length || !amdLoaderApiRe.test(noCommentText)){
|
||||
// either there were some legacy loader API applications or there were no AMD API applications
|
||||
return [text.replace(/(^|\s)dojo\.loadInit\s*\(/g, "\n0 && dojo.loadInit("), allApplications.join(""), allApplications];
|
||||
}else{
|
||||
// legacy loader API *was not* detected and AMD API *was* detected; therefore, assume it's an AMD module
|
||||
return 0;
|
||||
}
|
||||
},
|
||||
|
||||
transformToAmd = function(module, text){
|
||||
// This is roughly the equivalent of dojo._xdCreateResource in 1.6-; however, it expresses a v1.6- dojo
|
||||
// module in terms of AMD define instead of creating the dojo proprietary xdomain module expression.
|
||||
// The module could have originated from several sources:
|
||||
//
|
||||
// * amd require() a module, e.g., require(["my/module"])
|
||||
// * amd require() a nonmodule, e.g., require(["my/resource.js"')
|
||||
// * amd define() deps vector (always a module)
|
||||
// * dojo.require() a module, e.g. dojo.require("my.module")
|
||||
// * dojo.require() a nonmodule, e.g., dojo.require("my.module", true)
|
||||
// * dojo.requireIf/requireAfterIf/platformRequire a module
|
||||
//
|
||||
// The module is scanned for legacy loader API applications; if none are found, then assume the module is an
|
||||
// AMD module and return 0. Otherwise, a synthetic dojo/loadInit plugin resource is created and the module text
|
||||
// is rewritten as an AMD module with the single dependency of this synthetic resource. When the dojo/loadInit
|
||||
// plugin loaded the synthetic resource, it will cause all dojo.loadInit's to be executed, find all dojo.require's
|
||||
// (either directly consequent to dojo.require or indirectly consequent to dojo.require[After]If or
|
||||
// dojo.platformRequire, and finally cause loading of all dojo.required modules with the dojo/require plugin. Thus,
|
||||
// when the dojo/loadInit plugin reports it has been loaded, all modules required by the given module are guaranteed
|
||||
// loaded (but not executed). This then allows the module to execute it's code path without interupts, thereby
|
||||
// following the synchronous code path.
|
||||
|
||||
var extractResult, id, names = [], namesAsStrings = [];
|
||||
if(buildDetectRe.test(text) || !(extractResult = extractLegacyApiApplications(text))){
|
||||
// buildDetectRe.test(text) => a built module, always AMD
|
||||
// extractResult==0 => no sync API
|
||||
return 0;
|
||||
}
|
||||
|
||||
// manufacture a synthetic module id that can never be a real mdule id (just like require does)
|
||||
id = module.mid + "-*loadInit";
|
||||
|
||||
// construct the dojo/loadInit names vector which causes any relocated names to be defined as lexical variables under their not-relocated name
|
||||
// the dojo/loadInit plugin assumes the first name in names is "dojo"
|
||||
|
||||
for(var p in getModule("dojo", module).result.scopeMap){
|
||||
names.push(p);
|
||||
namesAsStrings.push('"' + p + '"');
|
||||
}
|
||||
|
||||
// rewrite the module as a synthetic dojo/loadInit plugin resource + the module expressed as an AMD module that depends on this synthetic resource
|
||||
return "// xdomain rewrite of " + module.path + "\n" +
|
||||
"define('" + id + "',{\n" +
|
||||
"\tnames:" + dojo.toJson(names) + ",\n" +
|
||||
"\tdef:function(" + names.join(",") + "){" + extractResult[1] + "}" +
|
||||
"});\n\n" +
|
||||
"define(" + dojo.toJson(names.concat(["dojo/loadInit!"+id])) + ", function(" + names.join(",") + "){\n" + extractResult[0] + "});";
|
||||
},
|
||||
|
||||
loaderVars = require.initSyncLoader(dojoRequirePlugin, checkDojoRequirePlugin, transformToAmd),
|
||||
|
||||
sync =
|
||||
loaderVars.sync,
|
||||
|
||||
xd =
|
||||
loaderVars.xd,
|
||||
|
||||
arrived =
|
||||
loaderVars.arrived,
|
||||
|
||||
nonmodule =
|
||||
loaderVars.nonmodule,
|
||||
|
||||
executing =
|
||||
loaderVars.executing,
|
||||
|
||||
executed =
|
||||
loaderVars.executed,
|
||||
|
||||
syncExecStack =
|
||||
loaderVars.syncExecStack,
|
||||
|
||||
modules =
|
||||
loaderVars.modules,
|
||||
|
||||
execQ =
|
||||
loaderVars.execQ,
|
||||
|
||||
getModule =
|
||||
loaderVars.getModule,
|
||||
|
||||
injectModule =
|
||||
loaderVars.injectModule,
|
||||
|
||||
setArrived =
|
||||
loaderVars.setArrived,
|
||||
|
||||
signal =
|
||||
loaderVars.signal,
|
||||
|
||||
finishExec =
|
||||
loaderVars.finishExec,
|
||||
|
||||
execModule =
|
||||
loaderVars.execModule,
|
||||
|
||||
getLegacyMode =
|
||||
loaderVars.getLegacyMode;
|
||||
|
||||
dojo.provide = function(mid){
|
||||
var executingModule = syncExecStack[0],
|
||||
module = lang.mixin(getModule(slashName(mid), require.module), {
|
||||
executed:executing,
|
||||
result:lang.getObject(mid, true)
|
||||
});
|
||||
setArrived(module);
|
||||
if(executingModule){
|
||||
(executingModule.provides || (executingModule.provides = [])).push(function(){
|
||||
module.result = lang.getObject(mid);
|
||||
delete module.provides;
|
||||
module.executed!==executed && finishExec(module);
|
||||
});
|
||||
}// else dojo.provide called not consequent to loading; therefore, give up trying to publish module value to loader namespace
|
||||
return module.result;
|
||||
};
|
||||
|
||||
has.add("config-publishRequireResult", 1, 0, 0);
|
||||
|
||||
dojo.require = function(moduleName, omitModuleCheck) {
|
||||
// summary:
|
||||
// loads a Javascript module from the appropriate URI
|
||||
//
|
||||
// moduleName: String
|
||||
// module name to load, using periods for separators,
|
||||
// e.g. "dojo.date.locale". Module paths are de-referenced by dojo's
|
||||
// internal mapping of locations to names and are disambiguated by
|
||||
// longest prefix. See `dojo.registerModulePath()` for details on
|
||||
// registering new modules.
|
||||
//
|
||||
// omitModuleCheck: Boolean?
|
||||
// if `true`, omitModuleCheck skips the step of ensuring that the
|
||||
// loaded file actually defines the symbol it is referenced by.
|
||||
// For example if it called as `dojo.require("a.b.c")` and the
|
||||
// file located at `a/b/c.js` does not define an object `a.b.c`,
|
||||
// and exception will be throws whereas no exception is raised
|
||||
// when called as `dojo.require("a.b.c", true)`
|
||||
//
|
||||
// description:
|
||||
// Modules are loaded via dojo.require by using one of two loaders: the normal loader
|
||||
// and the xdomain loader. The xdomain loader is used when dojo was built with a
|
||||
// custom build that specified loader=xdomain and the module lives on a modulePath
|
||||
// that is a whole URL, with protocol and a domain. The versions of Dojo that are on
|
||||
// the Google and AOL CDNs use the xdomain loader.
|
||||
//
|
||||
// If the module is loaded via the xdomain loader, it is an asynchronous load, since
|
||||
// the module is added via a dynamically created script tag. This
|
||||
// means that dojo.require() can return before the module has loaded. However, this
|
||||
// should only happen in the case where you do dojo.require calls in the top-level
|
||||
// HTML page, or if you purposely avoid the loader checking for dojo.require
|
||||
// dependencies in your module by using a syntax like dojo["require"] to load the module.
|
||||
//
|
||||
// Sometimes it is useful to not have the loader detect the dojo.require calls in the
|
||||
// module so that you can dynamically load the modules as a result of an action on the
|
||||
// page, instead of right at module load time.
|
||||
//
|
||||
// Also, for script blocks in an HTML page, the loader does not pre-process them, so
|
||||
// it does not know to download the modules before the dojo.require calls occur.
|
||||
//
|
||||
// So, in those two cases, when you want on-the-fly module loading or for script blocks
|
||||
// in the HTML page, special care must be taken if the dojo.required code is loaded
|
||||
// asynchronously. To make sure you can execute code that depends on the dojo.required
|
||||
// modules, be sure to add the code that depends on the modules in a dojo.addOnLoad()
|
||||
// callback. dojo.addOnLoad waits for all outstanding modules to finish loading before
|
||||
// executing.
|
||||
//
|
||||
// This type of syntax works with both xdomain and normal loaders, so it is good
|
||||
// practice to always use this idiom for on-the-fly code loading and in HTML script
|
||||
// blocks. If at some point you change loaders and where the code is loaded from,
|
||||
// it will all still work.
|
||||
//
|
||||
// More on how dojo.require
|
||||
// `dojo.require("A.B")` first checks to see if symbol A.B is
|
||||
// defined. If it is, it is simply returned (nothing to do).
|
||||
//
|
||||
// If it is not defined, it will look for `A/B.js` in the script root
|
||||
// directory.
|
||||
//
|
||||
// `dojo.require` throws an exception if it cannot find a file
|
||||
// to load, or if the symbol `A.B` is not defined after loading.
|
||||
//
|
||||
// It returns the object `A.B`, but note the caveats above about on-the-fly loading and
|
||||
// HTML script blocks when the xdomain loader is loading a module.
|
||||
//
|
||||
// `dojo.require()` does nothing about importing symbols into
|
||||
// the current namespace. It is presumed that the caller will
|
||||
// take care of that.
|
||||
//
|
||||
// example:
|
||||
// To use dojo.require in conjunction with dojo.ready:
|
||||
//
|
||||
// | dojo.require("foo");
|
||||
// | dojo.require("bar");
|
||||
// | dojo.addOnLoad(function(){
|
||||
// | //you can now safely do something with foo and bar
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// For example, to import all symbols into a local block, you might write:
|
||||
//
|
||||
// | with (dojo.require("A.B")) {
|
||||
// | ...
|
||||
// | }
|
||||
//
|
||||
// And to import just the leaf symbol to a local variable:
|
||||
//
|
||||
// | var B = dojo.require("A.B");
|
||||
// | ...
|
||||
//
|
||||
// returns:
|
||||
// the required namespace object
|
||||
function doRequire(mid, omitModuleCheck){
|
||||
var module = getModule(slashName(mid), require.module);
|
||||
if(syncExecStack.length && syncExecStack[0].finish){
|
||||
// switched to async loading in the middle of evaluating a legacy module; stop
|
||||
// applying dojo.require so the remaining dojo.requires are applied in order
|
||||
syncExecStack[0].finish.push(mid);
|
||||
return undefined;
|
||||
}
|
||||
|
||||
// recall module.executed has values {0, executing, executed}; therefore, truthy indicates executing or executed
|
||||
if(module.executed){
|
||||
return module.result;
|
||||
}
|
||||
omitModuleCheck && (module.result = nonmodule);
|
||||
|
||||
var currentMode = getLegacyMode();
|
||||
|
||||
// recall, in sync mode to inject is to *eval* the module text
|
||||
// if the module is a legacy module, this is the same as executing
|
||||
// but if the module is an AMD module, this means defining, not executing
|
||||
injectModule(module);
|
||||
// the inject may have changed the mode
|
||||
currentMode = getLegacyMode();
|
||||
|
||||
// in sync mode to dojo.require is to execute
|
||||
if(module.executed!==executed && module.injected===arrived){
|
||||
// the module was already here before injectModule was called probably finishing up a xdomain
|
||||
// load, but maybe a module given to the loader directly rather than having the loader retrieve it
|
||||
loaderVars.holdIdle();
|
||||
execModule(module);
|
||||
loaderVars.releaseIdle();
|
||||
}
|
||||
if(module.executed){
|
||||
return module.result;
|
||||
}
|
||||
|
||||
if(currentMode==sync){
|
||||
// the only way to get here is in sync mode and dojo.required a module that
|
||||
// * was loaded async in the injectModule application a few lines up
|
||||
// * was an AMD module that had deps that are being loaded async and therefore couldn't execute
|
||||
if(module.cjs){
|
||||
// the module was an AMD module; unshift, not push, which causes the current traversal to be reattempted from the top
|
||||
execQ.unshift(module);
|
||||
}else{
|
||||
// the module was a legacy module
|
||||
syncExecStack.length && (syncExecStack[0].finish= [mid]);
|
||||
}
|
||||
}else{
|
||||
// the loader wasn't in sync mode on entry; probably async mode; therefore, no expectation of getting
|
||||
// the module value synchronously; make sure it gets executed though
|
||||
execQ.push(module);
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
var result = doRequire(moduleName, omitModuleCheck);
|
||||
if(has("config-publishRequireResult") && !lang.exists(moduleName) && result!==undefined){
|
||||
lang.setObject(moduleName, result);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
dojo.loadInit = function(f) {
|
||||
f();
|
||||
};
|
||||
|
||||
dojo.registerModulePath = function(/*String*/moduleName, /*String*/prefix){
|
||||
// summary:
|
||||
// Maps a module name to a path
|
||||
// description:
|
||||
// An unregistered module is given the default path of ../[module],
|
||||
// relative to Dojo root. For example, module acme is mapped to
|
||||
// ../acme. If you want to use a different module name, use
|
||||
// dojo.registerModulePath.
|
||||
// example:
|
||||
// If your dojo.js is located at this location in the web root:
|
||||
// | /myapp/js/dojo/dojo/dojo.js
|
||||
// and your modules are located at:
|
||||
// | /myapp/js/foo/bar.js
|
||||
// | /myapp/js/foo/baz.js
|
||||
// | /myapp/js/foo/thud/xyzzy.js
|
||||
// Your application can tell Dojo to locate the "foo" namespace by calling:
|
||||
// | dojo.registerModulePath("foo", "../../foo");
|
||||
// At which point you can then use dojo.require() to load the
|
||||
// modules (assuming they provide() the same things which are
|
||||
// required). The full code might be:
|
||||
// | <script type="text/javascript"
|
||||
// | src="/myapp/js/dojo/dojo/dojo.js"></script>
|
||||
// | <script type="text/javascript">
|
||||
// | dojo.registerModulePath("foo", "../../foo");
|
||||
// | dojo.require("foo.bar");
|
||||
// | dojo.require("foo.baz");
|
||||
// | dojo.require("foo.thud.xyzzy");
|
||||
// | </script>
|
||||
|
||||
var paths = {};
|
||||
paths[moduleName.replace(/\./g, "/")] = prefix;
|
||||
require({paths:paths});
|
||||
};
|
||||
|
||||
dojo.platformRequire = function(/*Object*/modMap){
|
||||
// summary:
|
||||
// require one or more modules based on which host environment
|
||||
// Dojo is currently operating in
|
||||
// description:
|
||||
// This method takes a "map" of arrays which one can use to
|
||||
// optionally load dojo modules. The map is indexed by the
|
||||
// possible dojo.name_ values, with two additional values:
|
||||
// "default" and "common". The items in the "default" array will
|
||||
// be loaded if none of the other items have been choosen based on
|
||||
// dojo.name_, set by your host environment. The items in the
|
||||
// "common" array will *always* be loaded, regardless of which
|
||||
// list is chosen.
|
||||
// example:
|
||||
// | dojo.platformRequire({
|
||||
// | browser: [
|
||||
// | "foo.sample", // simple module
|
||||
// | "foo.test",
|
||||
// | ["foo.bar.baz", true] // skip object check in _loadModule (dojo.require)
|
||||
// | ],
|
||||
// | default: [ "foo.sample._base" ],
|
||||
// | common: [ "important.module.common" ]
|
||||
// | });
|
||||
|
||||
var result = (modMap.common || []).concat(modMap[dojo._name] || modMap["default"] || []),
|
||||
temp;
|
||||
while(result.length){
|
||||
if(lang.isArray(temp = result.shift())){
|
||||
dojo.require.apply(dojo, temp);
|
||||
}else{
|
||||
dojo.require(temp);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
dojo.requireIf = dojo.requireAfterIf = function(/*Boolean*/ condition, /*String*/ moduleName, /*Boolean?*/omitModuleCheck){
|
||||
// summary:
|
||||
// If the condition is true then call `dojo.require()` for the specified
|
||||
// resource
|
||||
//
|
||||
// example:
|
||||
// | dojo.requireIf(dojo.isBrowser, "my.special.Module");
|
||||
|
||||
if(condition){
|
||||
dojo.require(moduleName, omitModuleCheck);
|
||||
}
|
||||
};
|
||||
|
||||
dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale){
|
||||
require(["../i18n"], function(i18n){
|
||||
i18n.getLocalization(moduleName, bundleName, locale);
|
||||
});
|
||||
};
|
||||
|
||||
return {
|
||||
extractLegacyApiApplications:extractLegacyApiApplications,
|
||||
require:loaderVars.dojoRequirePlugin,
|
||||
loadInit:dojoLoadInitPlugin
|
||||
};
|
||||
});
|
||||
@@ -1,877 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base.query"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base.query"] = true;
|
||||
/*!
|
||||
* Sizzle CSS Selector Engine - v0.9
|
||||
* Copyright 2009, John Resig
|
||||
* Redistributed with the Dojo Toolkit under the terms of the New BSD license.
|
||||
* More information: http://sizzlejs.com/
|
||||
*
|
||||
* This version from github, dated 1/23/2009, commit: e374a73bbffc12ec3b5f252e7f76e593c508dfa5
|
||||
* Modified for dojo loader, and to fit into dojo namespace. This was done by passing
|
||||
* dojo object to anonymous function, then assigning Sizzle to dojo.Sizzle instead of window.Sizzle.
|
||||
* Then an alias for dojo.query and dojo._filterQueryResult(). dojo.psuedos is not mapped.
|
||||
* Finally, dojo.provide/require added.
|
||||
*/
|
||||
|
||||
var startDojoMappings= function(dojo) {
|
||||
//Start Dojo mappings.
|
||||
dojo.query = function(/*String*/ query, /*String|DOMNode?*/ root, /*Function?*/listCtor){
|
||||
listCtor = listCtor || dojo.NodeList;
|
||||
|
||||
if(!query){
|
||||
return new listCtor();
|
||||
}
|
||||
|
||||
if(query.constructor == listCtor){
|
||||
return query;
|
||||
}
|
||||
if(!dojo.isString(query)){
|
||||
return new listCtor(query); // dojo.NodeList
|
||||
}
|
||||
if(dojo.isString(root)){
|
||||
root = dojo.byId(root);
|
||||
if(!root){ return new listCtor(); }
|
||||
}
|
||||
|
||||
return dojo.Sizzle(query, root, new listCtor());
|
||||
};
|
||||
|
||||
dojo._filterQueryResult = function(nodeList, simpleFilter){
|
||||
return dojo.Sizzle.filter(simpleFilter, nodeList);
|
||||
};
|
||||
};
|
||||
|
||||
//Main Sizzle code follows...
|
||||
//ns argument, added for dojo, used at the end of the file.
|
||||
var defineSizzle= function(ns){
|
||||
|
||||
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,
|
||||
done = 0,
|
||||
toString = Object.prototype.toString;
|
||||
|
||||
var Sizzle = function(selector, context, results, seed) {
|
||||
results = results || [];
|
||||
context = context || document;
|
||||
|
||||
if ( context.nodeType !== 1 && context.nodeType !== 9 )
|
||||
return [];
|
||||
|
||||
if ( !selector || typeof selector !== "string" ) {
|
||||
return results;
|
||||
}
|
||||
|
||||
var parts = [], m, set, checkSet, check, mode, extra, prune = true;
|
||||
|
||||
// Reset the position of the chunker regexp (start from head)
|
||||
chunker.lastIndex = 0;
|
||||
|
||||
while ( (m = chunker.exec(selector)) !== null ) {
|
||||
parts.push( m[1] );
|
||||
|
||||
if ( m[2] ) {
|
||||
extra = RegExp.rightContext;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( parts.length > 1 && Expr.match.POS.exec( selector ) ) {
|
||||
if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
|
||||
var later = "", match;
|
||||
|
||||
// Position selectors must be done after the filter
|
||||
while ( (match = Expr.match.POS.exec( selector )) ) {
|
||||
later += match[0];
|
||||
selector = selector.replace( Expr.match.POS, "" );
|
||||
}
|
||||
|
||||
set = Sizzle.filter( later, Sizzle( selector, context ) );
|
||||
} else {
|
||||
set = Expr.relative[ parts[0] ] ?
|
||||
[ context ] :
|
||||
Sizzle( parts.shift(), context );
|
||||
|
||||
while ( parts.length ) {
|
||||
var tmpSet = [];
|
||||
|
||||
selector = parts.shift();
|
||||
if ( Expr.relative[ selector ] )
|
||||
selector += parts.shift();
|
||||
|
||||
for ( var i = 0, l = set.length; i < l; i++ ) {
|
||||
Sizzle( selector, set[i], tmpSet );
|
||||
}
|
||||
|
||||
set = tmpSet;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
var ret = seed ?
|
||||
{ expr: parts.pop(), set: makeArray(seed) } :
|
||||
Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context );
|
||||
set = Sizzle.filter( ret.expr, ret.set );
|
||||
|
||||
if ( parts.length > 0 ) {
|
||||
checkSet = makeArray(set);
|
||||
} else {
|
||||
prune = false;
|
||||
}
|
||||
|
||||
while ( parts.length ) {
|
||||
var cur = parts.pop(), pop = cur;
|
||||
|
||||
if ( !Expr.relative[ cur ] ) {
|
||||
cur = "";
|
||||
} else {
|
||||
pop = parts.pop();
|
||||
}
|
||||
|
||||
if ( pop == null ) {
|
||||
pop = context;
|
||||
}
|
||||
|
||||
Expr.relative[ cur ]( checkSet, pop );
|
||||
}
|
||||
}
|
||||
|
||||
if ( !checkSet ) {
|
||||
checkSet = set;
|
||||
}
|
||||
|
||||
if ( !checkSet ) {
|
||||
throw "Syntax error, unrecognized expression: " + (cur || selector);
|
||||
}
|
||||
|
||||
if ( toString.call(checkSet) === "[object Array]" ) {
|
||||
if ( !prune ) {
|
||||
results.push.apply( results, checkSet );
|
||||
} else if ( context.nodeType === 1 ) {
|
||||
for ( var i = 0; checkSet[i] != null; i++ ) {
|
||||
if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
|
||||
results.push( set[i] );
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for ( var i = 0; checkSet[i] != null; i++ ) {
|
||||
if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
|
||||
results.push( set[i] );
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
makeArray( checkSet, results );
|
||||
}
|
||||
|
||||
if ( extra ) {
|
||||
Sizzle( extra, context, results, seed );
|
||||
}
|
||||
|
||||
return results;
|
||||
};
|
||||
|
||||
Sizzle.matches = function(expr, set){
|
||||
return Sizzle(expr, null, null, set);
|
||||
};
|
||||
|
||||
Sizzle.find = function(expr, context){
|
||||
var set, match;
|
||||
|
||||
if ( !expr ) {
|
||||
return [];
|
||||
}
|
||||
|
||||
for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
|
||||
var type = Expr.order[i], match;
|
||||
|
||||
if ( (match = Expr.match[ type ].exec( expr )) ) {
|
||||
var left = RegExp.leftContext;
|
||||
|
||||
if ( left.substr( left.length - 1 ) !== "\\" ) {
|
||||
match[1] = (match[1] || "").replace(/\\/g, "");
|
||||
set = Expr.find[ type ]( match, context );
|
||||
if ( set != null ) {
|
||||
expr = expr.replace( Expr.match[ type ], "" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !set ) {
|
||||
set = context.getElementsByTagName("*");
|
||||
}
|
||||
|
||||
return {set: set, expr: expr};
|
||||
};
|
||||
|
||||
Sizzle.filter = function(expr, set, inplace, not){
|
||||
var old = expr, result = [], curLoop = set, match, anyFound;
|
||||
|
||||
while ( expr && set.length ) {
|
||||
for ( var type in Expr.filter ) {
|
||||
if ( (match = Expr.match[ type ].exec( expr )) != null ) {
|
||||
var filter = Expr.filter[ type ], goodArray = null, goodPos = 0, found, item;
|
||||
anyFound = false;
|
||||
|
||||
if ( curLoop == result ) {
|
||||
result = [];
|
||||
}
|
||||
|
||||
if ( Expr.preFilter[ type ] ) {
|
||||
match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not );
|
||||
|
||||
if ( !match ) {
|
||||
anyFound = found = true;
|
||||
} else if ( match[0] === true ) {
|
||||
goodArray = [];
|
||||
var last = null, elem;
|
||||
for ( var i = 0; (elem = curLoop[i]) !== undefined; i++ ) {
|
||||
if ( elem && last !== elem ) {
|
||||
goodArray.push( elem );
|
||||
last = elem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( match ) {
|
||||
for ( var i = 0; (item = curLoop[i]) !== undefined; i++ ) {
|
||||
if ( item ) {
|
||||
if ( goodArray && item != goodArray[goodPos] ) {
|
||||
goodPos++;
|
||||
}
|
||||
|
||||
found = filter( item, match, goodPos, goodArray );
|
||||
var pass = not ^ !!found;
|
||||
|
||||
if ( inplace && found != null ) {
|
||||
if ( pass ) {
|
||||
anyFound = true;
|
||||
} else {
|
||||
curLoop[i] = false;
|
||||
}
|
||||
} else if ( pass ) {
|
||||
result.push( item );
|
||||
anyFound = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( found !== undefined ) {
|
||||
if ( !inplace ) {
|
||||
curLoop = result;
|
||||
}
|
||||
|
||||
expr = expr.replace( Expr.match[ type ], "" );
|
||||
|
||||
if ( !anyFound ) {
|
||||
return [];
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
expr = expr.replace(/\s*,\s*/, "");
|
||||
|
||||
// Improper expression
|
||||
if ( expr == old ) {
|
||||
if ( anyFound == null ) {
|
||||
throw "Syntax error, unrecognized expression: " + expr;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
old = expr;
|
||||
}
|
||||
|
||||
return curLoop;
|
||||
};
|
||||
|
||||
var Expr = Sizzle.selectors = {
|
||||
order: [ "ID", "NAME", "TAG" ],
|
||||
match: {
|
||||
ID: /#((?:[\w\u0128-\uFFFF_-]|\\.)+)/,
|
||||
CLASS: /\.((?:[\w\u0128-\uFFFF_-]|\\.)+)/,
|
||||
NAME: /\[name=['"]*((?:[\w\u0128-\uFFFF_-]|\\.)+)['"]*\]/,
|
||||
ATTR: /\[((?:[\w\u0128-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\]/,
|
||||
TAG: /^((?:[\w\u0128-\uFFFF\*_-]|\\.)+)/,
|
||||
CHILD: /:(only|nth|last|first)-child\(?(even|odd|[\dn+-]*)\)?/,
|
||||
POS: /:(nth|eq|gt|lt|first|last|even|odd)\(?(\d*)\)?(?:[^-]|$)/,
|
||||
PSEUDO: /:((?:[\w\u0128-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
|
||||
},
|
||||
attrMap: {
|
||||
"class": "className",
|
||||
"for": "htmlFor"
|
||||
},
|
||||
relative: {
|
||||
"+": function(checkSet, part){
|
||||
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
|
||||
var elem = checkSet[i];
|
||||
if ( elem ) {
|
||||
var cur = elem.previousSibling;
|
||||
while ( cur && cur.nodeType !== 1 ) {
|
||||
cur = cur.previousSibling;
|
||||
}
|
||||
checkSet[i] = typeof part === "string" ?
|
||||
cur || false :
|
||||
cur === part;
|
||||
}
|
||||
}
|
||||
|
||||
if ( typeof part === "string" ) {
|
||||
Sizzle.filter( part, checkSet, true );
|
||||
}
|
||||
},
|
||||
">": function(checkSet, part){
|
||||
if ( typeof part === "string" && !/\W/.test(part) ) {
|
||||
part = part.toUpperCase();
|
||||
|
||||
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
|
||||
var elem = checkSet[i];
|
||||
if ( elem ) {
|
||||
var parent = elem.parentNode;
|
||||
checkSet[i] = parent.nodeName === part ? parent : false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
|
||||
var elem = checkSet[i];
|
||||
if ( elem ) {
|
||||
checkSet[i] = typeof part === "string" ?
|
||||
elem.parentNode :
|
||||
elem.parentNode === part;
|
||||
}
|
||||
}
|
||||
|
||||
if ( typeof part === "string" ) {
|
||||
Sizzle.filter( part, checkSet, true );
|
||||
}
|
||||
}
|
||||
},
|
||||
"": function(checkSet, part){
|
||||
var doneName = "done" + (done++), checkFn = dirCheck;
|
||||
|
||||
if ( !part.match(/\W/) ) {
|
||||
var nodeCheck = part = part.toUpperCase();
|
||||
checkFn = dirNodeCheck;
|
||||
}
|
||||
|
||||
checkFn("parentNode", part, doneName, checkSet, nodeCheck);
|
||||
},
|
||||
"~": function(checkSet, part){
|
||||
var doneName = "done" + (done++), checkFn = dirCheck;
|
||||
|
||||
if ( typeof part === "string" && !part.match(/\W/) ) {
|
||||
var nodeCheck = part = part.toUpperCase();
|
||||
checkFn = dirNodeCheck;
|
||||
}
|
||||
|
||||
checkFn("previousSibling", part, doneName, checkSet, nodeCheck);
|
||||
}
|
||||
},
|
||||
find: {
|
||||
ID: function(match, context){
|
||||
if ( context.getElementById ) {
|
||||
var m = context.getElementById(match[1]);
|
||||
return m ? [m] : [];
|
||||
}
|
||||
},
|
||||
NAME: function(match, context){
|
||||
return context.getElementsByName ? context.getElementsByName(match[1]) : null;
|
||||
},
|
||||
TAG: function(match, context){
|
||||
return context.getElementsByTagName(match[1]);
|
||||
}
|
||||
},
|
||||
preFilter: {
|
||||
CLASS: function(match, curLoop, inplace, result, not){
|
||||
match = " " + match[1].replace(/\\/g, "") + " ";
|
||||
|
||||
for ( var i = 0; curLoop[i]; i++ ) {
|
||||
if ( not ^ (" " + curLoop[i].className + " ").indexOf(match) >= 0 ) {
|
||||
if ( !inplace )
|
||||
result.push( curLoop[i] );
|
||||
} else if ( inplace ) {
|
||||
curLoop[i] = false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
ID: function(match){
|
||||
return match[1];
|
||||
},
|
||||
TAG: function(match){
|
||||
return match[1].toUpperCase();
|
||||
},
|
||||
CHILD: function(match){
|
||||
if ( match[1] == "nth" ) {
|
||||
// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
|
||||
var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
|
||||
match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
|
||||
!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
|
||||
|
||||
// calculate the numbers (first)n+(last) including if they are negative
|
||||
match[2] = (test[1] + (test[2] || 1)) - 0;
|
||||
match[3] = test[3] - 0;
|
||||
}
|
||||
|
||||
// TODO: Move to normal caching system
|
||||
match[0] = "done" + (done++);
|
||||
|
||||
return match;
|
||||
},
|
||||
ATTR: function(match){
|
||||
var name = match[1];
|
||||
|
||||
if ( Expr.attrMap[name] ) {
|
||||
match[1] = Expr.attrMap[name];
|
||||
}
|
||||
|
||||
if ( match[2] === "~=" ) {
|
||||
match[4] = " " + match[4] + " ";
|
||||
}
|
||||
|
||||
return match;
|
||||
},
|
||||
PSEUDO: function(match, curLoop, inplace, result, not){
|
||||
if ( match[1] === "not" ) {
|
||||
// If we're dealing with a complex expression, or a simple one
|
||||
if ( match[3].match(chunker).length > 1 ) {
|
||||
match[3] = Sizzle(match[3], null, null, curLoop);
|
||||
} else {
|
||||
var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
|
||||
if ( !inplace ) {
|
||||
result.push.apply( result, ret );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return match;
|
||||
},
|
||||
POS: function(match){
|
||||
match.unshift( true );
|
||||
return match;
|
||||
}
|
||||
},
|
||||
filters: {
|
||||
enabled: function(elem){
|
||||
return elem.disabled === false && elem.type !== "hidden";
|
||||
},
|
||||
disabled: function(elem){
|
||||
return elem.disabled === true;
|
||||
},
|
||||
checked: function(elem){
|
||||
return elem.checked === true;
|
||||
},
|
||||
selected: function(elem){
|
||||
// Accessing this property makes selected-by-default
|
||||
// options in Safari work properly
|
||||
elem.parentNode.selectedIndex;
|
||||
return elem.selected === true;
|
||||
},
|
||||
parent: function(elem){
|
||||
return !!elem.firstChild;
|
||||
},
|
||||
empty: function(elem){
|
||||
return !elem.firstChild;
|
||||
},
|
||||
has: function(elem, i, match){
|
||||
return !!Sizzle( match[3], elem ).length;
|
||||
},
|
||||
header: function(elem){
|
||||
return /h\d/i.test( elem.nodeName );
|
||||
},
|
||||
text: function(elem){
|
||||
return "text" === elem.type;
|
||||
},
|
||||
radio: function(elem){
|
||||
return "radio" === elem.type;
|
||||
},
|
||||
checkbox: function(elem){
|
||||
return "checkbox" === elem.type;
|
||||
},
|
||||
file: function(elem){
|
||||
return "file" === elem.type;
|
||||
},
|
||||
password: function(elem){
|
||||
return "password" === elem.type;
|
||||
},
|
||||
submit: function(elem){
|
||||
return "submit" === elem.type;
|
||||
},
|
||||
image: function(elem){
|
||||
return "image" === elem.type;
|
||||
},
|
||||
reset: function(elem){
|
||||
return "reset" === elem.type;
|
||||
},
|
||||
button: function(elem){
|
||||
return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
|
||||
},
|
||||
input: function(elem){
|
||||
return /input|select|textarea|button/i.test(elem.nodeName);
|
||||
}
|
||||
},
|
||||
setFilters: {
|
||||
first: function(elem, i){
|
||||
return i === 0;
|
||||
},
|
||||
last: function(elem, i, match, array){
|
||||
return i === array.length - 1;
|
||||
},
|
||||
even: function(elem, i){
|
||||
return i % 2 === 0;
|
||||
},
|
||||
odd: function(elem, i){
|
||||
return i % 2 === 1;
|
||||
},
|
||||
lt: function(elem, i, match){
|
||||
return i < match[3] - 0;
|
||||
},
|
||||
gt: function(elem, i, match){
|
||||
return i > match[3] - 0;
|
||||
},
|
||||
nth: function(elem, i, match){
|
||||
return match[3] - 0 == i;
|
||||
},
|
||||
eq: function(elem, i, match){
|
||||
return match[3] - 0 == i;
|
||||
}
|
||||
},
|
||||
filter: {
|
||||
CHILD: function(elem, match){
|
||||
var type = match[1], parent = elem.parentNode;
|
||||
|
||||
var doneName = match[0];
|
||||
|
||||
if ( parent && !parent[ doneName ] ) {
|
||||
var count = 1;
|
||||
|
||||
for ( var node = parent.firstChild; node; node = node.nextSibling ) {
|
||||
if ( node.nodeType == 1 ) {
|
||||
node.nodeIndex = count++;
|
||||
}
|
||||
}
|
||||
|
||||
parent[ doneName ] = count - 1;
|
||||
}
|
||||
|
||||
if ( type == "first" ) {
|
||||
return elem.nodeIndex == 1;
|
||||
} else if ( type == "last" ) {
|
||||
return elem.nodeIndex == parent[ doneName ];
|
||||
} else if ( type == "only" ) {
|
||||
return parent[ doneName ] == 1;
|
||||
} else if ( type == "nth" ) {
|
||||
var add = false, first = match[2], last = match[3];
|
||||
|
||||
if ( first == 1 && last == 0 ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( first == 0 ) {
|
||||
if ( elem.nodeIndex == last ) {
|
||||
add = true;
|
||||
}
|
||||
} else if ( (elem.nodeIndex - last) % first == 0 && (elem.nodeIndex - last) / first >= 0 ) {
|
||||
add = true;
|
||||
}
|
||||
|
||||
return add;
|
||||
}
|
||||
},
|
||||
PSEUDO: function(elem, match, i, array){
|
||||
var name = match[1], filter = Expr.filters[ name ];
|
||||
|
||||
if ( filter ) {
|
||||
return filter( elem, i, match, array );
|
||||
} else if ( name === "contains" ) {
|
||||
return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
|
||||
} else if ( name === "not" ) {
|
||||
var not = match[3];
|
||||
|
||||
for ( var i = 0, l = not.length; i < l; i++ ) {
|
||||
if ( not[i] === elem ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
},
|
||||
ID: function(elem, match){
|
||||
return elem.nodeType === 1 && elem.getAttribute("id") === match;
|
||||
},
|
||||
TAG: function(elem, match){
|
||||
return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
|
||||
},
|
||||
CLASS: function(elem, match){
|
||||
return match.test( elem.className );
|
||||
},
|
||||
ATTR: function(elem, match){
|
||||
var result = elem[ match[1] ] || elem.getAttribute( match[1] ), value = result + "", type = match[2], check = match[4];
|
||||
return result == null ?
|
||||
false :
|
||||
type === "=" ?
|
||||
value === check :
|
||||
type === "*=" ?
|
||||
value.indexOf(check) >= 0 :
|
||||
type === "~=" ?
|
||||
(" " + value + " ").indexOf(check) >= 0 :
|
||||
!match[4] ?
|
||||
result :
|
||||
type === "!=" ?
|
||||
value != check :
|
||||
type === "^=" ?
|
||||
value.indexOf(check) === 0 :
|
||||
type === "$=" ?
|
||||
value.substr(value.length - check.length) === check :
|
||||
type === "|=" ?
|
||||
value === check || value.substr(0, check.length + 1) === check + "-" :
|
||||
false;
|
||||
},
|
||||
POS: function(elem, match, i, array){
|
||||
var name = match[2], filter = Expr.setFilters[ name ];
|
||||
|
||||
if ( filter ) {
|
||||
return filter( elem, i, match, array );
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
for ( var type in Expr.match ) {
|
||||
Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
|
||||
}
|
||||
|
||||
var makeArray = function(array, results) {
|
||||
array = Array.prototype.slice.call( array );
|
||||
|
||||
if ( results ) {
|
||||
results.push.apply( results, array );
|
||||
return results;
|
||||
}
|
||||
|
||||
return array;
|
||||
};
|
||||
|
||||
// Perform a simple check to determine if the browser is capable of
|
||||
// converting a NodeList to an array using builtin methods.
|
||||
try {
|
||||
Array.prototype.slice.call( document.documentElement.childNodes );
|
||||
|
||||
// Provide a fallback method if it does not work
|
||||
} catch(e){
|
||||
makeArray = function(array, results) {
|
||||
var ret = results || [];
|
||||
|
||||
if ( toString.call(array) === "[object Array]" ) {
|
||||
Array.prototype.push.apply( ret, array );
|
||||
} else {
|
||||
if ( typeof array.length === "number" ) {
|
||||
for ( var i = 0, l = array.length; i < l; i++ ) {
|
||||
ret.push( array[i] );
|
||||
}
|
||||
} else {
|
||||
for ( var i = 0; array[i]; i++ ) {
|
||||
ret.push( array[i] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
};
|
||||
}
|
||||
|
||||
// Check to see if the browser returns elements by name when
|
||||
// querying by getElementById (and provide a workaround)
|
||||
(function(){
|
||||
// We're going to inject a fake input element with a specified name
|
||||
var form = document.createElement("form"),
|
||||
id = "script" + (new Date).getTime();
|
||||
form.innerHTML = "<input name='" + id + "'/>";
|
||||
|
||||
// Inject it into the root element, check its status, and remove it quickly
|
||||
var root = document.documentElement;
|
||||
root.insertBefore( form, root.firstChild );
|
||||
|
||||
// The workaround has to do additional checks after a getElementById
|
||||
// Which slows things down for other browsers (hence the branching)
|
||||
if ( !!document.getElementById( id ) ) {
|
||||
Expr.find.ID = function(match, context){
|
||||
if ( context.getElementById ) {
|
||||
var m = context.getElementById(match[1]);
|
||||
return m ? m.id === match[1] || m.getAttributeNode && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
|
||||
}
|
||||
};
|
||||
|
||||
Expr.filter.ID = function(elem, match){
|
||||
var node = elem.getAttributeNode && elem.getAttributeNode("id");
|
||||
return elem.nodeType === 1 && node && node.nodeValue === match;
|
||||
};
|
||||
}
|
||||
|
||||
root.removeChild( form );
|
||||
})();
|
||||
|
||||
// Check to see if the browser returns only elements
|
||||
// when doing getElementsByTagName("*")
|
||||
(function(){
|
||||
// Create a fake element
|
||||
var div = document.createElement("div");
|
||||
div.appendChild( document.createComment("") );
|
||||
|
||||
// Make sure no comments are found
|
||||
if ( div.getElementsByTagName("*").length > 0 ) {
|
||||
Expr.find.TAG = function(match, context){
|
||||
var results = context.getElementsByTagName(match[1]);
|
||||
|
||||
// Filter out possible comments
|
||||
if ( match[1] === "*" ) {
|
||||
var tmp = [];
|
||||
|
||||
for ( var i = 0; results[i]; i++ ) {
|
||||
if ( results[i].nodeType === 1 ) {
|
||||
tmp.push( results[i] );
|
||||
}
|
||||
}
|
||||
|
||||
results = tmp;
|
||||
}
|
||||
|
||||
return results;
|
||||
};
|
||||
}
|
||||
})();
|
||||
|
||||
if ( document.querySelectorAll ) (function(){
|
||||
var oldSizzle = Sizzle;
|
||||
|
||||
Sizzle = function(query, context, extra, seed){
|
||||
context = context || document;
|
||||
|
||||
if ( !seed && context.nodeType === 9 ) {
|
||||
try {
|
||||
return makeArray( context.querySelectorAll(query), extra );
|
||||
} catch(e){}
|
||||
}
|
||||
|
||||
return oldSizzle(query, context, extra, seed);
|
||||
};
|
||||
|
||||
Sizzle.find = oldSizzle.find;
|
||||
Sizzle.filter = oldSizzle.filter;
|
||||
Sizzle.selectors = oldSizzle.selectors;
|
||||
Sizzle.matches = oldSizzle.matches;
|
||||
})();
|
||||
|
||||
if ( document.documentElement.getElementsByClassName ) {
|
||||
Expr.order.splice(1, 0, "CLASS");
|
||||
Expr.find.CLASS = function(match, context) {
|
||||
return context.getElementsByClassName(match[1]);
|
||||
};
|
||||
}
|
||||
|
||||
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck ) {
|
||||
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
|
||||
var elem = checkSet[i];
|
||||
if ( elem ) {
|
||||
elem = elem[dir];
|
||||
var match = false;
|
||||
|
||||
while ( elem && elem.nodeType ) {
|
||||
var done = elem[doneName];
|
||||
if ( done ) {
|
||||
match = checkSet[ done ];
|
||||
break;
|
||||
}
|
||||
|
||||
if ( elem.nodeType === 1 )
|
||||
elem[doneName] = i;
|
||||
|
||||
if ( elem.nodeName === cur ) {
|
||||
match = elem;
|
||||
break;
|
||||
}
|
||||
|
||||
elem = elem[dir];
|
||||
}
|
||||
|
||||
checkSet[i] = match;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function dirCheck( dir, cur, doneName, checkSet, nodeCheck ) {
|
||||
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
|
||||
var elem = checkSet[i];
|
||||
if ( elem ) {
|
||||
elem = elem[dir];
|
||||
var match = false;
|
||||
|
||||
while ( elem && elem.nodeType ) {
|
||||
if ( elem[doneName] ) {
|
||||
match = checkSet[ elem[doneName] ];
|
||||
break;
|
||||
}
|
||||
|
||||
if ( elem.nodeType === 1 ) {
|
||||
elem[doneName] = i;
|
||||
|
||||
if ( typeof cur !== "string" ) {
|
||||
if ( elem === cur ) {
|
||||
match = true;
|
||||
break;
|
||||
}
|
||||
|
||||
} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
|
||||
match = elem;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
elem = elem[dir];
|
||||
}
|
||||
|
||||
checkSet[i] = match;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var contains = document.compareDocumentPosition ? function(a, b){
|
||||
return a.compareDocumentPosition(b) & 16;
|
||||
} : function(a, b){
|
||||
return a !== b && (a.contains ? a.contains(b) : true);
|
||||
};
|
||||
|
||||
// EXPOSE
|
||||
|
||||
ns.Sizzle = Sizzle;
|
||||
|
||||
};
|
||||
|
||||
if (this["dojo"]) {
|
||||
var defined= 0;
|
||||
if (!defined) {
|
||||
// must be in a built version that stripped out the define above
|
||||
dojo.provide("dojo._base.query");
|
||||
dojo.require("dojo._base.NodeList");
|
||||
defineSizzle(dojo);
|
||||
} // else must be in a source version (or a build that likes define)
|
||||
} else {
|
||||
defineSizzle(window);
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
3
lib/dojo/_base/query.js.uncompressed.js
Normal file
3
lib/dojo/_base/query.js.uncompressed.js
Normal file
@@ -0,0 +1,3 @@
|
||||
define("dojo/_base/query", ["./kernel", "../query", "./NodeList"], function(dojo){
|
||||
return dojo.query;
|
||||
});
|
||||
8
lib/dojo/_base/sniff.js
Normal file
8
lib/dojo/_base/sniff.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/_base/sniff",["./kernel","../has"],function(_1,_2){if(!1){return _2;}_1.isBrowser=true,_1._name="browser";var _3=_2.add,n=navigator,_4=n.userAgent,_5=n.appVersion,tv=parseFloat(_5),_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12,_13,_14;if(_4.indexOf("AdobeAIR")>=0){_7=1;}_8=(_5.indexOf("Konqueror")>=0)?tv:0;_9=parseFloat(_4.split("WebKit/")[1])||undefined;_a=parseFloat(_4.split("Chrome/")[1])||undefined;_b=_5.indexOf("Macintosh")>=0;_12=/iPhone|iPod|iPad/.test(_4);_13=parseFloat(_4.split("Android ")[1])||undefined;_14=typeof opera!="undefined"&&opera.wiiremote;var _15=Math.max(_5.indexOf("WebKit"),_5.indexOf("Safari"),0);if(_15&&!_a){_c=parseFloat(_5.split("Version/")[1]);if(!_c||parseFloat(_5.substr(_15+7))<=419.3){_c=2;}}if(!_2("dojo-webkit")){if(_4.indexOf("Opera")>=0){_6=tv;if(_6>=9.8){_6=parseFloat(_4.split("Version/")[1])||tv;}}if(_4.indexOf("Gecko")>=0&&!_8&&!_9){_d=_e=tv;}if(_e){_10=parseFloat(_4.split("Firefox/")[1]||_4.split("Minefield/")[1])||undefined;}if(document.all&&!_6){_f=parseFloat(_5.split("MSIE ")[1])||undefined;var _16=document.documentMode;if(_16&&_16!=5&&Math.floor(_f)!=_16){_f=_16;}}}_11=document.compatMode=="BackCompat";_3("opera",_1.isOpera=_6);_3("air",_1.isAIR=_7);_3("khtml",_1.isKhtml=_8);_3("webkit",_1.isWebKit=_9);_3("chrome",_1.isChrome=_a);_3("mac",_1.isMac=_b);_3("safari",_1.isSafari=_c);_3("mozilla",_1.isMozilla=_1.isMoz=_d);_3("ie",_1.isIE=_f);_3("ff",_1.isFF=_10);_3("quirks",_1.isQuirks=_11);_3("ios",_1.isIos=_12);_3("android",_1.isAndroid=_13);_1.locale=_1.locale||(_f?n.userLanguage:n.language).toLowerCase();return _2;});
|
||||
187
lib/dojo/_base/sniff.js.uncompressed.js
Normal file
187
lib/dojo/_base/sniff.js.uncompressed.js
Normal file
@@ -0,0 +1,187 @@
|
||||
define("dojo/_base/sniff", ["./kernel", "../has"], function(dojo, has){
|
||||
// module:
|
||||
// dojo/sniff
|
||||
// summary:
|
||||
// This module populates the dojo browser version sniffing properties.
|
||||
|
||||
if(!1){
|
||||
return has;
|
||||
}
|
||||
|
||||
dojo.isBrowser = true,
|
||||
dojo._name = "browser";
|
||||
|
||||
var hasAdd = has.add,
|
||||
n = navigator,
|
||||
dua = n.userAgent,
|
||||
dav = n.appVersion,
|
||||
tv = parseFloat(dav),
|
||||
isOpera,
|
||||
isAIR,
|
||||
isKhtml,
|
||||
isWebKit,
|
||||
isChrome,
|
||||
isMac,
|
||||
isSafari,
|
||||
isMozilla ,
|
||||
isMoz,
|
||||
isIE,
|
||||
isFF,
|
||||
isQuirks,
|
||||
isIos,
|
||||
isAndroid,
|
||||
isWii;
|
||||
|
||||
/*=====
|
||||
dojo.isBrowser = {
|
||||
// example:
|
||||
// | if(dojo.isBrowser){ ... }
|
||||
};
|
||||
|
||||
dojo.isFF = {
|
||||
// example:
|
||||
// | if(dojo.isFF > 1){ ... }
|
||||
};
|
||||
|
||||
dojo.isIE = {
|
||||
// example:
|
||||
// | if(dojo.isIE > 6){
|
||||
// | // we are IE7
|
||||
// | }
|
||||
};
|
||||
|
||||
dojo.isSafari = {
|
||||
// example:
|
||||
// | if(dojo.isSafari){ ... }
|
||||
// example:
|
||||
// Detect iPhone:
|
||||
// | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){
|
||||
// | // we are iPhone. Note, iPod touch reports "iPod" above and fails this test.
|
||||
// | }
|
||||
};
|
||||
|
||||
dojo.mixin(dojo, {
|
||||
// isBrowser: Boolean
|
||||
// True if the client is a web-browser
|
||||
isBrowser: true,
|
||||
// isFF: Number | undefined
|
||||
// Version as a Number if client is FireFox. undefined otherwise. Corresponds to
|
||||
// major detected FireFox version (1.5, 2, 3, etc.)
|
||||
isFF: 2,
|
||||
// isIE: Number | undefined
|
||||
// Version as a Number if client is MSIE(PC). undefined otherwise. Corresponds to
|
||||
// major detected IE version (6, 7, 8, etc.)
|
||||
isIE: 6,
|
||||
// isKhtml: Number | undefined
|
||||
// Version as a Number if client is a KHTML browser. undefined otherwise. Corresponds to major
|
||||
// detected version.
|
||||
isKhtml: 0,
|
||||
// isWebKit: Number | undefined
|
||||
// Version as a Number if client is a WebKit-derived browser (Konqueror,
|
||||
// Safari, Chrome, etc.). undefined otherwise.
|
||||
isWebKit: 0,
|
||||
// isMozilla: Number | undefined
|
||||
// Version as a Number if client is a Mozilla-based browser (Firefox,
|
||||
// SeaMonkey). undefined otherwise. Corresponds to major detected version.
|
||||
isMozilla: 0,
|
||||
// isOpera: Number | undefined
|
||||
// Version as a Number if client is Opera. undefined otherwise. Corresponds to
|
||||
// major detected version.
|
||||
isOpera: 0,
|
||||
// isSafari: Number | undefined
|
||||
// Version as a Number if client is Safari or iPhone. undefined otherwise.
|
||||
isSafari: 0,
|
||||
// isChrome: Number | undefined
|
||||
// Version as a Number if client is Chrome browser. undefined otherwise.
|
||||
isChrome: 0,
|
||||
// isMac: Boolean
|
||||
// True if the client runs on Mac
|
||||
isMac: 0,
|
||||
// isIos: Boolean
|
||||
// True if client is iPhone, iPod, or iPad
|
||||
isIos: 0,
|
||||
// isAndroid: Number | undefined
|
||||
// Version as a Number if client is android browser. undefined otherwise.
|
||||
isAndroid: 0,
|
||||
// isWii: Boolean
|
||||
// True if client is Wii
|
||||
isWii: 0
|
||||
});
|
||||
=====*/
|
||||
|
||||
// fill in the rendering support information in dojo.render.*
|
||||
if(dua.indexOf("AdobeAIR") >= 0){ isAIR = 1; }
|
||||
isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : 0;
|
||||
isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined;
|
||||
isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined;
|
||||
isMac = dav.indexOf("Macintosh") >= 0;
|
||||
isIos = /iPhone|iPod|iPad/.test(dua);
|
||||
isAndroid = parseFloat(dua.split("Android ")[1]) || undefined;
|
||||
isWii = typeof opera != "undefined" && opera.wiiremote;
|
||||
|
||||
// safari detection derived from:
|
||||
// http://developer.apple.com/internet/safari/faq.html#anchor2
|
||||
// http://developer.apple.com/internet/safari/uamatrix.html
|
||||
var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);
|
||||
if(index && !isChrome){
|
||||
// try to grab the explicit Safari version first. If we don't get
|
||||
// one, look for less than 419.3 as the indication that we're on something
|
||||
// "Safari 2-ish".
|
||||
isSafari = parseFloat(dav.split("Version/")[1]);
|
||||
if(!isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){
|
||||
isSafari = 2;
|
||||
}
|
||||
}
|
||||
|
||||
if (!has("dojo-webkit")) {
|
||||
if(dua.indexOf("Opera") >= 0){
|
||||
isOpera = tv;
|
||||
// see http://dev.opera.com/articles/view/opera-ua-string-changes and http://www.useragentstring.com/pages/Opera/
|
||||
// 9.8 has both styles; <9.8, 9.9 only old style
|
||||
if(isOpera >= 9.8){
|
||||
isOpera = parseFloat(dua.split("Version/")[1]) || tv;
|
||||
}
|
||||
}
|
||||
|
||||
if(dua.indexOf("Gecko") >= 0 && !isKhtml && !isWebKit){
|
||||
isMozilla = isMoz = tv;
|
||||
}
|
||||
if(isMoz){
|
||||
//We really need to get away from this. Consider a sane isGecko approach for the future.
|
||||
isFF = parseFloat(dua.split("Firefox/")[1] || dua.split("Minefield/")[1]) || undefined;
|
||||
}
|
||||
if(document.all && !isOpera){
|
||||
isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;
|
||||
//In cases where the page has an HTTP header or META tag with
|
||||
//X-UA-Compatible, then it is in emulation mode.
|
||||
//Make sure isIE reflects the desired version.
|
||||
//document.documentMode of 5 means quirks mode.
|
||||
//Only switch the value if documentMode's major version
|
||||
//is different from isIE's major version.
|
||||
var mode = document.documentMode;
|
||||
if(mode && mode != 5 && Math.floor(isIE) != mode){
|
||||
isIE = mode;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
isQuirks = document.compatMode == "BackCompat";
|
||||
|
||||
hasAdd("opera", dojo.isOpera = isOpera);
|
||||
hasAdd("air", dojo.isAIR = isAIR);
|
||||
hasAdd("khtml", dojo.isKhtml = isKhtml);
|
||||
hasAdd("webkit", dojo.isWebKit = isWebKit);
|
||||
hasAdd("chrome", dojo.isChrome = isChrome);
|
||||
hasAdd("mac", dojo.isMac = isMac );
|
||||
hasAdd("safari", dojo.isSafari = isSafari);
|
||||
hasAdd("mozilla", dojo.isMozilla = dojo.isMoz = isMozilla );
|
||||
hasAdd("ie", dojo.isIE = isIE );
|
||||
hasAdd("ff", dojo.isFF = isFF);
|
||||
hasAdd("quirks", dojo.isQuirks = isQuirks);
|
||||
hasAdd("ios", dojo.isIos = isIos);
|
||||
hasAdd("android", dojo.isAndroid = isAndroid);
|
||||
|
||||
dojo.locale = dojo.locale || (isIE ? n.userLanguage : n.language).toLowerCase();
|
||||
|
||||
return has;
|
||||
});
|
||||
8
lib/dojo/_base/unload.js
Normal file
8
lib/dojo/_base/unload.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/_base/unload",["./kernel","./connect"],function(_1,_2){var _3=window;_1.addOnWindowUnload=function(_4,_5){if(!_1.windowUnloaded){_2.connect(_3,"unload",(_1.windowUnloaded=function(){}));}_2.connect(_3,"unload",_4,_5);};_1.addOnUnload=function(_6,_7){_2.connect(_3,"beforeunload",_6,_7);};return {addOnWindowUnload:_1.addOnWindowUnload,addOnUnload:_1.addOnUnload};});
|
||||
81
lib/dojo/_base/unload.js.uncompressed.js
Normal file
81
lib/dojo/_base/unload.js.uncompressed.js
Normal file
@@ -0,0 +1,81 @@
|
||||
define("dojo/_base/unload", ["./kernel", "./connect"], function(dojo, connect) {
|
||||
// module:
|
||||
// dojo/unload
|
||||
// summary:
|
||||
// This module contains the document and window unload detection API.
|
||||
|
||||
var win = window;
|
||||
|
||||
/*=====
|
||||
dojo.windowUnloaded = function(){
|
||||
// summary:
|
||||
// signal fired by impending window destruction. You may use
|
||||
// dojo.addOnWindowUnload() to register a listener for this
|
||||
// event. NOTE: if you wish to dojo.connect() to this method
|
||||
// to perform page/application cleanup, be aware that this
|
||||
// event WILL NOT fire if no handler has been registered with
|
||||
// dojo.addOnWindowUnload. This behavior started in Dojo 1.3.
|
||||
// Previous versions always triggered dojo.windowUnloaded. See
|
||||
// dojo.addOnWindowUnload for more info.
|
||||
};
|
||||
=====*/
|
||||
|
||||
dojo.addOnWindowUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
|
||||
// summary:
|
||||
// registers a function to be triggered when window.onunload
|
||||
// fires.
|
||||
// description:
|
||||
// The first time that addOnWindowUnload is called Dojo
|
||||
// will register a page listener to trigger your unload
|
||||
// handler with. Note that registering these handlers may
|
||||
// destory "fastback" page caching in browsers that support
|
||||
// it. Be careful trying to modify the DOM or access
|
||||
// JavaScript properties during this phase of page unloading:
|
||||
// they may not always be available. Consider
|
||||
// dojo.addOnUnload() if you need to modify the DOM or do
|
||||
// heavy JavaScript work since it fires at the eqivalent of
|
||||
// the page's "onbeforeunload" event.
|
||||
// example:
|
||||
// | dojo.addOnWindowUnload(functionPointer)
|
||||
// | dojo.addOnWindowUnload(object, "functionName");
|
||||
// | dojo.addOnWindowUnload(object, function(){ /* ... */});
|
||||
|
||||
if (!dojo.windowUnloaded) {
|
||||
connect.connect(win, "unload", (dojo.windowUnloaded= function(){}));
|
||||
}
|
||||
connect.connect(win, "unload", obj, functionName);
|
||||
};
|
||||
|
||||
dojo.addOnUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
|
||||
// summary:
|
||||
// registers a function to be triggered when the page unloads.
|
||||
// description:
|
||||
// The first time that addOnUnload is called Dojo will
|
||||
// register a page listener to trigger your unload handler
|
||||
// with.
|
||||
//
|
||||
// In a browser enviroment, the functions will be triggered
|
||||
// during the window.onbeforeunload event. Be careful of doing
|
||||
// too much work in an unload handler. onbeforeunload can be
|
||||
// triggered if a link to download a file is clicked, or if
|
||||
// the link is a javascript: link. In these cases, the
|
||||
// onbeforeunload event fires, but the document is not
|
||||
// actually destroyed. So be careful about doing destructive
|
||||
// operations in a dojo.addOnUnload callback.
|
||||
//
|
||||
// Further note that calling dojo.addOnUnload will prevent
|
||||
// browsers from using a "fast back" cache to make page
|
||||
// loading via back button instantaneous.
|
||||
// example:
|
||||
// | dojo.addOnUnload(functionPointer)
|
||||
// | dojo.addOnUnload(object, "functionName")
|
||||
// | dojo.addOnUnload(object, function(){ /* ... */});
|
||||
|
||||
connect.connect(win, "beforeunload", obj, functionName);
|
||||
};
|
||||
|
||||
return {
|
||||
addOnWindowUnload: dojo.addOnWindowUnload,
|
||||
addOnUnload: dojo.addOnUnload
|
||||
};
|
||||
});
|
||||
8
lib/dojo/_base/url.js
Normal file
8
lib/dojo/_base/url.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/_base/url",["./kernel"],function(_1){var _2=new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),_3=new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),_4=function(){var n=null,_5=arguments,_6=[_5[0]];for(var i=1;i<_5.length;i++){if(!_5[i]){continue;}var _7=new _4(_5[i]+""),_8=new _4(_6[0]+"");if(_7.path==""&&!_7.scheme&&!_7.authority&&!_7.query){if(_7.fragment!=n){_8.fragment=_7.fragment;}_7=_8;}else{if(!_7.scheme){_7.scheme=_8.scheme;if(!_7.authority){_7.authority=_8.authority;if(_7.path.charAt(0)!="/"){var _9=_8.path.substring(0,_8.path.lastIndexOf("/")+1)+_7.path;var _a=_9.split("/");for(var j=0;j<_a.length;j++){if(_a[j]=="."){if(j==_a.length-1){_a[j]="";}else{_a.splice(j,1);j--;}}else{if(j>0&&!(j==1&&_a[0]=="")&&_a[j]==".."&&_a[j-1]!=".."){if(j==(_a.length-1)){_a.splice(j,1);_a[j-1]="";}else{_a.splice(j-1,2);j-=2;}}}}_7.path=_a.join("/");}}}}_6=[];if(_7.scheme){_6.push(_7.scheme,":");}if(_7.authority){_6.push("//",_7.authority);}_6.push(_7.path);if(_7.query){_6.push("?",_7.query);}if(_7.fragment){_6.push("#",_7.fragment);}}this.uri=_6.join("");var r=this.uri.match(_2);this.scheme=r[2]||(r[1]?"":n);this.authority=r[4]||(r[3]?"":n);this.path=r[5];this.query=r[7]||(r[6]?"":n);this.fragment=r[9]||(r[8]?"":n);if(this.authority!=n){r=this.authority.match(_3);this.user=r[3]||n;this.password=r[4]||n;this.host=r[6]||r[7];this.port=r[9]||n;}};_4.prototype.toString=function(){return this.uri;};return _1._Url=_4;});
|
||||
111
lib/dojo/_base/url.js.uncompressed.js
Normal file
111
lib/dojo/_base/url.js.uncompressed.js
Normal file
@@ -0,0 +1,111 @@
|
||||
define("dojo/_base/url", ["./kernel"], function(dojo) {
|
||||
// module:
|
||||
// dojo/url
|
||||
// summary:
|
||||
// This module contains dojo._Url
|
||||
|
||||
var
|
||||
ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),
|
||||
ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),
|
||||
_Url = function(){
|
||||
var n = null,
|
||||
_a = arguments,
|
||||
uri = [_a[0]];
|
||||
// resolve uri components relative to each other
|
||||
for(var i = 1; i<_a.length; i++){
|
||||
if(!_a[i]){ continue; }
|
||||
|
||||
// Safari doesn't support this.constructor so we have to be explicit
|
||||
// FIXME: Tracked (and fixed) in Webkit bug 3537.
|
||||
// http://bugs.webkit.org/show_bug.cgi?id=3537
|
||||
var relobj = new _Url(_a[i]+""),
|
||||
uriobj = new _Url(uri[0]+"");
|
||||
|
||||
if(
|
||||
relobj.path == "" &&
|
||||
!relobj.scheme &&
|
||||
!relobj.authority &&
|
||||
!relobj.query
|
||||
){
|
||||
if(relobj.fragment != n){
|
||||
uriobj.fragment = relobj.fragment;
|
||||
}
|
||||
relobj = uriobj;
|
||||
}else if(!relobj.scheme){
|
||||
relobj.scheme = uriobj.scheme;
|
||||
|
||||
if(!relobj.authority){
|
||||
relobj.authority = uriobj.authority;
|
||||
|
||||
if(relobj.path.charAt(0) != "/"){
|
||||
var path = uriobj.path.substring(0,
|
||||
uriobj.path.lastIndexOf("/") + 1) + relobj.path;
|
||||
|
||||
var segs = path.split("/");
|
||||
for(var j = 0; j < segs.length; j++){
|
||||
if(segs[j] == "."){
|
||||
// flatten "./" references
|
||||
if(j == segs.length - 1){
|
||||
segs[j] = "";
|
||||
}else{
|
||||
segs.splice(j, 1);
|
||||
j--;
|
||||
}
|
||||
}else if(j > 0 && !(j == 1 && segs[0] == "") &&
|
||||
segs[j] == ".." && segs[j-1] != ".."){
|
||||
// flatten "../" references
|
||||
if(j == (segs.length - 1)){
|
||||
segs.splice(j, 1);
|
||||
segs[j - 1] = "";
|
||||
}else{
|
||||
segs.splice(j - 1, 2);
|
||||
j -= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
relobj.path = segs.join("/");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uri = [];
|
||||
if(relobj.scheme){
|
||||
uri.push(relobj.scheme, ":");
|
||||
}
|
||||
if(relobj.authority){
|
||||
uri.push("//", relobj.authority);
|
||||
}
|
||||
uri.push(relobj.path);
|
||||
if(relobj.query){
|
||||
uri.push("?", relobj.query);
|
||||
}
|
||||
if(relobj.fragment){
|
||||
uri.push("#", relobj.fragment);
|
||||
}
|
||||
}
|
||||
|
||||
this.uri = uri.join("");
|
||||
|
||||
// break the uri into its main components
|
||||
var r = this.uri.match(ore);
|
||||
|
||||
this.scheme = r[2] || (r[1] ? "" : n);
|
||||
this.authority = r[4] || (r[3] ? "" : n);
|
||||
this.path = r[5]; // can never be undefined
|
||||
this.query = r[7] || (r[6] ? "" : n);
|
||||
this.fragment = r[9] || (r[8] ? "" : n);
|
||||
|
||||
if(this.authority != n){
|
||||
// server based naming authority
|
||||
r = this.authority.match(ire);
|
||||
|
||||
this.user = r[3] || n;
|
||||
this.password = r[4] || n;
|
||||
this.host = r[6] || r[7]; // ipv6 || ipv4
|
||||
this.port = r[9] || n;
|
||||
}
|
||||
};
|
||||
_Url.prototype.toString = function(){ return this.uri; };
|
||||
|
||||
return dojo._Url = _Url;
|
||||
});
|
||||
@@ -4,105 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo._base.window"] = true;
|
||||
dojo.provide("dojo._base.window");
|
||||
|
||||
|
||||
/*=====
|
||||
dojo.doc = {
|
||||
// summary:
|
||||
// Alias for the current document. 'dojo.doc' can be modified
|
||||
// for temporary context shifting. Also see dojo.withDoc().
|
||||
// description:
|
||||
// Refer to dojo.doc rather
|
||||
// than referring to 'window.document' to ensure your code runs
|
||||
// correctly in managed contexts.
|
||||
// example:
|
||||
// | n.appendChild(dojo.doc.createElement('div'));
|
||||
}
|
||||
=====*/
|
||||
dojo.doc = window["document"] || null;
|
||||
|
||||
dojo.body = function(){
|
||||
// summary:
|
||||
// Return the body element of the document
|
||||
// return the body object associated with dojo.doc
|
||||
// example:
|
||||
// | dojo.body().appendChild(dojo.doc.createElement('div'));
|
||||
|
||||
// Note: document.body is not defined for a strict xhtml document
|
||||
// Would like to memoize this, but dojo.doc can change vi dojo.withDoc().
|
||||
return dojo.doc.body || dojo.doc.getElementsByTagName("body")[0]; // Node
|
||||
};
|
||||
|
||||
dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocument){
|
||||
// summary:
|
||||
// changes the behavior of many core Dojo functions that deal with
|
||||
// namespace and DOM lookup, changing them to work in a new global
|
||||
// context (e.g., an iframe). The varibles dojo.global and dojo.doc
|
||||
// are modified as a result of calling this function and the result of
|
||||
// `dojo.body()` likewise differs.
|
||||
dojo.global = globalObject;
|
||||
dojo.doc = globalDocument;
|
||||
};
|
||||
|
||||
dojo.withGlobal = function( /*Object*/globalObject,
|
||||
/*Function*/callback,
|
||||
/*Object?*/thisObject,
|
||||
/*Array?*/cbArguments){
|
||||
// summary:
|
||||
// Invoke callback with globalObject as dojo.global and
|
||||
// globalObject.document as dojo.doc.
|
||||
// description:
|
||||
// Invoke callback with globalObject as dojo.global and
|
||||
// globalObject.document as dojo.doc. If provided, globalObject
|
||||
// will be executed in the context of object thisObject
|
||||
// When callback() returns or throws an error, the dojo.global
|
||||
// and dojo.doc will be restored to its previous state.
|
||||
|
||||
var oldGlob = dojo.global;
|
||||
try{
|
||||
dojo.global = globalObject;
|
||||
return dojo.withDoc.call(null, globalObject.document, callback, thisObject, cbArguments);
|
||||
}finally{
|
||||
dojo.global = oldGlob;
|
||||
}
|
||||
};
|
||||
|
||||
dojo.withDoc = function( /*DocumentElement*/documentObject,
|
||||
/*Function*/callback,
|
||||
/*Object?*/thisObject,
|
||||
/*Array?*/cbArguments){
|
||||
// summary:
|
||||
// Invoke callback with documentObject as dojo.doc.
|
||||
// description:
|
||||
// Invoke callback with documentObject as dojo.doc. If provided,
|
||||
// callback will be executed in the context of object thisObject
|
||||
// When callback() returns or throws an error, the dojo.doc will
|
||||
// be restored to its previous state.
|
||||
|
||||
var oldDoc = dojo.doc,
|
||||
oldLtr = dojo._bodyLtr,
|
||||
oldQ = dojo.isQuirks;
|
||||
|
||||
try{
|
||||
dojo.doc = documentObject;
|
||||
delete dojo._bodyLtr; // uncache
|
||||
dojo.isQuirks = dojo.doc.compatMode == "BackCompat"; // no need to check for QuirksMode which was Opera 7 only
|
||||
|
||||
if(thisObject && typeof callback == "string"){
|
||||
callback = thisObject[callback];
|
||||
}
|
||||
|
||||
return callback.apply(thisObject, cbArguments || []);
|
||||
}finally{
|
||||
dojo.doc = oldDoc;
|
||||
delete dojo._bodyLtr; // in case it was undefined originally, and set to true/false by the alternate document
|
||||
if(oldLtr !== undefined){ dojo._bodyLtr = oldLtr; }
|
||||
dojo.isQuirks = oldQ;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/_base/window",["./kernel","../has","./sniff"],function(_1,_2){_1.doc=this["document"]||null;_1.body=function(){return _1.doc.body||_1.doc.getElementsByTagName("body")[0];};_1.setContext=function(_3,_4){_1.global=_5.global=_3;_1.doc=_5.doc=_4;};_1.withGlobal=function(_6,_7,_8,_9){var _a=_1.global;try{_1.global=_5.global=_6;return _1.withDoc.call(null,_6.document,_7,_8,_9);}finally{_1.global=_5.global=_a;}};_1.withDoc=function(_b,_c,_d,_e){var _f=_1.doc,_10=_1.isQuirks,_11=_1.isIE,_12,_13,_14;try{_1.doc=_5.doc=_b;_1.isQuirks=_2.add("quirks",_1.doc.compatMode=="BackCompat",true,true);if(_2("ie")){if((_14=_b.parentWindow)&&_14.navigator){_12=parseFloat(_14.navigator.appVersion.split("MSIE ")[1])||undefined;_13=_b.documentMode;if(_13&&_13!=5&&Math.floor(_12)!=_13){_12=_13;}_1.isIE=_2.add("ie",_12,true,true);}}if(_d&&typeof _c=="string"){_c=_d[_c];}return _c.apply(_d,_e||[]);}finally{_1.doc=_5.doc=_f;_1.isQuirks=_2.add("quirks",_10,true,true);_1.isIE=_2.add("ie",_11,true,true);}};var _5={global:_1.global,doc:_1.doc,body:_1.body,setContext:_1.setContext,withGlobal:_1.withGlobal,withDoc:_1.withDoc};return _5;});
|
||||
126
lib/dojo/_base/window.js.uncompressed.js
Normal file
126
lib/dojo/_base/window.js.uncompressed.js
Normal file
@@ -0,0 +1,126 @@
|
||||
define("dojo/_base/window", ["./kernel", "../has", "./sniff"], function(dojo, has){
|
||||
// module:
|
||||
// dojo/window
|
||||
// summary:
|
||||
// This module provides an API to save/set/restore the global/document scope.
|
||||
|
||||
/*=====
|
||||
dojo.doc = {
|
||||
// summary:
|
||||
// Alias for the current document. 'dojo.doc' can be modified
|
||||
// for temporary context shifting. Also see dojo.withDoc().
|
||||
// description:
|
||||
// Refer to dojo.doc rather
|
||||
// than referring to 'window.document' to ensure your code runs
|
||||
// correctly in managed contexts.
|
||||
// example:
|
||||
// | n.appendChild(dojo.doc.createElement('div'));
|
||||
}
|
||||
=====*/
|
||||
dojo.doc = this["document"] || null;
|
||||
|
||||
dojo.body = function(){
|
||||
// summary:
|
||||
// Return the body element of the document
|
||||
// return the body object associated with dojo.doc
|
||||
// example:
|
||||
// | dojo.body().appendChild(dojo.doc.createElement('div'));
|
||||
|
||||
// Note: document.body is not defined for a strict xhtml document
|
||||
// Would like to memoize this, but dojo.doc can change vi dojo.withDoc().
|
||||
return dojo.doc.body || dojo.doc.getElementsByTagName("body")[0]; // Node
|
||||
};
|
||||
|
||||
dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocument){
|
||||
// summary:
|
||||
// changes the behavior of many core Dojo functions that deal with
|
||||
// namespace and DOM lookup, changing them to work in a new global
|
||||
// context (e.g., an iframe). The varibles dojo.global and dojo.doc
|
||||
// are modified as a result of calling this function and the result of
|
||||
// `dojo.body()` likewise differs.
|
||||
dojo.global = ret.global = globalObject;
|
||||
dojo.doc = ret.doc = globalDocument;
|
||||
};
|
||||
|
||||
dojo.withGlobal = function( /*Object*/globalObject,
|
||||
/*Function*/callback,
|
||||
/*Object?*/thisObject,
|
||||
/*Array?*/cbArguments){
|
||||
// summary:
|
||||
// Invoke callback with globalObject as dojo.global and
|
||||
// globalObject.document as dojo.doc.
|
||||
// description:
|
||||
// Invoke callback with globalObject as dojo.global and
|
||||
// globalObject.document as dojo.doc. If provided, globalObject
|
||||
// will be executed in the context of object thisObject
|
||||
// When callback() returns or throws an error, the dojo.global
|
||||
// and dojo.doc will be restored to its previous state.
|
||||
|
||||
var oldGlob = dojo.global;
|
||||
try{
|
||||
dojo.global = ret.global = globalObject;
|
||||
return dojo.withDoc.call(null, globalObject.document, callback, thisObject, cbArguments);
|
||||
}finally{
|
||||
dojo.global = ret.global = oldGlob;
|
||||
}
|
||||
};
|
||||
|
||||
dojo.withDoc = function( /*DocumentElement*/documentObject,
|
||||
/*Function*/callback,
|
||||
/*Object?*/thisObject,
|
||||
/*Array?*/cbArguments){
|
||||
// summary:
|
||||
// Invoke callback with documentObject as dojo.doc.
|
||||
// description:
|
||||
// Invoke callback with documentObject as dojo.doc. If provided,
|
||||
// callback will be executed in the context of object thisObject
|
||||
// When callback() returns or throws an error, the dojo.doc will
|
||||
// be restored to its previous state.
|
||||
|
||||
var oldDoc = dojo.doc,
|
||||
oldQ = dojo.isQuirks,
|
||||
oldIE = dojo.isIE, isIE, mode, pwin;
|
||||
|
||||
try{
|
||||
dojo.doc = ret.doc = documentObject;
|
||||
// update dojo.isQuirks and the value of the has feature "quirks"
|
||||
dojo.isQuirks = has.add("quirks", dojo.doc.compatMode == "BackCompat", true, true); // no need to check for QuirksMode which was Opera 7 only
|
||||
|
||||
if(has("ie")){
|
||||
if((pwin = documentObject.parentWindow) && pwin.navigator){
|
||||
// re-run IE detection logic and update dojo.isIE / has("ie")
|
||||
// (the only time parentWindow/navigator wouldn't exist is if we were not
|
||||
// passed an actual legitimate document object)
|
||||
isIE = parseFloat(pwin.navigator.appVersion.split("MSIE ")[1]) || undefined;
|
||||
mode = documentObject.documentMode;
|
||||
if(mode && mode != 5 && Math.floor(isIE) != mode){
|
||||
isIE = mode;
|
||||
}
|
||||
dojo.isIE = has.add("ie", isIE, true, true);
|
||||
}
|
||||
}
|
||||
|
||||
if(thisObject && typeof callback == "string"){
|
||||
callback = thisObject[callback];
|
||||
}
|
||||
|
||||
return callback.apply(thisObject, cbArguments || []);
|
||||
}finally{
|
||||
dojo.doc = ret.doc = oldDoc;
|
||||
dojo.isQuirks = has.add("quirks", oldQ, true, true);
|
||||
dojo.isIE = has.add("ie", oldIE, true, true);
|
||||
}
|
||||
};
|
||||
|
||||
var ret = {
|
||||
global: dojo.global,
|
||||
doc: dojo.doc,
|
||||
body: dojo.body,
|
||||
setContext: dojo.setContext,
|
||||
withGlobal: dojo.withGlobal,
|
||||
withDoc: dojo.withDoc
|
||||
};
|
||||
|
||||
return ret;
|
||||
|
||||
});
|
||||
File diff suppressed because one or more lines are too long
830
lib/dojo/_base/xhr.js.uncompressed.js
Normal file
830
lib/dojo/_base/xhr.js.uncompressed.js
Normal file
@@ -0,0 +1,830 @@
|
||||
define("dojo/_base/xhr", [
|
||||
"./kernel", "./sniff", "require", "../io-query", "../dom", "../dom-form", "./Deferred", "./json", "./lang", "./array", "../on"
|
||||
], function(dojo, has, require, ioq, dom, domForm, deferred, json, lang, array, on){
|
||||
// module:
|
||||
// dojo/_base.xhr
|
||||
// summary:
|
||||
// This modules defines the dojo.xhr* API.
|
||||
|
||||
has.add("native-xhr", function() {
|
||||
// if true, the environment has a native XHR implementation
|
||||
return typeof XMLHttpRequest !== 'undefined';
|
||||
});
|
||||
|
||||
if(1 && require.getXhr){
|
||||
dojo._xhrObj = require.getXhr;
|
||||
}else if (has("native-xhr")){
|
||||
dojo._xhrObj = function(){
|
||||
// summary:
|
||||
// does the work of portably generating a new XMLHTTPRequest object.
|
||||
try{
|
||||
return new XMLHttpRequest();
|
||||
}catch(e){
|
||||
throw new Error("XMLHTTP not available: "+e);
|
||||
}
|
||||
};
|
||||
}else{
|
||||
// PROGIDs are in order of decreasing likelihood; this will change in time.
|
||||
for(var XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], progid, i = 0; i < 3;){
|
||||
try{
|
||||
progid = XMLHTTP_PROGIDS[i++];
|
||||
if (new ActiveXObject(progid)) {
|
||||
// this progid works; therefore, use it from now on
|
||||
break;
|
||||
}
|
||||
}catch(e){
|
||||
// squelch; we're just trying to find a good ActiveX PROGID
|
||||
// if they all fail, then progid ends up as the last attempt and that will signal the error
|
||||
// the first time the client actually tries to exec an xhr
|
||||
}
|
||||
}
|
||||
dojo._xhrObj= function() {
|
||||
return new ActiveXObject(progid);
|
||||
};
|
||||
}
|
||||
|
||||
var cfg = dojo.config;
|
||||
|
||||
// mix in io-query and dom-form
|
||||
dojo.objectToQuery = ioq.objectToQuery;
|
||||
dojo.queryToObject = ioq.queryToObject;
|
||||
dojo.fieldToObject = domForm.fieldToObject;
|
||||
dojo.formToObject = domForm.toObject;
|
||||
dojo.formToQuery = domForm.toQuery;
|
||||
dojo.formToJson = domForm.toJson;
|
||||
|
||||
// need to block async callbacks from snatching this thread as the result
|
||||
// of an async callback might call another sync XHR, this hangs khtml forever
|
||||
// must checked by watchInFlight()
|
||||
|
||||
dojo._blockAsync = false;
|
||||
|
||||
// MOW: remove dojo._contentHandlers alias in 2.0
|
||||
var handlers = dojo._contentHandlers = dojo.contentHandlers = {
|
||||
// summary:
|
||||
// A map of availble XHR transport handle types. Name matches the
|
||||
// `handleAs` attribute passed to XHR calls.
|
||||
//
|
||||
// description:
|
||||
// A map of availble XHR transport handle types. Name matches the
|
||||
// `handleAs` attribute passed to XHR calls. Each contentHandler is
|
||||
// called, passing the xhr object for manipulation. The return value
|
||||
// from the contentHandler will be passed to the `load` or `handle`
|
||||
// functions defined in the original xhr call.
|
||||
//
|
||||
// example:
|
||||
// Creating a custom content-handler:
|
||||
// | dojo.contentHandlers.makeCaps = function(xhr){
|
||||
// | return xhr.responseText.toUpperCase();
|
||||
// | }
|
||||
// | // and later:
|
||||
// | dojo.xhrGet({
|
||||
// | url:"foo.txt",
|
||||
// | handleAs:"makeCaps",
|
||||
// | load: function(data){ /* data is a toUpper version of foo.txt */ }
|
||||
// | });
|
||||
|
||||
"text": function(xhr){
|
||||
// summary: A contentHandler which simply returns the plaintext response data
|
||||
return xhr.responseText;
|
||||
},
|
||||
"json": function(xhr){
|
||||
// summary: A contentHandler which returns a JavaScript object created from the response data
|
||||
return json.fromJson(xhr.responseText || null);
|
||||
},
|
||||
"json-comment-filtered": function(xhr){
|
||||
// summary: A contentHandler which expects comment-filtered JSON.
|
||||
// description:
|
||||
// A contentHandler which expects comment-filtered JSON.
|
||||
// the json-comment-filtered option was implemented to prevent
|
||||
// "JavaScript Hijacking", but it is less secure than standard JSON. Use
|
||||
// standard JSON instead. JSON prefixing can be used to subvert hijacking.
|
||||
//
|
||||
// Will throw a notice suggesting to use application/json mimetype, as
|
||||
// json-commenting can introduce security issues. To decrease the chances of hijacking,
|
||||
// use the standard `json` contentHandler, and prefix your "JSON" with: {}&&
|
||||
//
|
||||
// use djConfig.useCommentedJson = true to turn off the notice
|
||||
if(!dojo.config.useCommentedJson){
|
||||
console.warn("Consider using the standard mimetype:application/json."
|
||||
+ " json-commenting can introduce security issues. To"
|
||||
+ " decrease the chances of hijacking, use the standard the 'json' handler and"
|
||||
+ " prefix your json with: {}&&\n"
|
||||
+ "Use djConfig.useCommentedJson=true to turn off this message.");
|
||||
}
|
||||
|
||||
var value = xhr.responseText;
|
||||
var cStartIdx = value.indexOf("\/*");
|
||||
var cEndIdx = value.lastIndexOf("*\/");
|
||||
if(cStartIdx == -1 || cEndIdx == -1){
|
||||
throw new Error("JSON was not comment filtered");
|
||||
}
|
||||
return json.fromJson(value.substring(cStartIdx+2, cEndIdx));
|
||||
},
|
||||
"javascript": function(xhr){
|
||||
// summary: A contentHandler which evaluates the response data, expecting it to be valid JavaScript
|
||||
|
||||
// FIXME: try Moz and IE specific eval variants?
|
||||
return dojo.eval(xhr.responseText);
|
||||
},
|
||||
"xml": function(xhr){
|
||||
// summary: A contentHandler returning an XML Document parsed from the response data
|
||||
var result = xhr.responseXML;
|
||||
|
||||
if(has("ie")){
|
||||
if((!result || !result.documentElement)){
|
||||
//WARNING: this branch used by the xml handling in dojo.io.iframe,
|
||||
//so be sure to test dojo.io.iframe if making changes below.
|
||||
var ms = function(n){ return "MSXML" + n + ".DOMDocument"; };
|
||||
var dp = ["Microsoft.XMLDOM", ms(6), ms(4), ms(3), ms(2)];
|
||||
array.some(dp, function(p){
|
||||
try{
|
||||
var dom = new ActiveXObject(p);
|
||||
dom.async = false;
|
||||
dom.loadXML(xhr.responseText);
|
||||
result = dom;
|
||||
}catch(e){ return false; }
|
||||
return true;
|
||||
});
|
||||
}
|
||||
}
|
||||
return result; // DOMDocument
|
||||
},
|
||||
"json-comment-optional": function(xhr){
|
||||
// summary: A contentHandler which checks the presence of comment-filtered JSON and
|
||||
// alternates between the `json` and `json-comment-filtered` contentHandlers.
|
||||
if(xhr.responseText && /^[^{\[]*\/\*/.test(xhr.responseText)){
|
||||
return handlers["json-comment-filtered"](xhr);
|
||||
}else{
|
||||
return handlers["json"](xhr);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/*=====
|
||||
dojo.__IoArgs = function(){
|
||||
// url: String
|
||||
// URL to server endpoint.
|
||||
// content: Object?
|
||||
// Contains properties with string values. These
|
||||
// properties will be serialized as name1=value2 and
|
||||
// passed in the request.
|
||||
// timeout: Integer?
|
||||
// Milliseconds to wait for the response. If this time
|
||||
// passes, the then error callbacks are called.
|
||||
// form: DOMNode?
|
||||
// DOM node for a form. Used to extract the form values
|
||||
// and send to the server.
|
||||
// preventCache: Boolean?
|
||||
// Default is false. If true, then a
|
||||
// "dojo.preventCache" parameter is sent in the request
|
||||
// with a value that changes with each request
|
||||
// (timestamp). Useful only with GET-type requests.
|
||||
// handleAs: String?
|
||||
// Acceptable values depend on the type of IO
|
||||
// transport (see specific IO calls for more information).
|
||||
// rawBody: String?
|
||||
// Sets the raw body for an HTTP request. If this is used, then the content
|
||||
// property is ignored. This is mostly useful for HTTP methods that have
|
||||
// a body to their requests, like PUT or POST. This property can be used instead
|
||||
// of postData and putData for dojo.rawXhrPost and dojo.rawXhrPut respectively.
|
||||
// ioPublish: Boolean?
|
||||
// Set this explicitly to false to prevent publishing of topics related to
|
||||
// IO operations. Otherwise, if djConfig.ioPublish is set to true, topics
|
||||
// will be published via dojo.publish for different phases of an IO operation.
|
||||
// See dojo.__IoPublish for a list of topics that are published.
|
||||
// load: Function?
|
||||
// This function will be
|
||||
// called on a successful HTTP response code.
|
||||
// error: Function?
|
||||
// This function will
|
||||
// be called when the request fails due to a network or server error, the url
|
||||
// is invalid, etc. It will also be called if the load or handle callback throws an
|
||||
// exception, unless djConfig.debugAtAllCosts is true. This allows deployed applications
|
||||
// to continue to run even when a logic error happens in the callback, while making
|
||||
// it easier to troubleshoot while in debug mode.
|
||||
// handle: Function?
|
||||
// This function will
|
||||
// be called at the end of every request, whether or not an error occurs.
|
||||
this.url = url;
|
||||
this.content = content;
|
||||
this.timeout = timeout;
|
||||
this.form = form;
|
||||
this.preventCache = preventCache;
|
||||
this.handleAs = handleAs;
|
||||
this.ioPublish = ioPublish;
|
||||
this.load = function(response, ioArgs){
|
||||
// ioArgs: dojo.__IoCallbackArgs
|
||||
// Provides additional information about the request.
|
||||
// response: Object
|
||||
// The response in the format as defined with handleAs.
|
||||
}
|
||||
this.error = function(response, ioArgs){
|
||||
// ioArgs: dojo.__IoCallbackArgs
|
||||
// Provides additional information about the request.
|
||||
// response: Object
|
||||
// The response in the format as defined with handleAs.
|
||||
}
|
||||
this.handle = function(loadOrError, response, ioArgs){
|
||||
// loadOrError: String
|
||||
// Provides a string that tells you whether this function
|
||||
// was called because of success (load) or failure (error).
|
||||
// response: Object
|
||||
// The response in the format as defined with handleAs.
|
||||
// ioArgs: dojo.__IoCallbackArgs
|
||||
// Provides additional information about the request.
|
||||
}
|
||||
}
|
||||
=====*/
|
||||
|
||||
/*=====
|
||||
dojo.__IoCallbackArgs = function(args, xhr, url, query, handleAs, id, canDelete, json){
|
||||
// args: Object
|
||||
// the original object argument to the IO call.
|
||||
// xhr: XMLHttpRequest
|
||||
// For XMLHttpRequest calls only, the
|
||||
// XMLHttpRequest object that was used for the
|
||||
// request.
|
||||
// url: String
|
||||
// The final URL used for the call. Many times it
|
||||
// will be different than the original args.url
|
||||
// value.
|
||||
// query: String
|
||||
// For non-GET requests, the
|
||||
// name1=value1&name2=value2 parameters sent up in
|
||||
// the request.
|
||||
// handleAs: String
|
||||
// The final indicator on how the response will be
|
||||
// handled.
|
||||
// id: String
|
||||
// For dojo.io.script calls only, the internal
|
||||
// script ID used for the request.
|
||||
// canDelete: Boolean
|
||||
// For dojo.io.script calls only, indicates
|
||||
// whether the script tag that represents the
|
||||
// request can be deleted after callbacks have
|
||||
// been called. Used internally to know when
|
||||
// cleanup can happen on JSONP-type requests.
|
||||
// json: Object
|
||||
// For dojo.io.script calls only: holds the JSON
|
||||
// response for JSONP-type requests. Used
|
||||
// internally to hold on to the JSON responses.
|
||||
// You should not need to access it directly --
|
||||
// the same object should be passed to the success
|
||||
// callbacks directly.
|
||||
this.args = args;
|
||||
this.xhr = xhr;
|
||||
this.url = url;
|
||||
this.query = query;
|
||||
this.handleAs = handleAs;
|
||||
this.id = id;
|
||||
this.canDelete = canDelete;
|
||||
this.json = json;
|
||||
}
|
||||
=====*/
|
||||
|
||||
|
||||
/*=====
|
||||
dojo.__IoPublish = function(){
|
||||
// summary:
|
||||
// This is a list of IO topics that can be published
|
||||
// if djConfig.ioPublish is set to true. IO topics can be
|
||||
// published for any Input/Output, network operation. So,
|
||||
// dojo.xhr, dojo.io.script and dojo.io.iframe can all
|
||||
// trigger these topics to be published.
|
||||
// start: String
|
||||
// "/dojo/io/start" is sent when there are no outstanding IO
|
||||
// requests, and a new IO request is started. No arguments
|
||||
// are passed with this topic.
|
||||
// send: String
|
||||
// "/dojo/io/send" is sent whenever a new IO request is started.
|
||||
// It passes the dojo.Deferred for the request with the topic.
|
||||
// load: String
|
||||
// "/dojo/io/load" is sent whenever an IO request has loaded
|
||||
// successfully. It passes the response and the dojo.Deferred
|
||||
// for the request with the topic.
|
||||
// error: String
|
||||
// "/dojo/io/error" is sent whenever an IO request has errored.
|
||||
// It passes the error and the dojo.Deferred
|
||||
// for the request with the topic.
|
||||
// done: String
|
||||
// "/dojo/io/done" is sent whenever an IO request has completed,
|
||||
// either by loading or by erroring. It passes the error and
|
||||
// the dojo.Deferred for the request with the topic.
|
||||
// stop: String
|
||||
// "/dojo/io/stop" is sent when all outstanding IO requests have
|
||||
// finished. No arguments are passed with this topic.
|
||||
this.start = "/dojo/io/start";
|
||||
this.send = "/dojo/io/send";
|
||||
this.load = "/dojo/io/load";
|
||||
this.error = "/dojo/io/error";
|
||||
this.done = "/dojo/io/done";
|
||||
this.stop = "/dojo/io/stop";
|
||||
}
|
||||
=====*/
|
||||
|
||||
|
||||
dojo._ioSetArgs = function(/*dojo.__IoArgs*/args,
|
||||
/*Function*/canceller,
|
||||
/*Function*/okHandler,
|
||||
/*Function*/errHandler){
|
||||
// summary:
|
||||
// sets up the Deferred and ioArgs property on the Deferred so it
|
||||
// can be used in an io call.
|
||||
// args:
|
||||
// The args object passed into the public io call. Recognized properties on
|
||||
// the args object are:
|
||||
// canceller:
|
||||
// The canceller function used for the Deferred object. The function
|
||||
// will receive one argument, the Deferred object that is related to the
|
||||
// canceller.
|
||||
// okHandler:
|
||||
// The first OK callback to be registered with Deferred. It has the opportunity
|
||||
// to transform the OK response. It will receive one argument -- the Deferred
|
||||
// object returned from this function.
|
||||
// errHandler:
|
||||
// The first error callback to be registered with Deferred. It has the opportunity
|
||||
// to do cleanup on an error. It will receive two arguments: error (the
|
||||
// Error object) and dfd, the Deferred object returned from this function.
|
||||
|
||||
var ioArgs = {args: args, url: args.url};
|
||||
|
||||
//Get values from form if requestd.
|
||||
var formObject = null;
|
||||
if(args.form){
|
||||
var form = dom.byId(args.form);
|
||||
//IE requires going through getAttributeNode instead of just getAttribute in some form cases,
|
||||
//so use it for all. See #2844
|
||||
var actnNode = form.getAttributeNode("action");
|
||||
ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null);
|
||||
formObject = domForm.toObject(form);
|
||||
}
|
||||
|
||||
// set up the query params
|
||||
var miArgs = [{}];
|
||||
|
||||
if(formObject){
|
||||
// potentially over-ride url-provided params w/ form values
|
||||
miArgs.push(formObject);
|
||||
}
|
||||
if(args.content){
|
||||
// stuff in content over-rides what's set by form
|
||||
miArgs.push(args.content);
|
||||
}
|
||||
if(args.preventCache){
|
||||
miArgs.push({"dojo.preventCache": new Date().valueOf()});
|
||||
}
|
||||
ioArgs.query = ioq.objectToQuery(lang.mixin.apply(null, miArgs));
|
||||
|
||||
// .. and the real work of getting the deferred in order, etc.
|
||||
ioArgs.handleAs = args.handleAs || "text";
|
||||
var d = new deferred(canceller);
|
||||
d.addCallbacks(okHandler, function(error){
|
||||
return errHandler(error, d);
|
||||
});
|
||||
|
||||
//Support specifying load, error and handle callback functions from the args.
|
||||
//For those callbacks, the "this" object will be the args object.
|
||||
//The callbacks will get the deferred result value as the
|
||||
//first argument and the ioArgs object as the second argument.
|
||||
var ld = args.load;
|
||||
if(ld && lang.isFunction(ld)){
|
||||
d.addCallback(function(value){
|
||||
return ld.call(args, value, ioArgs);
|
||||
});
|
||||
}
|
||||
var err = args.error;
|
||||
if(err && lang.isFunction(err)){
|
||||
d.addErrback(function(value){
|
||||
return err.call(args, value, ioArgs);
|
||||
});
|
||||
}
|
||||
var handle = args.handle;
|
||||
if(handle && lang.isFunction(handle)){
|
||||
d.addBoth(function(value){
|
||||
return handle.call(args, value, ioArgs);
|
||||
});
|
||||
}
|
||||
|
||||
//Plug in topic publishing, if dojo.publish is loaded.
|
||||
if(cfg.ioPublish && dojo.publish && ioArgs.args.ioPublish !== false){
|
||||
d.addCallbacks(
|
||||
function(res){
|
||||
dojo.publish("/dojo/io/load", [d, res]);
|
||||
return res;
|
||||
},
|
||||
function(res){
|
||||
dojo.publish("/dojo/io/error", [d, res]);
|
||||
return res;
|
||||
}
|
||||
);
|
||||
d.addBoth(function(res){
|
||||
dojo.publish("/dojo/io/done", [d, res]);
|
||||
return res;
|
||||
});
|
||||
}
|
||||
|
||||
d.ioArgs = ioArgs;
|
||||
|
||||
// FIXME: need to wire up the xhr object's abort method to something
|
||||
// analagous in the Deferred
|
||||
return d;
|
||||
};
|
||||
|
||||
var _deferredCancel = function(/*Deferred*/dfd){
|
||||
// summary: canceller function for dojo._ioSetArgs call.
|
||||
|
||||
dfd.canceled = true;
|
||||
var xhr = dfd.ioArgs.xhr;
|
||||
var _at = typeof xhr.abort;
|
||||
if(_at == "function" || _at == "object" || _at == "unknown"){
|
||||
xhr.abort();
|
||||
}
|
||||
var err = dfd.ioArgs.error;
|
||||
if(!err){
|
||||
err = new Error("xhr cancelled");
|
||||
err.dojoType="cancel";
|
||||
}
|
||||
return err;
|
||||
};
|
||||
var _deferredOk = function(/*Deferred*/dfd){
|
||||
// summary: okHandler function for dojo._ioSetArgs call.
|
||||
|
||||
var ret = handlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);
|
||||
return ret === undefined ? null : ret;
|
||||
};
|
||||
var _deferError = function(/*Error*/error, /*Deferred*/dfd){
|
||||
// summary: errHandler function for dojo._ioSetArgs call.
|
||||
|
||||
if(!dfd.ioArgs.args.failOk){
|
||||
console.error(error);
|
||||
}
|
||||
return error;
|
||||
};
|
||||
|
||||
// avoid setting a timer per request. It degrades performance on IE
|
||||
// something fierece if we don't use unified loops.
|
||||
var _inFlightIntvl = null;
|
||||
var _inFlight = [];
|
||||
|
||||
|
||||
//Use a separate count for knowing if we are starting/stopping io calls.
|
||||
//Cannot use _inFlight.length since it can change at a different time than
|
||||
//when we want to do this kind of test. We only want to decrement the count
|
||||
//after a callback/errback has finished, since the callback/errback should be
|
||||
//considered as part of finishing a request.
|
||||
var _pubCount = 0;
|
||||
var _checkPubCount = function(dfd){
|
||||
if(_pubCount <= 0){
|
||||
_pubCount = 0;
|
||||
if(cfg.ioPublish && dojo.publish && (!dfd || dfd && dfd.ioArgs.args.ioPublish !== false)){
|
||||
dojo.publish("/dojo/io/stop");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var _watchInFlight = function(){
|
||||
//summary:
|
||||
// internal method that checks each inflight XMLHttpRequest to see
|
||||
// if it has completed or if the timeout situation applies.
|
||||
|
||||
var now = (new Date()).getTime();
|
||||
// make sure sync calls stay thread safe, if this callback is called
|
||||
// during a sync call and this results in another sync call before the
|
||||
// first sync call ends the browser hangs
|
||||
if(!dojo._blockAsync){
|
||||
// we need manual loop because we often modify _inFlight (and therefore 'i') while iterating
|
||||
// note: the second clause is an assigment on purpose, lint may complain
|
||||
for(var i = 0, tif; i < _inFlight.length && (tif = _inFlight[i]); i++){
|
||||
var dfd = tif.dfd;
|
||||
var func = function(){
|
||||
if(!dfd || dfd.canceled || !tif.validCheck(dfd)){
|
||||
_inFlight.splice(i--, 1);
|
||||
_pubCount -= 1;
|
||||
}else if(tif.ioCheck(dfd)){
|
||||
_inFlight.splice(i--, 1);
|
||||
tif.resHandle(dfd);
|
||||
_pubCount -= 1;
|
||||
}else if(dfd.startTime){
|
||||
//did we timeout?
|
||||
if(dfd.startTime + (dfd.ioArgs.args.timeout || 0) < now){
|
||||
_inFlight.splice(i--, 1);
|
||||
var err = new Error("timeout exceeded");
|
||||
err.dojoType = "timeout";
|
||||
dfd.errback(err);
|
||||
//Cancel the request so the io module can do appropriate cleanup.
|
||||
dfd.cancel();
|
||||
_pubCount -= 1;
|
||||
}
|
||||
}
|
||||
};
|
||||
if(dojo.config.debugAtAllCosts){
|
||||
func.call(this);
|
||||
}else{
|
||||
try{
|
||||
func.call(this);
|
||||
}catch(e){
|
||||
dfd.errback(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_checkPubCount(dfd);
|
||||
|
||||
if(!_inFlight.length){
|
||||
clearInterval(_inFlightIntvl);
|
||||
_inFlightIntvl = null;
|
||||
}
|
||||
};
|
||||
|
||||
dojo._ioCancelAll = function(){
|
||||
//summary: Cancels all pending IO requests, regardless of IO type
|
||||
//(xhr, script, iframe).
|
||||
try{
|
||||
array.forEach(_inFlight, function(i){
|
||||
try{
|
||||
i.dfd.cancel();
|
||||
}catch(e){/*squelch*/}
|
||||
});
|
||||
}catch(e){/*squelch*/}
|
||||
};
|
||||
|
||||
//Automatically call cancel all io calls on unload
|
||||
//in IE for trac issue #2357.
|
||||
if(has("ie")){
|
||||
on(window, "unload", dojo._ioCancelAll);
|
||||
}
|
||||
|
||||
dojo._ioNotifyStart = function(/*Deferred*/dfd){
|
||||
// summary:
|
||||
// If dojo.publish is available, publish topics
|
||||
// about the start of a request queue and/or the
|
||||
// the beginning of request.
|
||||
// description:
|
||||
// Used by IO transports. An IO transport should
|
||||
// call this method before making the network connection.
|
||||
if(cfg.ioPublish && dojo.publish && dfd.ioArgs.args.ioPublish !== false){
|
||||
if(!_pubCount){
|
||||
dojo.publish("/dojo/io/start");
|
||||
}
|
||||
_pubCount += 1;
|
||||
dojo.publish("/dojo/io/send", [dfd]);
|
||||
}
|
||||
};
|
||||
|
||||
dojo._ioWatch = function(dfd, validCheck, ioCheck, resHandle){
|
||||
// summary:
|
||||
// Watches the io request represented by dfd to see if it completes.
|
||||
// dfd: Deferred
|
||||
// The Deferred object to watch.
|
||||
// validCheck: Function
|
||||
// Function used to check if the IO request is still valid. Gets the dfd
|
||||
// object as its only argument.
|
||||
// ioCheck: Function
|
||||
// Function used to check if basic IO call worked. Gets the dfd
|
||||
// object as its only argument.
|
||||
// resHandle: Function
|
||||
// Function used to process response. Gets the dfd
|
||||
// object as its only argument.
|
||||
var args = dfd.ioArgs.args;
|
||||
if(args.timeout){
|
||||
dfd.startTime = (new Date()).getTime();
|
||||
}
|
||||
|
||||
_inFlight.push({dfd: dfd, validCheck: validCheck, ioCheck: ioCheck, resHandle: resHandle});
|
||||
if(!_inFlightIntvl){
|
||||
_inFlightIntvl = setInterval(_watchInFlight, 50);
|
||||
}
|
||||
// handle sync requests
|
||||
//A weakness: async calls in flight
|
||||
//could have their handlers called as part of the
|
||||
//_watchInFlight call, before the sync's callbacks
|
||||
// are called.
|
||||
if(args.sync){
|
||||
_watchInFlight();
|
||||
}
|
||||
};
|
||||
|
||||
var _defaultContentType = "application/x-www-form-urlencoded";
|
||||
|
||||
var _validCheck = function(/*Deferred*/dfd){
|
||||
return dfd.ioArgs.xhr.readyState; //boolean
|
||||
};
|
||||
var _ioCheck = function(/*Deferred*/dfd){
|
||||
return 4 == dfd.ioArgs.xhr.readyState; //boolean
|
||||
};
|
||||
var _resHandle = function(/*Deferred*/dfd){
|
||||
var xhr = dfd.ioArgs.xhr;
|
||||
if(dojo._isDocumentOk(xhr)){
|
||||
dfd.callback(dfd);
|
||||
}else{
|
||||
var err = new Error("Unable to load " + dfd.ioArgs.url + " status:" + xhr.status);
|
||||
err.status = xhr.status;
|
||||
err.responseText = xhr.responseText;
|
||||
err.xhr = xhr;
|
||||
dfd.errback(err);
|
||||
}
|
||||
};
|
||||
|
||||
dojo._ioAddQueryToUrl = function(/*dojo.__IoCallbackArgs*/ioArgs){
|
||||
//summary: Adds query params discovered by the io deferred construction to the URL.
|
||||
//Only use this for operations which are fundamentally GET-type operations.
|
||||
if(ioArgs.query.length){
|
||||
ioArgs.url += (ioArgs.url.indexOf("?") == -1 ? "?" : "&") + ioArgs.query;
|
||||
ioArgs.query = null;
|
||||
}
|
||||
};
|
||||
|
||||
/*=====
|
||||
dojo.declare("dojo.__XhrArgs", dojo.__IoArgs, {
|
||||
constructor: function(){
|
||||
// summary:
|
||||
// In addition to the properties listed for the dojo._IoArgs type,
|
||||
// the following properties are allowed for dojo.xhr* methods.
|
||||
// handleAs: String?
|
||||
// Acceptable values are: text (default), json, json-comment-optional,
|
||||
// json-comment-filtered, javascript, xml. See `dojo.contentHandlers`
|
||||
// sync: Boolean?
|
||||
// false is default. Indicates whether the request should
|
||||
// be a synchronous (blocking) request.
|
||||
// headers: Object?
|
||||
// Additional HTTP headers to send in the request.
|
||||
// failOk: Boolean?
|
||||
// false is default. Indicates whether a request should be
|
||||
// allowed to fail (and therefore no console error message in
|
||||
// the event of a failure)
|
||||
// contentType: String|Boolean
|
||||
// "application/x-www-form-urlencoded" is default. Set to false to
|
||||
// prevent a Content-Type header from being sent, or to a string
|
||||
// to send a different Content-Type.
|
||||
this.handleAs = handleAs;
|
||||
this.sync = sync;
|
||||
this.headers = headers;
|
||||
this.failOk = failOk;
|
||||
}
|
||||
});
|
||||
=====*/
|
||||
|
||||
dojo.xhr = function(/*String*/ method, /*dojo.__XhrArgs*/ args, /*Boolean?*/ hasBody){
|
||||
// summary:
|
||||
// Sends an HTTP request with the given method.
|
||||
// description:
|
||||
// Sends an HTTP request with the given method.
|
||||
// See also dojo.xhrGet(), xhrPost(), xhrPut() and dojo.xhrDelete() for shortcuts
|
||||
// for those HTTP methods. There are also methods for "raw" PUT and POST methods
|
||||
// via dojo.rawXhrPut() and dojo.rawXhrPost() respectively.
|
||||
// method:
|
||||
// HTTP method to be used, such as GET, POST, PUT, DELETE. Should be uppercase.
|
||||
// hasBody:
|
||||
// If the request has an HTTP body, then pass true for hasBody.
|
||||
|
||||
//Make the Deferred object for this xhr request.
|
||||
var dfd = dojo._ioSetArgs(args, _deferredCancel, _deferredOk, _deferError);
|
||||
var ioArgs = dfd.ioArgs;
|
||||
|
||||
//Pass the args to _xhrObj, to allow alternate XHR calls based specific calls, like
|
||||
//the one used for iframe proxies.
|
||||
var xhr = ioArgs.xhr = dojo._xhrObj(ioArgs.args);
|
||||
//If XHR factory fails, cancel the deferred.
|
||||
if(!xhr){
|
||||
dfd.cancel();
|
||||
return dfd;
|
||||
}
|
||||
|
||||
//Allow for specifying the HTTP body completely.
|
||||
if("postData" in args){
|
||||
ioArgs.query = args.postData;
|
||||
}else if("putData" in args){
|
||||
ioArgs.query = args.putData;
|
||||
}else if("rawBody" in args){
|
||||
ioArgs.query = args.rawBody;
|
||||
}else if((arguments.length > 2 && !hasBody) || "POST|PUT".indexOf(method.toUpperCase()) == -1){
|
||||
//Check for hasBody being passed. If no hasBody,
|
||||
//then only append query string if not a POST or PUT request.
|
||||
dojo._ioAddQueryToUrl(ioArgs);
|
||||
}
|
||||
|
||||
// IE 6 is a steaming pile. It won't let you call apply() on the native function (xhr.open).
|
||||
// workaround for IE6's apply() "issues"
|
||||
xhr.open(method, ioArgs.url, args.sync !== true, args.user || undefined, args.password || undefined);
|
||||
if(args.headers){
|
||||
for(var hdr in args.headers){
|
||||
if(hdr.toLowerCase() === "content-type" && !args.contentType){
|
||||
args.contentType = args.headers[hdr];
|
||||
}else if(args.headers[hdr]){
|
||||
//Only add header if it has a value. This allows for instnace, skipping
|
||||
//insertion of X-Requested-With by specifying empty value.
|
||||
xhr.setRequestHeader(hdr, args.headers[hdr]);
|
||||
}
|
||||
}
|
||||
}
|
||||
// FIXME: is this appropriate for all content types?
|
||||
if(args.contentType !== false){
|
||||
xhr.setRequestHeader("Content-Type", args.contentType || _defaultContentType);
|
||||
}
|
||||
if(!args.headers || !("X-Requested-With" in args.headers)){
|
||||
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
|
||||
}
|
||||
// FIXME: set other headers here!
|
||||
dojo._ioNotifyStart(dfd);
|
||||
if(dojo.config.debugAtAllCosts){
|
||||
xhr.send(ioArgs.query);
|
||||
}else{
|
||||
try{
|
||||
xhr.send(ioArgs.query);
|
||||
}catch(e){
|
||||
ioArgs.error = e;
|
||||
dfd.cancel();
|
||||
}
|
||||
}
|
||||
dojo._ioWatch(dfd, _validCheck, _ioCheck, _resHandle);
|
||||
xhr = null;
|
||||
return dfd; // dojo.Deferred
|
||||
};
|
||||
|
||||
dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){
|
||||
// summary:
|
||||
// Sends an HTTP GET request to the server.
|
||||
return dojo.xhr("GET", args); // dojo.Deferred
|
||||
};
|
||||
|
||||
dojo.rawXhrPost = dojo.xhrPost = function(/*dojo.__XhrArgs*/ args){
|
||||
// summary:
|
||||
// Sends an HTTP POST request to the server. In addtion to the properties
|
||||
// listed for the dojo.__XhrArgs type, the following property is allowed:
|
||||
// postData:
|
||||
// String. Send raw data in the body of the POST request.
|
||||
return dojo.xhr("POST", args, true); // dojo.Deferred
|
||||
};
|
||||
|
||||
dojo.rawXhrPut = dojo.xhrPut = function(/*dojo.__XhrArgs*/ args){
|
||||
// summary:
|
||||
// Sends an HTTP PUT request to the server. In addtion to the properties
|
||||
// listed for the dojo.__XhrArgs type, the following property is allowed:
|
||||
// putData:
|
||||
// String. Send raw data in the body of the PUT request.
|
||||
return dojo.xhr("PUT", args, true); // dojo.Deferred
|
||||
};
|
||||
|
||||
dojo.xhrDelete = function(/*dojo.__XhrArgs*/ args){
|
||||
// summary:
|
||||
// Sends an HTTP DELETE request to the server.
|
||||
return dojo.xhr("DELETE", args); //dojo.Deferred
|
||||
};
|
||||
|
||||
/*
|
||||
dojo.wrapForm = function(formNode){
|
||||
//summary:
|
||||
// A replacement for FormBind, but not implemented yet.
|
||||
|
||||
// FIXME: need to think harder about what extensions to this we might
|
||||
// want. What should we allow folks to do w/ this? What events to
|
||||
// set/send?
|
||||
throw new Error("dojo.wrapForm not yet implemented");
|
||||
}
|
||||
*/
|
||||
|
||||
dojo._isDocumentOk = function(http){
|
||||
var stat = http.status || 0;
|
||||
stat =
|
||||
(stat >= 200 && stat < 300) || // allow any 2XX response code
|
||||
stat == 304 || // or, get it out of the cache
|
||||
stat == 1223 || // or, Internet Explorer mangled the status code
|
||||
!stat; // or, we're Titanium/browser chrome/chrome extension requesting a local file
|
||||
return stat; // Boolean
|
||||
};
|
||||
|
||||
dojo._getText = function(url){
|
||||
var result;
|
||||
dojo.xhrGet({url:url, sync:true, load:function(text){
|
||||
result = text;
|
||||
}});
|
||||
return result;
|
||||
};
|
||||
|
||||
// Add aliases for static functions to dojo.xhr since dojo.xhr is what's returned from this module
|
||||
lang.mixin(dojo.xhr, {
|
||||
_xhrObj: dojo._xhrObj,
|
||||
fieldToObject: domForm.fieldToObject,
|
||||
formToObject: domForm.toObject,
|
||||
objectToQuery: ioq.objectToQuery,
|
||||
formToQuery: domForm.toQuery,
|
||||
formToJson: domForm.toJson,
|
||||
queryToObject: ioq.queryToObject,
|
||||
contentHandlers: handlers,
|
||||
_ioSetArgs: dojo._ioSetArgs,
|
||||
_ioCancelAll: dojo._ioCancelAll,
|
||||
_ioNotifyStart: dojo._ioNotifyStart,
|
||||
_ioWatch: dojo._ioWatch,
|
||||
_ioAddQueryToUrl: dojo._ioAddQueryToUrl,
|
||||
_isDocumentOk: dojo._isDocumentOk,
|
||||
_getText: dojo._getText,
|
||||
get: dojo.xhrGet,
|
||||
post: dojo.xhrPost,
|
||||
put: dojo.xhrPut,
|
||||
del: dojo.xhrDelete // because "delete" is a reserved word
|
||||
});
|
||||
|
||||
return dojo.xhr;
|
||||
});
|
||||
@@ -208,4 +208,4 @@
|
||||
text-decoration:none;
|
||||
background:transparent url(tab_rgt_over.png) no-repeat right;
|
||||
color:#FFFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
1183
lib/dojo/_firebug/firebug.js.uncompressed.js
Normal file
1183
lib/dojo/_firebug/firebug.js.uncompressed.js
Normal file
File diff suppressed because it is too large
Load Diff
8
lib/dojo/aspect.js
Normal file
8
lib/dojo/aspect.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/aspect",[],function(){"use strict";var _1=0;function _2(_3,_4,_5,_6){var _7=_3[_4];var _8=_4=="around";var _9;if(_8){var _a=_5(function(){return _7.advice(this,arguments);});_9={remove:function(){_9.cancelled=true;},advice:function(_b,_c){return _9.cancelled?_7.advice(_b,_c):_a.apply(_b,_c);}};}else{_9={remove:function(){var _d=_9.previous;var _e=_9.next;if(!_e&&!_d){delete _3[_4];}else{if(_d){_d.next=_e;}else{_3[_4]=_e;}if(_e){_e.previous=_d;}}},id:_1++,advice:_5,receiveArguments:_6};}if(_7&&!_8){if(_4=="after"){var _f=_7;while(_f){_7=_f;_f=_f.next;}_7.next=_9;_9.previous=_7;}else{if(_4=="before"){_3[_4]=_9;_9.next=_7;_7.previous=_9;}}}else{_3[_4]=_9;}return _9;};function _10(_11){return function(_12,_13,_14,_15){var _16=_12[_13],_17;if(!_16||_16.target!=_12){_12[_13]=_17=function(){var _18=_1;var _19=arguments;var _1a=_17.before;while(_1a){_19=_1a.advice.apply(this,_19)||_19;_1a=_1a.next;}if(_17.around){var _1b=_17.around.advice(this,_19);}var _1c=_17.after;while(_1c&&_1c.id<_18){_1b=_1c.receiveArguments?_1c.advice.apply(this,_19)||_1b:_1c.advice.call(this,_1b);_1c=_1c.next;}return _1b;};if(_16){_17.around={advice:function(_1d,_1e){return _16.apply(_1d,_1e);}};}_17.target=_12;}var _1f=_2((_17||_16),_11,_14,_15);_14=null;return _1f;};};return {before:_10("before"),around:_10("around"),after:_10("after")};});
|
||||
207
lib/dojo/aspect.js.uncompressed.js
Normal file
207
lib/dojo/aspect.js.uncompressed.js
Normal file
@@ -0,0 +1,207 @@
|
||||
define("dojo/aspect", [], function(){
|
||||
|
||||
// TODOC: after/before/around return object
|
||||
// TODOC: after/before/around param types.
|
||||
|
||||
/*=====
|
||||
dojo.aspect = {
|
||||
// summary: provides aspect oriented programming functionality, allowing for
|
||||
// one to add before, around, or after advice on existing methods.
|
||||
//
|
||||
// example:
|
||||
// | define(["dojo/aspect"], function(aspect){
|
||||
// | var signal = aspect.after(targetObject, "methodName", function(someArgument){
|
||||
// | this will be called when targetObject.methodName() is called, after the original function is called
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// The returned signal object can be used to cancel the advice.
|
||||
// | signal.remove(); // this will stop the advice from being executed anymore
|
||||
// | aspect.before(targetObject, "methodName", function(someArgument){
|
||||
// | // this will be called when targetObject.methodName() is called, before the original function is called
|
||||
// | });
|
||||
|
||||
after: function(target, methodName, advice, receiveArguments){
|
||||
// summary: The "after" export of the aspect module is a function that can be used to attach
|
||||
// "after" advice to a method. This function will be executed after the original method
|
||||
// is executed. By default the function will be called with a single argument, the return
|
||||
// value of the original method, or the the return value of the last executed advice (if a previous one exists).
|
||||
// The fourth (optional) argument can be set to true to so the function receives the original
|
||||
// arguments (from when the original method was called) rather than the return value.
|
||||
// If there are multiple "after" advisors, they are executed in the order they were registered.
|
||||
// target: Object
|
||||
// This is the target object
|
||||
// methodName: String
|
||||
// This is the name of the method to attach to.
|
||||
// advice: Function
|
||||
// This is function to be called after the original method
|
||||
// receiveArguments: Boolean?
|
||||
// If this is set to true, the advice function receives the original arguments (from when the original mehtod
|
||||
// was called) rather than the return value of the original/previous method.
|
||||
// returns:
|
||||
// A signal object that can be used to cancel the advice. If remove() is called on this signal object, it will
|
||||
// stop the advice function from being executed.
|
||||
},
|
||||
|
||||
before: function(target, methodName, advice){
|
||||
// summary: The "before" export of the aspect module is a function that can be used to attach
|
||||
// "before" advice to a method. This function will be executed before the original method
|
||||
// is executed. This function will be called with the arguments used to call the method.
|
||||
// This function may optionally return an array as the new arguments to use to call
|
||||
// the original method (or the previous, next-to-execute before advice, if one exists).
|
||||
// If the before method doesn't return anything (returns undefined) the original arguments
|
||||
// will be preserved.
|
||||
// If there are multiple "before" advisors, they are executed in the reverse order they were registered.
|
||||
//
|
||||
// target: Object
|
||||
// This is the target object
|
||||
// methodName: String
|
||||
// This is the name of the method to attach to.
|
||||
// advice: Function
|
||||
// This is function to be called before the original method
|
||||
},
|
||||
|
||||
around: function(target, methodName, advice){
|
||||
// summary: The "around" export of the aspect module is a function that can be used to attach
|
||||
// "around" advice to a method. The advisor function is immediately executed when
|
||||
// the around() is called, is passed a single argument that is a function that can be
|
||||
// called to continue execution of the original method (or the next around advisor).
|
||||
// The advisor function should return a function, and this function will be called whenever
|
||||
// the method is called. It will be called with the arguments used to call the method.
|
||||
// Whatever this function returns will be returned as the result of the method call (unless after advise changes it).
|
||||
//
|
||||
// example:
|
||||
// If there are multiple "around" advisors, the most recent one is executed first,
|
||||
// which can then delegate to the next one and so on. For example:
|
||||
// | around(obj, "foo", function(originalFoo){
|
||||
// | return function(){
|
||||
// | var start = new Date().getTime();
|
||||
// | var results = originalFoo.apply(this, arguments); // call the original
|
||||
// | var end = new Date().getTime();
|
||||
// | console.log("foo execution took " + (end - start) + " ms");
|
||||
// | return results;
|
||||
// | };
|
||||
// | });
|
||||
//
|
||||
// target: Object
|
||||
// This is the target object
|
||||
// methodName: String
|
||||
// This is the name of the method to attach to.
|
||||
// advice: Function
|
||||
// This is function to be called around the original method
|
||||
}
|
||||
|
||||
};
|
||||
=====*/
|
||||
|
||||
"use strict";
|
||||
var nextId = 0;
|
||||
function advise(dispatcher, type, advice, receiveArguments){
|
||||
var previous = dispatcher[type];
|
||||
var around = type == "around";
|
||||
var signal;
|
||||
if(around){
|
||||
var advised = advice(function(){
|
||||
return previous.advice(this, arguments);
|
||||
});
|
||||
signal = {
|
||||
remove: function(){
|
||||
signal.cancelled = true;
|
||||
},
|
||||
advice: function(target, args){
|
||||
return signal.cancelled ?
|
||||
previous.advice(target, args) : // cancelled, skip to next one
|
||||
advised.apply(target, args); // called the advised function
|
||||
}
|
||||
};
|
||||
}else{
|
||||
// create the remove handler
|
||||
signal = {
|
||||
remove: function(){
|
||||
var previous = signal.previous;
|
||||
var next = signal.next;
|
||||
if(!next && !previous){
|
||||
delete dispatcher[type];
|
||||
}else{
|
||||
if(previous){
|
||||
previous.next = next;
|
||||
}else{
|
||||
dispatcher[type] = next;
|
||||
}
|
||||
if(next){
|
||||
next.previous = previous;
|
||||
}
|
||||
}
|
||||
},
|
||||
id: nextId++,
|
||||
advice: advice,
|
||||
receiveArguments: receiveArguments
|
||||
};
|
||||
}
|
||||
if(previous && !around){
|
||||
if(type == "after"){
|
||||
// add the listener to the end of the list
|
||||
var next = previous;
|
||||
while(next){
|
||||
previous = next;
|
||||
next = next.next;
|
||||
}
|
||||
previous.next = signal;
|
||||
signal.previous = previous;
|
||||
}else if(type == "before"){
|
||||
// add to beginning
|
||||
dispatcher[type] = signal;
|
||||
signal.next = previous;
|
||||
previous.previous = signal;
|
||||
}
|
||||
}else{
|
||||
// around or first one just replaces
|
||||
dispatcher[type] = signal;
|
||||
}
|
||||
return signal;
|
||||
}
|
||||
function aspect(type){
|
||||
return function(target, methodName, advice, receiveArguments){
|
||||
var existing = target[methodName], dispatcher;
|
||||
if(!existing || existing.target != target){
|
||||
// no dispatcher in place
|
||||
target[methodName] = dispatcher = function(){
|
||||
var executionId = nextId;
|
||||
// before advice
|
||||
var args = arguments;
|
||||
var before = dispatcher.before;
|
||||
while(before){
|
||||
args = before.advice.apply(this, args) || args;
|
||||
before = before.next;
|
||||
}
|
||||
// around advice
|
||||
if(dispatcher.around){
|
||||
var results = dispatcher.around.advice(this, args);
|
||||
}
|
||||
// after advice
|
||||
var after = dispatcher.after;
|
||||
while(after && after.id < executionId){
|
||||
results = after.receiveArguments ? after.advice.apply(this, args) || results :
|
||||
after.advice.call(this, results);
|
||||
after = after.next;
|
||||
}
|
||||
return results;
|
||||
};
|
||||
if(existing){
|
||||
dispatcher.around = {advice: function(target, args){
|
||||
return existing.apply(target, args);
|
||||
}};
|
||||
}
|
||||
dispatcher.target = target;
|
||||
}
|
||||
var results = advise((dispatcher || existing), type, advice, receiveArguments);
|
||||
advice = null;
|
||||
return results;
|
||||
};
|
||||
}
|
||||
return {
|
||||
before: aspect("before"),
|
||||
around: aspect("around"),
|
||||
after: aspect("after")
|
||||
};
|
||||
});
|
||||
395
lib/dojo/back.js
395
lib/dojo/back.js
@@ -4,396 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.back"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.back"] = true;
|
||||
dojo.provide("dojo.back");
|
||||
|
||||
dojo.getObject("back", true, dojo);
|
||||
|
||||
/*=====
|
||||
dojo.back = {
|
||||
// summary: Browser history management resources
|
||||
}
|
||||
=====*/
|
||||
|
||||
|
||||
(function(){
|
||||
var back = dojo.back,
|
||||
|
||||
// everyone deals with encoding the hash slightly differently
|
||||
|
||||
getHash= back.getHash= function(){
|
||||
var h = window.location.hash;
|
||||
if(h.charAt(0) == "#"){ h = h.substring(1); }
|
||||
return dojo.isMozilla ? h : decodeURIComponent(h);
|
||||
},
|
||||
|
||||
setHash= back.setHash= function(h){
|
||||
if(!h){ h = ""; }
|
||||
window.location.hash = encodeURIComponent(h);
|
||||
historyCounter = history.length;
|
||||
};
|
||||
|
||||
var initialHref = (typeof(window) !== "undefined") ? window.location.href : "";
|
||||
var initialHash = (typeof(window) !== "undefined") ? getHash() : "";
|
||||
var initialState = null;
|
||||
|
||||
var locationTimer = null;
|
||||
var bookmarkAnchor = null;
|
||||
var historyIframe = null;
|
||||
var forwardStack = [];
|
||||
var historyStack = [];
|
||||
var moveForward = false;
|
||||
var changingUrl = false;
|
||||
var historyCounter;
|
||||
|
||||
function handleBackButton(){
|
||||
//summary: private method. Do not call this directly.
|
||||
|
||||
//The "current" page is always at the top of the history stack.
|
||||
var current = historyStack.pop();
|
||||
if(!current){ return; }
|
||||
var last = historyStack[historyStack.length-1];
|
||||
if(!last && historyStack.length == 0){
|
||||
last = initialState;
|
||||
}
|
||||
if(last){
|
||||
if(last.kwArgs["back"]){
|
||||
last.kwArgs["back"]();
|
||||
}else if(last.kwArgs["backButton"]){
|
||||
last.kwArgs["backButton"]();
|
||||
}else if(last.kwArgs["handle"]){
|
||||
last.kwArgs.handle("back");
|
||||
}
|
||||
}
|
||||
forwardStack.push(current);
|
||||
}
|
||||
|
||||
back.goBack = handleBackButton;
|
||||
|
||||
function handleForwardButton(){
|
||||
//summary: private method. Do not call this directly.
|
||||
var last = forwardStack.pop();
|
||||
if(!last){ return; }
|
||||
if(last.kwArgs["forward"]){
|
||||
last.kwArgs.forward();
|
||||
}else if(last.kwArgs["forwardButton"]){
|
||||
last.kwArgs.forwardButton();
|
||||
}else if(last.kwArgs["handle"]){
|
||||
last.kwArgs.handle("forward");
|
||||
}
|
||||
historyStack.push(last);
|
||||
}
|
||||
|
||||
back.goForward = handleForwardButton;
|
||||
|
||||
function createState(url, args, hash){
|
||||
//summary: private method. Do not call this directly.
|
||||
return {"url": url, "kwArgs": args, "urlHash": hash}; //Object
|
||||
}
|
||||
|
||||
function getUrlQuery(url){
|
||||
//summary: private method. Do not call this directly.
|
||||
var segments = url.split("?");
|
||||
if(segments.length < 2){
|
||||
return null; //null
|
||||
}
|
||||
else{
|
||||
return segments[1]; //String
|
||||
}
|
||||
}
|
||||
|
||||
function loadIframeHistory(){
|
||||
//summary: private method. Do not call this directly.
|
||||
var url = (dojo.config["dojoIframeHistoryUrl"] || dojo.moduleUrl("dojo", "resources/iframe_history.html")) + "?" + (new Date()).getTime();
|
||||
moveForward = true;
|
||||
if(historyIframe){
|
||||
dojo.isWebKit ? historyIframe.location = url : window.frames[historyIframe.name].location = url;
|
||||
}else{
|
||||
//console.warn("dojo.back: Not initialised. You need to call dojo.back.init() from a <script> block that lives inside the <body> tag.");
|
||||
}
|
||||
return url; //String
|
||||
}
|
||||
|
||||
function checkLocation(){
|
||||
if(!changingUrl){
|
||||
var hsl = historyStack.length;
|
||||
|
||||
var hash = getHash();
|
||||
|
||||
if((hash === initialHash||window.location.href == initialHref)&&(hsl == 1)){
|
||||
// FIXME: could this ever be a forward button?
|
||||
// we can't clear it because we still need to check for forwards. Ugg.
|
||||
// clearInterval(this.locationTimer);
|
||||
handleBackButton();
|
||||
return;
|
||||
}
|
||||
|
||||
// first check to see if we could have gone forward. We always halt on
|
||||
// a no-hash item.
|
||||
if(forwardStack.length > 0){
|
||||
if(forwardStack[forwardStack.length-1].urlHash === hash){
|
||||
handleForwardButton();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// ok, that didn't work, try someplace back in the history stack
|
||||
if((hsl >= 2)&&(historyStack[hsl-2])){
|
||||
if(historyStack[hsl-2].urlHash === hash){
|
||||
handleBackButton();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
back.init = function(){
|
||||
//summary: Initializes the undo stack. This must be called from a <script>
|
||||
// block that lives inside the <body> tag to prevent bugs on IE.
|
||||
// description:
|
||||
// Only call this method before the page's DOM is finished loading. Otherwise
|
||||
// it will not work. Be careful with xdomain loading or djConfig.debugAtAllCosts scenarios,
|
||||
// in order for this method to work, dojo.back will need to be part of a build layer.
|
||||
if(dojo.byId("dj_history")){ return; } // prevent reinit
|
||||
var src = dojo.config["dojoIframeHistoryUrl"] || dojo.moduleUrl("dojo", "resources/iframe_history.html");
|
||||
if (dojo._postLoad) {
|
||||
console.error("dojo.back.init() must be called before the DOM has loaded. "
|
||||
+ "If using xdomain loading or djConfig.debugAtAllCosts, include dojo.back "
|
||||
+ "in a build layer.");
|
||||
} else {
|
||||
document.write('<iframe style="border:0;width:1px;height:1px;position:absolute;visibility:hidden;bottom:0;right:0;" name="dj_history" id="dj_history" src="' + src + '"></iframe>');
|
||||
}
|
||||
};
|
||||
|
||||
back.setInitialState = function(/*Object*/args){
|
||||
//summary:
|
||||
// Sets the state object and back callback for the very first page
|
||||
// that is loaded.
|
||||
//description:
|
||||
// It is recommended that you call this method as part of an event
|
||||
// listener that is registered via dojo.addOnLoad().
|
||||
//args: Object
|
||||
// See the addToHistory() function for the list of valid args properties.
|
||||
initialState = createState(initialHref, args, initialHash);
|
||||
};
|
||||
|
||||
//FIXME: Make these doc comments not be awful. At least they're not wrong.
|
||||
//FIXME: Would like to support arbitrary back/forward jumps. Have to rework iframeLoaded among other things.
|
||||
//FIXME: is there a slight race condition in moz using change URL with the timer check and when
|
||||
// the hash gets set? I think I have seen a back/forward call in quick succession, but not consistent.
|
||||
|
||||
|
||||
/*=====
|
||||
dojo.__backArgs = function(kwArgs){
|
||||
// back: Function?
|
||||
// A function to be called when this state is reached via the user
|
||||
// clicking the back button.
|
||||
// forward: Function?
|
||||
// Upon return to this state from the "back, forward" combination
|
||||
// of navigation steps, this function will be called. Somewhat
|
||||
// analgous to the semantic of an "onRedo" event handler.
|
||||
// changeUrl: Boolean?|String?
|
||||
// Boolean indicating whether or not to create a unique hash for
|
||||
// this state. If a string is passed instead, it is used as the
|
||||
// hash.
|
||||
}
|
||||
=====*/
|
||||
|
||||
back.addToHistory = function(/*dojo.__backArgs*/ args){
|
||||
// summary:
|
||||
// adds a state object (args) to the history list.
|
||||
// description:
|
||||
// To support getting back button notifications, the object
|
||||
// argument should implement a function called either "back",
|
||||
// "backButton", or "handle". The string "back" will be passed as
|
||||
// the first and only argument to this callback.
|
||||
//
|
||||
// To support getting forward button notifications, the object
|
||||
// argument should implement a function called either "forward",
|
||||
// "forwardButton", or "handle". The string "forward" will be
|
||||
// passed as the first and only argument to this callback.
|
||||
//
|
||||
// If you want the browser location string to change, define "changeUrl" on the object. If the
|
||||
// value of "changeUrl" is true, then a unique number will be appended to the URL as a fragment
|
||||
// identifier (http://some.domain.com/path#uniquenumber). If it is any other value that does
|
||||
// not evaluate to false, that value will be used as the fragment identifier. For example,
|
||||
// if changeUrl: 'page1', then the URL will look like: http://some.domain.com/path#page1
|
||||
//
|
||||
// There are problems with using dojo.back with semantically-named fragment identifiers
|
||||
// ("hash values" on an URL). In most browsers it will be hard for dojo.back to know
|
||||
// distinguish a back from a forward event in those cases. For back/forward support to
|
||||
// work best, the fragment ID should always be a unique value (something using new Date().getTime()
|
||||
// for example). If you want to detect hash changes using semantic fragment IDs, then
|
||||
// consider using dojo.hash instead (in Dojo 1.4+).
|
||||
//
|
||||
// example:
|
||||
// | dojo.back.addToHistory({
|
||||
// | back: function(){ console.log('back pressed'); },
|
||||
// | forward: function(){ console.log('forward pressed'); },
|
||||
// | changeUrl: true
|
||||
// | });
|
||||
|
||||
// BROWSER NOTES:
|
||||
// Safari 1.2:
|
||||
// back button "works" fine, however it's not possible to actually
|
||||
// DETECT that you've moved backwards by inspecting window.location.
|
||||
// Unless there is some other means of locating.
|
||||
// FIXME: perhaps we can poll on history.length?
|
||||
// Safari 2.0.3+ (and probably 1.3.2+):
|
||||
// works fine, except when changeUrl is used. When changeUrl is used,
|
||||
// Safari jumps all the way back to whatever page was shown before
|
||||
// the page that uses dojo.undo.browser support.
|
||||
// IE 5.5 SP2:
|
||||
// back button behavior is macro. It does not move back to the
|
||||
// previous hash value, but to the last full page load. This suggests
|
||||
// that the iframe is the correct way to capture the back button in
|
||||
// these cases.
|
||||
// Don't test this page using local disk for MSIE. MSIE will not create
|
||||
// a history list for iframe_history.html if served from a file: URL.
|
||||
// The XML served back from the XHR tests will also not be properly
|
||||
// created if served from local disk. Serve the test pages from a web
|
||||
// server to test in that browser.
|
||||
// IE 6.0:
|
||||
// same behavior as IE 5.5 SP2
|
||||
// Firefox 1.0+:
|
||||
// the back button will return us to the previous hash on the same
|
||||
// page, thereby not requiring an iframe hack, although we do then
|
||||
// need to run a timer to detect inter-page movement.
|
||||
|
||||
//If addToHistory is called, then that means we prune the
|
||||
//forward stack -- the user went back, then wanted to
|
||||
//start a new forward path.
|
||||
forwardStack = [];
|
||||
|
||||
var hash = null;
|
||||
var url = null;
|
||||
if(!historyIframe){
|
||||
if(dojo.config["useXDomain"] && !dojo.config["dojoIframeHistoryUrl"]){
|
||||
console.warn("dojo.back: When using cross-domain Dojo builds,"
|
||||
+ " please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl"
|
||||
+ " to the path on your domain to iframe_history.html");
|
||||
}
|
||||
historyIframe = window.frames["dj_history"];
|
||||
}
|
||||
if(!bookmarkAnchor){
|
||||
bookmarkAnchor = dojo.create("a", {style: {display: "none"}}, dojo.body());
|
||||
}
|
||||
if(args["changeUrl"]){
|
||||
hash = ""+ ((args["changeUrl"]!==true) ? args["changeUrl"] : (new Date()).getTime());
|
||||
|
||||
//If the current hash matches the new one, just replace the history object with
|
||||
//this new one. It doesn't make sense to track different state objects for the same
|
||||
//logical URL. This matches the browser behavior of only putting in one history
|
||||
//item no matter how many times you click on the same #hash link, at least in Firefox
|
||||
//and Safari, and there is no reliable way in those browsers to know if a #hash link
|
||||
//has been clicked on multiple times. So making this the standard behavior in all browsers
|
||||
//so that dojo.back's behavior is the same in all browsers.
|
||||
if(historyStack.length == 0 && initialState.urlHash == hash){
|
||||
initialState = createState(url, args, hash);
|
||||
return;
|
||||
}else if(historyStack.length > 0 && historyStack[historyStack.length - 1].urlHash == hash){
|
||||
historyStack[historyStack.length - 1] = createState(url, args, hash);
|
||||
return;
|
||||
}
|
||||
|
||||
changingUrl = true;
|
||||
setTimeout(function() {
|
||||
setHash(hash);
|
||||
changingUrl = false;
|
||||
}, 1);
|
||||
bookmarkAnchor.href = hash;
|
||||
|
||||
if(dojo.isIE){
|
||||
url = loadIframeHistory();
|
||||
|
||||
var oldCB = args["back"]||args["backButton"]||args["handle"];
|
||||
|
||||
//The function takes handleName as a parameter, in case the
|
||||
//callback we are overriding was "handle". In that case,
|
||||
//we will need to pass the handle name to handle.
|
||||
var tcb = function(handleName){
|
||||
if(getHash() != ""){
|
||||
setTimeout(function() { setHash(hash); }, 1);
|
||||
}
|
||||
//Use apply to set "this" to args, and to try to avoid memory leaks.
|
||||
oldCB.apply(this, [handleName]);
|
||||
};
|
||||
|
||||
//Set interceptor function in the right place.
|
||||
if(args["back"]){
|
||||
args.back = tcb;
|
||||
}else if(args["backButton"]){
|
||||
args.backButton = tcb;
|
||||
}else if(args["handle"]){
|
||||
args.handle = tcb;
|
||||
}
|
||||
|
||||
var oldFW = args["forward"]||args["forwardButton"]||args["handle"];
|
||||
|
||||
//The function takes handleName as a parameter, in case the
|
||||
//callback we are overriding was "handle". In that case,
|
||||
//we will need to pass the handle name to handle.
|
||||
var tfw = function(handleName){
|
||||
if(getHash() != ""){
|
||||
setHash(hash);
|
||||
}
|
||||
if(oldFW){ // we might not actually have one
|
||||
//Use apply to set "this" to args, and to try to avoid memory leaks.
|
||||
oldFW.apply(this, [handleName]);
|
||||
}
|
||||
};
|
||||
|
||||
//Set interceptor function in the right place.
|
||||
if(args["forward"]){
|
||||
args.forward = tfw;
|
||||
}else if(args["forwardButton"]){
|
||||
args.forwardButton = tfw;
|
||||
}else if(args["handle"]){
|
||||
args.handle = tfw;
|
||||
}
|
||||
|
||||
}else if(!dojo.isIE){
|
||||
// start the timer
|
||||
if(!locationTimer){
|
||||
locationTimer = setInterval(checkLocation, 200);
|
||||
}
|
||||
|
||||
}
|
||||
}else{
|
||||
url = loadIframeHistory();
|
||||
}
|
||||
|
||||
historyStack.push(createState(url, args, hash));
|
||||
};
|
||||
|
||||
back._iframeLoaded = function(evt, ifrLoc){
|
||||
//summary:
|
||||
// private method. Do not call this directly.
|
||||
var query = getUrlQuery(ifrLoc.href);
|
||||
if(query == null){
|
||||
// alert("iframeLoaded");
|
||||
// we hit the end of the history, so we should go back
|
||||
if(historyStack.length == 1){
|
||||
handleBackButton();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(moveForward){
|
||||
// we were expecting it, so it's not either a forward or backward movement
|
||||
moveForward = false;
|
||||
return;
|
||||
}
|
||||
|
||||
//Check the back stack first, since it is more likely.
|
||||
//Note that only one step back or forward is supported.
|
||||
if(historyStack.length >= 2 && query == getUrlQuery(historyStack[historyStack.length-2].url)){
|
||||
handleBackButton();
|
||||
}else if(forwardStack.length > 0 && query == getUrlQuery(forwardStack[forwardStack.length-1].url)){
|
||||
handleForwardButton();
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/back",["./_base/kernel","./_base/lang","./_base/sniff","./dom","./dom-construct","./_base/window","require"],function(_1,_2,_3,_4,_5,_6,_7){_2.getObject("back",true,_1);var _8=_1.back,_9=_8.getHash=function(){var h=window.location.hash;if(h.charAt(0)=="#"){h=h.substring(1);}return _3("mozilla")?h:decodeURIComponent(h);},_a=_8.setHash=function(h){if(!h){h="";}window.location.hash=encodeURIComponent(h);_b=history.length;};var _c=(typeof (window)!=="undefined")?window.location.href:"";var _d=(typeof (window)!=="undefined")?_9():"";var _e=null;var _f=null;var _10=null;var _11=null;var _12=[];var _13=[];var _14=false;var _15=false;var _b;function _16(){var _17=_13.pop();if(!_17){return;}var _18=_13[_13.length-1];if(!_18&&_13.length==0){_18=_e;}if(_18){if(_18.kwArgs["back"]){_18.kwArgs["back"]();}else{if(_18.kwArgs["backButton"]){_18.kwArgs["backButton"]();}else{if(_18.kwArgs["handle"]){_18.kwArgs.handle("back");}}}}_12.push(_17);};_8.goBack=_16;function _19(){var _1a=_12.pop();if(!_1a){return;}if(_1a.kwArgs["forward"]){_1a.kwArgs.forward();}else{if(_1a.kwArgs["forwardButton"]){_1a.kwArgs.forwardButton();}else{if(_1a.kwArgs["handle"]){_1a.kwArgs.handle("forward");}}}_13.push(_1a);};_8.goForward=_19;function _1b(url,_1c,_1d){return {"url":url,"kwArgs":_1c,"urlHash":_1d};};function _1e(url){var _1f=url.split("?");if(_1f.length<2){return null;}else{return _1f[1];}};function _20(){var url=(_1.config["dojoIframeHistoryUrl"]||_7.toUrl("./resources/iframe_history.html"))+"?"+(new Date()).getTime();_14=true;if(_11){_3("webkit")?_11.location=url:window.frames[_11.name].location=url;}else{}return url;};function _21(){if(!_15){var hsl=_13.length;var _22=_9();if((_22===_d||window.location.href==_c)&&(hsl==1)){_16();return;}if(_12.length>0){if(_12[_12.length-1].urlHash===_22){_19();return;}}if((hsl>=2)&&(_13[hsl-2])){if(_13[hsl-2].urlHash===_22){_16();}}}};_8.init=function(){if(_4.byId("dj_history")){return;}var src=_1.config["dojoIframeHistoryUrl"]||_7.toUrl("./resources/iframe_history.html");if(_1._postLoad){console.error("dojo.back.init() must be called before the DOM has loaded. "+"If using xdomain loading or djConfig.debugAtAllCosts, include dojo.back "+"in a build layer.");}else{document.write("<iframe style=\"border:0;width:1px;height:1px;position:absolute;visibility:hidden;bottom:0;right:0;\" name=\"dj_history\" id=\"dj_history\" src=\""+src+"\"></iframe>");}};_8.setInitialState=function(_23){_e=_1b(_c,_23,_d);};_8.addToHistory=function(_24){_12=[];var _25=null;var url=null;if(!_11){if(_1.config["useXDomain"]&&!_1.config["dojoIframeHistoryUrl"]){console.warn("dojo.back: When using cross-domain Dojo builds,"+" please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl"+" to the path on your domain to iframe_history.html");}_11=window.frames["dj_history"];}if(!_10){_10=_5.create("a",{style:{display:"none"}},_6.body());}if(_24["changeUrl"]){_25=""+((_24["changeUrl"]!==true)?_24["changeUrl"]:(new Date()).getTime());if(_13.length==0&&_e.urlHash==_25){_e=_1b(url,_24,_25);return;}else{if(_13.length>0&&_13[_13.length-1].urlHash==_25){_13[_13.length-1]=_1b(url,_24,_25);return;}}_15=true;setTimeout(function(){_a(_25);_15=false;},1);_10.href=_25;if(_3("ie")){url=_20();var _26=_24["back"]||_24["backButton"]||_24["handle"];var tcb=function(_27){if(_9()!=""){setTimeout(function(){_a(_25);},1);}_26.apply(this,[_27]);};if(_24["back"]){_24.back=tcb;}else{if(_24["backButton"]){_24.backButton=tcb;}else{if(_24["handle"]){_24.handle=tcb;}}}var _28=_24["forward"]||_24["forwardButton"]||_24["handle"];var tfw=function(_29){if(_9()!=""){_a(_25);}if(_28){_28.apply(this,[_29]);}};if(_24["forward"]){_24.forward=tfw;}else{if(_24["forwardButton"]){_24.forwardButton=tfw;}else{if(_24["handle"]){_24.handle=tfw;}}}}else{if(!_3("ie")){if(!_f){_f=setInterval(_21,200);}}}}else{url=_20();}_13.push(_1b(url,_24,_25));};_8._iframeLoaded=function(evt,_2a){var _2b=_1e(_2a.href);if(_2b==null){if(_13.length==1){_16();}return;}if(_14){_14=false;return;}if(_13.length>=2&&_2b==_1e(_13[_13.length-2].url)){_16();}else{if(_12.length>0&&_2b==_1e(_12[_12.length-1].url)){_19();}}};return _1.back;});
|
||||
397
lib/dojo/back.js.uncompressed.js
Normal file
397
lib/dojo/back.js.uncompressed.js
Normal file
@@ -0,0 +1,397 @@
|
||||
define("dojo/back", ["./_base/kernel", "./_base/lang", "./_base/sniff", "./dom", "./dom-construct", "./_base/window", "require"], function(dojo, lang, sniff, dom, domConstruct, baseWindow, require) {
|
||||
// module:
|
||||
// dojo/back
|
||||
// summary:
|
||||
// TODOC
|
||||
|
||||
lang.getObject("back", true, dojo);
|
||||
|
||||
/*=====
|
||||
dojo.back = {
|
||||
// summary: Browser history management resources
|
||||
};
|
||||
=====*/
|
||||
|
||||
var back = dojo.back,
|
||||
|
||||
// everyone deals with encoding the hash slightly differently
|
||||
|
||||
getHash = back.getHash = function(){
|
||||
var h = window.location.hash;
|
||||
if(h.charAt(0) == "#"){ h = h.substring(1); }
|
||||
return sniff("mozilla") ? h : decodeURIComponent(h);
|
||||
},
|
||||
|
||||
setHash = back.setHash = function(h){
|
||||
if(!h){ h = ""; }
|
||||
window.location.hash = encodeURIComponent(h);
|
||||
historyCounter = history.length;
|
||||
};
|
||||
|
||||
var initialHref = (typeof(window) !== "undefined") ? window.location.href : "";
|
||||
var initialHash = (typeof(window) !== "undefined") ? getHash() : "";
|
||||
var initialState = null;
|
||||
|
||||
var locationTimer = null;
|
||||
var bookmarkAnchor = null;
|
||||
var historyIframe = null;
|
||||
var forwardStack = [];
|
||||
var historyStack = [];
|
||||
var moveForward = false;
|
||||
var changingUrl = false;
|
||||
var historyCounter;
|
||||
|
||||
function handleBackButton(){
|
||||
//summary: private method. Do not call this directly.
|
||||
|
||||
//The "current" page is always at the top of the history stack.
|
||||
var current = historyStack.pop();
|
||||
if(!current){ return; }
|
||||
var last = historyStack[historyStack.length-1];
|
||||
if(!last && historyStack.length == 0){
|
||||
last = initialState;
|
||||
}
|
||||
if(last){
|
||||
if(last.kwArgs["back"]){
|
||||
last.kwArgs["back"]();
|
||||
}else if(last.kwArgs["backButton"]){
|
||||
last.kwArgs["backButton"]();
|
||||
}else if(last.kwArgs["handle"]){
|
||||
last.kwArgs.handle("back");
|
||||
}
|
||||
}
|
||||
forwardStack.push(current);
|
||||
}
|
||||
|
||||
back.goBack = handleBackButton;
|
||||
|
||||
function handleForwardButton(){
|
||||
//summary: private method. Do not call this directly.
|
||||
var last = forwardStack.pop();
|
||||
if(!last){ return; }
|
||||
if(last.kwArgs["forward"]){
|
||||
last.kwArgs.forward();
|
||||
}else if(last.kwArgs["forwardButton"]){
|
||||
last.kwArgs.forwardButton();
|
||||
}else if(last.kwArgs["handle"]){
|
||||
last.kwArgs.handle("forward");
|
||||
}
|
||||
historyStack.push(last);
|
||||
}
|
||||
|
||||
back.goForward = handleForwardButton;
|
||||
|
||||
function createState(url, args, hash){
|
||||
//summary: private method. Do not call this directly.
|
||||
return {"url": url, "kwArgs": args, "urlHash": hash}; //Object
|
||||
}
|
||||
|
||||
function getUrlQuery(url){
|
||||
//summary: private method. Do not call this directly.
|
||||
var segments = url.split("?");
|
||||
if(segments.length < 2){
|
||||
return null; //null
|
||||
}
|
||||
else{
|
||||
return segments[1]; //String
|
||||
}
|
||||
}
|
||||
|
||||
function loadIframeHistory(){
|
||||
//summary: private method. Do not call this directly.
|
||||
var url = (dojo.config["dojoIframeHistoryUrl"] || require.toUrl("./resources/iframe_history.html")) + "?" + (new Date()).getTime();
|
||||
moveForward = true;
|
||||
if(historyIframe){
|
||||
sniff("webkit") ? historyIframe.location = url : window.frames[historyIframe.name].location = url;
|
||||
}else{
|
||||
//console.warn("dojo.back: Not initialised. You need to call dojo.back.init() from a <script> block that lives inside the <body> tag.");
|
||||
}
|
||||
return url; //String
|
||||
}
|
||||
|
||||
function checkLocation(){
|
||||
if(!changingUrl){
|
||||
var hsl = historyStack.length;
|
||||
|
||||
var hash = getHash();
|
||||
|
||||
if((hash === initialHash||window.location.href == initialHref)&&(hsl == 1)){
|
||||
// FIXME: could this ever be a forward button?
|
||||
// we can't clear it because we still need to check for forwards. Ugg.
|
||||
// clearInterval(this.locationTimer);
|
||||
handleBackButton();
|
||||
return;
|
||||
}
|
||||
|
||||
// first check to see if we could have gone forward. We always halt on
|
||||
// a no-hash item.
|
||||
if(forwardStack.length > 0){
|
||||
if(forwardStack[forwardStack.length-1].urlHash === hash){
|
||||
handleForwardButton();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// ok, that didn't work, try someplace back in the history stack
|
||||
if((hsl >= 2)&&(historyStack[hsl-2])){
|
||||
if(historyStack[hsl-2].urlHash === hash){
|
||||
handleBackButton();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
back.init = function(){
|
||||
//summary: Initializes the undo stack. This must be called from a <script>
|
||||
// block that lives inside the <body> tag to prevent bugs on IE.
|
||||
// description:
|
||||
// Only call this method before the page's DOM is finished loading. Otherwise
|
||||
// it will not work. Be careful with xdomain loading or djConfig.debugAtAllCosts scenarios,
|
||||
// in order for this method to work, dojo.back will need to be part of a build layer.
|
||||
|
||||
// prevent reinit
|
||||
if(dom.byId("dj_history")){ return; }
|
||||
|
||||
var src = dojo.config["dojoIframeHistoryUrl"] || require.toUrl("./resources/iframe_history.html");
|
||||
if (dojo._postLoad) {
|
||||
console.error("dojo.back.init() must be called before the DOM has loaded. "
|
||||
+ "If using xdomain loading or djConfig.debugAtAllCosts, include dojo.back "
|
||||
+ "in a build layer.");
|
||||
} else {
|
||||
document.write('<iframe style="border:0;width:1px;height:1px;position:absolute;visibility:hidden;bottom:0;right:0;" name="dj_history" id="dj_history" src="' + src + '"></iframe>');
|
||||
}
|
||||
};
|
||||
|
||||
back.setInitialState = function(/*Object*/args){
|
||||
//summary:
|
||||
// Sets the state object and back callback for the very first page
|
||||
// that is loaded.
|
||||
//description:
|
||||
// It is recommended that you call this method as part of an event
|
||||
// listener that is registered via dojo.addOnLoad().
|
||||
//args: Object
|
||||
// See the addToHistory() function for the list of valid args properties.
|
||||
initialState = createState(initialHref, args, initialHash);
|
||||
};
|
||||
|
||||
//FIXME: Make these doc comments not be awful. At least they're not wrong.
|
||||
//FIXME: Would like to support arbitrary back/forward jumps. Have to rework iframeLoaded among other things.
|
||||
//FIXME: is there a slight race condition in moz using change URL with the timer check and when
|
||||
// the hash gets set? I think I have seen a back/forward call in quick succession, but not consistent.
|
||||
|
||||
|
||||
/*=====
|
||||
dojo.__backArgs = function(kwArgs){
|
||||
// back: Function?
|
||||
// A function to be called when this state is reached via the user
|
||||
// clicking the back button.
|
||||
// forward: Function?
|
||||
// Upon return to this state from the "back, forward" combination
|
||||
// of navigation steps, this function will be called. Somewhat
|
||||
// analgous to the semantic of an "onRedo" event handler.
|
||||
// changeUrl: Boolean?|String?
|
||||
// Boolean indicating whether or not to create a unique hash for
|
||||
// this state. If a string is passed instead, it is used as the
|
||||
// hash.
|
||||
}
|
||||
=====*/
|
||||
|
||||
back.addToHistory = function(/*dojo.__backArgs*/ args){
|
||||
// summary:
|
||||
// adds a state object (args) to the history list.
|
||||
// args: dojo.__backArgs
|
||||
// The state object that will be added to the history list.
|
||||
// description:
|
||||
// To support getting back button notifications, the object
|
||||
// argument should implement a function called either "back",
|
||||
// "backButton", or "handle". The string "back" will be passed as
|
||||
// the first and only argument to this callback.
|
||||
//
|
||||
// To support getting forward button notifications, the object
|
||||
// argument should implement a function called either "forward",
|
||||
// "forwardButton", or "handle". The string "forward" will be
|
||||
// passed as the first and only argument to this callback.
|
||||
//
|
||||
// If you want the browser location string to change, define "changeUrl" on the object. If the
|
||||
// value of "changeUrl" is true, then a unique number will be appended to the URL as a fragment
|
||||
// identifier (http://some.domain.com/path#uniquenumber). If it is any other value that does
|
||||
// not evaluate to false, that value will be used as the fragment identifier. For example,
|
||||
// if changeUrl: 'page1', then the URL will look like: http://some.domain.com/path#page1
|
||||
//
|
||||
// There are problems with using dojo.back with semantically-named fragment identifiers
|
||||
// ("hash values" on an URL). In most browsers it will be hard for dojo.back to know
|
||||
// distinguish a back from a forward event in those cases. For back/forward support to
|
||||
// work best, the fragment ID should always be a unique value (something using new Date().getTime()
|
||||
// for example). If you want to detect hash changes using semantic fragment IDs, then
|
||||
// consider using dojo.hash instead (in Dojo 1.4+).
|
||||
//
|
||||
// example:
|
||||
// | dojo.back.addToHistory({
|
||||
// | back: function(){ console.log('back pressed'); },
|
||||
// | forward: function(){ console.log('forward pressed'); },
|
||||
// | changeUrl: true
|
||||
// | });
|
||||
|
||||
// BROWSER NOTES:
|
||||
// Safari 1.2:
|
||||
// back button "works" fine, however it's not possible to actually
|
||||
// DETECT that you've moved backwards by inspecting window.location.
|
||||
// Unless there is some other means of locating.
|
||||
// FIXME: perhaps we can poll on history.length?
|
||||
// Safari 2.0.3+ (and probably 1.3.2+):
|
||||
// works fine, except when changeUrl is used. When changeUrl is used,
|
||||
// Safari jumps all the way back to whatever page was shown before
|
||||
// the page that uses dojo.undo.browser support.
|
||||
// IE 5.5 SP2:
|
||||
// back button behavior is macro. It does not move back to the
|
||||
// previous hash value, but to the last full page load. This suggests
|
||||
// that the iframe is the correct way to capture the back button in
|
||||
// these cases.
|
||||
// Don't test this page using local disk for MSIE. MSIE will not create
|
||||
// a history list for iframe_history.html if served from a file: URL.
|
||||
// The XML served back from the XHR tests will also not be properly
|
||||
// created if served from local disk. Serve the test pages from a web
|
||||
// server to test in that browser.
|
||||
// IE 6.0:
|
||||
// same behavior as IE 5.5 SP2
|
||||
// Firefox 1.0+:
|
||||
// the back button will return us to the previous hash on the same
|
||||
// page, thereby not requiring an iframe hack, although we do then
|
||||
// need to run a timer to detect inter-page movement.
|
||||
|
||||
//If addToHistory is called, then that means we prune the
|
||||
//forward stack -- the user went back, then wanted to
|
||||
//start a new forward path.
|
||||
forwardStack = [];
|
||||
|
||||
var hash = null;
|
||||
var url = null;
|
||||
if(!historyIframe){
|
||||
if(dojo.config["useXDomain"] && !dojo.config["dojoIframeHistoryUrl"]){
|
||||
console.warn("dojo.back: When using cross-domain Dojo builds,"
|
||||
+ " please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl"
|
||||
+ " to the path on your domain to iframe_history.html");
|
||||
}
|
||||
historyIframe = window.frames["dj_history"];
|
||||
}
|
||||
if(!bookmarkAnchor){
|
||||
bookmarkAnchor = domConstruct.create("a", {style: {display: "none"}}, baseWindow.body());
|
||||
}
|
||||
if(args["changeUrl"]){
|
||||
hash = ""+ ((args["changeUrl"]!==true) ? args["changeUrl"] : (new Date()).getTime());
|
||||
|
||||
//If the current hash matches the new one, just replace the history object with
|
||||
//this new one. It doesn't make sense to track different state objects for the same
|
||||
//logical URL. This matches the browser behavior of only putting in one history
|
||||
//item no matter how many times you click on the same #hash link, at least in Firefox
|
||||
//and Safari, and there is no reliable way in those browsers to know if a #hash link
|
||||
//has been clicked on multiple times. So making this the standard behavior in all browsers
|
||||
//so that dojo.back's behavior is the same in all browsers.
|
||||
if(historyStack.length == 0 && initialState.urlHash == hash){
|
||||
initialState = createState(url, args, hash);
|
||||
return;
|
||||
}else if(historyStack.length > 0 && historyStack[historyStack.length - 1].urlHash == hash){
|
||||
historyStack[historyStack.length - 1] = createState(url, args, hash);
|
||||
return;
|
||||
}
|
||||
|
||||
changingUrl = true;
|
||||
setTimeout(function() {
|
||||
setHash(hash);
|
||||
changingUrl = false;
|
||||
}, 1);
|
||||
bookmarkAnchor.href = hash;
|
||||
|
||||
if(sniff("ie")){
|
||||
url = loadIframeHistory();
|
||||
|
||||
var oldCB = args["back"]||args["backButton"]||args["handle"];
|
||||
|
||||
//The function takes handleName as a parameter, in case the
|
||||
//callback we are overriding was "handle". In that case,
|
||||
//we will need to pass the handle name to handle.
|
||||
var tcb = function(handleName){
|
||||
if(getHash() != ""){
|
||||
setTimeout(function() { setHash(hash); }, 1);
|
||||
}
|
||||
//Use apply to set "this" to args, and to try to avoid memory leaks.
|
||||
oldCB.apply(this, [handleName]);
|
||||
};
|
||||
|
||||
//Set interceptor function in the right place.
|
||||
if(args["back"]){
|
||||
args.back = tcb;
|
||||
}else if(args["backButton"]){
|
||||
args.backButton = tcb;
|
||||
}else if(args["handle"]){
|
||||
args.handle = tcb;
|
||||
}
|
||||
|
||||
var oldFW = args["forward"]||args["forwardButton"]||args["handle"];
|
||||
|
||||
//The function takes handleName as a parameter, in case the
|
||||
//callback we are overriding was "handle". In that case,
|
||||
//we will need to pass the handle name to handle.
|
||||
var tfw = function(handleName){
|
||||
if(getHash() != ""){
|
||||
setHash(hash);
|
||||
}
|
||||
if(oldFW){ // we might not actually have one
|
||||
//Use apply to set "this" to args, and to try to avoid memory leaks.
|
||||
oldFW.apply(this, [handleName]);
|
||||
}
|
||||
};
|
||||
|
||||
//Set interceptor function in the right place.
|
||||
if(args["forward"]){
|
||||
args.forward = tfw;
|
||||
}else if(args["forwardButton"]){
|
||||
args.forwardButton = tfw;
|
||||
}else if(args["handle"]){
|
||||
args.handle = tfw;
|
||||
}
|
||||
|
||||
}else if(!sniff("ie")){
|
||||
// start the timer
|
||||
if(!locationTimer){
|
||||
locationTimer = setInterval(checkLocation, 200);
|
||||
}
|
||||
|
||||
}
|
||||
}else{
|
||||
url = loadIframeHistory();
|
||||
}
|
||||
|
||||
historyStack.push(createState(url, args, hash));
|
||||
};
|
||||
|
||||
back._iframeLoaded = function(evt, ifrLoc){
|
||||
//summary:
|
||||
// private method. Do not call this directly.
|
||||
var query = getUrlQuery(ifrLoc.href);
|
||||
if(query == null){
|
||||
// alert("iframeLoaded");
|
||||
// we hit the end of the history, so we should go back
|
||||
if(historyStack.length == 1){
|
||||
handleBackButton();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(moveForward){
|
||||
// we were expecting it, so it's not either a forward or backward movement
|
||||
moveForward = false;
|
||||
return;
|
||||
}
|
||||
|
||||
//Check the back stack first, since it is more likely.
|
||||
//Note that only one step back or forward is supported.
|
||||
if(historyStack.length >= 2 && query == getUrlQuery(historyStack[historyStack.length-2].url)){
|
||||
handleBackButton();
|
||||
}else if(forwardStack.length > 0 && query == getUrlQuery(forwardStack[forwardStack.length-1].url)){
|
||||
handleForwardButton();
|
||||
}
|
||||
};
|
||||
|
||||
return dojo.back;
|
||||
|
||||
});
|
||||
@@ -4,248 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.behavior"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.behavior"] = true;
|
||||
dojo.provide("dojo.behavior");
|
||||
|
||||
|
||||
dojo.behavior = new function(){
|
||||
// summary:
|
||||
// Utility for unobtrusive/progressive event binding, DOM traversal,
|
||||
// and manipulation.
|
||||
//
|
||||
// description:
|
||||
//
|
||||
// A very simple, lightweight mechanism for applying code to
|
||||
// existing documents, based around `dojo.query` (CSS3 selectors) for node selection,
|
||||
// and a simple two-command API: `dojo.behavior.add()` and `dojo.behavior.apply()`;
|
||||
//
|
||||
// Behaviors apply to a given page, and are registered following the syntax
|
||||
// options described by `dojo.behavior.add` to match nodes to actions, or "behaviors".
|
||||
//
|
||||
// Added behaviors are applied to the current DOM when .apply() is called,
|
||||
// matching only new nodes found since .apply() was last called.
|
||||
//
|
||||
function arrIn(obj, name){
|
||||
if(!obj[name]){ obj[name] = []; }
|
||||
return obj[name];
|
||||
}
|
||||
|
||||
var _inc = 0;
|
||||
|
||||
function forIn(obj, scope, func){
|
||||
var tmpObj = {};
|
||||
for(var x in obj){
|
||||
if(typeof tmpObj[x] == "undefined"){
|
||||
if(!func){
|
||||
scope(obj[x], x);
|
||||
}else{
|
||||
func.call(scope, obj[x], x);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: need a better test so we don't exclude nightly Safari's!
|
||||
this._behaviors = {};
|
||||
this.add = function(/* Object */behaviorObj){
|
||||
// summary:
|
||||
// Add the specified behavior to the list of behaviors, ignoring existing
|
||||
// matches.
|
||||
//
|
||||
// description:
|
||||
// Add the specified behavior to the list of behaviors which will
|
||||
// be applied the next time apply() is called. Calls to add() for
|
||||
// an already existing behavior do not replace the previous rules,
|
||||
// but are instead additive. New nodes which match the rule will
|
||||
// have all add()-ed behaviors applied to them when matched.
|
||||
//
|
||||
// The "found" method is a generalized handler that's called as soon
|
||||
// as the node matches the selector. Rules for values that follow also
|
||||
// apply to the "found" key.
|
||||
//
|
||||
// The "on*" handlers are attached with `dojo.connect()`, using the
|
||||
// matching node
|
||||
//
|
||||
// If the value corresponding to the ID key is a function and not a
|
||||
// list, it's treated as though it was the value of "found".
|
||||
//
|
||||
// dojo.behavior.add() can be called any number of times before
|
||||
// the DOM is ready. `dojo.behavior.apply()` is called automatically
|
||||
// by `dojo.addOnLoad`, though can be called to re-apply previously added
|
||||
// behaviors anytime the DOM changes.
|
||||
//
|
||||
// There are a variety of formats permitted in the behaviorObject
|
||||
//
|
||||
// example:
|
||||
// Simple list of properties. "found" is special. "Found" is assumed if
|
||||
// no property object for a given selector, and property is a function.
|
||||
//
|
||||
// | dojo.behavior.add({
|
||||
// | "#id": {
|
||||
// | "found": function(element){
|
||||
// | // node match found
|
||||
// | },
|
||||
// | "onclick": function(evt){
|
||||
// | // register onclick handler for found node
|
||||
// | }
|
||||
// | },
|
||||
// | "#otherid": function(element){
|
||||
// | // assumes "found" with this syntax
|
||||
// | }
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// If property is a string, a dojo.publish will be issued on the channel:
|
||||
//
|
||||
// | dojo.behavior.add({
|
||||
// | // dojo.publish() whenever class="noclick" found on anchors
|
||||
// | "a.noclick": "/got/newAnchor",
|
||||
// | "div.wrapper": {
|
||||
// | "onclick": "/node/wasClicked"
|
||||
// | }
|
||||
// | });
|
||||
// | dojo.subscribe("/got/newAnchor", function(node){
|
||||
// | // handle node finding when dojo.behavior.apply() is called,
|
||||
// | // provided a newly matched node is found.
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// Scoping can be accomplished by passing an object as a property to
|
||||
// a connection handle (on*):
|
||||
//
|
||||
// | dojo.behavior.add({
|
||||
// | "#id": {
|
||||
// | // like calling dojo.hitch(foo,"bar"). execute foo.bar() in scope of foo
|
||||
// | "onmouseenter": { targetObj: foo, targetFunc: "bar" },
|
||||
// | "onmouseleave": { targetObj: foo, targetFunc: "baz" }
|
||||
// | }
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// Bahaviors match on CSS3 Selectors, powered by dojo.query. Example selectors:
|
||||
//
|
||||
// | dojo.behavior.add({
|
||||
// | // match all direct descendants
|
||||
// | "#id4 > *": function(element){
|
||||
// | // ...
|
||||
// | },
|
||||
// |
|
||||
// | // match the first child node that's an element
|
||||
// | "#id4 > :first-child": { ... },
|
||||
// |
|
||||
// | // match the last child node that's an element
|
||||
// | "#id4 > :last-child": { ... },
|
||||
// |
|
||||
// | // all elements of type tagname
|
||||
// | "tagname": {
|
||||
// | // ...
|
||||
// | },
|
||||
// |
|
||||
// | "tagname1 tagname2 tagname3": {
|
||||
// | // ...
|
||||
// | },
|
||||
// |
|
||||
// | ".classname": {
|
||||
// | // ...
|
||||
// | },
|
||||
// |
|
||||
// | "tagname.classname": {
|
||||
// | // ...
|
||||
// | }
|
||||
// | });
|
||||
//
|
||||
|
||||
var tmpObj = {};
|
||||
forIn(behaviorObj, this, function(behavior, name){
|
||||
var tBehavior = arrIn(this._behaviors, name);
|
||||
if(typeof tBehavior["id"] != "number"){
|
||||
tBehavior.id = _inc++;
|
||||
}
|
||||
var cversion = [];
|
||||
tBehavior.push(cversion);
|
||||
if((dojo.isString(behavior))||(dojo.isFunction(behavior))){
|
||||
behavior = { found: behavior };
|
||||
}
|
||||
forIn(behavior, function(rule, ruleName){
|
||||
arrIn(cversion, ruleName).push(rule);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
var _applyToNode = function(node, action, ruleSetName){
|
||||
if(dojo.isString(action)){
|
||||
if(ruleSetName == "found"){
|
||||
dojo.publish(action, [ node ]);
|
||||
}else{
|
||||
dojo.connect(node, ruleSetName, function(){
|
||||
dojo.publish(action, arguments);
|
||||
});
|
||||
}
|
||||
}else if(dojo.isFunction(action)){
|
||||
if(ruleSetName == "found"){
|
||||
action(node);
|
||||
}else{
|
||||
dojo.connect(node, ruleSetName, action);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.apply = function(){
|
||||
// summary:
|
||||
// Applies all currently registered behaviors to the document.
|
||||
//
|
||||
// description:
|
||||
// Applies all currently registered behaviors to the document,
|
||||
// taking care to ensure that only incremental updates are made
|
||||
// since the last time add() or apply() were called.
|
||||
//
|
||||
// If new matching nodes have been added, all rules in a behavior will be
|
||||
// applied to that node. For previously matched nodes, only
|
||||
// behaviors which have been added since the last call to apply()
|
||||
// will be added to the nodes.
|
||||
//
|
||||
// apply() is called once automatically by `dojo.addOnLoad`, so
|
||||
// registering behaviors with `dojo.behavior.add` before the DOM is
|
||||
// ready is acceptable, provided the dojo.behavior module is ready.
|
||||
//
|
||||
// Calling appy() manually after manipulating the DOM is required
|
||||
// to rescan the DOM and apply newly .add()ed behaviors, or to match
|
||||
// nodes that match existing behaviors when those nodes are added to
|
||||
// the DOM.
|
||||
//
|
||||
forIn(this._behaviors, function(tBehavior, id){
|
||||
dojo.query(id).forEach(
|
||||
function(elem){
|
||||
var runFrom = 0;
|
||||
var bid = "_dj_behavior_"+tBehavior.id;
|
||||
if(typeof elem[bid] == "number"){
|
||||
runFrom = elem[bid];
|
||||
if(runFrom == (tBehavior.length)){
|
||||
return;
|
||||
}
|
||||
}
|
||||
// run through the versions, applying newer rules at each step
|
||||
|
||||
for(var x=runFrom, tver; tver = tBehavior[x]; x++){
|
||||
forIn(tver, function(ruleSet, ruleSetName){
|
||||
if(dojo.isArray(ruleSet)){
|
||||
dojo.forEach(ruleSet, function(action){
|
||||
_applyToNode(elem, action, ruleSetName);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// ensure that re-application only adds new rules to the node
|
||||
elem[bid] = tBehavior.length;
|
||||
}
|
||||
);
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
dojo.addOnLoad(dojo.behavior, "apply");
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/behavior",["./_base/kernel","./_base/lang","./_base/array","./_base/connect","./query","./ready"],function(_1,_2,_3,_4,_5,_6){_1.behavior=new function(){function _7(_8,_9){if(!_8[_9]){_8[_9]=[];}return _8[_9];};var _a=0;function _b(_c,_d,_e){var _f={};for(var x in _c){if(typeof _f[x]=="undefined"){if(!_e){_d(_c[x],x);}else{_e.call(_d,_c[x],x);}}}};this._behaviors={};this.add=function(_10){_b(_10,this,function(_11,_12){var _13=_7(this._behaviors,_12);if(typeof _13["id"]!="number"){_13.id=_a++;}var _14=[];_13.push(_14);if((_2.isString(_11))||(_2.isFunction(_11))){_11={found:_11};}_b(_11,function(_15,_16){_7(_14,_16).push(_15);});});};var _17=function(_18,_19,_1a){if(_2.isString(_19)){if(_1a=="found"){_4.publish(_19,[_18]);}else{_4.connect(_18,_1a,function(){_4.publish(_19,arguments);});}}else{if(_2.isFunction(_19)){if(_1a=="found"){_19(_18);}else{_4.connect(_18,_1a,_19);}}}};this.apply=function(){_b(this._behaviors,function(_1b,id){_5(id).forEach(function(_1c){var _1d=0;var bid="_dj_behavior_"+_1b.id;if(typeof _1c[bid]=="number"){_1d=_1c[bid];if(_1d==(_1b.length)){return;}}for(var x=_1d,_1e;_1e=_1b[x];x++){_b(_1e,function(_1f,_20){if(_2.isArray(_1f)){_3.forEach(_1f,function(_21){_17(_1c,_21,_20);});}});}_1c[bid]=_1b.length;});});};};_6(_1.behavior,"apply");return _1.behavior;});
|
||||
248
lib/dojo/behavior.js.uncompressed.js
Normal file
248
lib/dojo/behavior.js.uncompressed.js
Normal file
@@ -0,0 +1,248 @@
|
||||
define("dojo/behavior", ["./_base/kernel", "./_base/lang", "./_base/array", "./_base/connect", "./query", "./ready"], function(dojo, lang, darray, connect, query, ready) {
|
||||
// module:
|
||||
// dojo/behavior
|
||||
// summary:
|
||||
// TODOC
|
||||
|
||||
|
||||
dojo.behavior = new function(){
|
||||
// summary:
|
||||
// Utility for unobtrusive/progressive event binding, DOM traversal,
|
||||
// and manipulation.
|
||||
//
|
||||
// description:
|
||||
//
|
||||
// A very simple, lightweight mechanism for applying code to
|
||||
// existing documents, based around `dojo.query` (CSS3 selectors) for node selection,
|
||||
// and a simple two-command API: `dojo.behavior.add()` and `dojo.behavior.apply()`;
|
||||
//
|
||||
// Behaviors apply to a given page, and are registered following the syntax
|
||||
// options described by `dojo.behavior.add` to match nodes to actions, or "behaviors".
|
||||
//
|
||||
// Added behaviors are applied to the current DOM when .apply() is called,
|
||||
// matching only new nodes found since .apply() was last called.
|
||||
//
|
||||
function arrIn(obj, name){
|
||||
if(!obj[name]){ obj[name] = []; }
|
||||
return obj[name];
|
||||
}
|
||||
|
||||
var _inc = 0;
|
||||
|
||||
function forIn(obj, scope, func){
|
||||
var tmpObj = {};
|
||||
for(var x in obj){
|
||||
if(typeof tmpObj[x] == "undefined"){
|
||||
if(!func){
|
||||
scope(obj[x], x);
|
||||
}else{
|
||||
func.call(scope, obj[x], x);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: need a better test so we don't exclude nightly Safari's!
|
||||
this._behaviors = {};
|
||||
this.add = function(/* Object */behaviorObj){
|
||||
// summary:
|
||||
// Add the specified behavior to the list of behaviors, ignoring existing
|
||||
// matches.
|
||||
// behaviorObj: Object
|
||||
// The behavior object that will be added to behaviors list. The behaviors
|
||||
// in the list will be applied the next time apply() is called.
|
||||
// description:
|
||||
// Add the specified behavior to the list of behaviors which will
|
||||
// be applied the next time apply() is called. Calls to add() for
|
||||
// an already existing behavior do not replace the previous rules,
|
||||
// but are instead additive. New nodes which match the rule will
|
||||
// have all add()-ed behaviors applied to them when matched.
|
||||
//
|
||||
// The "found" method is a generalized handler that's called as soon
|
||||
// as the node matches the selector. Rules for values that follow also
|
||||
// apply to the "found" key.
|
||||
//
|
||||
// The "on*" handlers are attached with `dojo.connect()`, using the
|
||||
// matching node
|
||||
//
|
||||
// If the value corresponding to the ID key is a function and not a
|
||||
// list, it's treated as though it was the value of "found".
|
||||
//
|
||||
// dojo.behavior.add() can be called any number of times before
|
||||
// the DOM is ready. `dojo.behavior.apply()` is called automatically
|
||||
// by `dojo.addOnLoad`, though can be called to re-apply previously added
|
||||
// behaviors anytime the DOM changes.
|
||||
//
|
||||
// There are a variety of formats permitted in the behaviorObject
|
||||
//
|
||||
// example:
|
||||
// Simple list of properties. "found" is special. "Found" is assumed if
|
||||
// no property object for a given selector, and property is a function.
|
||||
//
|
||||
// | dojo.behavior.add({
|
||||
// | "#id": {
|
||||
// | "found": function(element){
|
||||
// | // node match found
|
||||
// | },
|
||||
// | "onclick": function(evt){
|
||||
// | // register onclick handler for found node
|
||||
// | }
|
||||
// | },
|
||||
// | "#otherid": function(element){
|
||||
// | // assumes "found" with this syntax
|
||||
// | }
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// If property is a string, a dojo.publish will be issued on the channel:
|
||||
//
|
||||
// | dojo.behavior.add({
|
||||
// | // dojo.publish() whenever class="noclick" found on anchors
|
||||
// | "a.noclick": "/got/newAnchor",
|
||||
// | "div.wrapper": {
|
||||
// | "onclick": "/node/wasClicked"
|
||||
// | }
|
||||
// | });
|
||||
// | dojo.subscribe("/got/newAnchor", function(node){
|
||||
// | // handle node finding when dojo.behavior.apply() is called,
|
||||
// | // provided a newly matched node is found.
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// Scoping can be accomplished by passing an object as a property to
|
||||
// a connection handle (on*):
|
||||
//
|
||||
// | dojo.behavior.add({
|
||||
// | "#id": {
|
||||
// | // like calling dojo.hitch(foo,"bar"). execute foo.bar() in scope of foo
|
||||
// | "onmouseenter": { targetObj: foo, targetFunc: "bar" },
|
||||
// | "onmouseleave": { targetObj: foo, targetFunc: "baz" }
|
||||
// | }
|
||||
// | });
|
||||
//
|
||||
// example:
|
||||
// Bahaviors match on CSS3 Selectors, powered by dojo.query. Example selectors:
|
||||
//
|
||||
// | dojo.behavior.add({
|
||||
// | // match all direct descendants
|
||||
// | "#id4 > *": function(element){
|
||||
// | // ...
|
||||
// | },
|
||||
// |
|
||||
// | // match the first child node that's an element
|
||||
// | "#id4 > :first-child": { ... },
|
||||
// |
|
||||
// | // match the last child node that's an element
|
||||
// | "#id4 > :last-child": { ... },
|
||||
// |
|
||||
// | // all elements of type tagname
|
||||
// | "tagname": {
|
||||
// | // ...
|
||||
// | },
|
||||
// |
|
||||
// | "tagname1 tagname2 tagname3": {
|
||||
// | // ...
|
||||
// | },
|
||||
// |
|
||||
// | ".classname": {
|
||||
// | // ...
|
||||
// | },
|
||||
// |
|
||||
// | "tagname.classname": {
|
||||
// | // ...
|
||||
// | }
|
||||
// | });
|
||||
//
|
||||
|
||||
forIn(behaviorObj, this, function(behavior, name){
|
||||
var tBehavior = arrIn(this._behaviors, name);
|
||||
if(typeof tBehavior["id"] != "number"){
|
||||
tBehavior.id = _inc++;
|
||||
}
|
||||
var cversion = [];
|
||||
tBehavior.push(cversion);
|
||||
if((lang.isString(behavior))||(lang.isFunction(behavior))){
|
||||
behavior = { found: behavior };
|
||||
}
|
||||
forIn(behavior, function(rule, ruleName){
|
||||
arrIn(cversion, ruleName).push(rule);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
var _applyToNode = function(node, action, ruleSetName){
|
||||
if(lang.isString(action)){
|
||||
if(ruleSetName == "found"){
|
||||
connect.publish(action, [ node ]);
|
||||
}else{
|
||||
connect.connect(node, ruleSetName, function(){
|
||||
connect.publish(action, arguments);
|
||||
});
|
||||
}
|
||||
}else if(lang.isFunction(action)){
|
||||
if(ruleSetName == "found"){
|
||||
action(node);
|
||||
}else{
|
||||
connect.connect(node, ruleSetName, action);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.apply = function(){
|
||||
// summary:
|
||||
// Applies all currently registered behaviors to the document.
|
||||
//
|
||||
// description:
|
||||
// Applies all currently registered behaviors to the document,
|
||||
// taking care to ensure that only incremental updates are made
|
||||
// since the last time add() or apply() were called.
|
||||
//
|
||||
// If new matching nodes have been added, all rules in a behavior will be
|
||||
// applied to that node. For previously matched nodes, only
|
||||
// behaviors which have been added since the last call to apply()
|
||||
// will be added to the nodes.
|
||||
//
|
||||
// apply() is called once automatically by `dojo.addOnLoad`, so
|
||||
// registering behaviors with `dojo.behavior.add` before the DOM is
|
||||
// ready is acceptable, provided the dojo.behavior module is ready.
|
||||
//
|
||||
// Calling appy() manually after manipulating the DOM is required
|
||||
// to rescan the DOM and apply newly .add()ed behaviors, or to match
|
||||
// nodes that match existing behaviors when those nodes are added to
|
||||
// the DOM.
|
||||
//
|
||||
forIn(this._behaviors, function(tBehavior, id){
|
||||
query(id).forEach(
|
||||
function(elem){
|
||||
var runFrom = 0;
|
||||
var bid = "_dj_behavior_"+tBehavior.id;
|
||||
if(typeof elem[bid] == "number"){
|
||||
runFrom = elem[bid];
|
||||
if(runFrom == (tBehavior.length)){
|
||||
return;
|
||||
}
|
||||
}
|
||||
// run through the versions, applying newer rules at each step
|
||||
|
||||
for(var x=runFrom, tver; tver = tBehavior[x]; x++){
|
||||
forIn(tver, function(ruleSet, ruleSetName){
|
||||
if(lang.isArray(ruleSet)){
|
||||
darray.forEach(ruleSet, function(action){
|
||||
_applyToNode(elem, action, ruleSetName);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// ensure that re-application only adds new rules to the node
|
||||
elem[bid] = tBehavior.length;
|
||||
}
|
||||
);
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
ready(dojo.behavior, "apply"); // FIXME: should this use a priority? before/after parser priority?
|
||||
|
||||
return dojo.behavior;
|
||||
});
|
||||
@@ -1,126 +0,0 @@
|
||||
Files baked into this build:
|
||||
|
||||
dojo.js:
|
||||
./jslib/dojoGuardStart.jsfrag
|
||||
./../../dojo/_base/_loader/bootstrap.js
|
||||
./../../dojo/_base/_loader/loader.js
|
||||
./../../dojo/_base/_loader/hostenv_browser.js
|
||||
./../../release/dojo/_base/lang.js
|
||||
./../../release/dojo/_base/array.js
|
||||
./../../release/dojo/_base/declare.js
|
||||
./../../release/dojo/_base/connect.js
|
||||
./../../release/dojo/_base/Deferred.js
|
||||
./../../release/dojo/_base/json.js
|
||||
./../../release/dojo/_base/Color.js
|
||||
./../../release/dojo/_base/window.js
|
||||
./../../release/dojo/_base/event.js
|
||||
./../../release/dojo/_base/html.js
|
||||
./../../release/dojo/_base/NodeList.js
|
||||
./../../release/dojo/_base/query.js
|
||||
./../../release/dojo/_base/xhr.js
|
||||
./../../release/dojo/_base/fx.js
|
||||
./../../release/dojo/_base/browser.js
|
||||
./../../release/dojo/_base.js
|
||||
./jslib/dojoGuardEnd.jsfrag
|
||||
|
||||
tt-rss-layer.js:
|
||||
./../../release/dojo/date/stamp.js
|
||||
./../../release/dojo/parser.js
|
||||
./../../release/dojo/window.js
|
||||
./../../release/dijit/_base/manager.js
|
||||
./../../release/dijit/_base/focus.js
|
||||
./../../release/dojo/AdapterRegistry.js
|
||||
./../../release/dijit/_base/place.js
|
||||
./../../release/dijit/_base/window.js
|
||||
./../../release/dijit/_base/popup.js
|
||||
./../../release/dijit/_base/scroll.js
|
||||
./../../release/dojo/uacss.js
|
||||
./../../release/dijit/_base/sniff.js
|
||||
./../../release/dijit/_base/typematic.js
|
||||
./../../release/dijit/_base/wai.js
|
||||
./../../release/dijit/_base.js
|
||||
./../../release/dojo/Stateful.js
|
||||
./../../release/dijit/_WidgetBase.js
|
||||
./../../release/dijit/_Widget.js
|
||||
./../../release/dojo/string.js
|
||||
./../../release/dojo/cache.js
|
||||
./../../release/dijit/_Templated.js
|
||||
./../../release/dijit/_Container.js
|
||||
./../../release/dijit/_Contained.js
|
||||
./../../release/dijit/layout/_LayoutWidget.js
|
||||
./../../release/dijit/_CssStateMixin.js
|
||||
./../../release/dijit/form/_FormWidget.js
|
||||
./../../release/dijit/dijit.js
|
||||
./../../release/dojo/fx/Toggler.js
|
||||
./../../release/dojo/fx.js
|
||||
./../../release/dojo/NodeList-fx.js
|
||||
./../../release/dojo/colors.js
|
||||
./../../release/dojo/i18n.js
|
||||
./../../release/dijit/_PaletteMixin.js
|
||||
./../../release/dijit/ColorPalette.js
|
||||
./../../release/dojo/dnd/common.js
|
||||
./../../release/dojo/dnd/autoscroll.js
|
||||
./../../release/dojo/dnd/Mover.js
|
||||
./../../release/dojo/dnd/Moveable.js
|
||||
./../../release/dojo/dnd/move.js
|
||||
./../../release/dojo/dnd/TimedMoveable.js
|
||||
./../../release/dijit/form/_FormMixin.js
|
||||
./../../release/dijit/_DialogMixin.js
|
||||
./../../release/dijit/DialogUnderlay.js
|
||||
./../../release/dijit/layout/_ContentPaneResizeMixin.js
|
||||
./../../release/dojo/html.js
|
||||
./../../release/dijit/layout/ContentPane.js
|
||||
./../../release/dijit/TooltipDialog.js
|
||||
./../../release/dijit/Dialog.js
|
||||
./../../release/dijit/_HasDropDown.js
|
||||
./../../release/dijit/form/Button.js
|
||||
./../../release/dijit/form/ToggleButton.js
|
||||
./../../release/dijit/form/CheckBox.js
|
||||
./../../release/dijit/form/DropDownButton.js
|
||||
./../../release/dojo/regexp.js
|
||||
./../../release/dojo/data/util/sorter.js
|
||||
./../../release/dojo/data/util/simpleFetch.js
|
||||
./../../release/dojo/data/util/filter.js
|
||||
./../../release/dijit/form/TextBox.js
|
||||
./../../release/dijit/Tooltip.js
|
||||
./../../release/dijit/form/ValidationTextBox.js
|
||||
./../../release/dijit/form/ComboBox.js
|
||||
./../../release/dijit/form/FilteringSelect.js
|
||||
./../../release/dijit/form/Form.js
|
||||
./../../release/dijit/form/RadioButton.js
|
||||
./../../release/dijit/form/_FormSelectWidget.js
|
||||
./../../release/dijit/_KeyNavContainer.js
|
||||
./../../release/dijit/MenuItem.js
|
||||
./../../release/dijit/PopupMenuItem.js
|
||||
./../../release/dijit/CheckedMenuItem.js
|
||||
./../../release/dijit/MenuSeparator.js
|
||||
./../../release/dijit/Menu.js
|
||||
./../../release/dijit/form/Select.js
|
||||
./../../release/dijit/form/SimpleTextarea.js
|
||||
./../../release/dijit/InlineEditBox.js
|
||||
./../../release/dojo/cookie.js
|
||||
./../../release/dijit/layout/StackController.js
|
||||
./../../release/dijit/layout/StackContainer.js
|
||||
./../../release/dijit/layout/AccordionPane.js
|
||||
./../../release/dijit/layout/AccordionContainer.js
|
||||
./../../release/dijit/layout/BorderContainer.js
|
||||
./../../release/dijit/layout/_TabContainerBase.js
|
||||
./../../release/dijit/layout/TabController.js
|
||||
./../../release/dijit/layout/ScrollingTabController.js
|
||||
./../../release/dijit/layout/TabContainer.js
|
||||
./../../release/dojo/number.js
|
||||
./../../release/dijit/ProgressBar.js
|
||||
./../../release/dijit/ToolbarSeparator.js
|
||||
./../../release/dijit/Toolbar.js
|
||||
./../../release/dojo/DeferredList.js
|
||||
./../../release/dijit/tree/TreeStoreModel.js
|
||||
./../../release/dijit/tree/ForestStoreModel.js
|
||||
./../../release/dojo/dnd/Container.js
|
||||
./../../release/dijit/tree/_dndContainer.js
|
||||
./../../release/dijit/tree/_dndSelector.js
|
||||
./../../release/dijit/Tree.js
|
||||
./../../release/dojo/dnd/Avatar.js
|
||||
./../../release/dojo/dnd/Manager.js
|
||||
./../../release/dijit/tree/dndSource.js
|
||||
./../../release/dojo/data/ItemFileReadStore.js
|
||||
./../../release/dojo/data/ItemFileWriteStore.js
|
||||
@@ -4,123 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.cache"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.cache"] = true;
|
||||
dojo.provide("dojo.cache");
|
||||
|
||||
|
||||
/*=====
|
||||
dojo.cache = {
|
||||
// summary:
|
||||
// A way to cache string content that is fetchable via `dojo.moduleUrl`.
|
||||
};
|
||||
=====*/
|
||||
|
||||
var cache = {};
|
||||
dojo.cache = function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){
|
||||
// summary:
|
||||
// A getter and setter for storing the string content associated with the
|
||||
// module and url arguments.
|
||||
// description:
|
||||
// module and url are used to call `dojo.moduleUrl()` to generate a module URL.
|
||||
// If value is specified, the cache value for the moduleUrl will be set to
|
||||
// that value. Otherwise, dojo.cache will fetch the moduleUrl and store it
|
||||
// in its internal cache and return that cached value for the URL. To clear
|
||||
// a cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the
|
||||
// the URL contents, only modules on the same domain of the page can use this capability.
|
||||
// The build system can inline the cache values though, to allow for xdomain hosting.
|
||||
// module: String||Object
|
||||
// If a String, the module name to use for the base part of the URL, similar to module argument
|
||||
// to `dojo.moduleUrl`. If an Object, something that has a .toString() method that
|
||||
// generates a valid path for the cache item. For example, a dojo._Url object.
|
||||
// url: String
|
||||
// The rest of the path to append to the path derived from the module argument. If
|
||||
// module is an object, then this second argument should be the "value" argument instead.
|
||||
// value: String||Object?
|
||||
// If a String, the value to use in the cache for the module/url combination.
|
||||
// If an Object, it can have two properties: value and sanitize. The value property
|
||||
// should be the value to use in the cache, and sanitize can be set to true or false,
|
||||
// to indicate if XML declarations should be removed from the value and if the HTML
|
||||
// inside a body tag in the value should be extracted as the real value. The value argument
|
||||
// or the value property on the value argument are usually only used by the build system
|
||||
// as it inlines cache content.
|
||||
// example:
|
||||
// To ask dojo.cache to fetch content and store it in the cache (the dojo["cache"] style
|
||||
// of call is used to avoid an issue with the build system erroneously trying to intern
|
||||
// this example. To get the build system to intern your dojo.cache calls, use the
|
||||
// "dojo.cache" style of call):
|
||||
// | //If template.html contains "<h1>Hello</h1>" that will be
|
||||
// | //the value for the text variable.
|
||||
// | var text = dojo["cache"]("my.module", "template.html");
|
||||
// example:
|
||||
// To ask dojo.cache to fetch content and store it in the cache, and sanitize the input
|
||||
// (the dojo["cache"] style of call is used to avoid an issue with the build system
|
||||
// erroneously trying to intern this example. To get the build system to intern your
|
||||
// dojo.cache calls, use the "dojo.cache" style of call):
|
||||
// | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the
|
||||
// | //text variable will contain just "<h1>Hello</h1>".
|
||||
// | var text = dojo["cache"]("my.module", "template.html", {sanitize: true});
|
||||
// example:
|
||||
// Same example as previous, but demostrates how an object can be passed in as
|
||||
// the first argument, then the value argument can then be the second argument.
|
||||
// | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the
|
||||
// | //text variable will contain just "<h1>Hello</h1>".
|
||||
// | var text = dojo["cache"](new dojo._Url("my/module/template.html"), {sanitize: true});
|
||||
|
||||
//Module could be a string, or an object that has a toString() method
|
||||
//that will return a useful path. If it is an object, then the "url" argument
|
||||
//will actually be the value argument.
|
||||
if(typeof module == "string"){
|
||||
var pathObj = dojo.moduleUrl(module, url);
|
||||
}else{
|
||||
pathObj = module;
|
||||
value = url;
|
||||
}
|
||||
var key = pathObj.toString();
|
||||
|
||||
var val = value;
|
||||
if(value != undefined && !dojo.isString(value)){
|
||||
val = ("value" in value ? value.value : undefined);
|
||||
}
|
||||
|
||||
var sanitize = value && value.sanitize ? true : false;
|
||||
|
||||
if(typeof val == "string"){
|
||||
//We have a string, set cache value
|
||||
val = cache[key] = sanitize ? dojo.cache._sanitize(val) : val;
|
||||
}else if(val === null){
|
||||
//Remove cached value
|
||||
delete cache[key];
|
||||
}else{
|
||||
//Allow cache values to be empty strings. If key property does
|
||||
//not exist, fetch it.
|
||||
if(!(key in cache)){
|
||||
val = dojo._getText(key);
|
||||
cache[key] = sanitize ? dojo.cache._sanitize(val) : val;
|
||||
}
|
||||
val = cache[key];
|
||||
}
|
||||
return val; //String
|
||||
};
|
||||
|
||||
dojo.cache._sanitize = function(/*String*/val){
|
||||
// summary:
|
||||
// Strips <?xml ...?> declarations so that external SVG and XML
|
||||
// documents can be added to a document without worry. Also, if the string
|
||||
// is an HTML document, only the part inside the body tag is returned.
|
||||
// description:
|
||||
// Copied from dijit._Templated._sanitizeTemplateString.
|
||||
if(val){
|
||||
val = val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
|
||||
var matches = val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
|
||||
if(matches){
|
||||
val = matches[1];
|
||||
}
|
||||
}else{
|
||||
val = "";
|
||||
}
|
||||
return val; //String
|
||||
};
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/cache",["./_base/kernel","./text"],function(_1,_2){return _1.cache;});
|
||||
9
lib/dojo/cache.js.uncompressed.js
Normal file
9
lib/dojo/cache.js.uncompressed.js
Normal file
@@ -0,0 +1,9 @@
|
||||
define("dojo/cache", ["./_base/kernel", "./text"], function(dojo, text){
|
||||
// module:
|
||||
// dojo/cache
|
||||
// summary:
|
||||
// The module defines dojo.cache by loading dojo/text.
|
||||
|
||||
//dojo.cache is defined in dojo/text
|
||||
return dojo.cache;
|
||||
});
|
||||
@@ -4,36 +4,5 @@
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.cldr.monetary"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.cldr.monetary"] = true;
|
||||
dojo.provide("dojo.cldr.monetary");
|
||||
|
||||
dojo.getObject("cldr.monetary", true, dojo);
|
||||
|
||||
dojo.cldr.monetary.getData = function(/*String*/code){
|
||||
// summary: A mapping of currency code to currency-specific formatting information. Returns a unique object with properties: places, round.
|
||||
// code: an [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) currency code
|
||||
|
||||
// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/currencyData/fractions
|
||||
|
||||
var placesData = {
|
||||
ADP:0,AFN:0,ALL:0,AMD:0,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,
|
||||
COP:0,CRC:0,DJF:0,ESP:0,GNF:0,GYD:0,HUF:0,IDR:0,IQD:0,
|
||||
IRR:3,ISK:0,ITL:0,JOD:3,JPY:0,KMF:0,KPW:0,KRW:0,KWD:3,
|
||||
LAK:0,LBP:0,LUF:0,LYD:3,MGA:0,MGF:0,MMK:0,MNT:0,MRO:0,
|
||||
MUR:0,OMR:3,PKR:0,PYG:0,RSD:0,RWF:0,SLL:0,SOS:0,STD:0,
|
||||
SYP:0,TMM:0,TND:3,TRL:0,TZS:0,UGX:0,UZS:0,VND:0,VUV:0,
|
||||
XAF:0,XOF:0,XPF:0,YER:0,ZMK:0,ZWD:0
|
||||
};
|
||||
|
||||
var roundingData = {CHF:5};
|
||||
|
||||
var places = placesData[code], round = roundingData[code];
|
||||
if(typeof places == "undefined"){ places = 2; }
|
||||
if(typeof round == "undefined"){ round = 0; }
|
||||
|
||||
return {places: places, round: round}; // Object
|
||||
};
|
||||
|
||||
}
|
||||
//>>built
|
||||
define("dojo/cldr/monetary",["../main"],function(_1){_1.getObject("cldr.monetary",true,_1);_1.cldr.monetary.getData=function(_2){var _3={ADP:0,AFN:0,ALL:0,AMD:0,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,COP:0,CRC:0,DJF:0,ESP:0,GNF:0,GYD:0,HUF:0,IDR:0,IQD:0,IRR:3,ISK:0,ITL:0,JOD:3,JPY:0,KMF:0,KPW:0,KRW:0,KWD:3,LAK:0,LBP:0,LUF:0,LYD:3,MGA:0,MGF:0,MMK:0,MNT:0,MRO:0,MUR:0,OMR:3,PKR:0,PYG:0,RSD:0,RWF:0,SLL:0,SOS:0,STD:0,SYP:0,TMM:0,TND:3,TRL:0,TZS:0,UGX:0,UZS:0,VND:0,VUV:0,XAF:0,XOF:0,XPF:0,YER:0,ZMK:0,ZWD:0};var _4={CHF:5};var _5=_3[_2],_6=_4[_2];if(typeof _5=="undefined"){_5=2;}if(typeof _6=="undefined"){_6=0;}return {places:_5,round:_6};};return _1.cldr.monetary;});
|
||||
35
lib/dojo/cldr/monetary.js.uncompressed.js
Normal file
35
lib/dojo/cldr/monetary.js.uncompressed.js
Normal file
@@ -0,0 +1,35 @@
|
||||
define("dojo/cldr/monetary", ["../main"], function(dojo) {
|
||||
// module:
|
||||
// dojo/cldr/monetary
|
||||
// summary:
|
||||
// TODOC
|
||||
|
||||
dojo.getObject("cldr.monetary", true, dojo);
|
||||
|
||||
dojo.cldr.monetary.getData = function(/*String*/code){
|
||||
// summary: A mapping of currency code to currency-specific formatting information. Returns a unique object with properties: places, round.
|
||||
// code: an [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) currency code
|
||||
|
||||
// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/currencyData/fractions
|
||||
|
||||
var placesData = {
|
||||
ADP:0,AFN:0,ALL:0,AMD:0,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,
|
||||
COP:0,CRC:0,DJF:0,ESP:0,GNF:0,GYD:0,HUF:0,IDR:0,IQD:0,
|
||||
IRR:3,ISK:0,ITL:0,JOD:3,JPY:0,KMF:0,KPW:0,KRW:0,KWD:3,
|
||||
LAK:0,LBP:0,LUF:0,LYD:3,MGA:0,MGF:0,MMK:0,MNT:0,MRO:0,
|
||||
MUR:0,OMR:3,PKR:0,PYG:0,RSD:0,RWF:0,SLL:0,SOS:0,STD:0,
|
||||
SYP:0,TMM:0,TND:3,TRL:0,TZS:0,UGX:0,UZS:0,VND:0,VUV:0,
|
||||
XAF:0,XOF:0,XPF:0,YER:0,ZMK:0,ZWD:0
|
||||
};
|
||||
|
||||
var roundingData = {CHF:5};
|
||||
|
||||
var places = placesData[code], round = roundingData[code];
|
||||
if(typeof places == "undefined"){ places = 2; }
|
||||
if(typeof round == "undefined"){ round = 0; }
|
||||
|
||||
return {places: places, round: round}; // Object
|
||||
};
|
||||
|
||||
return dojo.cldr.monetary;
|
||||
});
|
||||
@@ -1 +1,8 @@
|
||||
({"dateFormatItem-yM":"M/y G","dateFormatItem-yQ":"yyyy Q","dayPeriods-format-wide-pm":"م","eraNames":["التقويم البوذي"],"dateFormatItem-MMMEd":"E d MMM","dateFormatItem-MMdd":"dd/MM","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"dayPeriods-format-wide-am":"ص","dateFormatItem-y":"y G","timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Ed":"E، d","dateFormatItem-yMMM":"MMM y G","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"eraAbbr":["التقويم البوذي"],"dateFormatItem-yyyyMM":"MM/y G","dateFormatItem-yyyyMMMM":"MMMM، y G","dateFormat-long":"d MMMM، y G","timeFormat-medium":"h:mm:ss a","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"dd/MM/y G","dateFormatItem-yMd":"d/M/y G","dateFormatItem-yMMMM":"MMMM y G","dateFormatItem-ms":"mm:ss","quarters-standAlone-narrow":["١","٢","٣","٤"],"dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-MMMd":"d MMM","timeFormat-long":"z h:mm:ss a","timeFormat-short":"h:mm a","dateFormatItem-MMMMd":"d MMMM","days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormatItem-M":"L","dateFormatItem-yMMMd":"d MMMM y G","dateFormat-short":"d/M/y G","dateFormatItem-yMMMEd":"EEE، d MMMM y G","dateFormat-full":"EEEE، d MMMM، y G","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE، d/M/y G","months-format-wide":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-d":"d","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"eraNarrow":["التقويم البوذي"],"days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-yQQQ":"y QQQ","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"})
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/cldr/nls/ar/buddhist",{"dateFormatItem-yM":"M/y G","dateFormatItem-yQ":"yyyy Q","dayPeriods-format-wide-pm":"م","eraNames":["التقويم البوذي"],"dateFormatItem-MMMEd":"E d MMM","dateFormatItem-MMdd":"dd/MM","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"dayPeriods-format-wide-am":"ص","dateFormatItem-y":"y G","timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Ed":"E، d","dateFormatItem-yMMM":"MMM y G","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"eraAbbr":["التقويم البوذي"],"dateFormatItem-yyyyMM":"MM/y G","dateFormatItem-yyyyMMMM":"MMMM، y G","dateFormat-long":"d MMMM، y G","timeFormat-medium":"h:mm:ss a","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"dd/MM/y G","dateFormatItem-yMd":"d/M/y G","dateFormatItem-yMMMM":"MMMM y G","dateFormatItem-ms":"mm:ss","quarters-standAlone-narrow":["١","٢","٣","٤"],"dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-MMMd":"d MMM","timeFormat-long":"z h:mm:ss a","timeFormat-short":"h:mm a","dateFormatItem-MMMMd":"d MMMM","days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormatItem-M":"L","dateFormatItem-yMMMd":"d MMMM y G","dateFormat-short":"d/M/y G","dateFormatItem-yMMMEd":"EEE، d MMMM y G","dateFormat-full":"EEEE، d MMMM، y G","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE، d/M/y G","months-format-wide":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-d":"d","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"eraNarrow":["التقويم البوذي"],"days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"]});
|
||||
115
lib/dojo/cldr/nls/ar/buddhist.js.uncompressed.js
Normal file
115
lib/dojo/cldr/nls/ar/buddhist.js.uncompressed.js
Normal file
@@ -0,0 +1,115 @@
|
||||
define(
|
||||
"dojo/cldr/nls/ar/buddhist", //begin v1.x content
|
||||
{
|
||||
"dateFormatItem-yM": "M/y G",
|
||||
"dateFormatItem-yQ": "yyyy Q",
|
||||
"dayPeriods-format-wide-pm": "م",
|
||||
"eraNames": [
|
||||
"التقويم البوذي"
|
||||
],
|
||||
"dateFormatItem-MMMEd": "E d MMM",
|
||||
"dateFormatItem-MMdd": "dd/MM",
|
||||
"dateFormatItem-MMM": "LLL",
|
||||
"months-standAlone-narrow": [
|
||||
"ي",
|
||||
"ف",
|
||||
"م",
|
||||
"أ",
|
||||
"و",
|
||||
"ن",
|
||||
"ل",
|
||||
"غ",
|
||||
"س",
|
||||
"ك",
|
||||
"ب",
|
||||
"د"
|
||||
],
|
||||
"dayPeriods-format-wide-am": "ص",
|
||||
"dateFormatItem-y": "y G",
|
||||
"timeFormat-full": "zzzz h:mm:ss a",
|
||||
"dateFormatItem-Ed": "E، d",
|
||||
"dateFormatItem-yMMM": "MMM y G",
|
||||
"days-standAlone-narrow": [
|
||||
"ح",
|
||||
"ن",
|
||||
"ث",
|
||||
"ر",
|
||||
"خ",
|
||||
"ج",
|
||||
"س"
|
||||
],
|
||||
"eraAbbr": [
|
||||
"التقويم البوذي"
|
||||
],
|
||||
"dateFormatItem-yyyyMM": "MM/y G",
|
||||
"dateFormatItem-yyyyMMMM": "MMMM، y G",
|
||||
"dateFormat-long": "d MMMM، y G",
|
||||
"timeFormat-medium": "h:mm:ss a",
|
||||
"dateFormatItem-Hm": "HH:mm",
|
||||
"dateFormat-medium": "dd/MM/y G",
|
||||
"dateFormatItem-yMd": "d/M/y G",
|
||||
"dateFormatItem-yMMMM": "MMMM y G",
|
||||
"dateFormatItem-ms": "mm:ss",
|
||||
"quarters-standAlone-narrow": [
|
||||
"١",
|
||||
"٢",
|
||||
"٣",
|
||||
"٤"
|
||||
],
|
||||
"dateFormatItem-MMMMEd": "E d MMMM",
|
||||
"dateFormatItem-MMMd": "d MMM",
|
||||
"timeFormat-long": "z h:mm:ss a",
|
||||
"timeFormat-short": "h:mm a",
|
||||
"dateFormatItem-MMMMd": "d MMMM",
|
||||
"days-format-abbr": [
|
||||
"أحد",
|
||||
"إثنين",
|
||||
"ثلاثاء",
|
||||
"أربعاء",
|
||||
"خميس",
|
||||
"جمعة",
|
||||
"سبت"
|
||||
],
|
||||
"dateFormatItem-M": "L",
|
||||
"dateFormatItem-yMMMd": "d MMMM y G",
|
||||
"dateFormat-short": "d/M/y G",
|
||||
"dateFormatItem-yMMMEd": "EEE، d MMMM y G",
|
||||
"dateFormat-full": "EEEE، d MMMM، y G",
|
||||
"dateFormatItem-Md": "d/M",
|
||||
"dateFormatItem-yMEd": "EEE، d/M/y G",
|
||||
"months-format-wide": [
|
||||
"يناير",
|
||||
"فبراير",
|
||||
"مارس",
|
||||
"أبريل",
|
||||
"مايو",
|
||||
"يونيو",
|
||||
"يوليو",
|
||||
"أغسطس",
|
||||
"سبتمبر",
|
||||
"أكتوبر",
|
||||
"نوفمبر",
|
||||
"ديسمبر"
|
||||
],
|
||||
"dateFormatItem-d": "d",
|
||||
"quarters-format-wide": [
|
||||
"الربع الأول",
|
||||
"الربع الثاني",
|
||||
"الربع الثالث",
|
||||
"الربع الرابع"
|
||||
],
|
||||
"eraNarrow": [
|
||||
"التقويم البوذي"
|
||||
],
|
||||
"days-format-wide": [
|
||||
"الأحد",
|
||||
"الإثنين",
|
||||
"الثلاثاء",
|
||||
"الأربعاء",
|
||||
"الخميس",
|
||||
"الجمعة",
|
||||
"السبت"
|
||||
]
|
||||
}
|
||||
//end v1.x content
|
||||
);
|
||||
@@ -1 +1,8 @@
|
||||
({"HKD_displayName":"دولار هونج كونج","CHF_displayName":"فرنك سويسري","CAD_displayName":"دولار كندي","CNY_displayName":"يوان صيني","AUD_displayName":"دولار أسترالي","JPY_displayName":"ين ياباني","USD_displayName":"دولار أمريكي","CNY_symbol":"ي.ص","GBP_displayName":"جنيه إسترليني","EUR_displayName":"يورو","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","EUR_symbol":"€"})
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/cldr/nls/ar/currency",{"HKD_displayName":"دولار هونج كونج","CHF_displayName":"فرنك سويسري","CAD_displayName":"دولار كندي","CNY_displayName":"يوان صيني","AUD_displayName":"دولار أسترالي","JPY_displayName":"ين ياباني","USD_displayName":"دولار أمريكي","CNY_symbol":"ي.ص","GBP_displayName":"جنيه إسترليني","EUR_displayName":"يورو"});
|
||||
16
lib/dojo/cldr/nls/ar/currency.js.uncompressed.js
Normal file
16
lib/dojo/cldr/nls/ar/currency.js.uncompressed.js
Normal file
@@ -0,0 +1,16 @@
|
||||
define(
|
||||
"dojo/cldr/nls/ar/currency", //begin v1.x content
|
||||
{
|
||||
"HKD_displayName": "دولار هونج كونج",
|
||||
"CHF_displayName": "فرنك سويسري",
|
||||
"CAD_displayName": "دولار كندي",
|
||||
"CNY_displayName": "يوان صيني",
|
||||
"AUD_displayName": "دولار أسترالي",
|
||||
"JPY_displayName": "ين ياباني",
|
||||
"USD_displayName": "دولار أمريكي",
|
||||
"CNY_symbol": "ي.ص",
|
||||
"GBP_displayName": "جنيه إسترليني",
|
||||
"EUR_displayName": "يورو"
|
||||
}
|
||||
//end v1.x content
|
||||
);
|
||||
@@ -1 +1,8 @@
|
||||
({"dateFormatItem-yM":"M/yyyy","field-dayperiod":"ص/م","dateFormatItem-yQ":"yyyy Q","dayPeriods-format-wide-pm":"م","field-minute":"الدقائق","eraNames":["قبل الميلاد","ميلادي"],"dateFormatItem-MMMEd":"E d MMM","field-day-relative+-1":"أمس","field-weekday":"اليوم","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-MMdd":"dd/MM","days-standAlone-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"field-era":"العصر","field-hour":"الساعات","dayPeriods-format-wide-am":"ص","quarters-standAlone-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormatItem-y":"y","timeFormat-full":"zzzz h:mm:ss a","months-standAlone-abbr":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-Ed":"E، d","dateFormatItem-yMMM":"MMM y","field-day-relative+0":"اليوم","field-day-relative+1":"غدًا","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"eraAbbr":["ق.م","م"],"field-day-relative+2":"بعد الغد","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-yyyyMMMM":"MMMM، y","dateFormat-long":"d MMMM، y","timeFormat-medium":"h:mm:ss a","field-zone":"التوقيت","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"dd/MM/yyyy","quarters-standAlone-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormatItem-yMMMM":"MMMM y","dateFormatItem-ms":"mm:ss","field-year":"السنة","quarters-standAlone-narrow":["١","٢","٣","٤"],"field-week":"الأسبوع","months-standAlone-wide":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-MMMd":"d MMM","quarters-format-narrow":["١","٢","٣","٤"],"dateFormatItem-yyQ":"Q yy","timeFormat-long":"z h:mm:ss a","months-format-abbr":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"timeFormat-short":"h:mm a","field-month":"الشهر","dateFormatItem-MMMMd":"d MMMM","quarters-format-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormatItem-M":"L","days-format-narrow":["ح","ن","ث","ر","خ","ج","س"],"field-second":"الثواني","field-day":"يوم","months-format-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"days-standAlone-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE، d/M/yyyy","months-format-wide":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-d":"d","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"eraNarrow":["ق.م","م"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"})
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/cldr/nls/ar/gregorian",{"dateFormatItem-yM":"M/yyyy","field-dayperiod":"ص/م","dateFormatItem-yQ":"yyyy Q","dayPeriods-format-wide-pm":"م","field-minute":"الدقائق","eraNames":["قبل الميلاد","ميلادي"],"dateFormatItem-MMMEd":"E d MMM","field-day-relative+-1":"أمس","field-weekday":"اليوم","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-MMdd":"dd/MM","days-standAlone-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"field-era":"العصر","field-hour":"الساعات","dayPeriods-format-wide-am":"ص","quarters-standAlone-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormatItem-y":"y","timeFormat-full":"zzzz h:mm:ss a","months-standAlone-abbr":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-Ed":"E، d","dateFormatItem-yMMM":"MMM y","field-day-relative+0":"اليوم","field-day-relative+1":"غدًا","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"eraAbbr":["ق.م","م"],"field-day-relative+2":"بعد الغد","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-yyyyMMMM":"MMMM، y","dateFormat-long":"d MMMM، y","timeFormat-medium":"h:mm:ss a","field-zone":"التوقيت","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"dd/MM/yyyy","quarters-standAlone-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormatItem-yMMMM":"MMMM y","dateFormatItem-ms":"mm:ss","field-year":"السنة","quarters-standAlone-narrow":["١","٢","٣","٤"],"field-week":"الأسبوع","months-standAlone-wide":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-MMMd":"d MMM","quarters-format-narrow":["١","٢","٣","٤"],"dateFormatItem-yyQ":"Q yy","timeFormat-long":"z h:mm:ss a","months-format-abbr":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"timeFormat-short":"h:mm a","field-month":"الشهر","dateFormatItem-MMMMd":"d MMMM","quarters-format-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormatItem-M":"L","days-format-narrow":["ح","ن","ث","ر","خ","ج","س"],"field-second":"الثواني","field-day":"يوم","months-format-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"days-standAlone-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE، d/M/yyyy","months-format-wide":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-d":"d","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"eraNarrow":["ق.م","م"]});
|
||||
240
lib/dojo/cldr/nls/ar/gregorian.js.uncompressed.js
Normal file
240
lib/dojo/cldr/nls/ar/gregorian.js.uncompressed.js
Normal file
@@ -0,0 +1,240 @@
|
||||
define(
|
||||
"dojo/cldr/nls/ar/gregorian", //begin v1.x content
|
||||
{
|
||||
"dateFormatItem-yM": "M/yyyy",
|
||||
"field-dayperiod": "ص/م",
|
||||
"dateFormatItem-yQ": "yyyy Q",
|
||||
"dayPeriods-format-wide-pm": "م",
|
||||
"field-minute": "الدقائق",
|
||||
"eraNames": [
|
||||
"قبل الميلاد",
|
||||
"ميلادي"
|
||||
],
|
||||
"dateFormatItem-MMMEd": "E d MMM",
|
||||
"field-day-relative+-1": "أمس",
|
||||
"field-weekday": "اليوم",
|
||||
"dateFormatItem-yQQQ": "y QQQ",
|
||||
"dateFormatItem-MMdd": "dd/MM",
|
||||
"days-standAlone-wide": [
|
||||
"الأحد",
|
||||
"الإثنين",
|
||||
"الثلاثاء",
|
||||
"الأربعاء",
|
||||
"الخميس",
|
||||
"الجمعة",
|
||||
"السبت"
|
||||
],
|
||||
"dateFormatItem-MMM": "LLL",
|
||||
"months-standAlone-narrow": [
|
||||
"ي",
|
||||
"ف",
|
||||
"م",
|
||||
"أ",
|
||||
"و",
|
||||
"ن",
|
||||
"ل",
|
||||
"غ",
|
||||
"س",
|
||||
"ك",
|
||||
"ب",
|
||||
"د"
|
||||
],
|
||||
"field-era": "العصر",
|
||||
"field-hour": "الساعات",
|
||||
"dayPeriods-format-wide-am": "ص",
|
||||
"quarters-standAlone-abbr": [
|
||||
"الربع الأول",
|
||||
"الربع الثاني",
|
||||
"الربع الثالث",
|
||||
"الربع الرابع"
|
||||
],
|
||||
"dateFormatItem-y": "y",
|
||||
"timeFormat-full": "zzzz h:mm:ss a",
|
||||
"months-standAlone-abbr": [
|
||||
"يناير",
|
||||
"فبراير",
|
||||
"مارس",
|
||||
"أبريل",
|
||||
"مايو",
|
||||
"يونيو",
|
||||
"يوليو",
|
||||
"أغسطس",
|
||||
"سبتمبر",
|
||||
"أكتوبر",
|
||||
"نوفمبر",
|
||||
"ديسمبر"
|
||||
],
|
||||
"dateFormatItem-Ed": "E، d",
|
||||
"dateFormatItem-yMMM": "MMM y",
|
||||
"field-day-relative+0": "اليوم",
|
||||
"field-day-relative+1": "غدًا",
|
||||
"days-standAlone-narrow": [
|
||||
"ح",
|
||||
"ن",
|
||||
"ث",
|
||||
"ر",
|
||||
"خ",
|
||||
"ج",
|
||||
"س"
|
||||
],
|
||||
"eraAbbr": [
|
||||
"ق.م",
|
||||
"م"
|
||||
],
|
||||
"field-day-relative+2": "بعد الغد",
|
||||
"dateFormatItem-yyyyMM": "MM/yyyy",
|
||||
"dateFormatItem-yyyyMMMM": "MMMM، y",
|
||||
"dateFormat-long": "d MMMM، y",
|
||||
"timeFormat-medium": "h:mm:ss a",
|
||||
"field-zone": "التوقيت",
|
||||
"dateFormatItem-Hm": "HH:mm",
|
||||
"dateFormat-medium": "dd/MM/yyyy",
|
||||
"quarters-standAlone-wide": [
|
||||
"الربع الأول",
|
||||
"الربع الثاني",
|
||||
"الربع الثالث",
|
||||
"الربع الرابع"
|
||||
],
|
||||
"dateFormatItem-yMMMM": "MMMM y",
|
||||
"dateFormatItem-ms": "mm:ss",
|
||||
"field-year": "السنة",
|
||||
"quarters-standAlone-narrow": [
|
||||
"١",
|
||||
"٢",
|
||||
"٣",
|
||||
"٤"
|
||||
],
|
||||
"field-week": "الأسبوع",
|
||||
"months-standAlone-wide": [
|
||||
"يناير",
|
||||
"فبراير",
|
||||
"مارس",
|
||||
"أبريل",
|
||||
"مايو",
|
||||
"يونيو",
|
||||
"يوليو",
|
||||
"أغسطس",
|
||||
"سبتمبر",
|
||||
"أكتوبر",
|
||||
"نوفمبر",
|
||||
"ديسمبر"
|
||||
],
|
||||
"dateFormatItem-MMMMEd": "E d MMMM",
|
||||
"dateFormatItem-MMMd": "d MMM",
|
||||
"quarters-format-narrow": [
|
||||
"١",
|
||||
"٢",
|
||||
"٣",
|
||||
"٤"
|
||||
],
|
||||
"dateFormatItem-yyQ": "Q yy",
|
||||
"timeFormat-long": "z h:mm:ss a",
|
||||
"months-format-abbr": [
|
||||
"يناير",
|
||||
"فبراير",
|
||||
"مارس",
|
||||
"أبريل",
|
||||
"مايو",
|
||||
"يونيو",
|
||||
"يوليو",
|
||||
"أغسطس",
|
||||
"سبتمبر",
|
||||
"أكتوبر",
|
||||
"نوفمبر",
|
||||
"ديسمبر"
|
||||
],
|
||||
"timeFormat-short": "h:mm a",
|
||||
"field-month": "الشهر",
|
||||
"dateFormatItem-MMMMd": "d MMMM",
|
||||
"quarters-format-abbr": [
|
||||
"الربع الأول",
|
||||
"الربع الثاني",
|
||||
"الربع الثالث",
|
||||
"الربع الرابع"
|
||||
],
|
||||
"days-format-abbr": [
|
||||
"أحد",
|
||||
"إثنين",
|
||||
"ثلاثاء",
|
||||
"أربعاء",
|
||||
"خميس",
|
||||
"جمعة",
|
||||
"سبت"
|
||||
],
|
||||
"dateFormatItem-M": "L",
|
||||
"days-format-narrow": [
|
||||
"ح",
|
||||
"ن",
|
||||
"ث",
|
||||
"ر",
|
||||
"خ",
|
||||
"ج",
|
||||
"س"
|
||||
],
|
||||
"field-second": "الثواني",
|
||||
"field-day": "يوم",
|
||||
"months-format-narrow": [
|
||||
"ي",
|
||||
"ف",
|
||||
"م",
|
||||
"أ",
|
||||
"و",
|
||||
"ن",
|
||||
"ل",
|
||||
"غ",
|
||||
"س",
|
||||
"ك",
|
||||
"ب",
|
||||
"د"
|
||||
],
|
||||
"days-standAlone-abbr": [
|
||||
"أحد",
|
||||
"إثنين",
|
||||
"ثلاثاء",
|
||||
"أربعاء",
|
||||
"خميس",
|
||||
"جمعة",
|
||||
"سبت"
|
||||
],
|
||||
"dateFormat-short": "d/M/yyyy",
|
||||
"dateFormatItem-yMMMEd": "EEE، d MMMM y",
|
||||
"dateFormat-full": "EEEE، d MMMM، y",
|
||||
"dateFormatItem-Md": "d/M",
|
||||
"dateFormatItem-yMEd": "EEE، d/M/yyyy",
|
||||
"months-format-wide": [
|
||||
"يناير",
|
||||
"فبراير",
|
||||
"مارس",
|
||||
"أبريل",
|
||||
"مايو",
|
||||
"يونيو",
|
||||
"يوليو",
|
||||
"أغسطس",
|
||||
"سبتمبر",
|
||||
"أكتوبر",
|
||||
"نوفمبر",
|
||||
"ديسمبر"
|
||||
],
|
||||
"dateFormatItem-d": "d",
|
||||
"quarters-format-wide": [
|
||||
"الربع الأول",
|
||||
"الربع الثاني",
|
||||
"الربع الثالث",
|
||||
"الربع الرابع"
|
||||
],
|
||||
"days-format-wide": [
|
||||
"الأحد",
|
||||
"الإثنين",
|
||||
"الثلاثاء",
|
||||
"الأربعاء",
|
||||
"الخميس",
|
||||
"الجمعة",
|
||||
"السبت"
|
||||
],
|
||||
"eraNarrow": [
|
||||
"ق.م",
|
||||
"م"
|
||||
]
|
||||
}
|
||||
//end v1.x content
|
||||
);
|
||||
@@ -1 +1,8 @@
|
||||
({"dateFormat-medium":"dd/MM/yyyy","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yMEd":"EEE، d/M/yyyy","timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Md":"d/M","months-standAlone-wide":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"months-format-wide-leap":"آذار الثاني","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"dayPeriods-format-wide-pm":"م","months-standAlone-abbr":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"dayPeriods-format-wide-am":"ص","quarters-standAlone-narrow":["١","٢","٣","٤"],"timeFormat-medium":"h:mm:ss a","dateFormat-long":"d MMMM، y","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","months-format-wide":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"dateFormatItem-yM":"M/yyyy","timeFormat-short":"h:mm a","months-format-abbr":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"timeFormat-long":"z h:mm:ss a","days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-yQ":"yyyy Q","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-MMMd":"d MMM","days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"months-format-narrow":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateFormatItem-yQQQ":"y QQQ","months-standAlone-narrow-leap":"Adar II","eraNarrow":["AM"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr-leap":"Adar II","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"months-standAlone-wide-leap":"Adar II","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"months-format-narrow-leap":"Adar II","eraAbbr":["AM"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","months-standAlone-abbr-leap":"Adar II","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","eraNames":["AM"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"})
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/cldr/nls/ar/hebrew",{"dateFormat-medium":"dd/MM/yyyy","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yMEd":"EEE، d/M/yyyy","timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Md":"d/M","months-standAlone-wide":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"months-format-wide-leap":"آذار الثاني","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"dayPeriods-format-wide-pm":"م","months-standAlone-abbr":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"dayPeriods-format-wide-am":"ص","quarters-standAlone-narrow":["١","٢","٣","٤"],"timeFormat-medium":"h:mm:ss a","dateFormat-long":"d MMMM، y","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","months-format-wide":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"dateFormatItem-yM":"M/yyyy","timeFormat-short":"h:mm a","months-format-abbr":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"timeFormat-long":"z h:mm:ss a","days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-yQ":"yyyy Q","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-MMMd":"d MMM","days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]});
|
||||
124
lib/dojo/cldr/nls/ar/hebrew.js.uncompressed.js
Normal file
124
lib/dojo/cldr/nls/ar/hebrew.js.uncompressed.js
Normal file
@@ -0,0 +1,124 @@
|
||||
define(
|
||||
"dojo/cldr/nls/ar/hebrew", //begin v1.x content
|
||||
{
|
||||
"dateFormat-medium": "dd/MM/yyyy",
|
||||
"dateFormatItem-MMMEd": "E d MMM",
|
||||
"dateFormatItem-yMEd": "EEE، d/M/yyyy",
|
||||
"timeFormat-full": "zzzz h:mm:ss a",
|
||||
"dateFormatItem-Md": "d/M",
|
||||
"months-standAlone-wide": [
|
||||
"تشري",
|
||||
"مرحشوان",
|
||||
"كيسلو",
|
||||
"طيفت",
|
||||
"شباط",
|
||||
"آذار الأول",
|
||||
"آذار",
|
||||
"نيسان",
|
||||
"أيار",
|
||||
"سيفان",
|
||||
"تموز",
|
||||
"آب",
|
||||
"أيلول"
|
||||
],
|
||||
"months-format-wide-leap": "آذار الثاني",
|
||||
"days-standAlone-narrow": [
|
||||
"ح",
|
||||
"ن",
|
||||
"ث",
|
||||
"ر",
|
||||
"خ",
|
||||
"ج",
|
||||
"س"
|
||||
],
|
||||
"dayPeriods-format-wide-pm": "م",
|
||||
"months-standAlone-abbr": [
|
||||
"تشري",
|
||||
"مرحشوان",
|
||||
"كيسلو",
|
||||
"طيفت",
|
||||
"شباط",
|
||||
"آذار الأول",
|
||||
"آذار",
|
||||
"نيسان",
|
||||
"أيار",
|
||||
"سيفان",
|
||||
"تموز",
|
||||
"آب",
|
||||
"أيلول"
|
||||
],
|
||||
"dayPeriods-format-wide-am": "ص",
|
||||
"quarters-standAlone-narrow": [
|
||||
"١",
|
||||
"٢",
|
||||
"٣",
|
||||
"٤"
|
||||
],
|
||||
"timeFormat-medium": "h:mm:ss a",
|
||||
"dateFormat-long": "d MMMM، y",
|
||||
"dateFormat-short": "d/M/yyyy",
|
||||
"dateFormatItem-yMMMEd": "EEE، d MMMM y",
|
||||
"months-format-wide": [
|
||||
"تشري",
|
||||
"مرحشوان",
|
||||
"كيسلو",
|
||||
"طيفت",
|
||||
"شباط",
|
||||
"آذار الأول",
|
||||
"آذار",
|
||||
"نيسان",
|
||||
"أيار",
|
||||
"سيفان",
|
||||
"تموز",
|
||||
"آب",
|
||||
"أيلول"
|
||||
],
|
||||
"dateFormatItem-yM": "M/yyyy",
|
||||
"timeFormat-short": "h:mm a",
|
||||
"months-format-abbr": [
|
||||
"تشري",
|
||||
"مرحشوان",
|
||||
"كيسلو",
|
||||
"طيفت",
|
||||
"شباط",
|
||||
"آذار الأول",
|
||||
"آذار",
|
||||
"نيسان",
|
||||
"أيار",
|
||||
"سيفان",
|
||||
"تموز",
|
||||
"آب",
|
||||
"أيلول"
|
||||
],
|
||||
"timeFormat-long": "z h:mm:ss a",
|
||||
"days-format-wide": [
|
||||
"الأحد",
|
||||
"الإثنين",
|
||||
"الثلاثاء",
|
||||
"الأربعاء",
|
||||
"الخميس",
|
||||
"الجمعة",
|
||||
"السبت"
|
||||
],
|
||||
"dateFormatItem-yQ": "yyyy Q",
|
||||
"dateFormatItem-yMMM": "MMM y",
|
||||
"quarters-format-wide": [
|
||||
"الربع الأول",
|
||||
"الربع الثاني",
|
||||
"الربع الثالث",
|
||||
"الربع الرابع"
|
||||
],
|
||||
"dateFormat-full": "EEEE، d MMMM، y",
|
||||
"dateFormatItem-MMMd": "d MMM",
|
||||
"days-format-abbr": [
|
||||
"أحد",
|
||||
"إثنين",
|
||||
"ثلاثاء",
|
||||
"أربعاء",
|
||||
"خميس",
|
||||
"جمعة",
|
||||
"سبت"
|
||||
]
|
||||
}
|
||||
//end v1.x content
|
||||
);
|
||||
@@ -1 +0,0 @@
|
||||
({"dateFormatItem-yM":"M/yyyy","dateFormatItem-yQ":"yyyy Q","dayPeriods-format-wide-pm":"م","eraNames":["ه"],"dateFormatItem-MMMEd":"E d MMM","days-standAlone-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"patternChars":"GanjkHmsSEDFwWxhKzAeugXZvcL","months-standAlone-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"dayPeriods-format-wide-am":"ص","dayPeriods-am-format-wide":"ص","quarters-standAlone-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"timeFormat-full":"zzzz h:mm:ss a","dayPeriods-pm-format-wide":"م","dayPeriods-format-wide":["ص","م"],"months-standAlone-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"eraAbbr":["ه"],"dateFormat-long":"d MMMM، y","timeFormat-medium":"h:mm:ss a","dateFormat-medium":"dd/MM/yyyy","dayPeriods-format-narrow":["ص","م"],"quarters-standAlone-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormatItem-yMMMM":"MMMM y","quarters-standAlone-narrow":["١","٢","٣","٤"],"months-standAlone-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-MMMd":"d MMM","quarters-format-narrow":["١","٢","٣","٤"],"timeFormat-long":"z h:mm:ss a","months-format-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"timeFormat-short":"h:mm a","dateFormatItem-MMMMd":"d MMMM","quarters-format-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"days-format-narrow":["ح","ن","ث","ر","خ","ج","س"],"months-format-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"days-standAlone-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE، d/M/yyyy","months-format-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dayPeriods-format-abbr":["ص","م"],"quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"eraNarrow":["ه"]})
|
||||
@@ -1 +1,8 @@
|
||||
({"dateFormat-medium":"dd/MM/yyyy","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yMEd":"EEE، d/M/yyyy","eraNarrow":["هـ"],"months-format-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Md":"d/M","months-standAlone-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"months-standAlone-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"eraNames":["هـ"],"days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"dayPeriods-format-wide-pm":"م","months-standAlone-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dayPeriods-format-wide-am":"ص","quarters-standAlone-narrow":["١","٢","٣","٤"],"timeFormat-medium":"h:mm:ss a","dateFormat-long":"d MMMM، y","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","months-format-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dateFormatItem-yM":"M/yyyy","timeFormat-short":"h:mm a","months-format-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"eraAbbr":["هـ"],"timeFormat-long":"z h:mm:ss a","days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-yQ":"yyyy Q","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-MMMd":"d MMM","days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormatItem-yQQQ":"y QQQ","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"})
|
||||
/*
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
//>>built
|
||||
define("dojo/cldr/nls/ar/islamic",{"dateFormat-medium":"dd/MM/yyyy","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yMEd":"EEE، d/M/yyyy","eraNarrow":["هـ"],"months-format-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Md":"d/M","months-standAlone-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"months-standAlone-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"eraNames":["هـ"],"days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"dayPeriods-format-wide-pm":"م","months-standAlone-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dayPeriods-format-wide-am":"ص","quarters-standAlone-narrow":["١","٢","٣","٤"],"timeFormat-medium":"h:mm:ss a","dateFormat-long":"d MMMM، y","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","months-format-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dateFormatItem-yM":"M/yyyy","timeFormat-short":"h:mm a","months-format-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"eraAbbr":["هـ"],"timeFormat-long":"z h:mm:ss a","days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-yQ":"yyyy Q","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-MMMd":"d MMM","days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]});
|
||||
156
lib/dojo/cldr/nls/ar/islamic.js.uncompressed.js
Normal file
156
lib/dojo/cldr/nls/ar/islamic.js.uncompressed.js
Normal file
@@ -0,0 +1,156 @@
|
||||
define(
|
||||
"dojo/cldr/nls/ar/islamic", //begin v1.x content
|
||||
{
|
||||
"dateFormat-medium": "dd/MM/yyyy",
|
||||
"dateFormatItem-MMMEd": "E d MMM",
|
||||
"dateFormatItem-yMEd": "EEE، d/M/yyyy",
|
||||
"eraNarrow": [
|
||||
"هـ"
|
||||
],
|
||||
"months-format-narrow": [
|
||||
"م",
|
||||
"ص",
|
||||
"ر",
|
||||
"ر",
|
||||
"ج",
|
||||
"ج",
|
||||
"ر",
|
||||
"ش",
|
||||
"ر",
|
||||
"ش",
|
||||
"ذ",
|
||||
"ذ"
|
||||
],
|
||||
"timeFormat-full": "zzzz h:mm:ss a",
|
||||
"dateFormatItem-Md": "d/M",
|
||||
"months-standAlone-narrow": [
|
||||
"م",
|
||||
"ص",
|
||||
"ر",
|
||||
"ر",
|
||||
"ج",
|
||||
"ج",
|
||||
"ر",
|
||||
"ش",
|
||||
"ر",
|
||||
"ش",
|
||||
"ذ",
|
||||
"ذ"
|
||||
],
|
||||
"months-standAlone-wide": [
|
||||
"محرم",
|
||||
"صفر",
|
||||
"ربيع الأول",
|
||||
"ربيع الآخر",
|
||||
"جمادى الأولى",
|
||||
"جمادى الآخرة",
|
||||
"رجب",
|
||||
"شعبان",
|
||||
"رمضان",
|
||||
"شوال",
|
||||
"ذو القعدة",
|
||||
"ذو الحجة"
|
||||
],
|
||||
"eraNames": [
|
||||
"هـ"
|
||||
],
|
||||
"days-standAlone-narrow": [
|
||||
"ح",
|
||||
"ن",
|
||||
"ث",
|
||||
"ر",
|
||||
"خ",
|
||||
"ج",
|
||||
"س"
|
||||
],
|
||||
"dayPeriods-format-wide-pm": "م",
|
||||
"months-standAlone-abbr": [
|
||||
"محرم",
|
||||
"صفر",
|
||||
"ربيع الأول",
|
||||
"ربيع الآخر",
|
||||
"جمادى الأولى",
|
||||
"جمادى الآخرة",
|
||||
"رجب",
|
||||
"شعبان",
|
||||
"رمضان",
|
||||
"شوال",
|
||||
"ذو القعدة",
|
||||
"ذو الحجة"
|
||||
],
|
||||
"dayPeriods-format-wide-am": "ص",
|
||||
"quarters-standAlone-narrow": [
|
||||
"١",
|
||||
"٢",
|
||||
"٣",
|
||||
"٤"
|
||||
],
|
||||
"timeFormat-medium": "h:mm:ss a",
|
||||
"dateFormat-long": "d MMMM، y",
|
||||
"dateFormat-short": "d/M/yyyy",
|
||||
"dateFormatItem-yMMMEd": "EEE، d MMMM y",
|
||||
"months-format-wide": [
|
||||
"محرم",
|
||||
"صفر",
|
||||
"ربيع الأول",
|
||||
"ربيع الآخر",
|
||||
"جمادى الأولى",
|
||||
"جمادى الآخرة",
|
||||
"رجب",
|
||||
"شعبان",
|
||||
"رمضان",
|
||||
"شوال",
|
||||
"ذو القعدة",
|
||||
"ذو الحجة"
|
||||
],
|
||||
"dateFormatItem-yM": "M/yyyy",
|
||||
"timeFormat-short": "h:mm a",
|
||||
"months-format-abbr": [
|
||||
"محرم",
|
||||
"صفر",
|
||||
"ربيع الأول",
|
||||
"ربيع الآخر",
|
||||
"جمادى الأولى",
|
||||
"جمادى الآخرة",
|
||||
"رجب",
|
||||
"شعبان",
|
||||
"رمضان",
|
||||
"شوال",
|
||||
"ذو القعدة",
|
||||
"ذو الحجة"
|
||||
],
|
||||
"eraAbbr": [
|
||||
"هـ"
|
||||
],
|
||||
"timeFormat-long": "z h:mm:ss a",
|
||||
"days-format-wide": [
|
||||
"الأحد",
|
||||
"الإثنين",
|
||||
"الثلاثاء",
|
||||
"الأربعاء",
|
||||
"الخميس",
|
||||
"الجمعة",
|
||||
"السبت"
|
||||
],
|
||||
"dateFormatItem-yQ": "yyyy Q",
|
||||
"dateFormatItem-yMMM": "MMM y",
|
||||
"quarters-format-wide": [
|
||||
"الربع الأول",
|
||||
"الربع الثاني",
|
||||
"الربع الثالث",
|
||||
"الربع الرابع"
|
||||
],
|
||||
"dateFormat-full": "EEEE، d MMMM، y",
|
||||
"dateFormatItem-MMMd": "d MMM",
|
||||
"days-format-abbr": [
|
||||
"أحد",
|
||||
"إثنين",
|
||||
"ثلاثاء",
|
||||
"أربعاء",
|
||||
"خميس",
|
||||
"جمعة",
|
||||
"سبت"
|
||||
]
|
||||
}
|
||||
//end v1.x content
|
||||
);
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user