docs: function uploadDrive(p, callback) {
  
  		var data = {};
  
  		// Test for DOM element
  		if (p.data &&
  			(typeof (HTMLInputElement) !== 'undefined' && p.data instanceof HTMLInputElement)
  		) {
  			p.data = {file: p.data};
  		}
  
  		if (!p.data.name && Object(Object(p.data.file).files).length && p.method === 'post') {
  			p.data.name = p.data.file.files[0].name;
  		}
  
  		if (p.method === 'post') {
  			p.data = {
  				title: p.data.name,
  				parents: [{id: p.data.parent || 'root'}],
  				file: p.data.file
  			};
  		}
  		else {
  
  			// Make a reference
  			data = p.data;
  			p.data = {};
  
  			// Add the parts to change as required
  			if (data.parent) {
  				p.data.parents = [{id: p.data.parent || 'root'}];
  			}
  
  			if (data.file) {
  				p.data.file = data.file;
  			}
  
  			if (data.name) {
  				p.data.title = data.name;
  			}
  		}
  
  		// Extract the file, if it exists from the data object
  		// If the File is an INPUT element lets just concern ourselves with the NodeList
  		var file;
  		if ('file' in p.data) {
  			file = p.data.file;
  			delete p.data.file;
  
  			if (typeof (file) === 'object' && 'files' in file) {
  				// Assign the NodeList
  				file = file.files;
  			}
  
  			if (!file || !file.length) {
  				callback({
  					error: {
  						code: 'request_invalid',
  						message: 'There were no files attached with this request to upload'
  					}
  				});
  				return;
  			}
  		}
  
  		// Set type p.data.mimeType = Object(file[0]).type || 'application/octet-stream';
  
  		// Construct a multipart message
  		var parts = new Multipart();
  		parts.append(JSON.stringify(p.data), 'application/json');
  
  		// Read the file into a  base64 string... yep a hassle, i know
  		// FormData doesn't let us assign our own Multipart headers and HTTP Content-Type
  		// Alas GoogleApi need these in a particular format
  		if (file) {
  			parts.append(file);
  		}
  
  		parts.onready(function(body, boundary) {
  
  			p.headers['content-type'] = 'multipart/related; boundary="' + boundary + '"';
  			p.data = body;
  
  			callback('upload/drive/v2/files' + (data.id ? '/' + data.id : '') + '?uploadType=multipart');
  		});
  
  	}