281 lines
11 KiB
JavaScript
281 lines
11 KiB
JavaScript
/*==================================================
|
|
* Timeline API
|
|
*
|
|
* This file will load all the Javascript files
|
|
* necessary to make the standard timeline work.
|
|
* It also detects the default locale.
|
|
*
|
|
* To run from the MIT copy of Timeline:
|
|
* Include this file in your HTML file as follows:
|
|
*
|
|
* <script src="http://static.simile.mit.edu/timeline/api-2.3.0/timeline-api.js"
|
|
* type="text/javascript"></script>
|
|
*
|
|
*
|
|
* To host the Timeline files on your own server:
|
|
* 1) Install the Timeline and Simile-Ajax files onto your webserver using
|
|
* timeline_libraries.zip or timeline_source.zip
|
|
*
|
|
* 2) Set global js variables used to send parameters to this script:
|
|
* Timeline_ajax_url -- url for simile-ajax-api.js
|
|
* Timeline_urlPrefix -- url for the *directory* that contains timeline-api.js
|
|
* Include trailing slash
|
|
* Timeline_parameters='bundle=true'; // you must set bundle to true if you are using
|
|
* // timeline_libraries.zip since only the
|
|
* // bundled libraries are included
|
|
*
|
|
* eg your html page would include
|
|
*
|
|
* <script>
|
|
* Timeline_ajax_url="http://YOUR_SERVER/javascripts/timeline/timeline_ajax/simile-ajax-api.js";
|
|
* Timeline_urlPrefix='http://YOUR_SERVER/javascripts/timeline/timeline_js/';
|
|
* Timeline_parameters='bundle=true';
|
|
* </script>
|
|
* <script src="http://YOUR_SERVER/javascripts/timeline/timeline_js/timeline-api.js"
|
|
* type="text/javascript">
|
|
* </script>
|
|
*
|
|
* SCRIPT PARAMETERS
|
|
* This script auto-magically figures out locale and has defaults for other parameters
|
|
* To set parameters explicity, set js global variable Timeline_parameters or include as
|
|
* parameters on the url using GET style. Eg the two next lines pass the same parameters:
|
|
* Timeline_parameters='bundle=true'; // pass parameter via js variable
|
|
* <script src="http://....timeline-api.js?bundle=true" // pass parameter via url
|
|
*
|
|
* Parameters
|
|
* timeline-use-local-resources --
|
|
* bundle -- true: use the single js bundle file; false: load individual files (for debugging)
|
|
* locales --
|
|
* defaultLocale --
|
|
* forceLocale -- force locale to be a particular value--used for debugging. Normally locale is determined
|
|
* by browser's and server's locale settings.
|
|
*==================================================
|
|
*/
|
|
|
|
(function() {
|
|
var useLocalResources = false;
|
|
if (document.location.search.length > 0) {
|
|
var params = document.location.search.substr(1).split("&");
|
|
for (var i = 0; i < params.length; i++) {
|
|
if (params[i] == "timeline-use-local-resources") {
|
|
useLocalResources = true;
|
|
}
|
|
}
|
|
};
|
|
|
|
var loadMe = function() {
|
|
if ("Timeline" in window) {
|
|
return;
|
|
}
|
|
|
|
window.Timeline = new Object();
|
|
window.Timeline.DateTime = window.SimileAjax.DateTime; // for backward compatibility
|
|
|
|
var bundle = false;
|
|
var javascriptFiles = [
|
|
"timeline.js",
|
|
"band.js",
|
|
"themes.js",
|
|
"ethers.js",
|
|
"ether-painters.js",
|
|
"event-utils.js",
|
|
"labellers.js",
|
|
"sources.js",
|
|
"original-painter.js",
|
|
"detailed-painter.js",
|
|
"overview-painter.js",
|
|
"compact-painter.js",
|
|
"decorators.js",
|
|
"units.js"
|
|
];
|
|
var cssFiles = [
|
|
"timeline.css",
|
|
"ethers.css",
|
|
"events.css"
|
|
];
|
|
|
|
var localizedJavascriptFiles = [
|
|
"timeline.js",
|
|
"labellers.js"
|
|
];
|
|
var localizedCssFiles = [
|
|
];
|
|
|
|
// ISO-639 language codes, ISO-3166 country codes (2 characters)
|
|
var supportedLocales = [
|
|
"cs", // Czech
|
|
"de", // German
|
|
"en", // English
|
|
"es", // Spanish
|
|
"fr", // French
|
|
"it", // Italian
|
|
"nl", // Dutch (The Netherlands)
|
|
"ru", // Russian
|
|
"se", // Swedish
|
|
"tr", // Turkish
|
|
"vi", // Vietnamese
|
|
"zh" // Chinese
|
|
];
|
|
|
|
try {
|
|
var desiredLocales = [ "en" ],
|
|
defaultServerLocale = "en",
|
|
forceLocale = null;
|
|
|
|
var parseURLParameters = function(parameters) {
|
|
var params = parameters.split("&");
|
|
for (var p = 0; p < params.length; p++) {
|
|
var pair = params[p].split("=");
|
|
if (pair[0] == "locales") {
|
|
desiredLocales = desiredLocales.concat(pair[1].split(","));
|
|
} else if (pair[0] == "defaultLocale") {
|
|
defaultServerLocale = pair[1];
|
|
} else if (pair[0] == "forceLocale") {
|
|
forceLocale = pair[1];
|
|
desiredLocales = desiredLocales.concat(pair[1].split(","));
|
|
} else if (pair[0] == "bundle") {
|
|
bundle = pair[1] != "false";
|
|
}
|
|
}
|
|
};
|
|
|
|
(function() {
|
|
if (typeof Timeline_urlPrefix == "string") {
|
|
Timeline.urlPrefix = Timeline_urlPrefix;
|
|
if (typeof Timeline_parameters == "string") {
|
|
parseURLParameters(Timeline_parameters);
|
|
}
|
|
} else {
|
|
var heads = document.documentElement.getElementsByTagName("head");
|
|
for (var h = 0; h < heads.length; h++) {
|
|
var scripts = heads[h].getElementsByTagName("script");
|
|
for (var s = 0; s < scripts.length; s++) {
|
|
var url = scripts[s].src;
|
|
var i = url.indexOf("timeline-api.js");
|
|
if (i >= 0) {
|
|
Timeline.urlPrefix = url.substr(0, i);
|
|
var q = url.indexOf("?");
|
|
if (q > 0) {
|
|
parseURLParameters(url.substr(q + 1));
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
throw new Error("Failed to derive URL prefix for Timeline API code files");
|
|
}
|
|
})();
|
|
|
|
var includeJavascriptFiles = function(urlPrefix, filenames) {
|
|
SimileAjax.includeJavascriptFiles(document, urlPrefix, filenames);
|
|
}
|
|
var includeCssFiles = function(urlPrefix, filenames) {
|
|
SimileAjax.includeCssFiles(document, urlPrefix, filenames);
|
|
}
|
|
|
|
/*
|
|
* Include non-localized files
|
|
*/
|
|
if (bundle) {
|
|
includeJavascriptFiles(Timeline.urlPrefix, [ "timeline-bundle.js" ]);
|
|
includeCssFiles(Timeline.urlPrefix, [ "timeline-bundle.css" ]);
|
|
} else {
|
|
includeJavascriptFiles(Timeline.urlPrefix + "scripts/", javascriptFiles);
|
|
includeCssFiles(Timeline.urlPrefix + "styles/", cssFiles);
|
|
}
|
|
|
|
/*
|
|
* Include localized files
|
|
*/
|
|
var loadLocale = [];
|
|
loadLocale[defaultServerLocale] = true;
|
|
|
|
var tryExactLocale = function(locale) {
|
|
for (var l = 0; l < supportedLocales.length; l++) {
|
|
if (locale == supportedLocales[l]) {
|
|
loadLocale[locale] = true;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
var tryLocale = function(locale) {
|
|
if (tryExactLocale(locale)) {
|
|
return locale;
|
|
}
|
|
|
|
var dash = locale.indexOf("-");
|
|
if (dash > 0 && tryExactLocale(locale.substr(0, dash))) {
|
|
return locale.substr(0, dash);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
for (var l = 0; l < desiredLocales.length; l++) {
|
|
tryLocale(desiredLocales[l]);
|
|
}
|
|
|
|
var defaultClientLocale = defaultServerLocale;
|
|
var defaultClientLocales = ("language" in navigator ? navigator.language : navigator.browserLanguage).split(";");
|
|
for (var l = 0; l < defaultClientLocales.length; l++) {
|
|
var locale = tryLocale(defaultClientLocales[l]);
|
|
if (locale != null) {
|
|
defaultClientLocale = locale;
|
|
break;
|
|
}
|
|
}
|
|
|
|
for (var l = 0; l < supportedLocales.length; l++) {
|
|
var locale = supportedLocales[l];
|
|
if (loadLocale[locale]) {
|
|
includeJavascriptFiles(Timeline.urlPrefix + "scripts/l10n/" + locale + "/", localizedJavascriptFiles);
|
|
includeCssFiles(Timeline.urlPrefix + "styles/l10n/" + locale + "/", localizedCssFiles);
|
|
}
|
|
}
|
|
|
|
if (forceLocale == null) {
|
|
Timeline.serverLocale = defaultServerLocale;
|
|
Timeline.clientLocale = defaultClientLocale;
|
|
} else {
|
|
Timeline.serverLocale = forceLocale;
|
|
Timeline.clientLocale = forceLocale;
|
|
}
|
|
} catch (e) {
|
|
alert(e);
|
|
}
|
|
};
|
|
|
|
/*
|
|
* Load SimileAjax if it's not already loaded
|
|
*/
|
|
if (typeof SimileAjax == "undefined") {
|
|
window.SimileAjax_onLoad = loadMe;
|
|
|
|
var url = useLocalResources ?
|
|
"http://127.0.0.1:9999/ajax/api/simile-ajax-api.js?bundle=false" :
|
|
"http://static.simile.mit.edu/ajax/api-2.2.0/simile-ajax-api.js";
|
|
if (typeof Timeline_ajax_url == "string") {
|
|
url = Timeline_ajax_url;
|
|
}
|
|
var createScriptElement = function() {
|
|
var script = document.createElement("script");
|
|
script.type = "text/javascript";
|
|
script.language = "JavaScript";
|
|
script.src = url;
|
|
document.getElementsByTagName("head")[0].appendChild(script);
|
|
}
|
|
if (document.body == null) {
|
|
try {
|
|
document.write("<script src='" + url + "' type='text/javascript'></script>");
|
|
} catch (e) {
|
|
createScriptElement();
|
|
}
|
|
} else {
|
|
createScriptElement();
|
|
}
|
|
} else {
|
|
loadMe();
|
|
}
|
|
})();
|