var OKUpload = function(){ this.config = $("#uploadConfig").data() this.imageAction = "/_services/s3/image" this.videoAction = "/_services/s3/video" this.audioAction = "/_services/s3/audio" } OKUpload.prototype.bind = function(rapper){ var uploader = this this.rapper = rapper this.$progress = $("
") this.xhrCount = 0 this.loadCount = 0 $(this.rapper).append(this.$progress) $(".add-image-button input", rapper).change( uploader.handleFileSelect.bind(uploader) ) $(".add-url", rapper).on("keydown blur", pressEnter( function(e){ var url = $(this).val() $(this).val("") uploader.parse(url) })) } OKUpload.prototype.parse = function(url){ if (! url) return var uploader = this Parser.parse( url, function(media){ console.log(url, media) if (! media) { alert("Not a valid link") } else if (media.type == "image") { uploader.add(media) } else { uploader.addMedia(media) } }) } OKUpload.prototype.handleFileSelect = function(e) { e.stopPropagation(); e.preventDefault(); var files = e.dataTransfer ? e.dataTransfer.files : e.target.files; for (var i = 0, f; f = files[i]; i++) { this.upload(f) } } OKUpload.prototype.largeFileError = function(file, maxSize) { var your_bytes = bytesToString(file.size) var max_bytes = bytesToString(maxSize) alert("Sorry, your file is too big.\n\n" + file.name + "\n\nYour file: " + your_bytes + "\nMax size: " + max_bytes) function bytesToString (n) { if (n < 1024) return n + " bytes" n /= 1024 if (n < 1024) return n.toFixed(1) + " kb" n /= 1024 if (n < 1024) return n.toFixed(1) + " mb" } } OKUpload.prototype.upload = function(f){ var field, action if ( f.type.match('video.*') ) { if (this.config.videoMaxbytes && f.size > this.config.videoMaxbytes) { return this.largeFileError(f, this.config.videoMaxbytes) } field = 'video' action = this.videoAction } else if ( f.type.match('audio.*') ) { if (this.config.audioMaxbytes && f.size > this.config.audioMaxbytes) { return this.largeFileError(f, this.config.audioMaxbytes) } field = 'audio' action = this.audioAction } else { if (this.config.imageMaxbytes && f.size > this.config.imageMaxbytes) { return this.largeFileError(f, this.config.imageMaxbytes) } field = 'image' action = this.imageAction || this.action } this.xhrCount += 1 this.$progress.addClass("loading") var $loader = $("
") var $loading_bar = $("
") $loading_bar.css("width", "0%") $loader.append( $loading_bar ) this.$progress.append($loader) var fd = new FormData() fd.append(field, f) var request = new XMLHttpRequest() request.open("POST", action, true) request.addEventListener("progress", updateProgress.bind(this)); request.addEventListener("load", transferComplete.bind(this)); request.addEventListener("error", transferError.bind(this)); request.addEventListener("abort", transferAbort.bind(this)); function updateProgress (e) { if (e.lengthComputable) { var percentComplete = Math.round( 100 * e.loaded / e.total ) $loading_bar.css("width", percentComplete + "%") } } function transferComplete (data) { this.loadCount += 1 this.hideUploadBars() if (request.readyState == 4 && request.status == 200) { var responseData try { responseData = JSON.parse( request.responseText ) this.success( responseData ) } catch (e) { console.log(request.responseText) console.log("ERROR PARSING JSON") } } console.log(arguments, request) } function transferError (data) { console.log("Transfer error") this.loadCount += 1 this.hideUploadBars() console.log(arguments) } function transferAbort (data) { console.log("Transfer aborted") this.loadCount += 1 this.hideUploadBars() console.log(arguments) } request.send(fd) /* var request = $.ajax({ url: this.action, type: "post", data: fd, dataType: "json", processData: false, contentType: false, }) request.done(this.success.bind(this)) */ } OKUpload.prototype.hideUploadBars = function () { if (this.xhrCount == this.loadCount) { this.$progress.removeClass("loading") setTimeout(function(){ this.$progress.empty() }.bind(this), 300) } } OKUpload.prototype.success = function(data){ if (data.error) { console.log(data.error) return } var url = data[0].extra.Location.replace(/%2F/, '\/') console.log(url) this.parse(url) } OKUpload.prototype.add = function(media){ console.log(media) } OKUpload.prototype.addMedia = function(media){ console.log(media) } OKUpload.prototype.addAudio = function(media){ console.log(media) } OKUpload.prototype.error = function(error){ throw error } function pressEnter(fn){ return function(e){ if (e.keyCode && e.keyCode !== 13) return e.preventDefault() fn.apply(this) } }