WordPress.org

Make WordPress Core

Changeset 41554


Ignore:
Timestamp:
09/21/17 16:34:31 (4 months 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.