﻿
Ext.ux.FileUploader=function(config){Ext.apply(this,config);Ext.ux.FileUploader.superclass.constructor.apply(this,arguments);this.addEvents('beforeallstart','allfinished','beforefilestart','filefinished','progress');};Ext.extend(Ext.ux.FileUploader,Ext.util.Observable,{baseParams:{cmd:'upload',dir:'.'},concurrent:true,enableProgress:true,jsonErrorText:'Cannot decode JSON object',maxFileSize:524288,progressIdName:'UPLOAD_IDENTIFIER',progressInterval:2000,progressUrl:'upload.ashx?progress',progressMap:{bytes_total:'bytesTotal',bytes_uploaded:'bytesUploaded',est_sec:'estSec',files_uploaded:'filesUploaded',speed_average:'speedAverage',speed_last:'speedLast',time_last:'timeLast',time_start:'timeStart'},singleUpload:false,unknownErrorText:__tr('Unknown error'),upCount:0,progressRequestIds:{},createForm:function(record){var progressId=parseInt(Math.random()*1e10,10);var formItems=[{tag:'input',type:'hidden',name:'APC_UPLOAD_PROGRESS',value:progressId},{tag:'input',type:'hidden',name:this.progressIdName,value:progressId},{tag:'input',type:'hidden',name:'MAX_FILE_SIZE',value:this.maxFileSize},{tag:'input',type:'hidden',name:'path',value:this.path}];for(var p in this.baseParams){if(this.baseParams.hasOwnProperty(p)){formItems.push({tag:'input',type:'hidden',name:p,value:Ext.util.Format.htmlEncode(this.baseParams[p])});}}
var form=Ext.getBody().createChild({tag:'form',action:this.url,method:'post',cls:'x-hidden',id:Ext.id(),cn:formItems});if(record){record.set('form',form);record.set('progressId',progressId);}
else{this.progressId=progressId;}
return form;},deleteForm:function(form,record){form.remove();if(record){record.set('form',null);}},fireFinishEvents:function(options){if(true!==this.eventsSuspended&&!this.singleUpload){this.fireEvent('filefinished',this,options&&options.record);}
if(true!==this.eventsSuspended&&0===this.upCount){this.stopProgress();this.fireEvent('allfinished',this);}},getIframe:function(record){var iframe=null;var form=record.get('form');if(form&&form.dom&&form.dom.target){iframe=Ext.get(form.dom.target);}
return iframe;},getOptions:function(record,params){var o={url:this.url,method:'post',isUpload:true,scope:this,callback:this.uploadCallback,record:record};return o;},processSuccess:function(options,response,o){var record=false;if(this.singleUpload){this.store.each(function(r){r.set('state','done');r.set('error','');r.set('info',o);r.commit();});}
else{record=options.record;record.set('state','done');record.set('error','');record.set('info',o);record.commit();}
this.deleteForm(options.form,record);},processFailure:function(options,response,error){var record=options.record;var records;if(this.singleUpload){records=this.store.queryBy(function(r){return'done'!==r.get('state');});records.each(function(record){var e=error.errors?error.errors[record.id]:this.unknownErrorText;if(e){record.set('state','failed');record.set('error',e);record.set('info','');Ext.getBody().appendChild(record.get('input'));}
else{record.set('state','done');record.set('error','');record.set('info','');}
record.commit();},this);this.deleteForm(options.form);}
else{if(error&&'object'===Ext.type(error)){record.set('error',error.errors&&error.errors[record.id]?error.errors[record.id]:this.unknownErrorText);}
else if(error){record.set('error',error);}
else if(response&&response.responseText){record.set('error',response.responseText);}
else{record.set('error',this.unknownErrorText);}
record.set('state','failed');record.set('info','');record.commit();}},requestProgress:function(){var progressRequestor=function(progressId,record)
{var o={url:this.progressUrl,method:'post',params:{},scope:this,callback:function(options,success,response){delete this.progressRequestIds[options.progressRequestId];if(this.upCount==0)
return;var o;if(true!==success){return;}
try{o=Ext.decode(response.responseText);}
catch(e){return;}
if('object'!==Ext.type(o)||true!==o.success){return;}
if(this.singleUpload){this.progress={};for(var p in o){if(this.progressMap[p]){this.progress[this.progressMap[p]]=o[p];}}
if(true!==this.eventsSuspended){this.fireEvent('progress',this,this.progress);}}
else{for(var p in o){if(this.progressMap[p]&&options.record){options.record.set(this.progressMap[p],o[p]);}}
if(options.record){options.record.commit();if(true!==this.eventsSuspended){this.fireEvent('progress',this,options.record.data,options.record);}}}
this.progressTask.delay(this.progressInterval);}};o.params[this.progressIdName]=progressId;o.params.APC_UPLOAD_PROGRESS=progressId;if(record){o.record=record;}
o.progressRequestId=Ext.Ajax.request(o);this.progressRequestIds[o.progressRequestId]=true;};if(this.singleUpload){progressRequestor.call(this,this.progressId);}
else{Ext.each(this.store.query('state','uploading').items,(function(r){progressRequestor.defer(250,this,[r.get('progressId'),r]);}).createDelegate(this));}},setPath:function(path){this.path=path;},setUrl:function(url){this.url=url;},startProgress:function(){if(!this.progressTask){this.progressTask=new Ext.util.DelayedTask(this.requestProgress,this);}
this.progressTask.delay.defer(this.progressInterval/2,this.progressTask,[this.progressInterval]);},stopProgress:function(){if(this.progressTask){this.progressTask.cancel();}
for(var i in this.progressRequestIds)
{Ext.Ajax.abort(i);delete this.progressRequestIds[i];}},stopAll:function(){var records=this.store.query('state','uploading');records.each(this.stopUpload,this);},stopUpload:function(record){var iframe=false;if(record){iframe=this.getIframe(record);this.stopIframe(iframe);this.upCount--;this.upCount=0>this.upCount?0:this.upCount;record.set('state','stopped');this.fireFinishEvents({record:record});}
else if(this.form){iframe=Ext.fly(this.form.dom.target);this.stopIframe(iframe);this.upCount=0;this.fireFinishEvents();}},stopIframe:function(iframe){if(iframe){try{iframe.dom.contentWindow.stop();iframe.remove.defer(250,iframe);}
catch(e){}}},upload:function(){var records=this.store.queryBy(function(r){return'done'!==r.get('state');});if(!records.getCount()){return;}
if(true!==this.eventsSuspended&&false===this.fireEvent('beforeallstart',this)){return;}
if(this.singleUpload){this.uploadSingle();}
else{records.each(this.uploadFile,this);}
if(true===this.enableProgress){this.startProgress();}},uploadCallback:function(options,success,response){var o;this.upCount--;this.form=false;if(true===success){try{o=Ext.decode(response.responseText);}
catch(e){this.processFailure(options,response,this.jsonErrorText);this.fireFinishEvents(options);return;}
if(true===o.success){this.processSuccess(options,response,o);}
else{this.processFailure(options,response,o);}}
else{this.processFailure(options,response);}
this.fireFinishEvents(options);},uploadFile:function(record,params){if(true!==this.eventsSuspended&&false===this.fireEvent('beforefilestart',this,record)){return;}
var form=this.createForm(record);var inp=record.get('input');inp.set({name:record.id});form.appendChild(inp);var o=this.getOptions(record,params);o.form=form;record.set('state','uploading');record.set('pctComplete',0);this.upCount++;Ext.Ajax.request(o);this.getIframe.defer(100,this,[record]);},uploadSingle:function(){var records=this.store.queryBy(function(r){return'done'!==r.get('state');});if(!records.getCount()){return;}
var form=this.createForm();records.each(function(record){var inp=record.get('input');inp.set({name:record.id});form.appendChild(inp);record.set('state','uploading');},this);var o=this.getOptions();o.form=form;this.form=form;this.upCount++;Ext.Ajax.request(o);}});Ext.reg('fileuploader',Ext.ux.FileUploader);