Merge Speedometer 2.0 fixes up to r217121 to browserbench.org
[WebKit-https.git] / Websites / browserbench.org / Speedometer2.0 / resources / todomvc / dependency-examples / flight / flight / node_modules / requirejs / require.js
1 /** vim: et:ts=4:sw=4:sts=4
2  * @license RequireJS 2.3.3 Copyright jQuery Foundation and other contributors.
3  * Released under MIT license, https://github.com/requirejs/requirejs/blob/master/LICENSE
4  */
5 //Not using strict: uneven strict support in browsers, #392, and causes
6 //problems with requirejs.exec()/transpiler plugins that may not be strict.
7 /*jslint regexp: true, nomen: true, sloppy: true */
8 /*global window, navigator, document, importScripts, setTimeout, opera */
9
10 var requirejs, require, define;
11 (function (global, setTimeout) {
12     var req, s, head, baseElement, dataMain, src,
13         interactiveScript, currentlyAddingScript, mainScript, subPath,
14         version = '2.3.3',
15         commentRegExp = /\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/mg,
16         cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
17         jsSuffixRegExp = /\.js$/,
18         currDirRegExp = /^\.\//,
19         op = Object.prototype,
20         ostring = op.toString,
21         hasOwn = op.hasOwnProperty,
22         isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document),
23         isWebWorker = !isBrowser && typeof importScripts !== 'undefined',
24         //PS3 indicates loaded and complete, but need to wait for complete
25         //specifically. Sequence is 'loading', 'loaded', execution,
26         // then 'complete'. The UA check is unfortunate, but not sure how
27         //to feature test w/o causing perf issues.
28         readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?
29                       /^complete$/ : /^(complete|loaded)$/,
30         defContextName = '_',
31         //Oh the tragedy, detecting opera. See the usage of isOpera for reason.
32         isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]',
33         contexts = {},
34         cfg = {},
35         globalDefQueue = [],
36         useInteractive = false;
37
38     //Could match something like ')//comment', do not lose the prefix to comment.
39     function commentReplace(match, singlePrefix) {
40         return singlePrefix || '';
41     }
42
43     function isFunction(it) {
44         return ostring.call(it) === '[object Function]';
45     }
46
47     function isArray(it) {
48         return ostring.call(it) === '[object Array]';
49     }
50
51     /**
52      * Helper function for iterating over an array. If the func returns
53      * a true value, it will break out of the loop.
54      */
55     function each(ary, func) {
56         if (ary) {
57             var i;
58             for (i = 0; i < ary.length; i += 1) {
59                 if (ary[i] && func(ary[i], i, ary)) {
60                     break;
61                 }
62             }
63         }
64     }
65
66     /**
67      * Helper function for iterating over an array backwards. If the func
68      * returns a true value, it will break out of the loop.
69      */
70     function eachReverse(ary, func) {
71         if (ary) {
72             var i;
73             for (i = ary.length - 1; i > -1; i -= 1) {
74                 if (ary[i] && func(ary[i], i, ary)) {
75                     break;
76                 }
77             }
78         }
79     }
80
81     function hasProp(obj, prop) {
82         return hasOwn.call(obj, prop);
83     }
84
85     function getOwn(obj, prop) {
86         return hasProp(obj, prop) && obj[prop];
87     }
88
89     /**
90      * Cycles over properties in an object and calls a function for each
91      * property value. If the function returns a truthy value, then the
92      * iteration is stopped.
93      */
94     function eachProp(obj, func) {
95         var prop;
96         for (prop in obj) {
97             if (hasProp(obj, prop)) {
98                 if (func(obj[prop], prop)) {
99                     break;
100                 }
101             }
102         }
103     }
104
105     /**
106      * Simple function to mix in properties from source into target,
107      * but only if target does not already have a property of the same name.
108      */
109     function mixin(target, source, force, deepStringMixin) {
110         if (source) {
111             eachProp(source, function (value, prop) {
112                 if (force || !hasProp(target, prop)) {
113                     if (deepStringMixin && typeof value === 'object' && value &&
114                         !isArray(value) && !isFunction(value) &&
115                         !(value instanceof RegExp)) {
116
117                         if (!target[prop]) {
118                             target[prop] = {};
119                         }
120                         mixin(target[prop], value, force, deepStringMixin);
121                     } else {
122                         target[prop] = value;
123                     }
124                 }
125             });
126         }
127         return target;
128     }
129
130     //Similar to Function.prototype.bind, but the 'this' object is specified
131     //first, since it is easier to read/figure out what 'this' will be.
132     function bind(obj, fn) {
133         return function () {
134             return fn.apply(obj, arguments);
135         };
136     }
137
138     function scripts() {
139         return document.getElementsByTagName('script');
140     }
141
142     function defaultOnError(err) {
143         throw err;
144     }
145
146     //Allow getting a global that is expressed in
147     //dot notation, like 'a.b.c'.
148     function getGlobal(value) {
149         if (!value) {
150             return value;
151         }
152         var g = global;
153         each(value.split('.'), function (part) {
154             g = g[part];
155         });
156         return g;
157     }
158
159     /**
160      * Constructs an error with a pointer to an URL with more information.
161      * @param {String} id the error ID that maps to an ID on a web page.
162      * @param {String} message human readable error.
163      * @param {Error} [err] the original error, if there is one.
164      *
165      * @returns {Error}
166      */
167     function makeError(id, msg, err, requireModules) {
168         var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#' + id);
169         e.requireType = id;
170         e.requireModules = requireModules;
171         if (err) {
172             e.originalError = err;
173         }
174         return e;
175     }
176
177     if (typeof define !== 'undefined') {
178         //If a define is already in play via another AMD loader,
179         //do not overwrite.
180         return;
181     }
182
183     if (typeof requirejs !== 'undefined') {
184         if (isFunction(requirejs)) {
185             //Do not overwrite an existing requirejs instance.
186             return;
187         }
188         cfg = requirejs;
189         requirejs = undefined;
190     }
191
192     //Allow for a require config object
193     if (typeof require !== 'undefined' && !isFunction(require)) {
194         //assume it is a config object.
195         cfg = require;
196         require = undefined;
197     }
198
199     function newContext(contextName) {
200         var inCheckLoaded, Module, context, handlers,
201             checkLoadedTimeoutId,
202             config = {
203                 //Defaults. Do not set a default for map
204                 //config to speed up normalize(), which
205                 //will run faster if there is no default.
206                 waitSeconds: 7,
207                 baseUrl: './',
208                 paths: {},
209                 bundles: {},
210                 pkgs: {},
211                 shim: {},
212                 config: {}
213             },
214             registry = {},
215             //registry of just enabled modules, to speed
216             //cycle breaking code when lots of modules
217             //are registered, but not activated.
218             enabledRegistry = {},
219             undefEvents = {},
220             defQueue = [],
221             defined = {},
222             urlFetched = {},
223             bundlesMap = {},
224             requireCounter = 1,
225             unnormalizedCounter = 1;
226
227         /**
228          * Trims the . and .. from an array of path segments.
229          * It will keep a leading path segment if a .. will become
230          * the first path segment, to help with module name lookups,
231          * which act like paths, but can be remapped. But the end result,
232          * all paths that use this function should look normalized.
233          * NOTE: this method MODIFIES the input array.
234          * @param {Array} ary the array of path segments.
235          */
236         function trimDots(ary) {
237             var i, part;
238             for (i = 0; i < ary.length; i++) {
239                 part = ary[i];
240                 if (part === '.') {
241                     ary.splice(i, 1);
242                     i -= 1;
243                 } else if (part === '..') {
244                     // If at the start, or previous value is still ..,
245                     // keep them so that when converted to a path it may
246                     // still work when converted to a path, even though
247                     // as an ID it is less than ideal. In larger point
248                     // releases, may be better to just kick out an error.
249                     if (i === 0 || (i === 1 && ary[2] === '..') || ary[i - 1] === '..') {
250                         continue;
251                     } else if (i > 0) {
252                         ary.splice(i - 1, 2);
253                         i -= 2;
254                     }
255                 }
256             }
257         }
258
259         /**
260          * Given a relative module name, like ./something, normalize it to
261          * a real name that can be mapped to a path.
262          * @param {String} name the relative name
263          * @param {String} baseName a real name that the name arg is relative
264          * to.
265          * @param {Boolean} applyMap apply the map config to the value. Should
266          * only be done if this normalization is for a dependency ID.
267          * @returns {String} normalized name
268          */
269         function normalize(name, baseName, applyMap) {
270             var pkgMain, mapValue, nameParts, i, j, nameSegment, lastIndex,
271                 foundMap, foundI, foundStarMap, starI, normalizedBaseParts,
272                 baseParts = (baseName && baseName.split('/')),
273                 map = config.map,
274                 starMap = map && map['*'];
275
276             //Adjust any relative paths.
277             if (name) {
278                 name = name.split('/');
279                 lastIndex = name.length - 1;
280
281                 // If wanting node ID compatibility, strip .js from end
282                 // of IDs. Have to do this here, and not in nameToUrl
283                 // because node allows either .js or non .js to map
284                 // to same file.
285                 if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
286                     name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
287                 }
288
289                 // Starts with a '.' so need the baseName
290                 if (name[0].charAt(0) === '.' && baseParts) {
291                     //Convert baseName to array, and lop off the last part,
292                     //so that . matches that 'directory' and not name of the baseName's
293                     //module. For instance, baseName of 'one/two/three', maps to
294                     //'one/two/three.js', but we want the directory, 'one/two' for
295                     //this normalization.
296                     normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);
297                     name = normalizedBaseParts.concat(name);
298                 }
299
300                 trimDots(name);
301                 name = name.join('/');
302             }
303
304             //Apply map config if available.
305             if (applyMap && map && (baseParts || starMap)) {
306                 nameParts = name.split('/');
307
308                 outerLoop: for (i = nameParts.length; i > 0; i -= 1) {
309                     nameSegment = nameParts.slice(0, i).join('/');
310
311                     if (baseParts) {
312                         //Find the longest baseName segment match in the config.
313                         //So, do joins on the biggest to smallest lengths of baseParts.
314                         for (j = baseParts.length; j > 0; j -= 1) {
315                             mapValue = getOwn(map, baseParts.slice(0, j).join('/'));
316
317                             //baseName segment has config, find if it has one for
318                             //this name.
319                             if (mapValue) {
320                                 mapValue = getOwn(mapValue, nameSegment);
321                                 if (mapValue) {
322                                     //Match, update name to the new value.
323                                     foundMap = mapValue;
324                                     foundI = i;
325                                     break outerLoop;
326                                 }
327                             }
328                         }
329                     }
330
331                     //Check for a star map match, but just hold on to it,
332                     //if there is a shorter segment match later in a matching
333                     //config, then favor over this star map.
334                     if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) {
335                         foundStarMap = getOwn(starMap, nameSegment);
336                         starI = i;
337                     }
338                 }
339
340                 if (!foundMap && foundStarMap) {
341                     foundMap = foundStarMap;
342                     foundI = starI;
343                 }
344
345                 if (foundMap) {
346                     nameParts.splice(0, foundI, foundMap);
347                     name = nameParts.join('/');
348                 }
349             }
350
351             // If the name points to a package's name, use
352             // the package main instead.
353             pkgMain = getOwn(config.pkgs, name);
354
355             return pkgMain ? pkgMain : name;
356         }
357
358         function removeScript(name) {
359             if (isBrowser) {
360                 each(scripts(), function (scriptNode) {
361                     if (scriptNode.getAttribute('data-requiremodule') === name &&
362                             scriptNode.getAttribute('data-requirecontext') === context.contextName) {
363                         scriptNode.parentNode.removeChild(scriptNode);
364                         return true;
365                     }
366                 });
367             }
368         }
369
370         function hasPathFallback(id) {
371             var pathConfig = getOwn(config.paths, id);
372             if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) {
373                 //Pop off the first array value, since it failed, and
374                 //retry
375                 pathConfig.shift();
376                 context.require.undef(id);
377
378                 //Custom require that does not do map translation, since
379                 //ID is "absolute", already mapped/resolved.
380                 context.makeRequire(null, {
381                     skipMap: true
382                 })([id]);
383
384                 return true;
385             }
386         }
387
388         //Turns a plugin!resource to [plugin, resource]
389         //with the plugin being undefined if the name
390         //did not have a plugin prefix.
391         function splitPrefix(name) {
392             var prefix,
393                 index = name ? name.indexOf('!') : -1;
394             if (index > -1) {
395                 prefix = name.substring(0, index);
396                 name = name.substring(index + 1, name.length);
397             }
398             return [prefix, name];
399         }
400
401         /**
402          * Creates a module mapping that includes plugin prefix, module
403          * name, and path. If parentModuleMap is provided it will
404          * also normalize the name via require.normalize()
405          *
406          * @param {String} name the module name
407          * @param {String} [parentModuleMap] parent module map
408          * for the module name, used to resolve relative names.
409          * @param {Boolean} isNormalized: is the ID already normalized.
410          * This is true if this call is done for a define() module ID.
411          * @param {Boolean} applyMap: apply the map config to the ID.
412          * Should only be true if this map is for a dependency.
413          *
414          * @returns {Object}
415          */
416         function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {
417             var url, pluginModule, suffix, nameParts,
418                 prefix = null,
419                 parentName = parentModuleMap ? parentModuleMap.name : null,
420                 originalName = name,
421                 isDefine = true,
422                 normalizedName = '';
423
424             //If no name, then it means it is a require call, generate an
425             //internal name.
426             if (!name) {
427                 isDefine = false;
428                 name = '_@r' + (requireCounter += 1);
429             }
430
431             nameParts = splitPrefix(name);
432             prefix = nameParts[0];
433             name = nameParts[1];
434
435             if (prefix) {
436                 prefix = normalize(prefix, parentName, applyMap);
437                 pluginModule = getOwn(defined, prefix);
438             }
439
440             //Account for relative paths if there is a base name.
441             if (name) {
442                 if (prefix) {
443                     if (isNormalized) {
444                         normalizedName = name;
445                     } else if (pluginModule && pluginModule.normalize) {
446                         //Plugin is loaded, use its normalize method.
447                         normalizedName = pluginModule.normalize(name, function (name) {
448                             return normalize(name, parentName, applyMap);
449                         });
450                     } else {
451                         // If nested plugin references, then do not try to
452                         // normalize, as it will not normalize correctly. This
453                         // places a restriction on resourceIds, and the longer
454                         // term solution is not to normalize until plugins are
455                         // loaded and all normalizations to allow for async
456                         // loading of a loader plugin. But for now, fixes the
457                         // common uses. Details in #1131
458                         normalizedName = name.indexOf('!') === -1 ?
459                                          normalize(name, parentName, applyMap) :
460                                          name;
461                     }
462                 } else {
463                     //A regular module.
464                     normalizedName = normalize(name, parentName, applyMap);
465
466                     //Normalized name may be a plugin ID due to map config
467                     //application in normalize. The map config values must
468                     //already be normalized, so do not need to redo that part.
469                     nameParts = splitPrefix(normalizedName);
470                     prefix = nameParts[0];
471                     normalizedName = nameParts[1];
472                     isNormalized = true;
473
474                     url = context.nameToUrl(normalizedName);
475                 }
476             }
477
478             //If the id is a plugin id that cannot be determined if it needs
479             //normalization, stamp it with a unique ID so two matching relative
480             //ids that may conflict can be separate.
481             suffix = prefix && !pluginModule && !isNormalized ?
482                      '_unnormalized' + (unnormalizedCounter += 1) :
483                      '';
484
485             return {
486                 prefix: prefix,
487                 name: normalizedName,
488                 parentMap: parentModuleMap,
489                 unnormalized: !!suffix,
490                 url: url,
491                 originalName: originalName,
492                 isDefine: isDefine,
493                 id: (prefix ?
494                         prefix + '!' + normalizedName :
495                         normalizedName) + suffix
496             };
497         }
498
499         function getModule(depMap) {
500             var id = depMap.id,
501                 mod = getOwn(registry, id);
502
503             if (!mod) {
504                 mod = registry[id] = new context.Module(depMap);
505             }
506
507             return mod;
508         }
509
510         function on(depMap, name, fn) {
511             var id = depMap.id,
512                 mod = getOwn(registry, id);
513
514             if (hasProp(defined, id) &&
515                     (!mod || mod.defineEmitComplete)) {
516                 if (name === 'defined') {
517                     fn(defined[id]);
518                 }
519             } else {
520                 mod = getModule(depMap);
521                 if (mod.error && name === 'error') {
522                     fn(mod.error);
523                 } else {
524                     mod.on(name, fn);
525                 }
526             }
527         }
528
529         function onError(err, errback) {
530             var ids = err.requireModules,
531                 notified = false;
532
533             if (errback) {
534                 errback(err);
535             } else {
536                 each(ids, function (id) {
537                     var mod = getOwn(registry, id);
538                     if (mod) {
539                         //Set error on module, so it skips timeout checks.
540                         mod.error = err;
541                         if (mod.events.error) {
542                             notified = true;
543                             mod.emit('error', err);
544                         }
545                     }
546                 });
547
548                 if (!notified) {
549                     req.onError(err);
550                 }
551             }
552         }
553
554         /**
555          * Internal method to transfer globalQueue items to this context's
556          * defQueue.
557          */
558         function takeGlobalQueue() {
559             //Push all the globalDefQueue items into the context's defQueue
560             if (globalDefQueue.length) {
561                 each(globalDefQueue, function(queueItem) {
562                     var id = queueItem[0];
563                     if (typeof id === 'string') {
564                         context.defQueueMap[id] = true;
565                     }
566                     defQueue.push(queueItem);
567                 });
568                 globalDefQueue = [];
569             }
570         }
571
572         handlers = {
573             'require': function (mod) {
574                 if (mod.require) {
575                     return mod.require;
576                 } else {
577                     return (mod.require = context.makeRequire(mod.map));
578                 }
579             },
580             'exports': function (mod) {
581                 mod.usingExports = true;
582                 if (mod.map.isDefine) {
583                     if (mod.exports) {
584                         return (defined[mod.map.id] = mod.exports);
585                     } else {
586                         return (mod.exports = defined[mod.map.id] = {});
587                     }
588                 }
589             },
590             'module': function (mod) {
591                 if (mod.module) {
592                     return mod.module;
593                 } else {
594                     return (mod.module = {
595                         id: mod.map.id,
596                         uri: mod.map.url,
597                         config: function () {
598                             return getOwn(config.config, mod.map.id) || {};
599                         },
600                         exports: mod.exports || (mod.exports = {})
601                     });
602                 }
603             }
604         };
605
606         function cleanRegistry(id) {
607             //Clean up machinery used for waiting modules.
608             delete registry[id];
609             delete enabledRegistry[id];
610         }
611
612         function breakCycle(mod, traced, processed) {
613             var id = mod.map.id;
614
615             if (mod.error) {
616                 mod.emit('error', mod.error);
617             } else {
618                 traced[id] = true;
619                 each(mod.depMaps, function (depMap, i) {
620                     var depId = depMap.id,
621                         dep = getOwn(registry, depId);
622
623                     //Only force things that have not completed
624                     //being defined, so still in the registry,
625                     //and only if it has not been matched up
626                     //in the module already.
627                     if (dep && !mod.depMatched[i] && !processed[depId]) {
628                         if (getOwn(traced, depId)) {
629                             mod.defineDep(i, defined[depId]);
630                             mod.check(); //pass false?
631                         } else {
632                             breakCycle(dep, traced, processed);
633                         }
634                     }
635                 });
636                 processed[id] = true;
637             }
638         }
639
640         function checkLoaded() {
641             var err, usingPathFallback,
642                 waitInterval = config.waitSeconds * 1000,
643                 //It is possible to disable the wait interval by using waitSeconds of 0.
644                 expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),
645                 noLoads = [],
646                 reqCalls = [],
647                 stillLoading = false,
648                 needCycleCheck = true;
649
650             //Do not bother if this call was a result of a cycle break.
651             if (inCheckLoaded) {
652                 return;
653             }
654
655             inCheckLoaded = true;
656
657             //Figure out the state of all the modules.
658             eachProp(enabledRegistry, function (mod) {
659                 var map = mod.map,
660                     modId = map.id;
661
662                 //Skip things that are not enabled or in error state.
663                 if (!mod.enabled) {
664                     return;
665                 }
666
667                 if (!map.isDefine) {
668                     reqCalls.push(mod);
669                 }
670
671                 if (!mod.error) {
672                     //If the module should be executed, and it has not
673                     //been inited and time is up, remember it.
674                     if (!mod.inited && expired) {
675                         if (hasPathFallback(modId)) {
676                             usingPathFallback = true;
677                             stillLoading = true;
678                         } else {
679                             noLoads.push(modId);
680                             removeScript(modId);
681                         }
682                     } else if (!mod.inited && mod.fetched && map.isDefine) {
683                         stillLoading = true;
684                         if (!map.prefix) {
685                             //No reason to keep looking for unfinished
686                             //loading. If the only stillLoading is a
687                             //plugin resource though, keep going,
688                             //because it may be that a plugin resource
689                             //is waiting on a non-plugin cycle.
690                             return (needCycleCheck = false);
691                         }
692                     }
693                 }
694             });
695
696             if (expired && noLoads.length) {
697                 //If wait time expired, throw error of unloaded modules.
698                 err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads);
699                 err.contextName = context.contextName;
700                 return onError(err);
701             }
702
703             //Not expired, check for a cycle.
704             if (needCycleCheck) {
705                 each(reqCalls, function (mod) {
706                     breakCycle(mod, {}, {});
707                 });
708             }
709
710             //If still waiting on loads, and the waiting load is something
711             //other than a plugin resource, or there are still outstanding
712             //scripts, then just try back later.
713             if ((!expired || usingPathFallback) && stillLoading) {
714                 //Something is still waiting to load. Wait for it, but only
715                 //if a timeout is not already in effect.
716                 if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {
717                     checkLoadedTimeoutId = setTimeout(function () {
718                         checkLoadedTimeoutId = 0;
719                         checkLoaded();
720                     }, 50);
721                     window.checkLoadedTimeoutId = checkLoadedTimeoutId;
722                 }
723             }
724
725             inCheckLoaded = false;
726         }
727
728         Module = function (map) {
729             this.events = getOwn(undefEvents, map.id) || {};
730             this.map = map;
731             this.shim = getOwn(config.shim, map.id);
732             this.depExports = [];
733             this.depMaps = [];
734             this.depMatched = [];
735             this.pluginMaps = {};
736             this.depCount = 0;
737
738             /* this.exports this.factory
739                this.depMaps = [],
740                this.enabled, this.fetched
741             */
742         };
743
744         Module.prototype = {
745             init: function (depMaps, factory, errback, options) {
746                 options = options || {};
747
748                 //Do not do more inits if already done. Can happen if there
749                 //are multiple define calls for the same module. That is not
750                 //a normal, common case, but it is also not unexpected.
751                 if (this.inited) {
752                     return;
753                 }
754
755                 this.factory = factory;
756
757                 if (errback) {
758                     //Register for errors on this module.
759                     this.on('error', errback);
760                 } else if (this.events.error) {
761                     //If no errback already, but there are error listeners
762                     //on this module, set up an errback to pass to the deps.
763                     errback = bind(this, function (err) {
764                         this.emit('error', err);
765                     });
766                 }
767
768                 //Do a copy of the dependency array, so that
769                 //source inputs are not modified. For example
770                 //"shim" deps are passed in here directly, and
771                 //doing a direct modification of the depMaps array
772                 //would affect that config.
773                 this.depMaps = depMaps && depMaps.slice(0);
774
775                 this.errback = errback;
776
777                 //Indicate this module has be initialized
778                 this.inited = true;
779
780                 this.ignore = options.ignore;
781
782                 //Could have option to init this module in enabled mode,
783                 //or could have been previously marked as enabled. However,
784                 //the dependencies are not known until init is called. So
785                 //if enabled previously, now trigger dependencies as enabled.
786                 if (options.enabled || this.enabled) {
787                     //Enable this module and dependencies.
788                     //Will call this.check()
789                     this.enable();
790                 } else {
791                     this.check();
792                 }
793             },
794
795             defineDep: function (i, depExports) {
796                 //Because of cycles, defined callback for a given
797                 //export can be called more than once.
798                 if (!this.depMatched[i]) {
799                     this.depMatched[i] = true;
800                     this.depCount -= 1;
801                     this.depExports[i] = depExports;
802                 }
803             },
804
805             fetch: function () {
806                 if (this.fetched) {
807                     return;
808                 }
809                 this.fetched = true;
810
811                 context.startTime = (new Date()).getTime();
812
813                 var map = this.map;
814
815                 //If the manager is for a plugin managed resource,
816                 //ask the plugin to load it now.
817                 if (this.shim) {
818                     context.makeRequire(this.map, {
819                         enableBuildCallback: true
820                     })(this.shim.deps || [], bind(this, function () {
821                         return map.prefix ? this.callPlugin() : this.load();
822                     }));
823                 } else {
824                     //Regular dependency.
825                     return map.prefix ? this.callPlugin() : this.load();
826                 }
827             },
828
829             load: function () {
830                 var url = this.map.url;
831
832                 //Regular dependency.
833                 if (!urlFetched[url]) {
834                     urlFetched[url] = true;
835                     context.load(this.map.id, url);
836                 }
837             },
838
839             /**
840              * Checks if the module is ready to define itself, and if so,
841              * define it.
842              */
843             check: function () {
844                 if (!this.enabled || this.enabling) {
845                     return;
846                 }
847
848                 var err, cjsModule,
849                     id = this.map.id,
850                     depExports = this.depExports,
851                     exports = this.exports,
852                     factory = this.factory;
853
854                 if (!this.inited) {
855                     // Only fetch if not already in the defQueue.
856                     if (!hasProp(context.defQueueMap, id)) {
857                         this.fetch();
858                     }
859                 } else if (this.error) {
860                     this.emit('error', this.error);
861                 } else if (!this.defining) {
862                     //The factory could trigger another require call
863                     //that would result in checking this module to
864                     //define itself again. If already in the process
865                     //of doing that, skip this work.
866                     this.defining = true;
867
868                     if (this.depCount < 1 && !this.defined) {
869                         if (isFunction(factory)) {
870                             //If there is an error listener, favor passing
871                             //to that instead of throwing an error. However,
872                             //only do it for define()'d  modules. require
873                             //errbacks should not be called for failures in
874                             //their callbacks (#699). However if a global
875                             //onError is set, use that.
876                             if ((this.events.error && this.map.isDefine) ||
877                                 req.onError !== defaultOnError) {
878                                 try {
879                                     exports = context.execCb(id, factory, depExports, exports);
880                                 } catch (e) {
881                                     err = e;
882                                 }
883                             } else {
884                                 exports = context.execCb(id, factory, depExports, exports);
885                             }
886
887                             // Favor return value over exports. If node/cjs in play,
888                             // then will not have a return value anyway. Favor
889                             // module.exports assignment over exports object.
890                             if (this.map.isDefine && exports === undefined) {
891                                 cjsModule = this.module;
892                                 if (cjsModule) {
893                                     exports = cjsModule.exports;
894                                 } else if (this.usingExports) {
895                                     //exports already set the defined value.
896                                     exports = this.exports;
897                                 }
898                             }
899
900                             if (err) {
901                                 err.requireMap = this.map;
902                                 err.requireModules = this.map.isDefine ? [this.map.id] : null;
903                                 err.requireType = this.map.isDefine ? 'define' : 'require';
904                                 return onError((this.error = err));
905                             }
906
907                         } else {
908                             //Just a literal value
909                             exports = factory;
910                         }
911
912                         this.exports = exports;
913
914                         if (this.map.isDefine && !this.ignore) {
915                             defined[id] = exports;
916
917                             if (req.onResourceLoad) {
918                                 var resLoadMaps = [];
919                                 each(this.depMaps, function (depMap) {
920                                     resLoadMaps.push(depMap.normalizedMap || depMap);
921                                 });
922                                 req.onResourceLoad(context, this.map, resLoadMaps);
923                             }
924                         }
925
926                         //Clean up
927                         cleanRegistry(id);
928
929                         this.defined = true;
930                     }
931
932                     //Finished the define stage. Allow calling check again
933                     //to allow define notifications below in the case of a
934                     //cycle.
935                     this.defining = false;
936
937                     if (this.defined && !this.defineEmitted) {
938                         this.defineEmitted = true;
939                         this.emit('defined', this.exports);
940                         this.defineEmitComplete = true;
941                     }
942
943                 }
944             },
945
946             callPlugin: function () {
947                 var map = this.map,
948                     id = map.id,
949                     //Map already normalized the prefix.
950                     pluginMap = makeModuleMap(map.prefix);
951
952                 //Mark this as a dependency for this plugin, so it
953                 //can be traced for cycles.
954                 this.depMaps.push(pluginMap);
955
956                 on(pluginMap, 'defined', bind(this, function (plugin) {
957                     var load, normalizedMap, normalizedMod,
958                         bundleId = getOwn(bundlesMap, this.map.id),
959                         name = this.map.name,
960                         parentName = this.map.parentMap ? this.map.parentMap.name : null,
961                         localRequire = context.makeRequire(map.parentMap, {
962                             enableBuildCallback: true
963                         });
964
965                     //If current map is not normalized, wait for that
966                     //normalized name to load instead of continuing.
967                     if (this.map.unnormalized) {
968                         //Normalize the ID if the plugin allows it.
969                         if (plugin.normalize) {
970                             name = plugin.normalize(name, function (name) {
971                                 return normalize(name, parentName, true);
972                             }) || '';
973                         }
974
975                         //prefix and name should already be normalized, no need
976                         //for applying map config again either.
977                         normalizedMap = makeModuleMap(map.prefix + '!' + name,
978                                                       this.map.parentMap,
979                                                       true);
980                         on(normalizedMap,
981                             'defined', bind(this, function (value) {
982                                 this.map.normalizedMap = normalizedMap;
983                                 this.init([], function () { return value; }, null, {
984                                     enabled: true,
985                                     ignore: true
986                                 });
987                             }));
988
989                         normalizedMod = getOwn(registry, normalizedMap.id);
990                         if (normalizedMod) {
991                             //Mark this as a dependency for this plugin, so it
992                             //can be traced for cycles.
993                             this.depMaps.push(normalizedMap);
994
995                             if (this.events.error) {
996                                 normalizedMod.on('error', bind(this, function (err) {
997                                     this.emit('error', err);
998                                 }));
999                             }
1000                             normalizedMod.enable();
1001                         }
1002
1003                         return;
1004                     }
1005
1006                     //If a paths config, then just load that file instead to
1007                     //resolve the plugin, as it is built into that paths layer.
1008                     if (bundleId) {
1009                         this.map.url = context.nameToUrl(bundleId);
1010                         this.load();
1011                         return;
1012                     }
1013
1014                     load = bind(this, function (value) {
1015                         this.init([], function () { return value; }, null, {
1016                             enabled: true
1017                         });
1018                     });
1019
1020                     load.error = bind(this, function (err) {
1021                         this.inited = true;
1022                         this.error = err;
1023                         err.requireModules = [id];
1024
1025                         //Remove temp unnormalized modules for this module,
1026                         //since they will never be resolved otherwise now.
1027                         eachProp(registry, function (mod) {
1028                             if (mod.map.id.indexOf(id + '_unnormalized') === 0) {
1029                                 cleanRegistry(mod.map.id);
1030                             }
1031                         });
1032
1033                         onError(err);
1034                     });
1035
1036                     //Allow plugins to load other code without having to know the
1037                     //context or how to 'complete' the load.
1038                     load.fromText = bind(this, function (text, textAlt) {
1039                         /*jslint evil: true */
1040                         var moduleName = map.name,
1041                             moduleMap = makeModuleMap(moduleName),
1042                             hasInteractive = useInteractive;
1043
1044                         //As of 2.1.0, support just passing the text, to reinforce
1045                         //fromText only being called once per resource. Still
1046                         //support old style of passing moduleName but discard
1047                         //that moduleName in favor of the internal ref.
1048                         if (textAlt) {
1049                             text = textAlt;
1050                         }
1051
1052                         //Turn off interactive script matching for IE for any define
1053                         //calls in the text, then turn it back on at the end.
1054                         if (hasInteractive) {
1055                             useInteractive = false;
1056                         }
1057
1058                         //Prime the system by creating a module instance for
1059                         //it.
1060                         getModule(moduleMap);
1061
1062                         //Transfer any config to this other module.
1063                         if (hasProp(config.config, id)) {
1064                             config.config[moduleName] = config.config[id];
1065                         }
1066
1067                         try {
1068                             req.exec(text);
1069                         } catch (e) {
1070                             return onError(makeError('fromtexteval',
1071                                              'fromText eval for ' + id +
1072                                             ' failed: ' + e,
1073                                              e,
1074                                              [id]));
1075                         }
1076
1077                         if (hasInteractive) {
1078                             useInteractive = true;
1079                         }
1080
1081                         //Mark this as a dependency for the plugin
1082                         //resource
1083                         this.depMaps.push(moduleMap);
1084
1085                         //Support anonymous modules.
1086                         context.completeLoad(moduleName);
1087
1088                         //Bind the value of that module to the value for this
1089                         //resource ID.
1090                         localRequire([moduleName], load);
1091                     });
1092
1093                     //Use parentName here since the plugin's name is not reliable,
1094                     //could be some weird string with no path that actually wants to
1095                     //reference the parentName's path.
1096                     plugin.load(map.name, localRequire, load, config);
1097                 }));
1098
1099                 context.enable(pluginMap, this);
1100                 this.pluginMaps[pluginMap.id] = pluginMap;
1101             },
1102
1103             enable: function () {
1104                 enabledRegistry[this.map.id] = this;
1105                 this.enabled = true;
1106
1107                 //Set flag mentioning that the module is enabling,
1108                 //so that immediate calls to the defined callbacks
1109                 //for dependencies do not trigger inadvertent load
1110                 //with the depCount still being zero.
1111                 this.enabling = true;
1112
1113                 //Enable each dependency
1114                 each(this.depMaps, bind(this, function (depMap, i) {
1115                     var id, mod, handler;
1116
1117                     if (typeof depMap === 'string') {
1118                         //Dependency needs to be converted to a depMap
1119                         //and wired up to this module.
1120                         depMap = makeModuleMap(depMap,
1121                                                (this.map.isDefine ? this.map : this.map.parentMap),
1122                                                false,
1123                                                !this.skipMap);
1124                         this.depMaps[i] = depMap;
1125
1126                         handler = getOwn(handlers, depMap.id);
1127
1128                         if (handler) {
1129                             this.depExports[i] = handler(this);
1130                             return;
1131                         }
1132
1133                         this.depCount += 1;
1134
1135                         on(depMap, 'defined', bind(this, function (depExports) {
1136                             if (this.undefed) {
1137                                 return;
1138                             }
1139                             this.defineDep(i, depExports);
1140                             this.check();
1141                         }));
1142
1143                         if (this.errback) {
1144                             on(depMap, 'error', bind(this, this.errback));
1145                         } else if (this.events.error) {
1146                             // No direct errback on this module, but something
1147                             // else is listening for errors, so be sure to
1148                             // propagate the error correctly.
1149                             on(depMap, 'error', bind(this, function(err) {
1150                                 this.emit('error', err);
1151                             }));
1152                         }
1153                     }
1154
1155                     id = depMap.id;
1156                     mod = registry[id];
1157
1158                     //Skip special modules like 'require', 'exports', 'module'
1159                     //Also, don't call enable if it is already enabled,
1160                     //important in circular dependency cases.
1161                     if (!hasProp(handlers, id) && mod && !mod.enabled) {
1162                         context.enable(depMap, this);
1163                     }
1164                 }));
1165
1166                 //Enable each plugin that is used in
1167                 //a dependency
1168                 eachProp(this.pluginMaps, bind(this, function (pluginMap) {
1169                     var mod = getOwn(registry, pluginMap.id);
1170                     if (mod && !mod.enabled) {
1171                         context.enable(pluginMap, this);
1172                     }
1173                 }));
1174
1175                 this.enabling = false;
1176
1177                 this.check();
1178             },
1179
1180             on: function (name, cb) {
1181                 var cbs = this.events[name];
1182                 if (!cbs) {
1183                     cbs = this.events[name] = [];
1184                 }
1185                 cbs.push(cb);
1186             },
1187
1188             emit: function (name, evt) {
1189                 each(this.events[name], function (cb) {
1190                     cb(evt);
1191                 });
1192                 if (name === 'error') {
1193                     //Now that the error handler was triggered, remove
1194                     //the listeners, since this broken Module instance
1195                     //can stay around for a while in the registry.
1196                     delete this.events[name];
1197                 }
1198             }
1199         };
1200
1201         function callGetModule(args) {
1202             //Skip modules already defined.
1203             if (!hasProp(defined, args[0])) {
1204                 getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]);
1205             }
1206         }
1207
1208         function removeListener(node, func, name, ieName) {
1209             //Favor detachEvent because of IE9
1210             //issue, see attachEvent/addEventListener comment elsewhere
1211             //in this file.
1212             if (node.detachEvent && !isOpera) {
1213                 //Probably IE. If not it will throw an error, which will be
1214                 //useful to know.
1215                 if (ieName) {
1216                     node.detachEvent(ieName, func);
1217                 }
1218             } else {
1219                 node.removeEventListener(name, func, false);
1220             }
1221         }
1222
1223         /**
1224          * Given an event from a script node, get the requirejs info from it,
1225          * and then removes the event listeners on the node.
1226          * @param {Event} evt
1227          * @returns {Object}
1228          */
1229         function getScriptData(evt) {
1230             //Using currentTarget instead of target for Firefox 2.0's sake. Not
1231             //all old browsers will be supported, but this one was easy enough
1232             //to support and still makes sense.
1233             var node = evt.currentTarget || evt.srcElement;
1234
1235             //Remove the listeners once here.
1236             removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange');
1237             removeListener(node, context.onScriptError, 'error');
1238
1239             return {
1240                 node: node,
1241                 id: node && node.getAttribute('data-requiremodule')
1242             };
1243         }
1244
1245         function intakeDefines() {
1246             var args;
1247
1248             //Any defined modules in the global queue, intake them now.
1249             takeGlobalQueue();
1250
1251             //Make sure any remaining defQueue items get properly processed.
1252             while (defQueue.length) {
1253                 args = defQueue.shift();
1254                 if (args[0] === null) {
1255                     return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' +
1256                         args[args.length - 1]));
1257                 } else {
1258                     //args are id, deps, factory. Should be normalized by the
1259                     //define() function.
1260                     callGetModule(args);
1261                 }
1262             }
1263             context.defQueueMap = {};
1264         }
1265
1266         context = {
1267             config: config,
1268             contextName: contextName,
1269             registry: registry,
1270             defined: defined,
1271             urlFetched: urlFetched,
1272             defQueue: defQueue,
1273             defQueueMap: {},
1274             Module: Module,
1275             makeModuleMap: makeModuleMap,
1276             nextTick: req.nextTick,
1277             onError: onError,
1278
1279             /**
1280              * Set a configuration for the context.
1281              * @param {Object} cfg config object to integrate.
1282              */
1283             configure: function (cfg) {
1284                 //Make sure the baseUrl ends in a slash.
1285                 if (cfg.baseUrl) {
1286                     if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') {
1287                         cfg.baseUrl += '/';
1288                     }
1289                 }
1290
1291                 // Convert old style urlArgs string to a function.
1292                 if (typeof cfg.urlArgs === 'string') {
1293                     var urlArgs = cfg.urlArgs;
1294                     cfg.urlArgs = function(id, url) {
1295                         return (url.indexOf('?') === -1 ? '?' : '&') + urlArgs;
1296                     };
1297                 }
1298
1299                 //Save off the paths since they require special processing,
1300                 //they are additive.
1301                 var shim = config.shim,
1302                     objs = {
1303                         paths: true,
1304                         bundles: true,
1305                         config: true,
1306                         map: true
1307                     };
1308
1309                 eachProp(cfg, function (value, prop) {
1310                     if (objs[prop]) {
1311                         if (!config[prop]) {
1312                             config[prop] = {};
1313                         }
1314                         mixin(config[prop], value, true, true);
1315                     } else {
1316                         config[prop] = value;
1317                     }
1318                 });
1319
1320                 //Reverse map the bundles
1321                 if (cfg.bundles) {
1322                     eachProp(cfg.bundles, function (value, prop) {
1323                         each(value, function (v) {
1324                             if (v !== prop) {
1325                                 bundlesMap[v] = prop;
1326                             }
1327                         });
1328                     });
1329                 }
1330
1331                 //Merge shim
1332                 if (cfg.shim) {
1333                     eachProp(cfg.shim, function (value, id) {
1334                         //Normalize the structure
1335                         if (isArray(value)) {
1336                             value = {
1337                                 deps: value
1338                             };
1339                         }
1340                         if ((value.exports || value.init) && !value.exportsFn) {
1341                             value.exportsFn = context.makeShimExports(value);
1342                         }
1343                         shim[id] = value;
1344                     });
1345                     config.shim = shim;
1346                 }
1347
1348                 //Adjust packages if necessary.
1349                 if (cfg.packages) {
1350                     each(cfg.packages, function (pkgObj) {
1351                         var location, name;
1352
1353                         pkgObj = typeof pkgObj === 'string' ? {name: pkgObj} : pkgObj;
1354
1355                         name = pkgObj.name;
1356                         location = pkgObj.location;
1357                         if (location) {
1358                             config.paths[name] = pkgObj.location;
1359                         }
1360
1361                         //Save pointer to main module ID for pkg name.
1362                         //Remove leading dot in main, so main paths are normalized,
1363                         //and remove any trailing .js, since different package
1364                         //envs have different conventions: some use a module name,
1365                         //some use a file name.
1366                         config.pkgs[name] = pkgObj.name + '/' + (pkgObj.main || 'main')
1367                                      .replace(currDirRegExp, '')
1368                                      .replace(jsSuffixRegExp, '');
1369                     });
1370                 }
1371
1372                 //If there are any "waiting to execute" modules in the registry,
1373                 //update the maps for them, since their info, like URLs to load,
1374                 //may have changed.
1375                 eachProp(registry, function (mod, id) {
1376                     //If module already has init called, since it is too
1377                     //late to modify them, and ignore unnormalized ones
1378                     //since they are transient.
1379                     if (!mod.inited && !mod.map.unnormalized) {
1380                         mod.map = makeModuleMap(id, null, true);
1381                     }
1382                 });
1383
1384                 //If a deps array or a config callback is specified, then call
1385                 //require with those args. This is useful when require is defined as a
1386                 //config object before require.js is loaded.
1387                 if (cfg.deps || cfg.callback) {
1388                     context.require(cfg.deps || [], cfg.callback);
1389                 }
1390             },
1391
1392             makeShimExports: function (value) {
1393                 function fn() {
1394                     var ret;
1395                     if (value.init) {
1396                         ret = value.init.apply(global, arguments);
1397                     }
1398                     return ret || (value.exports && getGlobal(value.exports));
1399                 }
1400                 return fn;
1401             },
1402
1403             makeRequire: function (relMap, options) {
1404                 options = options || {};
1405
1406                 function localRequire(deps, callback, errback) {
1407                     var id, map, requireMod;
1408
1409                     if (options.enableBuildCallback && callback && isFunction(callback)) {
1410                         callback.__requireJsBuild = true;
1411                     }
1412
1413                     if (typeof deps === 'string') {
1414                         if (isFunction(callback)) {
1415                             //Invalid call
1416                             return onError(makeError('requireargs', 'Invalid require call'), errback);
1417                         }
1418
1419                         //If require|exports|module are requested, get the
1420                         //value for them from the special handlers. Caveat:
1421                         //this only works while module is being defined.
1422                         if (relMap && hasProp(handlers, deps)) {
1423                             return handlers[deps](registry[relMap.id]);
1424                         }
1425
1426                         //Synchronous access to one module. If require.get is
1427                         //available (as in the Node adapter), prefer that.
1428                         if (req.get) {
1429                             return req.get(context, deps, relMap, localRequire);
1430                         }
1431
1432                         //Normalize module name, if it contains . or ..
1433                         map = makeModuleMap(deps, relMap, false, true);
1434                         id = map.id;
1435
1436                         if (!hasProp(defined, id)) {
1437                             return onError(makeError('notloaded', 'Module name "' +
1438                                         id +
1439                                         '" has not been loaded yet for context: ' +
1440                                         contextName +
1441                                         (relMap ? '' : '. Use require([])')));
1442                         }
1443                         return defined[id];
1444                     }
1445
1446                     //Grab defines waiting in the global queue.
1447                     intakeDefines();
1448
1449                     //Mark all the dependencies as needing to be loaded.
1450                     context.nextTick(function () {
1451                         //Some defines could have been added since the
1452                         //require call, collect them.
1453                         intakeDefines();
1454
1455                         requireMod = getModule(makeModuleMap(null, relMap));
1456
1457                         //Store if map config should be applied to this require
1458                         //call for dependencies.
1459                         requireMod.skipMap = options.skipMap;
1460
1461                         requireMod.init(deps, callback, errback, {
1462                             enabled: true
1463                         });
1464
1465                         checkLoaded();
1466                     });
1467
1468                     return localRequire;
1469                 }
1470
1471                 mixin(localRequire, {
1472                     isBrowser: isBrowser,
1473
1474                     /**
1475                      * Converts a module name + .extension into an URL path.
1476                      * *Requires* the use of a module name. It does not support using
1477                      * plain URLs like nameToUrl.
1478                      */
1479                     toUrl: function (moduleNamePlusExt) {
1480                         var ext,
1481                             index = moduleNamePlusExt.lastIndexOf('.'),
1482                             segment = moduleNamePlusExt.split('/')[0],
1483                             isRelative = segment === '.' || segment === '..';
1484
1485                         //Have a file extension alias, and it is not the
1486                         //dots from a relative path.
1487                         if (index !== -1 && (!isRelative || index > 1)) {
1488                             ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);
1489                             moduleNamePlusExt = moduleNamePlusExt.substring(0, index);
1490                         }
1491
1492                         return context.nameToUrl(normalize(moduleNamePlusExt,
1493                                                 relMap && relMap.id, true), ext,  true);
1494                     },
1495
1496                     defined: function (id) {
1497                         return hasProp(defined, makeModuleMap(id, relMap, false, true).id);
1498                     },
1499
1500                     specified: function (id) {
1501                         id = makeModuleMap(id, relMap, false, true).id;
1502                         return hasProp(defined, id) || hasProp(registry, id);
1503                     }
1504                 });
1505
1506                 //Only allow undef on top level require calls
1507                 if (!relMap) {
1508                     localRequire.undef = function (id) {
1509                         //Bind any waiting define() calls to this context,
1510                         //fix for #408
1511                         takeGlobalQueue();
1512
1513                         var map = makeModuleMap(id, relMap, true),
1514                             mod = getOwn(registry, id);
1515
1516                         mod.undefed = true;
1517                         removeScript(id);
1518
1519                         delete defined[id];
1520                         delete urlFetched[map.url];
1521                         delete undefEvents[id];
1522
1523                         //Clean queued defines too. Go backwards
1524                         //in array so that the splices do not
1525                         //mess up the iteration.
1526                         eachReverse(defQueue, function(args, i) {
1527                             if (args[0] === id) {
1528                                 defQueue.splice(i, 1);
1529                             }
1530                         });
1531                         delete context.defQueueMap[id];
1532
1533                         if (mod) {
1534                             //Hold on to listeners in case the
1535                             //module will be attempted to be reloaded
1536                             //using a different config.
1537                             if (mod.events.defined) {
1538                                 undefEvents[id] = mod.events;
1539                             }
1540
1541                             cleanRegistry(id);
1542                         }
1543                     };
1544                 }
1545
1546                 return localRequire;
1547             },
1548
1549             /**
1550              * Called to enable a module if it is still in the registry
1551              * awaiting enablement. A second arg, parent, the parent module,
1552              * is passed in for context, when this method is overridden by
1553              * the optimizer. Not shown here to keep code compact.
1554              */
1555             enable: function (depMap) {
1556                 var mod = getOwn(registry, depMap.id);
1557                 if (mod) {
1558                     getModule(depMap).enable();
1559                 }
1560             },
1561
1562             /**
1563              * Internal method used by environment adapters to complete a load event.
1564              * A load event could be a script load or just a load pass from a synchronous
1565              * load call.
1566              * @param {String} moduleName the name of the module to potentially complete.
1567              */
1568             completeLoad: function (moduleName) {
1569                 var found, args, mod,
1570                     shim = getOwn(config.shim, moduleName) || {},
1571                     shExports = shim.exports;
1572
1573                 takeGlobalQueue();
1574
1575                 while (defQueue.length) {
1576                     args = defQueue.shift();
1577                     if (args[0] === null) {
1578                         args[0] = moduleName;
1579                         //If already found an anonymous module and bound it
1580                         //to this name, then this is some other anon module
1581                         //waiting for its completeLoad to fire.
1582                         if (found) {
1583                             break;
1584                         }
1585                         found = true;
1586                     } else if (args[0] === moduleName) {
1587                         //Found matching define call for this script!
1588                         found = true;
1589                     }
1590
1591                     callGetModule(args);
1592                 }
1593                 context.defQueueMap = {};
1594
1595                 //Do this after the cycle of callGetModule in case the result
1596                 //of those calls/init calls changes the registry.
1597                 mod = getOwn(registry, moduleName);
1598
1599                 if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) {
1600                     if (config.enforceDefine && (!shExports || !getGlobal(shExports))) {
1601                         if (hasPathFallback(moduleName)) {
1602                             return;
1603                         } else {
1604                             return onError(makeError('nodefine',
1605                                              'No define call for ' + moduleName,
1606                                              null,
1607                                              [moduleName]));
1608                         }
1609                     } else {
1610                         //A script that does not call define(), so just simulate
1611                         //the call for it.
1612                         callGetModule([moduleName, (shim.deps || []), shim.exportsFn]);
1613                     }
1614                 }
1615
1616                 checkLoaded();
1617             },
1618
1619             /**
1620              * Converts a module name to a file path. Supports cases where
1621              * moduleName may actually be just an URL.
1622              * Note that it **does not** call normalize on the moduleName,
1623              * it is assumed to have already been normalized. This is an
1624              * internal API, not a public one. Use toUrl for the public API.
1625              */
1626             nameToUrl: function (moduleName, ext, skipExt) {
1627                 var paths, syms, i, parentModule, url,
1628                     parentPath, bundleId,
1629                     pkgMain = getOwn(config.pkgs, moduleName);
1630
1631                 if (pkgMain) {
1632                     moduleName = pkgMain;
1633                 }
1634
1635                 bundleId = getOwn(bundlesMap, moduleName);
1636
1637                 if (bundleId) {
1638                     return context.nameToUrl(bundleId, ext, skipExt);
1639                 }
1640
1641                 //If a colon is in the URL, it indicates a protocol is used and it is just
1642                 //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?)
1643                 //or ends with .js, then assume the user meant to use an url and not a module id.
1644                 //The slash is important for protocol-less URLs as well as full paths.
1645                 if (req.jsExtRegExp.test(moduleName)) {
1646                     //Just a plain path, not module name lookup, so just return it.
1647                     //Add extension if it is included. This is a bit wonky, only non-.js things pass
1648                     //an extension, this method probably needs to be reworked.
1649                     url = moduleName + (ext || '');
1650                 } else {
1651                     //A module that needs to be converted to a path.
1652                     paths = config.paths;
1653
1654                     syms = moduleName.split('/');
1655                     //For each module name segment, see if there is a path
1656                     //registered for it. Start with most specific name
1657                     //and work up from it.
1658                     for (i = syms.length; i > 0; i -= 1) {
1659                         parentModule = syms.slice(0, i).join('/');
1660
1661                         parentPath = getOwn(paths, parentModule);
1662                         if (parentPath) {
1663                             //If an array, it means there are a few choices,
1664                             //Choose the one that is desired
1665                             if (isArray(parentPath)) {
1666                                 parentPath = parentPath[0];
1667                             }
1668                             syms.splice(0, i, parentPath);
1669                             break;
1670                         }
1671                     }
1672
1673                     //Join the path parts together, then figure out if baseUrl is needed.
1674                     url = syms.join('/');
1675                     url += (ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? '' : '.js'));
1676                     url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url;
1677                 }
1678
1679                 return config.urlArgs && !/^blob\:/.test(url) ?
1680                        url + config.urlArgs(moduleName, url) : url;
1681             },
1682
1683             //Delegates to req.load. Broken out as a separate function to
1684             //allow overriding in the optimizer.
1685             load: function (id, url) {
1686                 req.load(context, id, url);
1687             },
1688
1689             /**
1690              * Executes a module callback function. Broken out as a separate function
1691              * solely to allow the build system to sequence the files in the built
1692              * layer in the right sequence.
1693              *
1694              * @private
1695              */
1696             execCb: function (name, callback, args, exports) {
1697                 return callback.apply(exports, args);
1698             },
1699
1700             /**
1701              * callback for script loads, used to check status of loading.
1702              *
1703              * @param {Event} evt the event from the browser for the script
1704              * that was loaded.
1705              */
1706             onScriptLoad: function (evt) {
1707                 //Using currentTarget instead of target for Firefox 2.0's sake. Not
1708                 //all old browsers will be supported, but this one was easy enough
1709                 //to support and still makes sense.
1710                 if (evt.type === 'load' ||
1711                         (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) {
1712                     //Reset interactive script so a script node is not held onto for
1713                     //to long.
1714                     interactiveScript = null;
1715
1716                     //Pull out the name of the module and the context.
1717                     var data = getScriptData(evt);
1718                     context.completeLoad(data.id);
1719                 }
1720             },
1721
1722             /**
1723              * Callback for script errors.
1724              */
1725             onScriptError: function (evt) {
1726                 var data = getScriptData(evt);
1727                 if (!hasPathFallback(data.id)) {
1728                     var parents = [];
1729                     eachProp(registry, function(value, key) {
1730                         if (key.indexOf('_@r') !== 0) {
1731                             each(value.depMaps, function(depMap) {
1732                                 if (depMap.id === data.id) {
1733                                     parents.push(key);
1734                                     return true;
1735                                 }
1736                             });
1737                         }
1738                     });
1739                     return onError(makeError('scripterror', 'Script error for "' + data.id +
1740                                              (parents.length ?
1741                                              '", needed by: ' + parents.join(', ') :
1742                                              '"'), evt, [data.id]));
1743                 }
1744             }
1745         };
1746
1747         context.require = context.makeRequire();
1748         return context;
1749     }
1750
1751     /**
1752      * Main entry point.
1753      *
1754      * If the only argument to require is a string, then the module that
1755      * is represented by that string is fetched for the appropriate context.
1756      *
1757      * If the first argument is an array, then it will be treated as an array
1758      * of dependency string names to fetch. An optional function callback can
1759      * be specified to execute when all of those dependencies are available.
1760      *
1761      * Make a local req variable to help Caja compliance (it assumes things
1762      * on a require that are not standardized), and to give a short
1763      * name for minification/local scope use.
1764      */
1765     req = requirejs = function (deps, callback, errback, optional) {
1766
1767         //Find the right context, use default
1768         var context, config,
1769             contextName = defContextName;
1770
1771         // Determine if have config object in the call.
1772         if (!isArray(deps) && typeof deps !== 'string') {
1773             // deps is a config object
1774             config = deps;
1775             if (isArray(callback)) {
1776                 // Adjust args if there are dependencies
1777                 deps = callback;
1778                 callback = errback;
1779                 errback = optional;
1780             } else {
1781                 deps = [];
1782             }
1783         }
1784
1785         if (config && config.context) {
1786             contextName = config.context;
1787         }
1788
1789         context = getOwn(contexts, contextName);
1790         if (!context) {
1791             context = contexts[contextName] = req.s.newContext(contextName);
1792         }
1793
1794         if (config) {
1795             context.configure(config);
1796         }
1797
1798         return context.require(deps, callback, errback);
1799     };
1800
1801     /**
1802      * Support require.config() to make it easier to cooperate with other
1803      * AMD loaders on globally agreed names.
1804      */
1805     req.config = function (config) {
1806         return req(config);
1807     };
1808
1809     /**
1810      * Execute something after the current tick
1811      * of the event loop. Override for other envs
1812      * that have a better solution than setTimeout.
1813      * @param  {Function} fn function to execute later.
1814      */
1815     req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
1816         setTimeout(fn, 4);
1817     } : function (fn) { fn(); };
1818
1819     /**
1820      * Export require as a global, but only if it does not already exist.
1821      */
1822     if (!require) {
1823         require = req;
1824     }
1825
1826     req.version = version;
1827
1828     //Used to filter out dependencies that are already paths.
1829     req.jsExtRegExp = /^\/|:|\?|\.js$/;
1830     req.isBrowser = isBrowser;
1831     s = req.s = {
1832         contexts: contexts,
1833         newContext: newContext
1834     };
1835
1836     //Create default context.
1837     req({});
1838
1839     //Exports some context-sensitive methods on global require.
1840     each([
1841         'toUrl',
1842         'undef',
1843         'defined',
1844         'specified'
1845     ], function (prop) {
1846         //Reference from contexts instead of early binding to default context,
1847         //so that during builds, the latest instance of the default context
1848         //with its config gets used.
1849         req[prop] = function () {
1850             var ctx = contexts[defContextName];
1851             return ctx.require[prop].apply(ctx, arguments);
1852         };
1853     });
1854
1855     if (isBrowser) {
1856         head = s.head = document.getElementsByTagName('head')[0];
1857         //If BASE tag is in play, using appendChild is a problem for IE6.
1858         //When that browser dies, this can be removed. Details in this jQuery bug:
1859         //http://dev.jquery.com/ticket/2709
1860         baseElement = document.getElementsByTagName('base')[0];
1861         if (baseElement) {
1862             head = s.head = baseElement.parentNode;
1863         }
1864     }
1865
1866     /**
1867      * Any errors that require explicitly generates will be passed to this
1868      * function. Intercept/override it if you want custom error handling.
1869      * @param {Error} err the error object.
1870      */
1871     req.onError = defaultOnError;
1872
1873     /**
1874      * Creates the node for the load command. Only used in browser envs.
1875      */
1876     req.createNode = function (config, moduleName, url) {
1877         var node = config.xhtml ?
1878                 document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :
1879                 document.createElement('script');
1880         node.type = config.scriptType || 'text/javascript';
1881         node.charset = 'utf-8';
1882         node.async = true;
1883         return node;
1884     };
1885
1886     /**
1887      * Does the request to load a module for the browser case.
1888      * Make this a separate function to allow other environments
1889      * to override it.
1890      *
1891      * @param {Object} context the require context to find state.
1892      * @param {String} moduleName the name of the module.
1893      * @param {Object} url the URL to the module.
1894      */
1895     req.load = function (context, moduleName, url) {
1896         var config = (context && context.config) || {},
1897             node;
1898         if (isBrowser) {
1899             //In the browser so use a script tag
1900             node = req.createNode(config, moduleName, url);
1901
1902             node.setAttribute('data-requirecontext', context.contextName);
1903             node.setAttribute('data-requiremodule', moduleName);
1904
1905             //Set up load listener. Test attachEvent first because IE9 has
1906             //a subtle issue in its addEventListener and script onload firings
1907             //that do not match the behavior of all other browsers with
1908             //addEventListener support, which fire the onload event for a
1909             //script right after the script execution. See:
1910             //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution
1911             //UNFORTUNATELY Opera implements attachEvent but does not follow the script
1912             //script execution mode.
1913             if (node.attachEvent &&
1914                     //Check if node.attachEvent is artificially added by custom script or
1915                     //natively supported by browser
1916                     //read https://github.com/requirejs/requirejs/issues/187
1917                     //if we can NOT find [native code] then it must NOT natively supported.
1918                     //in IE8, node.attachEvent does not have toString()
1919                     //Note the test for "[native code" with no closing brace, see:
1920                     //https://github.com/requirejs/requirejs/issues/273
1921                     !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) &&
1922                     !isOpera) {
1923                 //Probably IE. IE (at least 6-8) do not fire
1924                 //script onload right after executing the script, so
1925                 //we cannot tie the anonymous define call to a name.
1926                 //However, IE reports the script as being in 'interactive'
1927                 //readyState at the time of the define call.
1928                 useInteractive = true;
1929
1930                 node.attachEvent('onreadystatechange', context.onScriptLoad);
1931                 //It would be great to add an error handler here to catch
1932                 //404s in IE9+. However, onreadystatechange will fire before
1933                 //the error handler, so that does not help. If addEventListener
1934                 //is used, then IE will fire error before load, but we cannot
1935                 //use that pathway given the connect.microsoft.com issue
1936                 //mentioned above about not doing the 'script execute,
1937                 //then fire the script load event listener before execute
1938                 //next script' that other browsers do.
1939                 //Best hope: IE10 fixes the issues,
1940                 //and then destroys all installs of IE 6-9.
1941                 //node.attachEvent('onerror', context.onScriptError);
1942             } else {
1943                 node.addEventListener('load', context.onScriptLoad, false);
1944                 node.addEventListener('error', context.onScriptError, false);
1945             }
1946             node.src = url;
1947
1948             //Calling onNodeCreated after all properties on the node have been
1949             //set, but before it is placed in the DOM.
1950             if (config.onNodeCreated) {
1951                 config.onNodeCreated(node, config, moduleName, url);
1952             }
1953
1954             //For some cache cases in IE 6-8, the script executes before the end
1955             //of the appendChild execution, so to tie an anonymous define
1956             //call to the module name (which is stored on the node), hold on
1957             //to a reference to this node, but clear after the DOM insertion.
1958             currentlyAddingScript = node;
1959             if (baseElement) {
1960                 head.insertBefore(node, baseElement);
1961             } else {
1962                 head.appendChild(node);
1963             }
1964             currentlyAddingScript = null;
1965
1966             return node;
1967         } else if (isWebWorker) {
1968             try {
1969                 //In a web worker, use importScripts. This is not a very
1970                 //efficient use of importScripts, importScripts will block until
1971                 //its script is downloaded and evaluated. However, if web workers
1972                 //are in play, the expectation is that a build has been done so
1973                 //that only one script needs to be loaded anyway. This may need
1974                 //to be reevaluated if other use cases become common.
1975
1976                 // Post a task to the event loop to work around a bug in WebKit
1977                 // where the worker gets garbage-collected after calling
1978                 // importScripts(): https://webkit.org/b/153317
1979                 setTimeout(function() {}, 0);
1980                 importScripts(url);
1981
1982                 //Account for anonymous modules
1983                 context.completeLoad(moduleName);
1984             } catch (e) {
1985                 context.onError(makeError('importscripts',
1986                                 'importScripts failed for ' +
1987                                     moduleName + ' at ' + url,
1988                                 e,
1989                                 [moduleName]));
1990             }
1991         }
1992     };
1993
1994     function getInteractiveScript() {
1995         if (interactiveScript && interactiveScript.readyState === 'interactive') {
1996             return interactiveScript;
1997         }
1998
1999         eachReverse(scripts(), function (script) {
2000             if (script.readyState === 'interactive') {
2001                 return (interactiveScript = script);
2002             }
2003         });
2004         return interactiveScript;
2005     }
2006
2007     //Look for a data-main script attribute, which could also adjust the baseUrl.
2008     if (isBrowser && !cfg.skipDataMain) {
2009         //Figure out baseUrl. Get it from the script tag with require.js in it.
2010         eachReverse(scripts(), function (script) {
2011             //Set the 'head' where we can append children by
2012             //using the script's parent.
2013             if (!head) {
2014                 head = script.parentNode;
2015             }
2016
2017             //Look for a data-main attribute to set main script for the page
2018             //to load. If it is there, the path to data main becomes the
2019             //baseUrl, if it is not already set.
2020             dataMain = script.getAttribute('data-main');
2021             if (dataMain) {
2022                 //Preserve dataMain in case it is a path (i.e. contains '?')
2023                 mainScript = dataMain;
2024
2025                 //Set final baseUrl if there is not already an explicit one,
2026                 //but only do so if the data-main value is not a loader plugin
2027                 //module ID.
2028                 if (!cfg.baseUrl && mainScript.indexOf('!') === -1) {
2029                     //Pull off the directory of data-main for use as the
2030                     //baseUrl.
2031                     src = mainScript.split('/');
2032                     mainScript = src.pop();
2033                     subPath = src.length ? src.join('/')  + '/' : './';
2034
2035                     cfg.baseUrl = subPath;
2036                 }
2037
2038                 //Strip off any trailing .js since mainScript is now
2039                 //like a module name.
2040                 mainScript = mainScript.replace(jsSuffixRegExp, '');
2041
2042                 //If mainScript is still a path, fall back to dataMain
2043                 if (req.jsExtRegExp.test(mainScript)) {
2044                     mainScript = dataMain;
2045                 }
2046
2047                 //Put the data-main script in the files to load.
2048                 cfg.deps = cfg.deps ? cfg.deps.concat(mainScript) : [mainScript];
2049
2050                 return true;
2051             }
2052         });
2053     }
2054
2055     /**
2056      * The function that handles definitions of modules. Differs from
2057      * require() in that a string for the module should be the first argument,
2058      * and the function to execute after dependencies are loaded should
2059      * return a value to define the module corresponding to the first argument's
2060      * name.
2061      */
2062     define = function (name, deps, callback) {
2063         var node, context;
2064
2065         //Allow for anonymous modules
2066         if (typeof name !== 'string') {
2067             //Adjust args appropriately
2068             callback = deps;
2069             deps = name;
2070             name = null;
2071         }
2072
2073         //This module may not have dependencies
2074         if (!isArray(deps)) {
2075             callback = deps;
2076             deps = null;
2077         }
2078
2079         //If no name, and callback is a function, then figure out if it a
2080         //CommonJS thing with dependencies.
2081         if (!deps && isFunction(callback)) {
2082             deps = [];
2083             //Remove comments from the callback string,
2084             //look for require calls, and pull them into the dependencies,
2085             //but only if there are function args.
2086             if (callback.length) {
2087                 callback
2088                     .toString()
2089                     .replace(commentRegExp, commentReplace)
2090                     .replace(cjsRequireRegExp, function (match, dep) {
2091                         deps.push(dep);
2092                     });
2093
2094                 //May be a CommonJS thing even without require calls, but still
2095                 //could use exports, and module. Avoid doing exports and module
2096                 //work though if it just needs require.
2097                 //REQUIRES the function to expect the CommonJS variables in the
2098                 //order listed below.
2099                 deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps);
2100             }
2101         }
2102
2103         //If in IE 6-8 and hit an anonymous define() call, do the interactive
2104         //work.
2105         if (useInteractive) {
2106             node = currentlyAddingScript || getInteractiveScript();
2107             if (node) {
2108                 if (!name) {
2109                     name = node.getAttribute('data-requiremodule');
2110                 }
2111                 context = contexts[node.getAttribute('data-requirecontext')];
2112             }
2113         }
2114
2115         //Always save off evaluating the def call until the script onload handler.
2116         //This allows multiple modules to be in a file without prematurely
2117         //tracing dependencies, and allows for anonymous module support,
2118         //where the module name is not known until the script onload event
2119         //occurs. If no context, use the global queue, and get it processed
2120         //in the onscript load callback.
2121         if (context) {
2122             context.defQueue.push([name, deps, callback]);
2123             context.defQueueMap[name] = true;
2124         } else {
2125             globalDefQueue.push([name, deps, callback]);
2126         }
2127     };
2128
2129     define.amd = {
2130         jQuery: true
2131     };
2132
2133     /**
2134      * Executes the text. Normally just uses eval, but can be modified
2135      * to use a better, environment-specific call. Only used for transpiling
2136      * loader plugins, not for plain JS modules.
2137      * @param {String} text the text to execute/evaluate.
2138      */
2139     req.exec = function (text) {
2140         /*jslint evil: true */
2141         return eval(text);
2142     };
2143
2144     //Set up with config info.
2145     req(cfg);
2146 }(this, (typeof setTimeout === 'undefined' ? undefined : setTimeout)));