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