Feature #22004 ยป plupload_v3.patch
typo3/classes/class.typo3_tcefile.php (revision ) | ||
---|---|---|
$this->init();
|
||
$this->main();
|
||
$errors = $this->fileProcessor->getErrorMessages();
|
||
$uploaderType = t3lib_div::_GP('uploaderType');
|
||
if (count($errors)) {
|
||
$ajaxObj->setError(implode(',', $errors));
|
||
} else {
|
||
if ($uploaderType === 'plupload') {
|
||
$ajaxObj->addContent('result', $this->fileData);
|
||
$ajaxObj->addContent('result', $this->fileData);
|
||
if (count($this->fileData)) {
|
||
$ajaxObj->addContent('success', true);
|
||
} else {
|
||
$ajaxObj->addContent('success', false);
|
||
}
|
||
} else {
|
||
$ajaxObj->addContent('result', $this->fileData);
|
||
if ($this->redirect) {
|
||
$ajaxObj->addContent('redirect', $this->redirect);
|
||
}
|
||
if ($this->redirect) {
|
||
$ajaxObj->addContent('redirect', $this->redirect);
|
||
}
|
||
}
|
||
$ajaxObj->setContentFormat('json');
|
||
}
|
||
}
|
||
... | ... | |
include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['typo3/classes/class.typo3_tcefile.php']);
|
||
}
|
||
?>
|
||
?>
|
typo3/contrib/plupload/js/plupload.min.js (revision ) | ||
---|---|---|
(function(){var c=0,h=[],j={},f={},a={"<":"lt",">":"gt","&":"amp",'"':"quot","'":"#39"},i=/[<>&\"\']/g,b;function e(){this.returnValue=false}function g(){this.cancelBubble=true}(function(k){var l=k.split(/,/),m,o,n;for(m=0;m<l.length;m+=2){n=l[m+1].split(/ /);for(o=0;o<n.length;o++){f[n[o]]=l[m]}}})("application/msword,doc dot,application/pdf,pdf,application/pgp-signature,pgp,application/postscript,ps ai eps,application/rtf,rtf,application/vnd.ms-excel,xls xlb,application/vnd.ms-powerpoint,ppt pps pot,application/zip,zip,application/x-shockwave-flash,swf swfl,application/vnd.openxmlformats,docx pptx xlsx,audio/mpeg,mpga mpega mp2 mp3,audio/x-wav,wav,image/bmp,bmp,image/gif,gif,image/jpeg,jpeg jpg jpe,image/png,png,image/svg+xml,svg svgz,image/tiff,tiff tif,text/html,htm html xhtml,text/rtf,rtf,video/mpeg,mpeg mpg mpe,video/quicktime,qt mov,video/x-flv,flv,video/vnd.rn-realvideo,rv,text/plain,asc txt text diff log,application/octet-stream,exe");var d={STOPPED:1,STARTED:2,QUEUED:1,UPLOADING:2,FAILED:4,DONE:5,GENERIC_ERROR:-100,HTTP_ERROR:-200,IO_ERROR:-300,SECURITY_ERROR:-400,INIT_ERROR:-500,FILE_SIZE_ERROR:-600,FILE_EXTENSION_ERROR:-700,mimeTypes:f,extend:function(k){d.each(arguments,function(l,m){if(m>0){d.each(l,function(o,n){k[n]=o})}});return k},cleanName:function(k){var l,m;m=[/[\300-\306]/g,"A",/[\340-\346]/g,"a",/\307/g,"C",/\347/g,"c",/[\310-\313]/g,"E",/[\350-\353]/g,"e",/[\314-\317]/g,"I",/[\354-\357]/g,"i",/\321/g,"N",/\361/g,"n",/[\322-\330]/g,"O",/[\362-\370]/g,"o",/[\331-\334]/g,"U",/[\371-\374]/g,"u"];for(l=0;l<m.length;l+=2){k=k.replace(m[l],m[l+1])}k=k.replace(/\s+/g,"_");k=k.replace(/[^a-z0-9_\-\.]+/gi,"");return k},addRuntime:function(k,l){l.name=k;h[k]=l;h.push(l);return l},guid:function(){var k=new Date().getTime().toString(32),l;for(l=0;l<5;l++){k+=Math.floor(Math.random()*65535).toString(32)}return(d.guidPrefix||"p")+k+(c++).toString(32)},buildUrl:function(l,k){var m="";d.each(k,function(o,n){m+=(m?"&":"")+encodeURIComponent(n)+"="+encodeURIComponent(o)});if(m){l+=(l.indexOf("?")>0?"&":"?")+m}return l},each:function(n,o){var m,l,k;if(n){m=n.length;if(m===b){for(l in n){if(n.hasOwnProperty(l)){if(o(n[l],l)===false){return}}}}else{for(k=0;k<m;k++){if(o(n[k],k)===false){return}}}}},formatSize:function(k){if(k===b){return d.translate("N/A")}if(k>1048576){return Math.round(k/1048576,1)+" MB"}if(k>1024){return Math.round(k/1024,1)+" KB"}return k+" b"},getPos:function(l,p){var q=0,o=0,s,r=document,m,n;l=l;p=p||r.body;function k(w){var u,v,t=0,z=0;if(w){v=w.getBoundingClientRect();u=r.compatMode==="CSS1Compat"?r.documentElement:r.body;t=v.left+u.scrollLeft;z=v.top+u.scrollTop}return{x:t,y:z}}if(l.getBoundingClientRect&&(navigator.userAgent.indexOf("MSIE")>0&&r.documentMode!==8)){m=k(l);n=k(p);return{x:m.x-n.x,y:m.y-n.y}}s=l;while(s&&s!=p&&s.nodeType){q+=s.offsetLeft||0;o+=s.offsetTop||0;s=s.offsetParent}s=l.parentNode;while(s&&s!=p&&s.nodeType){q-=s.scrollLeft||0;o-=s.scrollTop||0;s=s.parentNode}return{x:q,y:o}},getSize:function(k){return{w:k.clientWidth||k.offsetWidth,h:k.clientHeight||k.offsetHeight}},parseSize:function(k){var l;if(typeof(k)=="string"){k=/^([0-9]+)([mgk]+)$/.exec(k.toLowerCase().replace(/[^0-9mkg]/g,""));l=k[2];k=+k[1];if(l=="g"){k*=1073741824}if(l=="m"){k*=1048576}if(l=="k"){k*=1024}}return k},xmlEncode:function(k){return k?(""+k).replace(i,function(l){return a[l]?"&"+a[l]+";":l}):k},toArray:function(m){var l,k=[];for(l=0;l<m.length;l++){k[l]=m[l]}return k},addI18n:function(k){return d.extend(j,k)},translate:function(k){return j[k]||k},addEvent:function(l,k,m){if(l.attachEvent){l.attachEvent("on"+k,function(){var n=window.event;if(!n.target){n.target=n.srcElement}n.preventDefault=e;n.stopPropagation=g;m(n)})}else{if(l.addEventListener){l.addEventListener(k,m,false)}}}};d.Uploader=function(n){var l={},q,p=[],r,m;q=new d.QueueProgress();n=d.extend({chunk_size:0,multipart:true,multi_selection:true,file_data_name:"file",filters:[]},n);function o(){var s;if(this.state==d.STARTED&&r<p.length){s=p[r++];if(s.status==d.QUEUED){this.trigger("BeforeUpload",s);this.trigger("UploadFile",s)}else{o.call(this)}}else{this.stop()}}function k(){var t,s;q.reset();for(t=0;t<p.length;t++){s=p[t];if(s.size!==b){q.size+=s.size;q.loaded+=s.loaded}else{q.size=b}if(s.status==d.DONE){q.uploaded++}else{if(s.status==d.FAILED){q.failed++}else{q.queued++}}}if(q.size===b){q.percent=p.length>0?Math.ceil(q.uploaded/p.length*100):0}else{q.bytesPerSec=Math.ceil(q.loaded/((+new Date()-m||1)/1000));q.percent=q.size>0?Math.ceil(q.loaded/q.size*100):0}}d.extend(this,{state:d.STOPPED,features:{},files:p,settings:n,total:q,id:d.guid(),init:function(){var x=this,y,u,t,w=0,v;n.page_url=n.page_url||document.location.pathname.replace(/\/[^\/]+$/g,"/");if(!/^(\w+:\/\/|\/)/.test(n.url)){n.url=n.page_url+n.url}n.chunk_size=d.parseSize(n.chunk_size);n.max_file_size=d.parseSize(n.max_file_size);x.bind("FilesAdded",function(z,C){var B,A,E=0,F,D=n.filters;if(D&&D.length){F=[];d.each(D,function(G){d.each(G.extensions.split(/,/),function(H){F.push("\\."+H.replace(new RegExp("["+("/^$.*+?|()[]{}\\".replace(/./g,"\\$&"))+"]","g"),"\\$&"))})});F=new RegExp(F.join("|")+"$","i")}for(B=0;B<C.length;B++){A=C[B];A.loaded=0;A.percent=0;A.status=d.QUEUED;if(F&&!F.test(A.name)){z.trigger("Error",{code:d.FILE_EXTENSION_ERROR,message:"File extension error.",file:A});continue}if(A.size!==b&&A.size>n.max_file_size){z.trigger("Error",{code:d.FILE_SIZE_ERROR,message:"File size error.",file:A});continue}p.push(A);E++}if(E){x.trigger("QueueChanged");x.refresh()}});if(n.unique_names){x.bind("UploadFile",function(z,A){var C=A.name.match(/\.([^.]+)$/),B="tmp";if(C){B=C[1]}A.target_name=A.id+"."+B})}x.bind("UploadProgress",function(z,A){if(A.status==d.QUEUED){A.status=d.UPLOADING}A.percent=A.size>0?Math.ceil(A.loaded/A.size*100):100;k()});x.bind("StateChanged",function(z){if(z.state==d.STARTED){m=(+new Date())}});x.bind("QueueChanged",k);x.bind("Error",function(z,A){if(A.file){A.file.status=d.FAILED;k();window.setTimeout(function(){o.call(x)})}});x.bind("FileUploaded",function(z,A){A.status=d.DONE;A.loaded=A.size;z.trigger("UploadProgress",A);o.call(x)});if(n.runtimes){u=[];v=n.runtimes.split(/\s?,\s?/);for(y=0;y<v.length;y++){if(h[v[y]]){u.push(h[v[y]])}}}else{u=h}function s(){var C=u[w++],B,z,A;if(C){B=C.getFeatures();z=x.settings.required_features;if(z){z=z.split(",");for(A=0;A<z.length;A++){if(!B[z[A]]){s();return}}}C.init(x,function(D){if(D&&D.success){x.features=B;x.trigger("Init",{runtime:C.name});x.trigger("PostInit");x.refresh()}else{s()}})}else{x.trigger("Error",{code:d.INIT_ERROR,message:"Init error."})}}s()},refresh:function(){this.trigger("Refresh")},start:function(){if(this.state!=d.STARTED){r=0;this.state=d.STARTED;this.trigger("StateChanged");o.call(this)}},stop:function(){if(this.state!=d.STOPPED){this.state=d.STOPPED;this.trigger("StateChanged")}},getFile:function(t){var s;for(s=p.length-1;s>=0;s--){if(p[s].id===t){return p[s]}}},removeFile:function(t){var s;for(s=p.length-1;s>=0;s--){if(p[s].id===t.id){return this.splice(s,1)[0]}}},splice:function(u,s){var t;t=p.splice(u,s);this.trigger("FilesRemoved",t);this.trigger("QueueChanged");return t},trigger:function(t){var v=l[t.toLowerCase()],u,s;if(v){s=Array.prototype.slice.call(arguments);s[0]=this;for(u=0;u<v.length;u++){if(v[u].func.apply(v[u].scope,s)===false){return false}}}return true},bind:function(s,u,t){var v;s=s.toLowerCase();v=l[s]||[];v.push({func:u,scope:t||this});l[s]=v},unbind:function(s,u){var v=l[s.toLowerCase()],t;if(v){for(t=v.length-1;t>=0;t--){if(v[t].func===u){v.splice(t,1)}}}}})};d.File=function(n,l,m){var k=this;k.id=n;k.name=l;k.size=m;k.loaded=0;k.percent=0;k.status=0};d.Runtime=function(){this.getFeatures=function(){};this.init=function(k,l){}};d.QueueProgress=function(){var k=this;k.size=0;k.loaded=0;k.uploaded=0;k.failed=0;k.queued=0;k.percent=0;k.bytesPerSec=0;k.reset=function(){k.size=k.loaded=k.uploaded=k.failed=k.queued=k.percent=k.bytesPerSec=0}};d.runtimes={};window.plupload=d})();
|
typo3/contrib/plupload/js/plupload.html4.min.js (revision ) | ||
---|---|---|
(function(a){a.runtimes.Html4=a.addRuntime("html4",{getFeatures:function(){return{multipart:true}},init:function(f,g){var d={},c,b;function e(l){var k,j,m=[],n,h;h=l.value.replace(/\\/g,"/");h=h.substring(h.length,h.lastIndexOf("/")+1);n=a.guid();k=new a.File(n,h);d[n]=k;k.input=l;m.push(k);if(m.length){f.trigger("FilesAdded",m)}}f.bind("Init",function(p){var h,x,v,t=[],o,u,m=p.settings.filters,l,s,r=/MSIE/.test(navigator.userAgent),k="javascript",w,j=document.body,n;if(f.settings.container){j=document.getElementById(f.settings.container);j.style.position="relative"}c=(typeof p.settings.form=="string")?document.getElementById(p.settings.form):p.settings.form;if(!c){n=document.getElementById(f.settings.browse_button);for(;n;n=n.parentNode){if(n.nodeName=="FORM"){c=n}}}if(!c){c=document.createElement("form");c.style.display="inline";n=document.getElementById(f.settings.container);n.parentNode.insertBefore(c,n);c.appendChild(n)}c.setAttribute("method","post");c.setAttribute("enctype","multipart/form-data");a.each(p.settings.multipart_params,function(z,y){var i=document.createElement("input");a.extend(i,{type:"hidden",name:y,value:z});c.appendChild(i)});b=document.createElement("iframe");b.setAttribute("src",k+':""');b.setAttribute("name",p.id+"_iframe");b.setAttribute("id",p.id+"_iframe");b.style.display="none";a.addEvent(b,"load",function(B){var C=B.target,z=f.currentfile,A;try{A=C.contentWindow.document||C.contentDocument||window.frames[C.id].document}catch(y){p.trigger("Error",{code:a.SECURITY_ERROR,message:"Security error.",file:z});return}if(A.location.href=="about:blank"||!z){return}var i=A.documentElement.innerText||A.documentElement.textContent;if(i!=""){z.status=a.DONE;z.loaded=1025;z.percent=100;if(z.input){z.input.removeAttribute("name")}p.trigger("UploadProgress",z);p.trigger("FileUploaded",z,{response:i});if(c.tmpAction){c.setAttribute("action",c.tmpAction)}if(c.tmpTarget){c.setAttribute("target",c.tmpTarget)}}});c.appendChild(b);if(r){window.frames[b.id].name=b.name}x=document.createElement("div");x.id=p.id+"_iframe_container";for(o=0;o<m.length;o++){l=m[o].extensions.split(/,/);for(u=0;u<l.length;u++){s=a.mimeTypes[l[u]];if(s){t.push(s)}}}a.extend(x.style,{position:"absolute",background:"transparent",width:"100px",height:"100px",overflow:"hidden",zIndex:99999,opacity:0});w=f.settings.shim_bgcolor;if(w){a.extend(x.style,{background:w,opacity:1})}x.className="plupload_iframe";j.appendChild(x);function q(){v=document.createElement("input");v.setAttribute("type","file");v.setAttribute("accept",t.join(","));v.setAttribute("size",1);a.extend(v.style,{width:"100%",height:"100%",opacity:0});if(r){a.extend(v.style,{filter:"alpha(opacity=0)"})}a.addEvent(v,"change",function(i){var y=i.target;if(y.value){q();y.style.display="none";e(y)}});x.appendChild(v);return true}q()});f.bind("Refresh",function(h){var i,j,k;i=document.getElementById(f.settings.browse_button);j=a.getPos(i,document.getElementById(h.settings.container));k=a.getSize(i);a.extend(document.getElementById(f.id+"_iframe_container").style,{top:j.y+"px",left:j.x+"px",width:k.w+"px",height:k.h+"px"})});f.bind("UploadFile",function(h,i){if(i.status==a.DONE||i.status==a.FAILED||h.state==a.STOPPED){return}if(!i.input){i.status=a.ERROR;return}i.input.setAttribute("name",h.settings.file_data_name);c.tmpAction=c.getAttribute("action");c.setAttribute("action",a.buildUrl(h.settings.url,{name:i.target_name||i.name}));c.tmpTarget=c.getAttribute("target");c.setAttribute("target",b.name);this.currentfile=i;c.submit()});f.bind("FilesRemoved",function(h,k){var j,l;for(j=0;j<k.length;j++){l=k[j].input;if(l){l.parentNode.removeChild(l)}}});g({success:true})}})})(plupload);
|
typo3/sysext/setup/mod/locallang.xml (revision ) | ||
---|---|---|
<label index="edit_wideDocument">Wide document background</label>
|
||
<label index="edit_RTE">Enable Rich Text Editor (if available)</label>
|
||
<label index="edit_docModuleUpload">File upload directly in Doc-module</label>
|
||
<label index="enableFlashUploader">Enable Flash Uploader (requires Flash 9+)</label>
|
||
<label index="enableFlashUploader">Select Uploader</label>
|
||
<label index="enableFlashUploader.disable">Classic Form Upload</label>
|
||
<label index="enableFlashUploader.flash">Flash Uploader (requires Flash 9+)</label>
|
||
<label index="enableFlashUploader.plupload">Plupload (HTML5, Flash, Silverlight, Form)</label>
|
||
<label index="resizeTextareas">Make Textareas resizable</label>
|
||
<label index="resizeTextareas_MaxHeight">Maximal Height of resizable Textarea in Pixel</label>
|
||
<label index="resizeTextareas_Flexible">Make Textareas flexible</label>
|
typo3/contrib/plupload/readme.md (revision ) | ||
---|---|---|
Plupload - Cross browser and platform uploader API
|
||
===================================================
|
||
What is Plupload
|
||
-----------------
|
||
Plupload is a JavaScript API for dealing with file uploads it supports features like multiple file selection, file type filtering,
|
||
request chunking, client side image scaling and it uses different runtimes to achieve this such as HTML 5, Silverlight, Flash, Gears and BrowserPlus.
|
||
What you need to build Plupload
|
||
-------------------------------
|
||
* Install the Java JDK or JRE packages you can find it at: [http://java.sun.com/javase/downloads/index.jsp](http://java.sun.com/javase/downloads/index.jsp)
|
||
* Install Apache Ant you can find it at: [http://ant.apache.org/](http://ant.apache.org/)
|
||
* Add Apache Ant to your systems path environment variable, this is not required but makes it easier to issue commands to Ant without having to type the full path for it.
|
||
How to build Plupload
|
||
----------------------
|
||
In the root directory of Plupload where the build.xml file is you can run ant against different targets.
|
||
`ant`
|
||
Will combine, preprocess and minify the Plupload classes into the js directory. It will not build the Silverlight and Flash .xap and .swf files.
|
||
`ant moxiedoc`
|
||
Will generate API Documentation for the project using the Moxiedoc tool. The docs will be generated to the docs/api directory.
|
||
`ant release`
|
||
Will produce release packages. The release packages will be placed in the tmp directory.
|
||
How to build Flash runtime
|
||
---------------------------
|
||
The Flash runtime uses a .swf file that can be built using the Flex SDK. This SDK can be downloaded from Adobe. [http://www.adobe.com/products/flex/flexdownloads/](http://www.adobe.com/products/flex/flexdownloads/)
|
||
How to build Silverlight runtime
|
||
---------------------------------
|
||
The Silverlight runtime uses a .xap file that can be built using the Silverlight SDK or Visual Studio. [http://silverlight.net/getstarted/](http://silverlight.net/getstarted/)
|
||
Running the development version
|
||
--------------------------------
|
||
The unminified development version of the javascript files can be executed by opening the examples/queue_widget_dev.html file running on a Web Server.
|
||
Contributing to the Plupload project
|
||
-------------------------------------
|
||
You can read more about how to contribute to this project at [http://www.plupload.com/contributing](http://www.plupload.com/contributing)
|
typo3/sysext/filelist/mod1/file_list.php (revision ) | ||
---|---|---|
// There there was access to this file path, continue, make the list
|
||
if ($access) {
|
||
// include the initialization for the flash uploader
|
||
if ($GLOBALS['BE_USER']->uc['enableFlashUploader']) {
|
||
if ($GLOBALS['BE_USER']->uc['enableFlashUploader'] == 1) {
|
||
$this->doc->JScodeArray['flashUploader'] = '
|
||
if (top.TYPO3.FileUploadWindow.isFlashAvailable()) {
|
||
... | ... | |
function initFlashUploader(event) {
|
||
// set the page specific options for the flashUploader
|
||
var flashUploadOptions = {
|
||
uploadURL: top.TS.PATH_typo3 + "ajax.php",
|
||
uploadURL: top.TYPO3.configuration.PATH_typo3 + "ajax.php",
|
||
uploadFileSizeLimit: "' . t3lib_div::getMaxUploadFileSize() . '",
|
||
uploadFileTypes: {
|
||
allow: "' . $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']['webspace']['allow'] . '",
|
||
... | ... | |
});
|
||
}
|
||
';
|
||
} elseif ($GLOBALS['BE_USER']->uc['enableFlashUploader'] == 2) {
|
||
$this->doc->JScodeArray['flashUploader'] = '
|
||
Ext.onReady(function() {
|
||
// monitor the button
|
||
$("button-upload").observe("click", function(event) {
|
||
event.stop();
|
||
top.TYPO3.configuration.FileUpload.targetDirectory = "'.$this->id.'";
|
||
// set window object to reload on finish.
|
||
top.TYPO3.PluploadWindow.reloadWindow = window;
|
||
top.TYPO3.PluploadWindow.show();
|
||
});
|
||
});
|
||
';
|
||
}
|
||
// Create filelisting object
|
||
$this->filelist = t3lib_div::makeInstance('fileList');
|
typo3/contrib/plupload/readme.txt (revision ) | ||
---|---|---|
build.bat
|
||
build.xml
|
||
examples/
|
||
src/
|
||
tests/
|
||
tmp/
|
||
tools/
|
||
where not included from the original distribution.
|
typo3/js/extjs/ext.ux.plupload.js (revision ) | ||
---|---|---|
/*!
|
||
* Ext.ux.PluploadPanel
|
||
* (c) http://adtim.ru/extjs/ux_plupload
|
||
* 2010-04-28 v0.1
|
||
*/
|
||
Ext.ux.PluploadPanel = Ext.extend(Ext.Panel, {
|
||
constructor: function(config) {
|
||
this.autoScroll = false;
|
||
this.bodyCssClass = 'x-plupload-body';
|
||
this.success = [];
|
||
this.failed = [];
|
||
this.viewTpl = new Ext.XTemplate(
|
||
'<tpl for=".">',
|
||
'<dl id="{id}">',
|
||
'<dt style="width: 50%">{name}</dt>',
|
||
'<dt style="width: 15%">{size:fileSize}</dt>',
|
||
'<tpl exec="this.statusValue(status, percent, msg)"></tpl><dt style="width: 30%">{this.statusText}</dt>',
|
||
'<dt style="width: 5%" class="t3-plupload-remove"><span class="t3-icon t3-icon-actions t3-icon-actions-edit t3-icon-edit-delete"> </span></dt>',
|
||
'<div class="x-clear"></div>',
|
||
'</dl>',
|
||
'</tpl>',
|
||
{ compiled: true,
|
||
statusText: '-',
|
||
statusTextQueued: config.statusQueuedText || 'Queued',
|
||
statusTextUploading: config.statusUploadingText || 'Uploaded ({0}%)',
|
||
statusTextFailed: config.statusFailedText || 'FAILED',
|
||
statusTextDone: config.statusDoneText || 'DONE',
|
||
statusValue: function (status, percent, msg) {
|
||
if (status == 1) {
|
||
this.statusText = this.statusTextQueued;
|
||
}
|
||
else if (status == 2) {
|
||
this.statusText = String.format(this.statusTextUploading, percent);
|
||
}
|
||
else if (status == 4) {
|
||
this.statusText = msg || this.statusTextFailed;
|
||
}
|
||
else if (status == 5) {
|
||
this.statusText = this.statusTextDone;
|
||
}
|
||
}
|
||
}
|
||
);
|
||
this.store = new Ext.data.JsonStore({
|
||
fields: [ 'id', 'loaded', 'name', 'size', 'percent', 'status', 'msg' ],
|
||
listeners: {
|
||
load: this.onStoreLoad,
|
||
remove: this.onStoreRemove,
|
||
update: this.onStoreUpdate,
|
||
scope: this
|
||
}
|
||
});
|
||
this.pbar = new Ext.ProgressBar({ flex: 1 });
|
||
this.bbar = new Ext.Toolbar({
|
||
layout: 'hbox',
|
||
style: { paddingLeft: '5px' },
|
||
items: [
|
||
this.pbar,
|
||
new Ext.Toolbar.TextItem({
|
||
text: '<i>uploader not initialized</i>',
|
||
itemId: 'status'
|
||
})
|
||
]
|
||
});
|
||
this.tbar = new Ext.Toolbar({
|
||
enableOverflow: true,
|
||
items: [
|
||
new Ext.Button({
|
||
text: config.addButtonText || 'Add files',
|
||
itemId: 'addButton',
|
||
iconCls: config.addButtonCls,
|
||
disabled: true
|
||
}),
|
||
new Ext.Button({
|
||
text: config.uploadButtonText || 'Upload',
|
||
handler: this.onStart,
|
||
scope: this,
|
||
disabled: true,
|
||
itemId: 'start',
|
||
iconCls: config.uploadButtonCls
|
||
}),
|
||
'->',
|
||
new Ext.Button({
|
||
text: config.cancelButtonText || 'Cancel',
|
||
handler: this.onCancel,
|
||
scope: this,
|
||
disabled: true,
|
||
itemId: 'cancel',
|
||
iconCls: config.cancelButtonCls
|
||
})
|
||
]
|
||
});
|
||
this.view = new Ext.DataView({
|
||
store: this.store,
|
||
tpl: this.viewTpl,
|
||
overClass: 'plupload_over',
|
||
selectedClass: 'plupload_selected',
|
||
itemSelector: 'dl',
|
||
emptyText: config.emptyText || '<div class="plupload_emptytext"><span>Queue is empty</span></div>',
|
||
emptyDropText: config.emptyDropText || '<div class="plupload_emptytext"><span>Drop files here</span></div>',
|
||
deferEmptyText: false,
|
||
listeners: {
|
||
click: function(dataView, index, node, event) {
|
||
dataView.store.remove(dataView.store.getAt(index));
|
||
}
|
||
},
|
||
plugins: Ext.DataView.DragSelector ? new Ext.DataView.DragSelector() : ''
|
||
});
|
||
this.items = this.view;
|
||
Ext.ux.PluploadPanel.superclass.constructor.apply(this, arguments);
|
||
},
|
||
initComponent: function() {
|
||
Ext.ux.PluploadPanel.superclass.initComponent.apply(this, arguments);
|
||
},
|
||
afterRender: function() {
|
||
Ext.ux.PluploadPanel.superclass.afterRender.apply(this, arguments);
|
||
this.initialize_uploader();
|
||
},
|
||
onDeleteAll: function () {
|
||
this.store.each(
|
||
function (record) {
|
||
this.remove_file(record.get('id'));
|
||
}, this
|
||
);
|
||
},
|
||
onDeleteUploaded: function () {
|
||
this.store.each(
|
||
function (record) {
|
||
if (record.get('status') == 5) {
|
||
this.remove_file(record.get('id'));
|
||
}
|
||
}, this
|
||
);
|
||
},
|
||
onCancel: function () {
|
||
this.uploader.stop();
|
||
},
|
||
onStart: function () {
|
||
this.fireEvent('beforestart', this);
|
||
if (this.multipart_params) {
|
||
this.uploader.settings.multipart_params = this.multipart_params;
|
||
}
|
||
this.uploader.start();
|
||
},
|
||
initialize_uploader: function () {
|
||
var runtimes = 'gears,browserplus,html5,html4';
|
||
if (this.flash_swf_url) {
|
||
runtimes = "flash," + runtimes;
|
||
}
|
||
if (this.silverlight_xap_url) {
|
||
runtimes = "silverlight," + runtimes;
|
||
}
|
||
var uploaderSettings = {
|
||
url: this.url,
|
||
runtimes: this.runtimes || runtimes,
|
||
browse_button: this.getTopToolbar().getComponent('addButton').getEl().dom.id,
|
||
container: this.getTopToolbar().getEl().dom.id,
|
||
max_file_size: this.max_file_size || '10mb',
|
||
resize: this.resize || '',
|
||
flash_swf_url: this.flash_swf_url || '',
|
||
silverlight_xap_url: this.silverlight_xap_url || '',
|
||
filters : this.filters || [],
|
||
unique_names: this.unique_names,
|
||
multipart: this.multipart,
|
||
multipart_params: this.multipart_params,
|
||
file_data_name: this.file_data_name,
|
||
drop_element: this.body.dom.id,
|
||
required_features: this.required_features
|
||
};
|
||
if (this.chunk_size) {
|
||
uploaderSettings.chunk_size = this.chunk_size;
|
||
}
|
||
this.uploader = new plupload.Uploader(uploaderSettings);
|
||
Ext.each(['Init', 'ChunkUploaded', 'FilesAdded', 'FilesRemoved', 'FileUploaded', 'PostInit',
|
||
'QueueChanged', 'Refresh', 'StateChanged', 'UploadFile', 'UploadProgress', 'Error' ],
|
||
function (v) {
|
||
this.uploader.bind(v, eval("this." + v), this);
|
||
}, this
|
||
);
|
||
this.uploader.init();
|
||
},
|
||
remove_file: function (id) {
|
||
var fileObj = this.uploader.getFile(id);
|
||
if (fileObj) {
|
||
this.uploader.removeFile(fileObj);
|
||
}
|
||
else {
|
||
this.store.remove(this.store.getById(id));
|
||
}
|
||
},
|
||
update_pbar: function () {
|
||
var t = this.uploader.total;
|
||
var speed = Ext.util.Format.fileSize(t.bytesPerSec);
|
||
var total = this.store.data.length;
|
||
var failed = this.failed.length;
|
||
var success = this.success.length;
|
||
var sent = failed + success;
|
||
var queued = total - success - failed;
|
||
if (total) {
|
||
this.progressText = '';
|
||
var pbarText = String.format(this.progressText || '{2} of {1} uploaded ({5}/s)', sent, total, success, failed, queued, speed);
|
||
var percent = t.percent / 100;
|
||
// flash and html4 runtime fix (uploader.total contains outdated info about queue)
|
||
if (this.runtime == 'flash' || this.runtime == 'html4') {
|
||
if (total == sent || this.store.find('status', /1|2/) == -1) { //find queued or uploading status
|
||
percent = 1
|
||
}
|
||
}
|
||
// end fix
|
||
this.pbar.updateProgress(percent, pbarText);
|
||
}
|
||
else {
|
||
this.pbar.updateProgress(0, ' ');
|
||
}
|
||
},
|
||
update_store: function (v) {
|
||
if (!v.msg) {
|
||
v.msg = '';
|
||
}
|
||
var data = this.store.getById(v.id);
|
||
if (data) {
|
||
data.data = v;
|
||
data.commit();
|
||
}
|
||
else {
|
||
this.store.loadData(v, true);
|
||
}
|
||
},
|
||
onStoreLoad: function (store, record, operation) {
|
||
this.update_pbar();
|
||
},
|
||
onStoreRemove: function (store, record, operation) {
|
||
if (! store.data.length) {
|
||
this.getTopToolbar().getComponent('start').setDisabled(true);
|
||
this.uploader.total.reset();
|
||
}
|
||
var id = record.get('id');
|
||
this.remove_file(id);
|
||
Ext.each(this.success,
|
||
function (v) {
|
||
if (v && v.id == id) {
|
||
this.success.remove(v);
|
||
}
|
||
}, this
|
||
);
|
||
Ext.each(this.failed,
|
||
function (v) {
|
||
if (v && v.id == id) {
|
||
this.failed.remove(v);
|
||
}
|
||
}, this
|
||
);
|
||
this.update_pbar();
|
||
},
|
||
onStoreUpdate: function (store, record, operation) {
|
||
this.update_pbar();
|
||
},
|
||
Init: function(uploader, data) {
|
||
var bbar = this.getBottomToolbar();
|
||
var statusCmp = bbar.getComponent('status');
|
||
this.runtime = data.runtime;
|
||
if (this.runtime_visible == true) {
|
||
statusCmp.setText(" Uploader runtime: " + this.runtime);
|
||
}
|
||
else {
|
||
statusCmp.setText('');
|
||
}
|
||
bbar.syncSize();
|
||
if (this.uploader.features.dragdrop) {
|
||
var v = this.view;
|
||
v.emptyText = this.emptyDropText;
|
||
if (v.rendered) {
|
||
v.refresh();
|
||
}
|
||
}
|
||
this.getTopToolbar().getComponent('addButton').setDisabled(false);
|
||
},
|
||
ChunkUploaded: function() {
|
||
},
|
||
FilesAdded: function(uploader, files) {
|
||
this.getTopToolbar().getComponent('start').setDisabled(false);
|
||
Ext.each(files,
|
||
function (v) {
|
||
this.update_store(v);
|
||
}, this
|
||
);
|
||
},
|
||
FilesRemoved: function(uploader, files) {
|
||
Ext.each(files,
|
||
function (file) {
|
||
this.store.remove(this.store.getById(file.id));
|
||
}, this
|
||
);
|
||
},
|
||
FileUploaded: function(uploader, file, status) {
|
||
var response = Ext.decode(status.response);
|
||
if (response.success == true) {
|
||
file.server_error = 0;
|
||
this.success.push(file);
|
||
}
|
||
else {
|
||
if (response.message) {
|
||
file.msg = '<span style="color: red">' + response.message + '</span>';
|
||
}
|
||
file.server_error = 1;
|
||
this.failed.push(file);
|
||
}
|
||
this.update_store(file);
|
||
},
|
||
PostInit: function() {
|
||
},
|
||
QueueChanged: function(uploader) {
|
||
},
|
||
Refresh: function(uploader) {
|
||
Ext.each(uploader.files,
|
||
function (v) {
|
||
this.update_store(v);
|
||
}, this
|
||
);
|
||
},
|
||
StateChanged: function(uploader) {
|
||
if (uploader.state == 2) {
|
||
this.fireEvent('uploadstarted', this);
|
||
this.getTopToolbar().getComponent('cancel').setDisabled(false);
|
||
this.getTopToolbar().getComponent('start').setDisabled(true);
|
||
}
|
||
else {
|
||
this.fireEvent('uploadcomplete', this, this.success, this.failed);
|
||
this.getTopToolbar().getComponent('cancel').setDisabled(true);
|
||
this.getTopToolbar().getComponent('start').setDisabled(false);
|
||
}
|
||
},
|
||
UploadFile: function(uploader, file) {
|
||
this.fireEvent('uploadfile', this, uploader, file);
|
||
},
|
||
UploadProgress: function(uploader, file) {
|
||
if (file.server_error) {
|
||
file.status = 4;
|
||
}
|
||
this.update_store(file);
|
||
},
|
||
Error: function (uploader, data) {
|
||
data.file.status = 4;
|
||
if (data.code == -600) {
|
||
data.file.msg = String.format('<span style="color: red">{0}</span>', this.statusInvalidSizeText || 'Too big');
|
||
}
|
||
else if (data.code == -700) {
|
||
data.file.msg = String.format('<span style="color: red">{0}</span>', this.statusInvalidExtensionText || 'Invalid file type');
|
||
}
|
||
else {
|
||
data.file.msg = String.format('<span style="color: red">{2} ({0}: {1})</span>', data.code, data.details, data.message);
|
||
}
|
||
this.update_store(data.file);
|
||
}
|
||
});
|
||
Ext.reg('pluploadpanel', Ext.ux.PluploadPanel);
|
typo3/contrib/plupload/js/plupload.html5.min.js (revision ) | ||
---|---|---|
(function(b){function a(i,l,j,c,k){var e,d,h,g,f;e=document.createElement("canvas");e.style.display="none";document.body.appendChild(e);d=e.getContext("2d");h=new Image();h.onload=function(){var o,m,n;f=Math.min(l/h.width,j/h.height);if(f<1){o=Math.round(h.width*f);m=Math.round(h.height*f)}else{o=h.width;m=h.height}e.width=o;e.height=m;d.drawImage(h,0,0,o,m);g=e.toDataURL(c);g=g.substring(g.indexOf("base64,")+7);g=atob(g);e.parentNode.removeChild(e);k({success:true,data:g})};h.src=i}b.runtimes.Html5=b.addRuntime("html5",{getFeatures:function(){var g,d,f,e,c;d=f=e=c=false;if(window.XMLHttpRequest){g=new XMLHttpRequest();f=!!g.upload;d=!!(g.sendAsBinary||g.upload)}if(d){e=!!(File&&File.prototype.getAsDataURL);c=!!(File&&File.prototype.slice)}return{html5:d,dragdrop:window.mozInnerScreenX!==undefined||c,jpgresize:e,pngresize:e,multipart:e||!!window.FileReader||!!window.FormData,progress:f,chunking:c||e}},init:function(f,g){var c={},d;function e(l){var j,h,k=[],m;for(h=0;h<l.length;h++){j=l[h];m=b.guid();c[m]=j;k.push(new b.File(m,j.fileName,j.fileSize))}if(k.length){f.trigger("FilesAdded",k)}}d=this.getFeatures();if(!d.html5){g({success:false});return}f.bind("Init",function(m){var q,o=[],l,p,j=m.settings.filters,k,n,h=document.body;q=document.createElement("div");q.id=m.id+"_html5_container";for(l=0;l<j.length;l++){k=j[l].extensions.split(/,/);for(p=0;p<k.length;p++){n=b.mimeTypes[k[p]];if(n){o.push(n)}}}b.extend(q.style,{position:"absolute",background:f.settings.shim_bgcolor||"transparent",width:"100px",height:"100px",overflow:"hidden",zIndex:99999,opacity:f.settings.shim_bgcolor?"":0});q.className="plupload html5";if(f.settings.container){h=document.getElementById(f.settings.container);h.style.position="relative"}h.appendChild(q);q.innerHTML='<input id="'+f.id+'_html5" style="width:100%;" type="file" accept="'+o.join(",")+'" '+(f.settings.multi_selection?'multiple="multiple"':"")+" />";document.getElementById(f.id+"_html5").onchange=function(){e(this.files);this.value=""}});f.bind("PostInit",function(){var h=document.getElementById(f.settings.drop_element);if(h){b.addEvent(h,"dragover",function(i){i.preventDefault()});b.addEvent(h,"drop",function(j){var i=j.dataTransfer;if(i&&i.files){e(i.files)}j.preventDefault()})}});f.bind("Refresh",function(h){var i,j,k;i=document.getElementById(f.settings.browse_button);j=b.getPos(i,document.getElementById(h.settings.container));k=b.getSize(i);b.extend(document.getElementById(f.id+"_html5_container").style,{top:j.y+"px",left:j.x+"px",width:k.w+"px",height:k.h+"px"})});f.bind("UploadFile",function(h,j){var k=h.settings,m,i;function l(n){var q=0,p=0;function o(){var u=n,C,D,y,z,A=0,r="----pluploadboundary"+b.guid(),t,w,s="--",B="\r\n",x="";if(j.status==b.DONE||j.status==b.FAILED||h.state==b.STOPPED){return}z={name:j.target_name||j.name};if(k.chunk_size&&d.chunking){t=k.chunk_size;y=Math.ceil(j.size/t);w=Math.min(t,j.size-(q*t));if(typeof(n)=="string"){u=n.substring(q*t,q*t+w)}else{u=n.slice(q*t,w)}z.chunk=q;z.chunks=y}else{w=j.size}C=new XMLHttpRequest();D=C.upload;if(D){D.onprogress=function(E){j.loaded=Math.min(j.size,p+E.loaded-A);h.trigger("UploadProgress",j)}}C.open("post",b.buildUrl(h.settings.url,z),true);C.onreadystatechange=function(){var E,G;if(C.readyState==4){try{E=C.status}catch(F){E=0}if(E>=400){h.trigger("Error",{code:b.HTTP_ERROR,message:"HTTP Error.",file:j,status:E})}else{if(y){G={chunk:q,chunks:y,response:C.responseText,status:E};h.trigger("ChunkUploaded",j,G);p+=w;if(G.cancelled){j.status=b.FAILED;return}j.loaded=Math.min(j.size,(q+1)*t)}else{j.loaded=j.size}h.trigger("UploadProgress",j);if(!y||++q>=y){j.status=b.DONE;h.trigger("FileUploaded",j,{response:C.responseText,status:E})}else{o()}}}};b.each(h.settings.headers,function(F,E){C.setRequestHeader(E,F)});if(h.settings.multipart&&d.multipart){if(!C.sendAsBinary){var v=new FormData();b.each(h.settings.multipart_params,function(F,E){v.append(E,F)});v.append(h.settings.file_data_name,u);C.send(v);return}C.setRequestHeader("Content-Type","multipart/form-data; boundary="+r);b.each(h.settings.multipart_params,function(F,E){x+=s+r+B+'Content-Disposition: form-data; name="'+E+'"'+B+B;x+=F+B});x+=s+r+B+'Content-Disposition: form-data; name="'+h.settings.file_data_name+'"; filename="'+j.name+'"'+B+"Content-Type: application/octet-stream"+B+B+u+B+s+r+s+B;A=x.length-u.length;u=x}else{C.setRequestHeader("Content-Type","application/octet-stream")}if(C.sendAsBinary){C.sendAsBinary(u)}else{C.send(u)}}o()}m=c[j.id];i=h.settings.resize;if(d.jpgresize){if(i&&/\.(png|jpg|jpeg)$/i.test(j.name)){a(m.getAsDataURL(),i.width,i.height,/\.png$/i.test(j.name)?"image/png":"image/jpeg",function(n){if(n.success){j.size=n.data.length;l(n.data)}else{l(m.getAsBinary())}})}else{l(m.getAsBinary())}}else{l(m)}});g({success:true})}})})(plupload);
|
typo3/alt_clickmenu.php (revision ) | ||
---|---|---|
$script = 'file_upload.php';
|
||
$type = 'upload';
|
||
$image = 'upload.gif';
|
||
if ($GLOBALS['BE_USER']->uc['enableFlashUploader']) {
|
||
if ($GLOBALS['BE_USER']->uc['enableFlashUploader'] == 1) {
|
||
$loc = 'top.content.list_frame';
|
||
$editOnClick = 'if (top.TYPO3.FileUploadWindow.isFlashAvailable()) { initFlashUploader("' . rawurlencode($path) . '"); } else if(' . $loc . '){' . $loc . ".location.href=top.TS.PATH_typo3+'".$script.'?target=' . rawurlencode($path) . "';}";
|
||
return $this->linkItem(
|
||
$this->label($type),
|
||
$this->excludeIcon('<img'.t3lib_iconWorks::skinImg($this->PH_backPath,'gfx/'.$image,'width="12" height="12"').' alt="" />'),
|
||
$this->excludeIcon('<img' . t3lib_iconWorks::skinImg($this->PH_backPath, 'gfx/' . $image, 'width="12" height="12"').' alt="" />'),
|
||
$editOnClick . 'top.nav.refresh();return hideCM();'
|
||
);
|
||
} elseif ($GLOBALS['BE_USER']->uc['enableFlashUploader'] == 2) {
|
||
$editOnClick = 'top.TYPO3.configuration.FileUpload.targetDirectory = "' . $path . '"; top.TYPO3.PluploadWindow.reloadWindow = top.content.list_frame; top.TYPO3.PluploadWindow.show();';
|
||
return $this->linkItem(
|
||
$this->label($type),
|
||
$this->excludeIcon('<img' . t3lib_iconWorks::skinImg($this->PH_backPath, 'gfx/' . $image, 'width="12" height="12"') . ' alt="" />'),
|
||
$editOnClick . 'return hideCM();'
|
||
);
|
||
} else {
|
||
return $this->FILE_launch($path, $script, $type, $image, true);
|
||
}
|
typo3/sysext/setup/ext_tables.php (revision ) | ||
---|---|---|
'csh' => 'simuser'
|
||
),
|
||
'enableFlashUploader' => array(
|
||
'type' => 'check',
|
||
'type' => 'select',
|
||
'items' => array(
|
||
0 => 'LLL:EXT:setup/mod/locallang.xml:enableFlashUploader.disable',
|
||
1 => 'LLL:EXT:setup/mod/locallang.xml:enableFlashUploader.flash',
|
||
2 => 'LLL:EXT:setup/mod/locallang.xml:enableFlashUploader.plupload',
|
||
),
|
||
'label' => 'LLL:EXT:setup/mod/locallang.xml:enableFlashUploader',
|
||
'csh' => 'enableFlashUploader',
|
||
),
|
||
... | ... | |
--div--;LLL:EXT:setup/mod/locallang.xml:adminFunctions,simulate,debugInWindow,installToolEnableButton'
|
||
);
|
||
?>
|
||
?>
|
typo3/contrib/plupload/js/plupload.full.min.js (revision ) | ||
---|---|---|
(function(){var c=0,h=[],j={},f={},a={"<":"lt",">":"gt","&":"amp",'"':"quot","'":"#39"},i=/[<>&\"\']/g,b;function e(){this.returnValue=false}function g(){this.cancelBubble=true}(function(k){var l=k.split(/,/),m,o,n;for(m=0;m<l.length;m+=2){n=l[m+1].split(/ /);for(o=0;o<n.length;o++){f[n[o]]=l[m]}}})("application/msword,doc dot,application/pdf,pdf,application/pgp-signature,pgp,application/postscript,ps ai eps,application/rtf,rtf,application/vnd.ms-excel,xls xlb,application/vnd.ms-powerpoint,ppt pps pot,application/zip,zip,application/x-shockwave-flash,swf swfl,application/vnd.openxmlformats,docx pptx xlsx,audio/mpeg,mpga mpega mp2 mp3,audio/x-wav,wav,image/bmp,bmp,image/gif,gif,image/jpeg,jpeg jpg jpe,image/png,png,image/svg+xml,svg svgz,image/tiff,tiff tif,text/html,htm html xhtml,text/rtf,rtf,video/mpeg,mpeg mpg mpe,video/quicktime,qt mov,video/x-flv,flv,video/vnd.rn-realvideo,rv,text/plain,asc txt text diff log,application/octet-stream,exe");var d={STOPPED:1,STARTED:2,QUEUED:1,UPLOADING:2,FAILED:4,DONE:5,GENERIC_ERROR:-100,HTTP_ERROR:-200,IO_ERROR:-300,SECURITY_ERROR:-400,INIT_ERROR:-500,FILE_SIZE_ERROR:-600,FILE_EXTENSION_ERROR:-700,mimeTypes:f,extend:function(k){d.each(arguments,function(l,m){if(m>0){d.each(l,function(o,n){k[n]=o})}});return k},cleanName:function(k){var l,m;m=[/[\300-\306]/g,"A",/[\340-\346]/g,"a",/\307/g,"C",/\347/g,"c",/[\310-\313]/g,"E",/[\350-\353]/g,"e",/[\314-\317]/g,"I",/[\354-\357]/g,"i",/\321/g,"N",/\361/g,"n",/[\322-\330]/g,"O",/[\362-\370]/g,"o",/[\331-\334]/g,"U",/[\371-\374]/g,"u"];for(l=0;l<m.length;l+=2){k=k.replace(m[l],m[l+1])}k=k.replace(/\s+/g,"_");k=k.replace(/[^a-z0-9_\-\.]+/gi,"");return k},addRuntime:function(k,l){l.name=k;h[k]=l;h.push(l);return l},guid:function(){var k=new Date().getTime().toString(32),l;for(l=0;l<5;l++){k+=Math.floor(Math.random()*65535).toString(32)}return(d.guidPrefix||"p")+k+(c++).toString(32)},buildUrl:function(l,k){var m="";d.each(k,function(o,n){m+=(m?"&":"")+encodeURIComponent(n)+"="+encodeURIComponent(o)});if(m){l+=(l.indexOf("?")>0?"&":"?")+m}return l},each:function(n,o){var m,l,k;if(n){m=n.length;if(m===b){for(l in n){if(n.hasOwnProperty(l)){if(o(n[l],l)===false){return}}}}else{for(k=0;k<m;k++){if(o(n[k],k)===false){return}}}}},formatSize:function(k){if(k===b){return d.translate("N/A")}if(k>1048576){return Math.round(k/1048576,1)+" MB"}if(k>1024){return Math.round(k/1024,1)+" KB"}return k+" b"},getPos:function(l,p){var q=0,o=0,s,r=document,m,n;l=l;p=p||r.body;function k(w){var u,v,t=0,z=0;if(w){v=w.getBoundingClientRect();u=r.compatMode==="CSS1Compat"?r.documentElement:r.body;t=v.left+u.scrollLeft;z=v.top+u.scrollTop}return{x:t,y:z}}if(l.getBoundingClientRect&&(navigator.userAgent.indexOf("MSIE")>0&&r.documentMode!==8)){m=k(l);n=k(p);return{x:m.x-n.x,y:m.y-n.y}}s=l;while(s&&s!=p&&s.nodeType){q+=s.offsetLeft||0;o+=s.offsetTop||0;s=s.offsetParent}s=l.parentNode;while(s&&s!=p&&s.nodeType){q-=s.scrollLeft||0;o-=s.scrollTop||0;s=s.parentNode}return{x:q,y:o}},getSize:function(k){return{w:k.clientWidth||k.offsetWidth,h:k.clientHeight||k.offsetHeight}},parseSize:function(k){var l;if(typeof(k)=="string"){k=/^([0-9]+)([mgk]+)$/.exec(k.toLowerCase().replace(/[^0-9mkg]/g,""));l=k[2];k=+k[1];if(l=="g"){k*=1073741824}if(l=="m"){k*=1048576}if(l=="k"){k*=1024}}return k},xmlEncode:function(k){return k?(""+k).replace(i,function(l){return a[l]?"&"+a[l]+";":l}):k},toArray:function(m){var l,k=[];for(l=0;l<m.length;l++){k[l]=m[l]}return k},addI18n:function(k){return d.extend(j,k)},translate:function(k){return j[k]||k},addEvent:function(l,k,m){if(l.attachEvent){l.attachEvent("on"+k,function(){var n=window.event;if(!n.target){n.target=n.srcElement}n.preventDefault=e;n.stopPropagation=g;m(n)})}else{if(l.addEventListener){l.addEventListener(k,m,false)}}}};d.Uploader=function(n){var l={},q,p=[],r,m;q=new d.QueueProgress();n=d.extend({chunk_size:0,multipart:true,multi_selection:true,file_data_name:"file",filters:[]},n);function o(){var s;if(this.state==d.STARTED&&r<p.length){s=p[r++];if(s.status==d.QUEUED){this.trigger("BeforeUpload",s);this.trigger("UploadFile",s)}else{o.call(this)}}else{this.stop()}}function k(){var t,s;q.reset();for(t=0;t<p.length;t++){s=p[t];if(s.size!==b){q.size+=s.size;q.loaded+=s.loaded}else{q.size=b}if(s.status==d.DONE){q.uploaded++}else{if(s.status==d.FAILED){q.failed++}else{q.queued++}}}if(q.size===b){q.percent=p.length>0?Math.ceil(q.uploaded/p.length*100):0}else{q.bytesPerSec=Math.ceil(q.loaded/((+new Date()-m||1)/1000));q.percent=q.size>0?Math.ceil(q.loaded/q.size*100):0}}d.extend(this,{state:d.STOPPED,features:{},files:p,settings:n,total:q,id:d.guid(),init:function(){var x=this,y,u,t,w=0,v;n.page_url=n.page_url||document.location.pathname.replace(/\/[^\/]+$/g,"/");if(!/^(\w+:\/\/|\/)/.test(n.url)){n.url=n.page_url+n.url}n.chunk_size=d.parseSize(n.chunk_size);n.max_file_size=d.parseSize(n.max_file_size);x.bind("FilesAdded",function(z,C){var B,A,E=0,F,D=n.filters;if(D&&D.length){F=[];d.each(D,function(G){d.each(G.extensions.split(/,/),function(H){F.push("\\."+H.replace(new RegExp("["+("/^$.*+?|()[]{}\\".replace(/./g,"\\$&"))+"]","g"),"\\$&"))})});F=new RegExp(F.join("|")+"$","i")}for(B=0;B<C.length;B++){A=C[B];A.loaded=0;A.percent=0;A.status=d.QUEUED;if(F&&!F.test(A.name)){z.trigger("Error",{code:d.FILE_EXTENSION_ERROR,message:"File extension error.",file:A});continue}if(A.size!==b&&A.size>n.max_file_size){z.trigger("Error",{code:d.FILE_SIZE_ERROR,message:"File size error.",file:A});continue}p.push(A);E++}if(E){x.trigger("QueueChanged");x.refresh()}});if(n.unique_names){x.bind("UploadFile",function(z,A){var C=A.name.match(/\.([^.]+)$/),B="tmp";if(C){B=C[1]}A.target_name=A.id+"."+B})}x.bind("UploadProgress",function(z,A){if(A.status==d.QUEUED){A.status=d.UPLOADING}A.percent=A.size>0?Math.ceil(A.loaded/A.size*100):100;k()});x.bind("StateChanged",function(z){if(z.state==d.STARTED){m=(+new Date())}});x.bind("QueueChanged",k);x.bind("Error",function(z,A){if(A.file){A.file.status=d.FAILED;k();window.setTimeout(function(){o.call(x)})}});x.bind("FileUploaded",function(z,A){A.status=d.DONE;A.loaded=A.size;z.trigger("UploadProgress",A);o.call(x)});if(n.runtimes){u=[];v=n.runtimes.split(/\s?,\s?/);for(y=0;y<v.length;y++){if(h[v[y]]){u.push(h[v[y]])}}}else{u=h}function s(){var C=u[w++],B,z,A;if(C){B=C.getFeatures();z=x.settings.required_features;if(z){z=z.split(",");for(A=0;A<z.length;A++){if(!B[z[A]]){s();return}}}C.init(x,function(D){if(D&&D.success){x.features=B;x.trigger("Init",{runtime:C.name});x.trigger("PostInit");x.refresh()}else{s()}})}else{x.trigger("Error",{code:d.INIT_ERROR,message:"Init error."})}}s()},refresh:function(){this.trigger("Refresh")},start:function(){if(this.state!=d.STARTED){r=0;this.state=d.STARTED;this.trigger("StateChanged");o.call(this)}},stop:function(){if(this.state!=d.STOPPED){this.state=d.STOPPED;this.trigger("StateChanged")}},getFile:function(t){var s;for(s=p.length-1;s>=0;s--){if(p[s].id===t){return p[s]}}},removeFile:function(t){var s;for(s=p.length-1;s>=0;s--){if(p[s].id===t.id){return this.splice(s,1)[0]}}},splice:function(u,s){var t;t=p.splice(u,s);this.trigger("FilesRemoved",t);this.trigger("QueueChanged");return t},trigger:function(t){var v=l[t.toLowerCase()],u,s;if(v){s=Array.prototype.slice.call(arguments);s[0]=this;for(u=0;u<v.length;u++){if(v[u].func.apply(v[u].scope,s)===false){return false}}}return true},bind:function(s,u,t){var v;s=s.toLowerCase();v=l[s]||[];v.push({func:u,scope:t||this});l[s]=v},unbind:function(s,u){var v=l[s.toLowerCase()],t;if(v){for(t=v.length-1;t>=0;t--){if(v[t].func===u){v.splice(t,1)}}}}})};d.File=function(n,l,m){var k=this;k.id=n;k.name=l;k.size=m;k.loaded=0;k.percent=0;k.status=0};d.Runtime=function(){this.getFeatures=function(){};this.init=function(k,l){}};d.QueueProgress=function(){var k=this;k.size=0;k.loaded=0;k.uploaded=0;k.failed=0;k.queued=0;k.percent=0;k.bytesPerSec=0;k.reset=function(){k.size=k.loaded=k.uploaded=k.failed=k.queued=k.percent=k.bytesPerSec=0}};d.runtimes={};window.plupload=d})();(function(b){var c={};function a(i,e,k,j,d){var l,g,f,h;g=google.gears.factory.create("beta.canvas");g.decode(i);h=Math.min(e/g.width,k/g.height);if(h<1){e=Math.round(g.width*h);k=Math.round(g.height*h)}else{e=g.width;k=g.height}g.resize(e,k);return g.encode(d,{quality:j/100})}b.runtimes.Gears=b.addRuntime("gears",{getFeatures:function(){return{dragdrop:true,jpgresize:true,pngresize:true,chunks:true,progress:true,multipart:true}},init:function(g,i){var h;if(!window.google||!google.gears){return i({success:false})}try{h=google.gears.factory.create("beta.desktop")}catch(f){return i({success:false})}function d(k){var j,e,l=[],m;for(e=0;e<k.length;e++){j=k[e];m=b.guid();c[m]=j.blob;l.push(new b.File(m,j.name,j.blob.length))}g.trigger("FilesAdded",l)}g.bind("PostInit",function(){var j=g.settings,e=document.getElementById(j.drop_element);if(e){b.addEvent(e,"dragover",function(k){h.setDropEffect(k,"copy");k.preventDefault()});b.addEvent(e,"drop",function(l){var k=h.getDragData(l,"application/x-gears-files");if(k){d(k.files)}l.preventDefault()});e=0}b.addEvent(document.getElementById(j.browse_button),"click",function(o){var n=[],l,k,m;o.preventDefault();for(l=0;l<j.filters.length;l++){m=j.filters[l].extensions.split(",");for(k=0;k<m.length;k++){n.push("."+m[k])}}h.openFiles(d,{singleFile:!j.multi_selection,filter:n})})});g.bind("UploadFile",function(o,l){var q=0,p,m,n=0,k=o.settings.resize,e;m=o.settings.chunk_size;e=m>0;p=Math.ceil(l.size/m);if(!e){m=l.size;p=1}if(k&&/\.(png|jpg|jpeg)$/i.test(l.name)){c[l.id]=a(c[l.id],k.width,k.height,k.quality||90,/\.png$/i.test(l.name)?"image/png":"image/jpeg")}l.size=c[l.id].length;function j(){var u,w,s=o.settings.multipart,r=0,v={name:l.target_name||l.name};function t(y){var x,C="----pluploadboundary"+b.guid(),A="--",B="\r\n",z;if(s){u.setRequestHeader("Content-Type","multipart/form-data; boundary="+C);x=google.gears.factory.create("beta.blobbuilder");b.each(o.settings.multipart_params,function(E,D){x.append(A+C+B+'Content-Disposition: form-data; name="'+D+'"'+B+B);x.append(E+B)});x.append(A+C+B+'Content-Disposition: form-data; name="'+o.settings.file_data_name+'"; filename="'+l.name+'"'+B+"Content-Type: application/octet-stream"+B+B);x.append(y);x.append(B+A+C+A+B);z=x.getAsBlob();r=z.length-y.length;y=z}u.send(y)}if(l.status==b.DONE||l.status==b.FAILED||o.state==b.STOPPED){return}if(e){v.chunk=q;v.chunks=p}w=Math.min(m,l.size-(q*m));u=google.gears.factory.create("beta.httprequest");u.open("POST",b.buildUrl(o.settings.url,v));if(!s){u.setRequestHeader("Content-Disposition",'attachment; filename="'+l.name+'"');u.setRequestHeader("Content-Type","application/octet-stream")}b.each(o.settings.headers,function(y,x){u.setRequestHeader(x,y)});u.upload.onprogress=function(x){l.loaded=n+x.loaded-r;o.trigger("UploadProgress",l)};u.onreadystatechange=function(){var x;if(u.readyState==4){if(u.status==200){x={chunk:q,chunks:p,response:u.responseText,status:u.status};o.trigger("ChunkUploaded",l,x);if(x.cancelled){l.status=b.FAILED;return}n+=w;if(++q>=p){l.status=b.DONE;o.trigger("FileUploaded",l,{response:u.responseText,status:u.status})}else{j()}}else{o.trigger("Error",{code:b.HTTP_ERROR,message:"HTTP Error.",file:l,chunk:q,chunks:p,status:u.status})}}};if(q<p){t(c[l.id].slice(q*m,w))}}j()});i({success:true})}})})(plupload);(function(c){var a={};function b(l){var k,j=typeof l,h,e,g,f;if(j==="string"){k="\bb\tt\nn\ff\rr\"\"''\\\\";return'"'+l.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g,function(n,m){var i=k.indexOf(m);if(i+1){return"\\"+k.charAt(i+1)}n=m.charCodeAt().toString(16);return"\\u"+"0000".substring(n.length)+n})+'"'}if(j=="object"){e=l.length!==h;k="";if(e){for(g=0;g<l.length;g++){if(k){k+=","}k+=b(l[g])}k="["+k+"]"}else{for(f in l){if(l.hasOwnProperty(f)){if(k){k+=","}k+=b(f)+":"+b(l[f])}}k="{"+k+"}"}return k}if(l===h){return"null"}return""+l}function d(o){var r=false,f=null,k=null,g,h,i,q,j,m=0;try{try{k=new ActiveXObject("AgControl.AgControl");if(k.IsVersionSupported(o)){r=true}k=null}catch(n){var l=navigator.plugins["Silverlight Plug-In"];if(l){g=l.description;if(g==="1.0.30226.2"){g="2.0.30226.2"}h=g.split(".");while(h.length>3){h.pop()}while(h.length<4){h.push(0)}i=o.split(".");while(i.length>4){i.pop()}do{q=parseInt(i[m],10);j=parseInt(h[m],10);m++}while(m<i.length&&q===j);if(q<=j&&!isNaN(q)){r=true}}}}catch(p){r=false}return r}c.silverlight={trigger:function(j,f){var h=a[j],g,e;if(h){e=c.toArray(arguments).slice(1);e[0]="Silverlight:"+f;setTimeout(function(){h.trigger.apply(h,e)},0)}}};c.runtimes.Silverlight=c.addRuntime("silverlight",{getFeatures:function(){return{jpgresize:true,pngresize:true,chunks:true,progress:true,multipart:true}},init:function(l,m){var k,h="",j=l.settings.filters,g,f=document.body;if(!d("2.0.31005.0")||(window.opera&&window.opera.buildNumber)){m({success:false});return}a[l.id]=l;k=document.createElement("div");k.id=l.id+"_silverlight_container";c.extend(k.style,{position:"absolute",top:"0px",background:l.settings.shim_bgcolor||"transparent",zIndex:99999,width:"100px",height:"100px",overflow:"hidden",opacity:l.settings.shim_bgcolor?"":0.01});k.className="plupload silverlight";if(l.settings.container){f=document.getElementById(l.settings.container);f.style.position="relative"}f.appendChild(k);for(g=0;g<j.length;g++){h+=(h!=""?"|":"")+j[g].title+" | *."+j[g].extensions.replace(/,/g,";*.")}k.innerHTML='<object id="'+l.id+'_silverlight" data="data:application/x-silverlight," type="application/x-silverlight-2" style="outline:none;" width="1024" height="1024"><param name="source" value="'+l.settings.silverlight_xap_url+'"/><param name="background" value="Transparent"/><param name="windowless" value="true"/><param name="initParams" value="id='+l.id+",filter="+h+'"/></object>';function e(){return document.getElementById(l.id+"_silverlight").content.Upload}l.bind("Silverlight:Init",function(){var i,n={};l.bind("Silverlight:StartSelectFiles",function(o){i=[]});l.bind("Silverlight:SelectFile",function(o,r,p,q){var s;s=c.guid();n[s]=r;n[r]=s;i.push(new c.File(s,p,q))});l.bind("Silverlight:SelectSuccessful",function(){if(i.length){l.trigger("FilesAdded",i)}});l.bind("Silverlight:UploadChunkError",function(o,r,p,s,q){l.trigger("Error",{code:c.IO_ERROR,message:"IO Error.",details:q,file:o.getFile(n[r])})});l.bind("Silverlight:UploadFileProgress",function(o,s,p,r){var q=o.getFile(n[s]);if(q.status!=c.FAILED){q.size=r;q.loaded=p;o.trigger("UploadProgress",q)}});l.bind("Refresh",function(o){var p,q,r;p=document.getElementById(o.settings.browse_button);q=c.getPos(p,document.getElementById(o.settings.container));r=c.getSize(p);c.extend(document.getElementById(o.id+"_silverlight_container").style,{top:q.y+"px",left:q.x+"px",width:r.w+"px",height:r.h+"px"})});l.bind("Silverlight:UploadChunkSuccessful",function(o,r,p,u,t){var s,q=o.getFile(n[r]);s={chunk:p,chunks:u,response:t};o.trigger("ChunkUploaded",q,s);if(q.status!=c.FAILED){e().UploadNextChunk()}if(p==u-1){q.status=c.DONE;o.trigger("FileUploaded",q,{response:t})}});l.bind("Silverlight:UploadSuccessful",function(o,r,p){var q=o.getFile(n[r]);q.status=c.DONE;o.trigger("FileUploaded",q,{response:p})});l.bind("FilesRemoved",function(o,q){var p;for(p=0;p<q.length;p++){e().RemoveFile(n[q[p].id])}});l.bind("UploadFile",function(o,q){var r=o.settings,p=r.resize||{};e().UploadFile(n[q.id],c.buildUrl(o.settings.url,{name:q.target_name||q.name}),b({chunk_size:r.chunk_size,image_width:p.width,image_height:p.height,image_quality:p.quality||90,multipart:!!r.multipart,multipart_params:r.multipart_params||{},headers:r.headers}))});m({success:true})})}})})(plupload);(function(c){var a={};function b(){var d;try{d=navigator.plugins["Shockwave Flash"];d=d.description}catch(f){try{d=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(e){d="0.0"}}d=d.match(/\d+/g);return parseFloat(d[0]+"."+d[1])}c.flash={trigger:function(f,d,e){setTimeout(function(){var j=a[f],h,g;if(j){j.trigger("Flash:"+d,e)}},0)}};c.runtimes.Flash=c.addRuntime("flash",{getFeatures:function(){return{jpgresize:true,pngresize:true,chunks:true,progress:true,multipart:true}},init:function(g,l){var k,f,h,e,m=0,d=document.body;if(b()<10){l({success:false});return}a[g.id]=g;k=document.getElementById(g.settings.browse_button);f=document.createElement("div");f.id=g.id+"_flash_container";c.extend(f.style,{position:"absolute",top:"0px",background:g.settings.shim_bgcolor||"transparent",zIndex:99999,width:"100%",height:"100%"});f.className="plupload flash";if(g.settings.container){d=document.getElementById(g.settings.container);d.style.position="relative"}d.appendChild(f);h="id="+escape(g.id);f.innerHTML='<object id="'+g.id+'_flash" width="100%" height="100%" style="outline:0" type="application/x-shockwave-flash" data="'+g.settings.flash_swf_url+'"><param name="movie" value="'+g.settings.flash_swf_url+'" /><param name="flashvars" value="'+h+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>';function j(){return document.getElementById(g.id+"_flash")}function i(){if(m++>5000){l({success:false});return}if(!e){setTimeout(i,1)}}i();k=f=null;g.bind("Flash:Init",function(){var p={},o,n=g.settings.resize||{};e=true;j().setFileFilters(g.settings.filters,g.settings.multi_selection);g.bind("UploadFile",function(q,r){var s=q.settings;j().uploadFile(p[r.id],c.buildUrl(s.url,{name:r.target_name||r.name}),{chunk_size:s.chunk_size,width:n.width,height:n.height,quality:n.quality||90,multipart:s.multipart,multipart_params:s.multipart_params,file_data_name:s.file_data_name,format:/\.(jpg|jpeg)$/i.test(r.name)?"jpg":"png",headers:s.headers,urlstream_upload:s.urlstream_upload})});g.bind("Flash:UploadProcess",function(r,q){var s=r.getFile(p[q.id]);if(s.status!=c.FAILED){s.loaded=q.loaded;s.size=q.size;r.trigger("UploadProgress",s)}});g.bind("Flash:UploadChunkComplete",function(q,s){var t,r=q.getFile(p[s.id]);t={chunk:s.chunk,chunks:s.chunks,response:s.text};q.trigger("ChunkUploaded",r,t);if(r.status!=c.FAILED){j().uploadNextChunk()}if(s.chunk==s.chunks-1){r.status=c.DONE;q.trigger("FileUploaded",r,{response:s.text})}});g.bind("Flash:SelectFiles",function(q,t){var s,r,u=[],v;for(r=0;r<t.length;r++){s=t[r];v=c.guid();p[v]=s.id;p[s.id]=v;u.push(new c.File(v,s.name,s.size))}if(u.length){g.trigger("FilesAdded",u)}});g.bind("Flash:SecurityError",function(q,r){g.trigger("Error",{code:c.SECURITY_ERROR,message:"Security error.",details:r.message,file:g.getFile(p[r.id])})});g.bind("Flash:GenericError",function(q,r){g.trigger("Error",{code:c.GENERIC_ERROR,message:"Generic error.",details:r.message,file:g.getFile(p[r.id])})});g.bind("Flash:IOError",function(q,r){g.trigger("Error",{code:c.IO_ERROR,message:"IO error.",details:r.message,file:g.getFile(p[r.id])})});g.bind("QueueChanged",function(q){g.refresh()});g.bind("FilesRemoved",function(q,s){var r;for(r=0;r<s.length;r++){j().removeFile(p[s[r].id])}});g.bind("StateChanged",function(q){g.refresh()});g.bind("Refresh",function(q){var r,s,t;j().setFileFilters(g.settings.filters,g.settings.multi_selection);r=document.getElementById(q.settings.browse_button);s=c.getPos(r,document.getElementById(q.settings.container));t=c.getSize(r);c.extend(document.getElementById(q.id+"_flash_container").style,{top:s.y+"px",left:s.x+"px",width:t.w+"px",height:t.h+"px"})});l({success:true})})}})})(plupload);(function(a){a.runtimes.BrowserPlus=a.addRuntime("browserplus",{getFeatures:function(){return{dragdrop:true,jpgresize:true,pngresize:true,chunks:true,progress:true,multipart:true}},init:function(g,i){var e=window.BrowserPlus,h={},d=g.settings,c=d.resize;function f(n){var m,l,j=[],k,o;for(l=0;l<n.length;l++){k=n[l];o=a.guid();h[o]=k;j.push(new a.File(o,k.name,k.size))}if(l){g.trigger("FilesAdded",j)}}function b(){g.bind("PostInit",function(){var m,k=d.drop_element,o=g.id+"_droptarget",j=document.getElementById(k),l;function p(r,q){e.DragAndDrop.AddDropTarget({id:r},function(s){e.DragAndDrop.AttachCallbacks({id:r,hover:function(t){if(!t&&q){q()}},drop:function(t){if(q){q()}f(t)}},function(){})})}function n(){document.getElementById(o).style.top="-1000px"}if(j){if(document.attachEvent&&(/MSIE/gi).test(navigator.userAgent)){m=document.createElement("div");m.setAttribute("id",o);a.extend(m.style,{position:"absolute",top:"-1000px",background:"red",filter:"alpha(opacity=0)",opacity:0});document.body.appendChild(m);a.addEvent(j,"dragenter",function(r){var q,s;q=document.getElementById(k);s=a.getPos(q);a.extend(document.getElementById(o).style,{top:s.y+"px",left:s.x+"px",width:q.offsetWidth+"px",height:q.offsetHeight+"px"})});p(o,n)}else{p(k)}}a.addEvent(document.getElementById(d.browse_button),"click",function(v){var t=[],r,q,u=d.filters,s;v.preventDefault();for(r=0;r<u.length;r++){s=u[r].extensions.split(",");for(q=0;q<s.length;q++){t.push(a.mimeTypes[s[q]])}}e.FileBrowse.OpenBrowseDialog({mimeTypes:t},function(w){if(w.success){f(w.value)}})});j=m=null});g.bind("UploadFile",function(n,k){var m=h[k.id],j={},l=n.settings.chunk_size,o,p=[];function r(s,u){var t;if(k.status==a.FAILED){return}j.name=k.target_name||k.name;if(l){j.chunk=s;j.chunks=u}t=p.shift();e.Uploader.upload({url:a.buildUrl(n.settings.url,j),files:{file:t},cookies:document.cookies,postvars:n.settings.multipart_params,progressCallback:function(x){var w,v=0;o[s]=parseInt(x.filePercent*t.size/100,10);for(w=0;w<o.length;w++){v+=o[w]}k.loaded=v;n.trigger("UploadProgress",k)}},function(w){var v,x;if(w.success){v=w.value.statusCode;if(l){n.trigger("ChunkUploaded",k,{chunk:s,chunks:u,response:w.value.body,status:v})}if(p.length>0){r(++s,u)}else{k.status=a.DONE;n.trigger("FileUploaded",k,{response:w.value.body,status:v});if(v>=400){n.trigger("Error",{code:a.HTTP_ERROR,message:"HTTP Error.",file:k,status:v})}}}else{n.trigger("Error",{code:a.GENERIC_ERROR,message:"Generic Error.",file:k,details:w.error})}})}function q(s){k.size=s.size;if(l){e.FileAccess.chunk({file:s,chunkSize:l},function(v){if(v.success){var w=v.value,t=w.length;o=Array(t);for(var u=0;u<t;u++){o[u]=0;p.push(w[u])}r(0,t)}})}else{o=Array(1);p.push(s);r(0,1)}}if(c&&/\.(png|jpg|jpeg)$/i.test(k.name)){BrowserPlus.ImageAlter.transform({file:m,quality:c.quality||90,actions:[{scale:{maxwidth:c.width,maxheight:c.height}}]},function(s){if(s.success){q(s.value.file)}})}else{q(m)}});i({success:true})}if(e){e.init(function(k){var j=[{service:"Uploader",version:"3"},{service:"DragAndDrop",version:"1"},{service:"FileBrowse",version:"1"},{service:"FileAccess",version:"2"}];if(c){j.push({service:"ImageAlter",version:"4"})}if(k.success){e.require({services:j},function(l){if(l.success){b()}else{i()}})}else{i()}})}else{i()}}})})(plupload);(function(b){function a(i,l,j,c,k){var e,d,h,g,f;e=document.createElement("canvas");e.style.display="none";document.body.appendChild(e);d=e.getContext("2d");h=new Image();h.onload=function(){var o,m,n;f=Math.min(l/h.width,j/h.height);if(f<1){o=Math.round(h.width*f);m=Math.round(h.height*f)}else{o=h.width;m=h.height}e.width=o;e.height=m;d.drawImage(h,0,0,o,m);g=e.toDataURL(c);g=g.substring(g.indexOf("base64,")+7);g=atob(g);e.parentNode.removeChild(e);k({success:true,data:g})};h.src=i}b.runtimes.Html5=b.addRuntime("html5",{getFeatures:function(){var g,d,f,e,c;d=f=e=c=false;if(window.XMLHttpRequest){g=new XMLHttpRequest();f=!!g.upload;d=!!(g.sendAsBinary||g.upload)}if(d){e=!!(File&&File.prototype.getAsDataURL);c=!!(File&&File.prototype.slice)}return{html5:d,dragdrop:window.mozInnerScreenX!==undefined||c,jpgresize:e,pngresize:e,multipart:e||!!window.FileReader||!!window.FormData,progress:f,chunking:c||e}},init:function(f,g){var c={},d;function e(l){var j,h,k=[],m;for(h=0;h<l.length;h++){j=l[h];m=b.guid();c[m]=j;k.push(new b.File(m,j.fileName,j.fileSize))}if(k.length){f.trigger("FilesAdded",k)}}d=this.getFeatures();if(!d.html5){g({success:false});return}f.bind("Init",function(m){var q,o=[],l,p,j=m.settings.filters,k,n,h=document.body;q=document.createElement("div");q.id=m.id+"_html5_container";for(l=0;l<j.length;l++){k=j[l].extensions.split(/,/);for(p=0;p<k.length;p++){n=b.mimeTypes[k[p]];if(n){o.push(n)}}}b.extend(q.style,{position:"absolute",background:f.settings.shim_bgcolor||"transparent",width:"100px",height:"100px",overflow:"hidden",zIndex:99999,opacity:f.settings.shim_bgcolor?"":0});q.className="plupload html5";if(f.settings.container){h=document.getElementById(f.settings.container);h.style.position="relative"}h.appendChild(q);q.innerHTML='<input id="'+f.id+'_html5" style="width:100%;" type="file" accept="'+o.join(",")+'" '+(f.settings.multi_selection?'multiple="multiple"':"")+" />";document.getElementById(f.id+"_html5").onchange=function(){e(this.files);this.value=""}});f.bind("PostInit",function(){var h=document.getElementById(f.settings.drop_element);if(h){b.addEvent(h,"dragover",function(i){i.preventDefault()});b.addEvent(h,"drop",function(j){var i=j.dataTransfer;if(i&&i.files){e(i.files)}j.preventDefault()})}});f.bind("Refresh",function(h){var i,j,k;i=document.getElementById(f.settings.browse_button);j=b.getPos(i,document.getElementById(h.settings.container));k=b.getSize(i);b.extend(document.getElementById(f.id+"_html5_container").style,{top:j.y+"px",left:j.x+"px",width:k.w+"px",height:k.h+"px"})});f.bind("UploadFile",function(h,j){var k=h.settings,m,i;function l(n){var q=0,p=0;function o(){var u=n,C,D,y,z,A=0,r="----pluploadboundary"+b.guid(),t,w,s="--",B="\r\n",x="";if(j.status==b.DONE||j.status==b.FAILED||h.state==b.STOPPED){return}z={name:j.target_name||j.name};if(k.chunk_size&&d.chunking){t=k.chunk_size;y=Math.ceil(j.size/t);w=Math.min(t,j.size-(q*t));if(typeof(n)=="string"){u=n.substring(q*t,q*t+w)}else{u=n.slice(q*t,w)}z.chunk=q;z.chunks=y}else{w=j.size}C=new XMLHttpRequest();D=C.upload;if(D){D.onprogress=function(E){j.loaded=Math.min(j.size,p+E.loaded-A);h.trigger("UploadProgress",j)}}C.open("post",b.buildUrl(h.settings.url,z),true);C.onreadystatechange=function(){var E,G;if(C.readyState==4){try{E=C.status}catch(F){E=0}if(E>=400){h.trigger("Error",{code:b.HTTP_ERROR,message:"HTTP Error.",file:j,status:E})}else{if(y){G={chunk:q,chunks:y,response:C.responseText,status:E};h.trigger("ChunkUploaded",j,G);p+=w;if(G.cancelled){j.status=b.FAILED;return}j.loaded=Math.min(j.size,(q+1)*t)}else{j.loaded=j.size}h.trigger("UploadProgress",j);if(!y||++q>=y){j.status=b.DONE;h.trigger("FileUploaded",j,{response:C.responseText,status:E})}else{o()}}}};b.each(h.settings.headers,function(F,E){C.setRequestHeader(E,F)});if(h.settings.multipart&&d.multipart){if(!C.sendAsBinary){var v=new FormData();b.each(h.settings.multipart_params,function(F,E){v.append(E,F)});v.append(h.settings.file_data_name,u);C.send(v);return}C.setRequestHeader("Content-Type","multipart/form-data; boundary="+r);b.each(h.settings.multipart_params,function(F,E){x+=s+r+B+'Content-Disposition: form-data; name="'+E+'"'+B+B;x+=F+B});x+=s+r+B+'Content-Disposition: form-data; name="'+h.settings.file_data_name+'"; filename="'+j.name+'"'+B+"Content-Type: application/octet-stream"+B+B+u+B+s+r+s+B;A=x.length-u.length;u=x}else{C.setRequestHeader("Content-Type","application/octet-stream")}if(C.sendAsBinary){C.sendAsBinary(u)}else{C.send(u)}}o()}m=c[j.id];i=h.settings.resize;if(d.jpgresize){if(i&&/\.(png|jpg|jpeg)$/i.test(j.name)){a(m.getAsDataURL(),i.width,i.height,/\.png$/i.test(j.name)?"image/png":"image/jpeg",function(n){if(n.success){j.size=n.data.length;l(n.data)}else{l(m.getAsBinary())}})}else{l(m.getAsBinary())}}else{l(m)}});g({success:true})}})})(plupload);(function(a){a.runtimes.Html4=a.addRuntime("html4",{getFeatures:function(){return{multipart:true}},init:function(f,g){var d={},c,b;function e(l){var k,j,m=[],n,h;h=l.value.replace(/\\/g,"/");h=h.substring(h.length,h.lastIndexOf("/")+1);n=a.guid();k=new a.File(n,h);d[n]=k;k.input=l;m.push(k);if(m.length){f.trigger("FilesAdded",m)}}f.bind("Init",function(p){var h,x,v,t=[],o,u,m=p.settings.filters,l,s,r=/MSIE/.test(navigator.userAgent),k="javascript",w,j=document.body,n;if(f.settings.container){j=document.getElementById(f.settings.container);j.style.position="relative"}c=(typeof p.settings.form=="string")?document.getElementById(p.settings.form):p.settings.form;if(!c){n=document.getElementById(f.settings.browse_button);for(;n;n=n.parentNode){if(n.nodeName=="FORM"){c=n}}}if(!c){c=document.createElement("form");c.style.display="inline";n=document.getElementById(f.settings.container);n.parentNode.insertBefore(c,n);c.appendChild(n)}c.setAttribute("method","post");c.setAttribute("enctype","multipart/form-data");a.each(p.settings.multipart_params,function(z,y){var i=document.createElement("input");a.extend(i,{type:"hidden",name:y,value:z});c.appendChild(i)});b=document.createElement("iframe");b.setAttribute("src",k+':""');b.setAttribute("name",p.id+"_iframe");b.setAttribute("id",p.id+"_iframe");b.style.display="none";a.addEvent(b,"load",function(B){var C=B.target,z=f.currentfile,A;try{A=C.contentWindow.document||C.contentDocument||window.frames[C.id].document}catch(y){p.trigger("Error",{code:a.SECURITY_ERROR,message:"Security error.",file:z});return}if(A.location.href=="about:blank"||!z){return}var i=A.documentElement.innerText||A.documentElement.textContent;if(i!=""){z.status=a.DONE;z.loaded=1025;z.percent=100;if(z.input){z.input.removeAttribute("name")}p.trigger("UploadProgress",z);p.trigger("FileUploaded",z,{response:i});if(c.tmpAction){c.setAttribute("action",c.tmpAction)}if(c.tmpTarget){c.setAttribute("target",c.tmpTarget)}}});c.appendChild(b);if(r){window.frames[b.id].name=b.name}x=document.createElement("div");x.id=p.id+"_iframe_container";for(o=0;o<m.length;o++){l=m[o].extensions.split(/,/);for(u=0;u<l.length;u++){s=a.mimeTypes[l[u]];if(s){t.push(s)}}}a.extend(x.style,{position:"absolute",background:"transparent",width:"100px",height:"100px",overflow:"hidden",zIndex:99999,opacity:0});w=f.settings.shim_bgcolor;if(w){a.extend(x.style,{background:w,opacity:1})}x.className="plupload_iframe";j.appendChild(x);function q(){v=document.createElement("input");v.setAttribute("type","file");v.setAttribute("accept",t.join(","));v.setAttribute("size",1);a.extend(v.style,{width:"100%",height:"100%",opacity:0});if(r){a.extend(v.style,{filter:"alpha(opacity=0)"})}a.addEvent(v,"change",function(i){var y=i.target;if(y.value){q();y.style.display="none";e(y)}});x.appendChild(v);return true}q()});f.bind("Refresh",function(h){var i,j,k;i=document.getElementById(f.settings.browse_button);j=a.getPos(i,document.getElementById(h.settings.container));k=a.getSize(i);a.extend(document.getElementById(f.id+"_iframe_container").style,{top:j.y+"px",left:j.x+"px",width:k.w+"px",height:k.h+"px"})});f.bind("UploadFile",function(h,i){if(i.status==a.DONE||i.status==a.FAILED||h.state==a.STOPPED){return}if(!i.input){i.status=a.ERROR;return}i.input.setAttribute("name",h.settings.file_data_name);c.tmpAction=c.getAttribute("action");c.setAttribute("action",a.buildUrl(h.settings.url,{name:i.target_name||i.name}));c.tmpTarget=c.getAttribute("target");c.setAttribute("target",b.name);this.currentfile=i;c.submit()});f.bind("FilesRemoved",function(h,k){var j,l;for(j=0;j<k.length;j++){l=k[j].input;if(l){l.parentNode.removeChild(l)}}});g({success:true})}})})(plupload);
|
typo3/contrib/plupload/changelog.txt (revision ) | ||
---|---|---|
Version 1.2.x (2010-xx-xx)
|
||
Added support for crossdomain loading of the XAP and SWF files and crossdomain upload.
|
||
Added preinit/init options to to ease up the binding of custom events to queueWidget and the Uploader class.
|
||
Added drag/drop support for Safari kind of a hack until they release official drag/drop support like Chrome.
|
||
Added events example file that show how to bind all events and display event specific data.
|
||
Fixed logic issue with the upload.php example file. Chunking wasn't working correctly.
|
||
Fixed issue with HTML4 not handling the form encoding correctly on older IE versions. Patch contributed by jinxdone.
|
||
Fixed so the HTML4 runtime only submits the defined multipart_params arguments.
|
||
Fixes issue where it wasn't possible to dynamically override url or mutlipart_params for the HTML4 runtime.
|
||
Fixed so all runtimes pass the name, chunk and chunks parameters as multipart parameters instead of querystring parameters.
|
||
Fixed so files are read using the newer FileReader class if it's available if not it tries the older getAsXXX on Gecko.
|
||
Fixed bug where IE 9 beta 1 wouldn't render Silverlight properly.
|
||
Version 1.2.4 (2010-09-08)
|
||
Added new BeforeUpload event to make it easier to override settings before a file is uploaded.
|
||
Added new automatic usage of FileReference in Flash if it's possible. Contributed by Marcel Jackwerth.
|
||
Added new chunking support for Chrome 5 and Firefox 3.6 using the HTML 5 runtime.
|
||
Added new multipart upload support for WebKit using the HTML 5 runtime and the FormData object.
|
||
Added new image scaling method for the Flash runtime contributed by rcoopman.
|
||
Added new alert error message if the user selected invalid files.
|
||
Added new automatic unique name generation to the example.php script. Contributed by Brandon Kelly.
|
||
Changed so the default upload method is multipart and the default chunk size is 0.
|
||
Fixed progress issue with the HTML5 runtime running on Gecko.
|
||
Fixed so longer extensions can be used such as .tar.gz.
|
||
Fixed so the file extension is retained when using the unique_names option.
|
||
Version 1.2.3 (2010-05-27)
|
||
Added new drag/drop support for HTML5 running on Chrome beta.
|
||
Added new multipart state for the features object. It's now possible to detect multipart support.
|
||
Added new getFeatures function to all runtime. Basic concept by Javier Martinez Fernandez.
|
||
Fixed bug where runtimes where initialized even if they didn't match the required_features setting.
|
||
Version 1.2.2.1 (2010-05-04)
|
||
Added new headers option, enables you to set custom headers for the upload requests.
|
||
Fixed bug where the file extension checking was case sensitive.
|
||
Version 1.2.2 (2010-04-26)
|
||
Added new file_data_name option that enables you to set the multipart file data param. Patch contributed by Alex Ganov.
|
||
Added new FILE_SIZE_ERROR type that will be triggered if the user selected a file that is to large or zero bytes.
|
||
Added new FILE_EXTENSION_ERROR type that will be triggered if you add a file with an invalid file extension.
|
||
Added new required_features setting, enables you to specify a list of required features that the runtime must have.
|
||
Fixed so the plupload.buildUrl function uses the UTF compatible encodeURIComponent method instead of escape.
|
||
Fixed so that all file types can be selected if you don't specify a filter setting.
|
||
Fixed so more valid HTTP status codes are accepted as valid responses.
|
||
Fixed so all runtimes fills the features object with available features.
|
||
Fixed some issues with the HTML4 runtime if there wasn't any existing forms on the page.
|
||
Fixed some conflict issues with HTML4 runtime and forms with the input names of action or target.
|
||
Fixed bug where some Gecko versions would produce exceptions when checking the HTTP status of a XHR.
|
||
Version 1.2.1 (2010-03-22)
|
||
Fixed bug with incorrect aspect ratio in Flash image scaling.
|
||
Fixed bug where chunked uploads could get scrambled in the Flash runtime. Patch contributed by Grady Werner.
|
||
Fixed bug where a beta version of Chrome wouldn't handle drag/drop correctly because of missing drag effect.
|
||
Fixed so the HTML 4 runtime displays N/A for file sizes and the progress is based on uploaded files instead of bytes.
|
||
Fixed so chunking can be disabled properly in Flash but that will affect the progress bar.
|
||
Fixed so queue widget displays the drag/drop message if file queue is emptied.
|
||
Fixed small files are uploaded as one single chunk and not forced into 4 chunks in the Flash runtime.
|
||
Version 1.2 (2010-03-09)
|
||
Added new rename file support for jQuery queue widget, click on a file name to rename it if it's enabled.
|
||
Added official ChunkUploaded event, it similar to FileUploaded but executed for each chunk.
|
||
Added bytes per second support to total queue progress.
|
||
Added better error handling to core API using the new Error event.
|
||
Added better error handling to jQuery queue widget.
|
||
Fixed so chunking uploads is dispatch from JS not from inside Flash/Silverlight.
|
||
Version 1.1.1 (2010-02-25)
|
||
Added new setup setting to queue widget. Makes it easier to bind custom events to uploader instance.
|
||
Fixed so it's possible to disable chunking compleatly. It's now disabled by default.
|
||
Fixed bug where multipart mode was enabled all the time in the Flash runtime.
|
||
Fixed bug where chunked uploading in Silverlight would fail.
|
||
Fixed bug where the delete button was visible while uploading.
|
||
Fixed bug where unique_names setting wasn't working when the core API was used.
|
||
Fixed bug where the queue widget wouldn't display the currently uploaded file if the unique_names was enabled.
|
||
Version 1.1 (2010-02-24)
|
||
Added new multipart and multipart_params support.
|
||
Added new container option, enables you to specify where flash/silverlight objects would be added.
|
||
Added chunking support to BrowserPlus runtime, contributed by Steve Spencer.
|
||
Added FileUploaded event that fires when a file is uploaded.
|
||
Added more easily understandable buttons to queue widget.
|
||
Added html4 runtime, contributed by Ryan Demmer.
|
||
Fixed issues with i18n support and added a Swedish and Danish language pack.
|
||
Fixed bug where the Flash runtime could do empty requests if the image was scaled down.
|
||
Fixed bug where uploading small images in Silverlight would produce an exception.
|
||
Fixed so the runtime list can include whitespace or missing runtimes. Patch contributed by ?yvind Sean Kinsey.
|
||
Fixed so to large files are ignored and never dispatched to the FilesAdded event.
|
||
Version 1.0 (2010-02-03)
|
||
First official release of Plupload.
|
typo3/sysext/lang/locallang_misc.xml (revision ) | ||
---|---|---|
<label index="switchtousershort">SU:</label>
|
||
<label index="fileUpload_windowTitle">File Upload Progress</label>
|
||
<label index="fileUpload_buttonSelectFiles">Select Files</label>
|
||
<label index="fileUpload_buttonStartUpload">Start Upload</label>
|
||
<label index="fileUpload_buttonCancelAll">Cancel All Uploads</label>
|
||
<label index="fileUpload_progressText">{2} of {1} file(s) uploaded (Speed: {5}/s)</label>
|
||
<label index="fileUpload_infoComponentMaxFileSize">You can upload files with a maximum size of {0}.</label>
|
||
<label index="fileUpload_infoComponentFileUploadLimit">You can upload a total of {0}.</label>
|
||
<label index="fileUpload_infoComponentFileTypeLimit">You can upload the following file types {0}.</label>
|
||
<label index="fileUpload_infoComponentOverrideFiles">Overwrite existing files</label>
|
||
<label index="fileUpload_infoFileQueueEmpty">no files queued</label>
|
||
<label index="fileUpload_infoFileQueued">File queued</label>
|
||
<label index="fileUpload_infoFileFinished">Upload finished</label>
|
||
<label index="fileUpload_infoFileUploading">Uploading ({0}%)</label>
|
||
<label index="fileUpload_processRunning">Another process is already uploading</label>
|
||
<label index="fileUpload_uploadWait">Waiting to start upload of {0}</label>
|
||
<label index="fileUpload_uploadStarting">Starting upload of {0}</label>
|
typo3/contrib/plupload/js/gears_init.js (revision ) | ||
---|---|---|
// Copyright 2007, Google Inc.
|
||
//
|
||
// Redistribution and use in source and binary forms, with or without
|
||
// modification, are permitted provided that the following conditions are met:
|
||
//
|
||
// 1. Redistributions of source code must retain the above copyright notice,
|
||
// this list of conditions and the following disclaimer.
|
||
// 2. Redistributions in binary form must reproduce the above copyright notice,
|
||
// this list of conditions and the following disclaimer in the documentation
|
||
// and/or other materials provided with the distribution.
|
||
// 3. Neither the name of Google Inc. nor the names of its contributors may be
|
||
// used to endorse or promote products derived from this software without
|
||
// specific prior written permission.
|
||
//
|
||
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
//
|
||
// Sets up google.gears.*, which is *the only* supported way to access Gears.
|
||
//
|
||
// Circumvent this file at your own risk!
|
||
//
|
||
// In the future, Gears may automatically define google.gears.* without this
|
||
// file. Gears may use these objects to transparently fix bugs and compatibility
|
||
// issues. Applications that use the code below will continue to work seamlessly
|
||
// when that happens.
|
||
(function() {
|
||
// We are already defined. Hooray!
|
||
if (window.google && google.gears) {
|
||
return;
|
||
}
|
||
var factory = null;
|
||
// Firefox
|
||
if (typeof GearsFactory != 'undefined') {
|
||
factory = new GearsFactory();
|
||
} else {
|
||
// IE
|
||
try {
|
||
factory = new ActiveXObject('Gears.Factory');
|
||
// privateSetGlobalObject is only required and supported on WinCE.
|
||
if (factory.getBuildInfo().indexOf('ie_mobile') != -1) {
|
||
factory.privateSetGlobalObject(this);
|
||
}
|
||
} catch (e) {
|
||
// Safari
|
||
if ((typeof navigator.mimeTypes != 'undefined')
|
||
&& navigator.mimeTypes["application/x-googlegears"]) {
|
||
factory = document.createElement("object");
|
||
factory.style.display = "none";
|
||
factory.width = 0;
|
||
factory.height = 0;
|
||
factory.type = "application/x-googlegears";
|
||
document.documentElement.appendChild(factory);
|
||
}
|
||
}
|
||
}
|
||
// *Do not* define any objects if Gears is not installed. This mimics the
|
||
// behavior of Gears defining the objects in the future.
|
||
if (!factory) {
|
||
return;
|
||
}
|
||
// Now set up the objects, being careful not to overwrite anything.
|
||
//
|
||
// Note: In Internet Explorer for Windows Mobile, you can't add properties to
|
||
// the window object. However, global objects are automatically added as
|
||
// properties of the window object in all browsers.
|
||
if (!window.google) {
|
||
google = {};
|
||
}
|
||
if (!google.gears) {
|
||
google.gears = {factory: factory};
|
||
}
|
||
})();
|
typo3/contrib/plupload/js/plupload.silverlight.min.js (revision ) | ||
---|---|---|
(function(c){var a={};function b(l){var k,j=typeof l,h,e,g,f;if(j==="string"){k="\bb\tt\nn\ff\rr\"\"''\\\\";return'"'+l.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g,function(n,m){var i=k.indexOf(m);if(i+1){return"\\"+k.charAt(i+1)}n=m.charCodeAt().toString(16);return"\\u"+"0000".substring(n.length)+n})+'"'}if(j=="object"){e=l.length!==h;k="";if(e){for(g=0;g<l.length;g++){if(k){k+=","}k+=b(l[g])}k="["+k+"]"}else{for(f in l){if(l.hasOwnProperty(f)){if(k){k+=","}k+=b(f)+":"+b(l[f])}}k="{"+k+"}"}return k}if(l===h){return"null"}return""+l}function d(o){var r=false,f=null,k=null,g,h,i,q,j,m=0;try{try{k=new ActiveXObject("AgControl.AgControl");if(k.IsVersionSupported(o)){r=true}k=null}catch(n){var l=navigator.plugins["Silverlight Plug-In"];if(l){g=l.description;if(g==="1.0.30226.2"){g="2.0.30226.2"}h=g.split(".");while(h.length>3){h.pop()}while(h.length<4){h.push(0)}i=o.split(".");while(i.length>4){i.pop()}do{q=parseInt(i[m],10);j=parseInt(h[m],10);m++}while(m<i.length&&q===j);if(q<=j&&!isNaN(q)){r=true}}}}catch(p){r=false}return r}c.silverlight={trigger:function(j,f){var h=a[j],g,e;if(h){e=c.toArray(arguments).slice(1);e[0]="Silverlight:"+f;setTimeout(function(){h.trigger.apply(h,e)},0)}}};c.runtimes.Silverlight=c.addRuntime("silverlight",{getFeatures:function(){return{jpgresize:true,pngresize:true,chunks:true,progress:true,multipart:true}},init:function(l,m){var k,h="",j=l.settings.filters,g,f=document.body;if(!d("2.0.31005.0")||(window.opera&&window.opera.buildNumber)){m({success:false});return}a[l.id]=l;k=document.createElement("div");k.id=l.id+"_silverlight_container";c.extend(k.style,{position:"absolute",top:"0px",background:l.settings.shim_bgcolor||"transparent",zIndex:99999,width:"100px",height:"100px",overflow:"hidden",opacity:l.settings.shim_bgcolor?"":0.01});k.className="plupload silverlight";if(l.settings.container){f=document.getElementById(l.settings.container);f.style.position="relative"}f.appendChild(k);for(g=0;g<j.length;g++){h+=(h!=""?"|":"")+j[g].title+" | *."+j[g].extensions.replace(/,/g,";*.")}k.innerHTML='<object id="'+l.id+'_silverlight" data="data:application/x-silverlight," type="application/x-silverlight-2" style="outline:none;" width="1024" height="1024"><param name="source" value="'+l.settings.silverlight_xap_url+'"/><param name="background" value="Transparent"/><param name="windowless" value="true"/><param name="initParams" value="id='+l.id+",filter="+h+'"/></object>';function e(){return document.getElementById(l.id+"_silverlight").content.Upload}l.bind("Silverlight:Init",function(){var i,n={};l.bind("Silverlight:StartSelectFiles",function(o){i=[]});l.bind("Silverlight:SelectFile",function(o,r,p,q){var s;s=c.guid();n[s]=r;n[r]=s;i.push(new c.File(s,p,q))});l.bind("Silverlight:SelectSuccessful",function(){if(i.length){l.trigger("FilesAdded",i)}});l.bind("Silverlight:UploadChunkError",function(o,r,p,s,q){l.trigger("Error",{code:c.IO_ERROR,message:"IO Error.",details:q,file:o.getFile(n[r])})});l.bind("Silverlight:UploadFileProgress",function(o,s,p,r){var q=o.getFile(n[s]);if(q.status!=c.FAILED){q.size=r;q.loaded=p;o.trigger("UploadProgress",q)}});l.bind("Refresh",function(o){var p,q,r;p=document.getElementById(o.settings.browse_button);q=c.getPos(p,document.getElementById(o.settings.container));r=c.getSize(p);c.extend(document.getElementById(o.id+"_silverlight_container").style,{top:q.y+"px",left:q.x+"px",width:r.w+"px",height:r.h+"px"})});l.bind("Silverlight:UploadChunkSuccessful",function(o,r,p,u,t){var s,q=o.getFile(n[r]);s={chunk:p,chunks:u,response:t};o.trigger("ChunkUploaded",q,s);if(q.status!=c.FAILED){e().UploadNextChunk()}if(p==u-1){q.status=c.DONE;o.trigger("FileUploaded",q,{response:t})}});l.bind("Silverlight:UploadSuccessful",function(o,r,p){var q=o.getFile(n[r]);q.status=c.DONE;o.trigger("FileUploaded",q,{response:p})});l.bind("FilesRemoved",function(o,q){var p;for(p=0;p<q.length;p++){e().RemoveFile(n[q[p].id])}});l.bind("UploadFile",function(o,q){var r=o.settings,p=r.resize||{};e().UploadFile(n[q.id],c.buildUrl(o.settings.url,{name:q.target_name||q.name}),b({chunk_size:r.chunk_size,image_width:p.width,image_height:p.height,image_quality:p.quality||90,multipart:!!r.multipart,multipart_params:r.multipart_params||{},headers:r.headers}))});m({success:true})})}})})(plupload);
|
typo3/contrib/plupload/js/plupload.full.tmp.js (revision ) | ||
---|---|---|
/**
|
||
* plupload.js
|
||
*
|
||
* Copyright 2009, Moxiecode Systems AB
|
||
* Released under GPL License.
|
||
*
|
||
* License: http://www.plupload.com/license
|
||
* Contributing: http://www.plupload.com/contributing
|
||
*/
|
||
// JSLint defined globals
|
||
/*global window:false, escape:false */
|
||
(function() {
|
||
var count = 0, runtimes = [], i18n = {}, mimes = {},
|
||
xmlEncodeChars = {'<' : 'lt', '>' : 'gt', '&' : 'amp', '"' : 'quot', '\'' : '#39'},
|
||
xmlEncodeRegExp = /[<>&\"\']/g, undef, delay = window.setTimeout;
|
||
// IE W3C like event funcs
|
||
function preventDefault() {
|
||
this.returnValue = false;
|
||
}
|
||
function stopPropagation() {
|
||
this.cancelBubble = true;
|
||
}
|
||
// Parses the default mime types string into a mimes lookup map
|
||
(function(mime_data) {
|
||
var items = mime_data.split(/,/), i, y, ext;
|
||
for (i = 0; i < items.length; i += 2) {
|
||
ext = items[i + 1].split(/ /);
|
||
for (y = 0; y < ext.length; y++) {
|
||
mimes[ext[y]] = items[i];
|
||
}
|
||
}
|
||
})(
|
||
"application/msword,doc dot," +
|
||
"application/pdf,pdf," +
|
||
"application/pgp-signature,pgp," +
|
||
"application/postscript,ps ai eps," +
|
||
"application/rtf,rtf," +
|
||
"application/vnd.ms-excel,xls xlb," +
|
||
"application/vnd.ms-powerpoint,ppt pps pot," +
|
||
"application/zip,zip," +
|
||
"application/x-shockwave-flash,swf swfl," +
|
||
"application/vnd.openxmlformats,docx pptx xlsx," +
|
||
"audio/mpeg,mpga mpega mp2 mp3," +
|
||
"audio/x-wav,wav," +
|
||
"image/bmp,bmp," +
|
||
"image/gif,gif," +
|
||
"image/jpeg,jpeg jpg jpe," +
|
||
"image/png,png," +
|
||
"image/svg+xml,svg svgz," +
|
||
"image/tiff,tiff tif," +
|
||
"text/html,htm html xhtml," +
|
||
"text/rtf,rtf," +
|
||
"video/mpeg,mpeg mpg mpe," +
|
||
"video/quicktime,qt mov," +
|
||
"video/x-flv,flv," +
|
||
"video/vnd.rn-realvideo,rv," +
|
||
"text/plain,asc txt text diff log," +
|
||
"application/octet-stream,exe"
|
||
);
|
||
/**
|
||
* Plupload class with some global constants and functions.
|
||
*
|
||
* @example
|
||
* // Encode entities
|
||
* console.log(plupload.xmlEncode("My string <>"));
|
||
*
|
||
* // Generate unique id
|
||
* console.log(plupload.guid());
|
||
*
|
||
* @static
|
||
* @class plupload
|
||
*/
|
||
var plupload = {
|
||
/**
|
||
* Inital state of the queue and also the state ones it's finished all it's uploads.
|
||
*
|
||
* @property STOPPED
|
||
* @final
|
||
*/
|
||
STOPPED : 1,
|
||
/**
|
||
* Upload process is running
|
||
*
|
||
* @property STARTED
|
||
* @final
|
||
*/
|
||
STARTED : 2,
|
||
/**
|
||
* File is queued for upload
|
||
*
|
||
* @property QUEUED
|
||
* @final
|
||
*/
|
||
QUEUED : 1,
|
||
/**
|
||
* File is being uploaded
|
||
*
|
||
* @property UPLOADING
|
||
* @final
|
||
*/
|
||
UPLOADING : 2,
|
||
/**
|
||
* File has failed to be uploaded
|
||
*
|
||
* @property FAILED
|
||
* @final
|
||
*/
|
||
FAILED : 4,
|
||
/**
|
||
* File has been uploaded successfully
|
||
*
|
||
* @property DONE
|
||
* @final
|
||
*/
|
||
DONE : 5,
|
||
// Error constants used by the Error event
|
||
/**
|
||
* Generic error for example if an exception is thrown inside Silverlight.
|
||
*
|
||
* @property GENERIC_ERROR
|
||
* @final
|
||
*/
|
||
GENERIC_ERROR : -100,
|
||
/**
|
||
* HTTP transport error. For example if the server produces a HTTP status other than 200.
|
||
*
|
||
* @property HTTP_ERROR
|
||
* @final
|
||
*/
|
||
HTTP_ERROR : -200,
|
||
/**
|
||
* Generic I/O error. For exampe if it wasn't possible to open the file stream on local machine.
|
||
*
|
||
* @property IO_ERROR
|
||
* @final
|
||
*/
|
||
IO_ERROR : -300,
|
||
/**
|
||
* Generic I/O error. For exampe if it wasn't possible to open the file stream on local machine.
|
||
*
|
||
* @property SECURITY_ERROR
|
||
* @final
|
||
*/
|
||
SECURITY_ERROR : -400,
|
||
/**
|
||
* Initialization error. Will be triggered if no runtime was initialized.
|
||
*
|
||
* @property INIT_ERROR
|
||
* @final
|
||
*/
|
||
INIT_ERROR : -500,
|
||
/**
|
||
* File size error. If the user selects a file that is to large it will be blocked and an error of this type will be triggered.
|
||
*
|
||
* @property FILE_SIZE_ERROR
|
||
* @final
|
||
*/
|
||
FILE_SIZE_ERROR : -600,
|
||
/**
|
||
* File extension error. If the user selects a file that isn't valid according to the filters setting.
|
||
*
|
||
* @property FILE_EXTENSION_ERROR
|
||
* @final
|
||
*/
|
||
FILE_EXTENSION_ERROR : -700,
|
||
/**
|
||
* Mime type lookup table.
|
||
*
|
||
* @property mimeTypes
|
||
* @type Object
|
||
* @final
|
||
*/
|
||
mimeTypes : mimes,
|
||
/**
|
||
* Extends the specified object with another object.
|
||
*
|
||
* @method extend
|
||
* @param {Object} target Object to extend.
|
||
* @param {Object..} obj Multiple objects to extend with.
|
||
* @return {Object} Same as target, the extended object.
|
||
*/
|
||
extend : function(target) {
|
||
plupload.each(arguments, function(arg, i) {
|
||
if (i > 0) {
|
||
plupload.each(arg, function(value, key) {
|
||
target[key] = value;
|
||
});
|
||
}
|
||
});
|
||
return target;
|
||
},
|
||
/**
|
||
* Cleans the specified name from national characters (diacritics). The result will be a name with only a-z, 0-9 and _.
|
||
*
|
||
* @method cleanName
|
||
* @param {String} s String to clean up.
|
||
* @return {String} Cleaned string.
|
||
*/
|
||
cleanName : function(name) {
|
||
var i, lookup;
|
||
// Replace diacritics
|
||
lookup = [
|
||
/[\300-\306]/g, 'A', /[\340-\346]/g, 'a',
|
||
/\307/g, 'C', /\347/g, 'c',
|
||
/[\310-\313]/g, 'E', /[\350-\353]/g, 'e',
|
||
/[\314-\317]/g, 'I', /[\354-\357]/g, 'i',
|
||
/\321/g, 'N', /\361/g, 'n',
|
||
/[\322-\330]/g, 'O', /[\362-\370]/g, 'o',
|
||
/[\331-\334]/g, 'U', /[\371-\374]/g, 'u'
|
||
];
|
||
for (i = 0; i < lookup.length; i += 2) {
|
||
name = name.replace(lookup[i], lookup[i + 1]);
|
||
}
|
||
// Replace whitespace
|
||
name = name.replace(/\s+/g, '_');
|
||
// Remove anything else
|
||
name = name.replace(/[^a-z0-9_\-\.]+/gi, '');
|
||
return name;
|
||
},
|
||
/**
|
||
* Adds a specific upload runtime like for example flash or gears.
|
||
*
|
||
* @method addRuntime
|
||
* @param {String} name Runtime name for example flash.
|
||
* @param {Object} obj Object containing init/destroy method.
|
||
*/
|
||
addRuntime : function(name, runtime) {
|
||
runtime.name = name;
|
||
runtimes[name] = runtime;
|
||
runtimes.push(runtime);
|
||
return runtime;
|
||
},
|
||
/**
|
||
* Generates an unique ID. This is 99.99% unique since it takes the current time and 5 random numbers.
|
||
* The only way a user would be able to get the same ID is if the two persons at the same exact milisecond manages
|
||
* to get 5 the same random numbers between 0-65535 it also uses a counter so each call will be guaranteed to be page unique.
|
||
* It's more probable for the earth to be hit with an ansteriod. You can also if you want to be 100% sure set the plupload.guidPrefix property
|
||
* to an user unique key.
|
||
*
|
||
* @method guid
|
||
* @return {String} Virtually unique id.
|
||
*/
|
||
guid : function() {
|
||
var guid = new Date().getTime().toString(32), i;
|
||
for (i = 0; i < 5; i++) {
|
||
guid += Math.floor(Math.random() * 65535).toString(32);
|
||
}
|
||
return (plupload.guidPrefix || 'p') + guid + (count++).toString(32);
|
||
},
|
||
/**
|
||
* Builds a full url out of a base URL and an object with items to append as query string items.
|
||
*
|
||
* @param {String} url Base URL to append query string items to.
|
||
* @param {Object} items Name/value object to serialize as a querystring.
|
||
* @return {String} String with url + serialized query string items.
|
||
*/
|
||
buildUrl : function(url, items) {
|
||
var query = '';
|
||
plupload.each(items, function(value, name) {
|
||
query += (query ? '&' : '') + encodeURIComponent(name) + '=' + encodeURIComponent(value);
|
||
});
|
||
if (query) {
|
||
url += (url.indexOf('?') > 0 ? '&' : '?') + query;
|
||
}
|
||
return url;
|
||
},
|
||
/**
|
||
* Executes the callback function for each item in array/object. If you return false in the
|
||
* callback it will break the loop.
|
||
*
|
||
* @param {Object} obj Object to iterate.
|
||
* @param {function} callback Callback function to execute for each item.
|
||
*/
|
||
each : function(obj, callback) {
|
||
var length, key, i;
|
||
if (obj) {
|
||
length = obj.length;
|
||
if (length === undef) {
|
||
// Loop object items
|
||
for (key in obj) {
|
||
if (obj.hasOwnProperty(key)) {
|
||
if (callback(obj[key], key) === false) {
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
// Loop array items
|
||
for (i = 0; i < length; i++) {
|
||
if (callback(obj[i], i) === false) {
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
/**
|
||
* Formats the specified number as a size string for example 1024 becomes 1 KB.
|
||
*
|
||
* @method formatSize
|
||
* @param {Number} size Size to format as string.
|
||
* @return {String} Formatted size string.
|
||
*/
|
||
formatSize : function(size) {
|
||
if (size === undef) {
|
||
return plupload.translate('N/A');
|
||
}
|
||
// MB
|
||
if (size > 1048576) {
|
||
return Math.round(size / 1048576, 1) + " MB";
|
||
}
|
||
// KB
|
||
if (size > 1024) {
|
||
return Math.round(size / 1024, 1) + " KB";
|
||
}
|
||
return size + " b";
|
||
},
|
||
/**
|
||
* Returns the absolute x, y position of an Element. The position will be returned in a object with x, y fields.
|
||
*
|
||
* @method getPos
|
||
* @param {Element} node HTML element or element id to get x, y position from.
|
||
* @param {Element} root Optional root element to stop calculations at.
|
||
* @return {object} Absolute position of the specified element object with x, y fields.
|
||
*/
|
||
getPos : function(node, root) {
|
||
var x = 0, y = 0, parent, doc = document, nodeRect, rootRect;
|
||
node = node;
|
||
root = root || doc.body;
|
||
// Returns the x, y cordinate for an element on IE 6 and IE 7
|
||
function getIEPos(node) {
|
||
var bodyElm, rect, x = 0, y = 0;
|
||
if (node) {
|
||
rect = node.getBoundingClientRect();
|
||
bodyElm = doc.compatMode === "CSS1Compat" ? doc.documentElement : doc.body;
|
||
x = rect.left + bodyElm.scrollLeft;
|
||
y = rect.top + bodyElm.scrollTop;
|
||
}
|
||
return {
|
||
x : x,
|
||
y : y
|
||
};
|
||
}
|
||
// Use getBoundingClientRect on IE 6 and IE 7 but not on IE 8 in standards mode
|
||
if (node.getBoundingClientRect && (navigator.userAgent.indexOf('MSIE') > 0 && doc.documentMode !== 8)) {
|
||
nodeRect = getIEPos(node);
|
||
rootRect = getIEPos(root);
|
||
return {
|
||
x : nodeRect.x - rootRect.x,
|
||
y : nodeRect.y - rootRect.y
|
||
};
|
||
}
|
||
parent = node;
|
||
while (parent && parent != root && parent.nodeType) {
|
||
x += parent.offsetLeft || 0;
|
||
y += parent.offsetTop || 0;
|
||
parent = parent.offsetParent;
|
||
}
|
||
parent = node.parentNode;
|
||
while (parent && parent != root && parent.nodeType) {
|
||
x -= parent.scrollLeft || 0;
|
||
y -= parent.scrollTop || 0;
|
||
parent = parent.parentNode;
|
||
}
|
||
return {
|
||
x : x,
|
||
y : y
|
||
};
|
||
},
|
||
/**
|
||
* Returns the size of the specified node in pixels.
|
||
*
|
||
* @param {Node} node Node to get the size of.
|
||
* @return {Object} Object with a w and h property.
|
||
*/
|
||
getSize : function(node) {
|
||
return {
|
||
w : node.clientWidth || node.offsetWidth,
|
||
h : node.clientHeight || node.offsetHeight
|
||
};
|
||
},
|
||
/**
|
||
* Parses the specified size string into a byte value. For example 10kb becomes 10240.
|
||
*
|
||
* @method parseSize
|
||
* @param {String/Number} size String to parse or number to just pass through.
|
||
* @return {Number} Size in bytes.
|
||
*/
|
||
parseSize : function(size) {
|
||
var mul;
|
||
if (typeof(size) == 'string') {
|
||
size = /^([0-9]+)([mgk]+)$/.exec(size.toLowerCase().replace(/[^0-9mkg]/g, ''));
|
||
mul = size[2];
|
||
size = +size[1];
|
||
if (mul == 'g') {
|
||
size *= 1073741824;
|
||
}
|
||
if (mul == 'm') {
|
||
size *= 1048576;
|
||
}
|
||
if (mul == 'k') {
|
||
size *= 1024;
|
||
}
|
||
}
|
||
return size;
|
||
},
|
||
/**
|
||
* Encodes the specified string.
|
||
*
|
||
* @method xmlEncode
|
||
* @param {String} s String to encode.
|
||
* @return {String} Encoded string.
|
||
*/
|
||
xmlEncode : function(str) {
|
||
return str ? ('' + str).replace(xmlEncodeRegExp, function(chr) {
|
||
return xmlEncodeChars[chr] ? '&' + xmlEncodeChars[chr] + ';' : chr;
|
||
}) : str;
|
||
},
|
||
/**
|
||
* Forces anything into an array.
|
||
*
|
||
* @method toArray
|
||
* @param {Object} obj Object with length field.
|
||
* @return {Array} Array object containing all items.
|
||
*/
|
||
toArray : function(obj) {
|
||
var i, arr = [];
|
||
for (i = 0; i < obj.length; i++) {
|
||
arr[i] = obj[i];
|
||
}
|
||
return arr;
|
||
},
|
||
/**
|
||
* Extends the language pack object with new items.
|
||
*
|
||
* @param {Object} pack Language pack items to add.
|
||
* @return {Object} Extended language pack object.
|
||
*/
|
||
addI18n : function(pack) {
|
||
return plupload.extend(i18n, pack);
|
||
},
|
||
/**
|
||
* Translates the specified string by checking for the english string in the language pack lookup.
|
||
*
|
||
* @param {String} str String to look for.
|
||
* @reutrn {String} Translated string or the input string if it wasn't found.
|
||
*/
|
||
translate : function(str) {
|
||
return i18n[str] || str;
|
||
},
|
||
/**
|
||
* Adds an event handler to the specified object.
|
||
*
|
||
* @param {Object} obj DOM element like object to add handler to.
|
||
* @param {String} name Name to add event listener to.
|
||
* @param {function} callback Function to call when event occurs.
|
||
*/
|
||
addEvent : function(obj, name, callback) {
|
||
if (obj.attachEvent) {
|
||
obj.attachEvent('on' + name, function() {
|
||
var evt = window.event;
|
||
if (!evt.target) {
|
||
evt.target = evt.srcElement;
|
||
}
|
||
evt.preventDefault = preventDefault;
|
||
evt.stopPropagation = stopPropagation;
|
||
callback(evt);
|
||
});
|
||
} else if (obj.addEventListener) {
|
||
obj.addEventListener(name, callback, false);
|
||
}
|
||
}
|
||
};
|
||
/**
|
||
* Uploader class, an instance of this class will be created for each upload field.
|
||
*
|
||
* @example
|
||
* var uploader = new plupload.Uploader({
|
||
* runtimes : 'gears,html5,flash',
|
||
* browse_button : 'button_id'
|
||
* });
|
||
*
|
||
* uploader.bind('Init', function(up) {
|
||
* alert('Supports drag/drop: ' + (!!up.features.dragdrop));
|
||
* });
|
||
*
|
||
* uploader.bind('FilesAdded', function(up, files) {
|
||
* alert('Selected files: ' + files.length);
|
||
* });
|
||
*
|
||
* uploader.bind('QueueChanged', function(up) {
|
||
* alert('Queued files: ' + uploader.files.length);
|
||
* });
|
||
*
|
||
* uploader.init();
|
||
*
|
||
* @class plupload.Uploader
|
||
*/
|
||
/**
|
||
* Constructs a new uploader instance.
|
||
*
|
||
* @constructor
|
||
* @method Uploader
|
||
* @param {Object} settings Initialization settings, to be used by the uploader instance and runtimes.
|
||
*/
|
||
plupload.Uploader = function(settings) {
|
||
var events = {}, total, files = [], fileIndex, startTime;
|
||
// Inital total state
|
||
total = new plupload.QueueProgress();
|
||
// Default settings
|
||
settings = plupload.extend({
|
||
chunk_size : 0,
|
||
multipart : true,
|
||
multi_selection : true,
|
||
file_data_name : 'file',
|
||
filters : []
|
||
}, settings);
|
||
// Private methods
|
||
function uploadNext() {
|
||
var file;
|
||
if (this.state == plupload.STARTED && fileIndex < files.length) {
|
||
file = files[fileIndex++];
|
||
if (file.status == plupload.QUEUED) {
|
||
this.trigger('BeforeUpload', file);
|
||
this.trigger("UploadFile", file);
|
||
} else {
|
||
uploadNext.call(this);
|
||
}
|
||
} else {
|
||
this.stop();
|
||
}
|
||
}
|
||
function calc() {
|
||
var i, file;
|
||
// Reset stats
|
||
total.reset();
|
||
// Check status, size, loaded etc on all files
|
||
for (i = 0; i < files.length; i++) {
|
||
file = files[i];
|
||
if (file.size !== undef) {
|
||
total.size += file.size;
|
||
total.loaded += file.loaded;
|
||
} else {
|
||
total.size = undef;
|
||
}
|
||
if (file.status == plupload.DONE) {
|
||
total.uploaded++;
|
||
} else if (file.status == plupload.FAILED) {
|
||
total.failed++;
|
||
} else {
|
||
total.queued++;
|
||
}
|
||
}
|
||
// If we couldn't calculate a total file size then use the number of files to calc percent
|
||
if (total.size === undef) {
|
||
total.percent = files.length > 0 ? Math.ceil(total.uploaded / files.length * 100) : 0;
|
||
} else {
|
||
total.bytesPerSec = Math.ceil(total.loaded / ((+new Date() - startTime || 1) / 1000.0));
|
||
total.percent = total.size > 0 ? Math.ceil(total.loaded / total.size * 100) : 0;
|
||
}
|
||
}
|
||
// Add public methods
|
||
plupload.extend(this, {
|
||
/**
|
||
* Current state of the total uploading progress. This one can either be plupload.STARTED or plupload.STOPPED.
|
||
* These states are controlled by the stop/start methods. The default value is STOPPED.
|
||
*
|
||
* @property state
|
||
* @type Number
|
||
*/
|
||
state : plupload.STOPPED,
|
||
/**
|
||
* Map of features that are available for the uploader runtime. Features will be filled
|
||
* before the init event is called, these features can then be used to alter the UI for the end user.
|
||
* Some of the current features that might be in this map is: dragdrop, chunks, jpgresize, pngresize.
|
||
*
|
||
* @property features
|
||
* @type Object
|
||
*/
|