window.wp=window.wp||{};
(function(exports, $){
var Uploader;
if(typeof _wpPluploadSettings==='undefined'){
return;
}
Uploader=function(options){
var self=this,
isIE,
elements={
container: 'container',
browser:   'browse_button',
dropzone:  'drop_element'
},
tryAgainCount={},
tryAgain,
key,
error,
fileUploaded;
this.supports={
upload: Uploader.browser.supported
};
this.supported=this.supports.upload;
if(! this.supported){
return;
}
this.plupload=$.extend(true, { multipart_params: {}}, Uploader.defaults);
this.container=document.body;
$.extend(true, this, options);
for(key in this){
if(typeof this[ key ]==='function'){
this[ key ]=$.proxy(this[ key ], this);
}}
for(key in elements){
if(! this[ key ]){
continue;
}
this[ key ]=$(this[ key ]).first();
if(! this[ key ].length){
delete this[ key ];
continue;
}
if(! this[ key ].prop('id')){
this[ key ].prop('id', '__wp-uploader-id-' + Uploader.uuid++);
}
this.plupload[ elements[ key ] ]=this[ key ].prop('id');
}
if(!(this.browser&&this.browser.length)&&!(this.dropzone&&this.dropzone.length)){
return;
}
this.uploader=new plupload.Uploader(this.plupload);
delete this.plupload;
this.param(this.params||{});
delete this.params;
tryAgain=function(message, data, file){
var times, id;
if(! data||! data.responseHeaders){
error(pluploadL10n.http_error_image, data, file, 'no-retry');
return;
}
id=data.responseHeaders.match(/x-wp-upload-attachment-id:\s*(\d+)/i);
if(id&&id[1]){
id=id[1];
}else{
error(pluploadL10n.http_error_image, data, file, 'no-retry');
return;
}
times=tryAgainCount[ file.id ];
if(times&&times > 4){
$.ajax({
type: 'post',
url: ajaxurl,
dataType: 'json',
data: {
action: 'media-create-image-subsizes',
_wpnonce: _wpPluploadSettings.defaults.multipart_params._wpnonce,
attachment_id: id,
_wp_upload_failed_cleanup: true,
}});
error(message, data, file, 'no-retry');
return;
}
if(! times){
tryAgainCount[ file.id ]=1;
}else{
tryAgainCount[ file.id ]=++times;
}
$.ajax({
type: 'post',
url: ajaxurl,
dataType: 'json',
data: {
action: 'media-create-image-subsizes',
_wpnonce: _wpPluploadSettings.defaults.multipart_params._wpnonce,
attachment_id: id,
}}).done(function(response){
if(response.success){
fileUploaded(self.uploader, file, response);
}else{
if(response.data&&response.data.message){
message=response.data.message;
}
error(message, data, file, 'no-retry');
}}).fail(function(jqXHR){
if(jqXHR.status >=500&&jqXHR.status < 600){
tryAgain(message, data, file);
return;
}
error(message, data, file, 'no-retry');
});
}
error=function(message, data, file, retry){
var isImage=file.type&&file.type.indexOf('image/')===0,
status=data&&data.status;
if(retry!=='no-retry'&&isImage&&status >=500&&status < 600){
tryAgain(message, data, file);
return;
}
if(file.attachment){
file.attachment.destroy();
}
Uploader.errors.unshift({
message: message||pluploadL10n.default_error,
data:    data,
file:    file
});
self.error(message, data, file);
};
fileUploaded=function(up, file, response){
var complete;
_.each(['file','loaded','size','percent'], function(key){
file.attachment.unset(key);
});
file.attachment.set(_.extend(response.data, { uploading: false }));
wp.media.model.Attachment.get(response.data.id, file.attachment);
complete=Uploader.queue.all(function(attachment){
return ! attachment.get('uploading');
});
if(complete){
Uploader.queue.reset();
}
self.success(file.attachment);
}
this.uploader.bind('init', function(uploader){
var timer, active, dragdrop,
dropzone=self.dropzone;
dragdrop=self.supports.dragdrop=uploader.features.dragdrop&&! Uploader.browser.mobile;
if(! dropzone){
return;
}
dropzone.toggleClass('supports-drag-drop', !! dragdrop);
if(! dragdrop){
return dropzone.unbind('.wp-uploader');
}
dropzone.on('dragover.wp-uploader', function(){
if(timer){
clearTimeout(timer);
}
if(active){
return;
}
dropzone.trigger('dropzone:enter').addClass('drag-over');
active=true;
});
dropzone.on('dragleave.wp-uploader, drop.wp-uploader', function(){
timer=setTimeout(function(){
active=false;
dropzone.trigger('dropzone:leave').removeClass('drag-over');
}, 0);
});
self.ready=true;
$(self).trigger('uploader:ready');
});
this.uploader.bind('postinit', function(up){
up.refresh();
self.init();
});
this.uploader.init();
if(this.browser){
this.browser.on('mouseenter', this.refresh);
}else{
this.uploader.disableBrowse(true);
}
$(self).on('uploader:ready', function(){
$('.moxie-shim-html5 input[type="file"]')
.attr({
tabIndex:      '-1',
'aria-hidden': 'true'
});
});
this.uploader.bind('FilesAdded', function(up, files){
_.each(files, function(file){
var attributes, image;
if(plupload.FAILED===file.status){
return;
}
if(file.type==='image/heic'&&up.settings.heic_upload_error){
Uploader.errors.unshift({
message: pluploadL10n.unsupported_image,
data:    {},
file:    file
});
}else if(file.type==='image/webp'&&up.settings.webp_upload_error){
error(pluploadL10n.noneditable_image, {}, file, 'no-retry');
up.removeFile(file);
return;
}else if(file.type==='image/avif'&&up.settings.avif_upload_error){
error(pluploadL10n.noneditable_image, {}, file, 'no-retry');
up.removeFile(file);
return;
}
attributes=_.extend({
file:      file,
uploading: true,
date:      new Date(),
filename:  file.name,
menuOrder: 0,
uploadedTo: wp.media.model.settings.post.id
}, _.pick(file, 'loaded', 'size', 'percent'));
image=/(?:jpe?g|png|gif)$/i.exec(file.name);
if(image){
attributes.type='image';
attributes.subtype=('jpg'===image[0]) ? 'jpeg':image[0];
}
file.attachment=wp.media.model.Attachment.create(attributes);
Uploader.queue.add(file.attachment);
self.added(file.attachment);
});
up.refresh();
up.start();
});
this.uploader.bind('UploadProgress', function(up, file){
file.attachment.set(_.pick(file, 'loaded', 'percent'));
self.progress(file.attachment);
});
this.uploader.bind('FileUploaded', function(up, file, response){
try {
response=JSON.parse(response.response);
} catch(e){
return error(pluploadL10n.default_error, e, file);
}
if(! _.isObject(response)||_.isUndefined(response.success)){
return error(pluploadL10n.default_error, null, file);
}else if(! response.success){
return error(response.data&&response.data.message, response.data, file);
}
fileUploaded(up, file, response);
});
this.uploader.bind('Error', function(up, pluploadError){
var message=pluploadL10n.default_error,
key;
for(key in Uploader.errorMap){
if(pluploadError.code===plupload[ key ]){
message=Uploader.errorMap[ key ];
if(typeof message==='function'){
message=message(pluploadError.file, pluploadError);
}
break;
}}
error(message, pluploadError, pluploadError.file);
up.refresh();
});
};
$.extend(Uploader, _wpPluploadSettings);
Uploader.uuid=0;
Uploader.errorMap={
'FAILED':                 pluploadL10n.upload_failed,
'FILE_EXTENSION_ERROR':   pluploadL10n.invalid_filetype,
'IMAGE_FORMAT_ERROR':     pluploadL10n.not_an_image,
'IMAGE_MEMORY_ERROR':     pluploadL10n.image_memory_exceeded,
'IMAGE_DIMENSIONS_ERROR': pluploadL10n.image_dimensions_exceeded,
'GENERIC_ERROR':          pluploadL10n.upload_failed,
'IO_ERROR':               pluploadL10n.io_error,
'SECURITY_ERROR':         pluploadL10n.security_error,
'FILE_SIZE_ERROR': function(file){
return pluploadL10n.file_exceeds_size_limit.replace('%s', file.name);
},
'HTTP_ERROR': function(file){
if(file.type&&file.type.indexOf('image/')===0){
return pluploadL10n.http_error_image;
}
return pluploadL10n.http_error;
},
};
$.extend(Uploader.prototype, {
param: function(key, value){
if(arguments.length===1&&typeof key==='string'){
return this.uploader.settings.multipart_params[ key ];
}
if(arguments.length > 1){
this.uploader.settings.multipart_params[ key ]=value;
}else{
$.extend(this.uploader.settings.multipart_params, key);
}},
init:     function(){},
error:    function(){},
success:  function(){},
added:    function(){},
progress: function(){},
complete: function(){},
refresh:  function(){
var node, attached, container, id;
if(this.browser){
node=this.browser[0];
while(node){
if(node===document.body){
attached=true;
break;
}
node=node.parentNode;
}
if(! attached){
id='wp-uploader-browser-' + this.uploader.id;
container=$('#' + id);
if(! container.length){
container=$('<div class="wp-uploader-browser" />').css({
position: 'fixed',
top: '-1000px',
left: '-1000px',
height: 0,
width: 0
}).attr('id', 'wp-uploader-browser-' + this.uploader.id).appendTo('body');
}
container.append(this.browser);
}}
this.uploader.refresh();
}});
Uploader.queue=new wp.media.model.Attachments([], { query: false });
Uploader.errors=new Backbone.Collection();
exports.Uploader=Uploader;
})(wp, jQuery);