From 0181c0110985cfd2659e81c8cc1ef5a2f73bc697 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 14 Aug 2012 19:04:32 +0400 Subject: dojo: remove uncompressed files --- lib/dojo/dojo.js.uncompressed.js | 14179 ------------------------------------- 1 file changed, 14179 deletions(-) delete mode 100644 lib/dojo/dojo.js.uncompressed.js (limited to 'lib/dojo/dojo.js.uncompressed.js') diff --git a/lib/dojo/dojo.js.uncompressed.js b/lib/dojo/dojo.js.uncompressed.js deleted file mode 100644 index 69b3d2e5e..000000000 --- a/lib/dojo/dojo.js.uncompressed.js +++ /dev/null @@ -1,14179 +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 -*/ - -/* - This is an optimized version of Dojo, built for deployment and not for - development. To get sources and documentation, please visit: - - http://dojotoolkit.org -*/ - -(function( - userConfig, - defaultConfig -){ - // summary: - // This is the "source loader" and is the entry point for Dojo during development. You may also load Dojo with - // any AMD-compliant loader via the package main module dojo/main. - // description: - // This is the "source loader" for Dojo. It provides an AMD-compliant loader that can be configured - // to operate in either synchronous or asynchronous modes. After the loader is defined, dojo is loaded - // IAW the package main module dojo/main. In the event you wish to use a foreign loader, you may load dojo as a package - // via the package main module dojo/main and this loader is not required; see dojo/package.json for details. - // - // In order to keep compatibility with the v1.x line, this loader includes additional machinery that enables - // the dojo.provide, dojo.require et al API. This machinery is loaded by default, but may be dynamically removed - // via the has.js API and statically removed via the build system. - // - // This loader includes sniffing machinery to determine the environment; the following environments are supported: - // - // * browser - // * node.js - // * rhino - // - // This is the so-called "source loader". As such, it includes many optional features that may be discadred by - // building a customized verion with the build system. - - // Design and Implementation Notes - // - // This is a dojo-specific adaption of bdLoad, donated to the dojo foundation by Altoviso LLC. - // - // This function defines an AMD-compliant (http://wiki.commonjs.org/wiki/Modules/AsynchronousDefinition) - // loader that can be configured to operate in either synchronous or asynchronous modes. - // - // Since this machinery implements a loader, it does not have the luxury of using a load system and/or - // leveraging a utility library. This results in an unpleasantly long file; here is a road map of the contents: - // - // 1. Small library for use implementing the loader. - // 2. Define the has.js API; this is used throughout the loader to bracket features. - // 3. Define the node.js and rhino sniffs and sniff. - // 4. Define the loader's data. - // 5. Define the configuration machinery. - // 6. Define the script element sniffing machinery and sniff for configuration data. - // 7. Configure the loader IAW the provided user, default, and sniffing data. - // 8. Define the global require function. - // 9. Define the module resolution machinery. - // 10. Define the module and plugin module definition machinery - // 11. Define the script injection machinery. - // 12. Define the window load detection. - // 13. Define the logging API. - // 14. Define the tracing API. - // 16. Define the AMD define function. - // 17. Define the dojo v1.x provide/require machinery--so called "legacy" modes. - // 18. Publish global variables. - // - // Language and Acronyms and Idioms - // - // moduleId: a CJS module identifier, (used for public APIs) - // mid: moduleId (used internally) - // packageId: a package identifier (used for public APIs) - // pid: packageId (used internally); the implied system or default package has pid==="" - // pack: package is used internally to reference a package object (since javascript has reserved words including "package") - // prid: plugin resource identifier - // The integer constant 1 is used in place of true and 0 in place of false. - - // define a minimal library to help build the loader - var noop = function(){ - }, - - isEmpty = function(it){ - for(var p in it){ - return 0; - } - return 1; - }, - - toString = {}.toString, - - isFunction = function(it){ - return toString.call(it) == "[object Function]"; - }, - - isString = function(it){ - return toString.call(it) == "[object String]"; - }, - - isArray = function(it){ - return toString.call(it) == "[object Array]"; - }, - - forEach = function(vector, callback){ - if(vector){ - for(var i = 0; i < vector.length;){ - callback(vector[i++]); - } - } - }, - - mix = function(dest, src){ - for(var p in src){ - dest[p] = src[p]; - } - return dest; - }, - - makeError = function(error, info){ - return mix(new Error(error), {src:"dojoLoader", info:info}); - }, - - uidSeed = 1, - - uid = function(){ - // Returns a unique indentifier (within the lifetime of the document) of the form /_d+/. - return "_" + uidSeed++; - }, - - // FIXME: how to doc window.require() api - - // this will be the global require function; define it immediately so we can start hanging things off of it - req = function( - config, //(object, optional) hash of configuration properties - dependencies, //(array of commonjs.moduleId, optional) list of modules to be loaded before applying callback - callback //(function, optional) lamda expression to apply to module values implied by dependencies - ){ - return contextRequire(config, dependencies, callback, 0, req); - }, - - // the loader uses the has.js API to control feature inclusion/exclusion; define then use throughout - global = this, - - doc = global.document, - - element = doc && doc.createElement("DiV"), - - has = req.has = function(name){ - return isFunction(hasCache[name]) ? (hasCache[name] = hasCache[name](global, doc, element)) : hasCache[name]; - }, - - hasCache = has.cache = defaultConfig.hasCache; - - has.add = function(name, test, now, force){ - (hasCache[name]===undefined || force) && (hasCache[name] = test); - return now && has(name); - }; - - false && has.add("host-node", userConfig.has && "host-node" in userConfig.has ? - userConfig.has["host-node"] : - (typeof process == "object" && process.versions && process.versions.node && process.versions.v8)); - if(0){ - // fixup the default config for node.js environment - require("./_base/configNode.js").config(defaultConfig); - // remember node's require (with respect to baseUrl==dojo's root) - defaultConfig.loaderPatch.nodeRequire = require; - } - - false && has.add("host-rhino", userConfig.has && "host-rhino" in userConfig.has ? - userConfig.has["host-rhino"] : - (typeof load == "function" && (typeof Packages == "function" || typeof Packages == "object"))); - if(0){ - // owing to rhino's lame feature that hides the source of the script, give the user a way to specify the baseUrl... - for(var baseUrl = userConfig.baseUrl || ".", arg, rhinoArgs = this.arguments, i = 0; i < rhinoArgs.length;){ - arg = (rhinoArgs[i++] + "").split("="); - if(arg[0] == "baseUrl"){ - baseUrl = arg[1]; - break; - } - } - load(baseUrl + "/_base/configRhino.js"); - rhinoDojoConfig(defaultConfig, baseUrl, rhinoArgs); - } - - // userConfig has tests override defaultConfig has tests; do this after the environment detection because - // the environment detection usually sets some has feature values in the hasCache. - for(var p in userConfig.has){ - has.add(p, userConfig.has[p], 0, 1); - } - - // - // define the loader data - // - - // the loader will use these like symbols if the loader has the traceApi; otherwise - // define magic numbers so that modules can be provided as part of defaultConfig - var requested = 1, - arrived = 2, - nonmodule = 3, - executing = 4, - executed = 5; - - if(0){ - // these make debugging nice; but using strings for symbols is a gross rookie error; don't do it for production code - requested = "requested"; - arrived = "arrived"; - nonmodule = "not-a-module"; - executing = "executing"; - executed = "executed"; - } - - var legacyMode = 0, - sync = "sync", - xd = "xd", - syncExecStack = [], - dojoRequirePlugin = 0, - checkDojoRequirePlugin = noop, - transformToAmd = noop, - getXhr; - if(1){ - req.isXdUrl = noop; - - req.initSyncLoader = function(dojoRequirePlugin_, checkDojoRequirePlugin_, transformToAmd_){ - if(!dojoRequirePlugin){ - dojoRequirePlugin = dojoRequirePlugin_; - checkDojoRequirePlugin = checkDojoRequirePlugin_; - transformToAmd = transformToAmd_; - } - return { - sync:sync, - xd:xd, - arrived:arrived, - nonmodule:nonmodule, - executing:executing, - executed:executed, - syncExecStack:syncExecStack, - modules:modules, - execQ:execQ, - getModule:getModule, - injectModule:injectModule, - setArrived:setArrived, - signal:signal, - finishExec:finishExec, - execModule:execModule, - dojoRequirePlugin:dojoRequirePlugin, - getLegacyMode:function(){return legacyMode;}, - holdIdle:function(){checkCompleteGuard++;}, - releaseIdle:function(){checkIdle();} - }; - }; - - if(1){ - // in legacy sync mode, the loader needs a minimal XHR library to load dojo/_base/loader and dojo/_base/xhr - - var locationProtocol = location.protocol, - locationHost = location.host, - fileProtocol = !locationHost; - req.isXdUrl = function(url){ - if(fileProtocol || /^\./.test(url)){ - // begins with a dot is always relative to page URL; therefore not xdomain - return false; - } - if(/^\/\//.test(url)){ - // for v1.6- backcompat, url starting with // indicates xdomain - return true; - } - // get protocol and host - var match = url.match(/^([^\/\:]+\:)\/\/([^\/]+)/); - return match && (match[1] != locationProtocol || match[2] != locationHost); - }; - - // note: to get the file:// protocol to work in FF, you must set security.fileuri.strict_origin_policy to false in about:config - true || has.add("dojo-xhr-factory", 1); - has.add("dojo-force-activex-xhr", 1 && !doc.addEventListener && window.location.protocol == "file:"); - has.add("native-xhr", typeof XMLHttpRequest != "undefined"); - if(has("native-xhr") && !has("dojo-force-activex-xhr")){ - getXhr = function(){ - return new XMLHttpRequest(); - }; - }else{ - // if in the browser an old IE; find an xhr - 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 - } - } - getXhr = function(){ - return new ActiveXObject(progid); - }; - } - req.getXhr = getXhr; - - has.add("dojo-gettext-api", 1); - req.getText = function(url, async, onLoad){ - var xhr = getXhr(); - xhr.open('GET', fixupUrl(url), false); - xhr.send(null); - if(xhr.status == 200 || (!location.host && !xhr.status)){ - if(onLoad){ - onLoad(xhr.responseText, async); - } - }else{ - throw makeError("xhrFailed", xhr.status); - } - return xhr.responseText; - }; - } - }else{ - req.async = 1; - } - - // - // loader eval - // - var eval_ = - // use the function constructor so our eval is scoped close to (but not in) in the global space with minimal pollution - new Function('return eval(arguments[0]);'); - - req.eval = - function(text, hint){ - return eval_(text + "\r\n////@ sourceURL=" + hint); - }; - - // - // loader micro events API - // - var listenerQueues = {}, - error = "error", - signal = req.signal = function(type, args){ - var queue = listenerQueues[type]; - // notice we run a copy of the queue; this allows listeners to add/remove - // other listeners without affecting this particular signal - forEach(queue && queue.slice(0), function(listener){ - listener.apply(null, isArray(args) ? args : [args]); - }); - }, - on = req.on = function(type, listener){ - // notice a queue is not created until a client actually connects - var queue = listenerQueues[type] || (listenerQueues[type] = []); - queue.push(listener); - return { - remove:function(){ - for(var i = 0; i (alias, actual) - = [], - - paths - // CommonJS paths - = {}, - - pathsMapProg - // list of (from-path, to-path, regex, length) derived from paths; - // a "program" to apply paths; see computeMapProg - = [], - - packs - // a map from packageId to package configuration object; see fixupPackageInfo - = {}, - - packageMap - // map from package name to local-installed package name - = {}, - - packageMapProg - // list of (from-package, to-package, regex, length) derived from packageMap; - // a "program" to apply paths; see computeMapProg - = [], - - modules - // A hash:(mid) --> (module-object) the module namespace - // - // pid: the package identifier to which the module belongs (e.g., "dojo"); "" indicates the system or default package - // mid: the fully-resolved (i.e., mappings have been applied) module identifier without the package identifier (e.g., "dojo/io/script") - // url: the URL from which the module was retrieved - // pack: the package object of the package to which the module belongs - // executed: 0 => not executed; executing => in the process of tranversing deps and running factory; executed => factory has been executed - // deps: the dependency vector for this module (vector of modules objects) - // def: the factory for this module - // result: the result of the running the factory for this module - // injected: (requested | arrived | nonmodule) the status of the module; nonmodule means the resource did not call define - // load: plugin load function; applicable only for plugins - // - // Modules go through several phases in creation: - // - // 1. Requested: some other module's definition or a require application contained the requested module in - // its dependency vector or executing code explicitly demands a module via req.require. - // - // 2. Injected: a script element has been appended to the insert-point element demanding the resource implied by the URL - // - // 3. Loaded: the resource injected in [2] has been evalated. - // - // 4. Defined: the resource contained a define statement that advised the loader about the module. Notice that some - // resources may just contain a bundle of code and never formally define a module via define - // - // 5. Evaluated: the module was defined via define and the loader has evaluated the factory and computed a result. - = {}, - - cacheBust - // query string to append to module URLs to bust browser cache - = "", - - cache - // hash:(mid)-->(function) - // - // Gives the contents of a cached resource; function should cause the same actions as if the given mid was downloaded - // and evaluated by the host environment - = {}, - - pendingCacheInsert - // hash:(mid)-->(function) - // - // Gives a set of cache modules pending entry into cache. When cached modules are published to the loader, they are - // entered into pendingCacheInsert; modules are then pressed into cache upon (1) AMD define or (2) upon receiving another - // independent set of cached modules. (1) is the usual case, and this case allows normalizing mids given in the pending - // cache for the local configuration, possibly relocating modules. - = {}, - - dojoSniffConfig - // map of configuration variables - // give the data-dojo-config as sniffed from the document (if any) - = {}; - - if(1){ - var consumePendingCacheInsert = function(referenceModule){ - var p, item, match, now; - for(p in pendingCacheInsert){ - item = pendingCacheInsert[p]; - match = p.match(/^url\:(.+)/); - if(match){ - cache[toUrl(match[1], referenceModule)] = item; - }else if(p=="*now"){ - now = item; - }else if(p!="*noref"){ - cache[getModuleInfo(p, referenceModule).mid] = item; - } - } - if(now){ - now(createRequire(referenceModule)); - } - pendingCacheInsert = {}; - }, - - computeMapProg = function(map, dest, packName){ - // This routine takes a map target-prefix(string)-->replacement(string) into a vector - // of quads (target-prefix, replacement, regex-for-target-prefix, length-of-target-prefix) - // - // The loader contains processes that map one string prefix to another. These - // are encountered when applying the requirejs paths configuration and when mapping - // package names. We can make the mapping and any replacement easier and faster by - // replacing the map with a vector of quads and then using this structure in the simple machine runMapProg. - dest.splice(0, dest.length); - var p, i, item, reverseName = 0; - for(p in map){ - dest.push([p, map[p]]); - if(map[p]==packName){ - reverseName = p; - } - } - dest.sort(function(lhs, rhs){ - return rhs[0].length - lhs[0].length; - }); - for(i = 0; i < dest.length;){ - item = dest[i++]; - item[2] = new RegExp("^" + item[0].replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, function(c){ return "\\" + c; }) + "(\/|$)"); - item[3] = item[0].length + 1; - } - return reverseName; - }, - - fixupPackageInfo = function(packageInfo, baseUrl){ - // calculate the precise (name, baseUrl, main, mappings) for a package - var name = packageInfo.name; - if(!name){ - // packageInfo must be a string that gives the name - name = packageInfo; - packageInfo = {name:name}; - } - packageInfo = mix({main:"main", mapProg:[]}, packageInfo); - packageInfo.location = (baseUrl || "") + (packageInfo.location ? packageInfo.location : name); - packageInfo.reverseName = computeMapProg(packageInfo.packageMap, packageInfo.mapProg, name); - - if(!packageInfo.main.indexOf("./")){ - packageInfo.main = packageInfo.main.substring(2); - } - - // allow paths to be specified in the package info - // TODO: this is not supported; remove - mix(paths, packageInfo.paths); - - // now that we've got a fully-resolved package object, push it into the configuration - packs[name] = packageInfo; - packageMap[name] = name; - }, - - config = function(config, booting){ - for(var p in config){ - if(p=="waitSeconds"){ - req.waitms = (config[p] || 0) * 1000; - } - if(p=="cacheBust"){ - cacheBust = config[p] ? (isString(config[p]) ? config[p] : (new Date()).getTime() + "") : ""; - } - if(p=="baseUrl" || p=="combo"){ - req[p] = config[p]; - } - if(1 && p=="async"){ - // falsy or "sync" => legacy sync loader - // "xd" => sync but loading xdomain tree and therefore loading asynchronously (not configurable, set automatically by the loader) - // "legacyAsync" => permanently in "xd" by choice - // "debugAtAllCosts" => trying to load everything via script injection (not implemented) - // otherwise, must be truthy => AMD - // legacyMode: sync | legacyAsync | xd | false - var mode = config[p]; - req.legacyMode = legacyMode = (isString(mode) && /sync|legacyAsync/.test(mode) ? mode : (!mode ? "sync" : false)); - req.async = !legacyMode; - } - if(config[p]!==hasCache){ - // accumulate raw config info for client apps which can use this to pass their own config - req.rawConfig[p] = config[p]; - p!="has" && has.add("config-"+p, config[p], 0, booting); - } - } - - // make sure baseUrl exists - if(!req.baseUrl){ - req.baseUrl = "./"; - } - // make sure baseUrl ends with a slash - if(!/\/$/.test(req.baseUrl)){ - req.baseUrl += "/"; - } - - // now do the special work for has, packages, packagePaths, paths, aliases, and cache - - for(p in config.has){ - has.add(p, config.has[p], 0, booting); - } - - // for each package found in any packages config item, augment the packs map owned by the loader - forEach(config.packages, fixupPackageInfo); - - // for each packagePath found in any packagePaths config item, augment the packs map owned by the loader - for(baseUrl in config.packagePaths){ - forEach(config.packagePaths[baseUrl], function(packageInfo){ - fixupPackageInfo(packageInfo, baseUrl + "/"); - }); - } - - // push in any paths and recompute the internal pathmap - // warning: this cann't be done until the package config is processed since packages may include path info - computeMapProg(mix(paths, config.paths), pathsMapProg); - - // aliases - forEach(config.aliases, function(pair){ - if(isString(pair[0])){ - pair[0] = new RegExp("^" + pair[0].replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, function(c){return "\\" + c;}) + "$"); - } - aliases.push(pair); - }); - - // mix any packageMap config item and recompute the internal packageMapProg - computeMapProg(mix(packageMap, config.packageMap), packageMapProg); - - // push in any new cache values - if(config.cache){ - consumePendingCacheInsert(); - pendingCacheInsert = config.cache; - if(config.cache["*noref"]){ - consumePendingCacheInsert(); - } - } - - signal("config", [config, req.rawConfig]); - }; - - // - // execute the various sniffs - // - - if(has("dojo-cdn") || 1){ - for(var dojoDir, src, match, scripts = doc.getElementsByTagName("script"), i = 0; i < scripts.length && !match; i++){ - if((src = scripts[i].getAttribute("src")) && (match = src.match(/(.*)\/?dojo\.js(\W|$)/i))){ - // if baseUrl wasn't explicitly set, set it here to the dojo directory; this is the 1.6- behavior - userConfig.baseUrl = dojoDir = userConfig.baseUrl || defaultConfig.baseUrl || match[1]; - - // see if there's a dojo configuration stuffed into the node - src = (scripts[i].getAttribute("data-dojo-config") || scripts[i].getAttribute("djConfig")); - if(src){ - dojoSniffConfig = req.eval("({ " + src + " })", "data-dojo-config"); - } - if(0){ - var dataMain = scripts[i].getAttribute("data-main"); - if(dataMain){ - dojoSniffConfig.deps = dojoSniffConfig.deps || [dataMain]; - } - } - } - } - } - - if(0){ - // pass down doh.testConfig from parent as if it were a data-dojo-config - try{ - if(window.parent != window && window.parent.require){ - var doh = window.parent.require("doh"); - doh && mix(dojoSniffConfig, doh.testConfig); - } - }catch(e){} - } - - // configure the loader; let the user override defaults - req.rawConfig = {}; - config(defaultConfig, 1); - config(userConfig, 1); - config(dojoSniffConfig, 1); - - if(has("dojo-cdn")){ - packs.dojo.location = dojoDir; - packs.dijit.location = dojoDir + "../dijit/"; - packs.dojox.location = dojoDir + "../dojox/"; - } - - }else{ - // no config API, assume defaultConfig has everything the loader needs...for the entire lifetime of the application - paths = defaultConfig.paths; - pathsMapProg = defaultConfig.pathsMapProg; - packs = defaultConfig.packs; - aliases = defaultConfig.aliases; - packageMap = defaultConfig.packageMap; - packageMapProg = defaultConfig.packageMapProg; - modules = defaultConfig.modules; - cache = defaultConfig.cache; - cacheBust = defaultConfig.cacheBust; - - // remember the default config for other processes (e.g., dojo/config) - req.rawConfig = defaultConfig; - } - - - if(0){ - req.combo = req.combo || {add:noop}; - var comboPending = 0, - combosPending = [], - comboPendingTimer = null; - } - - - // build the loader machinery iaw configuration, including has feature tests - var injectDependencies = function(module){ - // checkComplete!=0 holds the idle signal; we're not idle if we're injecting dependencies - checkCompleteGuard++; - forEach(module.deps, injectModule); - if(0 && comboPending && !comboPendingTimer){ - comboPendingTimer = setTimeout(function() { - comboPending = 0; - comboPendingTimer = null; - req.combo.done(function(mids, url) { - var onLoadCallback= function(){ - // defQ is a vector of module definitions 1-to-1, onto mids - runDefQ(0, mids); - checkComplete(); - }; - combosPending.push(mids); - injectingModule = mids; - req.injectUrl(url, onLoadCallback, mids); - injectingModule = 0; - }, req); - }, 0); - } - checkIdle(); - }, - - contextRequire = function(a1, a2, a3, referenceModule, contextRequire){ - var module, syntheticMid; - if(isString(a1)){ - // signature is (moduleId) - module = getModule(a1, referenceModule, true); - if(module && module.executed){ - return module.result; - } - throw makeError("undefinedModule", a1); - } - if(!isArray(a1)){ - // a1 is a configuration - config(a1); - - // juggle args; (a2, a3) may be (dependencies, callback) - a1 = a2; - a2 = a3; - } - if(isArray(a1)){ - // signature is (requestList [,callback]) - if(!a1.length){ - a2 && a2(); - }else{ - syntheticMid = "require*" + uid(); - - // resolve the request list with respect to the reference module - for(var mid, deps = [], i = 0; i < a1.length;){ - mid = a1[i++]; - if(mid in {exports:1, module:1}){ - throw makeError("illegalModuleId", mid); - } - deps.push(getModule(mid, referenceModule)); - } - - // construct a synthetic module to control execution of the requestList, and, optionally, callback - module = mix(makeModuleInfo("", syntheticMid, 0, ""), { - injected: arrived, - deps: deps, - def: a2 || noop, - require: referenceModule ? referenceModule.require : req - }); - modules[module.mid] = module; - - // checkComplete!=0 holds the idle signal; we're not idle if we're injecting dependencies - injectDependencies(module); - - // try to immediately execute - // if already traversing a factory tree, then strict causes circular dependency to abort the execution; maybe - // it's possible to execute this require later after the current traversal completes and avoid the circular dependency. - // ...but *always* insist on immediate in synch mode - var strict = checkCompleteGuard && req.async; - checkCompleteGuard++; - execModule(module, strict); - checkIdle(); - if(!module.executed){ - // some deps weren't on board or circular dependency detected and strict; therefore, push into the execQ - execQ.push(module); - } - checkComplete(); - } - } - return contextRequire; - }, - - createRequire = function(module){ - if(!module){ - return req; - } - var result = module.require; - if(!result){ - result = function(a1, a2, a3){ - return contextRequire(a1, a2, a3, module, result); - }; - module.require = mix(result, req); - result.module = module; - result.toUrl = function(name){ - return toUrl(name, module); - }; - result.toAbsMid = function(mid){ - return toAbsMid(mid, module); - }; - if(0){ - result.undef = function(mid){ - req.undef(mid, module); - }; - } - if(1){ - result.syncLoadNls = function(mid){ - var nlsModuleInfo = getModuleInfo(mid, module), - nlsModule = modules[nlsModuleInfo.mid]; - if(!nlsModule || !nlsModule.executed){ - cached = cache[nlsModuleInfo.mid] || cache[nlsModuleInfo.cacheId]; - if(cached){ - evalModuleText(cached); - nlsModule = modules[nlsModuleInfo.mid]; - } - } - return nlsModule && nlsModule.executed && nlsModule.result; - }; - } - - } - return result; - }, - - execQ = - // The list of modules that need to be evaluated. - [], - - defQ = - // The queue of define arguments sent to loader. - [], - - waiting = - // The set of modules upon which the loader is waiting for definition to arrive - {}, - - setRequested = function(module){ - module.injected = requested; - waiting[module.mid] = 1; - if(module.url){ - waiting[module.url] = module.pack || 1; - } - }, - - setArrived = function(module){ - module.injected = arrived; - delete waiting[module.mid]; - if(module.url){ - delete waiting[module.url]; - } - if(isEmpty(waiting)){ - clearTimer(); - 1 && legacyMode==xd && (legacyMode = sync); - } - }, - - execComplete = req.idle = - // says the loader has completed (or not) its work - function(){ - return !defQ.length && isEmpty(waiting) && !execQ.length && !checkCompleteGuard; - }, - - runMapProg = function(targetMid, map){ - // search for targetMid in map; return the map item if found; falsy otherwise - for(var i = 0; i < map.length; i++){ - if(map[i][2].test(targetMid)){ - return map[i]; - } - } - return 0; - }, - - compactPath = function(path){ - var result = [], - segment, lastSegment; - path = path.replace(/\\/g, '/').split('/'); - while(path.length){ - segment = path.shift(); - if(segment==".." && result.length && lastSegment!=".."){ - result.pop(); - lastSegment = result[result.length - 1]; - }else if(segment!="."){ - result.push(lastSegment= segment); - } // else ignore "." - } - return result.join("/"); - }, - - makeModuleInfo = function(pid, mid, pack, url, cacheId){ - if(1){ - var xd= req.isXdUrl(url); - return {pid:pid, mid:mid, pack:pack, url:url, executed:0, def:0, isXd:xd, isAmd:!!(xd || (packs[pid] && packs[pid].isAmd)), cacheId:cacheId}; - }else{ - return {pid:pid, mid:mid, pack:pack, url:url, executed:0, def:0, cacheId:cacheId}; - } - }, - - getModuleInfo_ = function(mid, referenceModule, packs, modules, baseUrl, packageMapProg, pathsMapProg, alwaysCreate){ - // arguments are passed instead of using lexical variables so that this function my be used independent of the loader (e.g., the builder) - // alwaysCreate is useful in this case so that getModuleInfo never returns references to real modules owned by the loader - var pid, pack, midInPackage, mapProg, mapItem, path, url, result, isRelative, requestedMid, cacheId=0; - requestedMid = mid; - isRelative = /^\./.test(mid); - if(/(^\/)|(\:)|(\.js$)/.test(mid) || (isRelative && !referenceModule)){ - // absolute path or protocol of .js filetype, or relative path but no reference module and therefore relative to page - // whatever it is, it's not a module but just a URL of some sort - return makeModuleInfo(0, mid, 0, mid); - }else{ - // relative module ids are relative to the referenceModule; get rid of any dots - mid = compactPath(isRelative ? (referenceModule.mid + "/../" + mid) : mid); - if(/^\./.test(mid)){ - throw makeError("irrationalPath", mid); - } - // find the package indicated by the mid, if any - mapProg = referenceModule && referenceModule.pack && referenceModule.pack.mapProg; - mapItem = (mapProg && runMapProg(mid, mapProg)) || runMapProg(mid, packageMapProg); - if(mapItem){ - // mid specified a module that's a member of a package; figure out the package id and module id - // notice we expect pack.main to be valid with no pre or post slash - pid = mapItem[1]; - mid = mid.substring(mapItem[3]); - pack = packs[pid]; - if(!mid){ - mid= pack.main; - } - midInPackage = mid; - cacheId = pack.reverseName + "/" + mid; - mid = pid + "/" + mid; - }else{ - pid = ""; - } - - // search aliases - var candidateLength = 0, - candidate = 0; - forEach(aliases, function(pair){ - var match = mid.match(pair[0]); - if(match && match.length>candidateLength){ - candidate = isFunction(pair[1]) ? mid.replace(pair[0], pair[1]) : pair[1]; - } - }); - if(candidate){ - return getModuleInfo_(candidate, 0, packs, modules, baseUrl, packageMapProg, pathsMapProg, alwaysCreate); - } - - result = modules[mid]; - if(result){ - return alwaysCreate ? makeModuleInfo(result.pid, result.mid, result.pack, result.url, cacheId) : modules[mid]; - } - } - // get here iff the sought-after module does not yet exist; therefore, we need to compute the URL given the - // fully resolved (i.e., all relative indicators and package mapping resolved) module id - - mapItem = runMapProg(mid, pathsMapProg); - if(mapItem){ - url = mapItem[1] + mid.substring(mapItem[3] - 1); - }else if(pid){ - url = pack.location + "/" + midInPackage; - }else if(has("config-tlmSiblingOfDojo")){ - url = "../" + mid; - }else{ - url = mid; - } - // if result is not absolute, add baseUrl - if(!(/(^\/)|(\:)/.test(url))){ - url = baseUrl + url; - } - url += ".js"; - return makeModuleInfo(pid, mid, pack, compactPath(url), cacheId); - }, - - getModuleInfo = function(mid, referenceModule){ - return getModuleInfo_(mid, referenceModule, packs, modules, req.baseUrl, packageMapProg, pathsMapProg); - }, - - resolvePluginResourceId = function(plugin, prid, referenceModule){ - return plugin.normalize ? plugin.normalize(prid, function(mid){return toAbsMid(mid, referenceModule);}) : toAbsMid(prid, referenceModule); - }, - - dynamicPluginUidGenerator = 0, - - getModule = function(mid, referenceModule, immediate){ - // compute and optionally construct (if necessary) the module implied by the mid with respect to referenceModule - var match, plugin, prid, result; - match = mid.match(/^(.+?)\!(.*)$/); - if(match){ - // name was ! - plugin = getModule(match[1], referenceModule, immediate); - - if(1 && legacyMode == sync && !plugin.executed){ - injectModule(plugin); - if(plugin.injected===arrived && !plugin.executed){ - checkCompleteGuard++; - execModule(plugin); - checkIdle(); - } - if(plugin.executed){ - promoteModuleToPlugin(plugin); - }else{ - // we are in xdomain mode for some reason - execQ.unshift(plugin); - } - } - - - - if(plugin.executed === executed && !plugin.load){ - // executed the module not knowing it was a plugin - promoteModuleToPlugin(plugin); - } - - // if the plugin has not been loaded, then can't resolve the prid and must assume this plugin is dynamic until we find out otherwise - if(plugin.load){ - prid = resolvePluginResourceId(plugin, match[2], referenceModule); - mid = (plugin.mid + "!" + (plugin.dynamic ? ++dynamicPluginUidGenerator + "!" : "") + prid); - }else{ - prid = match[2]; - mid = plugin.mid + "!" + (++dynamicPluginUidGenerator) + "!waitingForPlugin"; - } - result = {plugin:plugin, mid:mid, req:createRequire(referenceModule), prid:prid}; - }else{ - result = getModuleInfo(mid, referenceModule); - } - return modules[result.mid] || (!immediate && (modules[result.mid] = result)); - }, - - toAbsMid = req.toAbsMid = function(mid, referenceModule){ - return getModuleInfo(mid, referenceModule).mid; - }, - - toUrl = req.toUrl = function(name, referenceModule){ - var moduleInfo = getModuleInfo(name+"/x", referenceModule), - url = moduleInfo.url; - return fixupUrl(moduleInfo.pid===0 ? - // if pid===0, then name had a protocol or absolute path; either way, toUrl is the identify function in such cases - name : - // "/x.js" since getModuleInfo automatically appends ".js" and we appended "/x" to make name look likde a module id - url.substring(0, url.length-5) - ); - }, - - nonModuleProps = { - injected: arrived, - executed: executed, - def: nonmodule, - result: nonmodule - }, - - makeCjs = function(mid){ - return modules[mid] = mix({mid:mid}, nonModuleProps); - }, - - cjsRequireModule = makeCjs("require"), - cjsExportsModule = makeCjs("exports"), - cjsModuleModule = makeCjs("module"), - - runFactory = function(module, args){ - req.trace("loader-run-factory", [module.mid]); - var factory = module.def, - result; - 1 && syncExecStack.unshift(module); - if(has("config-dojo-loader-catches")){ - try{ - result= isFunction(factory) ? factory.apply(null, args) : factory; - }catch(e){ - signal(error, module.result = makeError("factoryThrew", [module, e])); - } - }else{ - result= isFunction(factory) ? factory.apply(null, args) : factory; - } - module.result = result===undefined && module.cjs ? module.cjs.exports : result; - 1 && syncExecStack.shift(module); - }, - - abortExec = {}, - - defOrder = 0, - - promoteModuleToPlugin = function(pluginModule){ - var plugin = pluginModule.result; - pluginModule.dynamic = plugin.dynamic; - pluginModule.normalize = plugin.normalize; - pluginModule.load = plugin.load; - return pluginModule; - }, - - resolvePluginLoadQ = function(plugin){ - // plugins is a newly executed module that has a loadQ waiting to run - - // step 1: traverse the loadQ and fixup the mid and prid; remember the map from original mid to new mid - // recall the original mid was created before the plugin was on board and therefore it was impossible to - // compute the final mid; accordingly, prid may or may not change, but the mid will definitely change - var map = {}; - forEach(plugin.loadQ, function(pseudoPluginResource){ - // manufacture and insert the real module in modules - var pseudoMid = pseudoPluginResource.mid, - prid = resolvePluginResourceId(plugin, pseudoPluginResource.prid, pseudoPluginResource.req.module), - mid = plugin.dynamic ? pseudoPluginResource.mid.replace(/waitingForPlugin$/, prid) : (plugin.mid + "!" + prid), - pluginResource = mix(mix({}, pseudoPluginResource), {mid:mid, prid:prid, injected:0}); - if(!modules[mid]){ - // create a new (the real) plugin resource and inject it normally now that the plugin is on board - injectPlugin(modules[mid] = pluginResource); - } // else this was a duplicate request for the same (plugin, rid) for a nondynamic plugin - - // pluginResource is really just a placeholder with the wrong mid (because we couldn't calculate it until the plugin was on board) - // mark is as arrived and delete it from modules; the real module was requested above - map[pseudoPluginResource.mid] = modules[mid]; - setArrived(pseudoPluginResource); - delete modules[pseudoPluginResource.mid]; - }); - plugin.loadQ = 0; - - // step2: replace all references to any placeholder modules with real modules - var substituteModules = function(module){ - for(var replacement, deps = module.deps || [], i = 0; i")]); - return (!module.def || strict) ? abortExec : (module.cjs && module.cjs.exports); - } - // at this point the module is either not executed or fully executed - - - if(!module.executed){ - if(!module.def){ - return abortExec; - } - var mid = module.mid, - deps = module.deps || [], - arg, argResult, - args = [], - i = 0; - - if(0){ - circleTrace.push(mid); - req.trace("loader-exec-module", ["exec", circleTrace.length, mid]); - } - - // for circular dependencies, assume the first module encountered was executed OK - // modules that circularly depend on a module that has not run its factory will get - // the premade cjs.exports===module.result. They can take a reference to this object and/or - // add properties to it. When the module finally runs its factory, the factory can - // read/write/replace this object. Notice that so long as the object isn't replaced, any - // reference taken earlier while walking the deps list is still valid. - module.executed = executing; - while(i < deps.length){ - arg = deps[i++]; - argResult = ((arg === cjsRequireModule) ? createRequire(module) : - ((arg === cjsExportsModule) ? module.cjs.exports : - ((arg === cjsModuleModule) ? module.cjs : - execModule(arg, strict)))); - if(argResult === abortExec){ - module.executed = 0; - req.trace("loader-exec-module", ["abort", mid]); - 0 && circleTrace.pop(); - return abortExec; - } - args.push(argResult); - } - runFactory(module, args); - finishExec(module); - } - // at this point the module is guaranteed fully executed - - 0 && circleTrace.pop(); - return module.result; - }, - - - checkCompleteGuard = 0, - - checkComplete = function(){ - // keep going through the execQ as long as at least one factory is executed - // plugins, recursion, cached modules all make for many execution path possibilities - if(checkCompleteGuard){ - return; - } - checkCompleteGuard++; - checkDojoRequirePlugin(); - for(var currentDefOrder, module, i = 0; i < execQ.length;){ - currentDefOrder = defOrder; - module = execQ[i]; - execModule(module); - if(currentDefOrder!=defOrder){ - // defOrder was bumped one or more times indicating something was executed (note, this indicates - // the execQ was modified, maybe a lot (for example a later module causes an earlier module to execute) - checkDojoRequirePlugin(); - i = 0; - }else{ - // nothing happened; check the next module in the exec queue - i++; - } - } - checkIdle(); - }, - - checkIdle = function(){ - checkCompleteGuard--; - if(execComplete()){ - signal("idle", []); - } - }; - - - if(0){ - req.undef = function(moduleId, referenceModule){ - // In order to reload a module, it must be undefined (this routine) and then re-requested. - // This is useful for testing frameworks (at least). - var module = getModule(moduleId, referenceModule); - setArrived(module); - delete modules[module.mid]; - }; - } - - if(1){ - if(has("dojo-loader-eval-hint-url")===undefined){ - has.add("dojo-loader-eval-hint-url", 1); - } - - var fixupUrl= function(url){ - url += ""; // make sure url is a Javascript string (some paths may be a Java string) - return url + (cacheBust ? ((/\?/.test(url) ? "&" : "?") + cacheBust) : ""); - }, - - injectPlugin = function( - module - ){ - // injects the plugin module given by module; may have to inject the plugin itself - var plugin = module.plugin; - - if(plugin.executed === executed && !plugin.load){ - // executed the module not knowing it was a plugin - promoteModuleToPlugin(plugin); - } - - var onLoad = function(def){ - module.result = def; - setArrived(module); - finishExec(module); - checkComplete(); - }; - - if(plugin.load){ - plugin.load(module.prid, module.req, onLoad); - }else if(plugin.loadQ){ - plugin.loadQ.push(module); - }else{ - // the unshift instead of push is important: we don't want plugins to execute as - // dependencies of some other module because this may cause circles when the plugin - // loadQ is run; also, generally, we want plugins to run early since they may load - // several other modules and therefore can potentially unblock many modules - plugin.loadQ = [module]; - execQ.unshift(plugin); - injectModule(plugin); - } - }, - - // for IE, injecting a module may result in a recursive execution if the module is in the cache - - cached = 0, - - injectingModule = 0, - - injectingCachedModule = 0, - - evalModuleText = function(text, module){ - // see def() for the injectingCachedModule bracket; it simply causes a short, safe curcuit - injectingCachedModule = 1; - if(has("config-dojo-loader-catches")){ - try{ - if(text===cached){ - cached.call(null); - }else{ - req.eval(text, has("dojo-loader-eval-hint-url") ? module.url : module.mid); - } - }catch(e){ - signal(error, makeError("evalModuleThrew", module)); - } - }else{ - if(text===cached){ - cached.call(null); - }else{ - req.eval(text, has("dojo-loader-eval-hint-url") ? module.url : module.mid); - } - } - injectingCachedModule = 0; - }, - - injectModule = function(module){ - // Inject the module. In the browser environment, this means appending a script element into - // the document; in other environments, it means loading a file. - // - // If in synchronous mode, then get the module synchronously if it's not xdomainLoading. - - var mid = module.mid, - url = module.url; - if(module.executed || module.injected || waiting[mid] || (module.url && ((module.pack && waiting[module.url]===module.pack) || waiting[module.url]==1))){ - return; - } - setRequested(module); - - if(0){ - var viaCombo = 0; - if(module.plugin && module.plugin.isCombo){ - // a combo plugin; therefore, must be handled by combo service - // the prid should have already been converted to a URL (if required by the plugin) during - // the normalze process; in any event, there is no way for the loader to know how to - // to the conversion; therefore the third argument is zero - req.combo.add(module.plugin.mid, module.prid, 0, req); - viaCombo = 1; - }else if(!module.plugin){ - viaCombo = req.combo.add(0, module.mid, module.url, req); - } - if(viaCombo){ - comboPending= 1; - return; - } - } - - if(module.plugin){ - injectPlugin(module); - return; - } // else a normal module (not a plugin) - - - var onLoadCallback = function(){ - runDefQ(module); - if(module.injected !== arrived){ - // the script that contained the module arrived and has been executed yet - // nothing was added to the defQ (so it wasn't an AMD module) and the module - // wasn't marked as arrived by dojo.provide (so it wasn't a v1.6- module); - // therefore, it must not have been a module; adjust state accordingly - setArrived(module); - mix(module, nonModuleProps); - } - - if(1 && legacyMode){ - // must call checkComplete even in for sync loader because we may be in xdomainLoading mode; - // but, if xd loading, then don't call checkComplete until out of the current sync traversal - // in order to preserve order of execution of the dojo.required modules - !syncExecStack.length && checkComplete(); - }else{ - checkComplete(); - } - }; - cached = cache[mid] || cache[module.cacheId]; - if(cached){ - req.trace("loader-inject", ["cache", module.mid, url]); - evalModuleText(cached, module); - onLoadCallback(); - return; - } - if(1 && legacyMode){ - if(module.isXd){ - // switch to async mode temporarily; if current legacyMode!=sync, then is must be one of {legacyAsync, xd, false} - legacyMode==sync && (legacyMode = xd); - // fall through and load via script injection - }else if(module.isAmd && legacyMode!=sync){ - // fall through and load via script injection - }else{ - // mode may be sync, xd/legacyAsync, or async; module may be AMD or legacy; but module is always located on the same domain - var xhrCallback = function(text){ - if(legacyMode==sync){ - // the top of syncExecStack gives the current synchronously executing module; the loader needs - // to know this if it has to switch to async loading in the middle of evaluating a legacy module - // this happens when a modules dojo.require's a module that must be loaded async because it's xdomain - // (using unshift/shift because there is no back() methods for Javascript arrays) - syncExecStack.unshift(module); - evalModuleText(text, module); - syncExecStack.shift(); - - // maybe the module was an AMD module - runDefQ(module); - - // legacy modules never get to defineModule() => cjs and injected never set; also evaluation implies executing - if(!module.cjs){ - setArrived(module); - finishExec(module); - } - - if(module.finish){ - // while synchronously evaluating this module, dojo.require was applied referencing a module - // that had to be loaded async; therefore, the loader stopped answering all dojo.require - // requests so they could be answered completely in the correct sequence; module.finish gives - // the list of dojo.requires that must be re-applied once all target modules are available; - // make a synthetic module to execute the dojo.require's in the correct order - - // compute a guarnateed-unique mid for the synthetic finish module; remember the finish vector; remove it from the reference module - // TODO: can we just leave the module.finish...what's it hurting? - var finishMid = mid + "*finish", - finish = module.finish; - delete module.finish; - - def(finishMid, ["dojo", ("dojo/require!" + finish.join(",")).replace(/\./g, "/")], function(dojo){ - forEach(finish, function(mid){ dojo.require(mid); }); - }); - // unshift, not push, which causes the current traversal to be reattempted from the top - execQ.unshift(getModule(finishMid)); - } - onLoadCallback(); - }else{ - text = transformToAmd(module, text); - if(text){ - evalModuleText(text, module); - onLoadCallback(); - }else{ - // if transformToAmd returned falsy, then the module was already AMD and it can be script-injected - // do so to improve debugability(even though it means another download...which probably won't happen with a good browser cache) - injectingModule = module; - req.injectUrl(fixupUrl(url), onLoadCallback, module); - injectingModule = 0; - } - } - }; - - req.trace("loader-inject", ["xhr", module.mid, url, legacyMode!=sync]); - if(has("config-dojo-loader-catches")){ - try{ - req.getText(url, legacyMode!=sync, xhrCallback); - }catch(e){ - signal(error, makeError("xhrInjectFailed", [module, e])); - } - }else{ - req.getText(url, legacyMode!=sync, xhrCallback); - } - return; - } - } // else async mode or fell through in xdomain loading mode; either way, load by script injection - req.trace("loader-inject", ["script", module.mid, url]); - injectingModule = module; - req.injectUrl(fixupUrl(url), onLoadCallback, module); - injectingModule = 0; - }, - - defineModule = function(module, deps, def){ - req.trace("loader-define-module", [module.mid, deps]); - - if(0 && module.plugin && module.plugin.isCombo){ - // the module is a plugin resource loaded by the combo service - // note: check for module.plugin should be enough since normal plugin resources should - // not follow this path; module.plugin.isCombo is future-proofing belt and suspenders - module.result = isFunction(def) ? def() : def; - setArrived(module); - finishExec(module); - return module; - }; - - var mid = module.mid; - if(module.injected === arrived){ - signal(error, makeError("multipleDefine", module)); - return module; - } - mix(module, { - deps: deps, - def: def, - cjs: { - id: module.mid, - uri: module.url, - exports: (module.result = {}), - setExports: function(exports){ - module.cjs.exports = exports; - } - } - }); - - // resolve deps with respect to this module - for(var i = 0; i < deps.length; i++){ - deps[i] = getModule(deps[i], module); - } - - if(1 && legacyMode && !waiting[mid]){ - // the module showed up without being asked for; it was probably in a - // - return new dojo.NodeList(); // dojo.NodeList -}; -=====*/ - -function queryForEngine(engine, NodeList){ - var query = function(/*String*/ query, /*String|DOMNode?*/ root){ - // summary: - // Returns nodes which match the given CSS selector, searching the - // entire document by default but optionally taking a node to scope - // the search by. Returns an instance of dojo.NodeList. - if(typeof root == "string"){ - root = dom.byId(root); - if(!root){ - return new NodeList([]); - } - } - var results = typeof query == "string" ? engine(query, root) : query.orphan ? query : [query]; - if(results.orphan){ - // already wrapped - return results; - } - return new NodeList(results); - }; - query.matches = engine.match || function(node, selector, root){ - // summary: - // Test to see if a node matches a selector - return query.filter([node], selector, root).length > 0; - }; - // the engine provides a filtering function, use it to for matching - query.filter = engine.filter || function(nodes, selector, root){ - // summary: - // Filters an array of nodes. Note that this does not guarantee to return a dojo.NodeList, just an array. - return query(selector, root).filter(function(node){ - return array.indexOf(nodes, node) > -1; - }); - }; - if(typeof engine != "function"){ - var search = engine.search; - engine = function(selector, root){ - // Slick does it backwards (or everyone else does it backwards, probably the latter) - return search(root || document, selector); - }; - } - return query; -} -var query = queryForEngine(defaultEngine, NodeList); -// the query that is returned from this module is slightly different than dojo.query, -// because dojo.query has to maintain backwards compatibility with returning a -// true array which has performance problems. The query returned from the module -// does not use true arrays, but rather inherits from Array, making it much faster to -// instantiate. -dojo.query = queryForEngine(defaultEngine, function(array){ - // call it without the new operator to invoke the back-compat behavior that returns a true array - return NodeList(array); -}); - -query.load = /*===== dojo.query.load= ======*/ function(id, parentRequire, loaded, config){ - // summary: can be used as AMD plugin to conditionally load new query engine - // example: - // | define(["dojo/query!custom"], function(qsa){ - // | // loaded selector/custom.js as engine - // | qsa("#foobar").forEach(...); - // | }); - loader.load(id, parentRequire, function(engine){ - loaded(queryForEngine(engine, NodeList)); - }); -}; - -dojo._filterQueryResult = query._filterResult = function(nodes, selector, root){ - return new NodeList(query.filter(nodes, selector, root)); -}; -dojo.NodeList = query.NodeList = NodeList; -return query; -}); - -}, -'dojo/has':function(){ -define(["require"], function(require) { - // module: - // dojo/has - // summary: - // Defines the has.js API and several feature tests used by dojo. - // description: - // This module defines the has API as described by the project has.js with the following additional features: - // - // * the has test cache is exposed at has.cache. - // * the method has.add includes a forth parameter that controls whether or not existing tests are replaced - // * the loader's has cache may be optionally copied into this module's has cahce. - // - // This module adopted from https://github.com/phiggins42/has.js; thanks has.js team! - - // try to pull the has implementation from the loader; both the dojo loader and bdLoad provide one - // WARNING: if a foreign loader defines require.has to be something other than the has.js API, then this implementation fail - var has = require.has || function(){}; - if(!1){ - // notice the condition is written so that if 1 is transformed to 1 during a build - // the conditional will be (!1 && typeof has=="function") which is statically false and the closure - // compiler will discard the block. - var - isBrowser = - // the most fundamental decision: are we in the browser? - typeof window != "undefined" && - typeof location != "undefined" && - typeof document != "undefined" && - window.location == location && window.document == document, - - // has API variables - global = this, - doc = isBrowser && document, - element = doc && doc.createElement("DiV"), - cache = {}; - - has = /*===== dojo.has= =====*/ function(name){ - // summary: - // Return the current value of the named feature. - // - // name: String|Integer - // The name (if a string) or identifier (if an integer) of the feature to test. - // - // description: - // Returns the value of the feature named by name. The feature must have been - // previously added to the cache by has.add. - - return typeof cache[name] == "function" ? (cache[name] = cache[name](global, doc, element)) : cache[name]; // Boolean - }; - - has.cache = cache; - - has.add = /*====== dojo.has.add= ======*/ function(name, test, now, force){ - // summary: - // Register a new feature test for some named feature. - // - // name: String|Integer - // The name (if a string) or identifier (if an integer) of the feature to test. - // - // test: Function - // A test function to register. If a function, queued for testing until actually - // needed. The test function should return a boolean indicating - // the presence of a feature or bug. - // - // now: Boolean? - // Optional. Omit if `test` is not a function. Provides a way to immediately - // run the test and cache the result. - // - // force: Boolean? - // Optional. If the test already exists and force is truthy, then the existing - // test will be replaced; otherwise, add does not replace an existing test (that - // is, by default, the first test advice wins). - // - // example: - // A redundant test, testFn with immediate execution: - // | has.add("javascript", function(){ return true; }, true); - // - // example: - // Again with the redundantness. You can do this in your tests, but we should - // not be doing this in any internal has.js tests - // | has.add("javascript", true); - // - // example: - // Three things are passed to the testFunction. `global`, `document`, and a generic element - // from which to work your test should the need arise. - // | has.add("bug-byid", function(g, d, el){ - // | // g == global, typically window, yadda yadda - // | // d == document object - // | // el == the generic element. a `has` element. - // | return false; // fake test, byid-when-form-has-name-matching-an-id is slightly longer - // | }); - - (typeof cache[name]=="undefined" || force) && (cache[name]= test); - return now && has(name); - }; - - // since we're operating under a loader that doesn't provide a has API, we must explicitly initialize - // has as it would have otherwise been initialized by the dojo loader; use has.add to the builder - // can optimize these away iff desired - true || has.add("host-browser", isBrowser); - true || has.add("dom", isBrowser); - true || has.add("dojo-dom-ready-api", 1); - true || has.add("dojo-sniff", 1); - } - - if(1){ - var agent = navigator.userAgent; - // Common application level tests - has.add("dom-addeventlistener", !!document.addEventListener); - has.add("touch", "ontouchstart" in document); - // I don't know if any of these tests are really correct, just a rough guess - has.add("device-width", screen.availWidth || innerWidth); - has.add("agent-ios", !!agent.match(/iPhone|iP[ao]d/)); - has.add("agent-android", agent.indexOf("android") > 1); - } - - has.clearElement = /*===== dojo.has.clearElement= ======*/ function(element) { - // summary: - // Deletes the contents of the element passed to test functions. - element.innerHTML= ""; - return element; - }; - - has.normalize = /*===== dojo.has.normalize= ======*/ function(id, toAbsMid){ - // summary: - // Resolves id into a module id based on possibly-nested tenary expression that branches on has feature test value(s). - // - // toAbsMid: Function - // Resolves a relative module id into an absolute module id - var - tokens = id.match(/[\?:]|[^:\?]*/g), i = 0, - get = function(skip){ - var term = tokens[i++]; - if(term == ":"){ - // empty string module name, resolves to 0 - return 0; - }else{ - // postfixed with a ? means it is a feature to branch on, the term is the name of the feature - if(tokens[i++] == "?"){ - if(!skip && has(term)){ - // matched the feature, get the first value from the options - return get(); - }else{ - // did not match, get the second value, passing over the first - get(true); - return get(skip); - } - } - // a module - return term || 0; - } - }; - id = get(); - return id && toAbsMid(id); - }; - - has.load = /*===== dojo.has.load= ======*/ function(id, parentRequire, loaded){ - // summary: - // Conditional loading of AMD modules based on a has feature test value. - // - // id: String - // Gives the resolved module id to load. - // - // parentRequire: Function - // The loader require function with respect to the module that contained the plugin resource in it's - // dependency list. - // - // loaded: Function - // Callback to loader that consumes result of plugin demand. - - if(id){ - parentRequire([id], loaded); - }else{ - loaded(); - } - }; - - return has; -}); - -}, -'dojo/_base/loader':function(){ -define(["./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! 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! 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 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: - // | - // | - - 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 - }; -}); - -}, -'dojo/json':function(){ -define(["./has"], function(has){ - "use strict"; - var hasJSON = typeof JSON != "undefined"; - has.add("json-parse", hasJSON); // all the parsers work fine - // Firefox 3.5/Gecko 1.9 fails to use replacer in stringify properly https://bugzilla.mozilla.org/show_bug.cgi?id=509184 - has.add("json-stringify", hasJSON && JSON.stringify({a:0}, function(k,v){return v||1;}) == '{"a":1}'); - if(has("json-stringify")){ - return JSON; - } - else{ - var 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 - }; - return { - parse: has("json-parse") ? JSON.parse : function(str, strict){ - // summary: - // Parses a [JSON](http://json.org) string to return a JavaScript object. - // description: - // This function follows [native JSON API](https://developer.mozilla.org/en/JSON) - // Throws for invalid JSON strings. This delegates to eval() if native JSON - // support is not available. By default this will evaluate any valid JS expression. - // With the strict parameter set to true, the parser will ensure that only - // valid JSON strings are parsed (otherwise throwing an error). Without the strict - // parameter, the content passed to this method must come - // from a trusted source. - // str: - // a string literal of a JSON item, for instance: - // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'` - // strict: - // When set to true, this will ensure that only valid, secure JSON is ever parsed. - // Make sure this is set to true for untrusted content. Note that on browsers/engines - // without native JSON support, setting this to true will run slower. - if(strict && !/^([\s\[\{]*(?:"(?:\\.|[^"])+"|-?\d[\d\.]*(?:[Ee][+-]?\d+)?|null|true|false|)[\s\]\}]*(?:,|:|$))+$/.test(str)){ - throw new SyntaxError("Invalid characters in JSON"); - } - return eval('(' + str + ')'); - }, - stringify: function(value, replacer, spacer){ - // summary: - // Returns a [JSON](http://json.org) serialization of an object. - // description: - // Returns a [JSON](http://json.org) serialization of an object. - // This function follows [native JSON API](https://developer.mozilla.org/en/JSON) - // Note that this doesn't check for infinite recursion, so don't do that! - // value: - // A value to be serialized. - // replacer: - // A replacer function that is called for each value and can return a replacement - // spacer: - // A spacer string to be used for pretty printing of JSON - // - // example: - // simple serialization of a trivial object - // | define(["dojo/json"], function(JSON){ - // | var jsonStr = JSON.stringify({ howdy: "stranger!", isStrange: true }); - // | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr); - var undef; - if(typeof replacer == "string"){ - spacer = replacer; - replacer = null; - } - function stringify(it, indent, key){ - if(replacer){ - it = replacer(key, it); - } - var val, objtype = typeof it; - if(objtype == "number"){ - return isFinite(it) ? it + "" : "null"; - } - if(objtype == "boolean"){ - return it + ""; - } - if(it === null){ - return "null"; - } - if(typeof it == "string"){ - return escapeString(it); - } - if(objtype == "function" || objtype == "undefined"){ - return undef; // undefined - } - // short-circuit for objects that support "json" serialization - // if they return "self" then just pass-through... - if(typeof it.toJSON == "function"){ - return stringify(it.toJSON(key), indent, key); - } - if(it instanceof Date){ - return '"{FullYear}-{Month+}-{Date}T{Hours}:{Minutes}:{Seconds}Z"'.replace(/\{(\w+)(\+)?\}/g, function(t, prop, plus){ - var num = it["getUTC" + prop]() + (plus ? 1 : 0); - return num < 10 ? "0" + num : num; - }); - } - if(it.valueOf() !== it){ - // primitive wrapper, try again unwrapped: - return stringify(it.valueOf(), indent, key); - } - var nextIndent= spacer ? (indent + spacer) : ""; - /* we used to test for DOM nodes and throw, but FF serializes them as {}, so cross-browser consistency is probably not efficiently attainable */ - - var sep = spacer ? " " : ""; - var newLine = spacer ? "\n" : ""; - - // array - if(it instanceof Array){ - var itl = it.length, res = []; - for(key = 0; key < itl; key++){ - var obj = it[key]; - val = stringify(obj, nextIndent, key); - if(typeof val != "string"){ - val = "null"; - } - res.push(newLine + nextIndent + val); - } - return "[" + res.join(",") + newLine + indent + "]"; - } - // generic object code path - var output = []; - for(key in it){ - var keyStr; - if(typeof key == "number"){ - keyStr = '"' + key + '"'; - }else if(typeof key == "string"){ - keyStr = escapeString(key); - }else{ - // skip non-string or number keys - continue; - } - val = stringify(it[key], nextIndent, key); - if(typeof val != "string"){ - // skip non-serializable values - continue; - } - // At this point, the most non-IE browsers don't get in this branch - // (they have native JSON), so push is definitely the way to - output.push(newLine + nextIndent + keyStr + ":" + sep + val); - } - return "{" + output.join(",") + newLine + indent + "}"; // String - } - return stringify(value, "", ""); - } - }; - } -}); - -}, -'dojo/_base/declare':function(){ -define(["./kernel", "../has", "./lang"], function(dojo, has, lang){ - // module: - // dojo/_base/declare - // summary: - // This module defines dojo.declare. - - var mix = lang.mixin, op = Object.prototype, opts = op.toString, - xtor = new Function, counter = 0, cname = "constructor"; - - function err(msg, cls){ throw new Error("declare" + (cls ? " " + cls : "") + ": " + msg); } - - // C3 Method Resolution Order (see http://www.python.org/download/releases/2.3/mro/) - function c3mro(bases, className){ - var result = [], roots = [{cls: 0, refs: []}], nameMap = {}, clsCount = 1, - l = bases.length, i = 0, j, lin, base, top, proto, rec, name, refs; - - // build a list of bases naming them if needed - for(; i < l; ++i){ - base = bases[i]; - if(!base){ - err("mixin #" + i + " is unknown. Did you use dojo.require to pull it in?", className); - }else if(opts.call(base) != "[object Function]"){ - err("mixin #" + i + " is not a callable constructor.", className); - } - lin = base._meta ? base._meta.bases : [base]; - top = 0; - // add bases to the name map - for(j = lin.length - 1; j >= 0; --j){ - proto = lin[j].prototype; - if(!proto.hasOwnProperty("declaredClass")){ - proto.declaredClass = "uniqName_" + (counter++); - } - name = proto.declaredClass; - if(!nameMap.hasOwnProperty(name)){ - nameMap[name] = {count: 0, refs: [], cls: lin[j]}; - ++clsCount; - } - rec = nameMap[name]; - if(top && top !== rec){ - rec.refs.push(top); - ++top.count; - } - top = rec; - } - ++top.count; - roots[0].refs.push(top); - } - - // remove classes without external references recursively - while(roots.length){ - top = roots.pop(); - result.push(top.cls); - --clsCount; - // optimization: follow a single-linked chain - while(refs = top.refs, refs.length == 1){ - top = refs[0]; - if(!top || --top.count){ - // branch or end of chain => do not end to roots - top = 0; - break; - } - result.push(top.cls); - --clsCount; - } - if(top){ - // branch - for(i = 0, l = refs.length; i < l; ++i){ - top = refs[i]; - if(!--top.count){ - roots.push(top); - } - } - } - } - if(clsCount){ - err("can't build consistent linearization", className); - } - - // calculate the superclass offset - base = bases[0]; - result[0] = base ? - base._meta && base === result[result.length - base._meta.bases.length] ? - base._meta.bases.length : 1 : 0; - - return result; - } - - function inherited(args, a, f){ - var name, chains, bases, caller, meta, base, proto, opf, pos, - cache = this._inherited = this._inherited || {}; - - // crack arguments - if(typeof args == "string"){ - name = args; - args = a; - a = f; - } - f = 0; - - caller = args.callee; - name = name || caller.nom; - if(!name){ - err("can't deduce a name to call inherited()", this.declaredClass); - } - - meta = this.constructor._meta; - bases = meta.bases; - - pos = cache.p; - if(name != cname){ - // method - if(cache.c !== caller){ - // cache bust - pos = 0; - base = bases[0]; - meta = base._meta; - if(meta.hidden[name] !== caller){ - // error detection - chains = meta.chains; - if(chains && typeof chains[name] == "string"){ - err("calling chained method with inherited: " + name, this.declaredClass); - } - // find caller - do{ - meta = base._meta; - proto = base.prototype; - if(meta && (proto[name] === caller && proto.hasOwnProperty(name) || meta.hidden[name] === caller)){ - break; - } - }while(base = bases[++pos]); // intentional assignment - pos = base ? pos : -1; - } - } - // find next - base = bases[++pos]; - if(base){ - proto = base.prototype; - if(base._meta && proto.hasOwnProperty(name)){ - f = proto[name]; - }else{ - opf = op[name]; - do{ - proto = base.prototype; - f = proto[name]; - if(f && (base._meta ? proto.hasOwnProperty(name) : f !== opf)){ - break; - } - }while(base = bases[++pos]); // intentional assignment - } - } - f = base && f || op[name]; - }else{ - // constructor - if(cache.c !== caller){ - // cache bust - pos = 0; - meta = bases[0]._meta; - if(meta && meta.ctor !== caller){ - // error detection - chains = meta.chains; - if(!chains || chains.constructor !== "manual"){ - err("calling chained constructor with inherited", this.declaredClass); - } - // find caller - while(base = bases[++pos]){ // intentional assignment - meta = base._meta; - if(meta && meta.ctor === caller){ - break; - } - } - pos = base ? pos : -1; - } - } - // find next - while(base = bases[++pos]){ // intentional assignment - meta = base._meta; - f = meta ? meta.ctor : base; - if(f){ - break; - } - } - f = base && f; - } - - // cache the found super method - cache.c = f; - cache.p = pos; - - // now we have the result - if(f){ - return a === true ? f : f.apply(this, a || args); - } - // intentionally no return if a super method was not found - } - - function getInherited(name, args){ - if(typeof name == "string"){ - return this.__inherited(name, args, true); - } - return this.__inherited(name, true); - } - - function inherited__debug(args, a1, a2){ - var f = this.getInherited(args, a1); - if(f){ return f.apply(this, a2 || a1 || args); } - // intentionally no return if a super method was not found - } - - var inheritedImpl = dojo.config.isDebug ? inherited__debug : inherited; - - // emulation of "instanceof" - function isInstanceOf(cls){ - var bases = this.constructor._meta.bases; - for(var i = 0, l = bases.length; i < l; ++i){ - if(bases[i] === cls){ - return true; - } - } - return this instanceof cls; - } - - function mixOwn(target, source){ - // add props adding metadata for incoming functions skipping a constructor - for(var name in source){ - if(name != cname && source.hasOwnProperty(name)){ - target[name] = source[name]; - } - } - if(has("bug-for-in-skips-shadowed")){ - for(var extraNames= lang._extraNames, i= extraNames.length; i;){ - name = extraNames[--i]; - if(name != cname && source.hasOwnProperty(name)){ - target[name] = source[name]; - } - } - } - } - - // implementation of safe mixin function - function safeMixin(target, source){ - var name, t; - // add props adding metadata for incoming functions skipping a constructor - for(name in source){ - t = source[name]; - if((t !== op[name] || !(name in op)) && name != cname){ - if(opts.call(t) == "[object Function]"){ - // non-trivial function method => attach its name - t.nom = name; - } - target[name] = t; - } - } - if(has("bug-for-in-skips-shadowed")){ - for(var extraNames= lang._extraNames, i= extraNames.length; i;){ - name = extraNames[--i]; - t = source[name]; - if((t !== op[name] || !(name in op)) && name != cname){ - if(opts.call(t) == "[object Function]"){ - // non-trivial function method => attach its name - t.nom = name; - } - target[name] = t; - } - } - } - return target; - } - - function extend(source){ - declare.safeMixin(this.prototype, source); - return this; - } - - // chained constructor compatible with the legacy dojo.declare() - function chainedConstructor(bases, ctorSpecial){ - return function(){ - var a = arguments, args = a, a0 = a[0], f, i, m, - l = bases.length, preArgs; - - if(!(this instanceof a.callee)){ - // not called via new, so force it - return applyNew(a); - } - - //this._inherited = {}; - // perform the shaman's rituals of the original dojo.declare() - // 1) call two types of the preamble - if(ctorSpecial && (a0 && a0.preamble || this.preamble)){ - // full blown ritual - preArgs = new Array(bases.length); - // prepare parameters - preArgs[0] = a; - for(i = 0;;){ - // process the preamble of the 1st argument - a0 = a[0]; - if(a0){ - f = a0.preamble; - if(f){ - a = f.apply(this, a) || a; - } - } - // process the preamble of this class - f = bases[i].prototype; - f = f.hasOwnProperty("preamble") && f.preamble; - if(f){ - a = f.apply(this, a) || a; - } - // one peculiarity of the preamble: - // it is called if it is not needed, - // e.g., there is no constructor to call - // let's watch for the last constructor - // (see ticket #9795) - if(++i == l){ - break; - } - preArgs[i] = a; - } - } - // 2) call all non-trivial constructors using prepared arguments - for(i = l - 1; i >= 0; --i){ - f = bases[i]; - m = f._meta; - f = m ? m.ctor : f; - if(f){ - f.apply(this, preArgs ? preArgs[i] : a); - } - } - // 3) continue the original ritual: call the postscript - f = this.postscript; - if(f){ - f.apply(this, args); - } - }; - } - - - // chained constructor compatible with the legacy dojo.declare() - function singleConstructor(ctor, ctorSpecial){ - return function(){ - var a = arguments, t = a, a0 = a[0], f; - - if(!(this instanceof a.callee)){ - // not called via new, so force it - return applyNew(a); - } - - //this._inherited = {}; - // perform the shaman's rituals of the original dojo.declare() - // 1) call two types of the preamble - if(ctorSpecial){ - // full blown ritual - if(a0){ - // process the preamble of the 1st argument - f = a0.preamble; - if(f){ - t = f.apply(this, t) || t; - } - } - f = this.preamble; - if(f){ - // process the preamble of this class - f.apply(this, t); - // one peculiarity of the preamble: - // it is called even if it is not needed, - // e.g., there is no constructor to call - // let's watch for the last constructor - // (see ticket #9795) - } - } - // 2) call a constructor - if(ctor){ - ctor.apply(this, a); - } - // 3) continue the original ritual: call the postscript - f = this.postscript; - if(f){ - f.apply(this, a); - } - }; - } - - // plain vanilla constructor (can use inherited() to call its base constructor) - function simpleConstructor(bases){ - return function(){ - var a = arguments, i = 0, f, m; - - if(!(this instanceof a.callee)){ - // not called via new, so force it - return applyNew(a); - } - - //this._inherited = {}; - // perform the shaman's rituals of the original dojo.declare() - // 1) do not call the preamble - // 2) call the top constructor (it can use this.inherited()) - for(; f = bases[i]; ++i){ // intentional assignment - m = f._meta; - f = m ? m.ctor : f; - if(f){ - f.apply(this, a); - break; - } - } - // 3) call the postscript - f = this.postscript; - if(f){ - f.apply(this, a); - } - }; - } - - function chain(name, bases, reversed){ - return function(){ - var b, m, f, i = 0, step = 1; - if(reversed){ - i = bases.length - 1; - step = -1; - } - for(; b = bases[i]; i += step){ // intentional assignment - m = b._meta; - f = (m ? m.hidden : b.prototype)[name]; - if(f){ - f.apply(this, arguments); - } - } - }; - } - - // forceNew(ctor) - // return a new object that inherits from ctor.prototype but - // without actually running ctor on the object. - function forceNew(ctor){ - // create object with correct prototype using a do-nothing - // constructor - xtor.prototype = ctor.prototype; - var t = new xtor; - xtor.prototype = null; // clean up - return t; - } - - // applyNew(args) - // just like 'new ctor()' except that the constructor and its arguments come - // from args, which must be an array or an arguments object - function applyNew(args){ - // create an object with ctor's prototype but without - // calling ctor on it. - var ctor = args.callee, t = forceNew(ctor); - // execute the real constructor on the new object - ctor.apply(t, args); - return t; - } - - function declare(className, superclass, props){ - // crack parameters - if(typeof className != "string"){ - props = superclass; - superclass = className; - className = ""; - } - props = props || {}; - - var proto, i, t, ctor, name, bases, chains, mixins = 1, parents = superclass; - - // build a prototype - if(opts.call(superclass) == "[object Array]"){ - // C3 MRO - bases = c3mro(superclass, className); - t = bases[0]; - mixins = bases.length - t; - superclass = bases[mixins]; - }else{ - bases = [0]; - if(superclass){ - if(opts.call(superclass) == "[object Function]"){ - t = superclass._meta; - bases = bases.concat(t ? t.bases : superclass); - }else{ - err("base class is not a callable constructor.", className); - } - }else if(superclass !== null){ - err("unknown base class. Did you use dojo.require to pull it in?", className); - } - } - if(superclass){ - for(i = mixins - 1;; --i){ - proto = forceNew(superclass); - if(!i){ - // stop if nothing to add (the last base) - break; - } - // mix in properties - t = bases[i]; - (t._meta ? mixOwn : mix)(proto, t.prototype); - // chain in new constructor - ctor = new Function; - ctor.superclass = superclass; - ctor.prototype = proto; - superclass = proto.constructor = ctor; - } - }else{ - proto = {}; - } - // add all properties - declare.safeMixin(proto, props); - // add constructor - t = props.constructor; - if(t !== op.constructor){ - t.nom = cname; - proto.constructor = t; - } - - // collect chains and flags - for(i = mixins - 1; i; --i){ // intentional assignment - t = bases[i]._meta; - if(t && t.chains){ - chains = mix(chains || {}, t.chains); - } - } - if(proto["-chains-"]){ - chains = mix(chains || {}, proto["-chains-"]); - } - - // build ctor - t = !chains || !chains.hasOwnProperty(cname); - bases[0] = ctor = (chains && chains.constructor === "manual") ? simpleConstructor(bases) : - (bases.length == 1 ? singleConstructor(props.constructor, t) : chainedConstructor(bases, t)); - - // add meta information to the constructor - ctor._meta = {bases: bases, hidden: props, chains: chains, - parents: parents, ctor: props.constructor}; - ctor.superclass = superclass && superclass.prototype; - ctor.extend = extend; - ctor.prototype = proto; - proto.constructor = ctor; - - // add "standard" methods to the prototype - proto.getInherited = getInherited; - proto.isInstanceOf = isInstanceOf; - proto.inherited = inheritedImpl; - proto.__inherited = inherited; - - // add name if specified - if(className){ - proto.declaredClass = className; - lang.setObject(className, ctor); - } - - // build chains and add them to the prototype - if(chains){ - for(name in chains){ - if(proto[name] && typeof chains[name] == "string" && name != cname){ - t = proto[name] = chain(name, bases, chains[name] === "after"); - t.nom = name; - } - } - } - // chained methods do not return values - // no need to chain "invisible" functions - - return ctor; // Function - } - - /*===== - dojo.declare = function(className, superclass, props){ - // summary: - // Create a feature-rich constructor from compact notation. - // className: String?: - // The optional name of the constructor (loosely, a "class") - // stored in the "declaredClass" property in the created prototype. - // It will be used as a global name for a created constructor. - // superclass: Function|Function[]: - // May be null, a Function, or an Array of Functions. This argument - // specifies a list of bases (the left-most one is the most deepest - // base). - // props: Object: - // An object whose properties are copied to the created prototype. - // Add an instance-initialization function by making it a property - // named "constructor". - // returns: - // New constructor function. - // description: - // Create a constructor using a compact notation for inheritance and - // prototype extension. - // - // Mixin ancestors provide a type of multiple inheritance. - // Prototypes of mixin ancestors are copied to the new class: - // changes to mixin prototypes will not affect classes to which - // they have been mixed in. - // - // Ancestors can be compound classes created by this version of - // dojo.declare. In complex cases all base classes are going to be - // linearized according to C3 MRO algorithm - // (see http://www.python.org/download/releases/2.3/mro/ for more - // details). - // - // "className" is cached in "declaredClass" property of the new class, - // if it was supplied. The immediate super class will be cached in - // "superclass" property of the new class. - // - // Methods in "props" will be copied and modified: "nom" property - // (the declared name of the method) will be added to all copied - // functions to help identify them for the internal machinery. Be - // very careful, while reusing methods: if you use the same - // function under different names, it can produce errors in some - // cases. - // - // It is possible to use constructors created "manually" (without - // dojo.declare) as bases. They will be called as usual during the - // creation of an instance, their methods will be chained, and even - // called by "this.inherited()". - // - // Special property "-chains-" governs how to chain methods. It is - // a dictionary, which uses method names as keys, and hint strings - // as values. If a hint string is "after", this method will be - // called after methods of its base classes. If a hint string is - // "before", this method will be called before methods of its base - // classes. - // - // If "constructor" is not mentioned in "-chains-" property, it will - // be chained using the legacy mode: using "after" chaining, - // calling preamble() method before each constructor, if available, - // and calling postscript() after all constructors were executed. - // If the hint is "after", it is chained as a regular method, but - // postscript() will be called after the chain of constructors. - // "constructor" cannot be chained "before", but it allows - // a special hint string: "manual", which means that constructors - // are not going to be chained in any way, and programmer will call - // them manually using this.inherited(). In the latter case - // postscript() will be called after the construction. - // - // All chaining hints are "inherited" from base classes and - // potentially can be overridden. Be very careful when overriding - // hints! Make sure that all chained methods can work in a proposed - // manner of chaining. - // - // Once a method was chained, it is impossible to unchain it. The - // only exception is "constructor". You don't need to define a - // method in order to supply a chaining hint. - // - // If a method is chained, it cannot use this.inherited() because - // all other methods in the hierarchy will be called automatically. - // - // Usually constructors and initializers of any kind are chained - // using "after" and destructors of any kind are chained as - // "before". Note that chaining assumes that chained methods do not - // return any value: any returned value will be discarded. - // - // example: - // | dojo.declare("my.classes.bar", my.classes.foo, { - // | // properties to be added to the class prototype - // | someValue: 2, - // | // initialization function - // | constructor: function(){ - // | this.myComplicatedObject = new ReallyComplicatedObject(); - // | }, - // | // other functions - // | someMethod: function(){ - // | doStuff(); - // | } - // | }); - // - // example: - // | var MyBase = dojo.declare(null, { - // | // constructor, properties, and methods go here - // | // ... - // | }); - // | var MyClass1 = dojo.declare(MyBase, { - // | // constructor, properties, and methods go here - // | // ... - // | }); - // | var MyClass2 = dojo.declare(MyBase, { - // | // constructor, properties, and methods go here - // | // ... - // | }); - // | var MyDiamond = dojo.declare([MyClass1, MyClass2], { - // | // constructor, properties, and methods go here - // | // ... - // | }); - // - // example: - // | var F = function(){ console.log("raw constructor"); }; - // | F.prototype.method = function(){ - // | console.log("raw method"); - // | }; - // | var A = dojo.declare(F, { - // | constructor: function(){ - // | console.log("A.constructor"); - // | }, - // | method: function(){ - // | console.log("before calling F.method..."); - // | this.inherited(arguments); - // | console.log("...back in A"); - // | } - // | }); - // | new A().method(); - // | // will print: - // | // raw constructor - // | // A.constructor - // | // before calling F.method... - // | // raw method - // | // ...back in A - // - // example: - // | var A = dojo.declare(null, { - // | "-chains-": { - // | destroy: "before" - // | } - // | }); - // | var B = dojo.declare(A, { - // | constructor: function(){ - // | console.log("B.constructor"); - // | }, - // | destroy: function(){ - // | console.log("B.destroy"); - // | } - // | }); - // | var C = dojo.declare(B, { - // | constructor: function(){ - // | console.log("C.constructor"); - // | }, - // | destroy: function(){ - // | console.log("C.destroy"); - // | } - // | }); - // | new C().destroy(); - // | // prints: - // | // B.constructor - // | // C.constructor - // | // C.destroy - // | // B.destroy - // - // example: - // | var A = dojo.declare(null, { - // | "-chains-": { - // | constructor: "manual" - // | } - // | }); - // | var B = dojo.declare(A, { - // | constructor: function(){ - // | // ... - // | // call the base constructor with new parameters - // | this.inherited(arguments, [1, 2, 3]); - // | // ... - // | } - // | }); - // - // example: - // | var A = dojo.declare(null, { - // | "-chains-": { - // | m1: "before" - // | }, - // | m1: function(){ - // | console.log("A.m1"); - // | }, - // | m2: function(){ - // | console.log("A.m2"); - // | } - // | }); - // | var B = dojo.declare(A, { - // | "-chains-": { - // | m2: "after" - // | }, - // | m1: function(){ - // | console.log("B.m1"); - // | }, - // | m2: function(){ - // | console.log("B.m2"); - // | } - // | }); - // | var x = new B(); - // | x.m1(); - // | // prints: - // | // B.m1 - // | // A.m1 - // | x.m2(); - // | // prints: - // | // A.m2 - // | // B.m2 - return new Function(); // Function - }; - =====*/ - - /*===== - dojo.safeMixin = function(target, source){ - // summary: - // Mix in properties skipping a constructor and decorating functions - // like it is done by dojo.declare. - // target: Object - // Target object to accept new properties. - // source: Object - // Source object for new properties. - // description: - // This function is used to mix in properties like lang.mixin does, - // but it skips a constructor property and decorates functions like - // dojo.declare does. - // - // It is meant to be used with classes and objects produced with - // dojo.declare. Functions mixed in with dojo.safeMixin can use - // this.inherited() like normal methods. - // - // This function is used to implement extend() method of a constructor - // produced with dojo.declare(). - // - // example: - // | var A = dojo.declare(null, { - // | m1: function(){ - // | console.log("A.m1"); - // | }, - // | m2: function(){ - // | console.log("A.m2"); - // | } - // | }); - // | var B = dojo.declare(A, { - // | m1: function(){ - // | this.inherited(arguments); - // | console.log("B.m1"); - // | } - // | }); - // | B.extend({ - // | m2: function(){ - // | this.inherited(arguments); - // | console.log("B.m2"); - // | } - // | }); - // | var x = new B(); - // | dojo.safeMixin(x, { - // | m1: function(){ - // | this.inherited(arguments); - // | console.log("X.m1"); - // | }, - // | m2: function(){ - // | this.inherited(arguments); - // | console.log("X.m2"); - // | } - // | }); - // | x.m2(); - // | // prints: - // | // A.m1 - // | // B.m1 - // | // X.m1 - }; - =====*/ - - /*===== - Object.inherited = function(name, args, newArgs){ - // summary: - // Calls a super method. - // name: String? - // The optional method name. Should be the same as the caller's - // name. Usually "name" is specified in complex dynamic cases, when - // the calling method was dynamically added, undecorated by - // dojo.declare, and it cannot be determined. - // args: Arguments - // The caller supply this argument, which should be the original - // "arguments". - // newArgs: Object? - // If "true", the found function will be returned without - // executing it. - // If Array, it will be used to call a super method. Otherwise - // "args" will be used. - // returns: - // Whatever is returned by a super method, or a super method itself, - // if "true" was specified as newArgs. - // description: - // This method is used inside method of classes produced with - // dojo.declare to call a super method (next in the chain). It is - // used for manually controlled chaining. Consider using the regular - // chaining, because it is faster. Use "this.inherited()" only in - // complex cases. - // - // This method cannot me called from automatically chained - // constructors including the case of a special (legacy) - // constructor chaining. It cannot be called from chained methods. - // - // If "this.inherited()" cannot find the next-in-chain method, it - // does nothing and returns "undefined". The last method in chain - // can be a default method implemented in Object, which will be - // called last. - // - // If "name" is specified, it is assumed that the method that - // received "args" is the parent method for this call. It is looked - // up in the chain list and if it is found the next-in-chain method - // is called. If it is not found, the first-in-chain method is - // called. - // - // If "name" is not specified, it will be derived from the calling - // method (using a methoid property "nom"). - // - // example: - // | var B = dojo.declare(A, { - // | method1: function(a, b, c){ - // | this.inherited(arguments); - // | }, - // | method2: function(a, b){ - // | return this.inherited(arguments, [a + b]); - // | } - // | }); - // | // next method is not in the chain list because it is added - // | // manually after the class was created. - // | B.prototype.method3 = function(){ - // | console.log("This is a dynamically-added method."); - // | this.inherited("method3", arguments); - // | }; - // example: - // | var B = dojo.declare(A, { - // | method: function(a, b){ - // | var super = this.inherited(arguments, true); - // | // ... - // | if(!super){ - // | console.log("there is no super method"); - // | return 0; - // | } - // | return super.apply(this, arguments); - // | } - // | }); - return {}; // Object - } - =====*/ - - /*===== - Object.getInherited = function(name, args){ - // summary: - // Returns a super method. - // name: String? - // The optional method name. Should be the same as the caller's - // name. Usually "name" is specified in complex dynamic cases, when - // the calling method was dynamically added, undecorated by - // dojo.declare, and it cannot be determined. - // args: Arguments - // The caller supply this argument, which should be the original - // "arguments". - // returns: - // Returns a super method (Function) or "undefined". - // description: - // This method is a convenience method for "this.inherited()". - // It uses the same algorithm but instead of executing a super - // method, it returns it, or "undefined" if not found. - // - // example: - // | var B = dojo.declare(A, { - // | method: function(a, b){ - // | var super = this.getInherited(arguments); - // | // ... - // | if(!super){ - // | console.log("there is no super method"); - // | return 0; - // | } - // | return super.apply(this, arguments); - // | } - // | }); - return {}; // Object - } - =====*/ - - /*===== - Object.isInstanceOf = function(cls){ - // summary: - // Checks the inheritance chain to see if it is inherited from this - // class. - // cls: Function - // Class constructor. - // returns: - // "true", if this object is inherited from this class, "false" - // otherwise. - // description: - // This method is used with instances of classes produced with - // dojo.declare to determine of they support a certain interface or - // not. It models "instanceof" operator. - // - // example: - // | var A = dojo.declare(null, { - // | // constructor, properties, and methods go here - // | // ... - // | }); - // | var B = dojo.declare(null, { - // | // constructor, properties, and methods go here - // | // ... - // | }); - // | var C = dojo.declare([A, B], { - // | // constructor, properties, and methods go here - // | // ... - // | }); - // | var D = dojo.declare(A, { - // | // constructor, properties, and methods go here - // | // ... - // | }); - // | - // | var a = new A(), b = new B(), c = new C(), d = new D(); - // | - // | console.log(a.isInstanceOf(A)); // true - // | console.log(b.isInstanceOf(A)); // false - // | console.log(c.isInstanceOf(A)); // true - // | console.log(d.isInstanceOf(A)); // true - // | - // | console.log(a.isInstanceOf(B)); // false - // | console.log(b.isInstanceOf(B)); // true - // | console.log(c.isInstanceOf(B)); // true - // | console.log(d.isInstanceOf(B)); // false - // | - // | console.log(a.isInstanceOf(C)); // false - // | console.log(b.isInstanceOf(C)); // false - // | console.log(c.isInstanceOf(C)); // true - // | console.log(d.isInstanceOf(C)); // false - // | - // | console.log(a.isInstanceOf(D)); // false - // | console.log(b.isInstanceOf(D)); // false - // | console.log(c.isInstanceOf(D)); // false - // | console.log(d.isInstanceOf(D)); // true - return {}; // Object - } - =====*/ - - /*===== - Object.extend = function(source){ - // summary: - // Adds all properties and methods of source to constructor's - // prototype, making them available to all instances created with - // constructor. This method is specific to constructors created with - // dojo.declare. - // source: Object - // Source object which properties are going to be copied to the - // constructor's prototype. - // description: - // Adds source properties to the constructor's prototype. It can - // override existing properties. - // - // This method is similar to dojo.extend function, but it is specific - // to constructors produced by dojo.declare. It is implemented - // using dojo.safeMixin, and it skips a constructor property, - // and properly decorates copied functions. - // - // example: - // | var A = dojo.declare(null, { - // | m1: function(){}, - // | s1: "Popokatepetl" - // | }); - // | A.extend({ - // | m1: function(){}, - // | m2: function(){}, - // | f1: true, - // | d1: 42 - // | }); - }; - =====*/ - - dojo.safeMixin = declare.safeMixin = safeMixin; - dojo.declare = declare; - - return declare; -}); - -}, -'dojo/dom':function(){ -define(["./_base/sniff", "./_base/lang", "./_base/window"], - function(has, lang, win){ - // module: - // dojo/dom - // summary: - // This module defines the core dojo DOM API. - - // FIXME: need to add unit tests for all the semi-public methods - - try{ - document.execCommand("BackgroundImageCache", false, true); - }catch(e){ - // sane browsers don't have cache "issues" - } - - // ============================= - // DOM Functions - // ============================= - - /*===== - dojo.byId = function(id, doc){ - // summary: - // Returns DOM node with matching `id` attribute or `null` - // if not found. If `id` is a DomNode, this function is a no-op. - // - // id: String|DOMNode - // A string to match an HTML id attribute or a reference to a DOM Node - // - // doc: Document? - // Document to work in. Defaults to the current value of - // dojo.doc. Can be used to retrieve - // node references from other documents. - // - // example: - // Look up a node by ID: - // | var n = dojo.byId("foo"); - // - // example: - // Check if a node exists, and use it. - // | var n = dojo.byId("bar"); - // | if(n){ doStuff() ... } - // - // example: - // Allow string or DomNode references to be passed to a custom function: - // | var foo = function(nodeOrId){ - // | nodeOrId = dojo.byId(nodeOrId); - // | // ... more stuff - // | } - =====*/ - - /*===== - dojo.isDescendant = function(node, ancestor){ - // summary: - // Returns true if node is a descendant of ancestor - // node: DOMNode|String - // string id or node reference to test - // ancestor: DOMNode|String - // string id or node reference of potential parent to test against - // - // example: - // Test is node id="bar" is a descendant of node id="foo" - // | if(dojo.isDescendant("bar", "foo")){ ... } - }; - =====*/ - - // TODO: do we need this function in the base? - - /*===== - dojo.setSelectable = function(node, selectable){ - // summary: - // Enable or disable selection on a node - // node: DOMNode|String - // id or reference to node - // selectable: Boolean - // state to put the node in. false indicates unselectable, true - // allows selection. - // example: - // Make the node id="bar" unselectable - // | dojo.setSelectable("bar"); - // example: - // Make the node id="bar" selectable - // | dojo.setSelectable("bar", true); - }; - =====*/ - - var dom = {}; // the result object - - if(has("ie")){ - dom.byId = function(id, doc){ - if(typeof id != "string"){ - return id; - } - var _d = doc || win.doc, te = id && _d.getElementById(id); - // attributes.id.value is better than just id in case the - // user has a name=id inside a form - if(te && (te.attributes.id.value == id || te.id == id)){ - return te; - }else{ - var eles = _d.all[id]; - if(!eles || eles.nodeName){ - eles = [eles]; - } - // if more than 1, choose first with the correct id - var i = 0; - while((te = eles[i++])){ - if((te.attributes && te.attributes.id && te.attributes.id.value == id) || te.id == id){ - return te; - } - } - } - }; - }else{ - dom.byId = function(id, doc){ - // inline'd type check. - // be sure to return null per documentation, to match IE branch. - return ((typeof id == "string") ? (doc || win.doc).getElementById(id) : id) || null; // DOMNode - }; - } - /*===== - }; - =====*/ - - dom.isDescendant = function(/*DOMNode|String*/node, /*DOMNode|String*/ancestor){ - try{ - node = dom.byId(node); - ancestor = dom.byId(ancestor); - while(node){ - if(node == ancestor){ - return true; // Boolean - } - node = node.parentNode; - } - }catch(e){ /* squelch, return false */ } - return false; // Boolean - }; - - // TODO: do we need this function in the base? - - dom.setSelectable = function(/*DOMNode|String*/node, /*Boolean*/selectable){ - node = dom.byId(node); - if(has("mozilla")){ - node.style.MozUserSelect = selectable ? "" : "none"; - }else if(has("khtml") || has("webkit")){ - node.style.KhtmlUserSelect = selectable ? "auto" : "none"; - }else if(has("ie")){ - var v = (node.unselectable = selectable ? "" : "on"), - cs = node.getElementsByTagName("*"), i = 0, l = cs.length; - for(; i < l; ++i){ - cs.item(i).unselectable = v; - } - } - //FIXME: else? Opera? - }; - - return dom; -}); - -}, -'dojo/_base/browser':function(){ -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; -}); - -}, -'dojo/dom-style':function(){ -define(["./_base/sniff", "./dom"], function(has, dom){ - // module: - // dojo/dom-style - // summary: - // This module defines the core dojo DOM style API. - - // ============================= - // Style Functions - // ============================= - - // getComputedStyle drives most of the style code. - // Wherever possible, reuse the returned object. - // - // API functions below that need to access computed styles accept an - // optional computedStyle parameter. - // If this parameter is omitted, the functions will call getComputedStyle themselves. - // This way, calling code can access computedStyle once, and then pass the reference to - // multiple API functions. - - /*===== - dojo.getComputedStyle = function(node){ - // summary: - // Returns a "computed style" object. - // - // description: - // Gets a "computed style" object which can be used to gather - // information about the current state of the rendered node. - // - // Note that this may behave differently on different browsers. - // Values may have different formats and value encodings across - // browsers. - // - // Note also that this method is expensive. Wherever possible, - // reuse the returned object. - // - // Use the dojo.style() method for more consistent (pixelized) - // return values. - // - // node: DOMNode - // A reference to a DOM node. Does NOT support taking an - // ID string for speed reasons. - // example: - // | dojo.getComputedStyle(dojo.byId('foo')).borderWidth; - // - // example: - // Reusing the returned object, avoiding multiple lookups: - // | var cs = dojo.getComputedStyle(dojo.byId("someNode")); - // | var w = cs.width, h = cs.height; - return; // CSS2Properties - } - =====*/ - - /*===== - dojo.toPixelValue = function(node, value){ - // summary: - // converts style value to pixels on IE or return a numeric value. - // node: DOMNode - // value: String - // returns: Number - }; - =====*/ - - /*===== - dojo._toPixelValue = function(node, value){ - // summary: - // Existing alias for `dojo._toPixelValue`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.getStyle = function(node, name){ - // summary: - // Accesses styles on a node. - // 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 style for - // name: String? - // the style property to get - // example: - // Passing only an ID or node returns the computed style object of - // the node: - // | dojo.getStyle("thinger"); - // example: - // Passing a node and a style property returns the current - // normalized, computed value for that property: - // | dojo.getStyle("thinger", "opacity"); // 1 by default - }; - =====*/ - - /*===== - dojo.setStyle = function(node, name, value){ - // summary: - // Sets styles on a node. - // node: DOMNode|String - // id or reference to node to 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. - // - // example: - // Passing a node, a style property, and a value changes the - // current display of the node and returns the new computed value - // | dojo.setStyle("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.setStyle("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.setStyle("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" - // | }); - }; - =====*/ - - // Although we normally eschew argument validation at this - // level, here we test argument 'node' for (duck)type, - // by testing nodeType, ecause 'document' is the 'parentNode' of 'body' - // it is frequently sent to this function even - // though it is not Element. - var getComputedStyle, style = {}; - if(has("webkit")){ - getComputedStyle = function(/*DomNode*/node){ - var s; - if(node.nodeType == 1){ - var dv = node.ownerDocument.defaultView; - s = dv.getComputedStyle(node, null); - if(!s && node.style){ - node.style.display = ""; - s = dv.getComputedStyle(node, null); - } - } - return s || {}; - }; - }else if(has("ie") && (has("ie") < 9 || has("quirks"))){ - getComputedStyle = function(node){ - // IE (as of 7) doesn't expose Element like sane browsers - return node.nodeType == 1 /* ELEMENT_NODE*/ ? node.currentStyle : {}; - }; - }else{ - getComputedStyle = function(node){ - return node.nodeType == 1 ? - node.ownerDocument.defaultView.getComputedStyle(node, null) : {}; - }; - } - style.getComputedStyle = getComputedStyle; - - var toPixel; - if(!has("ie")){ - toPixel = function(element, value){ - // style values can be floats, client code may want - // to round for integer pixels. - return parseFloat(value) || 0; - }; - }else{ - toPixel = function(element, avalue){ - if(!avalue){ return 0; } - // on IE7, medium is usually 4 pixels - if(avalue == "medium"){ return 4; } - // style values can be floats, client code may - // want to round this value for integer pixels. - if(avalue.slice && avalue.slice(-2) == 'px'){ return parseFloat(avalue); } - var s = element.style, rs = element.runtimeStyle, cs = element.currentStyle, - sLeft = s.left, rsLeft = rs.left; - rs.left = cs.left; - try{ - // 'avalue' may be incompatible with style.left, which can cause IE to throw - // this has been observed for border widths using "thin", "medium", "thick" constants - // those particular constants could be trapped by a lookup - // but perhaps there are more - s.left = avalue; - avalue = s.pixelLeft; - }catch(e){ - avalue = 0; - } - s.left = sLeft; - rs.left = rsLeft; - return avalue; - } - } - style.toPixelValue = toPixel; - - // FIXME: there opacity quirks on FF that we haven't ported over. Hrm. - - var astr = "DXImageTransform.Microsoft.Alpha"; - var af = function(n, f){ - try{ - return n.filters.item(astr); - }catch(e){ - return f ? {} : null; - } - }; - - var _getOpacity = - has("ie") < 9 || (has("ie") && has("quirks")) ? function(node){ - try{ - return af(node).Opacity / 100; // Number - }catch(e){ - return 1; // Number - } - } : - function(node){ - return getComputedStyle(node).opacity; - }; - - var _setOpacity = - has("ie") < 9 || (has("ie") && has("quirks")) ? function(/*DomNode*/node, /*Number*/opacity){ - var ov = opacity * 100, opaque = opacity == 1; - node.style.zoom = opaque ? "" : 1; - - if(!af(node)){ - if(opaque){ - return opacity; - } - node.style.filter += " progid:" + astr + "(Opacity=" + ov + ")"; - }else{ - af(node, 1).Opacity = ov; - } - - // on IE7 Alpha(Filter opacity=100) makes text look fuzzy so disable it altogether (bug #2661), - //but still update the opacity value so we can get a correct reading if it is read later. - af(node, 1).Enabled = !opaque; - - if(node.tagName.toLowerCase() == "tr"){ - for(var td = node.firstChild; td; td = td.nextSibling){ - if(td.tagName.toLowerCase() == "td"){ - _setOpacity(td, opacity); - } - } - } - return opacity; - } : - function(node, opacity){ - return node.style.opacity = opacity; - }; - - var _pixelNamesCache = { - left: true, top: true - }; - var _pixelRegExp = /margin|padding|width|height|max|min|offset/; // |border - function _toStyleValue(node, type, value){ - //TODO: should we really be doing string case conversion here? Should we cache it? Need to profile! - type = type.toLowerCase(); - if(has("ie")){ - if(value == "auto"){ - if(type == "height"){ return node.offsetHeight; } - if(type == "width"){ return node.offsetWidth; } - } - if(type == "fontweight"){ - switch(value){ - case 700: return "bold"; - case 400: - default: return "normal"; - } - } - } - if(!(type in _pixelNamesCache)){ - _pixelNamesCache[type] = _pixelRegExp.test(type); - } - return _pixelNamesCache[type] ? toPixel(node, value) : value; - } - - var _floatStyle = has("ie") ? "styleFloat" : "cssFloat", - _floatAliases = {"cssFloat": _floatStyle, "styleFloat": _floatStyle, "float": _floatStyle}; - - // public API - - style.get = function getStyle(/*DOMNode|String*/ node, /*String?*/ name){ - var n = dom.byId(node), l = arguments.length, op = (name == "opacity"); - if(l == 2 && op){ - return _getOpacity(n); - } - name = _floatAliases[name] || name; - var s = style.getComputedStyle(n); - return (l == 1) ? s : _toStyleValue(n, name, s[name] || n.style[name]); /* CSS2Properties||String||Number */ - }; - - style.set = function setStyle(/*DOMNode|String*/ node, /*String|Object*/ name, /*String?*/ value){ - var n = dom.byId(node), l = arguments.length, op = (name == "opacity"); - name = _floatAliases[name] || name; - if(l == 3){ - return op ? _setOpacity(n, value) : n.style[name] = value; // Number - } - for(var x in name){ - style.set(node, x, name[x]); - } - return style.getComputedStyle(n); - }; - - return style; -}); - -}, -'dojo/dom-geometry':function(){ -define(["./_base/sniff", "./_base/window","./dom", "./dom-style"], - function(has, win, dom, style){ - // module: - // dojo/dom-geometry - // summary: - // This module defines the core dojo DOM geometry API. - - var geom = {}; // the result object - - // Box functions will assume this model. - // On IE/Opera, BORDER_BOX will be set if the primary document is in quirks mode. - // Can be set to change behavior of box setters. - - // can be either: - // "border-box" - // "content-box" (default) - geom.boxModel = "content-box"; - - // We punt per-node box mode testing completely. - // If anybody cares, we can provide an additional (optional) unit - // that overrides existing code to include per-node box sensitivity. - - // Opera documentation claims that Opera 9 uses border-box in BackCompat mode. - // but experiments (Opera 9.10.8679 on Windows Vista) indicate that it actually continues to use content-box. - // IIRC, earlier versions of Opera did in fact use border-box. - // Opera guys, this is really confusing. Opera being broken in quirks mode is not our fault. - - if(has("ie") /*|| has("opera")*/){ - // client code may have to adjust if compatMode varies across iframes - geom.boxModel = document.compatMode == "BackCompat" ? "border-box" : "content-box"; - } - - // ============================= - // Box Functions - // ============================= - - /*===== - dojo.getPadExtents = function(node, computedStyle){ - // summary: - // Returns object with special values specifically useful for node - // fitting. - // description: - // Returns an object with `w`, `h`, `l`, `t` properties: - // | l/t/r/b = left/top/right/bottom padding (respectively) - // | w = the total of the left and right padding - // | h = the total of the top and bottom padding - // If 'node' has position, l/t forms the origin for child nodes. - // The w/h are used for calculating boxes. - // Normally application code will not need to invoke this - // directly, and will use the ...box... functions instead. - // node: DOMNode - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo.getComputedStyle. - - - }; - =====*/ - - /*===== - dojo._getPadExtents = function(node, computedStyle){ - // summary: - // Existing alias for `dojo.getPadExtents`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.getBorderExtents = function(node, computedStyle){ - // summary: - // returns an object with properties useful for noting the border - // dimensions. - // description: - // * l/t/r/b = the sum of left/top/right/bottom border (respectively) - // * w = the sum of the left and right border - // * h = the sum of the top and bottom border - // - // The w/h are used for calculating boxes. - // Normally application code will not need to invoke this - // directly, and will use the ...box... functions instead. - // node: DOMNode - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo.getComputedStyle. - - - }; - =====*/ - - /*===== - dojo._getBorderExtents = function(node, computedStyle){ - // summary: - // Existing alias for `dojo.getBorderExtents`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.getPadBorderExtents = function(node, computedStyle){ - // summary: - // Returns object with properties useful for box fitting with - // regards to padding. - // description: - // * l/t/r/b = the sum of left/top/right/bottom padding and left/top/right/bottom border (respectively) - // * w = the sum of the left and right padding and border - // * h = the sum of the top and bottom padding and border - // - // The w/h are used for calculating boxes. - // Normally application code will not need to invoke this - // directly, and will use the ...box... functions instead. - // node: DOMNode - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo.getComputedStyle. - - - }; - =====*/ - - /*===== - dojo._getPadBorderExtents = function(node, computedStyle){ - // summary: - // Existing alias for `dojo.getPadBorderExtents`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.getMarginExtents = function(node, computedStyle){ - // summary: - // returns object with properties useful for box fitting with - // regards to box margins (i.e., the outer-box). - // - // * l/t = marginLeft, marginTop, respectively - // * w = total width, margin inclusive - // * h = total height, margin inclusive - // - // The w/h are used for calculating boxes. - // Normally application code will not need to invoke this - // directly, and will use the ...box... functions instead. - // node: DOMNode - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo.getComputedStyle. - }; - =====*/ - - /*===== - dojo._getMarginExtents = function(node, computedStyle){ - // summary: - // Existing alias for `dojo.getMarginExtents`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.getMarginSize = function(node, computedStyle){ - // summary: - // returns an object that encodes the width and height of - // the node's margin box - // node: DOMNode|String - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo.getComputedStyle. - }; - =====*/ - - /*===== - dojo._getMarginSize = function(node, computedStyle){ - // summary: - // Existing alias for `dojo.getMarginSize`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.getMarginBox = function(node, computedStyle){ - // summary: - // returns an object that encodes the width, height, left and top - // positions of the node's margin box. - // node: DOMNode - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo.getComputedStyle. - }; - =====*/ - - /*===== - dojo._getMarginBox = function(node, computedStyle){ - // summary: - // Existing alias for `dojo.getMarginBox`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.setMarginBox = function(node, box, computedStyle){ - // summary: - // sets the size of the node's margin box and placement - // (left/top), irrespective of box model. Think of it as a - // passthrough to setBox that handles box-model vagaries for - // you. - // node: DOMNode - // box: Object - // hash with optional "l", "t", "w", and "h" properties for "left", "right", "width", and "height" - // respectively. All specified properties should have numeric values in whole pixels. - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo.getComputedStyle. - }; - =====*/ - - /*===== - dojo.getContentBox = function(node, computedStyle){ - // summary: - // Returns an object that encodes the width, height, left and top - // positions of the node's content box, irrespective of the - // current box model. - // node: DOMNode - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo.getComputedStyle. - }; - =====*/ - - /*===== - dojo._getContentBox = function(node, computedStyle){ - // summary: - // Existing alias for `dojo.getContentBox`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.setContentSize = function(node, box, computedStyle){ - // summary: - // Sets the size of the node's contents, irrespective of margins, - // padding, or borders. - // node: DOMNode - // box: Object - // hash with optional "w", and "h" properties for "width", and "height" - // respectively. All specified properties should have numeric values in whole pixels. - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo.getComputedStyle. - }; - =====*/ - - /*===== - dojo.isBodyLtr = function(){ - // summary: - // Returns true if the current language is left-to-right, and false otherwise. - // returns: Boolean - }; - =====*/ - - /*===== - dojo._isBodyLtr = function(){ - // summary: - // Existing alias for `dojo.isBodyLtr`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.docScroll = function(){ - // summary: - // Returns an object with {node, x, y} with corresponding offsets. - // returns: Object - }; - =====*/ - - /*===== - dojo._docScroll = function(){ - // summary: - // Existing alias for `dojo.docScroll`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.getIeDocumentElementOffset = function(){ - // summary: - // returns the offset in x and y from the document body to the - // visual edge of the page for IE - // description: - // The following values in IE contain an offset: - // | event.clientX - // | event.clientY - // | node.getBoundingClientRect().left - // | node.getBoundingClientRect().top - // But other position related values do not contain this offset, - // such as node.offsetLeft, node.offsetTop, node.style.left and - // node.style.top. The offset is always (2, 2) in LTR direction. - // When the body is in RTL direction, the offset counts the width - // of left scroll bar's width. This function computes the actual - // offset. - }; - =====*/ - - /*===== - dojo._getIeDocumentElementOffset = function(){ - // summary: - // Existing alias for `dojo.getIeDocumentElementOffset`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.fixIeBiDiScrollLeft = function(scrollLeft){ - // summary: - // In RTL direction, scrollLeft should be a negative value, but IE - // returns a positive one. All codes using documentElement.scrollLeft - // must call this function to fix this error, otherwise the position - // will offset to right when there is a horizontal scrollbar. - // scrollLeft: NUmber - // returns: Number - }; - =====*/ - - /*===== - dojo._fixIeBiDiScrollLeft = function(scrollLeft){ - // summary: - // Existing alias for `dojo.fixIeBiDiScrollLeft`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.position = function(node, includeScroll){ - // summary: - // Gets the position and size of the passed element relative to - // the viewport (if includeScroll==false), or relative to the - // document root (if includeScroll==true). - // - // description: - // Returns an object of the form: - // { x: 100, y: 300, w: 20, h: 15 } - // If includeScroll==true, the x and y values will include any - // document offsets that may affect the position relative to the - // viewport. - // Uses the border-box model (inclusive of border and padding but - // not margin). Does not act as a setter. - // node: DOMNode|String - // includeScroll: Boolean? - // returns: Object - }; - =====*/ - - geom.getPadExtents = function getPadExtents(/*DomNode*/node, /*Object*/computedStyle){ - node = dom.byId(node); - var s = computedStyle || style.getComputedStyle(node), px = style.toPixelValue, - l = px(node, s.paddingLeft), t = px(node, s.paddingTop), r = px(node, s.paddingRight), b = px(node, s.paddingBottom); - return {l: l, t: t, r: r, b: b, w: l + r, h: t + b}; - }; - - var none = "none"; - - geom.getBorderExtents = function getBorderExtents(/*DomNode*/node, /*Object*/computedStyle){ - node = dom.byId(node); - var px = style.toPixelValue, s = computedStyle || style.getComputedStyle(node), - l = s.borderLeftStyle != none ? px(node, s.borderLeftWidth) : 0, - t = s.borderTopStyle != none ? px(node, s.borderTopWidth) : 0, - r = s.borderRightStyle != none ? px(node, s.borderRightWidth) : 0, - b = s.borderBottomStyle != none ? px(node, s.borderBottomWidth) : 0; - return {l: l, t: t, r: r, b: b, w: l + r, h: t + b}; - }; - - geom.getPadBorderExtents = function getPadBorderExtents(/*DomNode*/node, /*Object*/computedStyle){ - node = dom.byId(node); - var s = computedStyle || style.getComputedStyle(node), - p = geom.getPadExtents(node, s), - b = geom.getBorderExtents(node, s); - return { - l: p.l + b.l, - t: p.t + b.t, - r: p.r + b.r, - b: p.b + b.b, - w: p.w + b.w, - h: p.h + b.h - }; - }; - - geom.getMarginExtents = function getMarginExtents(node, computedStyle){ - node = dom.byId(node); - var s = computedStyle || style.getComputedStyle(node), px = style.toPixelValue, - l = px(node, s.marginLeft), t = px(node, s.marginTop), r = px(node, s.marginRight), b = px(node, s.marginBottom); - if(has("webkit") && (s.position != "absolute")){ - // FIXME: Safari's version of the computed right margin - // is the space between our right edge and the right edge - // of our offsetParent. - // What we are looking for is the actual margin value as - // determined by CSS. - // Hack solution is to assume left/right margins are the same. - r = l; - } - return {l: l, t: t, r: r, b: b, w: l + r, h: t + b}; - }; - - // Box getters work in any box context because offsetWidth/clientWidth - // are invariant wrt box context - // - // They do *not* work for display: inline objects that have padding styles - // because the user agent ignores padding (it's bogus styling in any case) - // - // Be careful with IMGs because they are inline or block depending on - // browser and browser mode. - - // Although it would be easier to read, there are not separate versions of - // _getMarginBox for each browser because: - // 1. the branching is not expensive - // 2. factoring the shared code wastes cycles (function call overhead) - // 3. duplicating the shared code wastes bytes - - geom.getMarginBox = function getMarginBox(/*DomNode*/node, /*Object*/computedStyle){ - // summary: - // returns an object that encodes the width, height, left and top - // positions of the node's margin box. - node = dom.byId(node); - var s = computedStyle || style.getComputedStyle(node), me = geom.getMarginExtents(node, s), - l = node.offsetLeft - me.l, t = node.offsetTop - me.t, p = node.parentNode, px = style.toPixelValue, pcs; - if(has("mozilla")){ - // Mozilla: - // If offsetParent has a computed overflow != visible, the offsetLeft is decreased - // by the parent's border. - // We don't want to compute the parent's style, so instead we examine node's - // computed left/top which is more stable. - var sl = parseFloat(s.left), st = parseFloat(s.top); - if(!isNaN(sl) && !isNaN(st)){ - l = sl, t = st; - }else{ - // If child's computed left/top are not parseable as a number (e.g. "auto"), we - // have no choice but to examine the parent's computed style. - if(p && p.style){ - pcs = style.getComputedStyle(p); - if(pcs.overflow != "visible"){ - l += pcs.borderLeftStyle != none ? px(node, pcs.borderLeftWidth) : 0; - t += pcs.borderTopStyle != none ? px(node, pcs.borderTopWidth) : 0; - } - } - } - }else if(has("opera") || (has("ie") == 8 && !has("quirks"))){ - // On Opera and IE 8, offsetLeft/Top includes the parent's border - if(p){ - pcs = style.getComputedStyle(p); - l -= pcs.borderLeftStyle != none ? px(node, pcs.borderLeftWidth) : 0; - t -= pcs.borderTopStyle != none ? px(node, pcs.borderTopWidth) : 0; - } - } - return {l: l, t: t, w: node.offsetWidth + me.w, h: node.offsetHeight + me.h}; - }; - - geom.getContentBox = function getContentBox(node, computedStyle){ - // clientWidth/Height are important since the automatically account for scrollbars - // fallback to offsetWidth/Height for special cases (see #3378) - node = dom.byId(node); - var s = computedStyle || style.getComputedStyle(node), w = node.clientWidth, h, - pe = geom.getPadExtents(node, s), be = geom.getBorderExtents(node, s); - if(!w){ - w = node.offsetWidth; - h = node.offsetHeight; - }else{ - h = node.clientHeight; - be.w = be.h = 0; - } - // On Opera, offsetLeft includes the parent's border - if(has("opera")){ - pe.l += be.l; - pe.t += be.t; - } - return {l: pe.l, t: pe.t, w: w - pe.w - be.w, h: h - pe.h - be.h}; - }; - - // Box setters depend on box context because interpretation of width/height styles - // vary wrt box context. - // - // The value of dojo.boxModel is used to determine box context. - // dojo.boxModel can be set directly to change behavior. - // - // Beware of display: inline objects that have padding styles - // because the user agent ignores padding (it's a bogus setup anyway) - // - // Be careful with IMGs because they are inline or block depending on - // browser and browser mode. - // - // Elements other than DIV may have special quirks, like built-in - // margins or padding, or values not detectable via computedStyle. - // In particular, margins on TABLE do not seems to appear - // at all in computedStyle on Mozilla. - - function setBox(/*DomNode*/node, /*Number?*/l, /*Number?*/t, /*Number?*/w, /*Number?*/h, /*String?*/u){ - // summary: - // sets width/height/left/top in the current (native) box-model - // dimensions. Uses the unit passed in u. - // node: - // DOM Node reference. Id string not supported for performance - // reasons. - // l: - // left offset from parent. - // t: - // top offset from parent. - // w: - // width in current box model. - // h: - // width in current box model. - // u: - // unit measure to use for other measures. Defaults to "px". - u = u || "px"; - var s = node.style; - if(!isNaN(l)){ - s.left = l + u; - } - if(!isNaN(t)){ - s.top = t + u; - } - if(w >= 0){ - s.width = w + u; - } - if(h >= 0){ - s.height = h + u; - } - } - - function isButtonTag(/*DomNode*/node){ - // summary: - // True if the node is BUTTON or INPUT.type="button". - return node.tagName.toLowerCase() == "button" || - node.tagName.toLowerCase() == "input" && (node.getAttribute("type") || "").toLowerCase() == "button"; // boolean - } - - function usesBorderBox(/*DomNode*/node){ - // summary: - // True if the node uses border-box layout. - - // We could test the computed style of node to see if a particular box - // has been specified, but there are details and we choose not to bother. - - // TABLE and BUTTON (and INPUT type=button) are always border-box by default. - // If you have assigned a different box to either one via CSS then - // box functions will break. - - return geom.boxModel == "border-box" || node.tagName.toLowerCase() == "table" || isButtonTag(node); // boolean - } - - geom.setContentSize = function setContentSize(/*DomNode*/node, /*Object*/box, /*Object*/computedStyle){ - // summary: - // Sets the size of the node's contents, irrespective of margins, - // padding, or borders. - - node = dom.byId(node); - var w = box.w, h = box.h; - if(usesBorderBox(node)){ - var pb = geom.getPadBorderExtents(node, computedStyle); - if(w >= 0){ - w += pb.w; - } - if(h >= 0){ - h += pb.h; - } - } - setBox(node, NaN, NaN, w, h); - }; - - var nilExtents = {l: 0, t: 0, w: 0, h: 0}; - - geom.setMarginBox = function setMarginBox(/*DomNode*/node, /*Object*/box, /*Object*/computedStyle){ - node = dom.byId(node); - var s = computedStyle || style.getComputedStyle(node), w = box.w, h = box.h, - // Some elements have special padding, margin, and box-model settings. - // To use box functions you may need to set padding, margin explicitly. - // Controlling box-model is harder, in a pinch you might set dojo.boxModel. - pb = usesBorderBox(node) ? nilExtents : geom.getPadBorderExtents(node, s), - mb = geom.getMarginExtents(node, s); - if(has("webkit")){ - // on Safari (3.1.2), button nodes with no explicit size have a default margin - // setting an explicit size eliminates the margin. - // We have to swizzle the width to get correct margin reading. - if(isButtonTag(node)){ - var ns = node.style; - if(w >= 0 && !ns.width){ - ns.width = "4px"; - } - if(h >= 0 && !ns.height){ - ns.height = "4px"; - } - } - } - if(w >= 0){ - w = Math.max(w - pb.w - mb.w, 0); - } - if(h >= 0){ - h = Math.max(h - pb.h - mb.h, 0); - } - setBox(node, box.l, box.t, w, h); - }; - - // ============================= - // Positioning - // ============================= - - geom.isBodyLtr = function isBodyLtr(){ - return (win.body().dir || win.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean - }; - - geom.docScroll = function docScroll(){ - var node = win.doc.parentWindow || win.doc.defaultView; // use UI window, not dojo.global window - return "pageXOffset" in node ? {x: node.pageXOffset, y: node.pageYOffset } : - (node = has("quirks") ? win.body() : win.doc.documentElement, - {x: geom.fixIeBiDiScrollLeft(node.scrollLeft || 0), y: node.scrollTop || 0 }); - }; - - geom.getIeDocumentElementOffset = function getIeDocumentElementOffset(){ - //NOTE: assumes we're being called in an IE browser - - var de = win.doc.documentElement; // only deal with HTML element here, position() handles body/quirks - - if(has("ie") < 8){ - var r = de.getBoundingClientRect(), // works well for IE6+ - l = r.left, t = r.top; - if(has("ie") < 7){ - l += de.clientLeft; // scrollbar size in strict/RTL, or, - t += de.clientTop; // HTML border size in strict - } - return { - x: l < 0 ? 0 : l, // FRAME element border size can lead to inaccurate negative values - y: t < 0 ? 0 : t - }; - }else{ - return { - x: 0, - y: 0 - }; - } - }; - - geom.fixIeBiDiScrollLeft = function fixIeBiDiScrollLeft(/*Integer*/ scrollLeft){ - // In RTL direction, scrollLeft should be a negative value, but IE - // returns a positive one. All codes using documentElement.scrollLeft - // must call this function to fix this error, otherwise the position - // will offset to right when there is a horizontal scrollbar. - - var ie = has("ie"); - if(ie && !geom.isBodyLtr()){ - var qk = has("quirks"), - de = qk ? win.body() : win.doc.documentElement; - if(ie == 6 && !qk && win.global.frameElement && de.scrollHeight > de.clientHeight){ - scrollLeft += de.clientLeft; // workaround ie6+strict+rtl+iframe+vertical-scrollbar bug where clientWidth is too small by clientLeft pixels - } - return (ie < 8 || qk) ? (scrollLeft + de.clientWidth - de.scrollWidth) : -scrollLeft; // Integer - } - return scrollLeft; // Integer - }; - - geom.position = function(/*DomNode*/node, /*Boolean?*/includeScroll){ - node = dom.byId(node); - var db = win.body(), - dh = db.parentNode, - ret = node.getBoundingClientRect(); - ret = {x: ret.left, y: ret.top, w: ret.right - ret.left, h: ret.bottom - ret.top}; - if(has("ie")){ - // On IE there's a 2px offset that we need to adjust for, see dojo.getIeDocumentElementOffset() - var offset = geom.getIeDocumentElementOffset(); - - // fixes the position in IE, quirks mode - ret.x -= offset.x + (has("quirks") ? db.clientLeft + db.offsetLeft : 0); - ret.y -= offset.y + (has("quirks") ? db.clientTop + db.offsetTop : 0); - }else if(has("ff") == 3){ - // In FF3 you have to subtract the document element margins. - // Fixed in FF3.5 though. - var cs = style.getComputedStyle(dh), px = style.toPixelValue; - ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth); - ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth); - } - // account for document scrolling - // if offsetParent is used, ret value already includes scroll position - // so we may have to actually remove that value if !includeScroll - if(includeScroll){ - var scroll = geom.docScroll(); - ret.x += scroll.x; - ret.y += scroll.y; - } - - return ret; // Object - }; - - // random "private" functions wildly used throughout the toolkit - - geom.getMarginSize = function getMarginSize(/*DomNode*/node, /*Object*/computedStyle){ - node = dom.byId(node); - var me = geom.getMarginExtents(node, computedStyle || style.getComputedStyle(node)); - var size = node.getBoundingClientRect(); - return { - w: (size.right - size.left) + me.w, - h: (size.bottom - size.top) + me.h - } - }; - - geom.normalizeEvent = function(event){ - // summary: - // Normalizes the geometry of a DOM event, normalizing the pageX, pageY, - // offsetX, offsetY, layerX, and layerX properties - // event: Object - if(!("layerX" in event)){ - event.layerX = event.offsetX; - event.layerY = event.offsetY; - } - if(!has("dom-addeventlistener")){ - // old IE version - // 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 = event.target; - var 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 = has("quirks") ? doc.body : doc.documentElement; - var offset = geom.getIeDocumentElementOffset(); - event.pageX = event.clientX + geom.fixIeBiDiScrollLeft(docBody.scrollLeft || 0) - offset.x; - event.pageY = event.clientY + (docBody.scrollTop || 0) - offset.y; - } - }; - - // TODO: evaluate separate getters/setters for position and sizes? - - return geom; -}); - -}, -'dojo/dom-prop':function(){ -define("dojo/dom-prop", ["exports", "./_base/kernel", "./_base/sniff", "./_base/lang", "./dom", "./dom-style", "./dom-construct", "./_base/connect"], - function(exports, dojo, has, lang, dom, style, ctr, conn){ - // module: - // dojo/dom-prop - // summary: - // This module defines the core dojo DOM properties API. - // Indirectly depends on dojo.empty() and dojo.toDom(). - - // ============================= - // Element properties Functions - // ============================= - - /*===== - prop.get = function(node, name){ - // summary: - // Gets a property on an HTML element. - // description: - // Handles normalized getting of properties on DOM nodes. - // - // node: DOMNode|String - // id or reference to the element to get the property on - // name: String - // the name of the property to get. - // returns: - // the value of the requested property or its default value - // - // example: - // | // get the current value of the "foo" property on a node - // | dojo.getProp(dojo.byId("nodeId"), "foo"); - // | // or we can just pass the id: - // | dojo.getProp("nodeId", "foo"); - }; - =====*/ - - /*===== - prop.set = function(node, name, value){ - // summary: - // Sets a property on an HTML element. - // description: - // Handles normalized setting of properties on DOM nodes. - // - // 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 set the property on - // name: String|Object - // the name of the property to set, or a hash object to set - // multiple properties at once. - // value: String? - // The value to set for the property - // returns: - // the DOM node - // - // example: - // | // use prop() to set the tab index - // | dojo.setProp("nodeId", "tabIndex", 3); - // | - // - // example: - // Set multiple values at once, including event handlers: - // | dojo.setProp("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.setProp("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.setProp("someNode", "style", obj); - // | - // | // though shorter to use `dojo.style()` in this case: - // | dojo.style("someNode", obj); - }; - =====*/ - - // helper to connect events - var _evtHdlrMap = {}, _ctr = 0, _attrId = dojo._scopeName + "attrid"; - - // the next dictionary lists elements with read-only innerHTML on IE - var _roInnerHtml = {col: 1, colgroup: 1, - // frameset: 1, head: 1, html: 1, style: 1, - table: 1, tbody: 1, tfoot: 1, thead: 1, tr: 1, title: 1}; - - exports.names = { - // properties renamed to avoid clashes with reserved words - "class": "className", - "for": "htmlFor", - // properties written as camelCase - tabindex: "tabIndex", - readonly: "readOnly", - colspan: "colSpan", - frameborder: "frameBorder", - rowspan: "rowSpan", - valuetype: "valueType" - }; - - exports.get = function getProp(/*DOMNode|String*/node, /*String*/name){ - node = dom.byId(node); - var lc = name.toLowerCase(), propName = exports.names[lc] || name; - return node[propName]; // Anything - }; - - exports.set = function setProp(/*DOMNode|String*/node, /*String|Object*/name, /*String?*/value){ - node = dom.byId(node); - var l = arguments.length; - if(l == 2 && typeof name != "string"){ // inline'd type check - // the object form of setter: the 2nd argument is a dictionary - for(var x in name){ - exports.set(node, x, name[x]); - } - return node; // DomNode - } - var lc = name.toLowerCase(), propName = exports.names[lc] || name; - if(propName == "style" && typeof value != "string"){ // inline'd type check - // special case: setting a style - style.style(node, value); - return node; // DomNode - } - if(propName == "innerHTML"){ - // special case: assigning HTML - if(has("ie") && node.tagName.toLowerCase() in _roInnerHtml){ - ctr.empty(node); - node.appendChild(ctr.toDom(value, node.ownerDocument)); - }else{ - node[propName] = value; - } - return node; // DomNode - } - if(lang.isFunction(value)){ - // special case: assigning an event handler - // clobber if we can - var attrId = node[_attrId]; - if(!attrId){ - attrId = _ctr++; - node[_attrId] = attrId; - } - if(!_evtHdlrMap[attrId]){ - _evtHdlrMap[attrId] = {}; - } - var h = _evtHdlrMap[attrId][propName]; - if(h){ - //h.remove(); - conn.disconnect(h); - }else{ - try{ - delete node[propName]; - }catch(e){} - } - // ensure that event objects are normalized, etc. - if(value){ - //_evtHdlrMap[attrId][propName] = on(node, propName, value); - _evtHdlrMap[attrId][propName] = conn.connect(node, propName, value); - }else{ - node[propName] = null; - } - return node; // DomNode - } - node[propName] = value; - return node; // DomNode - }; -}); - -}, -'dojo/dom-attr':function(){ -define(["exports", "./_base/sniff", "./_base/lang", "./dom", "./dom-style", "./dom-prop"], - function(exports, has, lang, dom, style, prop){ - // module: - // dojo/dom-attr - // summary: - // This module defines the core dojo DOM attributes API. - - // ============================= - // Element attribute Functions - // ============================= - - // This module will be obsolete soon. Use dojo.prop instead. - - // dojo.attr() should conform to http://www.w3.org/TR/DOM-Level-2-Core/ - - // attribute-related functions (to be obsolete soon) - - /*===== - dojo.hasAttr = function(node, name){ - // summary: - // Returns true if the requested attribute is specified on the - // given element, and false otherwise. - // node: DOMNode|String - // id or reference to the element to check - // name: String - // the name of the attribute - // returns: Boolean - // true if the requested attribute is specified on the - // given element, and false otherwise - }; - =====*/ - - /*===== - dojo.getAttr = function(node, name){ - // summary: - // Gets an attribute on an HTML element. - // description: - // Handles normalized getting of attributes on DOM Nodes. - // node: DOMNode|String - // id or reference to the element to get the attribute on - // name: String - // the name of the attribute to get. - // returns: - // the value of the requested attribute or null if that attribute does not have a specified or - // default value; - // - // example: - // | // get the current value of the "foo" attribute on a node - // | dojo.getAttr(dojo.byId("nodeId"), "foo"); - // | // or we can just pass the id: - // | dojo.getAttr("nodeId", "foo"); - }; - =====*/ - - /*===== - dojo.setAttr = function(node, name, value){ - // summary: - // Sets an attribute on an HTML element. - // description: - // Handles normalized setting of attributes on DOM Nodes. - // - // 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 set the attribute on - // name: String|Object - // the name of the attribute to set, or a hash of key-value pairs to set. - // value: String? - // the value to set for the attribute, if the name is a string. - // returns: - // the DOM node - // - // example: - // | // use attr() to set the tab index - // | dojo.setAttr("nodeId", "tabIndex", 3); - // - // example: - // Set multiple values at once, including event handlers: - // | dojo.setAttr("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.setAttr("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.setAttr("someNode", "style", obj); - // | - // | // though shorter to use `dojo.style()` in this case: - // | dojo.setStyle("someNode", obj); - }; - =====*/ - - /*===== - dojo.removeAttr = function(node, name){ - // summary: - // Removes an attribute from an HTML element. - // node: DOMNode|String - // id or reference to the element to remove the attribute from - // name: String - // the name of the attribute to remove - }; - =====*/ - - /*===== - dojo.getNodeProp = function(node, name){ - // summary: - // Returns an effective value of a property or an attribute. - // node: DOMNode|String - // id or reference to the element to remove the attribute from - // name: String - // the name of the attribute - // returns: - // the value of the attribute - }; - =====*/ - - var forcePropNames = { - innerHTML: 1, - className: 1, - htmlFor: has("ie"), - value: 1 - }, - attrNames = { - // original attribute names - classname: "class", - htmlfor: "for", - // for IE - tabindex: "tabIndex", - readonly: "readOnly" - }; - - function _hasAttr(node, name){ - var attr = node.getAttributeNode && node.getAttributeNode(name); - return attr && attr.specified; // Boolean - } - - // There is a difference in the presence of certain properties and their default values - // between browsers. For example, on IE "disabled" is present on all elements, - // but it is value is "false"; "tabIndex" of
returns 0 by default on IE, yet other browsers - // can return -1. - - exports.has = function hasAttr(/*DOMNode|String*/node, /*String*/name){ - var lc = name.toLowerCase(); - return forcePropNames[prop.names[lc] || name] || _hasAttr(dom.byId(node), attrNames[lc] || name); // Boolean - }; - - exports.get = function getAttr(/*DOMNode|String*/node, /*String*/name){ - node = dom.byId(node); - var lc = name.toLowerCase(), - propName = prop.names[lc] || name, - forceProp = forcePropNames[propName]; - // should we access this attribute via a property or via getAttribute()? - value = node[propName]; - if(forceProp && typeof value != "undefined"){ - // node's property - return value; // Anything - } - if(propName != "href" && (typeof value == "boolean" || lang.isFunction(value))){ - // node's property - return value; // Anything - } - // node's attribute - // we need _hasAttr() here to guard against IE returning a default value - var attrName = attrNames[lc] || name; - return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything - }; - - exports.set = function setAttr(/*DOMNode|String*/node, /*String|Object*/name, /*String?*/value){ - node = dom.byId(node); - if(arguments.length == 2){ // inline'd type check - // the object form of setter: the 2nd argument is a dictionary - for(var x in name){ - exports.set(node, x, name[x]); - } - return node; // DomNode - } - var lc = name.toLowerCase(), - propName = prop.names[lc] || name, - forceProp = forcePropNames[propName]; - if(propName == "style" && typeof value != "string"){ // inline'd type check - // special case: setting a style - style.set(node, value); - return node; // DomNode - } - if(forceProp || typeof value == "boolean" || lang.isFunction(value)){ - return prop.set(node, name, value) - } - // node's attribute - node.setAttribute(attrNames[lc] || name, value); - return node; // DomNode - }; - - exports.remove = function removeAttr(/*DOMNode|String*/ node, /*String*/ name){ - dom.byId(node).removeAttribute(attrNames[name.toLowerCase()] || name); - }; - - exports.getNodeProp = function getNodeProp(/*DomNode|String*/ node, /*String*/ name){ - node = dom.byId(node); - var lc = name.toLowerCase(), propName = prop.names[lc] || name; - if((propName in node) && propName != "href"){ - // node's property - return node[propName]; // Anything - } - // node's attribute - var attrName = attrNames[lc] || name; - return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything - }; -}); - -}, -'dojo/dom-construct':function(){ -define("dojo/dom-construct", ["exports", "./_base/kernel", "./_base/sniff", "./_base/window", "./dom", "./dom-attr", "./on"], - function(exports, dojo, has, win, dom, attr, on){ - // module: - // dojo/dom-construct - // summary: - // This module defines the core dojo DOM construction API. - - /*===== - dojo.toDom = function(frag, doc){ - // summary: - // instantiates an HTML fragment returning the corresponding DOM. - // frag: String - // the HTML fragment - // doc: DocumentNode? - // optional document to use when creating DOM nodes, defaults to - // dojo.doc if not specified. - // returns: DocumentFragment - // - // example: - // Create a table row: - // | var tr = dojo.toDom("First!"); - }; - =====*/ - - /*===== - dojo._toDom = function(frag, doc){ - // summary: - // Existing alias for `dojo.toDom`. Deprecated, will be removed in 2.0. - }; - =====*/ - - /*===== - dojo.place = function(node, refNode, position){ - // summary: - // Attempt to insert node into the DOM, choosing from various positioning options. - // Returns the first argument resolved to a DOM node. - // - // node: DOMNode|String - // id or node reference, or HTML fragment starting with "<" to place relative to refNode - // - // refNode: DOMNode|String - // id or node reference to use as basis for placement - // - // position: String|Number? - // string noting the position of node relative to refNode or a - // number indicating the location in the childNodes collection of refNode. - // Accepted string values are: - // | * before - // | * after - // | * replace - // | * only - // | * first - // | * last - // "first" and "last" indicate positions as children of refNode, "replace" replaces refNode, - // "only" replaces all children. position defaults to "last" if not specified - // - // returns: DOMNode - // Returned values is the first argument resolved to a DOM node. - // - // .place() is also a method of `dojo.NodeList`, allowing `dojo.query` node lookups. - // - // example: - // Place a node by string id as the last child of another node by string id: - // | dojo.place("someNode", "anotherNode"); - // - // example: - // Place a node by string id before another node by string id - // | dojo.place("someNode", "anotherNode", "before"); - // - // example: - // Create a Node, and place it in the body element (last child): - // | dojo.place("
", dojo.body()); - // - // example: - // Put a new LI as the first child of a list by id: - // | dojo.place("
  • ", "someUl", "first"); - }; - =====*/ - - /*===== - dojo.create = function(tag, attrs, refNode, pos){ - // summary: - // Create an element, allowing for optional attribute decoration - // and placement. - // - // description: - // A DOM Element creation function. A shorthand method for creating a node or - // a fragment, and allowing for a convenient optional attribute setting step, - // as well as an optional DOM placement reference. - //| - // Attributes are set by passing the optional object through `dojo.setAttr`. - // See `dojo.setAttr` for noted caveats and nuances, and API if applicable. - //| - // Placement is done via `dojo.place`, assuming the new node to be the action - // node, passing along the optional reference node and position. - // - // tag: DOMNode|String - // A string of the element to create (eg: "div", "a", "p", "li", "script", "br"), - // or an existing DOM node to process. - // - // attrs: Object - // An object-hash of attributes to set on the newly created node. - // Can be null, if you don't want to set any attributes/styles. - // See: `dojo.setAttr` for a description of available attributes. - // - // refNode: DOMNode?|String? - // Optional reference node. Used by `dojo.place` to place the newly created - // node somewhere in the dom relative to refNode. Can be a DomNode reference - // or String ID of a node. - // - // pos: String? - // Optional positional reference. Defaults to "last" by way of `dojo.place`, - // though can be set to "first","after","before","last", "replace" or "only" - // to further control the placement of the new node relative to the refNode. - // 'refNode' is required if a 'pos' is specified. - // - // returns: DOMNode - // - // example: - // Create a DIV: - // | var n = dojo.create("div"); - // - // example: - // Create a DIV with content: - // | var n = dojo.create("div", { innerHTML:"

    hi

    " }); - // - // example: - // Place a new DIV in the BODY, with no attributes set - // | var n = dojo.create("div", null, dojo.body()); - // - // example: - // Create an UL, and populate it with LI's. Place the list as the first-child of a - // node with id="someId": - // | var ul = dojo.create("ul", null, "someId", "first"); - // | var items = ["one", "two", "three", "four"]; - // | dojo.forEach(items, function(data){ - // | dojo.create("li", { innerHTML: data }, ul); - // | }); - // - // example: - // Create an anchor, with an href. Place in BODY: - // | dojo.create("a", { href:"foo.html", title:"Goto FOO!" }, dojo.body()); - // - // example: - // Create a `dojo.NodeList()` from a new element (for syntatic sugar): - // | dojo.query(dojo.create('div')) - // | .addClass("newDiv") - // | .onclick(function(e){ console.log('clicked', e.target) }) - // | .place("#someNode"); // redundant, but cleaner. - }; - =====*/ - - /*===== - dojo.empty = function(node){ - // summary: - // safely removes all children of the node. - // node: DOMNode|String - // a reference to a DOM node or an id. - // example: - // Destroy node's children byId: - // | dojo.empty("someId"); - // - // example: - // Destroy all nodes' children in a list by reference: - // | dojo.query(".someNode").forEach(dojo.empty); - } - =====*/ - - /*===== - dojo.destroy = function(node){ - // summary: - // Removes a node from its parent, clobbering it and all of its - // children. - // - // description: - // Removes a node from its parent, clobbering it and all of its - // children. Function only works with DomNodes, and returns nothing. - // - // node: DOMNode|String - // A String ID or DomNode reference of the element to be destroyed - // - // example: - // Destroy a node byId: - // | dojo.destroy("someId"); - // - // example: - // Destroy all nodes in a list by reference: - // | dojo.query(".someNode").forEach(dojo.destroy); - }; - =====*/ - - /*===== - dojo._destroyElement = function(node){ - // summary: - // Existing alias for `dojo.destroy`. Deprecated, will be removed in 2.0. - }; - =====*/ - - // support stuff for dojo.toDom - var tagWrap = { - option: ["select"], - tbody: ["table"], - thead: ["table"], - tfoot: ["table"], - tr: ["table", "tbody"], - td: ["table", "tbody", "tr"], - th: ["table", "thead", "tr"], - legend: ["fieldset"], - caption: ["table"], - colgroup: ["table"], - col: ["table", "colgroup"], - li: ["ul"] - }, - reTag = /<\s*([\w\:]+)/, - masterNode = {}, masterNum = 0, - masterName = "__" + dojo._scopeName + "ToDomId"; - - // generate start/end tag strings to use - // for the injection for each special tag wrap case. - for(var param in tagWrap){ - if(tagWrap.hasOwnProperty(param)){ - var tw = tagWrap[param]; - tw.pre = param == "option" ? '