text: /*==================================================
   *  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();
      }
  })();
  