op; $file = (isset($p->file) ? json_decode($p->file) : NULL); $instance = json_decode($p->instance); $instance_settings = json_decode($p->instance_settings); $file_path = $p->file_path; unset($p); switch ($op) { case 'init': // Add the default callback functions for the SWF Upload $instance->type = 'table'; $instance->callbacks = array( 'swfupload_loaded_handler' => 'ref.swfUploadLoaded', 'file_queued_handler' => 'ref.fileQueued', 'queue_complete_handler' => 'ref.queueComplete', 'file_queue_error_handler' => 'ref.fileQueueError', 'file_dialog_complete_handler' => 'ref.dialogComplete', 'upload_success_handler' => 'ref.uploadSuccess', 'upload_progress_handler' => 'ref.uploadProgress', 'upload_error_handler' => 'ref.uploadError', 'upload_complete_handler' => 'ref.uploadComplete', 'init_complete_handler' => 'ref.initComplete',// This custom javascript callback function is used to place the markup inside the dom ); $instance->elements = array( 'drag' => array( 'class' => 'drag first indentation', 'type' => 'drag', 'colspan' => 3, 'title' => t('Filename'), 'add_separator' => TRUE, ), 'icon' => array( 'type' => 'icon', 'class' => 'icon', ), 'filename' => array( 'type' => 'markup', 'value' => '[filename]', 'class' => 'text title', ), ); break; case 'move_uploaded_file': $max_filesize = parse_size(file_upload_max_size()); if (!empty($instance_settings->max_filesize) && parse_size($instance_settings->max_filesize) < $max_filesize) { $max_filesize = parse_size($instance_settings->max_filesize); } $file->validators = array( 'file_validate_extensions' => array($instance_settings->file_extensions), // 'filefield_validate_image_resolution' => array($instance_settings->max_resolution, $instance_settings->min_resolution), 'file_validate_size' => array($max_filesize), ); $file->file_path = $file_path; // Allow other modules to change the file_path an validators foreach (module_implements('swfupload') as $module) { $function = $module . '_swfupload'; $function($file, $op, $instance, $instance_settings); } $op = 'upload_complete'; break; } // Allow other modules to change the returned data foreach (module_implements('swfupload') as $module) { $function = $module . '_swfupload'; $function($file, $op, $instance, $instance_settings); // We want to make sure the last column of each tablerow contains the 'cancel' or 'delete' button. if ($op == 'init') { $instance->elements['cancel'] = array('class' => 'last', 'type' => 'cancel'); } } // Replace keys named 'class' to 'classname' if (!empty($instance->elements)) { array_walk($instance->elements, '_class_to_classname'); } $p->op = $op; $p->file = $file; $p->file_path = $file_path; $p->instance = $instance; $p->instance_settings = $instance_settings; $p->messages = drupal_get_messages(); echo json_encode($p); exit(0); } /** * Helper function to replace instance elements class keys to classname keys * Safari hangs if you use 'class' in javascript */ function _class_to_classname(&$element) { $element['classname'] = $element['class']; unset($element['class']); }