Add Universal Module Loader script

So that JSZip can be used in CommonJS, require.js and plain
browser environments
diff --git a/jszip-load.js b/jszip-load.js
index a15209f..de873f9 100644
--- a/jszip-load.js
+++ b/jszip-load.js
@@ -7,7 +7,7 @@
 Dual licenced under the MIT license or GPLv3. See LICENSE.markdown.
 
 **/
-/*global JSZip,JSZipBase64 */
+/*global JSZip */
 (function () {
 
    /**
@@ -509,8 +509,9 @@
    JSZip.prototype.load = function(data, options) {
       var files, zipEntries, i, input;
       options = options || {};
+
       if(options.base64) {
-         data = JSZipBase64.decode(data);
+         data = JSZip.Base64.decode(data);
       }
 
       zipEntries = new ZipEntries(data, options);
diff --git a/jszip.js b/jszip.js
index 18eafc7..527564b 100644
--- a/jszip.js
+++ b/jszip.js
@@ -7,6 +7,11 @@
 Dual licenced under the MIT license or GPLv3. See LICENSE.markdown.
 
 Usage:
+   // CommonJS
+   var JSZip = require("jszip");
+   // Require.js
+   requirejs(["jszip"], function (JSZip) { ... });
+
    zip = new JSZip();
    zip.file("hello.txt", "Hello, World!").add("tempfile", "nothing");
    zip.folder("images").file("smile.gif", base64Data, {base64: true});
@@ -17,6 +22,22 @@
 
 **/
 
+// UMD from https://github.com/umdjs/umd/blob/master/returnExports.js
+(function (root, factory) {
+    if (typeof exports === 'object') {
+        // Node. Does not work with strict CommonJS, but
+        // only CommonJS-like enviroments that support module.exports,
+        // like Node.
+        module.exports = factory();
+    } else if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define(factory);
+    } else {
+        // Browser globals (root is window)
+        root.JSZip = factory();
+  }
+}(this, function () {
+
 /**
  * Representation a of zip file in js
  * @constructor
@@ -857,7 +878,7 @@
  *
  *  Hacked so that it doesn't utf8 en/decode everything
  **/
-var JSZipBase64 = (function() {
+var JSZipBase64 = JSZip.Base64 = (function() {
    // private property
    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
 
@@ -931,5 +952,9 @@
    };
 }());
 
+return JSZip;
+
+}));
+
 // enforcing Stuk's coding style
 // vim: set shiftwidth=3 softtabstop=3:
diff --git a/test/index.html b/test/index.html
index a299356..f33775a 100644
--- a/test/index.html
+++ b/test/index.html
@@ -176,7 +176,7 @@
       zip.file("Hello.txt", "Hello World\n");
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       /*
       Expected differing bytes:
@@ -198,7 +198,7 @@
       zip.file("Hello.txt", "Hello World\n");
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       /*
       Expected differing bytes:
@@ -239,7 +239,7 @@
 	  zip.file("Hello.txt", "Hello World\n", {date : new Date("July 17, 2009 14:36:57")});
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       /*
       Expected differing bytes:
@@ -259,7 +259,7 @@
       zip.file("smile.gif", "R0lGODdhBQAFAIACAAAAAP/eACwAAAAABQAFAAACCIwPkWerClIBADs=", {base64: true});
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
       equals(reload(actual), actual, "Generated ZIP can be parsed");
@@ -270,7 +270,7 @@
       zip.folder("folder");
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
       equals(reload(actual), actual, "Generated ZIP can be parsed");
@@ -282,7 +282,7 @@
       zip.folder("images").file("smile.gif", "R0lGODdhBQAFAIACAAAAAP/eACwAAAAABQAFAAACCIwPkWerClIBADs=", {base64: true});
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       /*
       Expected differing bytes:
@@ -321,7 +321,7 @@
       // these changes won't be used
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
    });
@@ -383,7 +383,7 @@
       zip.remove("Remove.txt");
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
 
@@ -395,7 +395,7 @@
       zip.remove("folder/Remove.txt");
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
    });
@@ -407,7 +407,7 @@
       folder.remove("Remove.txt");
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
    });
@@ -419,7 +419,7 @@
       zip.remove("remove");
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
 
@@ -434,7 +434,7 @@
       zip.remove("remove");
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
 
@@ -447,7 +447,7 @@
       zip.folder("folder").remove("1");
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
       equals(reload(actual), actual, "Generated ZIP can be parsed");
@@ -692,7 +692,7 @@
       });
       var content = zip.generate();
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
 
@@ -703,7 +703,7 @@
       zip.file("Hello.txt", "Hello World\n");
       var content = zip.generate({compression:'STORE'});
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       // no difference with the "Zip text file" test.
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
@@ -715,7 +715,7 @@
       zip.file("Hello.txt", "This a looong file : we need to see the difference between the different compression methods.\n");
       var content = zip.generate({compression:'STORE'});
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
    });
@@ -726,7 +726,7 @@
       zip.file("Hello.txt", "This a looong file : we need to see the difference between the different compression methods.\n");
       var content = zip.generate({compression:'DEFLATE'});
 
-      var actual = JSZipBase64.decode(content);
+      var actual = JSZip.Base64.decode(content);
 
       ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP");
    });