changeset 26:fd8f4c369dc4

Added a more robust module loader.
author Atul Varma <varmaa@toolness.com>
date Mon, 13 Apr 2009 15:29:56 -0700
parents 58ef69894c96
children 95a1e6ad3f57
files browser-couch.js
diffstat 1 files changed, 52 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/browser-couch.js	Mon Apr 13 15:14:57 2009 -0700
+++ b/browser-couch.js	Mon Apr 13 15:29:56 2009 -0700
@@ -34,6 +34,56 @@
  *
  * ***** END LICENSE BLOCK ***** */
 
+var ModuleLoader = {
+  LIBS: {JSON: "json2.js"},
+
+  require: function ML_require(libs, cb) {
+    var self = this;
+    var i = 0;
+    var lastLib = "";
+
+    if (libs.constructor.name != "Array")
+      libs = [libs];
+
+    function loadNextLib() {
+      if (lastLib && !window[lastLib])
+        throw new Error("Failed to load library: " + lastLib);
+      if (i == libs.length)
+        cb();
+      else {
+        var libName = libs[i];
+        i += 1;
+        if (window.libName)
+          loadNextLib();
+        else {
+          var libUrl = self.LIBS[libName];
+          if (!libUrl)
+            throw new Error("Unknown lib: " + libName);
+          lastLib = libName;
+          self._loadScript(libUrl, window, loadNextLib);
+        }
+      }
+    }
+
+    loadNextLib();
+  },
+
+  _loadScript: function ML__loadScript(url, window, cb) {
+    var doc = window.document;
+    var script = doc.createElement("script");
+    script.setAttribute("src", url);
+    script.addEventListener(
+      "load",
+      function onLoad() {
+        script.removeEventListener("load", onLoad, false);
+        cb();
+      },
+      false
+    );
+    doc.body.appendChild(script);
+  }
+};
+
 var BrowserCouch = {
   USE_EVAL_FOR_JSON_PARSING: true,
 
@@ -54,12 +104,9 @@
           JSON = window.JSON;
           createDb();
         } else
-          self._loadScript(
-            "json2.js",
-            window,
+          ModuleLoader.require(
+            "JSON",
             function() {
-              if (!window.JSON)
-                throw new Error('JSON library failed to load');
               JSON = window.JSON;
               if (BrowserCouch.USE_EVAL_FOR_JSON_PARSING)
                 JSON.parse = function JSON_parse(string) {
@@ -75,21 +122,6 @@
       createDb();
   },
 
-  _loadScript: function BC__loadScript(url, window, cb) {
-    var doc = window.document;
-    var script = doc.createElement("script");
-    script.setAttribute("src", url);
-    script.addEventListener(
-      "load",
-      function onLoad() {
-        script.removeEventListener("load", onLoad, false);
-        cb();
-      },
-      false
-    );
-    doc.body.appendChild(script);
-  },
-
   _Dictionary: function BC__Dictionary(JSON) {
     var dict = {};
     var keys = [];