/js/dojo/dojo.js.uncompressed.js
JavaScript | 7439 lines | 5521 code | 768 blank | 1150 comment | 1209 complexity | 555ab7f9262e6782b371f1c4380f582f MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.0
Large files files are truncated, but you can click here to view the full file
- if(typeof dojo == "undefined"){
- /**
- * @file bootstrap1.js
- *
- * summary: First file that is loaded that 'bootstraps' the entire dojo library suite.
- * note: Must run before hostenv_*.js file.
- *
- * @author Copyright 2004 Mark D. Anderson (mda@discerning.com)
- * TODOC: should the copyright be changed to Dojo Foundation?
- * @license Licensed under the Academic Free License 2.1 http://www.opensource.org/licenses/afl-2.1.php
- *
- * $Id: bootstrap1.js 4342 2006-06-11 23:03:30Z alex $
- */
- // TODOC: HOW TO DOC THE BELOW?
- // @global: djConfig
- // summary:
- // Application code can set the global 'djConfig' prior to loading
- // the library to override certain global settings for how dojo works.
- // description: The variables that can be set are as follows:
- // - isDebug: false
- // - allowQueryConfig: false
- // - baseScriptUri: ""
- // - baseRelativePath: ""
- // - libraryScriptUri: ""
- // - iePreventClobber: false
- // - ieClobberMinimal: true
- // - preventBackButtonFix: true
- // - searchIds: []
- // - parseWidgets: true
- // TODOC: HOW TO DOC THESE VARIABLES?
- // TODOC: IS THIS A COMPLETE LIST?
- // 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.
- // TODOC: is this still true? Release notes for 0.3 indicated they could be set after load.
- //
- //TODOC: HOW TO DOC THIS?
- // @global: dj_global
- // summary:
- // an alias for the top-level global object in the host environment
- // (e.g., the window object in a browser).
- // description:
- // Refer to 'dj_global' rather than referring to window to ensure your
- // code runs correctly in contexts other than web browsers (eg: Rhino on a server).
- var dj_global = this;
- function dj_undef(/*String*/ name, /*Object?*/ object){
- //summary: Returns true if 'name' is defined on 'object' (or globally if 'object' is null).
- //description: Note that 'defined' and 'exists' are not the same concept.
- if(object==null){ object = dj_global; }
- // exception if object is not an Object
- return (typeof object[name] == "undefined"); // Boolean
- }
- // make sure djConfig is defined
- if(dj_undef("djConfig")){
- var djConfig = {};
- }
- //TODOC: HOW TO DOC THIS?
- // dojo is the root variable of (almost all) our public symbols -- make sure it is defined.
- if(dj_undef("dojo")){
- var dojo = {};
- }
- //TODOC: HOW TO DOC THIS?
- dojo.version = {
- // summary: version number of this instance of dojo.
- major: 0, minor: 3, patch: 1, flag: "",
- revision: Number("$Rev: 4342 $".match(/[0-9]+/)[0]),
- toString: function(){
- with(dojo.version){
- return major + "." + minor + "." + patch + flag + " (" + revision + ")"; // String
- }
- }
- }
- dojo.evalProp = function(/*String*/ name, /*Object*/ object, /*Boolean?*/ create){
- // summary: Returns 'object[name]'. If not defined and 'create' is true, will return a new Object.
- // description:
- // Returns null if 'object[name]' is not defined and 'create' is not true.
- // Note: 'defined' and 'exists' are not the same concept.
- return (object && !dj_undef(name, object) ? object[name] : (create ? (object[name]={}) : undefined)); // mixed
- }
- dojo.parseObjPath = function(/*String*/ path, /*Object?*/ context, /*Boolean?*/ create){
- // summary: Parse string path to an object, and return corresponding object reference and property name.
- // description:
- // Returns an object with two properties, 'obj' and 'prop'.
- // 'obj[prop]' is the reference indicated by 'path'.
- // path: Path to an object, in the form "A.B.C".
- // context: Object to use as root of path. Defaults to 'dj_global'.
- // create: If true, Objects will be created at any point along the 'path' that is undefined.
- var object = (context != null ? context : dj_global);
- var names = path.split('.');
- var prop = names.pop();
- for (var i=0,l=names.length;i<l && object;i++){
- object = dojo.evalProp(names[i], object, create);
- }
- return {obj: object, prop: prop}; // Object: {obj: Object, prop: String}
- }
- dojo.evalObjPath = function(/*String*/ path, /*Boolean?*/ create){
- // summary: Return the value of object at 'path' in the global scope, without using 'eval()'.
- // path: Path to an object, in the form "A.B.C".
- // create: If true, Objects will be created at any point along the 'path' that is undefined.
- if(typeof path != "string"){
- return dj_global;
- }
- // fast path for no periods
- if(path.indexOf('.') == -1){
- return dojo.evalProp(path, dj_global, create); // mixed
- }
- //MOW: old 'with' syntax was confusing and would throw an error if parseObjPath returned null.
- var ref = dojo.parseObjPath(path, dj_global, create);
- if(ref){
- return dojo.evalProp(ref.prop, ref.obj, create); // mixed
- }
- return null;
- }
- // ****************************************************************
- // global public utils
- // TODOC: DO WE WANT TO NOTE THAT THESE ARE GLOBAL PUBLIC UTILS?
- // ****************************************************************
- dojo.errorToString = function(/*Error*/ exception){
- // summary: Return an exception's 'message', 'description' or text.
- // TODO: overriding Error.prototype.toString won't accomplish this?
- // ... since natively generated Error objects do not always reflect such things?
- if(!dj_undef("message", exception)){
- return exception.message; // String
- }else if(!dj_undef("description", exception)){
- return exception.description; // String
- }else{
- return exception; // Error
- }
- }
- dojo.raise = function(/*String*/ message, /*Error?*/ exception){
- // summary: Throw an error message, appending text of 'exception' if provided.
- // note: Also prints a message to the user using 'dojo.hostenv.println'.
- if(exception){
- message = message + ": "+dojo.errorToString(exception);
- }
- // print the message to the user if hostenv.println is defined
- try { dojo.hostenv.println("FATAL: "+message); } catch (e) {}
- throw Error(message);
- }
- //Stub functions so things don't break.
- //TODOC: HOW TO DOC THESE?
- dojo.debug = function(){}
- dojo.debugShallow = function(obj){}
- dojo.profile = { start: function(){}, end: function(){}, stop: function(){}, dump: function(){} };
- function dj_eval(/*String*/ scriptFragment){
- // summary: Perform an evaluation in the global scope. Use this rather than calling 'eval()' directly.
- // description: Placed in a separate function to minimize size of trapped evaluation context.
- // note:
- // - JSC eval() takes an optional second argument which can be 'unsafe'.
- // - Mozilla/SpiderMonkey eval() takes an optional second argument which is the
- // scope object for new symbols.
- return dj_global.eval ? dj_global.eval(scriptFragment) : eval(scriptFragment); // mixed
- }
- dojo.unimplemented = function(/*String*/ funcname, /*String?*/ extra){
- // summary: Throw an exception because some function is not implemented.
- // extra: Text to append to the exception message.
- var message = "'" + funcname + "' not implemented";
- if (extra != null) { message += " " + extra; }
- dojo.raise(message);
- }
- dojo.deprecated = function(/*String*/ behaviour, /*String?*/ extra, /*String?*/ removal){
- // summary: Log a debug message to indicate that a behavior has been deprecated.
- // extra: Text to append to the message.
- // removal: Text to indicate when in the future the behavior will be removed.
- var message = "DEPRECATED: " + behaviour;
- if(extra){ message += " " + extra; }
- if(removal){ message += " -- will be removed in version: " + removal; }
- dojo.debug(message);
- }
- dojo.inherits = function(/*Function*/ subclass, /*Function*/ superclass){
- // summary: Set up inheritance between two classes.
- if(typeof superclass != 'function'){
- dojo.raise("dojo.inherits: superclass argument ["+superclass+"] must be a function (subclass: [" + subclass + "']");
- }
- subclass.prototype = new superclass();
- subclass.prototype.constructor = subclass;
- subclass.superclass = superclass.prototype;
- // DEPRICATED: super is a reserved word, use 'superclass'
- subclass['super'] = superclass.prototype;
- }
- dojo.render = (function(){
- //TODOC: HOW TO DOC THIS?
- // summary: Details rendering support, OS and browser of the current environment.
- // TODOC: is this something many folks will interact with? If so, we should doc the structure created...
- function vscaffold(prefs, names){
- var tmp = {
- capable: false,
- support: {
- builtin: false,
- plugin: false
- },
- prefixes: prefs
- };
- for(var prop in names){
- tmp[prop] = false;
- }
- return tmp;
- }
- return {
- name: "",
- ver: dojo.version,
- os: { win: false, linux: false, osx: false },
- html: vscaffold(["html"], ["ie", "opera", "khtml", "safari", "moz"]),
- svg: vscaffold(["svg"], ["corel", "adobe", "batik"]),
- vml: vscaffold(["vml"], ["ie"]),
- swf: vscaffold(["Swf", "Flash", "Mm"], ["mm"]),
- swt: vscaffold(["Swt"], ["ibm"])
- };
- })();
- // ****************************************************************
- // dojo.hostenv methods that must be defined in hostenv_*.js
- // ****************************************************************
- /**
- * The interface definining the interaction with the EcmaScript host environment.
- */
- /*
- * None of these methods should ever be called directly by library users.
- * Instead public methods such as loadModule should be called instead.
- */
- dojo.hostenv = (function(){
- // TODOC: HOW TO DOC THIS?
- // summary: Provides encapsulation of behavior that changes across different 'host environments'
- // (different browsers, server via Rhino, etc).
- // description: None of these methods should ever be called directly by library users.
- // Use public methods such as 'loadModule' instead.
-
- // default configuration options
- var config = {
- isDebug: false,
- allowQueryConfig: false,
- baseScriptUri: "",
- baseRelativePath: "",
- libraryScriptUri: "",
- iePreventClobber: false,
- ieClobberMinimal: true,
- preventBackButtonFix: true,
- searchIds: [],
- parseWidgets: true
- };
- if (typeof djConfig == "undefined") { djConfig = config; }
- else {
- for (var option in config) {
- if (typeof djConfig[option] == "undefined") {
- djConfig[option] = config[option];
- }
- }
- }
- return {
- name_: '(unset)',
- version_: '(unset)',
- getName: function(){
- // sumary: Return the name of the host environment.
- return this.name_; // String
- },
- getVersion: function(){
- // summary: Return the version of the hostenv.
- return this.version_; // String
- },
- getText: function(/*String*/ uri){
- // summary: Read the plain/text contents at the specified 'uri'.
- // description:
- // If 'getText()' is not implemented, then it is necessary to override
- // 'loadUri()' with an implementation that doesn't rely on it.
- dojo.unimplemented('getText', "uri=" + uri);
- }
- };
- })();
- dojo.hostenv.getBaseScriptUri = function(){
- // summary: Return the base script uri that other scripts are found relative to.
- // TODOC: HUH? This comment means nothing to me. What other scripts? Is this the path to other dojo libraries?
- // MAYBE: Return the base uri to scripts in the dojo library. ???
- // return: Empty string or a path ending in '/'.
- if(djConfig.baseScriptUri.length){
- return djConfig.baseScriptUri;
- }
- // MOW: Why not:
- // uri = djConfig.libraryScriptUri || djConfig.baseRelativePath
- // ??? Why 'new String(...)'
- var uri = new String(djConfig.libraryScriptUri||djConfig.baseRelativePath);
- if (!uri) { dojo.raise("Nothing returned by getLibraryScriptUri(): " + uri); }
- // MOW: uri seems to not be actually used. Seems to be hard-coding to djConfig.baseRelativePath... ???
- var lastslash = uri.lastIndexOf('/'); // MOW ???
- djConfig.baseScriptUri = djConfig.baseRelativePath;
- return djConfig.baseScriptUri; // String
- }
- /*
- * loader.js - runs before the hostenv_*.js file. Contains all of the package loading methods.
- */
- //A semi-colon is at the start of the line because after doing a build, this function definition
- //get compressed onto the same line as the last line in bootstrap1.js. That list line is just a
- //curly bracket, and the browser complains about that syntax. The semicolon fixes it. Putting it
- //here instead of at the end of bootstrap1.js, since it is more of an issue for this file, (using
- //the closure), and bootstrap1.js could change in the future.
- ;(function(){
- //Additional properties for dojo.hostenv
- var _addHostEnv = {
- pkgFileName: "__package__",
-
- // for recursion protection
- loading_modules_: {},
- loaded_modules_: {},
- addedToLoadingCount: [],
- removedFromLoadingCount: [],
-
- inFlightCount: 0,
-
- // FIXME: it should be possible to pull module prefixes in from djConfig
- modulePrefixes_: {
- dojo: {name: "dojo", value: "src"}
- },
-
-
- setModulePrefix: function(module, prefix){
- this.modulePrefixes_[module] = {name: module, value: prefix};
- },
-
- getModulePrefix: function(module){
- var mp = this.modulePrefixes_;
- if((mp[module])&&(mp[module]["name"])){
- return mp[module].value;
- }
- return module;
- },
- getTextStack: [],
- loadUriStack: [],
- loadedUris: [],
-
- //WARNING: This variable is referenced by packages outside of bootstrap: FloatingPane.js and undo/browser.js
- post_load_: false,
-
- //Egad! Lots of test files push on this directly instead of using dojo.addOnLoad.
- modulesLoadedListeners: [],
- unloadListeners: [],
- loadNotifying: false
- };
-
- //Add all of these properties to dojo.hostenv
- for(var param in _addHostEnv){
- dojo.hostenv[param] = _addHostEnv[param];
- }
- })();
- /**
- * 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.
- *
- * For now, we do not have an implementation of a true search path. We
- * consider only the single base script uri, as returned by getBaseScriptUri().
- *
- * @param relpath A relative path to a script (no leading '/', and typically
- * ending in '.js').
- * @param module A module whose existance to check for after loading a path.
- * Can be used to determine success or failure of the load.
- * @param cb a function to pass the result of evaluating the script (optional)
- */
- dojo.hostenv.loadPath = function(relpath, module /*optional*/, cb /*optional*/){
- var uri;
- if((relpath.charAt(0) == '/')||(relpath.match(/^\w+:/))){
- // dojo.raise("relpath '" + relpath + "'; must be relative");
- uri = relpath;
- }else{
- uri = this.getBaseScriptUri() + relpath;
- }
- if(djConfig.cacheBust && dojo.render.html.capable){
- uri += "?" + String(djConfig.cacheBust).replace(/\W+/g,"");
- }
- try{
- return ((!module) ? this.loadUri(uri, cb) : this.loadUriAndCheck(uri, module, cb));
- }catch(e){
- dojo.debug(e);
- return false;
- }
- }
- /**
- * Reads the contents of the URI, and evaluates the contents.
- * Returns true if it succeeded. Returns false if the URI reading failed.
- * Throws if the evaluation throws.
- * The result of the eval is not available to the caller TODO: now it is; was this a deliberate restriction?
- *
- * @param uri a uri which points at the script to be loaded
- * @param cb a function to process the result of evaluating the script as an expression (optional)
- */
- dojo.hostenv.loadUri = function(uri, cb /*optional*/){
- if(this.loadedUris[uri]){
- return 1;
- }
- var contents = this.getText(uri, null, true);
- if(contents == null){ return 0; }
- this.loadedUris[uri] = true;
- if(cb){ contents = '('+contents+')'; }
- var value = dj_eval(contents);
- if(cb){
- cb(value);
- }
- return 1;
- }
- // FIXME: probably need to add logging to this method
- dojo.hostenv.loadUriAndCheck = function(uri, module, cb){
- var ok = true;
- try{
- ok = this.loadUri(uri, cb);
- }catch(e){
- dojo.debug("failed loading ", uri, " with error: ", e);
- }
- return ((ok)&&(this.findModule(module, false))) ? true : false;
- }
- dojo.loaded = function(){ }
- dojo.unloaded = function(){ }
- dojo.hostenv.loaded = function(){
- this.loadNotifying = true;
- this.post_load_ = true;
- var mll = this.modulesLoadedListeners;
- for(var x=0; x<mll.length; x++){
- mll[x]();
- }
- //Clear listeners so new ones can be added
- //For other xdomain package loads after the initial load.
- this.modulesLoadedListeners = [];
- this.loadNotifying = false;
- dojo.loaded();
- }
- dojo.hostenv.unloaded = function(){
- var mll = this.unloadListeners;
- while(mll.length){
- (mll.pop())();
- }
- dojo.unloaded();
- }
- /*
- Call styles:
- dojo.addOnLoad(functionPointer)
- dojo.addOnLoad(object, "functionName")
- */
- dojo.addOnLoad = function(obj, fcnName) {
- var dh = dojo.hostenv;
- if(arguments.length == 1) {
- dh.modulesLoadedListeners.push(obj);
- } else if(arguments.length > 1) {
- dh.modulesLoadedListeners.push(function() {
- obj[fcnName]();
- });
- }
- //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(dh.post_load_ && dh.inFlightCount == 0 && !dh.loadNotifying){
- dh.callLoaded();
- }
- }
- dojo.addOnUnload = function(obj, fcnName){
- var dh = dojo.hostenv;
- if(arguments.length == 1){
- dh.unloadListeners.push(obj);
- } else if(arguments.length > 1) {
- dh.unloadListeners.push(function() {
- obj[fcnName]();
- });
- }
- }
- dojo.hostenv.modulesLoaded = function(){
- if(this.post_load_){ return; }
- if((this.loadUriStack.length==0)&&(this.getTextStack.length==0)){
- if(this.inFlightCount > 0){
- dojo.debug("files still in flight!");
- return;
- }
- dojo.hostenv.callLoaded();
- }
- }
- dojo.hostenv.callLoaded = function(){
- if(typeof setTimeout == "object"){
- setTimeout("dojo.hostenv.loaded();", 0);
- }else{
- dojo.hostenv.loaded();
- }
- }
- dojo.hostenv.getModuleSymbols = function(modulename) {
- var syms = modulename.split(".");
- for(var i = syms.length - 1; i > 0; i--){
- var parentModule = syms.slice(0, i).join(".");
- var parentModulePath = this.getModulePrefix(parentModule);
- if(parentModulePath != parentModule){
- syms.splice(0, i, parentModulePath);
- break;
- }
- }
- return syms;
- }
- /**
- * loadModule("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,
- * followed by "A.js".
- *
- * It throws 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.
- *
- * This does nothing about importing symbols into the current package.
- * It is presumed that the caller will take care of that. For example, to import
- * all symbols:
- *
- * with (dojo.hostenv.loadModule("A.B")) {
- * ...
- * }
- *
- * And to import just the leaf symbol:
- *
- * var B = dojo.hostenv.loadModule("A.B");
- * ...
- *
- * dj_load is an alias for dojo.hostenv.loadModule
- */
- dojo.hostenv._global_omit_module_check = false;
- dojo.hostenv.loadModule = function(modulename, exact_only, omit_module_check){
- if(!modulename){ return; }
- omit_module_check = this._global_omit_module_check || omit_module_check;
- var module = this.findModule(modulename, false);
- if(module){
- return module;
- }
- // protect against infinite recursion from mutual dependencies
- if(dj_undef(modulename, this.loading_modules_)){
- this.addedToLoadingCount.push(modulename);
- }
- this.loading_modules_[modulename] = 1;
- // convert periods to slashes
- var relpath = modulename.replace(/\./g, '/') + '.js';
- var syms = this.getModuleSymbols(modulename);
- var startedRelative = ((syms[0].charAt(0) != '/')&&(!syms[0].match(/^\w+:/)));
- var last = syms[syms.length - 1];
- // figure out if we're looking for a full package, if so, we want to do
- // things slightly diffrently
- var nsyms = modulename.split(".");
- if(last=="*"){
- modulename = (nsyms.slice(0, -1)).join('.');
- while(syms.length){
- syms.pop();
- syms.push(this.pkgFileName);
- relpath = syms.join("/") + '.js';
- if(startedRelative && (relpath.charAt(0)=="/")){
- relpath = relpath.slice(1);
- }
- ok = this.loadPath(relpath, ((!omit_module_check) ? modulename : null));
- if(ok){ break; }
- syms.pop();
- }
- }else{
- relpath = syms.join("/") + '.js';
- modulename = nsyms.join('.');
- var ok = this.loadPath(relpath, ((!omit_module_check) ? modulename : null));
- if((!ok)&&(!exact_only)){
- syms.pop();
- while(syms.length){
- relpath = syms.join('/') + '.js';
- ok = this.loadPath(relpath, ((!omit_module_check) ? modulename : null));
- if(ok){ break; }
- syms.pop();
- relpath = syms.join('/') + '/'+this.pkgFileName+'.js';
- if(startedRelative && (relpath.charAt(0)=="/")){
- relpath = relpath.slice(1);
- }
- ok = this.loadPath(relpath, ((!omit_module_check) ? modulename : null));
- if(ok){ break; }
- }
- }
- if((!ok)&&(!omit_module_check)){
- dojo.raise("Could not load '" + modulename + "'; last tried '" + relpath + "'");
- }
- }
- // check that the symbol was defined
- //Don't bother if we're doing xdomain (asynchronous) loading.
- if(!omit_module_check && !this["isXDomain"]){
- // pass in false so we can give better error
- module = this.findModule(modulename, false);
- if(!module){
- dojo.raise("symbol '" + modulename + "' is not defined after loading '" + relpath + "'");
- }
- }
- return module;
- }
- /**
- * startPackage("A.B") follows the path, and at each level creates a new empty
- * object or uses what already exists. It returns the result.
- */
- dojo.hostenv.startPackage = function(packname){
- var modref = dojo.evalObjPath((packname.split(".").slice(0, -1)).join('.'));
- this.loaded_modules_[(new String(packname)).toLowerCase()] = modref;
- var syms = packname.split(/\./);
- if(syms[syms.length-1]=="*"){
- syms.pop();
- }
- return dojo.evalObjPath(syms.join("."), true);
- }
- /**
- * findModule("A.B") returns the object A.B if it exists, otherwise null.
- * @param modulename A string like 'A.B'.
- * @param must_exist Optional, defualt false. throw instead of returning null
- * if the module does not currently exist.
- */
- dojo.hostenv.findModule = function(modulename, must_exist){
- // check cache
- /*
- if(!dj_undef(modulename, this.modules_)){
- return this.modules_[modulename];
- }
- */
- var lmn = (new String(modulename)).toLowerCase();
- if(this.loaded_modules_[lmn]){
- return this.loaded_modules_[lmn];
- }
- // see if symbol is defined anyway
- var module = dojo.evalObjPath(modulename);
- if((modulename)&&(typeof module != 'undefined')&&(module)){
- this.loaded_modules_[lmn] = module;
- return module;
- }
- if(must_exist){
- dojo.raise("no loaded module named '" + modulename + "'");
- }
- return null;
- }
- //Start of old bootstrap2:
- /*
- * This method taks a "map" of arrays which one can use to optionally load dojo
- * modules. The map is indexed by the possible dojo.hostenv.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
- * the hostenv.name_ item. The items in the "common" array will _always_ be
- * loaded, regardless of which list is chosen. Here's how it's normally
- * called:
- *
- * dojo.kwCompoundRequire({
- * browser: [
- * ["foo.bar.baz", true, true], // an example that passes multiple args to loadModule()
- * "foo.sample.*",
- * "foo.test,
- * ],
- * default: [ "foo.sample.*" ],
- * common: [ "really.important.module.*" ]
- * });
- */
- dojo.kwCompoundRequire = function(modMap){
- var common = modMap["common"]||[];
- var result = (modMap[dojo.hostenv.name_]) ? common.concat(modMap[dojo.hostenv.name_]||[]) : common.concat(modMap["default"]||[]);
- for(var x=0; x<result.length; x++){
- var curr = result[x];
- if(curr.constructor == Array){
- dojo.hostenv.loadModule.apply(dojo.hostenv, curr);
- }else{
- dojo.hostenv.loadModule(curr);
- }
- }
- }
- dojo.require = function(){
- dojo.hostenv.loadModule.apply(dojo.hostenv, arguments);
- }
- dojo.requireIf = function(){
- if((arguments[0] === true)||(arguments[0]=="common")||(arguments[0] && dojo.render[arguments[0]].capable)){
- var args = [];
- for (var i = 1; i < arguments.length; i++) { args.push(arguments[i]); }
- dojo.require.apply(dojo, args);
- }
- }
- dojo.requireAfterIf = dojo.requireIf;
- dojo.provide = function(){
- return dojo.hostenv.startPackage.apply(dojo.hostenv, arguments);
- }
- dojo.setModulePrefix = function(module, prefix){
- return dojo.hostenv.setModulePrefix(module, prefix);
- }
- // determine if an object supports a given method
- // useful for longer api chains where you have to test each object in the chain
- dojo.exists = function(obj, name){
- var p = name.split(".");
- for(var i = 0; i < p.length; i++){
- if(!(obj[p[i]])) return false;
- obj = obj[p[i]];
- }
- return true;
- }
- };
- if(typeof window == 'undefined'){
- dojo.raise("no window object");
- }
- // attempt to figure out the path to dojo if it isn't set in the config
- (function() {
- // before we get any further with the config options, try to pick them out
- // of the URL. Most of this code is from NW
- if(djConfig.allowQueryConfig){
- var baseUrl = document.location.toString(); // FIXME: use location.query instead?
- var params = baseUrl.split("?", 2);
- if(params.length > 1){
- var paramStr = params[1];
- var pairs = paramStr.split("&");
- for(var x in pairs){
- var sp = pairs[x].split("=");
- // FIXME: is this eval dangerous?
- if((sp[0].length > 9)&&(sp[0].substr(0, 9) == "djConfig.")){
- var opt = sp[0].substr(9);
- try{
- djConfig[opt]=eval(sp[1]);
- }catch(e){
- djConfig[opt]=sp[1];
- }
- }
- }
- }
- }
- if(((djConfig["baseScriptUri"] == "")||(djConfig["baseRelativePath"] == "")) &&(document && document.getElementsByTagName)){
- var scripts = document.getElementsByTagName("script");
- var rePkg = /(__package__|dojo|bootstrap1)\.js([\?\.]|$)/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) {
- var root = src.substring(0, m.index);
- if(src.indexOf("bootstrap1") > -1) { root += "../"; }
- if(!this["djConfig"]) { djConfig = {}; }
- if(djConfig["baseScriptUri"] == "") { djConfig["baseScriptUri"] = root; }
- if(djConfig["baseRelativePath"] == "") { djConfig["baseRelativePath"] = root; }
- break;
- }
- }
- }
- // fill in the rendering support information in dojo.render.*
- var dr = dojo.render;
- var drh = dojo.render.html;
- var drs = dojo.render.svg;
- var dua = drh.UA = navigator.userAgent;
- var dav = drh.AV = navigator.appVersion;
- var t = true;
- var f = false;
- drh.capable = t;
- drh.support.builtin = t;
- dr.ver = parseFloat(drh.AV);
- dr.os.mac = dav.indexOf("Macintosh") >= 0;
- dr.os.win = dav.indexOf("Windows") >= 0;
- // could also be Solaris or something, but it's the same browser
- dr.os.linux = dav.indexOf("X11") >= 0;
- drh.opera = dua.indexOf("Opera") >= 0;
- drh.khtml = (dav.indexOf("Konqueror") >= 0)||(dav.indexOf("Safari") >= 0);
- drh.safari = dav.indexOf("Safari") >= 0;
- var geckoPos = dua.indexOf("Gecko");
- drh.mozilla = drh.moz = (geckoPos >= 0)&&(!drh.khtml);
- if (drh.mozilla) {
- // gecko version is YYYYMMDD
- drh.geckoVersion = dua.substring(geckoPos + 6, geckoPos + 14);
- }
- drh.ie = (document.all)&&(!drh.opera);
- drh.ie50 = drh.ie && dav.indexOf("MSIE 5.0")>=0;
- drh.ie55 = drh.ie && dav.indexOf("MSIE 5.5")>=0;
- drh.ie60 = drh.ie && dav.indexOf("MSIE 6.0")>=0;
- drh.ie70 = drh.ie && dav.indexOf("MSIE 7.0")>=0;
- // TODO: is the HTML LANG attribute relevant?
- dojo.locale = (drh.ie ? navigator.userLanguage : navigator.language).toLowerCase();
- dr.vml.capable=drh.ie;
- drs.capable = f;
- drs.support.plugin = f;
- drs.support.builtin = f;
- if (document.implementation
- && document.implementation.hasFeature
- && document.implementation.hasFeature("org.w3c.dom.svg", "1.0")
- ){
- drs.capable = t;
- drs.support.builtin = t;
- drs.support.plugin = f;
- }
- })();
- dojo.hostenv.startPackage("dojo.hostenv");
- dojo.render.name = dojo.hostenv.name_ = 'browser';
- dojo.hostenv.searchIds = [];
- // These are in order of decreasing likelihood; this will change in time.
- dojo.hostenv._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
- dojo.hostenv.getXmlhttpObject = function(){
- var http = null;
- var last_e = null;
- try{ http = new XMLHttpRequest(); }catch(e){}
- if(!http){
- for(var i=0; i<3; ++i){
- var progid = dojo.hostenv._XMLHTTP_PROGIDS[i];
- try{
- http = new ActiveXObject(progid);
- }catch(e){
- last_e = e;
- }
- if(http){
- dojo.hostenv._XMLHTTP_PROGIDS = [progid]; // so faster next time
- break;
- }
- }
- /*if(http && !http.toString) {
- http.toString = function() { "[object XMLHttpRequest]"; }
- }*/
- }
- if(!http){
- return dojo.raise("XMLHTTP not available", last_e);
- }
- return http;
- }
- /**
- * Read the contents of the specified uri and return those contents.
- *
- * @param uri A relative or absolute uri. If absolute, it still must be in the
- * same "domain" as we are.
- *
- * @param async_cb If not specified, load synchronously. If specified, load
- * asynchronously, and use async_cb as the progress handler which takes the
- * xmlhttp object as its argument. If async_cb, this function returns null.
- *
- * @param fail_ok Default false. If fail_ok and !async_cb and loading fails,
- * return null instead of throwing.
- */
- dojo.hostenv.getText = function(uri, async_cb, fail_ok){
- var http = this.getXmlhttpObject();
- if(async_cb){
- http.onreadystatechange = function(){
- if(4==http.readyState){
- if((!http["status"])||((200 <= http.status)&&(300 > http.status))){
- // dojo.debug("LOADED URI: "+uri);
- async_cb(http.responseText);
- }
- }
- }
- }
- http.open('GET', uri, async_cb ? true : false);
- try{
- http.send(null);
- if(async_cb){
- return null;
- }
- if((http["status"])&&((200 > http.status)||(300 <= http.status))){
- throw Error("Unable to load "+uri+" status:"+ http.status);
- }
- }catch(e){
- if((fail_ok)&&(!async_cb)){
- return null;
- }else{
- throw e;
- }
- }
- return http.responseText;
- }
- /*
- * It turns out that if we check *right now*, as this script file is being loaded,
- * then the last script element in the window DOM is ourselves.
- * That is because any subsequent script elements haven't shown up in the document
- * object yet.
- */
- /*
- function dj_last_script_src() {
- var scripts = window.document.getElementsByTagName('script');
- if(scripts.length < 1){
- dojo.raise("No script elements in window.document, so can't figure out my script src");
- }
- var script = scripts[scripts.length - 1];
- var src = script.src;
- if(!src){
- dojo.raise("Last script element (out of " + scripts.length + ") has no src");
- }
- return src;
- }
- if(!dojo.hostenv["library_script_uri_"]){
- dojo.hostenv.library_script_uri_ = dj_last_script_src();
- }
- */
- dojo.hostenv.defaultDebugContainerId = 'dojoDebug';
- dojo.hostenv._println_buffer = [];
- dojo.hostenv._println_safe = false;
- dojo.hostenv.println = function (line){
- if(!dojo.hostenv._println_safe){
- dojo.hostenv._println_buffer.push(line);
- }else{
- try {
- var console = document.getElementById(djConfig.debugContainerId ?
- djConfig.debugContainerId : dojo.hostenv.defaultDebugContainerId);
- if(!console) { console = document.getElementsByTagName("body")[0] || document.body; }
- var div = document.createElement("div");
- div.appendChild(document.createTextNode(line));
- console.appendChild(div);
- } catch (e) {
- try{
- // safari needs the output wrapped in an element for some reason
- document.write("<div>" + line + "</div>");
- }catch(e2){
- window.status = line;
- }
- }
- }
- }
- dojo.addOnLoad(function(){
- dojo.hostenv._println_safe = true;
- while(dojo.hostenv._println_buffer.length > 0){
- dojo.hostenv.println(dojo.hostenv._println_buffer.shift());
- }
- });
- function dj_addNodeEvtHdlr(node, evtName, fp, capture){
- var oldHandler = node["on"+evtName] || function(){};
- node["on"+evtName] = function(){
- fp.apply(node, arguments);
- oldHandler.apply(node, arguments);
- }
- return true;
- }
- /* Uncomment this to allow init after DOMLoad, not after window.onload
- // Mozilla exposes the event we could use
- if (dojo.render.html.mozilla) {
- document.addEventListener("DOMContentLoaded", dj_load_init, null);
- }
- // for Internet Explorer. readyState will not be achieved on init call, but dojo doesn't need it
- //Tighten up the comments below to allow init after DOMLoad, not after window.onload
- / * @cc_on @ * /
- / * @if (@_win32)
- document.write("<script defer>dj_load_init()<"+"/script>");
- / * @end @ * /
- */
- // default for other browsers
- // potential TODO: apply setTimeout approach for other browsers
- // that will cause flickering though ( document is loaded and THEN is processed)
- // maybe show/hide required in this case..
- // TODO: other browsers may support DOMContentLoaded/defer attribute. Add them to above.
- dj_addNodeEvtHdlr(window, "load", function(){
- // allow multiple calls, only first one will take effect
- if(arguments.callee.initialized){ return; }
- arguments.callee.initialized = true;
- var initFunc = function(){
- //perform initialization
- if(dojo.render.html.ie){
- dojo.hostenv.makeWidgets();
- }
- };
- if(dojo.hostenv.inFlightCount == 0){
- initFunc();
- dojo.hostenv.modulesLoaded();
- }else{
- dojo.addOnLoad(initFunc);
- }
- });
- dj_addNodeEvtHdlr(window, "unload", function(){
- dojo.hostenv.unloaded();
- });
- dojo.hostenv.makeWidgets = function(){
- // you can put searchIds in djConfig and dojo.hostenv at the moment
- // we should probably eventually move to one or the other
- var sids = [];
- if(djConfig.searchIds && djConfig.searchIds.length > 0) {
- sids = sids.concat(djConfig.searchIds);
- }
- if(dojo.hostenv.searchIds && dojo.hostenv.searchIds.length > 0) {
- sids = sids.concat(dojo.hostenv.searchIds);
- }
- if((djConfig.parseWidgets)||(sids.length > 0)){
- if(dojo.evalObjPath("dojo.widget.Parse")){
- // we must do this on a delay to avoid:
- // http://www.shaftek.org/blog/archives/000212.html
- // IE is such a tremendous peice of shit.
- var parser = new dojo.xml.Parse();
- if(sids.length > 0){
- for(var x=0; x<sids.length; x++){
- var tmpNode = document.getElementById(sids[x]);
- if(!tmpNode){ continue; }
- var frag = parser.parseElement(tmpNode, null, true);
- dojo.widget.getParser().createComponents(frag);
- }
- }else if(djConfig.parseWidgets){
- var frag = parser.parseElement(document.getElementsByTagName("body")[0] || document.body, null, true);
- dojo.widget.getParser().createComponents(frag);
- }
- }
- }
- }
- dojo.addOnLoad(function(){
- if(!dojo.render.html.ie) {
- dojo.hostenv.makeWidgets();
- }
- });
- try {
- if (dojo.render.html.ie) {
- document.write('<style>v\:*{ behavior:url(#default#VML); }</style>');
- document.write('<xml:namespace ns="urn:schemas-microsoft-com:vml" prefix="v"/>');
- }
- } catch (e) { }
- // stub, over-ridden by debugging code. This will at least keep us from
- // breaking when it's not included
- dojo.hostenv.writeIncludes = function(){}
- 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
- }
- //Semicolon is for when this file is integrated with a custom build on one line
- //with some other file's contents. Sometimes that makes things not get defined
- //properly, particularly with the using the closure below to do all the work.
- ;(function(){
- //Don't do this work if dojo.js has already done it.
- if(typeof dj_usingBootstrap != "undefined"){
- return;
- }
- var isRhino = false;
- var isSpidermonkey = false;
- var isDashboard = false;
- if((typeof this["load"] == "function")&&((typeof this["Packages"] == "function")||(typeof this["Packages"] == "object"))){
- isRhino = true;
- }else if(typeof this["load"] == "function"){
- isSpidermonkey = true;
- }else if(window.widget){
- isDashboard = true;
- }
- var tmps = [];
- if((this["djConfig"])&&((djConfig["isDebug"])||(djConfig["debugAtAllCosts"]))){
- tmps.push("debug.js");
- }
- if((this["djConfig"])&&(djConfig["debugAtAllCosts"])&&(!isRhino)&&(!isDashboard)){
- tmps.push("browser_debug.js");
- }
- //Support compatibility packages. Right now this only allows setting one
- //compatibility package. Might need to revisit later down the line to support
- //more than one.
- if((this["djConfig"])&&(djConfig["compat"])){
- tmps.push("compat/" + djConfig["compat"] + ".js");
- }
- var loaderRoot = djConfig["baseScriptUri"];
- if((this["djConfig"])&&(djConfig["baseLoaderUri"])){
- loaderRoot = djConfig["baseLoaderUri"];
- }
- for(var x=0; x < tmps.length; x++){
- var spath = loaderRoot+"src/"+tmps[x];
- if(isRhino||isSpidermonkey){
- load(spath);
- } else {
- try {
- document.write("<scr"+"ipt type='text/javascript' src='"+spath+"'></scr"+"ipt>");
- } catch (e) {
- var script = document.createElement("script");
- script.src = spath;
- document.getElementsByTagName("head")[0].appendChild(script);
- }
- }
- }
- })();
- // Localization routines
- /**
- * The locale to look for string bundles if none are defined for your locale. Translations for all strings
- * should be provided in this locale.
- */
- //TODO: this really belongs in translation metadata, not in code
- dojo.fallback_locale = 'en';
- /**
- * Returns canonical form of locale, as used by Dojo. All variants are case-insensitive and are separated by '-'
- * as specified in RFC 3066
- */
- dojo.normalizeLocale = function(locale) {
- return locale ? locale.toLowerCase() : dojo.locale;
- };
- /**
- * requireLocalization() is for loading translated bundles provided within a package in the namespace.
- * Contents are typically strings, but may be any name/value pair, represented in JSON format.
- * A bundle is structured in a program as follows:
- *
- * <package>/
- * nls/
- * de/
- * mybundle.js
- * de-at/
- * mybundle.js
- * en/
- * mybundle.js
- * en-us/
- * mybundle.js
- * en-gb/
- * mybundle.js
- * es/
- * mybundle.js
- * ...etc
- *
- * where package is part of the namespace as used by dojo.require(). Each directory is named for a
- * locale as specified by RFC 3066, (http://www.ietf.org/rfc/rfc3066.txt), normalized in lowercase.
- *
- * For a given locale, string bundles will be loaded for that locale and all general locales above it, as well
- * as a system-specified fallback. For example, "de_at" will also load "de" and "en". Lookups will traverse
- * the locales in this order. A build step can preload the bundles to avoid data redundancy and extra network hits.
- *
- * @param modulename package in which the bundle is found
- * @param bundlename bundle name, typically the filename without the '.js' suffix
- * @param locale the locale to load (optional) By default, the browser's user locale as defined
- * in dojo.locale
- */
- dojo.requireLocalization = function(modulename, bundlename, locale /*optional*/){
- dojo.debug("EXPERIMENTAL: dojo.requireLocalization"); //dojo.experimental
- var syms = dojo.hostenv.getModuleSymbols(modulename);
- var modpath = syms.concat("nls").join("/");
- locale = dojo.normalizeLocale(locale);
- var elements = locale.split('-');
- var searchlist = [];
- for(var i = elements.length; i > 0; i--){
- searchlist.push(elements.slice(0, i).join('-'));
- }
- if(searchlist[searchlist.length-1] != dojo.fallback_locale){
- searchlist.push(dojo.fallback_locale);
- }
- var bundlepackage = [modulename, "_nls", bundlename].join(".");
- var bundle = dojo.hostenv.startPackage(bundlepackage);
- dojo.hostenv.loaded_modules_[bundlepackage] = bundle;
-
- var inherit = false;
- for(var i = searchlist.length - 1; i >= 0; i--){
- var loc = searchlist[i];
- var pkg = [bundlepackage, loc].join(".");
- var loaded = false;
- if(!dojo.hostenv.findModule(pkg)){
- // Mark loaded whether it's found or not, so that further load attempts will not be made
- dojo.hostenv.loaded_modules_[pkg] = null;
- var filespec = [modpath, loc, bundlename].join("/") + '.js';
- loaded = dojo.hostenv.loadPath(filespec, null, function(hash) {
- bundle[loc] = hash;
- if(inherit){
- // Use mixins approach to copy string references from inherit bundle, but skip overrides.
- for(var x in inherit){
- if(!bundle[loc][x]){
- bundle[loc][x] = inherit[x];
- }
- }
- }
- /*
- // Use prototype to point to other bundle, then copy in result from loadPath
- bundle[loc] = new function(){};
- if(inherit){ bundle[loc].prototype = inherit; }
- for(var i in hash){ bundle[loc][i] = hash[i]; }
- */
- });
- }else{
- loaded = true;
- }
- if(loaded && bundle[loc]){
- inherit = bundle[loc];
- }
- }
- };
- dojo.provide("dojo.string.common");
- dojo.require("dojo.string");
- /**
- * Trim whitespace from 'str'. If 'wh' > 0,
- * only trim from start, if 'wh' < 0, only trim
- * from end, otherwise trim both ends
- */
- dojo.string.trim = function(str, wh){
- if(!str.replace){ return str; }
- if(!str.length){ return str; }
- var re = (wh > 0) ? (/^\s+/) : (wh < 0) ? (/\s+$/) : (/^\s+|\s+$/g);
- return str.replace(re, "");
- }
- /**
- * Trim whitespace at the beginning of 'str'
- */
- dojo.string.trimStart = function(str) {
- return dojo.string.trim(str, 1);
- }
- /**
- * Trim whitespace at the end of 'str'
- */
- dojo.string.trimEnd = function(str) {
- return dojo.string.trim(str, -1);
- }
- /**
- * Return 'str' repeated 'count' times, optionally
- * placing 'separator' between each rep
- */
- dojo.string.repeat = function(str, count, separator) {
- var out = "";
- for(var i = 0; i < count; i++) {
- out += str;
- if(separator && i < count - 1) {
- out += separator;
- }
- }
- return out;
- }
- /**
- * Pad 'str' to guarantee that it is at least 'len' length
- * with the character 'c' at either the start (dir=1) or
- * end (dir=-1) of the string
- */
- dojo.string.pad = function(str, len/*=2*/, c/*='0'*/, dir/*=1*/) {
- var out = String(str);
- if(!c) {
- c = '0';
- }
- if(!dir) {
- dir = 1;
- }
- while(out.length < len) {
- if(dir > 0) {
- out = c + out;
- } else {
- out += c;
- }
- }
- return out;
- }
- /** same as dojo.string.pad(str, len, c, 1) */
- dojo.string.padLeft = function(str, len, c) {
- return dojo.string.pad(str, len, c, 1);
- }
- /** same as dojo.string.pad(str, len, c, -1) */
- dojo.string.padRight = function(str, len, c) {
- return dojo.string.pad(str, len, c, -1);
- }
- dojo.provide("dojo.string");
- dojo.require("dojo.string.common");
- dojo.provide("dojo.lang.common");
- dojo.require("dojo.lang");
- /*
- * Adds the given properties/methods to the specified object
- */
- dojo.lang._mixin = function(obj, props){
- var tobj = {};
- for(var x in props){
- // the "tobj" condition avoid copying properties in "props"
- // inherited from Object.prototype. For example, if obj has a custom
- // toString() method, don't overwrite it with the toString() method
- // that props inherited from Object.protoype
- if(typeof tobj[x] == "undefined" || tobj[x] != props[x]) {
- obj[x] = props[x];
- }
- }
- // IE doesn't recognize custom toStrings in for..in
- if(dojo.render.html.ie && dojo.lang.isFunction(props["toString"]) && props["toString"] != obj["toString"]) {
- obj.toString = props.toString;
- }
- return obj;
- }
- /*
- * Adds the properties/methods of argument Objects to obj
- */
- dojo.lang.mixin = function(obj, props /*, props, ..., props */){
- for(var i=1, l=arguments.length; i<l; i++){
- dojo.lang._mixin(obj, arguments[i]);
- }
- return obj;
- }
- /*
- * Adds the properties/methods of argument Objects to ctor's prototype
- */
- dojo.lang.extend = function(ctor /*function*/, props /*, props, ..., props */){
- for(var i=1, l=arguments.length; i<l; i++){
- dojo.lang._mixin(ctor.prototype, arguments[i]);
- }
- return ctor;
- }
- /**
- * See if val is in arr. Call signatures:
- * find(array, value, identity) // recommended
- * find(value, array, identity)
- **/
- dojo.lang.find = function( /*Array*/ arr,
- /*Object*/ val,
- /*boolean*/ identity,
- /*boolean*/ findLast){
- // support both (arr, val) and (val, arr)
- if(!dojo.lang.isArrayLike(arr) && dojo.lang.isArrayLike(val)) {
- var a = arr;
- arr = val;
- val = a;
- }
- var isString = dojo.lang.isString(arr);
- if(isString) { arr = arr.split(""); }
- if(findLast) {
- var step = -1;
- var i = arr.length - 1;
- var end = -1;
- } else {
- var step = 1;
- var i = 0;
- var end = arr.length;
- }
- if(identity){
- while(i != end) {
- if(arr[i] === val){ return i; }
- i += step;
- }
- }else{
- while(i != end) {
- if(arr[i] == val){ return i; }
- i += step;
- }
- }
- return -1;
- }
- dojo.lang.indexOf = dojo.lang.find;
- dojo.lang.findLast = function(/*Array*/ arr, /*Object*/ val, /*boolean*/ identity){
- return dojo.lang.find(arr, val, identity, true);
- }
- dojo.lang.lastIndexOf = dojo.lang.findLast;
- dojo.lang.inArray = function(arr /*Array*/, val /*Object*/){
- return dojo.lang.find(arr, val) > -1; // return: boolean
- }
- /**
- * Partial implmentation of is* functions from
- * http://www.crockford.com/javascript/recommend.html
- * NOTE: some of these may not be the best thing to use in all situations
- * as they aren't part of core JS and therefore can't work in every case.
- * See WARNING messages inline for tips.
- *
- * The following is* functions are fairly "safe"
- */
- dojo.lang.isObject = function(wh){
- if(typeof wh == "undefined"){ return false; }
- return (typeof wh == "object" || wh === null || dojo.lang.isArray(wh) || dojo.lang.isFunction(wh));
- }
- dojo.lang.isArray = function(wh){
- return (wh instanceof Array || typeof wh == "array");
- }
- dojo.lang.isArrayLike = function(wh){
- if(dojo.lang.isString(wh)){ return false; }
- if(dojo.lang.isFunction(wh)){ return false; } // keeps out built-in ctors (Number, String, ...) which have length properties
- if(dojo.lang.isArray(wh)){ return true; }
- if(typeof wh != "undefined" && wh
- && dojo.lang.isNumber(wh.length) && isFinite(wh.length)){ return true; }
- return false;
- }
- dojo.lang.isFunction = function(wh){
- if(!wh){ return false; }
- return (wh instanceof Function || typeof wh == "function");
- }
- dojo.lang.isString = function(wh){
- return (wh instanceof String || typeof wh == "string");
- }
- dojo.lang.isAlien = function(wh){
- if(!wh){ return false; }
- return !dojo.lang.isFunction() && /\{\s*\[native code\]\s*\}/.test(String(wh));
- }
- dojo.lang.isBoolean = function(wh){
- return (wh instanceof Boolean || typeof wh == "boolean");
- }
- /**
- * The following is***() functions are somewhat "unsafe". Fortunately,
- * there are workarounds the the language provides and are mentioned
- * in the WARNING messages.
- *
- * WARNING: In most cases, isNaN(wh) is sufficient to determine whether or not
- * something is a number or can be used as such. For example, a number or string
- * can be used interchangably when accessing array items (arr["1"] is the same as
- * arr[1]) and isNaN will return false for both values ("1" and 1). Should you
- * use isNumber("1"), that will return false, which is generally not too useful.
- * Also, isNumber(NaN) returns true, again, this isn't generally useful, but there
- * are corner cases (like when you want to make sure that two things are really
- * the same type of thing). That is really where isNumber "shines".
- *
- * RECOMMENDATION: Use isNaN(wh) when possible
- */
- dojo.lang.isNumber = function(wh){
- return (wh instanceof Number || typeof wh == "number");
- }
- /**
- * WARNING: In some cases, isUndefined will not behave as you
- * might expect. If you do isUndefined(foo) and there is no earlier
- * reference to foo, an error will be thrown before isUndefined is
- * called. It behaves correctly if you scope yor object first, i.e.
- * isUndefined(foo.bar) where foo is an object and bar isn't a
- * property of the object.
- *
- * RECOMMENDATION: Use `typeof foo == "undefined"` when possible
- *
- * FIXME: Should isUndefined go away since it is error prone?
- */
- dojo.lang.isUndefined = function(wh){
- return ((wh == undefined)&&(typeof wh == "undefined"));
- }
- // end Crockford functions
- dojo.provide("dojo.lang.extras");
- dojo.require("dojo.lang.common");
- /**
- * Sets a timeout in milliseconds to execute a function in a given context
- * with optional arguments.
- *
- * setTimeout (Object context, function func, number delay[, arg1[, ...]]);
- * setTimeout (function func, number delay[, arg1[, ...]]);
- */
- dojo.lang.setTimeout = function(func, delay){
- var context = window, argsStart = 2;
- if(!dojo.lang.isFunction(func)){
- context = func;
- func = delay;
- delay = arguments[2];
- argsStart++;
- }
- if(dojo.lang.isString(func)){
- func = context[func];
- }
-
- var args = [];
- for (var i = argsStart; i < arguments.length; i++) {
- args.push(arguments[i]);
- }
- return setTimeout(function () { func.apply(context, args); }, delay);
- }
- dojo.lang.getNameInObj = function(ns, item){
- if(!ns){ ns = dj_global; }
- for(var x in ns){
- if(ns[x] === item){
- return new String(x);
- }
- }
- return null;
- }
- dojo.lang.shallowCopy = function(obj) {
- var ret = {}, key;
- for(key in obj) {
- if(dojo.lang.isUndefined(ret[key])) {
- ret[key] = obj[key];
- }
- }
- return ret;
- }
- /**
- * Return the first argument that isn't undefined
- */
- dojo.lang.firstValued = function(/* ... */) {
- for(var i = 0; i < arguments.length; i++) {
- if(typeof arguments[i] != "undefined") {
- return arguments[i];
- }
- }
- return undefined;
- }
- /**
- * Get a value from a reference specified as a string descriptor,
- * (e.g. "A.B") in the given context.
- *
- * getObjPathValue(String objpath [, Object context, Boolean create])
- *
- * If context is not specified, dj_global is used
- * If create is true, undefined objects in the path are created.
- */
- dojo.lang.getObjPathValue = function(objpath, context, create){
- with(dojo.parseObjPath(objpath, context, create)){
- return dojo.evalProp(prop, obj, create);
- }
- }
- /**
- * Set a value on a reference specified as a string descriptor.
- * (e.g. "A.B") in the given context.
- *
- * setObjPathValue(String objpath, value [, Object context, Boolean create])
- *
- * If context is not specified, dj_global is used
- * If create is true, undefined objects in the path are created.
- */
- dojo.lang.setObjPathValue = function(objpath, value, context, create){
- if(arguments.length < 4){
- create = true;
- }
- with(dojo.parseObjPath(objpath, context, create)){
- if(obj && (create || (prop in obj))){
- obj[prop] = value;
- }
- }
- }
- dojo.provide("dojo.io.IO");
- dojo.requir…
Large files files are truncated, but you can click here to view the full file