Changeset 41554
- Timestamp:
- 09/21/2017 04:34:31 PM (7 years ago)
- Location:
- trunk/src
- Files:
-
- 2 deleted
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-admin/async-upload.php
r39756 r41554 1 1 <?php 2 2 /** 3 * Server-side file upload handler from wp-plupload , swfuploador other asynchronous upload methods.3 * Server-side file upload handler from wp-plupload or other asynchronous upload methods. 4 4 * 5 5 * @package WordPress … … 15 15 } 16 16 17 if ( defined( 'ABSPATH') )18 require_once( ABSPATH . 'wp-load.php');19 else 17 if ( defined( 'ABSPATH' ) ) { 18 require_once( ABSPATH . 'wp-load.php' ); 19 } else { 20 20 require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' ); 21 22 if ( ! ( isset( $_REQUEST['action'] ) && 'upload-attachment' == $_REQUEST['action'] ) ) {23 // Flash often fails to send cookies with the POST or upload, so we need to pass it in GET or POST instead24 if ( is_ssl() && empty($_COOKIE[SECURE_AUTH_COOKIE]) && !empty($_REQUEST['auth_cookie']) )25 $_COOKIE[SECURE_AUTH_COOKIE] = $_REQUEST['auth_cookie'];26 elseif ( empty($_COOKIE[AUTH_COOKIE]) && !empty($_REQUEST['auth_cookie']) )27 $_COOKIE[AUTH_COOKIE] = $_REQUEST['auth_cookie'];28 if ( empty($_COOKIE[LOGGED_IN_COOKIE]) && !empty($_REQUEST['logged_in_cookie']) )29 $_COOKIE[LOGGED_IN_COOKIE] = $_REQUEST['logged_in_cookie'];30 unset($current_user);31 21 } 32 22 -
trunk/src/wp-admin/includes/update-core.php
r41332 r41554 717 717 'wp-includes/js/plupload/plupload.flash.swf', 718 718 'wp-includes/js/plupload/plupload.silverlight.xap', 719 'wp-includes/js/swfupload/plugins', 720 'wp-includes/js/swfupload/swfupload.swf', 719 721 ); 720 722 -
trunk/src/wp-includes/js/swfupload/handlers.js
r40431 r41554 1 1 var topWin = window.dialogArguments || opener || parent || top; 2 2 3 function fileDialogStart() { 4 jQuery("#media-upload-error").empty(); 5 } 3 function fileDialogStart() {} 4 function fileQueued() {} 5 function uploadStart() {} 6 function uploadProgress() {} 7 function prepareMediaItem() {} 8 function prepareMediaItemInit() {} 9 function itemAjaxError() {} 10 function deleteSuccess() {} 11 function deleteError() {} 12 function updateMediaForm() {} 13 function uploadSuccess() {} 14 function uploadComplete() {} 15 function wpQueueError() {} 16 function wpFileError() {} 17 function fileQueueError() {} 18 function fileDialogComplete() {} 19 function uploadError() {} 20 function cancelUpload() {} 6 21 7 // progress and success handlers for media multi uploads 8 function fileQueued(fileObj) { 9 // Get rid of unused form 10 jQuery('.media-blank').remove(); 11 // Collapse a single item 12 if ( jQuery('form.type-form #media-items').children().length == 1 && jQuery('.hidden', '#media-items').length > 0 ) { 13 jQuery('.describe-toggle-on').show(); 14 jQuery('.describe-toggle-off').hide(); 15 jQuery('.slidetoggle').slideUp(200).siblings().removeClass('hidden'); 16 } 17 // Create a progress bar containing the filename 18 jQuery('<div class="media-item">') 19 .attr( 'id', 'media-item-' + fileObj.id ) 20 .addClass('child-of-' + post_id) 21 .append('<div class="progress"><div class="bar"></div></div>', 22 jQuery('<div class="filename original"><span class="percent"></span>').text( ' ' + fileObj.name )) 23 .appendTo( jQuery('#media-items' ) ); 24 // Display the progress div 25 jQuery('.progress', '#media-item-' + fileObj.id).show(); 26 27 // Disable submit and enable cancel 28 jQuery('#insert-gallery').prop('disabled', true); 29 jQuery('#cancel-upload').prop('disabled', false); 30 } 31 32 function uploadStart(fileObj) { 33 try { 34 if ( typeof topWin.tb_remove != 'undefined' ) 35 topWin.jQuery('#TB_overlay').unbind('click', topWin.tb_remove); 36 } catch(e){} 37 38 return true; 39 } 40 41 function uploadProgress(fileObj, bytesDone, bytesTotal) { 42 // Lengthen the progress bar 43 var w = jQuery('#media-items').width() - 2, item = jQuery('#media-item-' + fileObj.id); 44 jQuery('.bar', item).width( w * bytesDone / bytesTotal ); 45 jQuery('.percent', item).html( Math.ceil(bytesDone / bytesTotal * 100) + '%' ); 46 47 if ( bytesDone == bytesTotal ) 48 jQuery('.bar', item).html('<strong class="crunching">' + swfuploadL10n.crunching + '</strong>'); 49 } 50 51 function prepareMediaItem(fileObj, serverData) { 52 var f = ( typeof shortform == 'undefined' ) ? 1 : 2, item = jQuery('#media-item-' + fileObj.id); 53 // Move the progress bar to 100% 54 jQuery('.bar', item).remove(); 55 jQuery('.progress', item).hide(); 56 57 try { 58 if ( typeof topWin.tb_remove != 'undefined' ) 59 topWin.jQuery('#TB_overlay').click(topWin.tb_remove); 60 } catch(e){} 61 62 // Old style: Append the HTML returned by the server -- thumbnail and form inputs 63 if ( isNaN(serverData) || !serverData ) { 64 item.append(serverData); 65 prepareMediaItemInit(fileObj); 66 } 67 // New style: server data is just the attachment ID, fetch the thumbnail and form html from the server 68 else { 69 item.load('async-upload.php', {attachment_id:serverData, fetch:f}, function(){prepareMediaItemInit(fileObj);updateMediaForm()}); 70 } 71 } 72 73 function prepareMediaItemInit(fileObj) { 74 var item = jQuery('#media-item-' + fileObj.id); 75 // Clone the thumbnail as a "pinkynail" -- a tiny image to the left of the filename 76 jQuery('.thumbnail', item).clone().attr('class', 'pinkynail toggle').prependTo(item); 77 78 // Replace the original filename with the new (unique) one assigned during upload 79 jQuery('.filename.original', item).replaceWith( jQuery('.filename.new', item) ); 80 81 // Also bind toggle to the links 82 jQuery('a.toggle', item).click(function(){ 83 jQuery(this).siblings('.slidetoggle').slideToggle(350, function(){ 84 var w = jQuery(window).height(), t = jQuery(this).offset().top, h = jQuery(this).height(), b; 85 86 if ( w && t && h ) { 87 b = t + h; 88 89 if ( b > w && (h + 48) < w ) 90 window.scrollBy(0, b - w + 13); 91 else if ( b > w ) 92 window.scrollTo(0, t - 36); 93 } 94 }); 95 jQuery(this).siblings('.toggle').andSelf().toggle(); 96 jQuery(this).siblings('a.toggle').focus(); 97 return false; 98 }); 99 100 // Bind AJAX to the new Delete button 101 jQuery('a.delete', item).click(function(){ 102 // Tell the server to delete it. TODO: handle exceptions 103 jQuery.ajax({ 104 url: ajaxurl, 105 type: 'post', 106 success: deleteSuccess, 107 error: deleteError, 108 id: fileObj.id, 109 data: { 110 id : this.id.replace(/[^0-9]/g, ''), 111 action : 'trash-post', 112 _ajax_nonce : this.href.replace(/^.*wpnonce=/,'') 113 } 114 }); 115 return false; 116 }); 117 118 // Bind AJAX to the new Undo button 119 jQuery('a.undo', item).click(function(){ 120 // Tell the server to untrash it. TODO: handle exceptions 121 jQuery.ajax({ 122 url: ajaxurl, 123 type: 'post', 124 id: fileObj.id, 125 data: { 126 id : this.id.replace(/[^0-9]/g,''), 127 action: 'untrash-post', 128 _ajax_nonce: this.href.replace(/^.*wpnonce=/,'') 129 }, 130 success: function(data, textStatus){ 131 var item = jQuery('#media-item-' + fileObj.id); 132 133 if ( type = jQuery('#type-of-' + fileObj.id).val() ) 134 jQuery('#' + type + '-counter').text(jQuery('#' + type + '-counter').text()-0+1); 135 if ( item.hasClass('child-of-'+post_id) ) 136 jQuery('#attachments-count').text(jQuery('#attachments-count').text()-0+1); 137 138 jQuery('.filename .trashnotice', item).remove(); 139 jQuery('.filename .title', item).css('font-weight','normal'); 140 jQuery('a.undo', item).addClass('hidden'); 141 jQuery('a.describe-toggle-on, .menu_order_input', item).show(); 142 item.css( {backgroundColor:'#ceb'} ).animate( {backgroundColor: '#fff'}, { queue: false, duration: 500, complete: function(){ jQuery(this).css({backgroundColor:''}); } }).removeClass('undo'); 143 } 144 }); 145 return false; 146 }); 147 148 // Open this item if it says to start open (e.g. to display an error) 149 jQuery('#media-item-' + fileObj.id + '.startopen').removeClass('startopen').slideToggle(500).siblings('.toggle').toggle(); 150 } 151 152 function itemAjaxError(id, html) { 153 var item = jQuery('#media-item-' + id); 154 var filename = jQuery('.filename', item).text(); 155 156 item.html('<div class="error-div">' 157 + '<a class="dismiss" href="#">' + swfuploadL10n.dismiss + '</a>' 158 + '<strong>' + swfuploadL10n.error_uploading.replace('%s', filename) + '</strong><br />' 159 + html 160 + '</div>'); 161 item.find('a.dismiss').click(function(){jQuery(this).parents('.media-item').slideUp(200, function(){jQuery(this).remove();})}); 162 } 163 164 function deleteSuccess(data, textStatus) { 165 if ( data == '-1' ) 166 return itemAjaxError(this.id, 'You do not have permission. Has your session expired?'); 167 if ( data == '0' ) 168 return itemAjaxError(this.id, 'Could not be deleted. Has it been deleted already?'); 169 170 var id = this.id, item = jQuery('#media-item-' + id); 171 172 // Decrement the counters. 173 if ( type = jQuery('#type-of-' + id).val() ) 174 jQuery('#' + type + '-counter').text( jQuery('#' + type + '-counter').text() - 1 ); 175 if ( item.hasClass('child-of-'+post_id) ) 176 jQuery('#attachments-count').text( jQuery('#attachments-count').text() - 1 ); 177 178 if ( jQuery('form.type-form #media-items').children().length == 1 && jQuery('.hidden', '#media-items').length > 0 ) { 179 jQuery('.toggle').toggle(); 180 jQuery('.slidetoggle').slideUp(200).siblings().removeClass('hidden'); 181 } 182 183 // Vanish it. 184 jQuery('.toggle', item).toggle(); 185 jQuery('.slidetoggle', item).slideUp(200).siblings().removeClass('hidden'); 186 item.css( {backgroundColor:'#faa'} ).animate( {backgroundColor:'#f4f4f4'}, {queue:false, duration:500} ).addClass('undo'); 187 188 jQuery('.filename:empty', item).remove(); 189 jQuery('.filename .title', item).css('font-weight','bold'); 190 jQuery('.filename', item).append('<span class="trashnotice"> ' + swfuploadL10n.deleted + ' </span>').siblings('a.toggle').hide(); 191 jQuery('.filename', item).append( jQuery('a.undo', item).removeClass('hidden') ); 192 jQuery('.menu_order_input', item).hide(); 193 194 return; 195 } 196 197 function deleteError(X, textStatus, errorThrown) { 198 // TODO 199 } 200 201 function updateMediaForm() { 202 var one = jQuery('form.type-form #media-items').children(), items = jQuery('#media-items').children(); 203 204 // Just one file, no need for collapsible part 205 if ( one.length == 1 ) { 206 jQuery('.slidetoggle', one).slideDown(500).siblings().addClass('hidden').filter('.toggle').toggle(); 207 } 208 209 // Only show Save buttons when there is at least one file. 210 if ( items.not('.media-blank').length > 0 ) 211 jQuery('.savebutton').show(); 212 else 213 jQuery('.savebutton').hide(); 214 215 // Only show Gallery buttons when there are at least two files. 216 if ( items.length > 1 ) { 217 jQuery('.insert-gallery').show(); 218 } else { 219 jQuery('.insert-gallery').hide(); 220 } 221 } 222 223 function uploadSuccess(fileObj, serverData) { 224 // if async-upload returned an error message, place it in the media item div and return 225 if ( serverData.match('media-upload-error') ) { 226 jQuery('#media-item-' + fileObj.id).html(serverData); 227 return; 228 } 229 230 prepareMediaItem(fileObj, serverData); 231 updateMediaForm(); 232 233 // Increment the counter. 234 if ( jQuery('#media-item-' + fileObj.id).hasClass('child-of-' + post_id) ) 235 jQuery('#attachments-count').text(1 * jQuery('#attachments-count').text() + 1); 236 } 237 238 function uploadComplete(fileObj) { 239 // If no more uploads queued, enable the submit button 240 if ( swfu.getStats().files_queued == 0 ) { 241 jQuery('#cancel-upload').prop('disabled', true); 242 jQuery('#insert-gallery').prop('disabled', false); 243 } 244 } 245 246 247 // wp-specific error handlers 248 249 // generic message 250 function wpQueueError(message) { 251 jQuery('#media-upload-error').show().text(message); 252 } 253 254 // file-specific message 255 function wpFileError(fileObj, message) { 256 var item = jQuery('#media-item-' + fileObj.id); 257 var filename = jQuery('.filename', item).text(); 258 259 item.html('<div class="error-div">' 260 + '<a class="dismiss" href="#">' + swfuploadL10n.dismiss + '</a>' 261 + '<strong>' + swfuploadL10n.error_uploading.replace('%s', filename) + '</strong><br />' 262 + message 263 + '</div>'); 264 item.find('a.dismiss').click(function(){jQuery(this).parents('.media-item').slideUp(200, function(){jQuery(this).remove();})}); 265 } 266 267 function fileQueueError(fileObj, error_code, message) { 268 // Handle this error separately because we don't want to create a FileProgress element for it. 269 if ( error_code == SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED ) { 270 wpQueueError(swfuploadL10n.queue_limit_exceeded); 271 } 272 else if ( error_code == SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT ) { 273 fileQueued(fileObj); 274 wpFileError(fileObj, swfuploadL10n.file_exceeds_size_limit); 275 } 276 else if ( error_code == SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE ) { 277 fileQueued(fileObj); 278 wpFileError(fileObj, swfuploadL10n.zero_byte_file); 279 } 280 else if ( error_code == SWFUpload.QUEUE_ERROR.INVALID_FILETYPE ) { 281 fileQueued(fileObj); 282 wpFileError(fileObj, swfuploadL10n.invalid_filetype); 283 } 284 else { 285 wpQueueError(swfuploadL10n.default_error); 286 } 287 } 288 289 function fileDialogComplete(num_files_queued) { 290 try { 291 if (num_files_queued > 0) { 292 this.startUpload(); 293 } 294 } catch (ex) { 295 this.debug(ex); 296 } 297 } 298 299 function switchUploader(s) { 300 var f = document.getElementById(swfu.customSettings.swfupload_element_id), h = document.getElementById(swfu.customSettings.degraded_element_id); 301 if ( s ) { 302 f.style.display = 'block'; 303 h.style.display = 'none'; 304 } else { 305 f.style.display = 'none'; 306 h.style.display = 'block'; 307 } 22 function switchUploader() { 23 jQuery( '#' + swfu.customSettings.swfupload_element_id ).hide(); 24 jQuery( '#' + swfu.customSettings.degraded_element_id ).show(); 25 jQuery( '.upload-html-bypass' ).hide(); 308 26 } 309 27 310 28 function swfuploadPreLoad() { 311 if ( !uploaderMode ) { 312 switchUploader(1); 313 } else { 314 switchUploader(0); 315 } 29 switchUploader(); 316 30 } 317 31 318 32 function swfuploadLoadFailed() { 319 switchUploader(0); 320 jQuery('.upload-html-bypass').hide(); 33 switchUploader(); 321 34 } 322 35 323 function uploadError(fileObj, errorCode, message) {324 325 switch (errorCode) {326 case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:327 wpFileError(fileObj, swfuploadL10n.missing_upload_url);328 break;329 case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:330 wpFileError(fileObj, swfuploadL10n.upload_limit_exceeded);331 break;332 case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:333 wpQueueError(swfuploadL10n.http_error);334 break;335 case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:336 wpQueueError(swfuploadL10n.upload_failed);337 break;338 case SWFUpload.UPLOAD_ERROR.IO_ERROR:339 wpQueueError(swfuploadL10n.io_error);340 break;341 case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:342 wpQueueError(swfuploadL10n.security_error);343 break;344 case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:345 case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:346 jQuery('#media-item-' + fileObj.id).remove();347 break;348 default:349 wpFileError(fileObj, swfuploadL10n.default_error);350 }351 }352 353 function cancelUpload() {354 swfu.cancelQueue();355 }356 357 // remember the last used image size, alignment and url358 36 jQuery(document).ready(function($){ 359 37 $( 'input[type="radio"]', '#media-items' ).on( 'click', function(){ -
trunk/src/wp-includes/js/swfupload/handlers.min.js
r24485 r41554 1 var topWin=window.dialogArguments||opener||parent||top;function fileDialogStart(){jQuery("#media-upload-error").empty()}function fileQueued(a){jQuery(".media-blank").remove();if(jQuery("form.type-form #media-items").children().length==1&&jQuery(".hidden","#media-items").length>0){jQuery(".describe-toggle-on").show();jQuery(".describe-toggle-off").hide();jQuery(".slidetoggle").slideUp(200).siblings().removeClass("hidden")}jQuery('<div class="media-item">').attr("id","media-item-"+a.id).addClass("child-of-"+post_id).append('<div class="progress"><div class="bar"></div></div>',jQuery('<div class="filename original"><span class="percent"></span>').text(" "+a.name)).appendTo(jQuery("#media-items"));jQuery(".progress","#media-item-"+a.id).show();jQuery("#insert-gallery").prop("disabled",true);jQuery("#cancel-upload").prop("disabled",false)}function uploadStart(a){try{if(typeof topWin.tb_remove!="undefined"){topWin.jQuery("#TB_overlay").unbind("click",topWin.tb_remove)}}catch(b){}return true}function uploadProgress(e,b,d){var a=jQuery("#media-items").width()-2,c=jQuery("#media-item-"+e.id);jQuery(".bar",c).width(a*b/d);jQuery(".percent",c).html(Math.ceil(b/d*100)+"%");if(b==d){jQuery(".bar",c).html('<strong class="crunching">'+swfuploadL10n.crunching+"</strong>")}}function prepareMediaItem(c,a){var d=(typeof shortform=="undefined")?1:2,b=jQuery("#media-item-"+c.id);jQuery(".bar",b).remove();jQuery(".progress",b).hide();try{if(typeof topWin.tb_remove!="undefined"){topWin.jQuery("#TB_overlay").click(topWin.tb_remove)}}catch(g){}if(isNaN(a)||!a){b.append(a);prepareMediaItemInit(c)}else{b.load("async-upload.php",{attachment_id:a,fetch:d},function(){prepareMediaItemInit(c);updateMediaForm()})}}function prepareMediaItemInit(b){var a=jQuery("#media-item-"+b.id);jQuery(".thumbnail",a).clone().attr("class","pinkynail toggle").prependTo(a);jQuery(".filename.original",a).replaceWith(jQuery(".filename.new",a));jQuery("a.toggle",a).click(function(){jQuery(this).siblings(".slidetoggle").slideToggle(350,function(){var d=jQuery(window).height(),e=jQuery(this).offset().top,f=jQuery(this).height(),c;if(d&&e&&f){c=e+f;if(c>d&&(f+48)<d){window.scrollBy(0,c-d+13)}else{if(c>d){window.scrollTo(0,e-36)}}}});jQuery(this).siblings(".toggle").andSelf().toggle();jQuery(this).siblings("a.toggle").focus();return false});jQuery("a.delete",a).click(function(){jQuery.ajax({url:ajaxurl,type:"post",success:deleteSuccess,error:deleteError,id:b.id,data:{id:this.id.replace(/[^0-9]/g,""),action:"trash-post",_ajax_nonce:this.href.replace(/^.*wpnonce=/,"")}});return false});jQuery("a.undo",a).click(function(){jQuery.ajax({url:ajaxurl,type:"post",id:b.id,data:{id:this.id.replace(/[^0-9]/g,""),action:"untrash-post",_ajax_nonce:this.href.replace(/^.*wpnonce=/,"")},success:function(d,e){var c=jQuery("#media-item-"+b.id);if(type=jQuery("#type-of-"+b.id).val()){jQuery("#"+type+"-counter").text(jQuery("#"+type+"-counter").text()-0+1)}if(c.hasClass("child-of-"+post_id)){jQuery("#attachments-count").text(jQuery("#attachments-count").text()-0+1)}jQuery(".filename .trashnotice",c).remove();jQuery(".filename .title",c).css("font-weight","normal");jQuery("a.undo",c).addClass("hidden");jQuery("a.describe-toggle-on, .menu_order_input",c).show();c.css({backgroundColor:"#ceb"}).animate({backgroundColor:"#fff"},{queue:false,duration:500,complete:function(){jQuery(this).css({backgroundColor:""})}}).removeClass("undo")}});return false});jQuery("#media-item-"+b.id+".startopen").removeClass("startopen").slideToggle(500).siblings(".toggle").toggle()}function itemAjaxError(d,b){var c=jQuery("#media-item-"+d);var a=jQuery(".filename",c).text();c.html('<div class="error-div"><a class="dismiss" href="#">'+swfuploadL10n.dismiss+"</a><strong>"+swfuploadL10n.error_uploading.replace("%s",a)+"</strong><br />"+b+"</div>");c.find("a.dismiss").click(function(){jQuery(this).parents(".media-item").slideUp(200,function(){jQuery(this).remove()})})}function deleteSuccess(b,d){if(b=="-1"){return itemAjaxError(this.id,"You do not have permission. Has your session expired?")}if(b=="0"){return itemAjaxError(this.id,"Could not be deleted. Has it been deleted already?")}var c=this.id,a=jQuery("#media-item-"+c);if(type=jQuery("#type-of-"+c).val()){jQuery("#"+type+"-counter").text(jQuery("#"+type+"-counter").text()-1)}if(a.hasClass("child-of-"+post_id)){jQuery("#attachments-count").text(jQuery("#attachments-count").text()-1)}if(jQuery("form.type-form #media-items").children().length==1&&jQuery(".hidden","#media-items").length>0){jQuery(".toggle").toggle();jQuery(".slidetoggle").slideUp(200).siblings().removeClass("hidden")}jQuery(".toggle",a).toggle();jQuery(".slidetoggle",a).slideUp(200).siblings().removeClass("hidden");a.css({backgroundColor:"#faa"}).animate({backgroundColor:"#f4f4f4"},{queue:false,duration:500}).addClass("undo");jQuery(".filename:empty",a).remove();jQuery(".filename .title",a).css("font-weight","bold");jQuery(".filename",a).append('<span class="trashnotice"> '+swfuploadL10n.deleted+" </span>").siblings("a.toggle").hide();jQuery(".filename",a).append(jQuery("a.undo",a).removeClass("hidden"));jQuery(".menu_order_input",a).hide();return}function deleteError(c,b,a){}function updateMediaForm(){var b=jQuery("form.type-form #media-items").children(),a=jQuery("#media-items").children();if(b.length==1){jQuery(".slidetoggle",b).slideDown(500).siblings().addClass("hidden").filter(".toggle").toggle()}if(a.not(".media-blank").length>0){jQuery(".savebutton").show()}else{jQuery(".savebutton").hide()}if(a.length>1){jQuery(".insert-gallery").show()}else{jQuery(".insert-gallery").hide()}}function uploadSuccess(b,a){if(a.match("media-upload-error")){jQuery("#media-item-"+b.id).html(a);return}prepareMediaItem(b,a);updateMediaForm();if(jQuery("#media-item-"+b.id).hasClass("child-of-"+post_id)){jQuery("#attachments-count").text(1*jQuery("#attachments-count").text()+1)}}function uploadComplete(a){if(swfu.getStats().files_queued==0){jQuery("#cancel-upload").prop("disabled",true);jQuery("#insert-gallery").prop("disabled",false)}}function wpQueueError(a){jQuery("#media-upload-error").show().text(a)}function wpFileError(d,c){var b=jQuery("#media-item-"+d.id);var a=jQuery(".filename",b).text();b.html('<div class="error-div"><a class="dismiss" href="#">'+swfuploadL10n.dismiss+"</a><strong>"+swfuploadL10n.error_uploading.replace("%s",a)+"</strong><br />"+c+"</div>");b.find("a.dismiss").click(function(){jQuery(this).parents(".media-item").slideUp(200,function(){jQuery(this).remove()})})}function fileQueueError(c,a,b){if(a==SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED){wpQueueError(swfuploadL10n.queue_limit_exceeded)}else{if(a==SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT){fileQueued(c);wpFileError(c,swfuploadL10n.file_exceeds_size_limit)}else{if(a==SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE){fileQueued(c);wpFileError(c,swfuploadL10n.zero_byte_file)}else{if(a==SWFUpload.QUEUE_ERROR.INVALID_FILETYPE){fileQueued(c);wpFileError(c,swfuploadL10n.invalid_filetype)}else{wpQueueError(swfuploadL10n.default_error)}}}}}function fileDialogComplete(b){try{if(b>0){this.startUpload()}}catch(a){this.debug(a)}}function switchUploader(b){var c=document.getElementById(swfu.customSettings.swfupload_element_id),a=document.getElementById(swfu.customSettings.degraded_element_id);if(b){c.style.display="block";a.style.display="none"}else{c.style.display="none";a.style.display="block"}}function swfuploadPreLoad(){if(!uploaderMode){switchUploader(1)}else{switchUploader(0)}}function swfuploadLoadFailed(){switchUploader(0);jQuery(".upload-html-bypass").hide()}function uploadError(b,c,a){switch(c){case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:wpFileError(b,swfuploadL10n.missing_upload_url);break;case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:wpFileError(b,swfuploadL10n.upload_limit_exceeded);break;case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:wpQueueError(swfuploadL10n.http_error);break;case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:wpQueueError(swfuploadL10n.upload_failed);break;case SWFUpload.UPLOAD_ERROR.IO_ERROR:wpQueueError(swfuploadL10n.io_error);break;case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:wpQueueError(swfuploadL10n.security_error);break;case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:jQuery("#media-item-"+b.id).remove();break;default:wpFileError(b,swfuploadL10n.default_error)}}function cancelUpload(){swfu.cancelQueue()}jQuery(document).ready(function(a){a('input[type="radio"]',"#media-items").live("click",function(){var b=a(this).closest("tr");if(a(b).hasClass("align")){setUserSetting("align",a(this).val())}else{if(a(b).hasClass("image-size")){setUserSetting("imgsize",a(this).val())}}});a("button.button","#media-items").live("click",function(){var b=this.className||"";b=b.match(/url([^ '"]+)/);if(b&&b[1]){setUserSetting("urlbutton",b[1]);a(this).siblings(".urlfield").val(a(this).attr("title"))}})});1 function fileDialogStart(){}function fileQueued(){}function uploadStart(){}function uploadProgress(){}function prepareMediaItem(){}function prepareMediaItemInit(){}function itemAjaxError(){}function deleteSuccess(){}function deleteError(){}function updateMediaForm(){}function uploadSuccess(){}function uploadComplete(){}function wpQueueError(){}function wpFileError(){}function fileQueueError(){}function fileDialogComplete(){}function uploadError(){}function cancelUpload(){}function switchUploader(){jQuery("#"+swfu.customSettings.swfupload_element_id).hide(),jQuery("#"+swfu.customSettings.degraded_element_id).show(),jQuery(".upload-html-bypass").hide()}function swfuploadPreLoad(){switchUploader()}function swfuploadLoadFailed(){switchUploader()}var topWin=window.dialogArguments||opener||parent||top;jQuery(document).ready(function(a){a('input[type="radio"]',"#media-items").on("click",function(){var b=a(this).closest("tr");a(b).hasClass("align")?setUserSetting("align",a(this).val()):a(b).hasClass("image-size")&&setUserSetting("imgsize",a(this).val())}),a("button.button","#media-items").on("click",function(){var b=this.className||"";b=b.match(/url([^ '"]+)/),b&&b[1]&&(setUserSetting("urlbutton",b[1]),a(this).siblings(".urlfield").val(a(this).attr("title")))})}); -
trunk/src/wp-includes/js/swfupload/swfupload.js
r38517 r41554 1 1 /** 2 * SWFUpload : http://www.swfupload.org, http://swfupload.googlecode.com2 * SWFUpload fallback 3 3 * 4 * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/, http://www.vinterwebb.se/ 5 * 6 * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License: 7 * http://www.opensource.org/licenses/mit-license.php 8 * 9 * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License: 10 * http://www.opensource.org/licenses/mit-license.php 11 * 4 * @since 4.9.0 12 5 */ 13 6 14 15 /* ******************* */16 /* Constructor & Init */17 /* ******************* */18 7 var SWFUpload; 19 8 20 if (SWFUpload == undefined) { 21 SWFUpload = function (settings) { 22 this.initSWFUpload(settings); 23 }; 24 } 9 ( function () { 10 function noop() {} 25 11 26 SWFUpload.prototype.initSWFUpload = function (settings) { 27 try { 28 this.customSettings = {}; // A container where developers can place their own settings associated with this instance. 29 this.settings = settings; 30 this.eventQueue = []; 31 this.movieName = "SWFUpload_" + SWFUpload.movieCount++; 32 this.movieElement = null; 33 34 35 // Setup global control tracking 36 SWFUpload.instances[this.movieName] = this; 37 38 // Load the settings. Load the Flash movie. 39 this.initSettings(); 40 this.loadFlash(); 41 this.displayDebugInfo(); 42 } catch (ex) { 43 delete SWFUpload.instances[this.movieName]; 44 throw ex; 45 } 46 }; 47 48 /* *************** */ 49 /* Static Members */ 50 /* *************** */ 51 SWFUpload.instances = {}; 52 SWFUpload.movieCount = 0; 53 SWFUpload.version = "2.2.0 2009-03-25"; 54 SWFUpload.QUEUE_ERROR = { 55 QUEUE_LIMIT_EXCEEDED : -100, 56 FILE_EXCEEDS_SIZE_LIMIT : -110, 57 ZERO_BYTE_FILE : -120, 58 INVALID_FILETYPE : -130 59 }; 60 SWFUpload.UPLOAD_ERROR = { 61 HTTP_ERROR : -200, 62 MISSING_UPLOAD_URL : -210, 63 IO_ERROR : -220, 64 SECURITY_ERROR : -230, 65 UPLOAD_LIMIT_EXCEEDED : -240, 66 UPLOAD_FAILED : -250, 67 SPECIFIED_FILE_ID_NOT_FOUND : -260, 68 FILE_VALIDATION_FAILED : -270, 69 FILE_CANCELLED : -280, 70 UPLOAD_STOPPED : -290 71 }; 72 SWFUpload.FILE_STATUS = { 73 QUEUED : -1, 74 IN_PROGRESS : -2, 75 ERROR : -3, 76 COMPLETE : -4, 77 CANCELLED : -5 78 }; 79 SWFUpload.BUTTON_ACTION = { 80 SELECT_FILE : -100, 81 SELECT_FILES : -110, 82 START_UPLOAD : -120 83 }; 84 SWFUpload.CURSOR = { 85 ARROW : -1, 86 HAND : -2 87 }; 88 SWFUpload.WINDOW_MODE = { 89 WINDOW : "window", 90 TRANSPARENT : "transparent", 91 OPAQUE : "opaque" 92 }; 93 94 // Private: takes a URL, determines if it is relative and converts to an absolute URL 95 // using the current site. Only processes the URL if it can, otherwise returns the URL untouched 96 SWFUpload.completeURL = function(url) { 97 if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//)) { 98 return url; 99 } 100 101 var currentURL = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : ""); 102 103 var indexSlash = window.location.pathname.lastIndexOf("/"); 104 if (indexSlash <= 0) { 105 path = "/"; 106 } else { 107 path = window.location.pathname.substr(0, indexSlash) + "/"; 108 } 109 110 return /*currentURL +*/ path + url; 111 112 }; 113 114 115 /* ******************** */ 116 /* Instance Members */ 117 /* ******************** */ 118 119 // Private: initSettings ensures that all the 120 // settings are set, getting a default value if one was not assigned. 121 SWFUpload.prototype.initSettings = function () { 122 this.ensureDefault = function (settingName, defaultValue) { 123 this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName]; 124 }; 125 126 // Upload backend settings 127 this.ensureDefault("upload_url", ""); 128 this.ensureDefault("preserve_relative_urls", false); 129 this.ensureDefault("file_post_name", "Filedata"); 130 this.ensureDefault("post_params", {}); 131 this.ensureDefault("use_query_string", false); 132 this.ensureDefault("requeue_on_error", false); 133 this.ensureDefault("http_success", []); 134 this.ensureDefault("assume_success_timeout", 0); 135 136 // File Settings 137 this.ensureDefault("file_types", "*.*"); 138 this.ensureDefault("file_types_description", "All Files"); 139 this.ensureDefault("file_size_limit", 0); // Default zero means "unlimited" 140 this.ensureDefault("file_upload_limit", 0); 141 this.ensureDefault("file_queue_limit", 0); 142 143 // Flash Settings 144 this.ensureDefault("flash_url", "swfupload.swf"); 145 this.ensureDefault("prevent_swf_caching", true); 146 147 // Button Settings 148 this.ensureDefault("button_image_url", ""); 149 this.ensureDefault("button_width", 1); 150 this.ensureDefault("button_height", 1); 151 this.ensureDefault("button_text", ""); 152 this.ensureDefault("button_text_style", "color: #000000; font-size: 16pt;"); 153 this.ensureDefault("button_text_top_padding", 0); 154 this.ensureDefault("button_text_left_padding", 0); 155 this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES); 156 this.ensureDefault("button_disabled", false); 157 this.ensureDefault("button_placeholder_id", ""); 158 this.ensureDefault("button_placeholder", null); 159 this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW); 160 this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW); 161 162 // Debug Settings 163 this.ensureDefault("debug", false); 164 this.settings.debug_enabled = this.settings.debug; // Here to maintain v2 API 165 166 // Event Handlers 167 this.settings.return_upload_start_handler = this.returnUploadStart; 168 this.ensureDefault("swfupload_loaded_handler", null); 169 this.ensureDefault("file_dialog_start_handler", null); 170 this.ensureDefault("file_queued_handler", null); 171 this.ensureDefault("file_queue_error_handler", null); 172 this.ensureDefault("file_dialog_complete_handler", null); 173 174 this.ensureDefault("upload_start_handler", null); 175 this.ensureDefault("upload_progress_handler", null); 176 this.ensureDefault("upload_error_handler", null); 177 this.ensureDefault("upload_success_handler", null); 178 this.ensureDefault("upload_complete_handler", null); 179 180 this.ensureDefault("debug_handler", this.debugMessage); 181 182 this.ensureDefault("custom_settings", {}); 183 184 // Other settings 185 this.customSettings = this.settings.custom_settings; 186 187 // Update the flash url if needed 188 if (!!this.settings.prevent_swf_caching) { 189 this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime(); 190 } 191 192 if (!this.settings.preserve_relative_urls) { 193 //this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url); // Don't need to do this one since flash doesn't look at it 194 this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url); 195 this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url); 196 } 197 198 delete this.ensureDefault; 199 }; 200 201 // Private: loadFlash replaces the button_placeholder element with the flash movie. 202 SWFUpload.prototype.loadFlash = function () { 203 var targetElement, tempParent; 204 205 // Make sure an element with the ID we are going to use doesn't already exist 206 if (document.getElementById(this.movieName) !== null) { 207 throw "ID " + this.movieName + " is already in use. The Flash Object could not be added"; 12 if (SWFUpload == undefined) { 13 SWFUpload = function (settings) { 14 this.initSWFUpload(settings); 15 }; 208 16 } 209 17 210 // Get the element where we will be placing the flash movie 211 targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder; 18 SWFUpload.prototype.initSWFUpload = function ( settings ) { 19 function fallback() { 20 var $ = window.jQuery; 21 var $placeholder = settings.button_placeholder_id ? $( '#' + settings.button_placeholder_id ) : $( settings.button_placeholder ); 212 22 213 if (targetElement == undefined) { 214 throw "Could not find the placeholder element: " + this.settings.button_placeholder_id; 215 } 216 217 // Append the container and load the flash 218 tempParent = document.createElement("div"); 219 tempParent.innerHTML = this.getFlashHTML(); // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers) 220 targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement); 221 222 // Fix IE Flash/Form bug 223 if (window[this.movieName] == undefined) { 224 window[this.movieName] = this.getMovieElement(); 225 } 226 227 }; 228 229 // Private: getFlashHTML generates the object tag needed to embed the flash in to the document 230 SWFUpload.prototype.getFlashHTML = function () { 231 // Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay 232 return ['<object id="', this.movieName, '" type="application/x-shockwave-flash" data="', this.settings.flash_url, '" width="', this.settings.button_width, '" height="', this.settings.button_height, '" class="swfupload">', 233 '<param name="wmode" value="', this.settings.button_window_mode, '" />', 234 '<param name="movie" value="', this.settings.flash_url, '" />', 235 '<param name="quality" value="high" />', 236 '<param name="menu" value="false" />', 237 '<param name="allowScriptAccess" value="always" />', 238 '<param name="flashvars" value="' + this.getFlashVars() + '" />', 239 '</object>'].join(""); 240 }; 241 242 // Private: getFlashVars builds the parameter string that will be passed 243 // to flash in the flashvars param. 244 SWFUpload.prototype.getFlashVars = function () { 245 // Build a string from the post param object 246 var paramString = this.buildParamString(); 247 var httpSuccessString = this.settings.http_success.join(","); 248 249 // Build the parameter string 250 return ["movieName=", encodeURIComponent(this.movieName), 251 "&uploadURL=", encodeURIComponent(this.settings.upload_url), 252 "&useQueryString=", encodeURIComponent(this.settings.use_query_string), 253 "&requeueOnError=", encodeURIComponent(this.settings.requeue_on_error), 254 "&httpSuccess=", encodeURIComponent(httpSuccessString), 255 "&assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout), 256 "&params=", encodeURIComponent(paramString), 257 "&filePostName=", encodeURIComponent(this.settings.file_post_name), 258 "&fileTypes=", encodeURIComponent(this.settings.file_types), 259 "&fileTypesDescription=", encodeURIComponent(this.settings.file_types_description), 260 "&fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit), 261 "&fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit), 262 "&fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit), 263 "&debugEnabled=", encodeURIComponent(this.settings.debug_enabled), 264 "&buttonImageURL=", encodeURIComponent(this.settings.button_image_url), 265 "&buttonWidth=", encodeURIComponent(this.settings.button_width), 266 "&buttonHeight=", encodeURIComponent(this.settings.button_height), 267 "&buttonText=", encodeURIComponent(this.settings.button_text), 268 "&buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding), 269 "&buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding), 270 "&buttonTextStyle=", encodeURIComponent(this.settings.button_text_style), 271 "&buttonAction=", encodeURIComponent(this.settings.button_action), 272 "&buttonDisabled=", encodeURIComponent(this.settings.button_disabled), 273 "&buttonCursor=", encodeURIComponent(this.settings.button_cursor) 274 ].join(""); 275 }; 276 277 // Public: getMovieElement retrieves the DOM reference to the Flash element added by SWFUpload 278 // The element is cached after the first lookup 279 SWFUpload.prototype.getMovieElement = function () { 280 if (this.movieElement == undefined) { 281 this.movieElement = document.getElementById(this.movieName); 282 } 283 284 if (this.movieElement === null) { 285 throw "Could not find Flash element"; 286 } 287 288 return this.movieElement; 289 }; 290 291 // Private: buildParamString takes the name/value pairs in the post_params setting object 292 // and joins them up in to a string formatted "name=value&name=value" 293 SWFUpload.prototype.buildParamString = function () { 294 var postParams = this.settings.post_params; 295 var paramStringPairs = []; 296 297 if (typeof(postParams) === "object") { 298 for (var name in postParams) { 299 if (postParams.hasOwnProperty(name)) { 300 paramStringPairs.push(encodeURIComponent(name.toString()) + "=" + encodeURIComponent(postParams[name].toString())); 301 } 302 } 303 } 304 305 return paramStringPairs.join("&"); 306 }; 307 308 // Public: Used to remove a SWFUpload instance from the page. This method strives to remove 309 // all references to the SWF, and other objects so memory is properly freed. 310 // Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state. 311 // Credits: Major improvements provided by steffen 312 SWFUpload.prototype.destroy = function () { 313 try { 314 // Make sure Flash is done before we try to remove it 315 this.cancelUpload(null, false); 316 317 318 // Remove the SWFUpload DOM nodes 319 var movieElement = null; 320 movieElement = this.getMovieElement(); 321 322 if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE 323 // Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround) 324 for (var i in movieElement) { 325 try { 326 if (typeof(movieElement[i]) === "function") { 327 movieElement[i] = null; 328 } 329 } catch (ex1) {} 23 if ( ! $placeholder.length ) { 24 return; 330 25 } 331 26 332 // Remove the Movie Element from the page 333 try { 334 movieElement.parentNode.removeChild(movieElement); 335 } catch (ex) {} 336 } 337 338 // Remove IE form fix reference 339 window[this.movieName] = null; 27 var $form = $placeholder.closest( 'form' ); 340 28 341 // Destroy other references 342 SWFUpload.instances[this.movieName] = null; 343 delete SWFUpload.instances[this.movieName]; 29 if ( ! $form.length ) { 30 $form = $( '<form enctype="multipart/form-data" method="post">' ); 31 $form.attr( 'action', settings.upload_url ); 32 $form.insertAfter( $placeholder ).append( $placeholder ); 33 } 344 34 345 this.movieElement = null; 346 this.settings = null; 347 this.customSettings = null; 348 this.eventQueue = null; 349 this.movieName = null; 350 351 352 return true; 353 } catch (ex2) { 354 return false; 355 } 356 }; 357 358 359 // Public: displayDebugInfo prints out settings and configuration 360 // information about this SWFUpload instance. 361 // This function (and any references to it) can be deleted when placing 362 // SWFUpload in production. 363 SWFUpload.prototype.displayDebugInfo = function () { 364 this.debug( 365 [ 366 "---SWFUpload Instance Info---\n", 367 "Version: ", SWFUpload.version, "\n", 368 "Movie Name: ", this.movieName, "\n", 369 "Settings:\n", 370 "\t", "upload_url: ", this.settings.upload_url, "\n", 371 "\t", "flash_url: ", this.settings.flash_url, "\n", 372 "\t", "use_query_string: ", this.settings.use_query_string.toString(), "\n", 373 "\t", "requeue_on_error: ", this.settings.requeue_on_error.toString(), "\n", 374 "\t", "http_success: ", this.settings.http_success.join(", "), "\n", 375 "\t", "assume_success_timeout: ", this.settings.assume_success_timeout, "\n", 376 "\t", "file_post_name: ", this.settings.file_post_name, "\n", 377 "\t", "post_params: ", this.settings.post_params.toString(), "\n", 378 "\t", "file_types: ", this.settings.file_types, "\n", 379 "\t", "file_types_description: ", this.settings.file_types_description, "\n", 380 "\t", "file_size_limit: ", this.settings.file_size_limit, "\n", 381 "\t", "file_upload_limit: ", this.settings.file_upload_limit, "\n", 382 "\t", "file_queue_limit: ", this.settings.file_queue_limit, "\n", 383 "\t", "debug: ", this.settings.debug.toString(), "\n", 384 385 "\t", "prevent_swf_caching: ", this.settings.prevent_swf_caching.toString(), "\n", 386 387 "\t", "button_placeholder_id: ", this.settings.button_placeholder_id.toString(), "\n", 388 "\t", "button_placeholder: ", (this.settings.button_placeholder ? "Set" : "Not Set"), "\n", 389 "\t", "button_image_url: ", this.settings.button_image_url.toString(), "\n", 390 "\t", "button_width: ", this.settings.button_width.toString(), "\n", 391 "\t", "button_height: ", this.settings.button_height.toString(), "\n", 392 "\t", "button_text: ", this.settings.button_text.toString(), "\n", 393 "\t", "button_text_style: ", this.settings.button_text_style.toString(), "\n", 394 "\t", "button_text_top_padding: ", this.settings.button_text_top_padding.toString(), "\n", 395 "\t", "button_text_left_padding: ", this.settings.button_text_left_padding.toString(), "\n", 396 "\t", "button_action: ", this.settings.button_action.toString(), "\n", 397 "\t", "button_disabled: ", this.settings.button_disabled.toString(), "\n", 398 399 "\t", "custom_settings: ", this.settings.custom_settings.toString(), "\n", 400 "Event Handlers:\n", 401 "\t", "swfupload_loaded_handler assigned: ", (typeof this.settings.swfupload_loaded_handler === "function").toString(), "\n", 402 "\t", "file_dialog_start_handler assigned: ", (typeof this.settings.file_dialog_start_handler === "function").toString(), "\n", 403 "\t", "file_queued_handler assigned: ", (typeof this.settings.file_queued_handler === "function").toString(), "\n", 404 "\t", "file_queue_error_handler assigned: ", (typeof this.settings.file_queue_error_handler === "function").toString(), "\n", 405 "\t", "upload_start_handler assigned: ", (typeof this.settings.upload_start_handler === "function").toString(), "\n", 406 "\t", "upload_progress_handler assigned: ", (typeof this.settings.upload_progress_handler === "function").toString(), "\n", 407 "\t", "upload_error_handler assigned: ", (typeof this.settings.upload_error_handler === "function").toString(), "\n", 408 "\t", "upload_success_handler assigned: ", (typeof this.settings.upload_success_handler === "function").toString(), "\n", 409 "\t", "upload_complete_handler assigned: ", (typeof this.settings.upload_complete_handler === "function").toString(), "\n", 410 "\t", "debug_handler assigned: ", (typeof this.settings.debug_handler === "function").toString(), "\n" 411 ].join("") 412 ); 413 }; 414 415 /* Note: addSetting and getSetting are no longer used by SWFUpload but are included 416 the maintain v2 API compatibility 417 */ 418 // Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used. 419 SWFUpload.prototype.addSetting = function (name, value, default_value) { 420 if (value == undefined) { 421 return (this.settings[name] = default_value); 422 } else { 423 return (this.settings[name] = value); 424 } 425 }; 426 427 // Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found. 428 SWFUpload.prototype.getSetting = function (name) { 429 if (this.settings[name] != undefined) { 430 return this.settings[name]; 431 } 432 433 return ""; 434 }; 435 436 437 438 // Private: callFlash handles function calls made to the Flash element. 439 // Calls are made with a setTimeout for some functions to work around 440 // bugs in the ExternalInterface library. 441 SWFUpload.prototype.callFlash = function (functionName, argumentArray) { 442 argumentArray = argumentArray || []; 443 444 var movieElement = this.getMovieElement(); 445 var returnValue, returnString; 446 447 // Flash's method if calling ExternalInterface methods (code adapted from MooTools). 448 try { 449 returnString = movieElement.CallFunction('<invoke name="' + functionName + '" returntype="javascript">' + __flash__argumentsToXML(argumentArray, 0) + '</invoke>'); 450 returnValue = eval(returnString); 451 } catch (ex) { 452 throw "Call to " + functionName + " failed"; 453 } 454 455 // Unescape file post param values 456 if (returnValue != undefined && typeof returnValue.post === "object") { 457 returnValue = this.unescapeFilePostParams(returnValue); 458 } 459 460 return returnValue; 461 }; 462 463 /* ***************************** 464 -- Flash control methods -- 465 Your UI should use these 466 to operate SWFUpload 467 ***************************** */ 468 469 // WARNING: this function does not work in Flash Player 10 470 // Public: selectFile causes a File Selection Dialog window to appear. This 471 // dialog only allows 1 file to be selected. 472 SWFUpload.prototype.selectFile = function () { 473 this.callFlash("SelectFile"); 474 }; 475 476 // WARNING: this function does not work in Flash Player 10 477 // Public: selectFiles causes a File Selection Dialog window to appear/ This 478 // dialog allows the user to select any number of files 479 // Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names. 480 // If the selection name length is too long the dialog will fail in an unpredictable manner. There is no work-around 481 // for this bug. 482 SWFUpload.prototype.selectFiles = function () { 483 this.callFlash("SelectFiles"); 484 }; 485 486 487 // Public: startUpload starts uploading the first file in the queue unless 488 // the optional parameter 'fileID' specifies the ID 489 SWFUpload.prototype.startUpload = function (fileID) { 490 this.callFlash("StartUpload", [fileID]); 491 }; 492 493 // Public: cancelUpload cancels any queued file. The fileID parameter may be the file ID or index. 494 // If you do not specify a fileID the current uploading file or first file in the queue is cancelled. 495 // If you do not want the uploadError event to trigger you can specify false for the triggerErrorEvent parameter. 496 SWFUpload.prototype.cancelUpload = function (fileID, triggerErrorEvent) { 497 if (triggerErrorEvent !== false) { 498 triggerErrorEvent = true; 499 } 500 this.callFlash("CancelUpload", [fileID, triggerErrorEvent]); 501 }; 502 503 // Public: stopUpload stops the current upload and requeues the file at the beginning of the queue. 504 // If nothing is currently uploading then nothing happens. 505 SWFUpload.prototype.stopUpload = function () { 506 this.callFlash("StopUpload"); 507 }; 508 509 /* ************************ 510 * Settings methods 511 * These methods change the SWFUpload settings. 512 * SWFUpload settings should not be changed directly on the settings object 513 * since many of the settings need to be passed to Flash in order to take 514 * effect. 515 * *********************** */ 516 517 // Public: getStats gets the file statistics object. 518 SWFUpload.prototype.getStats = function () { 519 return this.callFlash("GetStats"); 520 }; 521 522 // Public: setStats changes the SWFUpload statistics. You shouldn't need to 523 // change the statistics but you can. Changing the statistics does not 524 // affect SWFUpload accept for the successful_uploads count which is used 525 // by the upload_limit setting to determine how many files the user may upload. 526 SWFUpload.prototype.setStats = function (statsObject) { 527 this.callFlash("SetStats", [statsObject]); 528 }; 529 530 // Public: getFile retrieves a File object by ID or Index. If the file is 531 // not found then 'null' is returned. 532 SWFUpload.prototype.getFile = function (fileID) { 533 if (typeof(fileID) === "number") { 534 return this.callFlash("GetFileByIndex", [fileID]); 535 } else { 536 return this.callFlash("GetFile", [fileID]); 537 } 538 }; 539 540 // Public: addFileParam sets a name/value pair that will be posted with the 541 // file specified by the Files ID. If the name already exists then the 542 // exiting value will be overwritten. 543 SWFUpload.prototype.addFileParam = function (fileID, name, value) { 544 return this.callFlash("AddFileParam", [fileID, name, value]); 545 }; 546 547 // Public: removeFileParam removes a previously set (by addFileParam) name/value 548 // pair from the specified file. 549 SWFUpload.prototype.removeFileParam = function (fileID, name) { 550 this.callFlash("RemoveFileParam", [fileID, name]); 551 }; 552 553 // Public: setUploadUrl changes the upload_url setting. 554 SWFUpload.prototype.setUploadURL = function (url) { 555 this.settings.upload_url = url.toString(); 556 this.callFlash("SetUploadURL", [url]); 557 }; 558 559 // Public: setPostParams changes the post_params setting 560 SWFUpload.prototype.setPostParams = function (paramsObject) { 561 this.settings.post_params = paramsObject; 562 this.callFlash("SetPostParams", [paramsObject]); 563 }; 564 565 // Public: addPostParam adds post name/value pair. Each name can have only one value. 566 SWFUpload.prototype.addPostParam = function (name, value) { 567 this.settings.post_params[name] = value; 568 this.callFlash("SetPostParams", [this.settings.post_params]); 569 }; 570 571 // Public: removePostParam deletes post name/value pair. 572 SWFUpload.prototype.removePostParam = function (name) { 573 delete this.settings.post_params[name]; 574 this.callFlash("SetPostParams", [this.settings.post_params]); 575 }; 576 577 // Public: setFileTypes changes the file_types setting and the file_types_description setting 578 SWFUpload.prototype.setFileTypes = function (types, description) { 579 this.settings.file_types = types; 580 this.settings.file_types_description = description; 581 this.callFlash("SetFileTypes", [types, description]); 582 }; 583 584 // Public: setFileSizeLimit changes the file_size_limit setting 585 SWFUpload.prototype.setFileSizeLimit = function (fileSizeLimit) { 586 this.settings.file_size_limit = fileSizeLimit; 587 this.callFlash("SetFileSizeLimit", [fileSizeLimit]); 588 }; 589 590 // Public: setFileUploadLimit changes the file_upload_limit setting 591 SWFUpload.prototype.setFileUploadLimit = function (fileUploadLimit) { 592 this.settings.file_upload_limit = fileUploadLimit; 593 this.callFlash("SetFileUploadLimit", [fileUploadLimit]); 594 }; 595 596 // Public: setFileQueueLimit changes the file_queue_limit setting 597 SWFUpload.prototype.setFileQueueLimit = function (fileQueueLimit) { 598 this.settings.file_queue_limit = fileQueueLimit; 599 this.callFlash("SetFileQueueLimit", [fileQueueLimit]); 600 }; 601 602 // Public: setFilePostName changes the file_post_name setting 603 SWFUpload.prototype.setFilePostName = function (filePostName) { 604 this.settings.file_post_name = filePostName; 605 this.callFlash("SetFilePostName", [filePostName]); 606 }; 607 608 // Public: setUseQueryString changes the use_query_string setting 609 SWFUpload.prototype.setUseQueryString = function (useQueryString) { 610 this.settings.use_query_string = useQueryString; 611 this.callFlash("SetUseQueryString", [useQueryString]); 612 }; 613 614 // Public: setRequeueOnError changes the requeue_on_error setting 615 SWFUpload.prototype.setRequeueOnError = function (requeueOnError) { 616 this.settings.requeue_on_error = requeueOnError; 617 this.callFlash("SetRequeueOnError", [requeueOnError]); 618 }; 619 620 // Public: setHTTPSuccess changes the http_success setting 621 SWFUpload.prototype.setHTTPSuccess = function (http_status_codes) { 622 if (typeof http_status_codes === "string") { 623 http_status_codes = http_status_codes.replace(" ", "").split(","); 624 } 625 626 this.settings.http_success = http_status_codes; 627 this.callFlash("SetHTTPSuccess", [http_status_codes]); 628 }; 629 630 // Public: setHTTPSuccess changes the http_success setting 631 SWFUpload.prototype.setAssumeSuccessTimeout = function (timeout_seconds) { 632 this.settings.assume_success_timeout = timeout_seconds; 633 this.callFlash("SetAssumeSuccessTimeout", [timeout_seconds]); 634 }; 635 636 // Public: setDebugEnabled changes the debug_enabled setting 637 SWFUpload.prototype.setDebugEnabled = function (debugEnabled) { 638 this.settings.debug_enabled = debugEnabled; 639 this.callFlash("SetDebugEnabled", [debugEnabled]); 640 }; 641 642 // Public: setButtonImageURL loads a button image sprite 643 SWFUpload.prototype.setButtonImageURL = function (buttonImageURL) { 644 if (buttonImageURL == undefined) { 645 buttonImageURL = ""; 646 } 647 648 this.settings.button_image_url = buttonImageURL; 649 this.callFlash("SetButtonImageURL", [buttonImageURL]); 650 }; 651 652 // Public: setButtonDimensions resizes the Flash Movie and button 653 SWFUpload.prototype.setButtonDimensions = function (width, height) { 654 this.settings.button_width = width; 655 this.settings.button_height = height; 656 657 var movie = this.getMovieElement(); 658 if (movie != undefined) { 659 movie.style.width = width + "px"; 660 movie.style.height = height + "px"; 661 } 662 663 this.callFlash("SetButtonDimensions", [width, height]); 664 }; 665 // Public: setButtonText Changes the text overlaid on the button 666 SWFUpload.prototype.setButtonText = function (html) { 667 this.settings.button_text = html; 668 this.callFlash("SetButtonText", [html]); 669 }; 670 // Public: setButtonTextPadding changes the top and left padding of the text overlay 671 SWFUpload.prototype.setButtonTextPadding = function (left, top) { 672 this.settings.button_text_top_padding = top; 673 this.settings.button_text_left_padding = left; 674 this.callFlash("SetButtonTextPadding", [left, top]); 675 }; 676 677 // Public: setButtonTextStyle changes the CSS used to style the HTML/Text overlaid on the button 678 SWFUpload.prototype.setButtonTextStyle = function (css) { 679 this.settings.button_text_style = css; 680 this.callFlash("SetButtonTextStyle", [css]); 681 }; 682 // Public: setButtonDisabled disables/enables the button 683 SWFUpload.prototype.setButtonDisabled = function (isDisabled) { 684 this.settings.button_disabled = isDisabled; 685 this.callFlash("SetButtonDisabled", [isDisabled]); 686 }; 687 // Public: setButtonAction sets the action that occurs when the button is clicked 688 SWFUpload.prototype.setButtonAction = function (buttonAction) { 689 this.settings.button_action = buttonAction; 690 this.callFlash("SetButtonAction", [buttonAction]); 691 }; 692 693 // Public: setButtonCursor changes the mouse cursor displayed when hovering over the button 694 SWFUpload.prototype.setButtonCursor = function (cursor) { 695 this.settings.button_cursor = cursor; 696 this.callFlash("SetButtonCursor", [cursor]); 697 }; 698 699 /* ******************************* 700 Flash Event Interfaces 701 These functions are used by Flash to trigger the various 702 events. 703 704 All these functions a Private. 705 706 Because the ExternalInterface library is buggy the event calls 707 are added to a queue and the queue then executed by a setTimeout. 708 This ensures that events are executed in a determinate order and that 709 the ExternalInterface bugs are avoided. 710 ******************************* */ 711 712 SWFUpload.prototype.queueEvent = function (handlerName, argumentArray) { 713 // Warning: Don't call this.debug inside here or you'll create an infinite loop 714 715 if (argumentArray == undefined) { 716 argumentArray = []; 717 } else if (!(argumentArray instanceof Array)) { 718 argumentArray = [argumentArray]; 719 } 720 721 var self = this; 722 if (typeof this.settings[handlerName] === "function") { 723 // Queue the event 724 this.eventQueue.push(function () { 725 this.settings[handlerName].apply(this, argumentArray); 726 }); 727 728 // Execute the next queued event 729 setTimeout(function () { 730 self.executeNextEvent(); 731 }, 0); 732 733 } else if (this.settings[handlerName] !== null) { 734 throw "Event handler " + handlerName + " is unknown or is not a function"; 735 } 736 }; 737 738 // Private: Causes the next event in the queue to be executed. Since events are queued using a setTimeout 739 // we must queue them in order to garentee that they are executed in order. 740 SWFUpload.prototype.executeNextEvent = function () { 741 // Warning: Don't call this.debug inside here or you'll create an infinite loop 742 743 var f = this.eventQueue ? this.eventQueue.shift() : null; 744 if (typeof(f) === "function") { 745 f.apply(this); 746 } 747 }; 748 749 // Private: unescapeFileParams is part of a workaround for a flash bug where objects passed through ExternalInterface cannot have 750 // properties that contain characters that are not valid for JavaScript identifiers. To work around this 751 // the Flash Component escapes the parameter names and we must unescape again before passing them along. 752 SWFUpload.prototype.unescapeFilePostParams = function (file) { 753 var reg = /[$]([0-9a-f]{4})/i; 754 var unescapedPost = {}; 755 var uk; 756 757 if (file != undefined) { 758 for (var k in file.post) { 759 if (file.post.hasOwnProperty(k)) { 760 uk = k; 761 var match; 762 while ((match = reg.exec(uk)) !== null) { 763 uk = uk.replace(match[0], String.fromCharCode(parseInt("0x" + match[1], 16))); 764 } 765 unescapedPost[uk] = file.post[k]; 766 } 35 $placeholder.replaceWith( 36 $( '<div>' ) 37 .append( 38 $( '<input type="file" multiple />' ).attr({ 39 name: settings.file_post_name || 'async-upload', 40 accepts: settings.file_types || '*.*' 41 }) 42 ).append( 43 $( '<input type="submit" name="html-upload" class="button" value="Upload" />' ) 44 ) 45 ); 767 46 } 768 47 769 file.post = unescapedPost; 770 } 48 try { 49 // Try the built-in fallback. 50 if ( typeof settings.swfupload_load_failed_handler === 'function' && settings.custom_settings ) { 771 51 772 return file; 773 }; 52 window.swfu = { 53 customSettings: settings.custom_settings 54 }; 774 55 775 // Private: Called by Flash to see if JS can call in to Flash (test if External Interface is working) 776 SWFUpload.prototype.testExternalInterface = function () { 777 try { 778 return this.callFlash("TestExternalInterface"); 779 } catch (ex) { 780 return false; 781 } 782 }; 783 784 // Private: This event is called by Flash when it has finished loading. Don't modify this. 785 // Use the swfupload_loaded_handler event setting to execute custom code when SWFUpload has loaded. 786 SWFUpload.prototype.flashReady = function () { 787 // Check that the movie element is loaded correctly with its ExternalInterface methods defined 788 var movieElement = this.getMovieElement(); 789 790 if (!movieElement) { 791 this.debug("Flash called back ready but the flash movie can't be found."); 792 return; 793 } 794 795 this.cleanUp(movieElement); 796 797 this.queueEvent("swfupload_loaded_handler"); 798 }; 799 800 // Private: removes Flash added fuctions to the DOM node to prevent memory leaks in IE. 801 // This function is called by Flash each time the ExternalInterface functions are created. 802 SWFUpload.prototype.cleanUp = function (movieElement) { 803 // Pro-actively unhook all the Flash functions 804 try { 805 if (this.movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE 806 this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)"); 807 for (var key in movieElement) { 808 try { 809 if (typeof(movieElement[key]) === "function") { 810 movieElement[key] = null; 811 } 812 } catch (ex) { 813 } 56 settings.swfupload_load_failed_handler(); 57 } else { 58 fallback(); 814 59 } 815 } 816 } catch (ex1) { 817 818 } 819 820 // Fix Flashes own cleanup code so if the SWFMovie was removed from the page 821 // it doesn't display errors. 822 window["__flash__removeCallback"] = function (instance, name) { 823 try { 824 if (instance) { 825 instance[name] = null; 826 } 827 } catch (flashEx) { 828 60 } catch ( ex ) { 61 fallback(); 829 62 } 830 63 }; 831 64 832 }; 65 SWFUpload.instances = {}; 66 SWFUpload.movieCount = 0; 67 SWFUpload.version = "0"; 68 SWFUpload.QUEUE_ERROR = {}; 69 SWFUpload.UPLOAD_ERROR = {}; 70 SWFUpload.FILE_STATUS = {}; 71 SWFUpload.BUTTON_ACTION = {}; 72 SWFUpload.CURSOR = {}; 73 SWFUpload.WINDOW_MODE = {}; 833 74 834 835 /* This is a chance to do something before the browse window opens */ 836 SWFUpload.prototype.fileDialogStart = function () { 837 this.queueEvent("file_dialog_start_handler"); 838 }; 839 840 841 /* Called when a file is successfully added to the queue. */ 842 SWFUpload.prototype.fileQueued = function (file) { 843 file = this.unescapeFilePostParams(file); 844 this.queueEvent("file_queued_handler", file); 845 }; 846 847 848 /* Handle errors that occur when an attempt to queue a file fails. */ 849 SWFUpload.prototype.fileQueueError = function (file, errorCode, message) { 850 file = this.unescapeFilePostParams(file); 851 this.queueEvent("file_queue_error_handler", [file, errorCode, message]); 852 }; 853 854 /* Called after the file dialog has closed and the selected files have been queued. 855 You could call startUpload here if you want the queued files to begin uploading immediately. */ 856 SWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued, numFilesInQueue) { 857 this.queueEvent("file_dialog_complete_handler", [numFilesSelected, numFilesQueued, numFilesInQueue]); 858 }; 859 860 SWFUpload.prototype.uploadStart = function (file) { 861 file = this.unescapeFilePostParams(file); 862 this.queueEvent("return_upload_start_handler", file); 863 }; 864 865 SWFUpload.prototype.returnUploadStart = function (file) { 866 var returnValue; 867 if (typeof this.settings.upload_start_handler === "function") { 868 file = this.unescapeFilePostParams(file); 869 returnValue = this.settings.upload_start_handler.call(this, file); 870 } else if (this.settings.upload_start_handler != undefined) { 871 throw "upload_start_handler must be a function"; 872 } 873 874 // Convert undefined to true so if nothing is returned from the upload_start_handler it is 875 // interpretted as 'true'. 876 if (returnValue === undefined) { 877 returnValue = true; 878 } 879 880 returnValue = !!returnValue; 881 882 this.callFlash("ReturnUploadStart", [returnValue]); 883 }; 884 885 886 887 SWFUpload.prototype.uploadProgress = function (file, bytesComplete, bytesTotal) { 888 file = this.unescapeFilePostParams(file); 889 this.queueEvent("upload_progress_handler", [file, bytesComplete, bytesTotal]); 890 }; 891 892 SWFUpload.prototype.uploadError = function (file, errorCode, message) { 893 file = this.unescapeFilePostParams(file); 894 this.queueEvent("upload_error_handler", [file, errorCode, message]); 895 }; 896 897 SWFUpload.prototype.uploadSuccess = function (file, serverData, responseReceived) { 898 file = this.unescapeFilePostParams(file); 899 this.queueEvent("upload_success_handler", [file, serverData, responseReceived]); 900 }; 901 902 SWFUpload.prototype.uploadComplete = function (file) { 903 file = this.unescapeFilePostParams(file); 904 this.queueEvent("upload_complete_handler", file); 905 }; 906 907 /* Called by SWFUpload JavaScript and Flash functions when debug is enabled. By default it writes messages to the 908 internal debug console. You can override this event and have messages written where you want. */ 909 SWFUpload.prototype.debug = function (message) { 910 this.queueEvent("debug_handler", message); 911 }; 912 913 914 /* ********************************** 915 Debug Console 916 The debug console is a self contained, in page location 917 for debug message to be sent. The Debug Console adds 918 itself to the body if necessary. 919 920 The console is automatically scrolled as messages appear. 921 922 If you are using your own debug handler or when you deploy to production and 923 have debug disabled you can remove these functions to reduce the file size 924 and complexity. 925 ********************************** */ 926 927 // Private: debugMessage is the default debug_handler. If you want to print debug messages 928 // call the debug() function. When overriding the function your own function should 929 // check to see if the debug setting is true before outputting debug information. 930 SWFUpload.prototype.debugMessage = function (message) { 931 if (this.settings.debug) { 932 var exceptionMessage, exceptionValues = []; 933 934 // Check for an exception object and print it nicely 935 if (typeof message === "object" && typeof message.name === "string" && typeof message.message === "string") { 936 for (var key in message) { 937 if (message.hasOwnProperty(key)) { 938 exceptionValues.push(key + ": " + message[key]); 939 } 940 } 941 exceptionMessage = exceptionValues.join("\n") || ""; 942 exceptionValues = exceptionMessage.split("\n"); 943 exceptionMessage = "EXCEPTION: " + exceptionValues.join("\nEXCEPTION: "); 944 SWFUpload.Console.writeLine(exceptionMessage); 945 } else { 946 SWFUpload.Console.writeLine(message); 947 } 948 } 949 }; 950 951 SWFUpload.Console = {}; 952 SWFUpload.Console.writeLine = function (message) { 953 var console, documentForm; 954 955 try { 956 console = document.getElementById("SWFUpload_Console"); 957 958 if (!console) { 959 documentForm = document.createElement("form"); 960 document.getElementsByTagName("body")[0].appendChild(documentForm); 961 962 console = document.createElement("textarea"); 963 console.id = "SWFUpload_Console"; 964 console.style.fontFamily = "monospace"; 965 console.setAttribute("wrap", "off"); 966 console.wrap = "off"; 967 console.style.overflow = "auto"; 968 console.style.width = "700px"; 969 console.style.height = "350px"; 970 console.style.margin = "5px"; 971 documentForm.appendChild(console); 972 } 973 974 console.value += message + "\n"; 975 976 console.scrollTop = console.scrollHeight - console.clientHeight; 977 } catch (ex) { 978 alert("Exception: " + ex.name + " Message: " + ex.message); 979 } 980 }; 75 SWFUpload.completeURL = noop; 76 SWFUpload.prototype.initSettings = noop; 77 SWFUpload.prototype.loadFlash = noop; 78 SWFUpload.prototype.getFlashHTML = noop; 79 SWFUpload.prototype.getFlashVars = noop; 80 SWFUpload.prototype.getMovieElement = noop; 81 SWFUpload.prototype.buildParamString = noop; 82 SWFUpload.prototype.destroy = noop; 83 SWFUpload.prototype.displayDebugInfo = noop; 84 SWFUpload.prototype.addSetting = noop; 85 SWFUpload.prototype.getSetting = noop; 86 SWFUpload.prototype.callFlash = noop; 87 SWFUpload.prototype.selectFile = noop; 88 SWFUpload.prototype.selectFiles = noop; 89 SWFUpload.prototype.startUpload = noop; 90 SWFUpload.prototype.cancelUpload = noop; 91 SWFUpload.prototype.stopUpload = noop; 92 SWFUpload.prototype.getStats = noop; 93 SWFUpload.prototype.setStats = noop; 94 SWFUpload.prototype.getFile = noop; 95 SWFUpload.prototype.addFileParam = noop; 96 SWFUpload.prototype.removeFileParam = noop; 97 SWFUpload.prototype.setUploadURL = noop; 98 SWFUpload.prototype.setPostParams = noop; 99 SWFUpload.prototype.addPostParam = noop; 100 SWFUpload.prototype.removePostParam = noop; 101 SWFUpload.prototype.setFileTypes = noop; 102 SWFUpload.prototype.setFileSizeLimit = noop; 103 SWFUpload.prototype.setFileUploadLimit = noop; 104 SWFUpload.prototype.setFileQueueLimit = noop; 105 SWFUpload.prototype.setFilePostName = noop; 106 SWFUpload.prototype.setUseQueryString = noop; 107 SWFUpload.prototype.setRequeueOnError = noop; 108 SWFUpload.prototype.setHTTPSuccess = noop; 109 SWFUpload.prototype.setAssumeSuccessTimeout = noop; 110 SWFUpload.prototype.setDebugEnabled = noop; 111 SWFUpload.prototype.setButtonImageURL = noop; 112 SWFUpload.prototype.setButtonDimensions = noop; 113 SWFUpload.prototype.setButtonText = noop; 114 SWFUpload.prototype.setButtonTextPadding = noop; 115 SWFUpload.prototype.setButtonTextStyle = noop; 116 SWFUpload.prototype.setButtonDisabled = noop; 117 SWFUpload.prototype.setButtonAction = noop; 118 SWFUpload.prototype.setButtonCursor = noop; 119 SWFUpload.prototype.queueEvent = noop; 120 SWFUpload.prototype.executeNextEvent = noop; 121 SWFUpload.prototype.unescapeFilePostParams = noop; 122 SWFUpload.prototype.testExternalInterface = noop; 123 SWFUpload.prototype.flashReady = noop; 124 SWFUpload.prototype.cleanUp = noop; 125 SWFUpload.prototype.fileDialogStart = noop; 126 SWFUpload.prototype.fileQueued = noop; 127 SWFUpload.prototype.fileQueueError = noop; 128 SWFUpload.prototype.fileDialogComplete = noop; 129 SWFUpload.prototype.uploadStart = noop; 130 SWFUpload.prototype.returnUploadStart = noop; 131 SWFUpload.prototype.uploadProgress = noop; 132 SWFUpload.prototype.uploadError = noop; 133 SWFUpload.prototype.uploadSuccess = noop; 134 SWFUpload.prototype.uploadComplete = noop; 135 SWFUpload.prototype.debug = noop; 136 SWFUpload.prototype.debugMessage = noop; 137 SWFUpload.Console = { 138 writeLine: noop 139 }; 140 }() ); -
trunk/src/wp-includes/script-loader.php
r41395 r41554 327 327 // keep 'swfupload' for back-compat. 328 328 $scripts->add( 'swfupload', '/wp-includes/js/swfupload/swfupload.js', array(), '2201-20110113'); 329 $scripts->add( 'swfupload-swfobject', '/wp-includes/js/swfupload/plugins/swfupload.swfobject.js', array('swfupload', 'swfobject'), '2201a'); 330 $scripts->add( 'swfupload-queue', '/wp-includes/js/swfupload/plugins/swfupload.queue.js', array('swfupload'), '2201'); 331 $scripts->add( 'swfupload-speed', '/wp-includes/js/swfupload/plugins/swfupload.speed.js', array('swfupload'), '2201'); 332 $scripts->add( 'swfupload-all', false, array('swfupload', 'swfupload-swfobject', 'swfupload-queue'), '2201'); 329 $scripts->add( 'swfupload-all', false, array( 'swfupload' ), '2201' ); 333 330 $scripts->add( 'swfupload-handlers', "/wp-includes/js/swfupload/handlers$suffix.js", array('swfupload-all', 'jquery'), '2201-20110524'); 334 331 did_action( 'init' ) && $scripts->localize( 'swfupload-handlers', 'swfuploadL10n', $uploader_l10n );
Note: See TracChangeset
for help on using the changeset viewer.