30
30
function uploadProgress(fileObj, bytesDone, bytesTotal) {
31
31
// Lengthen the progress bar
32
var w = jQuery('#media-items').width() - 2;
33
jQuery('#media-item-' + fileObj.id + ' .bar').width( w * bytesDone / bytesTotal );
34
jQuery('#media-item-' + fileObj.id + ' .percent').html( Math.ceil(bytesDone / bytesTotal * 100) + '%' );
32
var w = jQuery('#media-items').width() - 2, item = jQuery('#media-item-' + fileObj.id);
33
jQuery('.bar', item).width( w * bytesDone / bytesTotal );
34
jQuery('.percent', item).html( Math.ceil(bytesDone / bytesTotal * 100) + '%' );
36
36
if ( bytesDone == bytesTotal )
37
jQuery('#media-item-' + fileObj.id + ' .bar').html('<strong class="crunching">' + swfuploadL10n.crunching + '</strong>');
37
jQuery('.bar', item).html('<strong class="crunching">' + swfuploadL10n.crunching + '</strong>');
40
40
function prepareMediaItem(fileObj, serverData) {
41
var f = ( typeof shortform == 'undefined' ) ? 1 : 2, item = jQuery('#media-item-' + fileObj.id);
41
42
// Move the progress bar to 100%
42
jQuery('#media-item-' + fileObj.id + ' .bar').remove();
43
jQuery('#media-item-' + fileObj.id + ' .progress').hide();
43
jQuery('.bar', item).remove();
44
jQuery('.progress', item).hide();
45
var f = ( typeof shortform == 'undefined' ) ? 1 : 2;
46
46
// Old style: Append the HTML returned by the server -- thumbnail and form inputs
47
47
if ( isNaN(serverData) || !serverData ) {
48
jQuery('#media-item-' + fileObj.id).append(serverData);
48
item.append(serverData);
49
49
prepareMediaItemInit(fileObj);
51
51
// New style: server data is just the attachment ID, fetch the thumbnail and form html from the server
53
jQuery('#media-item-' + fileObj.id).load('async-upload.php', {attachment_id:serverData, fetch:f}, function(){prepareMediaItemInit(fileObj);updateMediaForm()});
53
item.load('async-upload.php', {attachment_id:serverData, fetch:f}, function(){prepareMediaItemInit(fileObj);updateMediaForm()});
57
57
function prepareMediaItemInit(fileObj) {
58
var item = jQuery('#media-item-' + fileObj.id);
59
59
// Clone the thumbnail as a "pinkynail" -- a tiny image to the left of the filename
60
jQuery('#media-item-' + fileObj.id + ' .thumbnail').clone().attr('className', 'pinkynail toggle').prependTo('#media-item-' + fileObj.id);
60
jQuery('.thumbnail', item).clone().attr('className', 'pinkynail toggle').prependTo(item);
62
62
// Replace the original filename with the new (unique) one assigned during upload
63
jQuery('#media-item-' + fileObj.id + ' .filename.original').replaceWith(jQuery('#media-item-' + fileObj.id + ' .filename.new'));
63
jQuery('.filename.original', item).replaceWith( jQuery('.filename.new', item) );
65
65
// Also bind toggle to the links
66
jQuery('#media-item-' + fileObj.id + ' a.toggle').click(function(){
67
jQuery(this).siblings('.slidetoggle').slideToggle(150, function(){
68
var o = jQuery(this).offset();
69
window.scrollTo(0, o.top-36);
66
jQuery('a.toggle', item).click(function(){
67
jQuery(this).siblings('.slidetoggle').slideToggle(350, function(){
68
var w = jQuery(window).height(), t = jQuery(this).offset().top, h = jQuery(this).height(), b;
73
if ( b > w && (h + 48) < w )
74
window.scrollBy(0, b - w + 13);
76
window.scrollTo(0, t - 36);
71
jQuery(this).parent().children('.toggle').toggle();
79
jQuery(this).siblings('.toggle').andSelf().toggle();
72
80
jQuery(this).siblings('a.toggle').focus();
76
84
// Bind AJAX to the new Delete button
77
jQuery('#media-item-' + fileObj.id + ' a.delete').click(function(){
85
jQuery('a.delete', item).click(function(){
78
86
// Tell the server to delete it. TODO: handle exceptions
79
jQuery.ajax({url:'admin-ajax.php',type:'post',success:deleteSuccess,error:deleteError,id:fileObj.id,data:{
80
id : this.id.replace(/[^0-9]/g,''),
81
action : 'delete-post',
82
_ajax_nonce : this.href.replace(/^.*wpnonce=/,'')}
88
url: 'admin-ajax.php',
90
success: deleteSuccess,
94
id : this.id.replace(/[^0-9]/g, ''),
95
action : 'trash-post',
96
_ajax_nonce : this.href.replace(/^.*wpnonce=/,'')
102
// Bind AJAX to the new Undo button
103
jQuery('a.undo', item).click(function(){
104
// Tell the server to untrash it. TODO: handle exceptions
106
url: 'admin-ajax.php',
110
id : this.id.replace(/[^0-9]/g,''),
111
action: 'untrash-post',
112
_ajax_nonce: this.href.replace(/^.*wpnonce=/,'')
114
success: function(data, textStatus){
115
var item = jQuery('#media-item-' + fileObj.id);
117
if ( type = jQuery('#type-of-' + fileObj.id).val() )
118
jQuery('#' + type + '-counter').text(jQuery('#' + type + '-counter').text()-0+1);
119
if ( item.hasClass('child-of-'+post_id) )
120
jQuery('#attachments-count').text(jQuery('#attachments-count').text()-0+1);
122
jQuery('.filename .trashnotice', item).remove();
123
jQuery('.filename .title', item).css('font-weight','normal');
124
jQuery('a.undo', item).addClass('hidden');
125
jQuery('a.describe-toggle-on, .menu_order_input', item).show();
126
item.css( {backgroundColor:'#ceb'} ).animate( {backgroundColor: '#fff'}, { queue: false, duration: 500, complete: function(){ jQuery(this).css({backgroundColor:''}); } }).removeClass('undo');
87
132
// Open this item if it says to start open (e.g. to display an error)
88
jQuery('#media-item-' + fileObj.id + '.startopen').removeClass('startopen').slideToggle(500).parent().children('.toggle').toggle();
133
jQuery('#media-item-' + fileObj.id + '.startopen').removeClass('startopen').slideToggle(500).siblings('.toggle').toggle();
91
136
function itemAjaxError(id, html) {
101
146
if ( data == '0' )
102
147
return itemAjaxError(this.id, 'Could not be deleted. Has it been deleted already?');
104
var item = jQuery('#media-item-' + this.id);
149
var id = this.id, item = jQuery('#media-item-' + id);
106
151
// Decrement the counters.
107
if ( type = jQuery('#type-of-' + this.id).val() )
108
jQuery('#' + type + '-counter').text(jQuery('#' + type + '-counter').text()-1);
152
if ( type = jQuery('#type-of-' + id).val() )
153
jQuery('#' + type + '-counter').text( jQuery('#' + type + '-counter').text() - 1 );
109
154
if ( item.hasClass('child-of-'+post_id) )
110
jQuery('#attachments-count').text(jQuery('#attachments-count').text()-1);
155
jQuery('#attachments-count').text( jQuery('#attachments-count').text() - 1 );
112
if ( jQuery('.type-form #media-items>*').length == 1 && jQuery('#media-items .hidden').length > 0 ) {
157
if ( jQuery('form.type-form #media-items').children().length == 1 && jQuery('.hidden', '#media-items').length > 0 ) {
113
158
jQuery('.toggle').toggle();
114
159
jQuery('.slidetoggle').slideUp(200).siblings().removeClass('hidden');
118
jQuery('#media-item-' + this.id + ' .filename:empty').remove();
119
jQuery('#media-item-' + this.id + ' .filename').append(' <span class="file-error">'+swfuploadL10n.deleted+'</span>').siblings('a.toggle').remove();
120
jQuery('#media-item-' + this.id).children('.describe').css({backgroundColor:'#fff'}).end()
121
.animate({backgroundColor:'#ffc0c0'}, {queue:false,duration:50})
122
.animate({minHeight:0,height:36}, 400, null, function(){jQuery(this).children('.describe').remove()})
123
.animate({backgroundColor:'#fff'}, 400)
124
.animate({height:0}, 800, null, function(){jQuery(this).remove();updateMediaForm();});
163
jQuery('.toggle', item).toggle();
164
jQuery('.slidetoggle', item).slideUp(200).siblings().removeClass('hidden');
165
item.css( {backgroundColor:'#faa'} ).animate( {backgroundColor:'#f4f4f4'}, {queue:false, duration:500} ).addClass('undo');
167
jQuery('.filename:empty', item).remove();
168
jQuery('.filename .title', item).css('font-weight','bold');
169
jQuery('.filename', item).append('<span class="trashnotice"> ' + swfuploadL10n.deleted + ' </span>').siblings('a.toggle').hide();
170
jQuery('.filename', item).append( jQuery('a.undo', item).removeClass('hidden') );
171
jQuery('.menu_order_input', item).hide();
281
328
// remember the last used image size, alignment and url
285
storeState = function(){
286
var align = getUserSetting('align') || '', imgsize = getUserSetting('imgsize') || '';
288
$('tr.align input[type="radio"]').click(function(){
289
setUserSetting('align', $(this).val());
290
}).filter(function(){
291
if ( $(this).val() == align )
294
}).attr('checked','checked');
296
$('tr.image-size input[type="radio"]').click(function(){
297
setUserSetting('imgsize', $(this).val());
298
}).filter(function(){
299
if ( $(this).attr('disabled') || $(this).val() != imgsize )
302
}).attr('checked','checked');
304
$('tr.url button').click(function(){
329
jQuery(document).ready(function($){
330
$('input[type="radio"]', '#media-items').live('click', function(){
331
var tr = $(this).closest('tr');
333
if ( $(tr).hasClass('align') )
334
setUserSetting('align', $(this).val());
335
else if ( $(tr).hasClass('image-size') )
336
setUserSetting('imgsize', $(this).val());
339
$('button.button', '#media-items').live('click', function(){
305
340
var c = this.className || '';
306
c = c.replace(/.*?(url[^ '"]+).*/, '$1');
307
if (c) setUserSetting('urlbutton', c);
308
$(this).siblings('.urlfield').val( $(this).attr('title') );
311
$('tr.url .urlfield').each(function(){
312
var b = getUserSetting('urlbutton');
313
$(this).val( $(this).siblings('button.'+b).attr('title') );
341
c = c.match(/url([^ '"]+)/);
343
setUserSetting('urlbutton', c[1]);
344
$(this).siblings('.urlfield').val( $(this).attr('title') );