Make WordPress Core

Changeset 41554


Ignore:
Timestamp:
09/21/2017 04:34:31 PM (7 years ago)
Author:
azaozz
Message:

Remove SWFUpload,

  • Refactor swfupload.js to output a simple upload form, and handlers.js.
  • Delete the SWFUpload plugins directory and swfupload.swf.
  • Remove flash cookies "hack" from async-upload.php.

See #41752.

Location:
trunk/src
Files:
2 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/async-upload.php

    r39756 r41554  
    11<?php
    22/**
    3  * Server-side file upload handler from wp-plupload, swfupload or other asynchronous upload methods.
     3 * Server-side file upload handler from wp-plupload or other asynchronous upload methods.
    44 *
    55 * @package WordPress
     
    1515}
    1616
    17 if ( defined('ABSPATH') )
    18     require_once(ABSPATH . 'wp-load.php');
    19 else
     17if ( defined( 'ABSPATH' ) ) {
     18    require_once( ABSPATH . 'wp-load.php' );
     19} else {
    2020    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 instead
    24     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);
    3121}
    3222
  • trunk/src/wp-admin/includes/update-core.php

    r41332 r41554  
    717717'wp-includes/js/plupload/plupload.flash.swf',
    718718'wp-includes/js/plupload/plupload.silverlight.xap',
     719'wp-includes/js/swfupload/plugins',
     720'wp-includes/js/swfupload/swfupload.swf',
    719721);
    720722
  • trunk/src/wp-includes/js/swfupload/handlers.js

    r40431 r41554  
    11var topWin = window.dialogArguments || opener || parent || top;
    22
    3 function fileDialogStart() {
    4     jQuery("#media-upload-error").empty();
    5 }
     3function fileDialogStart() {}
     4function fileQueued() {}
     5function uploadStart() {}
     6function uploadProgress() {}
     7function prepareMediaItem() {}
     8function prepareMediaItemInit() {}
     9function itemAjaxError() {}
     10function deleteSuccess() {}
     11function deleteError() {}
     12function updateMediaForm() {}
     13function uploadSuccess() {}
     14function uploadComplete() {}
     15function wpQueueError() {}
     16function wpFileError() {}
     17function fileQueueError() {}
     18function fileDialogComplete() {}
     19function uploadError() {}
     20function cancelUpload() {}
    621
    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     }
     22function switchUploader() {
     23    jQuery( '#' + swfu.customSettings.swfupload_element_id ).hide();
     24    jQuery( '#' + swfu.customSettings.degraded_element_id ).show();
     25    jQuery( '.upload-html-bypass' ).hide();
    30826}
    30927
    31028function swfuploadPreLoad() {
    311     if ( !uploaderMode ) {
    312         switchUploader(1);
    313     } else {
    314         switchUploader(0);
    315     }
     29    switchUploader();
    31630}
    31731
    31832function swfuploadLoadFailed() {
    319     switchUploader(0);
    320     jQuery('.upload-html-bypass').hide();
     33    switchUploader();
    32134}
    32235
    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 url
    35836jQuery(document).ready(function($){
    35937    $( '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"))}})});
     1function 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  
    11/**
    2  * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
     2 * SWFUpload fallback
    33 *
    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
    125 */
    136
    14 
    15 /* ******************* */
    16 /* Constructor & Init  */
    17 /* ******************* */
    187var SWFUpload;
    198
    20 if (SWFUpload == undefined) {
    21     SWFUpload = function (settings) {
    22         this.initSWFUpload(settings);
    23     };
    24 }
     9( function () {
     10    function noop() {}
    2511
    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        };
    20816    }
    20917
    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 );
    21222
    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             "&amp;uploadURL=", encodeURIComponent(this.settings.upload_url),
    252             "&amp;useQueryString=", encodeURIComponent(this.settings.use_query_string),
    253             "&amp;requeueOnError=", encodeURIComponent(this.settings.requeue_on_error),
    254             "&amp;httpSuccess=", encodeURIComponent(httpSuccessString),
    255             "&amp;assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout),
    256             "&amp;params=", encodeURIComponent(paramString),
    257             "&amp;filePostName=", encodeURIComponent(this.settings.file_post_name),
    258             "&amp;fileTypes=", encodeURIComponent(this.settings.file_types),
    259             "&amp;fileTypesDescription=", encodeURIComponent(this.settings.file_types_description),
    260             "&amp;fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit),
    261             "&amp;fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit),
    262             "&amp;fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit),
    263             "&amp;debugEnabled=", encodeURIComponent(this.settings.debug_enabled),
    264             "&amp;buttonImageURL=", encodeURIComponent(this.settings.button_image_url),
    265             "&amp;buttonWidth=", encodeURIComponent(this.settings.button_width),
    266             "&amp;buttonHeight=", encodeURIComponent(this.settings.button_height),
    267             "&amp;buttonText=", encodeURIComponent(this.settings.button_text),
    268             "&amp;buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding),
    269             "&amp;buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding),
    270             "&amp;buttonTextStyle=", encodeURIComponent(this.settings.button_text_style),
    271             "&amp;buttonAction=", encodeURIComponent(this.settings.button_action),
    272             "&amp;buttonDisabled=", encodeURIComponent(this.settings.button_disabled),
    273             "&amp;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&amp;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("&amp;");
    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;
    33025            }
    33126
    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' );
    34028
    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            }
    34434
    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            );
    76746        }
    76847
    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 ) {
    77151
    772     return file;
    773 };
     52                window.swfu = {
     53                    customSettings: settings.custom_settings
     54                };
    77455
    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();
    81459            }
    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();
    82962        }
    83063    };
    83164
    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 = {};
    83374
    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  
    327327    // keep 'swfupload' for back-compat.
    328328    $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' );
    333330    $scripts->add( 'swfupload-handlers', "/wp-includes/js/swfupload/handlers$suffix.js", array('swfupload-all', 'jquery'), '2201-20110524');
    334331    did_action( 'init' ) && $scripts->localize( 'swfupload-handlers', 'swfuploadL10n', $uploader_l10n );
Note: See TracChangeset for help on using the changeset viewer.