Pluploader take 1, props jacobwg, see #18206
git-svn-id: http://svn.automattic.com/wordpress/trunk@18482 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
3aff9d9464
commit
91a8720fff
|
@ -3306,6 +3306,10 @@ abbr.required {
|
||||||
14.1 - Media Uploader
|
14.1 - Media Uploader
|
||||||
------------------------------------------------------------------------------*/
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
div.plupload input {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
.find-box {
|
.find-box {
|
||||||
width: 500px;
|
width: 500px;
|
||||||
height: 300px;
|
height: 300px;
|
||||||
|
|
|
@ -323,11 +323,30 @@ function wp_handle_upload( &$file, $overrides = false, $time = null ) {
|
||||||
|
|
||||||
$filename = wp_unique_filename( $uploads['path'], $file['name'], $unique_filename_callback );
|
$filename = wp_unique_filename( $uploads['path'], $file['name'], $unique_filename_callback );
|
||||||
|
|
||||||
|
$tmp_file = wp_tempnam($filename);
|
||||||
|
|
||||||
// Move the file to the uploads dir
|
// Move the file to the uploads dir
|
||||||
$new_file = $uploads['path'] . "/$filename";
|
if ( false === @ move_uploaded_file( $file['tmp_name'], $tmp_file ) )
|
||||||
if ( false === @ move_uploaded_file( $file['tmp_name'], $new_file ) )
|
|
||||||
return $upload_error_handler( $file, sprintf( __('The uploaded file could not be moved to %s.' ), $uploads['path'] ) );
|
return $upload_error_handler( $file, sprintf( __('The uploaded file could not be moved to %s.' ), $uploads['path'] ) );
|
||||||
|
|
||||||
|
// If a resize was requested, perform the resize.
|
||||||
|
$do_resize = apply_filters( 'wp_upload_resize', isset( $_REQUEST['image_resize'] ) );
|
||||||
|
$size = @getimagesize( $tmp_file );
|
||||||
|
if ( $do_resize && $size ) {
|
||||||
|
$old_temp = $tmp_file;
|
||||||
|
$tmp_file = image_resize( $tmp_file, (int) get_option('large_size_w'), (int) get_option('large_size_h'), 0, 'resized');
|
||||||
|
if ( ! is_wp_error($tmp_file) ) {
|
||||||
|
unlink($old_temp);
|
||||||
|
} else {
|
||||||
|
$tmp_file = $old_temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy the temporary file into its destination
|
||||||
|
$new_file = $uploads['path'] . "/$filename";
|
||||||
|
copy( $tmp_file, $new_file );
|
||||||
|
unlink($tmp_file);
|
||||||
|
|
||||||
// Set correct file permissions
|
// Set correct file permissions
|
||||||
$stat = stat( dirname( $new_file ));
|
$stat = stat( dirname( $new_file ));
|
||||||
$perms = $stat['mode'] & 0000666;
|
$perms = $stat['mode'] & 0000666;
|
||||||
|
|
|
@ -1437,14 +1437,8 @@ function media_upload_header() {
|
||||||
function media_upload_form( $errors = null ) {
|
function media_upload_form( $errors = null ) {
|
||||||
global $type, $tab, $pagenow;
|
global $type, $tab, $pagenow;
|
||||||
|
|
||||||
$flash_action_url = admin_url('async-upload.php');
|
$upload_action_url = admin_url('async-upload.php');
|
||||||
|
|
||||||
// If Mac and mod_security, no Flash. :(
|
|
||||||
$flash = true;
|
|
||||||
if ( false !== stripos($_SERVER['HTTP_USER_AGENT'], 'mac') && apache_mod_loaded('mod_security') )
|
|
||||||
$flash = false;
|
|
||||||
|
|
||||||
$flash = apply_filters('flash_uploader', $flash);
|
|
||||||
$post_id = isset($_REQUEST['post_id']) ? intval($_REQUEST['post_id']) : 0;
|
$post_id = isset($_REQUEST['post_id']) ? intval($_REQUEST['post_id']) : 0;
|
||||||
|
|
||||||
$upload_size_unit = $max_upload_size = wp_max_upload_size();
|
$upload_size_unit = $max_upload_size = wp_max_upload_size();
|
||||||
|
@ -1458,15 +1452,6 @@ function media_upload_form( $errors = null ) {
|
||||||
$upload_size_unit = (int) $upload_size_unit;
|
$upload_size_unit = (int) $upload_size_unit;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript">
|
|
||||||
//<![CDATA[
|
|
||||||
var uploaderMode = 0;
|
|
||||||
jQuery(document).ready(function($){
|
|
||||||
uploaderMode = getUserSetting('uploader');
|
|
||||||
$('.upload-html-bypass a').click(function(){deleteUserSetting('uploader');uploaderMode=0;swfuploadPreLoad();return false;});
|
|
||||||
$('.upload-flash-bypass a').click(function(){setUserSetting('uploader', '1');uploaderMode=1;swfuploadPreLoad();return false;});
|
|
||||||
});
|
|
||||||
//]]>
|
|
||||||
</script>
|
</script>
|
||||||
<div id="media-upload-notice">
|
<div id="media-upload-notice">
|
||||||
<?php if (isset($errors['upload_notice']) ) { ?>
|
<?php if (isset($errors['upload_notice']) ) { ?>
|
||||||
|
@ -1487,9 +1472,7 @@ if ( is_multisite() && !is_upload_space_available() ) {
|
||||||
|
|
||||||
do_action('pre-upload-ui');
|
do_action('pre-upload-ui');
|
||||||
|
|
||||||
if ( $flash ) :
|
// Set the post params, which plupload will post back with the file, and pass
|
||||||
|
|
||||||
// Set the post params, which SWFUpload will post back with the file, and pass
|
|
||||||
// them through a filter.
|
// them through a filter.
|
||||||
$post_params = array(
|
$post_params = array(
|
||||||
"post_id" => $post_id,
|
"post_id" => $post_id,
|
||||||
|
@ -1500,80 +1483,105 @@ $post_params = array(
|
||||||
"tab" => $tab,
|
"tab" => $tab,
|
||||||
"short" => "1",
|
"short" => "1",
|
||||||
);
|
);
|
||||||
$post_params = apply_filters( 'swfupload_post_params', $post_params );
|
$post_params = apply_filters( 'upload_post_params', $post_params ); // hook change! old name: 'swfupload_post_params'
|
||||||
$p = array();
|
$p = array();
|
||||||
foreach ( $post_params as $param => $val )
|
foreach ( $post_params as $param => $val )
|
||||||
$p[] = "\t\t'$param' : '$val'";
|
$p[] = "\t\t'$param' : '$val'";
|
||||||
$post_params_str = implode( ", \n", $p );
|
$post_params_str = implode( ", \n", $p );
|
||||||
|
|
||||||
// #8545. wmode=transparent cannot be used with SWFUpload
|
|
||||||
if ( 'media-new.php' == $pagenow ) {
|
|
||||||
$upload_image_path = get_user_option( 'admin_color' );
|
|
||||||
if ( 'classic' != $upload_image_path )
|
|
||||||
$upload_image_path = 'fresh';
|
|
||||||
$upload_image_path = admin_url( 'images/upload-' . $upload_image_path . '.png?ver=20101205' );
|
|
||||||
} else {
|
|
||||||
$upload_image_path = includes_url( 'images/upload.png?ver=20100531' );
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
//<![CDATA[
|
//<![CDATA[
|
||||||
var swfu;
|
var resize_height = <?php echo get_option('large_size_h'); ?>,
|
||||||
SWFUpload.onload = function() {
|
resize_width = <?php echo get_option('large_size_w'); ?>;
|
||||||
var settings = {
|
|
||||||
button_text: '<span class="button"><?php _e('Select Files'); ?><\/span>',
|
jQuery(document).ready(function($) {
|
||||||
button_text_style: '.button { text-align: center; font-weight: bold; font-family:"Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif; font-size: 11px; text-shadow: 0 1px 0 #FFFFFF; color:#464646; }',
|
window.uploader = new plupload.Uploader({
|
||||||
button_height: "23",
|
runtimes: '<?php echo apply_filters('plupload_runtimes', 'html5,silverlight,flash,html4'); ?>',
|
||||||
button_width: "132",
|
browse_button: 'plupload-browse-button',
|
||||||
button_text_top_padding: 3,
|
container: 'plupload-upload-ui',
|
||||||
button_image_url: '<?php echo $upload_image_path; ?>',
|
drop_element: 'media-upload',
|
||||||
button_placeholder_id: "flash-browse-button",
|
file_data_name: 'async-upload',
|
||||||
upload_url : "<?php echo esc_attr( $flash_action_url ); ?>",
|
max_file_size: '<?php echo $max_upload_size / 1024; ?>kb',
|
||||||
flash_url : "<?php echo includes_url('js/swfupload/swfupload.swf'); ?>",
|
url: '<?php echo esc_attr( $upload_action_url ); ?>',
|
||||||
file_post_name: "async-upload",
|
flash_swf_url: '<?php echo includes_url('js/plupload/plupload.flash.swf'); ?>',
|
||||||
file_types: "<?php echo apply_filters('upload_file_glob', '*.*'); ?>",
|
silverlight_xap_url: '<?php echo includes_url('js/plupload/plupload.silverlight.xap'); ?>',
|
||||||
post_params : {
|
filters: [
|
||||||
|
{title: '<?php _e( 'Allowed Files' ); ?>', extensions: '<?php echo apply_filters('upload_file_glob', '*'); ?>'}
|
||||||
|
],
|
||||||
|
multipart: true,
|
||||||
|
urlstream_upload: true,
|
||||||
|
multipart_params : {
|
||||||
<?php echo $post_params_str; ?>
|
<?php echo $post_params_str; ?>
|
||||||
},
|
}
|
||||||
file_size_limit : "<?php echo $max_upload_size; ?>b",
|
});
|
||||||
file_dialog_start_handler : fileDialogStart,
|
|
||||||
file_queued_handler : fileQueued,
|
setResize( getUserSetting('upload_resize', false) );
|
||||||
upload_start_handler : uploadStart,
|
|
||||||
upload_progress_handler : uploadProgress,
|
$('#image_resize').bind('change', function() {
|
||||||
upload_error_handler : uploadError,
|
var arg = $(this).prop('checked');
|
||||||
upload_success_handler : <?php echo apply_filters( 'swfupload_success_handler', 'uploadSuccess' ); ?>,
|
|
||||||
upload_complete_handler : uploadComplete,
|
setResize( arg );
|
||||||
file_queue_error_handler : fileQueueError,
|
|
||||||
file_dialog_complete_handler : fileDialogComplete,
|
if ( arg )
|
||||||
swfupload_pre_load_handler: swfuploadPreLoad,
|
setUserSetting('upload_resize', 1);
|
||||||
swfupload_load_failed_handler: swfuploadLoadFailed,
|
else
|
||||||
custom_settings : {
|
deleteUserSetting('upload_resize');
|
||||||
degraded_element_id : "html-upload-ui", // id of the element displayed when swfupload is unavailable
|
});
|
||||||
swfupload_element_id : "flash-upload-ui" // id of the element displayed when swfupload is available
|
|
||||||
},
|
uploader.init();
|
||||||
debug: false
|
|
||||||
};
|
console.debug(uploader);
|
||||||
swfu = new SWFUpload(settings);
|
console.debug(uploader.runtime)
|
||||||
};
|
|
||||||
|
|
||||||
|
uploader.bind('FilesAdded', function(up, files) {
|
||||||
|
$.each(files, function(i, file) {
|
||||||
|
fileQueued(file);
|
||||||
|
});
|
||||||
|
|
||||||
|
up.refresh();
|
||||||
|
up.start();
|
||||||
|
});
|
||||||
|
|
||||||
|
uploader.bind('BeforeUpload', function(up, file) {
|
||||||
|
uploadStart(file);
|
||||||
|
});
|
||||||
|
|
||||||
|
uploader.bind('UploadProgress', function(up, file) {
|
||||||
|
uploadProgress(file, file.loaded, file.size);
|
||||||
|
});
|
||||||
|
|
||||||
|
uploader.bind('Error', function(up, err) {
|
||||||
|
uploadError(err.file, err.code, err.message);
|
||||||
|
|
||||||
|
up.refresh();
|
||||||
|
});
|
||||||
|
|
||||||
|
uploader.bind('FileUploaded', function(up, file, response) {
|
||||||
|
<?php echo apply_filters( 'plupload_success_handler', 'uploadSuccess' ); ?>(file, response.response);
|
||||||
|
});
|
||||||
|
|
||||||
|
if ( uploader.runtime == 'html5' )
|
||||||
|
$('.dragdrop-info').show();
|
||||||
|
|
||||||
|
});
|
||||||
//]]>
|
//]]>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div id="flash-upload-ui" class="hide-if-no-js">
|
<div id="plupload-upload-ui" class="hide-if-no-js">
|
||||||
<?php do_action('pre-flash-upload-ui'); ?>
|
<?php do_action('pre-plupload-upload-ui'); // hook change, old name: 'pre-flash-upload-ui' ?>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<?php _e( 'Choose files to upload' ); ?>
|
<?php _e( 'Choose files to upload' ); ?>
|
||||||
<div id="flash-browse-button"></div>
|
<input id="plupload-browse-button" type="button" value="<?php esc_attr_e('Select Files'); ?>" class="button" />
|
||||||
<span><input id="cancel-upload" disabled="disabled" onclick="cancelUpload()" type="button" value="<?php esc_attr_e('Cancel Upload'); ?>" class="button" /></span>
|
<input id="cancel-upload" disabled="disabled" onclick="cancelUpload()" type="button" value="<?php esc_attr_e('Cancel Upload'); ?>" class="button" />
|
||||||
</div>
|
</div>
|
||||||
<p class="media-upload-size"><?php printf( __( 'Maximum upload file size: %d%s' ), $upload_size_unit, $sizes[$u] ); ?></p>
|
<p class="dragdrop-info howto"><?php _e('Or you can drop the files into this window.'); ?></p>
|
||||||
<?php do_action('post-flash-upload-ui'); ?>
|
<?php do_action('post-plupload-upload-ui'); // hook change, old name: 'post-flash-upload-ui' ?>
|
||||||
<p class="howto"><?php _e('After a file has been uploaded, you can add titles and descriptions.'); ?></p>
|
|
||||||
</div>
|
</div>
|
||||||
<?php endif; // $flash ?>
|
|
||||||
|
|
||||||
<div id="html-upload-ui" <?php if ( $flash ) echo 'class="hide-if-js"'; ?>>
|
<div id="html-upload-ui" class="hide-if-js">
|
||||||
<?php do_action('pre-html-upload-ui'); ?>
|
<?php do_action('pre-html-upload-ui'); ?>
|
||||||
<p id="async-upload-wrap">
|
<p id="async-upload-wrap">
|
||||||
<label class="screen-reader-text" for="async-upload"><?php _e('Upload'); ?></label>
|
<label class="screen-reader-text" for="async-upload"><?php _e('Upload'); ?></label>
|
||||||
|
@ -1582,12 +1590,12 @@ SWFUpload.onload = function() {
|
||||||
<a href="#" onclick="try{top.tb_remove();}catch(e){}; return false;"><?php _e('Cancel'); ?></a>
|
<a href="#" onclick="try{top.tb_remove();}catch(e){}; return false;"><?php _e('Cancel'); ?></a>
|
||||||
</p>
|
</p>
|
||||||
<div class="clear"></div>
|
<div class="clear"></div>
|
||||||
<p class="media-upload-size"><?php printf( __( 'Maximum upload file size: %d%s' ), $upload_size_unit, $sizes[$u] ); ?></p>
|
<?php do_action('post-html-upload-ui', $plupload); ?>
|
||||||
<?php if ( is_lighttpd_before_150() ): ?>
|
|
||||||
<p><?php _e('If you want to use all capabilities of the uploader, like uploading multiple files at once, please update to lighttpd 1.5.'); ?></p>
|
|
||||||
<?php endif;?>
|
|
||||||
<?php do_action('post-html-upload-ui', $flash); ?>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<p class="media-upload-size"><?php printf( __( 'Maximum upload file size: %d%s' ), $upload_size_unit, $sizes[$u] ); ?></p>
|
||||||
|
<p class="howto"><?php _e('After a file has been uploaded, you can add titles and descriptions.'); ?></p>
|
||||||
|
|
||||||
<?php do_action('post-upload-ui'); ?>
|
<?php do_action('post-upload-ui'); ?>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
|
@ -2269,71 +2277,19 @@ function _insert_into_post_button($type) {
|
||||||
';
|
';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* {@internal Missing Short Description}}
|
|
||||||
*
|
|
||||||
* Support a GET parameter for disabling the flash uploader.
|
|
||||||
*
|
|
||||||
* @since 2.6.0
|
|
||||||
*
|
|
||||||
* @param unknown_type $flash
|
|
||||||
* @return unknown
|
|
||||||
*/
|
|
||||||
function media_upload_use_flash($flash) {
|
|
||||||
if ( array_key_exists('flash', $_REQUEST) )
|
|
||||||
$flash = !empty($_REQUEST['flash']);
|
|
||||||
return $flash;
|
|
||||||
}
|
|
||||||
|
|
||||||
add_filter('flash_uploader', 'media_upload_use_flash');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@internal Missing Short Description}}
|
* {@internal Missing Short Description}}
|
||||||
*
|
*
|
||||||
* @since 2.6.0
|
* @since 2.6.0
|
||||||
*/
|
*/
|
||||||
function media_upload_flash_bypass() {
|
function media_upload_max_image_resize() {
|
||||||
echo '<p class="upload-flash-bypass">';
|
?>
|
||||||
printf( __('You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'), esc_url(add_query_arg('flash', 0)) );
|
<input name="image_resize" type="checkbox" id="image_resize" value="1" />
|
||||||
echo '</p>';
|
<label for="image_resize"><?php printf( __( 'Scale images to max width %1$dpx or max height %2$dpx'), get_option('large_size_w'), get_option('large_size_h') ); ?></label>
|
||||||
|
<?php
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
add_action('post-upload-ui', 'media_upload_max_image_resize');
|
||||||
* {@internal Missing Short Description}}
|
|
||||||
*
|
|
||||||
* @since 2.6.0
|
|
||||||
*/
|
|
||||||
function media_upload_html_bypass($flash = true) {
|
|
||||||
echo '<p class="upload-html-bypass hide-if-no-js">';
|
|
||||||
_e('You are using the Browser uploader.');
|
|
||||||
if ( $flash ) {
|
|
||||||
// the user manually selected the browser uploader, so let them switch back to Flash
|
|
||||||
echo ' ';
|
|
||||||
printf( __('Try the <a href="%s">Flash uploader</a> instead.'), esc_url(add_query_arg('flash', 1)) );
|
|
||||||
}
|
|
||||||
echo "</p>\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
add_action('post-flash-upload-ui', 'media_upload_flash_bypass');
|
|
||||||
add_action('post-html-upload-ui', 'media_upload_html_bypass');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@internal Missing Short Description}}
|
|
||||||
*
|
|
||||||
* Make sure the GET parameter sticks when we submit a form.
|
|
||||||
*
|
|
||||||
* @since 2.6.0
|
|
||||||
*
|
|
||||||
* @param unknown_type $url
|
|
||||||
* @return unknown
|
|
||||||
*/
|
|
||||||
function media_upload_bypass_url($url) {
|
|
||||||
if ( array_key_exists('flash', $_REQUEST) )
|
|
||||||
$url = add_query_arg('flash', intval($_REQUEST['flash']));
|
|
||||||
return $url;
|
|
||||||
}
|
|
||||||
|
|
||||||
add_filter('media_upload_form_url', 'media_upload_bypass_url');
|
|
||||||
|
|
||||||
add_filter('async_upload_image', 'get_media_item', 10, 2);
|
add_filter('async_upload_image', 'get_media_item', 10, 2);
|
||||||
add_filter('async_upload_audio', 'get_media_item', 10, 2);
|
add_filter('async_upload_audio', 'get_media_item', 10, 2);
|
||||||
|
|
|
@ -18,8 +18,8 @@ require_once('./admin.php');
|
||||||
if (!current_user_can('upload_files'))
|
if (!current_user_can('upload_files'))
|
||||||
wp_die(__('You do not have permission to upload files.'));
|
wp_die(__('You do not have permission to upload files.'));
|
||||||
|
|
||||||
wp_enqueue_script('swfupload-all');
|
wp_enqueue_script('plupload-full');
|
||||||
wp_enqueue_script('swfupload-handlers');
|
wp_enqueue_script('plupload-handlers');
|
||||||
wp_enqueue_script('image-edit');
|
wp_enqueue_script('image-edit');
|
||||||
wp_enqueue_script('set-post-thumbnail' );
|
wp_enqueue_script('set-post-thumbnail' );
|
||||||
wp_enqueue_style('imgareaselect');
|
wp_enqueue_style('imgareaselect');
|
||||||
|
|
|
@ -0,0 +1,152 @@
|
||||||
|
Version 1.4.3.2 (2011-04-13)
|
||||||
|
Fixed bug in HTML5 runtime, when was reduced by a factor of 100 after every upload.
|
||||||
|
Version 1.4.3.1 (2011-04-12)
|
||||||
|
Fixed build script, mistakenly populating jquery.plupload.queue directory from jquery.ui.plupload sources.
|
||||||
|
Fixed script urls in all examples, build script now will alter them automatically from dev to release when needed.
|
||||||
|
Fixed isEmptyObj undefined error in HTML4 runtime.
|
||||||
|
Fixed bug in UI Widget preventing UploadComplete from triggering.
|
||||||
|
Version 1.4.3 (2011-04-11)
|
||||||
|
Added Latvian language pack and updated French.
|
||||||
|
Fixed bug in Flash runtime when JPEG header was not investigated deep enough to reach SOFn marker in large images.
|
||||||
|
Fixed bug, when PNGs were cropped to width in Flash runtimes, rather then resized.
|
||||||
|
Fixed Flash to allow multiple uploading of the same file, with different settings.
|
||||||
|
Fixed Flash runtime to clean anonymous listeners properly.
|
||||||
|
Fixed HTML5 runtime to resolve to mimeType in case-insensitive way.
|
||||||
|
Fixed HTML5/Flash/SilverLight/Gears runtimes for inconsistency in naming of chunks feature, comparing to other runtimes.
|
||||||
|
Fixed HTML4/HTML5 runtimes for input[type=file] to outsize contaner effectively enough to fill the whole click area.
|
||||||
|
Fixed all runtimes to preserve position (relative/absolute) rule on containers that already have it.
|
||||||
|
Fixed SilverLight runtime to support large files (over 2GB).
|
||||||
|
Restructured the examples, src and build scripts to make it more clear that jQuery is optional.
|
||||||
|
Added support for *.* filter.
|
||||||
|
Added support for preserving ICC and IPTC headers when resizing JPEGs.
|
||||||
|
Added Image.onerror/onabort handlers to HTML5 in order to gracefully bypass faulty images.
|
||||||
|
Added ability to drop image size (by lowering quality), while preserving original dimension (HTML5/Flash/Gears).
|
||||||
|
Ported EXIF, ICC, IPTC preservation code to Flash runtime.
|
||||||
|
Version 1.4.2 (2011-02-20)
|
||||||
|
Added Brazilian Portuguese, German, Russian and Spanish translations.
|
||||||
|
Added support for file_data_name option to SilverLight runtime.
|
||||||
|
Added support for better quality image resizing to Flash runtime.
|
||||||
|
Added support for properly handling images with dimensions up to 8191x8191 pixels to Flash runtime.
|
||||||
|
Added 'updatelist' event to UI Widget, which will be triggered every time file list will get redrawn.
|
||||||
|
Added support for dynamically changing options to UI Widget.
|
||||||
|
Fixed HTML4 runtime bug, when UploadFile handler was attached twice.
|
||||||
|
Fixed HTML5 to use FileReader.readAsBinaryString() instead of File.getAsBinary() on newer WebKit browsers (like Chrome 9).
|
||||||
|
Fixed Flash runtime from sending duplicate Filename param, when using FileReference.upload().
|
||||||
|
Updated S3 example to illustrate support for a proper progress indication.
|
||||||
|
Version 1.4.1 (2011-02-01)
|
||||||
|
Added an example on how to use Plupload with Amazon S3 written in PHP but can easily be ported to other languages.
|
||||||
|
Fixed bug where hidden input elements wasn't created when the multiple_queues option wasn't used.
|
||||||
|
Fixed bug where FF4 would produce an exception about missing BlobBuilder.
|
||||||
|
Version 1.4.0 (2011-01-26)
|
||||||
|
Added removeEvent and removeAllEvents methods and modified addEvent accordingly, in order to support dynamic unload.
|
||||||
|
Added unbindAll method.
|
||||||
|
Added UploadComplete event, which fires when internal iterator reaches the end of the queue.
|
||||||
|
Added public destroy method to plupload object, new event - Destroy, and corresponding handlers to all runtimes.
|
||||||
|
Added Czech, Italian, French, Dutch translations.
|
||||||
|
Added support for translatable error messages.
|
||||||
|
Added two new options: browse_button_hover and browse_button_active, in order to support browse_button interactivity.
|
||||||
|
Added support for 'multi_selection: false' to Silverlight runtime.
|
||||||
|
Added support for video/mp4, video/x-m4v and audio/mp4 MIME Types.
|
||||||
|
Added artificial sendAsBinary method to XMLHttpRequest.prototype for browsers that have support for BlobBuilder and typed arrays.
|
||||||
|
Added version tracking variable into plupload object and version comment to the header of every file.
|
||||||
|
Fixed measurements of browse_button element in order to size and position input[type=file] element to fit it fully.
|
||||||
|
Fixed Flash runtime behavior for multiple_select=false and other simpleUpload usage cases: basically new FileReference has to be created for every select dialog.
|
||||||
|
Fixed browser sniffer to match only Safari, for fakeSafariDragDrop (seems like Safari on Mac doesn't require it either).
|
||||||
|
Fixed so that ExternalInterface escapes strings properly, before passing them to JS.
|
||||||
|
Fixed eventual reinitialization of flash/silverlight runtimes, especially for cases when object wrapper needed to be programmatically hidden and then shown again.
|
||||||
|
Fixed so that Plupload will now ignore files with duplicate names when adding to the queue, in one set. Mainly introduced to work around Safari on Windows bug (https://bugs.webkit.org/show_bug.cgi?id=37957).
|
||||||
|
Fixed bug, when final UploadProgress was firing after FileUploaded for Flash simpleUpload.
|
||||||
|
Fixed bug where upload would fail if an error was produced inside the FilesAdded event.
|
||||||
|
Fixed bug in Flash runtime when it used a wrong size when resizing, but not chunking.
|
||||||
|
Fixed bug in Silverlight runtime that would keep sending 0 byte packages when a picture was chunked before resized.
|
||||||
|
Disabled blur filter (is going to be replaced with some bilinear resampling in next release).
|
||||||
|
Completely revised UI Widget, to be more jQuery UI oriented. Optionally depends on UI Button, UI Sortable, UI ProgressBar.
|
||||||
|
Version 1.3.0 (2010-11-24)
|
||||||
|
Added new jQuery UI widget that supports jQuery UI themes.
|
||||||
|
Added new multiple_queues option that enables you to upload multiple times in the queue widgets.
|
||||||
|
Added support for crossdomain loading of the XAP and SWF files and crossdomain upload.
|
||||||
|
Added new multiple_queues option that enables you to upload multiple times in the queue widgets.
|
||||||
|
Added support for crossdomain loading of the XAP and SWF files and crossdomain upload.
|
||||||
|
Added preinit/init options to to ease up the binding of custom events to queueWidget and the Uploader class.
|
||||||
|
Added drag/drop support for Safari until they fix the broken drag/drop support on Windows.
|
||||||
|
Added events example file that show how to bind all events and display event specific data.
|
||||||
|
Added support for retaining Exif data on images when they where resized using the HTML5 runtime.
|
||||||
|
Fixed logic issue with the upload.php example file. Chunking wasn't working correctly.
|
||||||
|
Fixed issue with HTML4 not handling the form encoding correctly on older IE versions. Patch contributed by jinxdone.
|
||||||
|
Fixed so the HTML4 runtime only submits the defined multipart_params arguments.
|
||||||
|
Fixes issue where it wasn't possible to dynamically override url or mutlipart_params for the HTML4 runtime.
|
||||||
|
Fixed so all runtimes pass the name, chunk and chunks parameters as multipart parameters instead of querystring parameters.
|
||||||
|
Fixed so files are read using the newer FileReader class if it's available if not it tries the older getAsXXX on Gecko.
|
||||||
|
Fixed bug where IE 9 beta 1 wouldn't render Silverlight properly.
|
||||||
|
Fixed bug where Flash would do extra empty requests if images below a specific size would be uploaded.
|
||||||
|
Fixed bug where Google Gears would resize and re-encode images even if the it wasn't changed in scale.
|
||||||
|
Fixed bug where the HTML5 runtime wouldn't free memory after each request on Gecko.
|
||||||
|
Version 1.2.4 (2010-09-08)
|
||||||
|
Added new BeforeUpload event to make it easier to override settings before a file is uploaded.
|
||||||
|
Added new automatic usage of FileReference in Flash if it's possible. Contributed by Marcel Jackwerth.
|
||||||
|
Added new chunking support for Chrome 5 and Firefox 3.6 using the HTML 5 runtime.
|
||||||
|
Added new multipart upload support for WebKit using the HTML 5 runtime and the FormData object.
|
||||||
|
Added new image scaling method for the Flash runtime contributed by rcoopman.
|
||||||
|
Added new alert error message if the user selected invalid files.
|
||||||
|
Added new automatic unique name generation to the example.php script. Contributed by Brandon Kelly.
|
||||||
|
Changed so the default upload method is multipart and the default chunk size is 0.
|
||||||
|
Fixed progress issue with the HTML5 runtime running on Gecko.
|
||||||
|
Fixed so longer extensions can be used such as .tar.gz.
|
||||||
|
Fixed so the file extension is retained when using the unique_names option.
|
||||||
|
Version 1.2.3 (2010-05-27)
|
||||||
|
Added new drag/drop support for HTML5 running on Chrome beta.
|
||||||
|
Added new multipart state for the features object. It's now possible to detect multipart support.
|
||||||
|
Added new getFeatures function to all runtime. Basic concept by Javier Martinez Fernandez.
|
||||||
|
Fixed bug where runtimes where initialized even if they didn't match the required_features setting.
|
||||||
|
Version 1.2.2.1 (2010-05-04)
|
||||||
|
Added new headers option, enables you to set custom headers for the upload requests.
|
||||||
|
Fixed bug where the file extension checking was case sensitive.
|
||||||
|
Version 1.2.2 (2010-04-26)
|
||||||
|
Added new file_data_name option that enables you to set the multipart file data param. Patch contributed by Alex Ganov.
|
||||||
|
Added new FILE_SIZE_ERROR type that will be triggered if the user selected a file that is to large or zero bytes.
|
||||||
|
Added new FILE_EXTENSION_ERROR type that will be triggered if you add a file with an invalid file extension.
|
||||||
|
Added new required_features setting, enables you to specify a list of required features that the runtime must have.
|
||||||
|
Fixed so the plupload.buildUrl function uses the UTF compatible encodeURIComponent method instead of escape.
|
||||||
|
Fixed so that all file types can be selected if you don't specify a filter setting.
|
||||||
|
Fixed so more valid HTTP status codes are accepted as valid responses.
|
||||||
|
Fixed so all runtimes fills the features object with available features.
|
||||||
|
Fixed some issues with the HTML4 runtime if there wasn't any existing forms on the page.
|
||||||
|
Fixed some conflict issues with HTML4 runtime and forms with the input names of action or target.
|
||||||
|
Fixed bug where some Gecko versions would produce exceptions when checking the HTTP status of a XHR.
|
||||||
|
Version 1.2.1 (2010-03-22)
|
||||||
|
Fixed bug with incorrect aspect ratio in Flash image scaling.
|
||||||
|
Fixed bug where chunked uploads could get scrambled in the Flash runtime. Patch contributed by Grady Werner.
|
||||||
|
Fixed bug where a beta version of Chrome wouldn't handle drag/drop correctly because of missing drag effect.
|
||||||
|
Fixed so the HTML 4 runtime displays N/A for file sizes and the progress is based on uploaded files instead of bytes.
|
||||||
|
Fixed so chunking can be disabled properly in Flash but that will affect the progress bar.
|
||||||
|
Fixed so queue widget displays the drag/drop message if file queue is emptied.
|
||||||
|
Fixed small files are uploaded as one single chunk and not forced into 4 chunks in the Flash runtime.
|
||||||
|
Version 1.2 (2010-03-09)
|
||||||
|
Added new rename file support for jQuery queue widget, click on a file name to rename it if it's enabled.
|
||||||
|
Added official ChunkUploaded event, it similar to FileUploaded but executed for each chunk.
|
||||||
|
Added bytes per second support to total queue progress.
|
||||||
|
Added better error handling to core API using the new Error event.
|
||||||
|
Added better error handling to jQuery queue widget.
|
||||||
|
Fixed so chunking uploads is dispatch from JS not from inside Flash/Silverlight.
|
||||||
|
Version 1.1.1 (2010-02-25)
|
||||||
|
Added new setup setting to queue widget. Makes it easier to bind custom events to uploader instance.
|
||||||
|
Fixed so it's possible to disable chunking compleatly. It's now disabled by default.
|
||||||
|
Fixed bug where multipart mode was enabled all the time in the Flash runtime.
|
||||||
|
Fixed bug where chunked uploading in Silverlight would fail.
|
||||||
|
Fixed bug where the delete button was visible while uploading.
|
||||||
|
Fixed bug where unique_names setting wasn't working when the core API was used.
|
||||||
|
Fixed bug where the queue widget wouldn't display the currently uploaded file if the unique_names was enabled.
|
||||||
|
Version 1.1 (2010-02-24)
|
||||||
|
Added new multipart and multipart_params support.
|
||||||
|
Added new container option, enables you to specify where flash/silverlight objects would be added.
|
||||||
|
Added chunking support to BrowserPlus runtime, contributed by Steve Spencer.
|
||||||
|
Added FileUploaded event that fires when a file is uploaded.
|
||||||
|
Added more easily understandable buttons to queue widget.
|
||||||
|
Added html4 runtime, contributed by Ryan Demmer.
|
||||||
|
Fixed issues with i18n support and added a Swedish and Danish language pack.
|
||||||
|
Fixed bug where the Flash runtime could do empty requests if the image was scaled down.
|
||||||
|
Fixed bug where uploading small images in Silverlight would produce an exception.
|
||||||
|
Fixed so the runtime list can include whitespace or missing runtimes. Patch contributed by Øyvind Sean Kinsey.
|
||||||
|
Fixed so to large files are ignored and never dispatched to the FilesAdded event.
|
||||||
|
Version 1.0 (2010-02-03)
|
||||||
|
First official release of Plupload.
|
|
@ -40,7 +40,54 @@ function uploadProgress(fileObj, bytesDone, bytesTotal) {
|
||||||
jQuery('.percent', item).html( Math.ceil(bytesDone / bytesTotal * 100) + '%' );
|
jQuery('.percent', item).html( Math.ceil(bytesDone / bytesTotal * 100) + '%' );
|
||||||
|
|
||||||
if ( bytesDone == bytesTotal )
|
if ( bytesDone == bytesTotal )
|
||||||
jQuery('.bar', item).html('<strong class="crunching">' + swfuploadL10n.crunching + '</strong>');
|
jQuery('.bar', item).html('<strong class="crunching">' + pluploadL10n.crunching + '</strong>');
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateMediaForm() {
|
||||||
|
var one = jQuery('form.type-form #media-items').children(), items = jQuery('#media-items').children();
|
||||||
|
|
||||||
|
// Just one file, no need for collapsible part
|
||||||
|
if ( one.length == 1 ) {
|
||||||
|
jQuery('.slidetoggle', one).slideDown(500).siblings().addClass('hidden').filter('.toggle').toggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only show Save buttons when there is at least one file.
|
||||||
|
if ( items.not('.media-blank').length > 0 )
|
||||||
|
jQuery('.savebutton').show();
|
||||||
|
else
|
||||||
|
jQuery('.savebutton').hide();
|
||||||
|
|
||||||
|
// Only show Gallery button when there are at least two files.
|
||||||
|
if ( items.length > 1 )
|
||||||
|
jQuery('.insert-gallery').show();
|
||||||
|
else
|
||||||
|
jQuery('.insert-gallery').hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
function uploadSuccess(fileObj, serverData) {
|
||||||
|
// if async-upload returned an error message, place it in the media item div and return
|
||||||
|
if ( serverData.match('media-upload-error') ) {
|
||||||
|
jQuery('#media-item-' + fileObj.id).html(serverData);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
prepareMediaItem(fileObj, serverData);
|
||||||
|
updateMediaForm();
|
||||||
|
|
||||||
|
// Increment the counter.
|
||||||
|
if ( jQuery('#media-item-' + fileObj.id).hasClass('child-of-' + post_id) )
|
||||||
|
jQuery('#attachments-count').text(1 * jQuery('#attachments-count').text() + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setResize(r) {
|
||||||
|
jQuery('#image_resize').prop('checked', r);
|
||||||
|
if (r) {
|
||||||
|
uploader.settings.resize = { width: resize_width, height: resize_height, quality: 100 };
|
||||||
|
uploader.settings.multipart_params.image_resize = true;
|
||||||
|
} else {
|
||||||
|
uploader.settings.resize = {};
|
||||||
|
uploader.settings.multipart_params.image_resize = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareMediaItem(fileObj, serverData) {
|
function prepareMediaItem(fileObj, serverData) {
|
||||||
|
@ -144,13 +191,42 @@ function prepareMediaItemInit(fileObj) {
|
||||||
jQuery('#media-item-' + fileObj.id + '.startopen').removeClass('startopen').slideToggle(500).siblings('.toggle').toggle();
|
jQuery('#media-item-' + fileObj.id + '.startopen').removeClass('startopen').slideToggle(500).siblings('.toggle').toggle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function cancelUpload() {
|
||||||
|
uploader.stop();
|
||||||
|
jQuery.each(uploader.files, function(i,file) {
|
||||||
|
if (file.status == plupload.STOPPED)
|
||||||
|
jQuery('#media-item-' + file.id).remove();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// wp-specific error handlers
|
||||||
|
|
||||||
|
// generic message
|
||||||
|
function wpQueueError(message) {
|
||||||
|
jQuery('#media-upload-error').show().text(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// file-specific message
|
||||||
|
function wpFileError(fileObj, message) {
|
||||||
|
var item = jQuery('#media-item-' + fileObj.id);
|
||||||
|
var filename = jQuery('.filename', item).text();
|
||||||
|
|
||||||
|
item.html('<div class="error-div">'
|
||||||
|
+ '<a class="dismiss" href="#">' + pluploadL10n.dismiss + '</a>'
|
||||||
|
+ '<strong>' + pluploadL10n.error_uploading.replace('%s', filename) + '</strong><br />'
|
||||||
|
+ message
|
||||||
|
+ '</div>');
|
||||||
|
item.find('a.dismiss').click(function(){jQuery(this).parents('.media-item').slideUp(200, function(){jQuery(this).remove();})});
|
||||||
|
}
|
||||||
|
|
||||||
function itemAjaxError(id, html) {
|
function itemAjaxError(id, html) {
|
||||||
var item = jQuery('#media-item-' + id);
|
var item = jQuery('#media-item-' + id);
|
||||||
var filename = jQuery('.filename', item).text();
|
var filename = jQuery('.filename', item).text();
|
||||||
|
|
||||||
item.html('<div class="error-div">'
|
item.html('<div class="error-div">'
|
||||||
+ '<a class="dismiss" href="#">' + swfuploadL10n.dismiss + '</a>'
|
+ '<a class="dismiss" href="#">' + pluploadL10n.dismiss + '</a>'
|
||||||
+ '<strong>' + swfuploadL10n.error_uploading.replace('%s', filename) + '</strong><br />'
|
+ '<strong>' + pluploadL10n.error_uploading.replace('%s', filename) + '</strong><br />'
|
||||||
+ html
|
+ html
|
||||||
+ '</div>');
|
+ '</div>');
|
||||||
item.find('a.dismiss').click(function(){jQuery(this).parents('.media-item').slideUp(200, function(){jQuery(this).remove();})});
|
item.find('a.dismiss').click(function(){jQuery(this).parents('.media-item').slideUp(200, function(){jQuery(this).remove();})});
|
||||||
|
@ -182,7 +258,7 @@ function deleteSuccess(data, textStatus) {
|
||||||
|
|
||||||
jQuery('.filename:empty', item).remove();
|
jQuery('.filename:empty', item).remove();
|
||||||
jQuery('.filename .title', item).css('font-weight','bold');
|
jQuery('.filename .title', item).css('font-weight','bold');
|
||||||
jQuery('.filename', item).append('<span class="trashnotice"> ' + swfuploadL10n.deleted + ' </span>').siblings('a.toggle').hide();
|
jQuery('.filename', item).append('<span class="trashnotice"> ' + pluploadL10n.deleted + ' </span>').siblings('a.toggle').hide();
|
||||||
jQuery('.filename', item).append( jQuery('a.undo', item).removeClass('hidden') );
|
jQuery('.filename', item).append( jQuery('a.undo', item).removeClass('hidden') );
|
||||||
jQuery('.menu_order_input', item).hide();
|
jQuery('.menu_order_input', item).hide();
|
||||||
|
|
||||||
|
@ -193,47 +269,12 @@ function deleteError(X, textStatus, errorThrown) {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateMediaForm() {
|
|
||||||
var one = jQuery('form.type-form #media-items').children(), items = jQuery('#media-items').children();
|
|
||||||
|
|
||||||
// Just one file, no need for collapsible part
|
|
||||||
if ( one.length == 1 ) {
|
|
||||||
jQuery('.slidetoggle', one).slideDown(500).siblings().addClass('hidden').filter('.toggle').toggle();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only show Save buttons when there is at least one file.
|
|
||||||
if ( items.not('.media-blank').length > 0 )
|
|
||||||
jQuery('.savebutton').show();
|
|
||||||
else
|
|
||||||
jQuery('.savebutton').hide();
|
|
||||||
|
|
||||||
// Only show Gallery button when there are at least two files.
|
|
||||||
if ( items.length > 1 )
|
|
||||||
jQuery('.insert-gallery').show();
|
|
||||||
else
|
|
||||||
jQuery('.insert-gallery').hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
function uploadSuccess(fileObj, serverData) {
|
|
||||||
// if async-upload returned an error message, place it in the media item div and return
|
|
||||||
if ( serverData.match('media-upload-error') ) {
|
|
||||||
jQuery('#media-item-' + fileObj.id).html(serverData);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
prepareMediaItem(fileObj, serverData);
|
|
||||||
updateMediaForm();
|
|
||||||
|
|
||||||
// Increment the counter.
|
|
||||||
if ( jQuery('#media-item-' + fileObj.id).hasClass('child-of-' + post_id) )
|
|
||||||
jQuery('#attachments-count').text(1 * jQuery('#attachments-count').text() + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function uploadComplete(fileObj) {
|
function uploadComplete(fileObj) {
|
||||||
// If no more uploads queued, enable the submit button
|
// If no more uploads queued, enable the submit button
|
||||||
if ( swfu.getStats().files_queued == 0 ) {
|
if ( swfu.getStats().files_queued == 0 ) {
|
||||||
jQuery('#cancel-upload').prop('disabled', true);
|
jQuery('#cancel-upload').attr('disabled', 'disabled');
|
||||||
jQuery('#insert-gallery').prop('disabled', false);
|
jQuery('#insert-gallery').attr('disabled', '');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,56 +292,33 @@ function wpFileError(fileObj, message) {
|
||||||
var filename = jQuery('.filename', item).text();
|
var filename = jQuery('.filename', item).text();
|
||||||
|
|
||||||
item.html('<div class="error-div">'
|
item.html('<div class="error-div">'
|
||||||
+ '<a class="dismiss" href="#">' + swfuploadL10n.dismiss + '</a>'
|
+ '<a class="dismiss" href="#">' + pluploadL10n.dismiss + '</a>'
|
||||||
+ '<strong>' + swfuploadL10n.error_uploading.replace('%s', filename) + '</strong><br />'
|
+ '<strong>' + pluploadL10n.error_uploading.replace('%s', filename) + '</strong><br />'
|
||||||
+ message
|
+ message
|
||||||
+ '</div>');
|
+ '</div>');
|
||||||
item.find('a.dismiss').click(function(){jQuery(this).parents('.media-item').slideUp(200, function(){jQuery(this).remove();})});
|
item.find('a.dismiss').click(function(){jQuery(this).parents('.media-item').slideUp(200, function(){jQuery(this).remove();})});
|
||||||
}
|
}
|
||||||
|
|
||||||
function fileQueueError(fileObj, error_code, message) {
|
|
||||||
// Handle this error separately because we don't want to create a FileProgress element for it.
|
|
||||||
if ( error_code == SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED ) {
|
|
||||||
wpQueueError(swfuploadL10n.queue_limit_exceeded);
|
|
||||||
}
|
|
||||||
else if ( error_code == SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT ) {
|
|
||||||
fileQueued(fileObj);
|
|
||||||
wpFileError(fileObj, swfuploadL10n.file_exceeds_size_limit);
|
|
||||||
}
|
|
||||||
else if ( error_code == SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE ) {
|
|
||||||
fileQueued(fileObj);
|
|
||||||
wpFileError(fileObj, swfuploadL10n.zero_byte_file);
|
|
||||||
}
|
|
||||||
else if ( error_code == SWFUpload.QUEUE_ERROR.INVALID_FILETYPE ) {
|
|
||||||
fileQueued(fileObj);
|
|
||||||
wpFileError(fileObj, swfuploadL10n.invalid_filetype);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
wpQueueError(swfuploadL10n.default_error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function fileDialogComplete(num_files_queued) {
|
|
||||||
try {
|
|
||||||
if (num_files_queued > 0) {
|
|
||||||
this.startUpload();
|
|
||||||
}
|
|
||||||
} catch (ex) {
|
|
||||||
this.debug(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function switchUploader(s) {
|
function switchUploader(s) {
|
||||||
var f = document.getElementById(swfu.customSettings.swfupload_element_id), h = document.getElementById(swfu.customSettings.degraded_element_id);
|
var p = document.getElementById('flash-upload-ui'), h = document.getElementById('html-upload-ui');
|
||||||
if ( s ) {
|
if ( s ) {
|
||||||
f.style.display = 'block';
|
p.style.display = 'block';
|
||||||
h.style.display = 'none';
|
h.style.display = 'none';
|
||||||
} else {
|
} else {
|
||||||
f.style.display = 'none';
|
p.style.display = 'none';
|
||||||
h.style.display = 'block';
|
h.style.display = 'block';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function dndHelper(s) {
|
||||||
|
var d = document.getElementById('dnd-helper');
|
||||||
|
if ( s ) {
|
||||||
|
d.style.display = 'block';
|
||||||
|
} else {
|
||||||
|
d.style.display = 'none';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function swfuploadPreLoad() {
|
function swfuploadPreLoad() {
|
||||||
if ( !uploaderMode ) {
|
if ( !uploaderMode ) {
|
||||||
switchUploader(1);
|
switchUploader(1);
|
||||||
|
@ -317,37 +335,49 @@ function swfuploadLoadFailed() {
|
||||||
function uploadError(fileObj, errorCode, message) {
|
function uploadError(fileObj, errorCode, message) {
|
||||||
|
|
||||||
switch (errorCode) {
|
switch (errorCode) {
|
||||||
case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:
|
case plupload.FAILED:
|
||||||
wpFileError(fileObj, swfuploadL10n.missing_upload_url);
|
wpFileError(fileObj, pluploadL10n.upload_failed);
|
||||||
break;
|
break;
|
||||||
case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
|
case plupload.FILE_EXTENSION_ERROR:
|
||||||
wpFileError(fileObj, swfuploadL10n.upload_limit_exceeded);
|
wpFileError(fileObj, pluploadL10n.invalid_filetype);
|
||||||
break;
|
break;
|
||||||
case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:
|
case plupload.FILE_SIZE_ERROR:
|
||||||
wpQueueError(swfuploadL10n.http_error);
|
wpFileError(fileObj, pluploadL10n.upload_limit_exceeded);
|
||||||
break;
|
break;
|
||||||
case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:
|
case plupload.IMAGE_FORMAT_ERROR:
|
||||||
wpQueueError(swfuploadL10n.upload_failed);
|
wpFileError(fileObj, pluploadL10n.not_an_image);
|
||||||
break;
|
break;
|
||||||
case SWFUpload.UPLOAD_ERROR.IO_ERROR:
|
case plupload.IMAGE_MEMORY_ERROR:
|
||||||
wpQueueError(swfuploadL10n.io_error);
|
wpFileError(fileObj, pluploadL10n.image_memory_exceeded);
|
||||||
break;
|
break;
|
||||||
case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:
|
case plupload.IMAGE_DIMENSIONS_ERROR:
|
||||||
wpQueueError(swfuploadL10n.security_error);
|
wpFileError(fileObj, pluploadL10n.image_dimensions_exceeded);
|
||||||
break;
|
break;
|
||||||
case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
|
case plupload.GENERIC_ERROR:
|
||||||
case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
|
wpQueueError(pluploadL10n.upload_failed);
|
||||||
|
break;
|
||||||
|
case plupload.IO_ERROR:
|
||||||
|
wpQueueError(pluploadL10n.io_error);
|
||||||
|
break;
|
||||||
|
case plupload.HTTP_ERROR:
|
||||||
|
wpQueueError(pluploadL10n.http_error);
|
||||||
|
break;
|
||||||
|
case plupload.INIT_ERROR:
|
||||||
|
switchUploader(0);
|
||||||
|
jQuery('.upload-html-bypass').hide();
|
||||||
|
break;
|
||||||
|
case plupload.SECURITY_ERROR:
|
||||||
|
wpQueueError(pluploadL10n.security_error);
|
||||||
|
break;
|
||||||
|
/* case plupload.UPLOAD_ERROR.UPLOAD_STOPPED:
|
||||||
|
case plupload.UPLOAD_ERROR.FILE_CANCELLED:
|
||||||
jQuery('#media-item-' + fileObj.id).remove();
|
jQuery('#media-item-' + fileObj.id).remove();
|
||||||
break;
|
break;*/
|
||||||
default:
|
default:
|
||||||
wpFileError(fileObj, swfuploadL10n.default_error);
|
wpFileError(fileObj, pluploadL10n.default_error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function cancelUpload() {
|
|
||||||
swfu.cancelQueue();
|
|
||||||
}
|
|
||||||
|
|
||||||
// remember the last used image size, alignment and url
|
// remember the last used image size, alignment and url
|
||||||
jQuery(document).ready(function($){
|
jQuery(document).ready(function($){
|
||||||
$('input[type="radio"]', '#media-items').live('click', function(){
|
$('input[type="radio"]', '#media-items').live('click', function(){
|
|
@ -0,0 +1,22 @@
|
||||||
|
var topWin=window.dialogArguments||opener||parent||top;function fileDialogStart(){jQuery("#media-upload-error").empty()}
|
||||||
|
function fileQueued(a){jQuery(".media-blank").remove();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("#media-items").append('<div id="media-item-'+a.id+'" class="media-item child-of-'+post_id+'"><div class="progress"><div class="bar"></div></div><div class="filename original"><span class="percent"></span> '+
|
||||||
|
a.name+"</div></div>");jQuery(".progress","#media-item-"+a.id).show();jQuery("#insert-gallery").attr("disabled","disabled");jQuery("#cancel-upload").attr("disabled","")}function uploadStart(){try{typeof topWin.tb_remove!="undefined"&&topWin.jQuery("#TB_overlay").unbind("click",topWin.tb_remove)}catch(a){}return!0}
|
||||||
|
function uploadProgress(a,b,c){var d=jQuery("#media-items").width()-2,a=jQuery("#media-item-"+a.id);jQuery(".bar",a).width(d*b/c);jQuery(".percent",a).html(Math.ceil(b/c*100)+"%");b==c&&jQuery(".bar",a).html('<strong class="crunching">'+pluploadL10n.crunching+"</strong>")}
|
||||||
|
function updateMediaForm(){var a=jQuery("form.type-form #media-items").children(),b=jQuery("#media-items").children();a.length==1&&jQuery(".slidetoggle",a).slideDown(500).siblings().addClass("hidden").filter(".toggle").toggle();b.not(".media-blank").length>0?jQuery(".savebutton").show():jQuery(".savebutton").hide();b.length>1?jQuery(".insert-gallery").show():jQuery(".insert-gallery").hide()}
|
||||||
|
function uploadSuccess(a,b){b.match("media-upload-error")?jQuery("#media-item-"+a.id).html(b):(prepareMediaItem(a,b),updateMediaForm(),jQuery("#media-item-"+a.id).hasClass("child-of-"+post_id)&&jQuery("#attachments-count").text(1*jQuery("#attachments-count").text()+1))}
|
||||||
|
function setResize(a){jQuery("#image_resize").prop("checked",a);a?(uploader.settings.resize={width:resize_width,height:resize_height,quality:100},uploader.settings.multipart_params.image_resize=!0):(uploader.settings.resize={},uploader.settings.multipart_params.image_resize=null)}
|
||||||
|
function prepareMediaItem(a,b){var c=typeof shortform=="undefined"?1:2,d=jQuery("#media-item-"+a.id);jQuery(".bar",d).remove();jQuery(".progress",d).hide();try{typeof topWin.tb_remove!="undefined"&&topWin.jQuery("#TB_overlay").click(topWin.tb_remove)}catch(e){}isNaN(b)||!b?(d.append(b),prepareMediaItemInit(a)):d.load("async-upload.php",{attachment_id:b,fetch:c},function(){prepareMediaItemInit(a);updateMediaForm()})}
|
||||||
|
function prepareMediaItemInit(a){var b=jQuery("#media-item-"+a.id);jQuery(".thumbnail",b).clone().attr("class","pinkynail toggle").prependTo(b);jQuery(".filename.original",b).replaceWith(jQuery(".filename.new",b));jQuery("a.toggle",b).click(function(){jQuery(this).siblings(".slidetoggle").slideToggle(350,function(){var a=jQuery(window).height(),b=jQuery(this).offset().top,e=jQuery(this).height(),f;a&&b&&e&&(f=b+e,f>a&&e+48<a?window.scrollBy(0,f-a+13):f>a&&window.scrollTo(0,b-36))});jQuery(this).siblings(".toggle").andSelf().toggle();
|
||||||
|
jQuery(this).siblings("a.toggle").focus();return!1});jQuery("a.delete",b).click(function(){jQuery.ajax({url:"admin-ajax.php",type:"post",success:deleteSuccess,error:deleteError,id:a.id,data:{id:this.id.replace(/[^0-9]/g,""),action:"trash-post",_ajax_nonce:this.href.replace(/^.*wpnonce=/,"")}});return!1});jQuery("a.undo",b).click(function(){jQuery.ajax({url:"admin-ajax.php",type:"post",id:a.id,data:{id:this.id.replace(/[^0-9]/g,""),action:"untrash-post",_ajax_nonce:this.href.replace(/^.*wpnonce=/,
|
||||||
|
"")},success:function(){var b=jQuery("#media-item-"+a.id);(type=jQuery("#type-of-"+a.id).val())&&jQuery("#"+type+"-counter").text(jQuery("#"+type+"-counter").text()-0+1);b.hasClass("child-of-"+post_id)&&jQuery("#attachments-count").text(jQuery("#attachments-count").text()-0+1);jQuery(".filename .trashnotice",b).remove();jQuery(".filename .title",b).css("font-weight","normal");jQuery("a.undo",b).addClass("hidden");jQuery("a.describe-toggle-on, .menu_order_input",b).show();b.css({backgroundColor:"#ceb"}).animate({backgroundColor:"#fff"},
|
||||||
|
{queue:!1,duration:500,complete:function(){jQuery(this).css({backgroundColor:""})}}).removeClass("undo")}});return!1});jQuery("#media-item-"+a.id+".startopen").removeClass("startopen").slideToggle(500).siblings(".toggle").toggle()}function cancelUpload(){uploader.stop();jQuery.each(uploader.files,function(a,b){b.status==plupload.STOPPED&&jQuery("#media-item-"+b.id).remove()})}function wpQueueError(a){jQuery("#media-upload-error").show().text(a)}
|
||||||
|
function wpFileError(a,b){var c=jQuery("#media-item-"+a.id),d=jQuery(".filename",c).text();c.html('<div class="error-div"><a class="dismiss" href="#">'+pluploadL10n.dismiss+"</a><strong>"+pluploadL10n.error_uploading.replace("%s",d)+"</strong><br />"+b+"</div>");c.find("a.dismiss").click(function(){jQuery(this).parents(".media-item").slideUp(200,function(){jQuery(this).remove()})})}
|
||||||
|
function itemAjaxError(a,b){var c=jQuery("#media-item-"+a),d=jQuery(".filename",c).text();c.html('<div class="error-div"><a class="dismiss" href="#">'+pluploadL10n.dismiss+"</a><strong>"+pluploadL10n.error_uploading.replace("%s",d)+"</strong><br />"+b+"</div>");c.find("a.dismiss").click(function(){jQuery(this).parents(".media-item").slideUp(200,function(){jQuery(this).remove()})})}
|
||||||
|
function deleteSuccess(a){if(a=="-1")return itemAjaxError(this.id,"You do not have permission. Has your session expired?");if(a=="0")return itemAjaxError(this.id,"Could not be deleted. Has it been deleted already?");var a=this.id,b=jQuery("#media-item-"+a);(type=jQuery("#type-of-"+a).val())&&jQuery("#"+type+"-counter").text(jQuery("#"+type+"-counter").text()-1);b.hasClass("child-of-"+post_id)&&jQuery("#attachments-count").text(jQuery("#attachments-count").text()-1);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",b).toggle();jQuery(".slidetoggle",b).slideUp(200).siblings().removeClass("hidden");b.css({backgroundColor:"#faa"}).animate({backgroundColor:"#f4f4f4"},{queue:!1,duration:500}).addClass("undo");jQuery(".filename:empty",b).remove();jQuery(".filename .title",b).css("font-weight","bold");jQuery(".filename",b).append('<span class="trashnotice"> '+
|
||||||
|
pluploadL10n.deleted+" </span>").siblings("a.toggle").hide();jQuery(".filename",b).append(jQuery("a.undo",b).removeClass("hidden"));jQuery(".menu_order_input",b).hide()}function deleteError(){}function uploadComplete(){swfu.getStats().files_queued==0&&(jQuery("#cancel-upload").attr("disabled","disabled"),jQuery("#insert-gallery").attr("disabled",""))}function wpQueueError(a){jQuery("#media-upload-error").show().text(a)}
|
||||||
|
function wpFileError(a,b){var c=jQuery("#media-item-"+a.id),d=jQuery(".filename",c).text();c.html('<div class="error-div"><a class="dismiss" href="#">'+pluploadL10n.dismiss+"</a><strong>"+pluploadL10n.error_uploading.replace("%s",d)+"</strong><br />"+b+"</div>");c.find("a.dismiss").click(function(){jQuery(this).parents(".media-item").slideUp(200,function(){jQuery(this).remove()})})}
|
||||||
|
function switchUploader(a){var b=document.getElementById("flash-upload-ui"),c=document.getElementById("html-upload-ui");a?(b.style.display="block",c.style.display="none"):(b.style.display="none",c.style.display="block")}function dndHelper(a){document.getElementById("dnd-helper").style.display=a?"block":"none"}function swfuploadPreLoad(){uploaderMode?switchUploader(0):switchUploader(1)}function swfuploadLoadFailed(){switchUploader(0);jQuery(".upload-html-bypass").hide()}
|
||||||
|
function uploadError(a,b){switch(b){case plupload.FAILED:wpFileError(a,pluploadL10n.upload_failed);break;case plupload.FILE_EXTENSION_ERROR:wpFileError(a,pluploadL10n.invalid_filetype);break;case plupload.FILE_SIZE_ERROR:wpFileError(a,pluploadL10n.upload_limit_exceeded);break;case plupload.IMAGE_FORMAT_ERROR:wpFileError(a,pluploadL10n.not_an_image);break;case plupload.IMAGE_MEMORY_ERROR:wpFileError(a,pluploadL10n.image_memory_exceeded);break;case plupload.IMAGE_DIMENSIONS_ERROR:wpFileError(a,pluploadL10n.image_dimensions_exceeded);
|
||||||
|
break;case plupload.GENERIC_ERROR:wpQueueError(pluploadL10n.upload_failed);break;case plupload.IO_ERROR:wpQueueError(pluploadL10n.io_error);break;case plupload.HTTP_ERROR:wpQueueError(pluploadL10n.http_error);break;case plupload.INIT_ERROR:switchUploader(0);jQuery(".upload-html-bypass").hide();break;case plupload.SECURITY_ERROR:wpQueueError(pluploadL10n.security_error);break;default:wpFileError(a,pluploadL10n.default_error)}}
|
||||||
|
jQuery(document).ready(function(a){a('input[type="radio"]',"#media-items").live("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").live("click",function(){var b=this.className||"";if((b=b.match(/url([^ '"]+)/))&&b[1])setUserSetting("urlbutton",b[1]),a(this).siblings(".urlfield").val(a(this).attr("title"))})});
|
|
@ -0,0 +1,339 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License.
|
|
@ -0,0 +1 @@
|
||||||
|
(function(f,b,d,e){var a={},g={};function c(){var h;try{h=navigator.plugins["Shockwave Flash"];h=h.description}catch(j){try{h=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(i){h="0.0"}}h=h.match(/\d+/g);return parseFloat(h[0]+"."+h[1])}d.flash={trigger:function(j,h,i){setTimeout(function(){var m=a[j],l,k;if(m){m.trigger("Flash:"+h,i)}},0)}};d.runtimes.Flash=d.addRuntime("flash",{getFeatures:function(){return{jpgresize:true,pngresize:true,maxWidth:8091,maxHeight:8091,chunks:true,progress:true,multipart:true}},init:function(j,o){var n,i,k,p=0,h=b.body;if(c()<10){o({success:false});return}g[j.id]=false;a[j.id]=j;n=b.getElementById(j.settings.browse_button);i=b.createElement("div");i.id=j.id+"_flash_container";d.extend(i.style,{position:"absolute",top:"0px",background:j.settings.shim_bgcolor||"transparent",zIndex:99999,width:"100%",height:"100%"});i.className="plupload flash";if(j.settings.container){h=b.getElementById(j.settings.container);if(d.getStyle(h,"position")==="static"){h.style.position="relative"}}h.appendChild(i);k="id="+escape(j.id);i.innerHTML='<object id="'+j.id+'_flash" width="100%" height="100%" style="outline:0" type="application/x-shockwave-flash" data="'+j.settings.flash_swf_url+'"><param name="movie" value="'+j.settings.flash_swf_url+'" /><param name="flashvars" value="'+k+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>';function m(){return b.getElementById(j.id+"_flash")}function l(){if(p++>5000){o({success:false});return}if(!g[j.id]){setTimeout(l,1)}}l();n=i=null;j.bind("Flash:Init",function(){var r={},q;m().setFileFilters(j.settings.filters,j.settings.multi_selection);if(g[j.id]){return}g[j.id]=true;j.bind("UploadFile",function(s,u){var v=s.settings,t=j.settings.resize||{};m().uploadFile(r[u.id],v.url,{name:u.target_name||u.name,mime:d.mimeTypes[u.name.replace(/^.+\.([^.]+)/,"$1").toLowerCase()]||"application/octet-stream",chunk_size:v.chunk_size,width:t.width,height:t.height,quality:t.quality,multipart:v.multipart,multipart_params:v.multipart_params||{},file_data_name:v.file_data_name,format:/\.(jpg|jpeg)$/i.test(u.name)?"jpg":"png",headers:v.headers,urlstream_upload:v.urlstream_upload})});j.bind("Flash:UploadProcess",function(t,s){var u=t.getFile(r[s.id]);if(u.status!=d.FAILED){u.loaded=s.loaded;u.size=s.size;t.trigger("UploadProgress",u)}});j.bind("Flash:UploadChunkComplete",function(s,u){var v,t=s.getFile(r[u.id]);v={chunk:u.chunk,chunks:u.chunks,response:u.text};s.trigger("ChunkUploaded",t,v);if(t.status!=d.FAILED){m().uploadNextChunk()}if(u.chunk==u.chunks-1){t.status=d.DONE;s.trigger("FileUploaded",t,{response:u.text})}});j.bind("Flash:SelectFiles",function(s,v){var u,t,w=[],x;for(t=0;t<v.length;t++){u=v[t];x=d.guid();r[x]=u.id;r[u.id]=x;w.push(new d.File(x,u.name,u.size))}if(w.length){j.trigger("FilesAdded",w)}});j.bind("Flash:SecurityError",function(s,t){j.trigger("Error",{code:d.SECURITY_ERROR,message:d.translate("Security error."),details:t.message,file:j.getFile(r[t.id])})});j.bind("Flash:GenericError",function(s,t){j.trigger("Error",{code:d.GENERIC_ERROR,message:d.translate("Generic error."),details:t.message,file:j.getFile(r[t.id])})});j.bind("Flash:IOError",function(s,t){j.trigger("Error",{code:d.IO_ERROR,message:d.translate("IO error."),details:t.message,file:j.getFile(r[t.id])})});j.bind("Flash:ImageError",function(s,t){j.trigger("Error",{code:parseInt(t.code,10),message:d.translate("Image error."),file:j.getFile(r[t.id])})});j.bind("Flash:StageEvent:rollOver",function(s){var t,u;t=b.getElementById(j.settings.browse_button);u=s.settings.browse_button_hover;if(t&&u){d.addClass(t,u)}});j.bind("Flash:StageEvent:rollOut",function(s){var t,u;t=b.getElementById(j.settings.browse_button);u=s.settings.browse_button_hover;if(t&&u){d.removeClass(t,u)}});j.bind("Flash:StageEvent:mouseDown",function(s){var t,u;t=b.getElementById(j.settings.browse_button);u=s.settings.browse_button_active;if(t&&u){d.addClass(t,u);d.addEvent(b.body,"mouseup",function(){d.removeClass(t,u)},s.id)}});j.bind("Flash:StageEvent:mouseUp",function(s){var t,u;t=b.getElementById(j.settings.browse_button);u=s.settings.browse_button_active;if(t&&u){d.removeClass(t,u)}});j.bind("QueueChanged",function(s){j.refresh()});j.bind("FilesRemoved",function(s,u){var t;for(t=0;t<u.length;t++){m().removeFile(r[u[t].id])}});j.bind("StateChanged",function(s){j.refresh()});j.bind("Refresh",function(s){var t,u,v;m().setFileFilters(j.settings.filters,j.settings.multi_selection);t=b.getElementById(s.settings.browse_button);if(t){u=d.getPos(t,b.getElementById(s.settings.container));v=d.getSize(t);d.extend(b.getElementById(s.id+"_flash_container").style,{top:u.y+"px",left:u.x+"px",width:v.w+"px",height:v.h+"px"})}});j.bind("Destroy",function(s){var t;d.removeAllEvents(b.body,s.id);delete g[s.id];delete a[s.id];t=b.getElementById(s.id+"_flash_container");if(t){h.removeChild(t)}});o({success:true})})}})})(window,document,plupload);
|
Binary file not shown.
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
||||||
|
(function(d,a,b,c){function e(f){return a.getElementById(f)}b.runtimes.Html4=b.addRuntime("html4",{getFeatures:function(){return{multipart:true,canOpenDialog:navigator.userAgent.indexOf("WebKit")!==-1}},init:function(f,g){f.bind("Init",function(p){var j=a.body,n,h="javascript",k,x,q,z=[],r=/MSIE/.test(navigator.userAgent),t=[],m=p.settings.filters,o,l,s,w;no_type_restriction:for(o=0;o<m.length;o++){l=m[o].extensions.split(/,/);for(w=0;w<l.length;w++){if(l[w]==="*"){t=[];break no_type_restriction}s=b.mimeTypes[l[w]];if(s){t.push(s)}}}t=t.join(",");function v(){var B,y,i,A;q=b.guid();z.push(q);B=a.createElement("form");B.setAttribute("id","form_"+q);B.setAttribute("method","post");B.setAttribute("enctype","multipart/form-data");B.setAttribute("encoding","multipart/form-data");B.setAttribute("target",p.id+"_iframe");B.style.position="absolute";y=a.createElement("input");y.setAttribute("id","input_"+q);y.setAttribute("type","file");y.setAttribute("accept",t);y.setAttribute("size",1);A=e(p.settings.browse_button);if(p.features.canOpenDialog&&A){b.addEvent(e(p.settings.browse_button),"click",function(C){y.click();C.preventDefault()},p.id)}b.extend(y.style,{width:"100%",height:"100%",opacity:0,fontSize:"99px"});b.extend(B.style,{overflow:"hidden"});i=p.settings.shim_bgcolor;if(i){B.style.background=i}if(r){b.extend(y.style,{filter:"alpha(opacity=0)"})}b.addEvent(y,"change",function(F){var D=F.target,C,E=[],G;if(D.value){e("form_"+q).style.top=-1048575+"px";C=D.value.replace(/\\/g,"/");C=C.substring(C.length,C.lastIndexOf("/")+1);E.push(new b.File(q,C));if(!p.features.canOpenDialog){b.removeAllEvents(B,p.id)}else{b.removeEvent(A,"click",p.id)}b.removeEvent(y,"change",p.id);v();if(E.length){f.trigger("FilesAdded",E)}}},p.id);B.appendChild(y);j.appendChild(B);p.refresh()}function u(){var i=a.createElement("div");i.innerHTML='<iframe id="'+p.id+'_iframe" name="'+p.id+'_iframe" src="'+h+':""" style="display:none"></iframe>';n=i.firstChild;j.appendChild(n);b.addEvent(n,"load",function(C){var D=C.target,B,y;if(!k){return}try{B=D.contentWindow.document||D.contentDocument||d.frames[D.id].document}catch(A){p.trigger("Error",{code:b.SECURITY_ERROR,message:b.translate("Security error."),file:k});return}y=B.documentElement.innerText||B.documentElement.textContent;if(y){k.status=b.DONE;k.loaded=1025;k.percent=100;p.trigger("UploadProgress",k);p.trigger("FileUploaded",k,{response:y})}},p.id)}if(p.settings.container){j=e(p.settings.container);if(b.getStyle(j,"position")==="static"){j.style.position="relative"}}p.bind("UploadFile",function(i,A){var B,y;if(A.status==b.DONE||A.status==b.FAILED||i.state==b.STOPPED){return}B=e("form_"+A.id);y=e("input_"+A.id);y.setAttribute("name",i.settings.file_data_name);B.setAttribute("action",i.settings.url);b.each(b.extend({name:A.target_name||A.name},i.settings.multipart_params),function(E,C){var D=a.createElement("input");b.extend(D,{type:"hidden",name:C,value:E});B.insertBefore(D,B.firstChild)});k=A;e("form_"+q).style.top=-1048575+"px";B.submit();B.parentNode.removeChild(B)});p.bind("FileUploaded",function(i){i.refresh()});p.bind("StateChanged",function(i){if(i.state==b.STARTED){u()}if(i.state==b.STOPPED){d.setTimeout(function(){b.removeEvent(n,"load",i.id);n.parentNode.removeChild(n)},0)}});p.bind("Refresh",function(A){var F,B,C,D,i,G,H,E,y;F=e(A.settings.browse_button);if(F){i=b.getPos(F,e(A.settings.container));G=b.getSize(F);H=e("form_"+q);E=e("input_"+q);b.extend(H.style,{top:i.y+"px",left:i.x+"px",width:G.w+"px",height:G.h+"px"});if(A.features.canOpenDialog){y=parseInt(F.parentNode.style.zIndex,10);if(isNaN(y)){y=0}b.extend(F.style,{zIndex:y});if(b.getStyle(F,"position")==="static"){b.extend(F.style,{position:"relative"})}b.extend(H.style,{zIndex:y-1})}C=A.settings.browse_button_hover;D=A.settings.browse_button_active;B=A.features.canOpenDialog?F:H;if(C){b.addEvent(B,"mouseover",function(){b.addClass(F,C)},A.id);b.addEvent(B,"mouseout",function(){b.removeClass(F,C)},A.id)}if(D){b.addEvent(B,"mousedown",function(){b.addClass(F,D)},A.id);b.addEvent(a.body,"mouseup",function(){b.removeClass(F,D)},A.id)}}});f.bind("FilesRemoved",function(y,B){var A,C;for(A=0;A<B.length;A++){C=e("form_"+B[A].id);if(C){C.parentNode.removeChild(C)}}});f.bind("Destroy",function(i){var y,A,B,C={inputContainer:"form_"+q,inputFile:"input_"+q,browseButton:i.settings.browse_button};for(y in C){A=e(C[y]);if(A){b.removeAllEvents(A,i.id)}}b.removeAllEvents(a.body,i.id);b.each(z,function(E,D){B=e("form_"+E);if(B){j.removeChild(B)}})});v()});g({success:true})}})})(window,document,plupload);
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
|
@ -1,32 +0,0 @@
|
||||||
/**
|
|
||||||
* SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
|
|
||||||
*
|
|
||||||
* mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/, http://www.vinterwebb.se/
|
|
||||||
*
|
|
||||||
* SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License:
|
|
||||||
* http://www.opensource.org/licenses/mit-license.php
|
|
||||||
*
|
|
||||||
* SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
|
|
||||||
* http://www.opensource.org/licenses/mit-license.php
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
The MIT License
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
|
@ -1,53 +0,0 @@
|
||||||
/*
|
|
||||||
Cookie Plug-in
|
|
||||||
|
|
||||||
This plug in automatically gets all the cookies for this site and adds them to the post_params.
|
|
||||||
Cookies are loaded only on initialization. The refreshCookies function can be called to update the post_params.
|
|
||||||
The cookies will override any other post params with the same name.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var SWFUpload;
|
|
||||||
if (typeof(SWFUpload) === "function") {
|
|
||||||
SWFUpload.prototype.initSettings = function (oldInitSettings) {
|
|
||||||
return function () {
|
|
||||||
if (typeof(oldInitSettings) === "function") {
|
|
||||||
oldInitSettings.call(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.refreshCookies(false); // The false parameter must be sent since SWFUpload has not initialzed at this point
|
|
||||||
};
|
|
||||||
}(SWFUpload.prototype.initSettings);
|
|
||||||
|
|
||||||
// refreshes the post_params and updates SWFUpload. The sendToFlash parameters is optional and defaults to True
|
|
||||||
SWFUpload.prototype.refreshCookies = function (sendToFlash) {
|
|
||||||
if (sendToFlash === undefined) {
|
|
||||||
sendToFlash = true;
|
|
||||||
}
|
|
||||||
sendToFlash = !!sendToFlash;
|
|
||||||
|
|
||||||
// Get the post_params object
|
|
||||||
var postParams = this.settings.post_params;
|
|
||||||
|
|
||||||
// Get the cookies
|
|
||||||
var i, cookieArray = document.cookie.split(';'), caLength = cookieArray.length, c, eqIndex, name, value;
|
|
||||||
for (i = 0; i < caLength; i++) {
|
|
||||||
c = cookieArray[i];
|
|
||||||
|
|
||||||
// Left Trim spaces
|
|
||||||
while (c.charAt(0) === " ") {
|
|
||||||
c = c.substring(1, c.length);
|
|
||||||
}
|
|
||||||
eqIndex = c.indexOf("=");
|
|
||||||
if (eqIndex > 0) {
|
|
||||||
name = c.substring(0, eqIndex);
|
|
||||||
value = c.substring(eqIndex + 1);
|
|
||||||
postParams[name] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sendToFlash) {
|
|
||||||
this.setPostParams(postParams);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,98 +0,0 @@
|
||||||
/*
|
|
||||||
Queue Plug-in
|
|
||||||
|
|
||||||
Features:
|
|
||||||
*Adds a cancelQueue() method for cancelling the entire queue.
|
|
||||||
*All queued files are uploaded when startUpload() is called.
|
|
||||||
*If false is returned from uploadComplete then the queue upload is stopped.
|
|
||||||
If false is not returned (strict comparison) then the queue upload is continued.
|
|
||||||
*Adds a QueueComplete event that is fired when all the queued files have finished uploading.
|
|
||||||
Set the event handler with the queue_complete_handler setting.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
var SWFUpload;
|
|
||||||
if (typeof(SWFUpload) === "function") {
|
|
||||||
SWFUpload.queue = {};
|
|
||||||
|
|
||||||
SWFUpload.prototype.initSettings = (function (oldInitSettings) {
|
|
||||||
return function () {
|
|
||||||
if (typeof(oldInitSettings) === "function") {
|
|
||||||
oldInitSettings.call(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.queueSettings = {};
|
|
||||||
|
|
||||||
this.queueSettings.queue_cancelled_flag = false;
|
|
||||||
this.queueSettings.queue_upload_count = 0;
|
|
||||||
|
|
||||||
this.queueSettings.user_upload_complete_handler = this.settings.upload_complete_handler;
|
|
||||||
this.queueSettings.user_upload_start_handler = this.settings.upload_start_handler;
|
|
||||||
this.settings.upload_complete_handler = SWFUpload.queue.uploadCompleteHandler;
|
|
||||||
this.settings.upload_start_handler = SWFUpload.queue.uploadStartHandler;
|
|
||||||
|
|
||||||
this.settings.queue_complete_handler = this.settings.queue_complete_handler || null;
|
|
||||||
};
|
|
||||||
})(SWFUpload.prototype.initSettings);
|
|
||||||
|
|
||||||
SWFUpload.prototype.startUpload = function (fileID) {
|
|
||||||
this.queueSettings.queue_cancelled_flag = false;
|
|
||||||
this.callFlash("StartUpload", [fileID]);
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.prototype.cancelQueue = function () {
|
|
||||||
this.queueSettings.queue_cancelled_flag = true;
|
|
||||||
this.stopUpload();
|
|
||||||
|
|
||||||
var stats = this.getStats();
|
|
||||||
while (stats.files_queued > 0) {
|
|
||||||
this.cancelUpload();
|
|
||||||
stats = this.getStats();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.queue.uploadStartHandler = function (file) {
|
|
||||||
var returnValue;
|
|
||||||
if (typeof(this.queueSettings.user_upload_start_handler) === "function") {
|
|
||||||
returnValue = this.queueSettings.user_upload_start_handler.call(this, file);
|
|
||||||
}
|
|
||||||
|
|
||||||
// To prevent upload a real "FALSE" value must be returned, otherwise default to a real "TRUE" value.
|
|
||||||
returnValue = (returnValue === false) ? false : true;
|
|
||||||
|
|
||||||
this.queueSettings.queue_cancelled_flag = !returnValue;
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.queue.uploadCompleteHandler = function (file) {
|
|
||||||
var user_upload_complete_handler = this.queueSettings.user_upload_complete_handler;
|
|
||||||
var continueUpload;
|
|
||||||
|
|
||||||
if (file.filestatus === SWFUpload.FILE_STATUS.COMPLETE) {
|
|
||||||
this.queueSettings.queue_upload_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof(user_upload_complete_handler) === "function") {
|
|
||||||
continueUpload = (user_upload_complete_handler.call(this, file) === false) ? false : true;
|
|
||||||
} else if (file.filestatus === SWFUpload.FILE_STATUS.QUEUED) {
|
|
||||||
// If the file was stopped and re-queued don't restart the upload
|
|
||||||
continueUpload = false;
|
|
||||||
} else {
|
|
||||||
continueUpload = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (continueUpload) {
|
|
||||||
var stats = this.getStats();
|
|
||||||
if (stats.files_queued > 0 && this.queueSettings.queue_cancelled_flag === false) {
|
|
||||||
this.startUpload();
|
|
||||||
} else if (this.queueSettings.queue_cancelled_flag === false) {
|
|
||||||
this.queueEvent("queue_complete_handler", [this.queueSettings.queue_upload_count]);
|
|
||||||
this.queueSettings.queue_upload_count = 0;
|
|
||||||
} else {
|
|
||||||
this.queueSettings.queue_cancelled_flag = false;
|
|
||||||
this.queueSettings.queue_upload_count = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,342 +0,0 @@
|
||||||
/*
|
|
||||||
Speed Plug-in
|
|
||||||
|
|
||||||
Features:
|
|
||||||
*Adds several properties to the 'file' object indicated upload speed, time left, upload time, etc.
|
|
||||||
- currentSpeed -- String indicating the upload speed, bytes per second
|
|
||||||
- averageSpeed -- Overall average upload speed, bytes per second
|
|
||||||
- movingAverageSpeed -- Speed over averaged over the last several measurements, bytes per second
|
|
||||||
- timeRemaining -- Estimated remaining upload time in seconds
|
|
||||||
- timeElapsed -- Number of seconds passed for this upload
|
|
||||||
- percentUploaded -- Percentage of the file uploaded (0 to 100)
|
|
||||||
- sizeUploaded -- Formatted size uploaded so far, bytes
|
|
||||||
|
|
||||||
*Adds setting 'moving_average_history_size' for defining the window size used to calculate the moving average speed.
|
|
||||||
|
|
||||||
*Adds several Formatting functions for formatting that values provided on the file object.
|
|
||||||
- SWFUpload.speed.formatBPS(bps) -- outputs string formatted in the best units (Gbps, Mbps, Kbps, bps)
|
|
||||||
- SWFUpload.speed.formatTime(seconds) -- outputs string formatted in the best units (x Hr y M z S)
|
|
||||||
- SWFUpload.speed.formatSize(bytes) -- outputs string formatted in the best units (w GB x MB y KB z B )
|
|
||||||
- SWFUpload.speed.formatPercent(percent) -- outputs string formatted with a percent sign (x.xx %)
|
|
||||||
- SWFUpload.speed.formatUnits(baseNumber, divisionArray, unitLabelArray, fractionalBoolean)
|
|
||||||
- Formats a number using the division array to determine how to apply the labels in the Label Array
|
|
||||||
- factionalBoolean indicates whether the number should be returned as a single fractional number with a unit (speed)
|
|
||||||
or as several numbers labeled with units (time)
|
|
||||||
*/
|
|
||||||
|
|
||||||
var SWFUpload;
|
|
||||||
if (typeof(SWFUpload) === "function") {
|
|
||||||
SWFUpload.speed = {};
|
|
||||||
|
|
||||||
SWFUpload.prototype.initSettings = (function (oldInitSettings) {
|
|
||||||
return function () {
|
|
||||||
if (typeof(oldInitSettings) === "function") {
|
|
||||||
oldInitSettings.call(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.ensureDefault = function (settingName, defaultValue) {
|
|
||||||
this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];
|
|
||||||
};
|
|
||||||
|
|
||||||
// List used to keep the speed stats for the files we are tracking
|
|
||||||
this.fileSpeedStats = {};
|
|
||||||
this.speedSettings = {};
|
|
||||||
|
|
||||||
this.ensureDefault("moving_average_history_size", "10");
|
|
||||||
|
|
||||||
this.speedSettings.user_file_queued_handler = this.settings.file_queued_handler;
|
|
||||||
this.speedSettings.user_file_queue_error_handler = this.settings.file_queue_error_handler;
|
|
||||||
this.speedSettings.user_upload_start_handler = this.settings.upload_start_handler;
|
|
||||||
this.speedSettings.user_upload_error_handler = this.settings.upload_error_handler;
|
|
||||||
this.speedSettings.user_upload_progress_handler = this.settings.upload_progress_handler;
|
|
||||||
this.speedSettings.user_upload_success_handler = this.settings.upload_success_handler;
|
|
||||||
this.speedSettings.user_upload_complete_handler = this.settings.upload_complete_handler;
|
|
||||||
|
|
||||||
this.settings.file_queued_handler = SWFUpload.speed.fileQueuedHandler;
|
|
||||||
this.settings.file_queue_error_handler = SWFUpload.speed.fileQueueErrorHandler;
|
|
||||||
this.settings.upload_start_handler = SWFUpload.speed.uploadStartHandler;
|
|
||||||
this.settings.upload_error_handler = SWFUpload.speed.uploadErrorHandler;
|
|
||||||
this.settings.upload_progress_handler = SWFUpload.speed.uploadProgressHandler;
|
|
||||||
this.settings.upload_success_handler = SWFUpload.speed.uploadSuccessHandler;
|
|
||||||
this.settings.upload_complete_handler = SWFUpload.speed.uploadCompleteHandler;
|
|
||||||
|
|
||||||
delete this.ensureDefault;
|
|
||||||
};
|
|
||||||
})(SWFUpload.prototype.initSettings);
|
|
||||||
|
|
||||||
|
|
||||||
SWFUpload.speed.fileQueuedHandler = function (file) {
|
|
||||||
if (typeof this.speedSettings.user_file_queued_handler === "function") {
|
|
||||||
file = SWFUpload.speed.extendFile(file);
|
|
||||||
|
|
||||||
return this.speedSettings.user_file_queued_handler.call(this, file);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.speed.fileQueueErrorHandler = function (file, errorCode, message) {
|
|
||||||
if (typeof this.speedSettings.user_file_queue_error_handler === "function") {
|
|
||||||
file = SWFUpload.speed.extendFile(file);
|
|
||||||
|
|
||||||
return this.speedSettings.user_file_queue_error_handler.call(this, file, errorCode, message);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.speed.uploadStartHandler = function (file) {
|
|
||||||
if (typeof this.speedSettings.user_upload_start_handler === "function") {
|
|
||||||
file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
|
|
||||||
return this.speedSettings.user_upload_start_handler.call(this, file);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.speed.uploadErrorHandler = function (file, errorCode, message) {
|
|
||||||
file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
|
|
||||||
SWFUpload.speed.removeTracking(file, this.fileSpeedStats);
|
|
||||||
|
|
||||||
if (typeof this.speedSettings.user_upload_error_handler === "function") {
|
|
||||||
return this.speedSettings.user_upload_error_handler.call(this, file, errorCode, message);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
SWFUpload.speed.uploadProgressHandler = function (file, bytesComplete, bytesTotal) {
|
|
||||||
this.updateTracking(file, bytesComplete);
|
|
||||||
file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
|
|
||||||
|
|
||||||
if (typeof this.speedSettings.user_upload_progress_handler === "function") {
|
|
||||||
return this.speedSettings.user_upload_progress_handler.call(this, file, bytesComplete, bytesTotal);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.speed.uploadSuccessHandler = function (file, serverData) {
|
|
||||||
if (typeof this.speedSettings.user_upload_success_handler === "function") {
|
|
||||||
file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
|
|
||||||
return this.speedSettings.user_upload_success_handler.call(this, file, serverData);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
SWFUpload.speed.uploadCompleteHandler = function (file) {
|
|
||||||
file = SWFUpload.speed.extendFile(file, this.fileSpeedStats);
|
|
||||||
SWFUpload.speed.removeTracking(file, this.fileSpeedStats);
|
|
||||||
|
|
||||||
if (typeof this.speedSettings.user_upload_complete_handler === "function") {
|
|
||||||
return this.speedSettings.user_upload_complete_handler.call(this, file);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Private: extends the file object with the speed plugin values
|
|
||||||
SWFUpload.speed.extendFile = function (file, trackingList) {
|
|
||||||
var tracking;
|
|
||||||
|
|
||||||
if (trackingList) {
|
|
||||||
tracking = trackingList[file.id];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tracking) {
|
|
||||||
file.currentSpeed = tracking.currentSpeed;
|
|
||||||
file.averageSpeed = tracking.averageSpeed;
|
|
||||||
file.movingAverageSpeed = tracking.movingAverageSpeed;
|
|
||||||
file.timeRemaining = tracking.timeRemaining;
|
|
||||||
file.timeElapsed = tracking.timeElapsed;
|
|
||||||
file.percentUploaded = tracking.percentUploaded;
|
|
||||||
file.sizeUploaded = tracking.bytesUploaded;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
file.currentSpeed = 0;
|
|
||||||
file.averageSpeed = 0;
|
|
||||||
file.movingAverageSpeed = 0;
|
|
||||||
file.timeRemaining = 0;
|
|
||||||
file.timeElapsed = 0;
|
|
||||||
file.percentUploaded = 0;
|
|
||||||
file.sizeUploaded = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return file;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Private: Updates the speed tracking object, or creates it if necessary
|
|
||||||
SWFUpload.prototype.updateTracking = function (file, bytesUploaded) {
|
|
||||||
var tracking = this.fileSpeedStats[file.id];
|
|
||||||
if (!tracking) {
|
|
||||||
this.fileSpeedStats[file.id] = tracking = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sanity check inputs
|
|
||||||
bytesUploaded = bytesUploaded || tracking.bytesUploaded || 0;
|
|
||||||
if (bytesUploaded < 0) {
|
|
||||||
bytesUploaded = 0;
|
|
||||||
}
|
|
||||||
if (bytesUploaded > file.size) {
|
|
||||||
bytesUploaded = file.size;
|
|
||||||
}
|
|
||||||
|
|
||||||
var tickTime = (new Date()).getTime();
|
|
||||||
if (!tracking.startTime) {
|
|
||||||
tracking.startTime = (new Date()).getTime();
|
|
||||||
tracking.lastTime = tracking.startTime;
|
|
||||||
tracking.currentSpeed = 0;
|
|
||||||
tracking.averageSpeed = 0;
|
|
||||||
tracking.movingAverageSpeed = 0;
|
|
||||||
tracking.movingAverageHistory = [];
|
|
||||||
tracking.timeRemaining = 0;
|
|
||||||
tracking.timeElapsed = 0;
|
|
||||||
tracking.percentUploaded = bytesUploaded / file.size;
|
|
||||||
tracking.bytesUploaded = bytesUploaded;
|
|
||||||
} else if (tracking.startTime > tickTime) {
|
|
||||||
this.debug("When backwards in time");
|
|
||||||
} else {
|
|
||||||
// Get time and deltas
|
|
||||||
var now = (new Date()).getTime();
|
|
||||||
var lastTime = tracking.lastTime;
|
|
||||||
var deltaTime = now - lastTime;
|
|
||||||
var deltaBytes = bytesUploaded - tracking.bytesUploaded;
|
|
||||||
|
|
||||||
if (deltaBytes === 0 || deltaTime === 0) {
|
|
||||||
return tracking;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update tracking object
|
|
||||||
tracking.lastTime = now;
|
|
||||||
tracking.bytesUploaded = bytesUploaded;
|
|
||||||
|
|
||||||
// Calculate speeds
|
|
||||||
tracking.currentSpeed = (deltaBytes * 8 ) / (deltaTime / 1000);
|
|
||||||
tracking.averageSpeed = (tracking.bytesUploaded * 8) / ((now - tracking.startTime) / 1000);
|
|
||||||
|
|
||||||
// Calculate moving average
|
|
||||||
tracking.movingAverageHistory.push(tracking.currentSpeed);
|
|
||||||
if (tracking.movingAverageHistory.length > this.settings.moving_average_history_size) {
|
|
||||||
tracking.movingAverageHistory.shift();
|
|
||||||
}
|
|
||||||
|
|
||||||
tracking.movingAverageSpeed = SWFUpload.speed.calculateMovingAverage(tracking.movingAverageHistory);
|
|
||||||
|
|
||||||
// Update times
|
|
||||||
tracking.timeRemaining = (file.size - tracking.bytesUploaded) * 8 / tracking.movingAverageSpeed;
|
|
||||||
tracking.timeElapsed = (now - tracking.startTime) / 1000;
|
|
||||||
|
|
||||||
// Update percent
|
|
||||||
tracking.percentUploaded = (tracking.bytesUploaded / file.size * 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
return tracking;
|
|
||||||
};
|
|
||||||
SWFUpload.speed.removeTracking = function (file, trackingList) {
|
|
||||||
try {
|
|
||||||
trackingList[file.id] = null;
|
|
||||||
delete trackingList[file.id];
|
|
||||||
} catch (ex) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.speed.formatUnits = function (baseNumber, unitDivisors, unitLabels, singleFractional) {
|
|
||||||
var i, unit, unitDivisor, unitLabel;
|
|
||||||
|
|
||||||
if (baseNumber === 0) {
|
|
||||||
return "0 " + unitLabels[unitLabels.length - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (singleFractional) {
|
|
||||||
unit = baseNumber;
|
|
||||||
unitLabel = unitLabels.length >= unitDivisors.length ? unitLabels[unitDivisors.length - 1] : "";
|
|
||||||
for (i = 0; i < unitDivisors.length; i++) {
|
|
||||||
if (baseNumber >= unitDivisors[i]) {
|
|
||||||
unit = (baseNumber / unitDivisors[i]).toFixed(2);
|
|
||||||
unitLabel = unitLabels.length >= i ? " " + unitLabels[i] : "";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return unit + unitLabel;
|
|
||||||
} else {
|
|
||||||
var formattedStrings = [];
|
|
||||||
var remainder = baseNumber;
|
|
||||||
|
|
||||||
for (i = 0; i < unitDivisors.length; i++) {
|
|
||||||
unitDivisor = unitDivisors[i];
|
|
||||||
unitLabel = unitLabels.length > i ? " " + unitLabels[i] : "";
|
|
||||||
|
|
||||||
unit = remainder / unitDivisor;
|
|
||||||
if (i < unitDivisors.length -1) {
|
|
||||||
unit = Math.floor(unit);
|
|
||||||
} else {
|
|
||||||
unit = unit.toFixed(2);
|
|
||||||
}
|
|
||||||
if (unit > 0) {
|
|
||||||
remainder = remainder % unitDivisor;
|
|
||||||
|
|
||||||
formattedStrings.push(unit + unitLabel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return formattedStrings.join(" ");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.speed.formatBPS = function (baseNumber) {
|
|
||||||
var bpsUnits = [1073741824, 1048576, 1024, 1], bpsUnitLabels = ["Gbps", "Mbps", "Kbps", "bps"];
|
|
||||||
return SWFUpload.speed.formatUnits(baseNumber, bpsUnits, bpsUnitLabels, true);
|
|
||||||
|
|
||||||
};
|
|
||||||
SWFUpload.speed.formatTime = function (baseNumber) {
|
|
||||||
var timeUnits = [86400, 3600, 60, 1], timeUnitLabels = ["d", "h", "m", "s"];
|
|
||||||
return SWFUpload.speed.formatUnits(baseNumber, timeUnits, timeUnitLabels, false);
|
|
||||||
|
|
||||||
};
|
|
||||||
SWFUpload.speed.formatBytes = function (baseNumber) {
|
|
||||||
var sizeUnits = [1073741824, 1048576, 1024, 1], sizeUnitLabels = ["GB", "MB", "KB", "bytes"];
|
|
||||||
return SWFUpload.speed.formatUnits(baseNumber, sizeUnits, sizeUnitLabels, true);
|
|
||||||
|
|
||||||
};
|
|
||||||
SWFUpload.speed.formatPercent = function (baseNumber) {
|
|
||||||
return baseNumber.toFixed(2) + " %";
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.speed.calculateMovingAverage = function (history) {
|
|
||||||
var vals = [], size, sum = 0.0, mean = 0.0, varianceTemp = 0.0, variance = 0.0, standardDev = 0.0;
|
|
||||||
var i;
|
|
||||||
var mSum = 0, mCount = 0;
|
|
||||||
|
|
||||||
size = history.length;
|
|
||||||
|
|
||||||
// Check for sufficient data
|
|
||||||
if (size >= 8) {
|
|
||||||
// Clone the array and Calculate sum of the values
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
vals[i] = history[i];
|
|
||||||
sum += vals[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
mean = sum / size;
|
|
||||||
|
|
||||||
// Calculate variance for the set
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
varianceTemp += Math.pow((vals[i] - mean), 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
variance = varianceTemp / size;
|
|
||||||
standardDev = Math.sqrt(variance);
|
|
||||||
|
|
||||||
//Standardize the Data
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
vals[i] = (vals[i] - mean) / standardDev;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate the average excluding outliers
|
|
||||||
var deviationRange = 2.0;
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
|
|
||||||
if (vals[i] <= deviationRange && vals[i] >= -deviationRange) {
|
|
||||||
mCount++;
|
|
||||||
mSum += history[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// Calculate the average (not enough data points to remove outliers)
|
|
||||||
mCount = size;
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
mSum += history[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return mSum / mCount;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,105 +0,0 @@
|
||||||
/*
|
|
||||||
SWFUpload.SWFObject Plugin
|
|
||||||
|
|
||||||
Summary:
|
|
||||||
This plugin uses SWFObject to embed SWFUpload dynamically in the page. SWFObject provides accurate Flash Player detection and DOM Ready loading.
|
|
||||||
This plugin replaces the Graceful Degradation plugin.
|
|
||||||
|
|
||||||
Features:
|
|
||||||
* swfupload_load_failed_hander event
|
|
||||||
* swfupload_pre_load_handler event
|
|
||||||
* minimum_flash_version setting (default: "9.0.28")
|
|
||||||
* SWFUpload.onload event for early loading
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
Provide handlers and settings as needed. When using the SWFUpload.SWFObject plugin you should initialize SWFUploading
|
|
||||||
in SWFUpload.onload rather than in window.onload. When initialized this way SWFUpload can load earlier preventing the UI flicker
|
|
||||||
that was seen using the Graceful Degradation plugin.
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
var swfu;
|
|
||||||
SWFUpload.onload = function () {
|
|
||||||
swfu = new SWFUpload({
|
|
||||||
minimum_flash_version: "9.0.28",
|
|
||||||
swfupload_pre_load_handler: swfuploadPreLoad,
|
|
||||||
swfupload_load_failed_handler: swfuploadLoadFailed
|
|
||||||
});
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
You must provide set minimum_flash_version setting to "8" if you are using SWFUpload for Flash Player 8.
|
|
||||||
The swfuploadLoadFailed event is only fired if the minimum version of Flash Player is not met. Other issues such as missing SWF files, browser bugs
|
|
||||||
or corrupt Flash Player installations will not trigger this event.
|
|
||||||
The swfuploadPreLoad event is fired as soon as the minimum version of Flash Player is found. It does not wait for SWFUpload to load and can
|
|
||||||
be used to prepare the SWFUploadUI and hide alternate content.
|
|
||||||
swfobject's onDomReady event is cross-browser safe but will default to the window.onload event when DOMReady is not supported by the browser.
|
|
||||||
Early DOM Loading is supported in major modern browsers but cannot be guaranteed for every browser ever made.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
// SWFObject v2.1 must be loaded
|
|
||||||
|
|
||||||
var SWFUpload;
|
|
||||||
if (typeof(SWFUpload) === "function") {
|
|
||||||
SWFUpload.onload = function () {};
|
|
||||||
|
|
||||||
swfobject.addDomLoadEvent(function () {
|
|
||||||
if (typeof(SWFUpload.onload) === "function") {
|
|
||||||
setTimeout(function(){SWFUpload.onload.call(window);}, 200);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
SWFUpload.prototype.initSettings = (function (oldInitSettings) {
|
|
||||||
return function () {
|
|
||||||
if (typeof(oldInitSettings) === "function") {
|
|
||||||
oldInitSettings.call(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.ensureDefault = function (settingName, defaultValue) {
|
|
||||||
this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];
|
|
||||||
};
|
|
||||||
|
|
||||||
this.ensureDefault("minimum_flash_version", "9.0.28");
|
|
||||||
this.ensureDefault("swfupload_pre_load_handler", null);
|
|
||||||
this.ensureDefault("swfupload_load_failed_handler", null);
|
|
||||||
|
|
||||||
delete this.ensureDefault;
|
|
||||||
|
|
||||||
};
|
|
||||||
})(SWFUpload.prototype.initSettings);
|
|
||||||
|
|
||||||
|
|
||||||
SWFUpload.prototype.loadFlash = function (oldLoadFlash) {
|
|
||||||
return function () {
|
|
||||||
var hasFlash = swfobject.hasFlashPlayerVersion(this.settings.minimum_flash_version);
|
|
||||||
|
|
||||||
if (hasFlash) {
|
|
||||||
this.queueEvent("swfupload_pre_load_handler");
|
|
||||||
if (typeof(oldLoadFlash) === "function") {
|
|
||||||
oldLoadFlash.call(this);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.queueEvent("swfupload_load_failed_handler");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}(SWFUpload.prototype.loadFlash);
|
|
||||||
|
|
||||||
SWFUpload.prototype.displayDebugInfo = function (oldDisplayDebugInfo) {
|
|
||||||
return function () {
|
|
||||||
if (typeof(oldDisplayDebugInfo) === "function") {
|
|
||||||
oldDisplayDebugInfo.call(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.debug(
|
|
||||||
[
|
|
||||||
"SWFUpload.SWFObject Plugin settings:", "\n",
|
|
||||||
"\t", "minimum_flash_version: ", this.settings.minimum_flash_version, "\n",
|
|
||||||
"\t", "swfupload_pre_load_handler assigned: ", (typeof(this.settings.swfupload_pre_load_handler) === "function").toString(), "\n",
|
|
||||||
"\t", "swfupload_load_failed_handler assigned: ", (typeof(this.settings.swfupload_load_failed_handler) === "function").toString(), "\n",
|
|
||||||
].join("")
|
|
||||||
);
|
|
||||||
};
|
|
||||||
}(SWFUpload.prototype.displayDebugInfo);
|
|
||||||
}
|
|
File diff suppressed because one or more lines are too long
|
@ -1,980 +0,0 @@
|
||||||
/**
|
|
||||||
* SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
|
|
||||||
*
|
|
||||||
* mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/, http://www.vinterwebb.se/
|
|
||||||
*
|
|
||||||
* SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License:
|
|
||||||
* http://www.opensource.org/licenses/mit-license.php
|
|
||||||
*
|
|
||||||
* SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
|
|
||||||
* http://www.opensource.org/licenses/mit-license.php
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* ******************* */
|
|
||||||
/* Constructor & Init */
|
|
||||||
/* ******************* */
|
|
||||||
var SWFUpload;
|
|
||||||
|
|
||||||
if (SWFUpload == undefined) {
|
|
||||||
SWFUpload = function (settings) {
|
|
||||||
this.initSWFUpload(settings);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
SWFUpload.prototype.initSWFUpload = function (settings) {
|
|
||||||
try {
|
|
||||||
this.customSettings = {}; // A container where developers can place their own settings associated with this instance.
|
|
||||||
this.settings = settings;
|
|
||||||
this.eventQueue = [];
|
|
||||||
this.movieName = "SWFUpload_" + SWFUpload.movieCount++;
|
|
||||||
this.movieElement = null;
|
|
||||||
|
|
||||||
|
|
||||||
// Setup global control tracking
|
|
||||||
SWFUpload.instances[this.movieName] = this;
|
|
||||||
|
|
||||||
// Load the settings. Load the Flash movie.
|
|
||||||
this.initSettings();
|
|
||||||
this.loadFlash();
|
|
||||||
this.displayDebugInfo();
|
|
||||||
} catch (ex) {
|
|
||||||
delete SWFUpload.instances[this.movieName];
|
|
||||||
throw ex;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* *************** */
|
|
||||||
/* Static Members */
|
|
||||||
/* *************** */
|
|
||||||
SWFUpload.instances = {};
|
|
||||||
SWFUpload.movieCount = 0;
|
|
||||||
SWFUpload.version = "2.2.0 2009-03-25";
|
|
||||||
SWFUpload.QUEUE_ERROR = {
|
|
||||||
QUEUE_LIMIT_EXCEEDED : -100,
|
|
||||||
FILE_EXCEEDS_SIZE_LIMIT : -110,
|
|
||||||
ZERO_BYTE_FILE : -120,
|
|
||||||
INVALID_FILETYPE : -130
|
|
||||||
};
|
|
||||||
SWFUpload.UPLOAD_ERROR = {
|
|
||||||
HTTP_ERROR : -200,
|
|
||||||
MISSING_UPLOAD_URL : -210,
|
|
||||||
IO_ERROR : -220,
|
|
||||||
SECURITY_ERROR : -230,
|
|
||||||
UPLOAD_LIMIT_EXCEEDED : -240,
|
|
||||||
UPLOAD_FAILED : -250,
|
|
||||||
SPECIFIED_FILE_ID_NOT_FOUND : -260,
|
|
||||||
FILE_VALIDATION_FAILED : -270,
|
|
||||||
FILE_CANCELLED : -280,
|
|
||||||
UPLOAD_STOPPED : -290
|
|
||||||
};
|
|
||||||
SWFUpload.FILE_STATUS = {
|
|
||||||
QUEUED : -1,
|
|
||||||
IN_PROGRESS : -2,
|
|
||||||
ERROR : -3,
|
|
||||||
COMPLETE : -4,
|
|
||||||
CANCELLED : -5
|
|
||||||
};
|
|
||||||
SWFUpload.BUTTON_ACTION = {
|
|
||||||
SELECT_FILE : -100,
|
|
||||||
SELECT_FILES : -110,
|
|
||||||
START_UPLOAD : -120
|
|
||||||
};
|
|
||||||
SWFUpload.CURSOR = {
|
|
||||||
ARROW : -1,
|
|
||||||
HAND : -2
|
|
||||||
};
|
|
||||||
SWFUpload.WINDOW_MODE = {
|
|
||||||
WINDOW : "window",
|
|
||||||
TRANSPARENT : "transparent",
|
|
||||||
OPAQUE : "opaque"
|
|
||||||
};
|
|
||||||
|
|
||||||
// Private: takes a URL, determines if it is relative and converts to an absolute URL
|
|
||||||
// using the current site. Only processes the URL if it can, otherwise returns the URL untouched
|
|
||||||
SWFUpload.completeURL = function(url) {
|
|
||||||
if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//)) {
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
|
|
||||||
var currentURL = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : "");
|
|
||||||
|
|
||||||
var indexSlash = window.location.pathname.lastIndexOf("/");
|
|
||||||
if (indexSlash <= 0) {
|
|
||||||
path = "/";
|
|
||||||
} else {
|
|
||||||
path = window.location.pathname.substr(0, indexSlash) + "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
return /*currentURL +*/ path + url;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* ******************** */
|
|
||||||
/* Instance Members */
|
|
||||||
/* ******************** */
|
|
||||||
|
|
||||||
// Private: initSettings ensures that all the
|
|
||||||
// settings are set, getting a default value if one was not assigned.
|
|
||||||
SWFUpload.prototype.initSettings = function () {
|
|
||||||
this.ensureDefault = function (settingName, defaultValue) {
|
|
||||||
this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];
|
|
||||||
};
|
|
||||||
|
|
||||||
// Upload backend settings
|
|
||||||
this.ensureDefault("upload_url", "");
|
|
||||||
this.ensureDefault("preserve_relative_urls", false);
|
|
||||||
this.ensureDefault("file_post_name", "Filedata");
|
|
||||||
this.ensureDefault("post_params", {});
|
|
||||||
this.ensureDefault("use_query_string", false);
|
|
||||||
this.ensureDefault("requeue_on_error", false);
|
|
||||||
this.ensureDefault("http_success", []);
|
|
||||||
this.ensureDefault("assume_success_timeout", 0);
|
|
||||||
|
|
||||||
// File Settings
|
|
||||||
this.ensureDefault("file_types", "*.*");
|
|
||||||
this.ensureDefault("file_types_description", "All Files");
|
|
||||||
this.ensureDefault("file_size_limit", 0); // Default zero means "unlimited"
|
|
||||||
this.ensureDefault("file_upload_limit", 0);
|
|
||||||
this.ensureDefault("file_queue_limit", 0);
|
|
||||||
|
|
||||||
// Flash Settings
|
|
||||||
this.ensureDefault("flash_url", "swfupload.swf");
|
|
||||||
this.ensureDefault("prevent_swf_caching", true);
|
|
||||||
|
|
||||||
// Button Settings
|
|
||||||
this.ensureDefault("button_image_url", "");
|
|
||||||
this.ensureDefault("button_width", 1);
|
|
||||||
this.ensureDefault("button_height", 1);
|
|
||||||
this.ensureDefault("button_text", "");
|
|
||||||
this.ensureDefault("button_text_style", "color: #000000; font-size: 16pt;");
|
|
||||||
this.ensureDefault("button_text_top_padding", 0);
|
|
||||||
this.ensureDefault("button_text_left_padding", 0);
|
|
||||||
this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES);
|
|
||||||
this.ensureDefault("button_disabled", false);
|
|
||||||
this.ensureDefault("button_placeholder_id", "");
|
|
||||||
this.ensureDefault("button_placeholder", null);
|
|
||||||
this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW);
|
|
||||||
this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW);
|
|
||||||
|
|
||||||
// Debug Settings
|
|
||||||
this.ensureDefault("debug", false);
|
|
||||||
this.settings.debug_enabled = this.settings.debug; // Here to maintain v2 API
|
|
||||||
|
|
||||||
// Event Handlers
|
|
||||||
this.settings.return_upload_start_handler = this.returnUploadStart;
|
|
||||||
this.ensureDefault("swfupload_loaded_handler", null);
|
|
||||||
this.ensureDefault("file_dialog_start_handler", null);
|
|
||||||
this.ensureDefault("file_queued_handler", null);
|
|
||||||
this.ensureDefault("file_queue_error_handler", null);
|
|
||||||
this.ensureDefault("file_dialog_complete_handler", null);
|
|
||||||
|
|
||||||
this.ensureDefault("upload_start_handler", null);
|
|
||||||
this.ensureDefault("upload_progress_handler", null);
|
|
||||||
this.ensureDefault("upload_error_handler", null);
|
|
||||||
this.ensureDefault("upload_success_handler", null);
|
|
||||||
this.ensureDefault("upload_complete_handler", null);
|
|
||||||
|
|
||||||
this.ensureDefault("debug_handler", this.debugMessage);
|
|
||||||
|
|
||||||
this.ensureDefault("custom_settings", {});
|
|
||||||
|
|
||||||
// Other settings
|
|
||||||
this.customSettings = this.settings.custom_settings;
|
|
||||||
|
|
||||||
// Update the flash url if needed
|
|
||||||
if (!!this.settings.prevent_swf_caching) {
|
|
||||||
this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.settings.preserve_relative_urls) {
|
|
||||||
//this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url); // Don't need to do this one since flash doesn't look at it
|
|
||||||
this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url);
|
|
||||||
this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete this.ensureDefault;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Private: loadFlash replaces the button_placeholder element with the flash movie.
|
|
||||||
SWFUpload.prototype.loadFlash = function () {
|
|
||||||
var targetElement, tempParent;
|
|
||||||
|
|
||||||
// Make sure an element with the ID we are going to use doesn't already exist
|
|
||||||
if (document.getElementById(this.movieName) !== null) {
|
|
||||||
throw "ID " + this.movieName + " is already in use. The Flash Object could not be added";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the element where we will be placing the flash movie
|
|
||||||
targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder;
|
|
||||||
|
|
||||||
if (targetElement == undefined) {
|
|
||||||
throw "Could not find the placeholder element: " + this.settings.button_placeholder_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append the container and load the flash
|
|
||||||
tempParent = document.createElement("div");
|
|
||||||
tempParent.innerHTML = this.getFlashHTML(); // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)
|
|
||||||
targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement);
|
|
||||||
|
|
||||||
// Fix IE Flash/Form bug
|
|
||||||
if (window[this.movieName] == undefined) {
|
|
||||||
window[this.movieName] = this.getMovieElement();
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
// Private: getFlashHTML generates the object tag needed to embed the flash in to the document
|
|
||||||
SWFUpload.prototype.getFlashHTML = function () {
|
|
||||||
// Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay
|
|
||||||
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">',
|
|
||||||
'<param name="wmode" value="', this.settings.button_window_mode, '" />',
|
|
||||||
'<param name="movie" value="', this.settings.flash_url, '" />',
|
|
||||||
'<param name="quality" value="high" />',
|
|
||||||
'<param name="menu" value="false" />',
|
|
||||||
'<param name="allowScriptAccess" value="always" />',
|
|
||||||
'<param name="flashvars" value="' + this.getFlashVars() + '" />',
|
|
||||||
'</object>'].join("");
|
|
||||||
};
|
|
||||||
|
|
||||||
// Private: getFlashVars builds the parameter string that will be passed
|
|
||||||
// to flash in the flashvars param.
|
|
||||||
SWFUpload.prototype.getFlashVars = function () {
|
|
||||||
// Build a string from the post param object
|
|
||||||
var paramString = this.buildParamString();
|
|
||||||
var httpSuccessString = this.settings.http_success.join(",");
|
|
||||||
|
|
||||||
// Build the parameter string
|
|
||||||
return ["movieName=", encodeURIComponent(this.movieName),
|
|
||||||
"&uploadURL=", encodeURIComponent(this.settings.upload_url),
|
|
||||||
"&useQueryString=", encodeURIComponent(this.settings.use_query_string),
|
|
||||||
"&requeueOnError=", encodeURIComponent(this.settings.requeue_on_error),
|
|
||||||
"&httpSuccess=", encodeURIComponent(httpSuccessString),
|
|
||||||
"&assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout),
|
|
||||||
"&params=", encodeURIComponent(paramString),
|
|
||||||
"&filePostName=", encodeURIComponent(this.settings.file_post_name),
|
|
||||||
"&fileTypes=", encodeURIComponent(this.settings.file_types),
|
|
||||||
"&fileTypesDescription=", encodeURIComponent(this.settings.file_types_description),
|
|
||||||
"&fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit),
|
|
||||||
"&fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit),
|
|
||||||
"&fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit),
|
|
||||||
"&debugEnabled=", encodeURIComponent(this.settings.debug_enabled),
|
|
||||||
"&buttonImageURL=", encodeURIComponent(this.settings.button_image_url),
|
|
||||||
"&buttonWidth=", encodeURIComponent(this.settings.button_width),
|
|
||||||
"&buttonHeight=", encodeURIComponent(this.settings.button_height),
|
|
||||||
"&buttonText=", encodeURIComponent(this.settings.button_text),
|
|
||||||
"&buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding),
|
|
||||||
"&buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding),
|
|
||||||
"&buttonTextStyle=", encodeURIComponent(this.settings.button_text_style),
|
|
||||||
"&buttonAction=", encodeURIComponent(this.settings.button_action),
|
|
||||||
"&buttonDisabled=", encodeURIComponent(this.settings.button_disabled),
|
|
||||||
"&buttonCursor=", encodeURIComponent(this.settings.button_cursor)
|
|
||||||
].join("");
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: getMovieElement retrieves the DOM reference to the Flash element added by SWFUpload
|
|
||||||
// The element is cached after the first lookup
|
|
||||||
SWFUpload.prototype.getMovieElement = function () {
|
|
||||||
if (this.movieElement == undefined) {
|
|
||||||
this.movieElement = document.getElementById(this.movieName);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.movieElement === null) {
|
|
||||||
throw "Could not find Flash element";
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.movieElement;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Private: buildParamString takes the name/value pairs in the post_params setting object
|
|
||||||
// and joins them up in to a string formatted "name=value&name=value"
|
|
||||||
SWFUpload.prototype.buildParamString = function () {
|
|
||||||
var postParams = this.settings.post_params;
|
|
||||||
var paramStringPairs = [];
|
|
||||||
|
|
||||||
if (typeof(postParams) === "object") {
|
|
||||||
for (var name in postParams) {
|
|
||||||
if (postParams.hasOwnProperty(name)) {
|
|
||||||
paramStringPairs.push(encodeURIComponent(name.toString()) + "=" + encodeURIComponent(postParams[name].toString()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return paramStringPairs.join("&");
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: Used to remove a SWFUpload instance from the page. This method strives to remove
|
|
||||||
// all references to the SWF, and other objects so memory is properly freed.
|
|
||||||
// Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state.
|
|
||||||
// Credits: Major improvements provided by steffen
|
|
||||||
SWFUpload.prototype.destroy = function () {
|
|
||||||
try {
|
|
||||||
// Make sure Flash is done before we try to remove it
|
|
||||||
this.cancelUpload(null, false);
|
|
||||||
|
|
||||||
|
|
||||||
// Remove the SWFUpload DOM nodes
|
|
||||||
var movieElement = null;
|
|
||||||
movieElement = this.getMovieElement();
|
|
||||||
|
|
||||||
if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
|
|
||||||
// Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround)
|
|
||||||
for (var i in movieElement) {
|
|
||||||
try {
|
|
||||||
if (typeof(movieElement[i]) === "function") {
|
|
||||||
movieElement[i] = null;
|
|
||||||
}
|
|
||||||
} catch (ex1) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the Movie Element from the page
|
|
||||||
try {
|
|
||||||
movieElement.parentNode.removeChild(movieElement);
|
|
||||||
} catch (ex) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove IE form fix reference
|
|
||||||
window[this.movieName] = null;
|
|
||||||
|
|
||||||
// Destroy other references
|
|
||||||
SWFUpload.instances[this.movieName] = null;
|
|
||||||
delete SWFUpload.instances[this.movieName];
|
|
||||||
|
|
||||||
this.movieElement = null;
|
|
||||||
this.settings = null;
|
|
||||||
this.customSettings = null;
|
|
||||||
this.eventQueue = null;
|
|
||||||
this.movieName = null;
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (ex2) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Public: displayDebugInfo prints out settings and configuration
|
|
||||||
// information about this SWFUpload instance.
|
|
||||||
// This function (and any references to it) can be deleted when placing
|
|
||||||
// SWFUpload in production.
|
|
||||||
SWFUpload.prototype.displayDebugInfo = function () {
|
|
||||||
this.debug(
|
|
||||||
[
|
|
||||||
"---SWFUpload Instance Info---\n",
|
|
||||||
"Version: ", SWFUpload.version, "\n",
|
|
||||||
"Movie Name: ", this.movieName, "\n",
|
|
||||||
"Settings:\n",
|
|
||||||
"\t", "upload_url: ", this.settings.upload_url, "\n",
|
|
||||||
"\t", "flash_url: ", this.settings.flash_url, "\n",
|
|
||||||
"\t", "use_query_string: ", this.settings.use_query_string.toString(), "\n",
|
|
||||||
"\t", "requeue_on_error: ", this.settings.requeue_on_error.toString(), "\n",
|
|
||||||
"\t", "http_success: ", this.settings.http_success.join(", "), "\n",
|
|
||||||
"\t", "assume_success_timeout: ", this.settings.assume_success_timeout, "\n",
|
|
||||||
"\t", "file_post_name: ", this.settings.file_post_name, "\n",
|
|
||||||
"\t", "post_params: ", this.settings.post_params.toString(), "\n",
|
|
||||||
"\t", "file_types: ", this.settings.file_types, "\n",
|
|
||||||
"\t", "file_types_description: ", this.settings.file_types_description, "\n",
|
|
||||||
"\t", "file_size_limit: ", this.settings.file_size_limit, "\n",
|
|
||||||
"\t", "file_upload_limit: ", this.settings.file_upload_limit, "\n",
|
|
||||||
"\t", "file_queue_limit: ", this.settings.file_queue_limit, "\n",
|
|
||||||
"\t", "debug: ", this.settings.debug.toString(), "\n",
|
|
||||||
|
|
||||||
"\t", "prevent_swf_caching: ", this.settings.prevent_swf_caching.toString(), "\n",
|
|
||||||
|
|
||||||
"\t", "button_placeholder_id: ", this.settings.button_placeholder_id.toString(), "\n",
|
|
||||||
"\t", "button_placeholder: ", (this.settings.button_placeholder ? "Set" : "Not Set"), "\n",
|
|
||||||
"\t", "button_image_url: ", this.settings.button_image_url.toString(), "\n",
|
|
||||||
"\t", "button_width: ", this.settings.button_width.toString(), "\n",
|
|
||||||
"\t", "button_height: ", this.settings.button_height.toString(), "\n",
|
|
||||||
"\t", "button_text: ", this.settings.button_text.toString(), "\n",
|
|
||||||
"\t", "button_text_style: ", this.settings.button_text_style.toString(), "\n",
|
|
||||||
"\t", "button_text_top_padding: ", this.settings.button_text_top_padding.toString(), "\n",
|
|
||||||
"\t", "button_text_left_padding: ", this.settings.button_text_left_padding.toString(), "\n",
|
|
||||||
"\t", "button_action: ", this.settings.button_action.toString(), "\n",
|
|
||||||
"\t", "button_disabled: ", this.settings.button_disabled.toString(), "\n",
|
|
||||||
|
|
||||||
"\t", "custom_settings: ", this.settings.custom_settings.toString(), "\n",
|
|
||||||
"Event Handlers:\n",
|
|
||||||
"\t", "swfupload_loaded_handler assigned: ", (typeof this.settings.swfupload_loaded_handler === "function").toString(), "\n",
|
|
||||||
"\t", "file_dialog_start_handler assigned: ", (typeof this.settings.file_dialog_start_handler === "function").toString(), "\n",
|
|
||||||
"\t", "file_queued_handler assigned: ", (typeof this.settings.file_queued_handler === "function").toString(), "\n",
|
|
||||||
"\t", "file_queue_error_handler assigned: ", (typeof this.settings.file_queue_error_handler === "function").toString(), "\n",
|
|
||||||
"\t", "upload_start_handler assigned: ", (typeof this.settings.upload_start_handler === "function").toString(), "\n",
|
|
||||||
"\t", "upload_progress_handler assigned: ", (typeof this.settings.upload_progress_handler === "function").toString(), "\n",
|
|
||||||
"\t", "upload_error_handler assigned: ", (typeof this.settings.upload_error_handler === "function").toString(), "\n",
|
|
||||||
"\t", "upload_success_handler assigned: ", (typeof this.settings.upload_success_handler === "function").toString(), "\n",
|
|
||||||
"\t", "upload_complete_handler assigned: ", (typeof this.settings.upload_complete_handler === "function").toString(), "\n",
|
|
||||||
"\t", "debug_handler assigned: ", (typeof this.settings.debug_handler === "function").toString(), "\n"
|
|
||||||
].join("")
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Note: addSetting and getSetting are no longer used by SWFUpload but are included
|
|
||||||
the maintain v2 API compatibility
|
|
||||||
*/
|
|
||||||
// Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used.
|
|
||||||
SWFUpload.prototype.addSetting = function (name, value, default_value) {
|
|
||||||
if (value == undefined) {
|
|
||||||
return (this.settings[name] = default_value);
|
|
||||||
} else {
|
|
||||||
return (this.settings[name] = value);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found.
|
|
||||||
SWFUpload.prototype.getSetting = function (name) {
|
|
||||||
if (this.settings[name] != undefined) {
|
|
||||||
return this.settings[name];
|
|
||||||
}
|
|
||||||
|
|
||||||
return "";
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Private: callFlash handles function calls made to the Flash element.
|
|
||||||
// Calls are made with a setTimeout for some functions to work around
|
|
||||||
// bugs in the ExternalInterface library.
|
|
||||||
SWFUpload.prototype.callFlash = function (functionName, argumentArray) {
|
|
||||||
argumentArray = argumentArray || [];
|
|
||||||
|
|
||||||
var movieElement = this.getMovieElement();
|
|
||||||
var returnValue, returnString;
|
|
||||||
|
|
||||||
// Flash's method if calling ExternalInterface methods (code adapted from MooTools).
|
|
||||||
try {
|
|
||||||
returnString = movieElement.CallFunction('<invoke name="' + functionName + '" returntype="javascript">' + __flash__argumentsToXML(argumentArray, 0) + '</invoke>');
|
|
||||||
returnValue = eval(returnString);
|
|
||||||
} catch (ex) {
|
|
||||||
throw "Call to " + functionName + " failed";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unescape file post param values
|
|
||||||
if (returnValue != undefined && typeof returnValue.post === "object") {
|
|
||||||
returnValue = this.unescapeFilePostParams(returnValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* *****************************
|
|
||||||
-- Flash control methods --
|
|
||||||
Your UI should use these
|
|
||||||
to operate SWFUpload
|
|
||||||
***************************** */
|
|
||||||
|
|
||||||
// WARNING: this function does not work in Flash Player 10
|
|
||||||
// Public: selectFile causes a File Selection Dialog window to appear. This
|
|
||||||
// dialog only allows 1 file to be selected.
|
|
||||||
SWFUpload.prototype.selectFile = function () {
|
|
||||||
this.callFlash("SelectFile");
|
|
||||||
};
|
|
||||||
|
|
||||||
// WARNING: this function does not work in Flash Player 10
|
|
||||||
// Public: selectFiles causes a File Selection Dialog window to appear/ This
|
|
||||||
// dialog allows the user to select any number of files
|
|
||||||
// Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names.
|
|
||||||
// If the selection name length is too long the dialog will fail in an unpredictable manner. There is no work-around
|
|
||||||
// for this bug.
|
|
||||||
SWFUpload.prototype.selectFiles = function () {
|
|
||||||
this.callFlash("SelectFiles");
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Public: startUpload starts uploading the first file in the queue unless
|
|
||||||
// the optional parameter 'fileID' specifies the ID
|
|
||||||
SWFUpload.prototype.startUpload = function (fileID) {
|
|
||||||
this.callFlash("StartUpload", [fileID]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: cancelUpload cancels any queued file. The fileID parameter may be the file ID or index.
|
|
||||||
// If you do not specify a fileID the current uploading file or first file in the queue is cancelled.
|
|
||||||
// If you do not want the uploadError event to trigger you can specify false for the triggerErrorEvent parameter.
|
|
||||||
SWFUpload.prototype.cancelUpload = function (fileID, triggerErrorEvent) {
|
|
||||||
if (triggerErrorEvent !== false) {
|
|
||||||
triggerErrorEvent = true;
|
|
||||||
}
|
|
||||||
this.callFlash("CancelUpload", [fileID, triggerErrorEvent]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: stopUpload stops the current upload and requeues the file at the beginning of the queue.
|
|
||||||
// If nothing is currently uploading then nothing happens.
|
|
||||||
SWFUpload.prototype.stopUpload = function () {
|
|
||||||
this.callFlash("StopUpload");
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ************************
|
|
||||||
* Settings methods
|
|
||||||
* These methods change the SWFUpload settings.
|
|
||||||
* SWFUpload settings should not be changed directly on the settings object
|
|
||||||
* since many of the settings need to be passed to Flash in order to take
|
|
||||||
* effect.
|
|
||||||
* *********************** */
|
|
||||||
|
|
||||||
// Public: getStats gets the file statistics object.
|
|
||||||
SWFUpload.prototype.getStats = function () {
|
|
||||||
return this.callFlash("GetStats");
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setStats changes the SWFUpload statistics. You shouldn't need to
|
|
||||||
// change the statistics but you can. Changing the statistics does not
|
|
||||||
// affect SWFUpload accept for the successful_uploads count which is used
|
|
||||||
// by the upload_limit setting to determine how many files the user may upload.
|
|
||||||
SWFUpload.prototype.setStats = function (statsObject) {
|
|
||||||
this.callFlash("SetStats", [statsObject]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: getFile retrieves a File object by ID or Index. If the file is
|
|
||||||
// not found then 'null' is returned.
|
|
||||||
SWFUpload.prototype.getFile = function (fileID) {
|
|
||||||
if (typeof(fileID) === "number") {
|
|
||||||
return this.callFlash("GetFileByIndex", [fileID]);
|
|
||||||
} else {
|
|
||||||
return this.callFlash("GetFile", [fileID]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: addFileParam sets a name/value pair that will be posted with the
|
|
||||||
// file specified by the Files ID. If the name already exists then the
|
|
||||||
// exiting value will be overwritten.
|
|
||||||
SWFUpload.prototype.addFileParam = function (fileID, name, value) {
|
|
||||||
return this.callFlash("AddFileParam", [fileID, name, value]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: removeFileParam removes a previously set (by addFileParam) name/value
|
|
||||||
// pair from the specified file.
|
|
||||||
SWFUpload.prototype.removeFileParam = function (fileID, name) {
|
|
||||||
this.callFlash("RemoveFileParam", [fileID, name]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setUploadUrl changes the upload_url setting.
|
|
||||||
SWFUpload.prototype.setUploadURL = function (url) {
|
|
||||||
this.settings.upload_url = url.toString();
|
|
||||||
this.callFlash("SetUploadURL", [url]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setPostParams changes the post_params setting
|
|
||||||
SWFUpload.prototype.setPostParams = function (paramsObject) {
|
|
||||||
this.settings.post_params = paramsObject;
|
|
||||||
this.callFlash("SetPostParams", [paramsObject]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: addPostParam adds post name/value pair. Each name can have only one value.
|
|
||||||
SWFUpload.prototype.addPostParam = function (name, value) {
|
|
||||||
this.settings.post_params[name] = value;
|
|
||||||
this.callFlash("SetPostParams", [this.settings.post_params]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: removePostParam deletes post name/value pair.
|
|
||||||
SWFUpload.prototype.removePostParam = function (name) {
|
|
||||||
delete this.settings.post_params[name];
|
|
||||||
this.callFlash("SetPostParams", [this.settings.post_params]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setFileTypes changes the file_types setting and the file_types_description setting
|
|
||||||
SWFUpload.prototype.setFileTypes = function (types, description) {
|
|
||||||
this.settings.file_types = types;
|
|
||||||
this.settings.file_types_description = description;
|
|
||||||
this.callFlash("SetFileTypes", [types, description]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setFileSizeLimit changes the file_size_limit setting
|
|
||||||
SWFUpload.prototype.setFileSizeLimit = function (fileSizeLimit) {
|
|
||||||
this.settings.file_size_limit = fileSizeLimit;
|
|
||||||
this.callFlash("SetFileSizeLimit", [fileSizeLimit]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setFileUploadLimit changes the file_upload_limit setting
|
|
||||||
SWFUpload.prototype.setFileUploadLimit = function (fileUploadLimit) {
|
|
||||||
this.settings.file_upload_limit = fileUploadLimit;
|
|
||||||
this.callFlash("SetFileUploadLimit", [fileUploadLimit]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setFileQueueLimit changes the file_queue_limit setting
|
|
||||||
SWFUpload.prototype.setFileQueueLimit = function (fileQueueLimit) {
|
|
||||||
this.settings.file_queue_limit = fileQueueLimit;
|
|
||||||
this.callFlash("SetFileQueueLimit", [fileQueueLimit]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setFilePostName changes the file_post_name setting
|
|
||||||
SWFUpload.prototype.setFilePostName = function (filePostName) {
|
|
||||||
this.settings.file_post_name = filePostName;
|
|
||||||
this.callFlash("SetFilePostName", [filePostName]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setUseQueryString changes the use_query_string setting
|
|
||||||
SWFUpload.prototype.setUseQueryString = function (useQueryString) {
|
|
||||||
this.settings.use_query_string = useQueryString;
|
|
||||||
this.callFlash("SetUseQueryString", [useQueryString]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setRequeueOnError changes the requeue_on_error setting
|
|
||||||
SWFUpload.prototype.setRequeueOnError = function (requeueOnError) {
|
|
||||||
this.settings.requeue_on_error = requeueOnError;
|
|
||||||
this.callFlash("SetRequeueOnError", [requeueOnError]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setHTTPSuccess changes the http_success setting
|
|
||||||
SWFUpload.prototype.setHTTPSuccess = function (http_status_codes) {
|
|
||||||
if (typeof http_status_codes === "string") {
|
|
||||||
http_status_codes = http_status_codes.replace(" ", "").split(",");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.settings.http_success = http_status_codes;
|
|
||||||
this.callFlash("SetHTTPSuccess", [http_status_codes]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setHTTPSuccess changes the http_success setting
|
|
||||||
SWFUpload.prototype.setAssumeSuccessTimeout = function (timeout_seconds) {
|
|
||||||
this.settings.assume_success_timeout = timeout_seconds;
|
|
||||||
this.callFlash("SetAssumeSuccessTimeout", [timeout_seconds]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setDebugEnabled changes the debug_enabled setting
|
|
||||||
SWFUpload.prototype.setDebugEnabled = function (debugEnabled) {
|
|
||||||
this.settings.debug_enabled = debugEnabled;
|
|
||||||
this.callFlash("SetDebugEnabled", [debugEnabled]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setButtonImageURL loads a button image sprite
|
|
||||||
SWFUpload.prototype.setButtonImageURL = function (buttonImageURL) {
|
|
||||||
if (buttonImageURL == undefined) {
|
|
||||||
buttonImageURL = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
this.settings.button_image_url = buttonImageURL;
|
|
||||||
this.callFlash("SetButtonImageURL", [buttonImageURL]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setButtonDimensions resizes the Flash Movie and button
|
|
||||||
SWFUpload.prototype.setButtonDimensions = function (width, height) {
|
|
||||||
this.settings.button_width = width;
|
|
||||||
this.settings.button_height = height;
|
|
||||||
|
|
||||||
var movie = this.getMovieElement();
|
|
||||||
if (movie != undefined) {
|
|
||||||
movie.style.width = width + "px";
|
|
||||||
movie.style.height = height + "px";
|
|
||||||
}
|
|
||||||
|
|
||||||
this.callFlash("SetButtonDimensions", [width, height]);
|
|
||||||
};
|
|
||||||
// Public: setButtonText Changes the text overlaid on the button
|
|
||||||
SWFUpload.prototype.setButtonText = function (html) {
|
|
||||||
this.settings.button_text = html;
|
|
||||||
this.callFlash("SetButtonText", [html]);
|
|
||||||
};
|
|
||||||
// Public: setButtonTextPadding changes the top and left padding of the text overlay
|
|
||||||
SWFUpload.prototype.setButtonTextPadding = function (left, top) {
|
|
||||||
this.settings.button_text_top_padding = top;
|
|
||||||
this.settings.button_text_left_padding = left;
|
|
||||||
this.callFlash("SetButtonTextPadding", [left, top]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setButtonTextStyle changes the CSS used to style the HTML/Text overlaid on the button
|
|
||||||
SWFUpload.prototype.setButtonTextStyle = function (css) {
|
|
||||||
this.settings.button_text_style = css;
|
|
||||||
this.callFlash("SetButtonTextStyle", [css]);
|
|
||||||
};
|
|
||||||
// Public: setButtonDisabled disables/enables the button
|
|
||||||
SWFUpload.prototype.setButtonDisabled = function (isDisabled) {
|
|
||||||
this.settings.button_disabled = isDisabled;
|
|
||||||
this.callFlash("SetButtonDisabled", [isDisabled]);
|
|
||||||
};
|
|
||||||
// Public: setButtonAction sets the action that occurs when the button is clicked
|
|
||||||
SWFUpload.prototype.setButtonAction = function (buttonAction) {
|
|
||||||
this.settings.button_action = buttonAction;
|
|
||||||
this.callFlash("SetButtonAction", [buttonAction]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Public: setButtonCursor changes the mouse cursor displayed when hovering over the button
|
|
||||||
SWFUpload.prototype.setButtonCursor = function (cursor) {
|
|
||||||
this.settings.button_cursor = cursor;
|
|
||||||
this.callFlash("SetButtonCursor", [cursor]);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* *******************************
|
|
||||||
Flash Event Interfaces
|
|
||||||
These functions are used by Flash to trigger the various
|
|
||||||
events.
|
|
||||||
|
|
||||||
All these functions a Private.
|
|
||||||
|
|
||||||
Because the ExternalInterface library is buggy the event calls
|
|
||||||
are added to a queue and the queue then executed by a setTimeout.
|
|
||||||
This ensures that events are executed in a determinate order and that
|
|
||||||
the ExternalInterface bugs are avoided.
|
|
||||||
******************************* */
|
|
||||||
|
|
||||||
SWFUpload.prototype.queueEvent = function (handlerName, argumentArray) {
|
|
||||||
// Warning: Don't call this.debug inside here or you'll create an infinite loop
|
|
||||||
|
|
||||||
if (argumentArray == undefined) {
|
|
||||||
argumentArray = [];
|
|
||||||
} else if (!(argumentArray instanceof Array)) {
|
|
||||||
argumentArray = [argumentArray];
|
|
||||||
}
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
if (typeof this.settings[handlerName] === "function") {
|
|
||||||
// Queue the event
|
|
||||||
this.eventQueue.push(function () {
|
|
||||||
this.settings[handlerName].apply(this, argumentArray);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Execute the next queued event
|
|
||||||
setTimeout(function () {
|
|
||||||
self.executeNextEvent();
|
|
||||||
}, 0);
|
|
||||||
|
|
||||||
} else if (this.settings[handlerName] !== null) {
|
|
||||||
throw "Event handler " + handlerName + " is unknown or is not a function";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Private: Causes the next event in the queue to be executed. Since events are queued using a setTimeout
|
|
||||||
// we must queue them in order to garentee that they are executed in order.
|
|
||||||
SWFUpload.prototype.executeNextEvent = function () {
|
|
||||||
// Warning: Don't call this.debug inside here or you'll create an infinite loop
|
|
||||||
|
|
||||||
var f = this.eventQueue ? this.eventQueue.shift() : null;
|
|
||||||
if (typeof(f) === "function") {
|
|
||||||
f.apply(this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Private: unescapeFileParams is part of a workaround for a flash bug where objects passed through ExternalInterface cannot have
|
|
||||||
// properties that contain characters that are not valid for JavaScript identifiers. To work around this
|
|
||||||
// the Flash Component escapes the parameter names and we must unescape again before passing them along.
|
|
||||||
SWFUpload.prototype.unescapeFilePostParams = function (file) {
|
|
||||||
var reg = /[$]([0-9a-f]{4})/i;
|
|
||||||
var unescapedPost = {};
|
|
||||||
var uk;
|
|
||||||
|
|
||||||
if (file != undefined) {
|
|
||||||
for (var k in file.post) {
|
|
||||||
if (file.post.hasOwnProperty(k)) {
|
|
||||||
uk = k;
|
|
||||||
var match;
|
|
||||||
while ((match = reg.exec(uk)) !== null) {
|
|
||||||
uk = uk.replace(match[0], String.fromCharCode(parseInt("0x" + match[1], 16)));
|
|
||||||
}
|
|
||||||
unescapedPost[uk] = file.post[k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
file.post = unescapedPost;
|
|
||||||
}
|
|
||||||
|
|
||||||
return file;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Private: Called by Flash to see if JS can call in to Flash (test if External Interface is working)
|
|
||||||
SWFUpload.prototype.testExternalInterface = function () {
|
|
||||||
try {
|
|
||||||
return this.callFlash("TestExternalInterface");
|
|
||||||
} catch (ex) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Private: This event is called by Flash when it has finished loading. Don't modify this.
|
|
||||||
// Use the swfupload_loaded_handler event setting to execute custom code when SWFUpload has loaded.
|
|
||||||
SWFUpload.prototype.flashReady = function () {
|
|
||||||
// Check that the movie element is loaded correctly with its ExternalInterface methods defined
|
|
||||||
var movieElement = this.getMovieElement();
|
|
||||||
|
|
||||||
if (!movieElement) {
|
|
||||||
this.debug("Flash called back ready but the flash movie can't be found.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.cleanUp(movieElement);
|
|
||||||
|
|
||||||
this.queueEvent("swfupload_loaded_handler");
|
|
||||||
};
|
|
||||||
|
|
||||||
// Private: removes Flash added fuctions to the DOM node to prevent memory leaks in IE.
|
|
||||||
// This function is called by Flash each time the ExternalInterface functions are created.
|
|
||||||
SWFUpload.prototype.cleanUp = function (movieElement) {
|
|
||||||
// Pro-actively unhook all the Flash functions
|
|
||||||
try {
|
|
||||||
if (this.movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
|
|
||||||
this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");
|
|
||||||
for (var key in movieElement) {
|
|
||||||
try {
|
|
||||||
if (typeof(movieElement[key]) === "function") {
|
|
||||||
movieElement[key] = null;
|
|
||||||
}
|
|
||||||
} catch (ex) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (ex1) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fix Flashes own cleanup code so if the SWFMovie was removed from the page
|
|
||||||
// it doesn't display errors.
|
|
||||||
window["__flash__removeCallback"] = function (instance, name) {
|
|
||||||
try {
|
|
||||||
if (instance) {
|
|
||||||
instance[name] = null;
|
|
||||||
}
|
|
||||||
} catch (flashEx) {
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* This is a chance to do something before the browse window opens */
|
|
||||||
SWFUpload.prototype.fileDialogStart = function () {
|
|
||||||
this.queueEvent("file_dialog_start_handler");
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* Called when a file is successfully added to the queue. */
|
|
||||||
SWFUpload.prototype.fileQueued = function (file) {
|
|
||||||
file = this.unescapeFilePostParams(file);
|
|
||||||
this.queueEvent("file_queued_handler", file);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* Handle errors that occur when an attempt to queue a file fails. */
|
|
||||||
SWFUpload.prototype.fileQueueError = function (file, errorCode, message) {
|
|
||||||
file = this.unescapeFilePostParams(file);
|
|
||||||
this.queueEvent("file_queue_error_handler", [file, errorCode, message]);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Called after the file dialog has closed and the selected files have been queued.
|
|
||||||
You could call startUpload here if you want the queued files to begin uploading immediately. */
|
|
||||||
SWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued, numFilesInQueue) {
|
|
||||||
this.queueEvent("file_dialog_complete_handler", [numFilesSelected, numFilesQueued, numFilesInQueue]);
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.prototype.uploadStart = function (file) {
|
|
||||||
file = this.unescapeFilePostParams(file);
|
|
||||||
this.queueEvent("return_upload_start_handler", file);
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.prototype.returnUploadStart = function (file) {
|
|
||||||
var returnValue;
|
|
||||||
if (typeof this.settings.upload_start_handler === "function") {
|
|
||||||
file = this.unescapeFilePostParams(file);
|
|
||||||
returnValue = this.settings.upload_start_handler.call(this, file);
|
|
||||||
} else if (this.settings.upload_start_handler != undefined) {
|
|
||||||
throw "upload_start_handler must be a function";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert undefined to true so if nothing is returned from the upload_start_handler it is
|
|
||||||
// interpretted as 'true'.
|
|
||||||
if (returnValue === undefined) {
|
|
||||||
returnValue = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
returnValue = !!returnValue;
|
|
||||||
|
|
||||||
this.callFlash("ReturnUploadStart", [returnValue]);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SWFUpload.prototype.uploadProgress = function (file, bytesComplete, bytesTotal) {
|
|
||||||
file = this.unescapeFilePostParams(file);
|
|
||||||
this.queueEvent("upload_progress_handler", [file, bytesComplete, bytesTotal]);
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.prototype.uploadError = function (file, errorCode, message) {
|
|
||||||
file = this.unescapeFilePostParams(file);
|
|
||||||
this.queueEvent("upload_error_handler", [file, errorCode, message]);
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.prototype.uploadSuccess = function (file, serverData, responseReceived) {
|
|
||||||
file = this.unescapeFilePostParams(file);
|
|
||||||
this.queueEvent("upload_success_handler", [file, serverData, responseReceived]);
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.prototype.uploadComplete = function (file) {
|
|
||||||
file = this.unescapeFilePostParams(file);
|
|
||||||
this.queueEvent("upload_complete_handler", file);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Called by SWFUpload JavaScript and Flash functions when debug is enabled. By default it writes messages to the
|
|
||||||
internal debug console. You can override this event and have messages written where you want. */
|
|
||||||
SWFUpload.prototype.debug = function (message) {
|
|
||||||
this.queueEvent("debug_handler", message);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* **********************************
|
|
||||||
Debug Console
|
|
||||||
The debug console is a self contained, in page location
|
|
||||||
for debug message to be sent. The Debug Console adds
|
|
||||||
itself to the body if necessary.
|
|
||||||
|
|
||||||
The console is automatically scrolled as messages appear.
|
|
||||||
|
|
||||||
If you are using your own debug handler or when you deploy to production and
|
|
||||||
have debug disabled you can remove these functions to reduce the file size
|
|
||||||
and complexity.
|
|
||||||
********************************** */
|
|
||||||
|
|
||||||
// Private: debugMessage is the default debug_handler. If you want to print debug messages
|
|
||||||
// call the debug() function. When overriding the function your own function should
|
|
||||||
// check to see if the debug setting is true before outputting debug information.
|
|
||||||
SWFUpload.prototype.debugMessage = function (message) {
|
|
||||||
if (this.settings.debug) {
|
|
||||||
var exceptionMessage, exceptionValues = [];
|
|
||||||
|
|
||||||
// Check for an exception object and print it nicely
|
|
||||||
if (typeof message === "object" && typeof message.name === "string" && typeof message.message === "string") {
|
|
||||||
for (var key in message) {
|
|
||||||
if (message.hasOwnProperty(key)) {
|
|
||||||
exceptionValues.push(key + ": " + message[key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exceptionMessage = exceptionValues.join("\n") || "";
|
|
||||||
exceptionValues = exceptionMessage.split("\n");
|
|
||||||
exceptionMessage = "EXCEPTION: " + exceptionValues.join("\nEXCEPTION: ");
|
|
||||||
SWFUpload.Console.writeLine(exceptionMessage);
|
|
||||||
} else {
|
|
||||||
SWFUpload.Console.writeLine(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
SWFUpload.Console = {};
|
|
||||||
SWFUpload.Console.writeLine = function (message) {
|
|
||||||
var console, documentForm;
|
|
||||||
|
|
||||||
try {
|
|
||||||
console = document.getElementById("SWFUpload_Console");
|
|
||||||
|
|
||||||
if (!console) {
|
|
||||||
documentForm = document.createElement("form");
|
|
||||||
document.getElementsByTagName("body")[0].appendChild(documentForm);
|
|
||||||
|
|
||||||
console = document.createElement("textarea");
|
|
||||||
console.id = "SWFUpload_Console";
|
|
||||||
console.style.fontFamily = "monospace";
|
|
||||||
console.setAttribute("wrap", "off");
|
|
||||||
console.wrap = "off";
|
|
||||||
console.style.overflow = "auto";
|
|
||||||
console.style.width = "700px";
|
|
||||||
console.style.height = "350px";
|
|
||||||
console.style.margin = "5px";
|
|
||||||
documentForm.appendChild(console);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.value += message + "\n";
|
|
||||||
|
|
||||||
console.scrollTop = console.scrollHeight - console.clientHeight;
|
|
||||||
} catch (ex) {
|
|
||||||
alert("Exception: " + ex.name + " Message: " + ex.message);
|
|
||||||
}
|
|
||||||
};
|
|
Binary file not shown.
|
@ -49,7 +49,7 @@
|
||||||
background: #ffffff;
|
background: #ffffff;
|
||||||
z-index: 102;
|
z-index: 102;
|
||||||
color:#000000;
|
color:#000000;
|
||||||
display:none;
|
visibility: hidden;
|
||||||
text-align:left;
|
text-align:left;
|
||||||
top:50%;
|
top:50%;
|
||||||
left:50%;
|
left:50%;
|
||||||
|
|
|
@ -269,7 +269,7 @@ function tb_show(caption, url, imageGroup) {//function called when the user clic
|
||||||
//helper functions below
|
//helper functions below
|
||||||
function tb_showIframe(){
|
function tb_showIframe(){
|
||||||
jQuery("#TB_load").remove();
|
jQuery("#TB_load").remove();
|
||||||
jQuery("#TB_window").css({display:"block"});
|
jQuery("#TB_window").css({'visibility':'visible'});
|
||||||
}
|
}
|
||||||
|
|
||||||
function tb_remove() {
|
function tb_remove() {
|
||||||
|
|
|
@ -198,30 +198,38 @@ function wp_default_scripts( &$scripts ) {
|
||||||
|
|
||||||
$scripts->add( 'jcrop', "/wp-includes/js/jcrop/jquery.Jcrop$suffix.js", array('jquery'), '0.9.8-20110113');
|
$scripts->add( 'jcrop', "/wp-includes/js/jcrop/jquery.Jcrop$suffix.js", array('jquery'), '0.9.8-20110113');
|
||||||
|
|
||||||
$scripts->add( 'swfobject', "/wp-includes/js/swfobject.js", false, '2.2');
|
|
||||||
|
|
||||||
$scripts->add( 'swfupload', '/wp-includes/js/swfupload/swfupload.js', false, '2201-20110113');
|
$scripts->add( 'plupload', '/wp-includes/js/plupload/plupload.js', false, '1.4.3.2');
|
||||||
$scripts->add( 'swfupload-swfobject', '/wp-includes/js/swfupload/plugins/swfupload.swfobject.js', array('swfupload', 'swfobject'), '2201a');
|
$scripts->add( 'plupload-html5', '/wp-includes/js/plupload/plupload.html5.js', array('plupload'), '1.4.3.2');
|
||||||
$scripts->add( 'swfupload-queue', '/wp-includes/js/swfupload/plugins/swfupload.queue.js', array('swfupload'), '2201');
|
$scripts->add( 'plupload-flash', '/wp-includes/js/plupload/plupload.flash.js', array('plupload'), '1.4.3.2');
|
||||||
$scripts->add( 'swfupload-speed', '/wp-includes/js/swfupload/plugins/swfupload.speed.js', array('swfupload'), '2201');
|
$scripts->add( 'plupload-silverlight', '/wp-includes/js/plupload/plupload.silverlight.js', array('plupload'), '1.4.3.2');
|
||||||
|
$scripts->add( 'plupload-gears', '/wp-includes/js/plupload/plupload.gears.js', array('plupload'), '1.4.3.2');
|
||||||
|
$scripts->add( 'plupload-html4', '/wp-includes/js/plupload/plupload.html4.js', array('plupload'), '1.4.3.2');
|
||||||
|
|
||||||
if ( defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ) {
|
// TODO: find out if we can use the plupload.full.js (it does load browserplus)
|
||||||
|
$scripts->add( 'plupload-full', false, array('plupload', 'plupload-html5', 'plupload-flash', 'plupload-silverlight', 'plupload-gears', 'plupload-html4'), '1.4.3.2');
|
||||||
|
|
||||||
|
$scripts->add( 'plupload-handlers', '/wp-includes/js/plupload/handlers.js', array('plupload-full', 'jquery'), '1.4.3.2');
|
||||||
|
|
||||||
|
// TODO: find out if we really need this debug clause with plupload
|
||||||
|
/*if ( defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ) {
|
||||||
// queue all SWFUpload scripts that are used by default
|
// queue all SWFUpload scripts that are used by default
|
||||||
$scripts->add( 'swfupload-all', false, array('swfupload', 'swfupload-swfobject', 'swfupload-queue'), '2201');
|
$scripts->add( 'swfupload-all', false, array('swfupload', 'swfupload-swfobject', 'swfupload-queue'), '2201');
|
||||||
} else {
|
} else {
|
||||||
$scripts->add( 'swfupload-all', '/wp-includes/js/swfupload/swfupload-all.js', array(), '2201a');
|
$scripts->add( 'swfupload-all', '/wp-includes/js/swfupload/swfupload-all.js', array(), '2201');
|
||||||
}
|
}*/
|
||||||
|
|
||||||
$scripts->add( 'swfupload-handlers', "/wp-includes/js/swfupload/handlers$suffix.js", array('swfupload-all', 'jquery'), '2201-20110524');
|
|
||||||
$max_upload_size = ( (int) ( $max_up = @ini_get('upload_max_filesize') ) < (int) ( $max_post = @ini_get('post_max_size') ) ) ? $max_up : $max_post;
|
$max_upload_size = ( (int) ( $max_up = @ini_get('upload_max_filesize') ) < (int) ( $max_post = @ini_get('post_max_size') ) ) ? $max_up : $max_post;
|
||||||
if ( empty($max_upload_size) )
|
if ( empty($max_upload_size) )
|
||||||
$max_upload_size = __('not configured');
|
$max_upload_size = __('not configured');
|
||||||
// these error messages came from the sample swfupload js, they might need changing.
|
|
||||||
$scripts->add_script_data( 'swfupload-handlers', 'swfuploadL10n', array(
|
$scripts->add_script_data( 'plupload-handlers', 'pluploadL10n', array(
|
||||||
'queue_limit_exceeded' => __('You have attempted to queue too many files.'),
|
|
||||||
'file_exceeds_size_limit' => __('This file exceeds the maximum upload size for this site.'),
|
'file_exceeds_size_limit' => __('This file exceeds the maximum upload size for this site.'),
|
||||||
'zero_byte_file' => __('This file is empty. Please try another.'),
|
'zero_byte_file' => __('This file is empty. Please try another.'),
|
||||||
'invalid_filetype' => __('This file type is not allowed. Please try another.'),
|
'invalid_filetype' => __('This file type is not allowed. Please try another.'),
|
||||||
|
'not_an_image' => __('This file is not an image. Please try another.'),
|
||||||
|
'image_memory_exceeded' => __('Memery exceeded. Please try another smaller file.'),
|
||||||
|
'image_dimensions_exceeded' => __('This is larger than the maximum size. Please try another.'),
|
||||||
'default_error' => __('An error occurred in the upload. Please try again later.'),
|
'default_error' => __('An error occurred in the upload. Please try again later.'),
|
||||||
'missing_upload_url' => __('There was a configuration error. Please contact the server administrator.'),
|
'missing_upload_url' => __('There was a configuration error. Please contact the server administrator.'),
|
||||||
'upload_limit_exceeded' => __('You may only upload 1 file.'),
|
'upload_limit_exceeded' => __('You may only upload 1 file.'),
|
||||||
|
@ -234,7 +242,7 @@ function wp_default_scripts( &$scripts ) {
|
||||||
'dismiss' => __('Dismiss'),
|
'dismiss' => __('Dismiss'),
|
||||||
'crunching' => __('Crunching…'),
|
'crunching' => __('Crunching…'),
|
||||||
'deleted' => __('moved to the trash.'),
|
'deleted' => __('moved to the trash.'),
|
||||||
'error_uploading' => __('“%s” has failed to upload due to an error')
|
'error_uploading' => __('“%s” has failed to upload due to an error'),
|
||||||
) );
|
) );
|
||||||
|
|
||||||
$scripts->add( 'comment-reply', "/wp-includes/js/comment-reply$suffix.js", false, '20090102');
|
$scripts->add( 'comment-reply', "/wp-includes/js/comment-reply$suffix.js", false, '20090102');
|
||||||
|
|
Loading…
Reference in New Issue