1/*================================================== 2 * Timeline API 3 * 4 * This file will load all the Javascript files 5 * necessary to make the standard timeline work. 6 * It also detects the default locale. 7 * 8 * To run from the MIT copy of Timeline: 9 * Include this file in your HTML file as follows: 10 * 11 * <script src="http://static.simile.mit.edu/timeline/api-2.3.0/timeline-api.js" 12 * type="text/javascript"></script> 13 * 14 * 15 * To host the Timeline files on your own server: 16 * 1) Install the Timeline and Simile-Ajax files onto your webserver using 17 * timeline_libraries.zip or timeline_source.zip 18 * 19 * 2) Set global js variables used to send parameters to this script: 20 * Timeline_ajax_url -- url for simile-ajax-api.js 21 * Timeline_urlPrefix -- url for the *directory* that contains timeline-api.js 22 * Include trailing slash 23 * Timeline_parameters='bundle=true'; // you must set bundle to true if you are using 24 * // timeline_libraries.zip since only the 25 * // bundled libraries are included 26 * 27 * eg your html page would include 28 * 29 * <script> 30 * Timeline_ajax_url="http://YOUR_SERVER/javascripts/timeline/timeline_ajax/simile-ajax-api.js"; 31 * Timeline_urlPrefix='http://YOUR_SERVER/javascripts/timeline/timeline_js/'; 32 * Timeline_parameters='bundle=true'; 33 * </script> 34 * <script src="http://YOUR_SERVER/javascripts/timeline/timeline_js/timeline-api.js" 35 * type="text/javascript"> 36 * </script> 37 * 38 * SCRIPT PARAMETERS 39 * This script auto-magically figures out locale and has defaults for other parameters 40 * To set parameters explicity, set js global variable Timeline_parameters or include as 41 * parameters on the url using GET style. Eg the two next lines pass the same parameters: 42 * Timeline_parameters='bundle=true'; // pass parameter via js variable 43 * <script src="http://....timeline-api.js?bundle=true" // pass parameter via url 44 * 45 * Parameters 46 * timeline-use-local-resources -- 47 * bundle -- true: use the single js bundle file; false: load individual files (for debugging) 48 * locales -- 49 * defaultLocale -- 50 * forceLocale -- force locale to be a particular value--used for debugging. Normally locale is determined 51 * by browser's and server's locale settings. 52 *================================================== 53 */ 54 55(function() { 56 var useLocalResources = false; 57 if (document.location.search.length > 0) { 58 var params = document.location.search.substr(1).split("&"); 59 for (var i = 0; i < params.length; i++) { 60 if (params[i] == "timeline-use-local-resources") { 61 useLocalResources = true; 62 } 63 } 64 }; 65 66 var loadMe = function() { 67 if ("Timeline" in window) { 68 return; 69 } 70 71 window.Timeline = new Object(); 72 window.Timeline.DateTime = window.SimileAjax.DateTime; // for backward compatibility 73 74 var bundle = false; 75 var javascriptFiles = [ 76 "timeline.js", 77 "band.js", 78 "themes.js", 79 "ethers.js", 80 "ether-painters.js", 81 "event-utils.js", 82 "labellers.js", 83 "sources.js", 84 "original-painter.js", 85 "detailed-painter.js", 86 "overview-painter.js", 87 "compact-painter.js", 88 "decorators.js", 89 "units.js" 90 ]; 91 var cssFiles = [ 92 "timeline.css", 93 "ethers.css", 94 "events.css" 95 ]; 96 97 var localizedJavascriptFiles = [ 98 "timeline.js", 99 "labellers.js" 100 ]; 101 var localizedCssFiles = [ 102 ]; 103 104 // ISO-639 language codes, ISO-3166 country codes (2 characters) 105 var supportedLocales = [ 106 "cs", // Czech 107 "de", // German 108 "en", // English 109 "es", // Spanish 110 "fr", // French 111 "it", // Italian 112 "nl", // Dutch (The Netherlands) 113 "ru", // Russian 114 "se", // Swedish 115 "tr", // Turkish 116 "vi", // Vietnamese 117 "zh" // Chinese 118 ]; 119 120 try { 121 var desiredLocales = [ "en" ], 122 defaultServerLocale = "en", 123 forceLocale = null; 124 125 var parseURLParameters = function(parameters) { 126 var params = parameters.split("&"); 127 for (var p = 0; p < params.length; p++) { 128 var pair = params[p].split("="); 129 if (pair[0] == "locales") { 130 desiredLocales = desiredLocales.concat(pair[1].split(",")); 131 } else if (pair[0] == "defaultLocale") { 132 defaultServerLocale = pair[1]; 133 } else if (pair[0] == "forceLocale") { 134 forceLocale = pair[1]; 135 desiredLocales = desiredLocales.concat(pair[1].split(",")); 136 } else if (pair[0] == "bundle") { 137 bundle = pair[1] != "false"; 138 } 139 } 140 }; 141 142 (function() { 143 if (typeof Timeline_urlPrefix == "string") { 144 Timeline.urlPrefix = Timeline_urlPrefix; 145 if (typeof Timeline_parameters == "string") { 146 parseURLParameters(Timeline_parameters); 147 } 148 } else { 149 var heads = document.documentElement.getElementsByTagName("head"); 150 for (var h = 0; h < heads.length; h++) { 151 var scripts = heads[h].getElementsByTagName("script"); 152 for (var s = 0; s < scripts.length; s++) { 153 var url = scripts[s].src; 154 var i = url.indexOf("timeline-api.js"); 155 if (i >= 0) { 156 Timeline.urlPrefix = url.substr(0, i); 157 var q = url.indexOf("?"); 158 if (q > 0) { 159 parseURLParameters(url.substr(q + 1)); 160 } 161 return; 162 } 163 } 164 } 165 throw new Error("Failed to derive URL prefix for Timeline API code files"); 166 } 167 })(); 168 169 var includeJavascriptFiles = function(urlPrefix, filenames) { 170 SimileAjax.includeJavascriptFiles(document, urlPrefix, filenames); 171 } 172 var includeCssFiles = function(urlPrefix, filenames) { 173 SimileAjax.includeCssFiles(document, urlPrefix, filenames); 174 } 175 176 /* 177 * Include non-localized files 178 */ 179 if (bundle) { 180 includeJavascriptFiles(Timeline.urlPrefix, [ "timeline-bundle.js" ]); 181 includeCssFiles(Timeline.urlPrefix, [ "timeline-bundle.css" ]); 182 } else { 183 includeJavascriptFiles(Timeline.urlPrefix + "scripts/", javascriptFiles); 184 includeCssFiles(Timeline.urlPrefix + "styles/", cssFiles); 185 } 186 187 /* 188 * Include localized files 189 */ 190 var loadLocale = []; 191 loadLocale[defaultServerLocale] = true; 192 193 var tryExactLocale = function(locale) { 194 for (var l = 0; l < supportedLocales.length; l++) { 195 if (locale == supportedLocales[l]) { 196 loadLocale[locale] = true; 197 return true; 198 } 199 } 200 return false; 201 } 202 var tryLocale = function(locale) { 203 if (tryExactLocale(locale)) { 204 return locale; 205 } 206 207 var dash = locale.indexOf("-"); 208 if (dash > 0 && tryExactLocale(locale.substr(0, dash))) { 209 return locale.substr(0, dash); 210 } 211 212 return null; 213 } 214 215 for (var l = 0; l < desiredLocales.length; l++) { 216 tryLocale(desiredLocales[l]); 217 } 218 219 var defaultClientLocale = defaultServerLocale; 220 var defaultClientLocales = ("language" in navigator ? navigator.language : navigator.browserLanguage).split(";"); 221 for (var l = 0; l < defaultClientLocales.length; l++) { 222 var locale = tryLocale(defaultClientLocales[l]); 223 if (locale != null) { 224 defaultClientLocale = locale; 225 break; 226 } 227 } 228 229 for (var l = 0; l < supportedLocales.length; l++) { 230 var locale = supportedLocales[l]; 231 if (loadLocale[locale]) { 232 includeJavascriptFiles(Timeline.urlPrefix + "scripts/l10n/" + locale + "/", localizedJavascriptFiles); 233 includeCssFiles(Timeline.urlPrefix + "styles/l10n/" + locale + "/", localizedCssFiles); 234 } 235 } 236 237 if (forceLocale == null) { 238 Timeline.serverLocale = defaultServerLocale; 239 Timeline.clientLocale = defaultClientLocale; 240 } else { 241 Timeline.serverLocale = forceLocale; 242 Timeline.clientLocale = forceLocale; 243 } 244 } catch (e) { 245 alert(e); 246 } 247 }; 248 249 /* 250 * Load SimileAjax if it's not already loaded 251 */ 252 if (typeof SimileAjax == "undefined") { 253 window.SimileAjax_onLoad = loadMe; 254 255 var url = useLocalResources ? 256 "http://127.0.0.1:9999/ajax/api/simile-ajax-api.js?bundle=false" : 257 "http://static.simile.mit.edu/ajax/api-2.2.0/simile-ajax-api.js"; 258 if (typeof Timeline_ajax_url == "string") { 259 url = Timeline_ajax_url; 260 } 261 var createScriptElement = function() { 262 var script = document.createElement("script"); 263 script.type = "text/javascript"; 264 script.language = "JavaScript"; 265 script.src = url; 266 document.getElementsByTagName("head")[0].appendChild(script); 267 } 268 if (document.body == null) { 269 try { 270 document.write("<script src='" + url + "' type='text/javascript'></script>"); 271 } catch (e) { 272 createScriptElement(); 273 } 274 } else { 275 createScriptElement(); 276 } 277 } else { 278 loadMe(); 279 } 280})(); 281