blob: 6113cf2e0148c9d4d00c541e7c510876b1d7ec54 [file] [log] [blame]
/*
Copyright (c) 2004-2006, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
dojo.hostenv.resetXd = function () {
this.isXDomain = djConfig.useXDomain || false;
this.xdTimer = 0;
this.xdInFlight = {};
this.xdOrderedReqs = [];
this.xdDepMap = {};
this.xdContents = [];
this.xdDefList = [];
};
dojo.hostenv.resetXd();
dojo.hostenv.createXdPackage = function (contents, resourceName, resourcePath) {
var deps = [];
var depRegExp = /dojo.(requireLocalization|require|requireIf|requireAll|provide|requireAfterIf|requireAfter|kwCompoundRequire|conditionalRequire|hostenv\.conditionalLoadModule|.hostenv\.loadModule|hostenv\.moduleLoaded)\(([\w\W]*?)\)/mg;
var match;
while ((match = depRegExp.exec(contents)) != null) {
if (match[1] == "requireLocalization") {
eval(match[0]);
} else {
deps.push("\"" + match[1] + "\", " + match[2]);
}
}
var output = [];
output.push("dojo.hostenv.packageLoaded({\n");
if (deps.length > 0) {
output.push("depends: [");
for (var i = 0; i < deps.length; i++) {
if (i > 0) {
output.push(",\n");
}
output.push("[" + deps[i] + "]");
}
output.push("],");
}
output.push("\ndefinePackage: function(dojo){");
output.push(contents);
output.push("\n}, resourceName: '" + resourceName + "', resourcePath: '" + resourcePath + "'});");
return output.join("");
};
dojo.hostenv.loadPath = function (relpath, module, cb) {
var colonIndex = relpath.indexOf(":");
var slashIndex = relpath.indexOf("/");
var uri;
var currentIsXDomain = false;
if (colonIndex > 0 && colonIndex < slashIndex) {
uri = relpath;
this.isXDomain = currentIsXDomain = true;
} else {
uri = this.getBaseScriptUri() + relpath;
colonIndex = uri.indexOf(":");
slashIndex = uri.indexOf("/");
if (colonIndex > 0 && colonIndex < slashIndex && (!location.host || uri.indexOf("http://" + location.host) != 0)) {
this.isXDomain = currentIsXDomain = true;
}
}
if (djConfig.cacheBust && dojo.render.html.capable) {
uri += "?" + String(djConfig.cacheBust).replace(/\W+/g, "");
}
try {
return ((!module || this.isXDomain) ? this.loadUri(uri, cb, currentIsXDomain, module) : this.loadUriAndCheck(uri, module, cb));
}
catch (e) {
dojo.debug(e);
return false;
}
};
dojo.hostenv.loadUri = function (uri, cb, currentIsXDomain, module) {
if (this.loadedUris[uri]) {
return 1;
}
if (this.isXDomain && module) {
if (uri.indexOf("__package__") != -1) {
module += ".*";
}
this.xdOrderedReqs.push(module);
if (currentIsXDomain || uri.indexOf("/nls/") == -1) {
this.xdInFlight[module] = true;
this.inFlightCount++;
}
if (!this.xdTimer) {
this.xdTimer = setInterval("dojo.hostenv.watchInFlightXDomain();", 100);
}
this.xdStartTime = (new Date()).getTime();
}
if (currentIsXDomain) {
var lastIndex = uri.lastIndexOf(".");
if (lastIndex <= 0) {
lastIndex = uri.length - 1;
}
var xdUri = uri.substring(0, lastIndex) + ".xd";
if (lastIndex != uri.length - 1) {
xdUri += uri.substring(lastIndex, uri.length);
}
var element = document.createElement("script");
element.type = "text/javascript";
element.src = xdUri;
if (!this.headElement) {
this.headElement = document.getElementsByTagName("head")[0];
if (!this.headElement) {
this.headElement = document.getElementsByTagName("html")[0];
}
}
this.headElement.appendChild(element);
} else {
var contents = this.getText(uri, null, true);
if (contents == null) {
return 0;
}
if (this.isXDomain && uri.indexOf("/nls/") == -1) {
var pkg = this.createXdPackage(contents, module, uri);
dj_eval(pkg);
} else {
if (cb) {
contents = "(" + contents + ")";
}
var value = dj_eval(contents);
if (cb) {
cb(value);
}
}
}
this.loadedUris[uri] = true;
return 1;
};
dojo.hostenv.packageLoaded = function (pkg) {
var deps = pkg.depends;
var requireList = null;
var requireAfterList = null;
var provideList = [];
if (deps && deps.length > 0) {
var dep = null;
var insertHint = 0;
var attachedPackage = false;
for (var i = 0; i < deps.length; i++) {
dep = deps[i];
if (dep[0] == "provide" || dep[0] == "hostenv.moduleLoaded") {
provideList.push(dep[1]);
} else {
if (!requireList) {
requireList = [];
}
if (!requireAfterList) {
requireAfterList = [];
}
var unpackedDeps = this.unpackXdDependency(dep);
if (unpackedDeps.requires) {
requireList = requireList.concat(unpackedDeps.requires);
}
if (unpackedDeps.requiresAfter) {
requireAfterList = requireAfterList.concat(unpackedDeps.requiresAfter);
}
}
var depType = dep[0];
var objPath = depType.split(".");
if (objPath.length == 2) {
dojo[objPath[0]][objPath[1]].apply(dojo[objPath[0]], dep.slice(1));
} else {
dojo[depType].apply(dojo, dep.slice(1));
}
}
var contentIndex = this.xdContents.push({content:pkg.definePackage, resourceName:pkg["resourceName"], resourcePath:pkg["resourcePath"], isDefined:false}) - 1;
for (var i = 0; i < provideList.length; i++) {
this.xdDepMap[provideList[i]] = {requires:requireList, requiresAfter:requireAfterList, contentIndex:contentIndex};
}
for (var i = 0; i < provideList.length; i++) {
this.xdInFlight[provideList[i]] = false;
}
}
};
dojo.hostenv.xdLoadFlattenedBundle = function (moduleName, bundleName, locale, bundleData) {
locale = locale || "root";
var jsLoc = dojo.hostenv.normalizeLocale(locale).replace("-", "_");
var bundlePackage = [moduleName, "nls", bundleName].join(".");
var bundle = dojo.hostenv.startPackage(bundlePackage);
bundle[jsLoc] = bundleData;
var mapName = [moduleName, jsLoc, bundleName].join(".");
var bundleMap = dojo.hostenv.xdBundleMap[mapName];
if (bundleMap) {
for (var param in bundleMap) {
bundle[param] = bundleData;
}
}
};
dojo.hostenv.xdBundleMap = {};
dojo.xdRequireLocalization = function (moduleName, bundleName, locale, availableFlatLocales) {
var locales = availableFlatLocales.split(",");
var jsLoc = dojo.hostenv.normalizeLocale(locale);
var bestLocale = "";
for (var i = 0; i < locales.length; i++) {
if (jsLoc.indexOf(locales[i]) == 0) {
if (locales[i].length > bestLocale.length) {
bestLocale = locales[i];
}
}
}
var fixedBestLocale = bestLocale.replace("-", "_");
var bundlePackage = dojo.evalObjPath([moduleName, "nls", bundleName].join("."));
if (bundlePackage && bundlePackage[fixedBestLocale]) {
bundle[jsLoc.replace("-", "_")] = bundlePackage[fixedBestLocale];
} else {
var mapName = [moduleName, (fixedBestLocale || "root"), bundleName].join(".");
var bundleMap = dojo.hostenv.xdBundleMap[mapName];
if (!bundleMap) {
bundleMap = dojo.hostenv.xdBundleMap[mapName] = {};
}
bundleMap[jsLoc.replace("-", "_")] = true;
dojo.require(moduleName + ".nls" + (bestLocale ? "." + bestLocale : "") + "." + bundleName);
}
};
(function () {
var extra = djConfig.extraLocale;
if (extra) {
if (!extra instanceof Array) {
extra = [extra];
}
dojo._xdReqLoc = dojo.xdRequireLocalization;
dojo.xdRequireLocalization = function (m, b, locale, fLocales) {
dojo._xdReqLoc(m, b, locale, fLocales);
if (locale) {
return;
}
for (var i = 0; i < extra.length; i++) {
dojo._xdReqLoc(m, b, extra[i], fLocales);
}
};
}
})();
dojo.hostenv.unpackXdDependency = function (dep) {
var newDeps = null;
var newAfterDeps = null;
switch (dep[0]) {
case "requireIf":
case "requireAfterIf":
case "conditionalRequire":
if ((dep[1] === true) || (dep[1] == "common") || (dep[1] && dojo.render[dep[1]].capable)) {
newDeps = [{name:dep[2], content:null}];
}
break;
case "requireAll":
dep.shift();
newDeps = dep;
dojo.hostenv.flattenRequireArray(newDeps);
break;
case "kwCompoundRequire":
case "hostenv.conditionalLoadModule":
var modMap = dep[1];
var common = modMap["common"] || [];
var newDeps = (modMap[dojo.hostenv.name_]) ? common.concat(modMap[dojo.hostenv.name_] || []) : common.concat(modMap["default"] || []);
dojo.hostenv.flattenRequireArray(newDeps);
break;
case "require":
case "requireAfter":
case "hostenv.loadModule":
newDeps = [{name:dep[1], content:null}];
break;
}
if (dep[0] == "requireAfterIf" || dep[0] == "requireIf") {
newAfterDeps = newDeps;
newDeps = null;
}
return {requires:newDeps, requiresAfter:newAfterDeps};
};
dojo.hostenv.xdWalkReqs = function () {
var reqChain = null;
var req;
for (var i = 0; i < this.xdOrderedReqs.length; i++) {
req = this.xdOrderedReqs[i];
if (this.xdDepMap[req]) {
reqChain = [req];
reqChain[req] = true;
this.xdEvalReqs(reqChain);
}
}
};
dojo.hostenv.xdEvalReqs = function (reqChain) {
while (reqChain.length > 0) {
var req = reqChain[reqChain.length - 1];
var pkg = this.xdDepMap[req];
if (pkg) {
var reqs = pkg.requires;
if (reqs && reqs.length > 0) {
var nextReq;
for (var i = 0; i < reqs.length; i++) {
nextReq = reqs[i].name;
if (nextReq && !reqChain[nextReq]) {
reqChain.push(nextReq);
reqChain[nextReq] = true;
this.xdEvalReqs(reqChain);
}
}
}
var contents = this.xdContents[pkg.contentIndex];
if (!contents.isDefined) {
var content = contents.content;
content["resourceName"] = contents["resourceName"];
content["resourcePath"] = contents["resourcePath"];
this.xdDefList.push(content);
contents.isDefined = true;
}
this.xdDepMap[req] = null;
var reqs = pkg.requiresAfter;
if (reqs && reqs.length > 0) {
var nextReq;
for (var i = 0; i < reqs.length; i++) {
nextReq = reqs[i].name;
if (nextReq && !reqChain[nextReq]) {
reqChain.push(nextReq);
reqChain[nextReq] = true;
this.xdEvalReqs(reqChain);
}
}
}
}
reqChain.pop();
}
};
dojo.hostenv.clearXdInterval = function () {
clearInterval(this.xdTimer);
this.xdTimer = 0;
};
dojo.hostenv.watchInFlightXDomain = function () {
var waitInterval = (djConfig.xdWaitSeconds || 15) * 1000;
if (this.xdStartTime + waitInterval < (new Date()).getTime()) {
this.clearXdInterval();
var noLoads = "";
for (var param in this.xdInFlight) {
if (this.xdInFlight[param]) {
noLoads += param + " ";
}
}
dojo.raise("Could not load cross-domain packages: " + noLoads);
}
for (var param in this.xdInFlight) {
if (this.xdInFlight[param]) {
return;
}
}
this.clearXdInterval();
this.xdWalkReqs();
var defLength = this.xdDefList.length;
for (var i = 0; i < defLength; i++) {
var content = dojo.hostenv.xdDefList[i];
if (djConfig["debugAtAllCosts"] && content["resourceName"]) {
if (!this["xdDebugQueue"]) {
this.xdDebugQueue = [];
}
this.xdDebugQueue.push({resourceName:content.resourceName, resourcePath:content.resourcePath});
} else {
content(dojo);
}
}
for (var i = 0; i < this.xdContents.length; i++) {
var current = this.xdContents[i];
if (current.content && !current.isDefined) {
current.content(dojo);
}
}
this.resetXd();
if (this["xdDebugQueue"] && this.xdDebugQueue.length > 0) {
this.xdDebugFileLoaded();
} else {
this.xdNotifyLoaded();
}
};
dojo.hostenv.xdNotifyLoaded = function () {
this.inFlightCount = 0;
if (this._djInitFired && !this.loadNotifying) {
this.callLoaded();
}
};
dojo.hostenv.flattenRequireArray = function (target) {
if (target) {
for (var i = 0; i < target.length; i++) {
if (target[i] instanceof Array) {
target[i] = {name:target[i][0], content:null};
} else {
target[i] = {name:target[i], content:null};
}
}
}
};
dojo.hostenv.xdHasCalledPreload = false;
dojo.hostenv.xdRealCallLoaded = dojo.hostenv.callLoaded;
dojo.hostenv.callLoaded = function () {
if (this.xdHasCalledPreload || dojo.hostenv.getModulePrefix("dojo") == "src" || !this.localesGenerated) {
this.xdRealCallLoaded();
} else {
if (this.localesGenerated) {
this.registerNlsPrefix = function () {
dojo.registerModulePath("nls", dojo.hostenv.getModulePrefix("dojo") + "/../nls");
};
this.preloadLocalizations();
}
}
this.xdHasCalledPreload = true;
};