(function(factory){'use strict';if(typeof define==='function'&&define.amd){define(['jquery','blueimp-tmpl','./jquery.fileupload-image','./jquery.fileupload-audio','./jquery.fileupload-video','./jquery.fileupload-validate'],factory);}else if(typeof exports==='object'){factory(require('jquery'),require('blueimp-tmpl'),require('./jquery.fileupload-image'),require('./jquery.fileupload-audio'),require('./jquery.fileupload-video'),require('./jquery.fileupload-validate'));}else{factory(window.jQuery,window.tmpl);}})(function($,tmpl){'use strict';$.blueimp.fileupload.prototype._specialOptions.push('filesContainer','uploadTemplateId','downloadTemplateId');$.widget('blueimp.fileupload',$.blueimp.fileupload,{options:{autoUpload:false,showElementClass:'in',uploadTemplateId:'template-upload',downloadTemplateId:'template-download',filesContainer:undefined,prependFiles:false,dataType:'json',messages:{unknownError:'Unknown error'},getNumberOfFiles:function(){return this.filesContainer.children().not('.processing').length;},getFilesFromResponse:function(data){if(data.result&&$.isArray(data.result.files)){return data.result.files;}
return[];},add:function(e,data){if(e.isDefaultPrevented()){return false;}
var $this=$(this),that=$this.data('blueimp-fileupload')||$this.data('fileupload'),options=that.options;data.context=that._renderUpload(data.files).data('data',data).addClass('processing');options.filesContainer[options.prependFiles?'prepend':'append'](data.context);that._forceReflow(data.context);that._transition(data.context);data.process(function(){return $this.fileupload('process',data);}).always(function(){data.context.each(function(index){$(this).find('.size').text(that._formatFileSize(data.files[index].size));}).removeClass('processing');that._renderPreviews(data);}).done(function(){data.context.find('.edit,.start').prop('disabled',false);if(that._trigger('added',e,data)!==false&&(options.autoUpload||data.autoUpload)&&data.autoUpload!==false){data.submit();}}).fail(function(){if(data.files.error){data.context.each(function(index){var error=data.files[index].error;if(error){$(this).find('.error').text(error);}});}});},send:function(e,data){if(e.isDefaultPrevented()){return false;}
var that=$(this).data('blueimp-fileupload')||$(this).data('fileupload');if(data.context&&data.dataType&&data.dataType.substr(0,6)==='iframe'){data.context.find('.progress').addClass(!$.support.transition&&'progress-animated').attr('aria-valuenow',100).children().first().css('width','100%');}
return that._trigger('sent',e,data);},done:function(e,data){if(e.isDefaultPrevented()){return false;}
var that=$(this).data('blueimp-fileupload')||$(this).data('fileupload'),getFilesFromResponse=data.getFilesFromResponse||that.options.getFilesFromResponse,files=getFilesFromResponse(data),template,deferred;if(data.context){data.context.each(function(index){var file=files[index]||{error:'Empty file upload result'};deferred=that._addFinishedDeferreds();that._transition($(this)).done(function(){var node=$(this);template=that._renderDownload([file]).replaceAll(node);that._forceReflow(template);that._transition(template).done(function(){data.context=$(this);that._trigger('completed',e,data);that._trigger('finished',e,data);deferred.resolve();});});});}else{template=that._renderDownload(files)
[that.options.prependFiles?'prependTo':'appendTo'](that.options.filesContainer);that._forceReflow(template);deferred=that._addFinishedDeferreds();that._transition(template).done(function(){data.context=$(this);that._trigger('completed',e,data);that._trigger('finished',e,data);deferred.resolve();});}},fail:function(e,data){if(e.isDefaultPrevented()){return false;}
var that=$(this).data('blueimp-fileupload')||$(this).data('fileupload'),template,deferred;if(data.context){data.context.each(function(index){if(data.errorThrown!=='abort'){var file=data.files[index];file.error=file.error||data.errorThrown||data.i18n('unknownError');deferred=that._addFinishedDeferreds();that._transition($(this)).done(function(){var node=$(this);template=that._renderDownload([file]).replaceAll(node);that._forceReflow(template);that._transition(template).done(function(){data.context=$(this);that._trigger('failed',e,data);that._trigger('finished',e,data);deferred.resolve();});});}else{deferred=that._addFinishedDeferreds();that._transition($(this)).done(function(){$(this).remove();that._trigger('failed',e,data);that._trigger('finished',e,data);deferred.resolve();});}});}else if(data.errorThrown!=='abort'){data.context=that._renderUpload(data.files)
[that.options.prependFiles?'prependTo':'appendTo'](that.options.filesContainer).data('data',data);that._forceReflow(data.context);deferred=that._addFinishedDeferreds();that._transition(data.context).done(function(){data.context=$(this);that._trigger('failed',e,data);that._trigger('finished',e,data);deferred.resolve();});}else{that._trigger('failed',e,data);that._trigger('finished',e,data);that._addFinishedDeferreds().resolve();}},progress:function(e,data){if(e.isDefaultPrevented()){return false;}
var progress=Math.floor((data.loaded/data.total)*100);if(data.context){data.context.each(function(){$(this).find('.progress').attr('aria-valuenow',progress).children().first().css('width',progress+'%');});}},progressall:function(e,data){if(e.isDefaultPrevented()){return false;}
var $this=$(this),progress=Math.floor((data.loaded/data.total)*100),globalProgressNode=$this.find('.fileupload-progress'),extendedProgressNode=globalProgressNode.find('.progress-extended');if(extendedProgressNode.length){extendedProgressNode.html(($this.data('blueimp-fileupload')||$this.data('fileupload'))._renderExtendedProgress(data));}
globalProgressNode.find('.progress').attr('aria-valuenow',progress).children().first().css('width',progress+'%');},start:function(e){if(e.isDefaultPrevented()){return false;}
var that=$(this).data('blueimp-fileupload')||$(this).data('fileupload');that._resetFinishedDeferreds();that._transition($(this).find('.fileupload-progress')).done(function(){that._trigger('started',e);});},stop:function(e){if(e.isDefaultPrevented()){return false;}
var that=$(this).data('blueimp-fileupload')||$(this).data('fileupload'),deferred=that._addFinishedDeferreds();$.when.apply($,that._getFinishedDeferreds()).done(function(){that._trigger('stopped',e);});that._transition($(this).find('.fileupload-progress')).done(function(){$(this).find('.progress').attr('aria-valuenow','0').children().first().css('width','0%');$(this).find('.progress-extended').html('&nbsp;');deferred.resolve();});},processstart:function(e){if(e.isDefaultPrevented()){return false;}
$(this).addClass('fileupload-processing');},processstop:function(e){if(e.isDefaultPrevented()){return false;}
$(this).removeClass('fileupload-processing');},destroy:function(e,data){if(e.isDefaultPrevented()){return false;}
var that=$(this).data('blueimp-fileupload')||$(this).data('fileupload'),removeNode=function(){that._transition(data.context).done(function(){$(this).remove();that._trigger('destroyed',e,data);});};if(data.url){data.dataType=data.dataType||that.options.dataType;$.ajax(data).done(removeNode).fail(function(){that._trigger('destroyfailed',e,data);});}else{removeNode();}}},_resetFinishedDeferreds:function(){this._finishedUploads=[];},_addFinishedDeferreds:function(deferred){var promise=deferred||$.Deferred();this._finishedUploads.push(promise);return promise;},_getFinishedDeferreds:function(){return this._finishedUploads;},_enableDragToDesktop:function(){var link=$(this),url=link.prop('href'),name=link.prop('download'),type='application/octet-stream';link.on('dragstart',function(e){try{e.originalEvent.dataTransfer.setData('DownloadURL',[type,name,url].join(':'));}catch(ignore){}});},_formatFileSize:function(bytes){if(typeof bytes!=='number'){return '';}
if(bytes>=1000000000){return(bytes/1000000000).toFixed(2)+' GB';}
if(bytes>=1000000){return(bytes/1000000).toFixed(2)+' MB';}
return(bytes/1000).toFixed(2)+' KB';},_formatBitrate:function(bits){if(typeof bits!=='number'){return '';}
if(bits>=1000000000){return(bits/1000000000).toFixed(2)+' Gbit/s';}
if(bits>=1000000){return(bits/1000000).toFixed(2)+' Mbit/s';}
if(bits>=1000){return(bits/1000).toFixed(2)+' kbit/s';}
return bits.toFixed(2)+' bit/s';},_formatTime:function(seconds){var date=new Date(seconds*1000),days=Math.floor(seconds/86400);days=days?days+'d ':'';return(days+
('0'+date.getUTCHours()).slice(-2)+
':'+
('0'+date.getUTCMinutes()).slice(-2)+
':'+
('0'+date.getUTCSeconds()).slice(-2));},_formatPercentage:function(floatValue){return(floatValue*100).toFixed(2)+' %';},_renderExtendedProgress:function(data){return(this._formatBitrate(data.bitrate)+
' | '+
this._formatTime(((data.total-data.loaded)*8)/data.bitrate)+
' | '+
this._formatPercentage(data.loaded/data.total)+
' | '+
this._formatFileSize(data.loaded)+
' / '+
this._formatFileSize(data.total));},_renderTemplate:function(func,files){if(!func){return $();}
var result=func({files:files,formatFileSize:this._formatFileSize,options:this.options});if(result instanceof $){return result;}
return $(this.options.templatesContainer).html(result).children();},_renderPreviews:function(data){data.context.find('.preview').each(function(index,elm){$(elm).empty().append(data.files[index].preview);});},_renderUpload:function(files){return this._renderTemplate(this.options.uploadTemplate,files);},_renderDownload:function(files){return this._renderTemplate(this.options.downloadTemplate,files).find('a[download]').each(this._enableDragToDesktop).end();},_editHandler:function(e){e.preventDefault();if(!this.options.edit)return;var that=this,button=$(e.currentTarget),template=button.closest('.template-upload'),data=template.data('data'),index=button.data().index;this.options.edit(data.files[index]).then(function(file){if(!file)return;data.files[index]=file;data.context.addClass('processing');template.find('.edit,.start').prop('disabled',true);$(that.element).fileupload('process',data).always(function(){template.find('.size').text(that._formatFileSize(data.files[index].size));data.context.removeClass('processing');that._renderPreviews(data);}).done(function(){template.find('.edit,.start').prop('disabled',false);}).fail(function(){template.find('.edit').prop('disabled',false);var error=data.files[index].error;if(error){template.find('.error').text(error);}});});},_startHandler:function(e){e.preventDefault();var button=$(e.currentTarget),template=button.closest('.template-upload'),data=template.data('data');button.prop('disabled',true);if(data&&data.submit){data.submit();}},_cancelHandler:function(e){e.preventDefault();var template=$(e.currentTarget).closest('.template-upload,.template-download'),data=template.data('data')||{};data.context=data.context||template;if(data.abort){data.abort();}else{data.errorThrown='abort';this._trigger('fail',e,data);}},_deleteHandler:function(e){e.preventDefault();var button=$(e.currentTarget);this._trigger('destroy',e,$.extend({context:button.closest('.template-download'),type:'DELETE'},button.data()));},_forceReflow:function(node){return $.support.transition&&node.length&&node[0].offsetWidth;},_transition:function(node){var dfd=$.Deferred();if($.support.transition&&node.hasClass('fade')&&node.is(':visible')){var transitionEndHandler=function(e){if(e.target===node[0]){node.off($.support.transition.end,transitionEndHandler);dfd.resolveWith(node);}};node.on($.support.transition.end,transitionEndHandler).toggleClass(this.options.showElementClass);}else{node.toggleClass(this.options.showElementClass);dfd.resolveWith(node);}
return dfd;},_initButtonBarEventHandlers:function(){var fileUploadButtonBar=this.element.find('.fileupload-buttonbar'),filesList=this.options.filesContainer;this._on(fileUploadButtonBar.find('.start'),{click:function(e){e.preventDefault();filesList.find('.start').trigger('click');}});this._on(fileUploadButtonBar.find('.cancel'),{click:function(e){e.preventDefault();filesList.find('.cancel').trigger('click');}});this._on(fileUploadButtonBar.find('.delete'),{click:function(e){e.preventDefault();filesList.find('.toggle:checked').closest('.template-download').find('.delete').trigger('click');fileUploadButtonBar.find('.toggle').prop('checked',false);}});this._on(fileUploadButtonBar.find('.toggle'),{change:function(e){filesList.find('.toggle').prop('checked',$(e.currentTarget).is(':checked'));}});},_destroyButtonBarEventHandlers:function(){this._off(this.element.find('.fileupload-buttonbar').find('.start, .cancel, .delete'),'click');this._off(this.element.find('.fileupload-buttonbar .toggle'),'change.');},_initEventHandlers:function(){this._super();this._on(this.options.filesContainer,{'click .edit':this._editHandler,'click .start':this._startHandler,'click .cancel':this._cancelHandler,'click .delete':this._deleteHandler});this._initButtonBarEventHandlers();},_destroyEventHandlers:function(){this._destroyButtonBarEventHandlers();this._off(this.options.filesContainer,'click');this._super();},_enableFileInputButton:function(){this.element.find('.fileinput-button input').prop('disabled',false).parent().removeClass('disabled');},_disableFileInputButton:function(){this.element.find('.fileinput-button input').prop('disabled',true).parent().addClass('disabled');},_initTemplates:function(){var options=this.options;options.templatesContainer=this.document[0].createElement(options.filesContainer.prop('nodeName'));if(tmpl){if(options.uploadTemplateId){options.uploadTemplate=tmpl(options.uploadTemplateId);}
if(options.downloadTemplateId){options.downloadTemplate=tmpl(options.downloadTemplateId);}}},_initFilesContainer:function(){var options=this.options;if(options.filesContainer===undefined){options.filesContainer=this.element.find('.files');}else if(!(options.filesContainer instanceof $)){options.filesContainer=$(options.filesContainer);}},_initSpecialOptions:function(){this._super();this._initFilesContainer();this._initTemplates();},_create:function(){this._super();this._resetFinishedDeferreds();if(!$.support.fileInput){this._disableFileInputButton();}},enable:function(){var wasDisabled=false;if(this.options.disabled){wasDisabled=true;}
this._super();if(wasDisabled){this.element.find('input, button').prop('disabled',false);this._enableFileInputButton();}},disable:function(){if(!this.options.disabled){this.element.find('input, button').prop('disabled',true);this._disableFileInputButton();}
this._super();}});});