| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 | 
							- /*! FileSaver.js
 
-  *  A saveAs() FileSaver implementation.
 
-  *  2014-01-24
 
-  *
 
-  *  By Eli Grey, http://eligrey.com
 
-  *  License: X11/MIT
 
-  *    See LICENSE.md
 
-  */
 
- /*global self */
 
- /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
 
- /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
 
- var saveAs = saveAs
 
-   // IE 10+ (native saveAs)
 
-   || (typeof navigator !== "undefined" &&
 
-       navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
 
-   // Everyone else
 
-   || (function(view) {
 
-     "use strict";
 
-     // IE <10 is explicitly unsupported
 
-     if (typeof navigator !== "undefined" &&
 
-         /MSIE [1-9]\./.test(navigator.userAgent)) {
 
-         return;
 
-     }
 
-     var
 
-           doc = view.document
 
-           // only get URL when necessary in case BlobBuilder.js hasn't overridden it yet
 
-         , get_URL = function() {
 
-             return view.URL || view.webkitURL || view;
 
-         }
 
-         , URL = view.URL || view.webkitURL || view
 
-         , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
 
-         , can_use_save_link = !view.externalHost && "download" in save_link
 
-         , click = function(node) {
 
-             var event = doc.createEvent("MouseEvents");
 
-             event.initMouseEvent(
 
-                 "click", true, false, view, 0, 0, 0, 0, 0
 
-                 , false, false, false, false, 0, null
 
-             );
 
-             node.dispatchEvent(event);
 
-         }
 
-         , webkit_req_fs = view.webkitRequestFileSystem
 
-         , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
 
-         , throw_outside = function(ex) {
 
-             (view.setImmediate || view.setTimeout)(function() {
 
-                 throw ex;
 
-             }, 0);
 
-         }
 
-         , force_saveable_type = "application/octet-stream"
 
-         , fs_min_size = 0
 
-         , deletion_queue = []
 
-         , process_deletion_queue = function() {
 
-             var i = deletion_queue.length;
 
-             while (i--) {
 
-                 var file = deletion_queue[i];
 
-                 if (typeof file === "string") { // file is an object URL
 
-                     URL.revokeObjectURL(file);
 
-                 } else { // file is a File
 
-                     file.remove();
 
-                 }
 
-             }
 
-             deletion_queue.length = 0; // clear queue
 
-         }
 
-         , dispatch = function(filesaver, event_types, event) {
 
-             event_types = [].concat(event_types);
 
-             var i = event_types.length;
 
-             while (i--) {
 
-                 var listener = filesaver["on" + event_types[i]];
 
-                 if (typeof listener === "function") {
 
-                     try {
 
-                         listener.call(filesaver, event || filesaver);
 
-                     } catch (ex) {
 
-                         throw_outside(ex);
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-         , FileSaver = function(blob, name) {
 
-             // First try a.download, then web filesystem, then object URLs
 
-             var
 
-                   filesaver = this
 
-                 , type = blob.type
 
-                 , blob_changed = false
 
-                 , object_url
 
-                 , target_view
 
-                 , get_object_url = function() {
 
-                     var object_url = get_URL().createObjectURL(blob);
 
-                     deletion_queue.push(object_url);
 
-                     return object_url;
 
-                 }
 
-                 , dispatch_all = function() {
 
-                     dispatch(filesaver, "writestart progress write writeend".split(" "));
 
-                 }
 
-                 // on any filesys errors revert to saving with object URLs
 
-                 , fs_error = function() {
 
-                     // don't create more object URLs than needed
 
-                     if (blob_changed || !object_url) {
 
-                         object_url = get_object_url(blob);
 
-                     }
 
-                     if (target_view) {
 
-                         target_view.location.href = object_url;
 
-                     } else {
 
-                         window.open(object_url, "_blank");
 
-                     }
 
-                     filesaver.readyState = filesaver.DONE;
 
-                     dispatch_all();
 
-                 }
 
-                 , abortable = function(func) {
 
-                     return function() {
 
-                         if (filesaver.readyState !== filesaver.DONE) {
 
-                             return func.apply(this, arguments);
 
-                         }
 
-                     };
 
-                 }
 
-                 , create_if_not_found = {create: true, exclusive: false}
 
-                 , slice
 
-             ;
 
-             filesaver.readyState = filesaver.INIT;
 
-             if (!name) {
 
-                 name = "download";
 
-             }
 
-             if (can_use_save_link) {
 
-                 object_url = get_object_url(blob);
 
-                 // FF for Android has a nasty garbage collection mechanism
 
-                 // that turns all objects that are not pure javascript into 'deadObject'
 
-                 // this means `doc` and `save_link` are unusable and need to be recreated
 
-                 // `view` is usable though:
 
-                 doc = view.document;
 
-                 save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a");
 
-                 save_link.href = object_url;
 
-                 save_link.download = name;
 
-                 var event = doc.createEvent("MouseEvents");
 
-                 event.initMouseEvent(
 
-                     "click", true, false, view, 0, 0, 0, 0, 0
 
-                     , false, false, false, false, 0, null
 
-                 );
 
-                 save_link.dispatchEvent(event);
 
-                 filesaver.readyState = filesaver.DONE;
 
-                 dispatch_all();
 
-                 return;
 
-             }
 
-             // Object and web filesystem URLs have a problem saving in Google Chrome when
 
-             // viewed in a tab, so I force save with application/octet-stream
 
-             // http://code.google.com/p/chromium/issues/detail?id=91158
 
-             if (view.chrome && type && type !== force_saveable_type) {
 
-                 slice = blob.slice || blob.webkitSlice;
 
-                 blob = slice.call(blob, 0, blob.size, force_saveable_type);
 
-                 blob_changed = true;
 
-             }
 
-             // Since I can't be sure that the guessed media type will trigger a download
 
-             // in WebKit, I append .download to the filename.
 
-             // https://bugs.webkit.org/show_bug.cgi?id=65440
 
-             if (webkit_req_fs && name !== "download") {
 
-                 name += ".download";
 
-             }
 
-             if (type === force_saveable_type || webkit_req_fs) {
 
-                 target_view = view;
 
-             }
 
-             if (!req_fs) {
 
-                 fs_error();
 
-                 return;
 
-             }
 
-             fs_min_size += blob.size;
 
-             req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
 
-                 fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
 
-                     var save = function() {
 
-                         dir.getFile(name, create_if_not_found, abortable(function(file) {
 
-                             file.createWriter(abortable(function(writer) {
 
-                                 writer.onwriteend = function(event) {
 
-                                     target_view.location.href = file.toURL();
 
-                                     deletion_queue.push(file);
 
-                                     filesaver.readyState = filesaver.DONE;
 
-                                     dispatch(filesaver, "writeend", event);
 
-                                 };
 
-                                 writer.onerror = function() {
 
-                                     var error = writer.error;
 
-                                     if (error.code !== error.ABORT_ERR) {
 
-                                         fs_error();
 
-                                     }
 
-                                 };
 
-                                 "writestart progress write abort".split(" ").forEach(function(event) {
 
-                                     writer["on" + event] = filesaver["on" + event];
 
-                                 });
 
-                                 writer.write(blob);
 
-                                 filesaver.abort = function() {
 
-                                     writer.abort();
 
-                                     filesaver.readyState = filesaver.DONE;
 
-                                 };
 
-                                 filesaver.readyState = filesaver.WRITING;
 
-                             }), fs_error);
 
-                         }), fs_error);
 
-                     };
 
-                     dir.getFile(name, {create: false}, abortable(function(file) {
 
-                         // delete file if it already exists
 
-                         file.remove();
 
-                         save();
 
-                     }), abortable(function(ex) {
 
-                         if (ex.code === ex.NOT_FOUND_ERR) {
 
-                             save();
 
-                         } else {
 
-                             fs_error();
 
-                         }
 
-                     }));
 
-                 }), fs_error);
 
-             }), fs_error);
 
-         }
 
-         , FS_proto = FileSaver.prototype
 
-         , saveAs = function(blob, name) {
 
-             return new FileSaver(blob, name);
 
-         }
 
-     ;
 
-     FS_proto.abort = function() {
 
-         var filesaver = this;
 
-         filesaver.readyState = filesaver.DONE;
 
-         dispatch(filesaver, "abort");
 
-     };
 
-     FS_proto.readyState = FS_proto.INIT = 0;
 
-     FS_proto.WRITING = 1;
 
-     FS_proto.DONE = 2;
 
-     FS_proto.error =
 
-     FS_proto.onwritestart =
 
-     FS_proto.onprogress =
 
-     FS_proto.onwrite =
 
-     FS_proto.onabort =
 
-     FS_proto.onerror =
 
-     FS_proto.onwriteend =
 
-         null;
 
-     view.addEventListener("unload", process_deletion_queue, false);
 
-     saveAs.unload = function() {
 
-         process_deletion_queue();
 
-         view.removeEventListener("unload", process_deletion_queue, false);
 
-     };
 
-     return saveAs;
 
- }(
 
-        typeof self !== "undefined" && self
 
-     || typeof window !== "undefined" && window
 
-     || this.content
 
- ));
 
- // `self` is undefined in Firefox for Android content script context
 
- // while `this` is nsIContentFrameMessageManager
 
- // with an attribute `content` that corresponds to the window
 
- if (typeof module !== "undefined") module.exports = saveAs;
 
 
  |