docs: function Multipart() {
  
  		// Internal body
  		var body = [];
  		var boundary = (Math.random() * 1e10).toString(32);
  		var counter = 0;
  		var lineBreak = '\r\n';
  		var delim = lineBreak + '--' + boundary;
  		var ready = function() {};
  
  		var dataUri = /^data\:([^;,]+(\;charset=[^;,]+)?)(\;base64)?,/i;
  
  		// Add file
  		function addFile(item) {
  			var fr = new FileReader();
  			fr.onload = function(e) {
  				addContent(btoa(e.target.result), item.type + lineBreak + 'Content-Transfer-Encoding: base64');
  			};
  
  			fr.readAsBinaryString(item);
  		}
  
  		// Add content
  		function addContent(content, type) {
  			body.push(lineBreak + 'Content-Type: ' + type + lineBreak + lineBreak + content);
  			counter--;
  			ready();
  		}
  
  		// Add new things to the object
  		this.append = function(content, type) {
  
  			// Does the content have an array
  			if (typeof (content) === 'string' || !('length' in Object(content))) {
  				// Converti to multiples
  				content = [content];
  			}
  
  			for (var i = 0; i < content.length; i++) {
  
  				counter++;
  
  				var item = content[i];
  
  				// Is this a file?
  				// Files can be either Blobs or File types
  				if (
  					(typeof (File) !== 'undefined' && item instanceof File) ||
  					(typeof (Blob) !== 'undefined' && item instanceof Blob)
  				) {
  					// Read the file in
  					addFile(item);
  				}
  
  				// Data-URI?
  				// Data:[<mime type>][;charset=<charset>][;base64],<encoded data>
  				// /^data\:([^;,]+(\;charset=[^;,]+)?)(\;base64)?,/i
  				else if (typeof (item) === 'string' && item.match(dataUri)) {
  					var m = item.match(dataUri);
  					addContent(item.replace(dataUri, ''), m[1] + lineBreak + 'Content-Transfer-Encoding: base64');
  				}
  
  				// Regular string
  				else {
  					addContent(item, type);
  				}
  			}
  		};
  
  		this.onready = function(fn) {
  			ready = function() {
  				if (counter === 0) {
  					// Trigger ready
  					body.unshift('');
  					body.push('--');
  					fn(body.join(delim), boundary);
  					body = [];
  				}
  			};
  
  			ready();
  		};
  	}