define(function (require) { var Marionette = require('backbone.marionette') , _ = require('underscore') , Plupload = require('plupload') , handlebars = require('handlebars'); // Include the file-upload.html var uploadTpl = require('hbs!file-upload'); return Marionette.ItemView.extend({ className: "file-uploader", template: uploadTpl, uploader: null, options: {}, successMessage: 'File uploaded successfully', ui: { message: '.message', fileList: '#filelist', browseButton: '#file-select', uploadButton: '#file-upload', progressContainer: '.progress', progressBar: '.progress .bar' }, events: { 'click #file-upload': 'startUpload' }, initialize: function(options) { if(options) { this.options = options; this.successMessage = options.successMessage || this.successMessage; } }, onRender: function() { this.ui.progressContainer.hide(); var defaults = { runtimes : 'gears,html5,flash,silverlight,browserplus', browse_button : this.ui.browseButton.get(0), container : this.el, multi_selection: false, max_file_size : '10mb', filters : [ {title : "CSV files", extensions : "csv"} ], resize : {width : 320, height : 240, quality : 90} }; this.uploader = new Plupload.Uploader(_.defaults(this.options, defaults)); this.uploader.init(); this.uploader.bind('FilesAdded', _.bind(this.filesAdded, this)); this.uploader.bind('UploadProgress', _.bind(this.uploadProgress, this)); this.uploader.bind('FileUploaded', _.bind(this.fileUploaded, this)); this.uploader.bind('Error', _.bind(this.handleUploadErrors, this)); }, startUpload: function(e) { e.preventDefault(); this.uploader.start(); this.ui.progressContainer.show(); }, filesAdded: function(up, files) { var html = ""; $.each(files, function(i, file) { html += '
' + file.name + ' (' + plupload.formatSize(file.size) + ') ' + '
'; }); this.ui.message.html('
' + html + '
'); up.refresh(); // Reposition Flash/Silverlight }, uploadProgress: function(up, file) { this.ui.progressBar.width(file.percent + '%'); }, fileUploaded: function(up, file) { this.ui.progressBar.addClass('bar-success'); this.ui.progressBar.parent().removeClass('active'); this.ui.message.html('
' + this.successMessage + '
'); }, handleUploadErrors: function(up, err) { this.ui.message.html('
An error occured: ' + err.message + " for " + (err.file ? ", File: " + err.file.name : "") + '
'); } }); });