Blame | Last modification | View Log | RSS feed
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;dojo.mixin(dojo, {_loadedModules: {},_inFlightCount: 0,_hasResource: {},// FIXME: it should be possible to pull module prefixes in from djConfig_modulePrefixes: {dojo: {name: "dojo", value: "."},doh: {name: "doh", value: "../util/doh"},tests: {name: "tests", value: "tests"}},_moduleHasPrefix: function(/*String*/module){// summary: checks to see if module has been establishedvar mp = this._modulePrefixes;return !!(mp[module] && mp[module].value); // Boolean},_getModulePrefix: function(/*String*/module){// summary: gets the prefix associated with modulevar mp = this._modulePrefixes;if(this._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});//>>excludeStart("xdomainExclude", fileName.indexOf("dojo.xd.js") != -1 && kwArgs.loader == "xdomain");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 scriptvar uri = (((relpath.charAt(0) == '/' || relpath.match(/^\w+:/))) ? "" : this.baseUrl) + relpath;if(djConfig.cacheBust && d.isBrowser){uri += "?" + String(djConfig.cacheBust).replace(/\W+/g,"");}try{return !module ? this._loadUri(uri, cb) : this._loadUriAndCheck(uri, module, cb); // Boolean}catch(e){console.debug(e);return false; // Boolean}}dojo._loadUri = function(/*String (URL)*/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 resourcesif(this._loadedUrls[uri]){return true; // Boolean}var contents = this._getText(uri, true);if(!contents){ return false; } // Booleanthis._loadedUrls[uri] = true;this._loadedUrls.push(uri);if(cb){ contents = '('+contents+')'; }var value = d["eval"](contents+"\r\n//@ sourceURL="+uri);if(cb){ cb(value); }return true; // Boolean}//>>excludeEnd("xdomainExclude");// FIXME: probably need to add logging to this methoddojo._loadUriAndCheck = function(/*String (URL)*/uri, /*String*/moduleName, /*Function?*/cb){// summary: calls loadUri then findModule and returns true if both succeedvar ok = false;try{ok = this._loadUri(uri, cb);}catch(e){console.debug("failed loading " + uri + " with error: " + e);}return Boolean(ok && this._loadedModules[moduleName]); // Boolean}dojo.loaded = function(){// summary:// signal fired when initial environment and package loading is// complete. You may use dojo.addOnLoad() or 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.this._loadNotifying = true;this._postLoad = true;var mll = this._loaders;//Clear listeners so new ones can be added//For other xdomain package loads after the initial load.this._loaders = [];for(var x=0; x<mll.length; x++){mll[x]();}this._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 && this._loaders.length > 0){d._callLoaded();}}dojo.unloaded = function(){// summary:// signal fired by impending environment destruction. You may use// dojo.addOnUnload() or dojo.connect() to this method to perform// page/application cleanup methods.var mll = this._unloaders;while(mll.length){(mll.pop())();}}dojo.addOnLoad = function(/*Object?*/obj, /*String|Function*/functionName){// summary:// Registers a function to be triggered after the DOM has finished// loading and widgets declared in markup have been instantiated.// 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.)// example:// | dojo.addOnLoad(functionPointer);// | dojo.addOnLoad(object, "functionName");if(arguments.length == 1){d._loaders.push(obj);}else if(arguments.length > 1){d._loaders.push(function(){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();}}dojo.addOnUnload = function(/*Object?*/obj, /*String|Function?*/functionName){// summary: registers a function to be triggered when the page unloads// example:// | dojo.addOnUnload(functionPointer)// | dojo.addOnUnload(object, "functionName")if(arguments.length == 1){d._unloaders.push(obj);}else if(arguments.length > 1){d._unloaders.push(function(){obj[functionName]();});}}dojo._modulesLoaded = function(){if(d._postLoad){ return; }if(d._inFlightCount > 0){console.debug("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" || (djConfig["useXDomain"] && d.isOpera)){setTimeout("dojo.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 treevar syms = modulename.split(".");for(var i = syms.length; i>0; i--){var parentModule = syms.slice(0, i).join(".");if((i==1) && !this._moduleHasPrefix(parentModule)){// Support default module directory (sibling of dojo) for top-level modulessyms[0] = "../" + syms[0];}else{var parentModulePath = this._getModulePrefix(parentModule);if(parentModulePath != parentModule){syms.splice(0, i, parentModulePath);break;}}}// console.debug(syms);return syms; // Array}dojo._global_omit_module_check = false;dojo._loadModule = dojo.require = function(/*String*/moduleName, /*Boolean?*/omitModuleCheck){// summary:// loads a Javascript module from the appropriate URI// moduleName: String// omitModuleCheck: Boolean?// description:// _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.//// 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._loadModule("A.B")) {// | ...// | }//// And to import just the leaf symbol://// | var B = dojo._loadModule("A.B");// | ...// returns: the required namespace objectomitModuleCheck = this._global_omit_module_check || omitModuleCheck;var module = this._loadedModules[moduleName];if(module){return module;}// convert periods to slashesvar relpath = this._getModuleSymbols(moduleName).join("/") + '.js';var modArg = (!omitModuleCheck) ? moduleName : null;var ok = this._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)&&(!this["_isXDomain"])){// pass in false so we can give better errormodule = this._loadedModules[moduleName];if(!module){throw new Error("symbol '" + moduleName + "' is not defined after loading '" + relpath + "'");}}return module;}dojo.provide = function(/*String*/ resourceName){// summary:// Each javascript source file must have (exactly) 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"); at the// top of the file.// 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.//// 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("dojo.io.cometd"), in addition to registering that// cometd.js is a resource for the dojo.iomodule, will ensure that// the dojo.io javascript object exists, so that calls like// dojo.io.foo = function(){ ... } don't fail.//// In the case of a build (or in the future, a rollup), where multiple// javascript source files are combined into one bigger file (similar// to a .lib or .jar file), that file will contain multiple// dojo.provide() calls, to note that it includes multiple resources.//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 containing Arrays*/modMap){// description:// This method taks 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 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.platformRequire({// | // an example that passes multiple args to _loadModule()// | browser: [// | ["foo.bar.baz", true, true],// | "foo.sample",// | "foo.test,// | ],// | default: [ "foo.sample.*" ],// | common: [ "really.important.module.*" ]// | });// FIXME: dojo.name_ no longer works!!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// resourceif(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.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.// 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// 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.// 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. For 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// ...//// 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.d.require("dojo.i18n");d.i18n._requireLocalization.apply(d.hostenv, arguments);};var ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$");var 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;// TODO: support for IPv6, see RFC 2732var _a = arguments;var uri = _a[0];// resolve uri components relative to each otherfor(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=3537var relobj = new d._Url(_a[i]+"");var uriobj = new d._Url(uri+"");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] == "."){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] != ".."){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 += relobj.scheme + ":";}if(relobj.authority){uri += "//" + relobj.authority;}uri += relobj.path;if(relobj.query){uri += "?" + relobj.query;}if(relobj.fragment){uri += "#" + relobj.fragment;}}this.uri = uri.toString();// break the uri into its main componentsvar 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 undefinedthis.query = r[7] || (r[6] ? "" : n);this.fragment = r[9] || (r[8] ? "" : n);if(this.authority != n){// server based naming authorityr = this.authority.match(ire);this.user = r[3] || n;this.password = r[4] || n;this.host = r[5];this.port = r[7] || n;}}dojo._Url.prototype.toString = function(){ return this.uri; };dojo.moduleUrl = function(/*String*/module, /*dojo._Url||String*/url){// summary:// Returns a Url object relative to a module//// example:// | dojo.moduleUrl("dojo.widget","templates/template.html");// example:// | dojo.moduleUrl("acme","images/small.png")var loc = dojo._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); // String}})();}