(function(factory){'use strict';if(typeof define==='function'&&define.amd){define(['jquery','tmpl','./jquery.fileupload-image','./jquery.fileupload-audio','./jquery.fileupload-video','./jquery.fileupload-validate'],factory);}else{factory(window.jQuery,window.tmpl);}}(function($,tmpl,loadImage){'use strict';$.blueimp.fileupload.prototype._specialOptions.push('filesContainer','uploadTemplateId','downloadTemplateId');$.widget('blueimp.fileupload',$.blueimp.fileupload,{options:{autoUpload:false,uploadTemplateId:'template-upload',downloadTemplateId:'template-download',filesContainer:undefined,prependFiles:false,dataType:'json',getNumberOfFiles:function(){return this.filesContainer.children().length;},getFilesFromResponse:function(data){if(data.result&&Array.isArray(data.result.files)){return data.result.files;}
return[];},add:function(e,data){var $this=$(this),that=$this.data('blueimp-fileupload')||$this.data('fileupload'),options=that.options,files=data.files;data.process(function(){return $this.fileupload('process',data);}).always(function(){data.context=that._renderUpload(files).data('data',data);that._renderPreviews(data);options.filesContainer[options.prependFiles?'prepend':'append'](data.context);that._forceReflow(data.context);that._transition(data.context).done(function(){if((that._trigger('added',e,data)!==false)&&(options.autoUpload||data.autoUpload)&&data.autoUpload!==false&&!data.files.error){data.submit();}});});},send:function(e,data){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).find('.bar').css('width','100%');}
return that._trigger('sent',e,data);},done:function(e,data){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){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||true;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(data.context){var progress=Math.floor(data.loaded / data.total*100);data.context.find('.progress').attr('aria-valuenow',progress).find('.bar').css('width',progress+'%');}},progressall:function(e,data){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).find('.bar').css('width',progress+'%');},start:function(e){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){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').find('.bar').css('width','0%');$(this).find('.progress-extended').html('&nbsp;');deferred.resolve();});},processstart:function(){$(this).addClass('fileupload-processing');},processstop:function(){$(this).removeClass('fileupload-processing');},destroy:function(e,data){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){$.ajax(data).done(removeNode);}else{removeNode();}}},_resetFinishedDeferreds:function(){this._finishedUploads=[];},_addFinishedDeferreds:function(deferred){if(!deferred){deferred=$.Deferred();}
this._finishedUploads.push(deferred);return deferred;},_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).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();},_startHandler:function(e){e.preventDefault();var button=$(e.currentTarget),template=button.closest('.template-upload'),data=template.data('data');if(data&&data.submit&&!data.jqXHR&&data.submit()){button.prop('disabled',true);}},_cancelHandler:function(e){e.preventDefault();var template=$(e.currentTarget).closest('.template-upload'),data=template.data('data')||{};if(!data.jqXHR){data.errorThrown='abort';this._trigger('fail',e,data);}else{data.jqXHR.abort();}},_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')){node.on($.support.transition.end,function(e){if(e.target===node[0]){node.off($.support.transition.end);dfd.resolveWith(node);}}).toggleClass('in');}else{node.toggleClass('in');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').click();}});this._on(fileUploadButtonBar.find('.cancel'),{click:function(e){e.preventDefault();filesList.find('.cancel').click();}});this._on(fileUploadButtonBar.find('.delete'),{click:function(e){e.preventDefault();filesList.find('.toggle:checked').closest('.template-download').find('.delete').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 .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();}});}));