Index: filefield.js
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield.js,v
retrieving revision 1.26
diff -u -r1.26 filefield.js
--- filefield.js	8 Aug 2010 22:23:05 -0000	1.26
+++ filefield.js	8 Dec 2010 14:54:04 -0000
@@ -4,32 +4,7 @@
  * Auto-attach standard client side file input validation.
  */
 Drupal.behaviors.filefieldValidateAutoAttach = function(context) {
-  $("input[type='file'][accept]", context).change( function() {
-    // Remove any previous errors.
-    $('.file-upload-js-error').remove();
-
-    /**
-     * Add client side validation for the input[type=file] accept attribute.
-     */
-    var accept = this.accept.replace(/,\s*/g, '|');
-    if (accept.length > 1 && this.value.length > 0) {
-      var v = new RegExp('\\.(' + accept + ')$', 'gi');
-      if (!v.test(this.value)) {
-        var error = Drupal.t("The selected file %filename cannot be uploaded. Only files with the following extensions are allowed: %extensions.",
-          { '%filename' : this.value, '%extensions' : accept.replace(/\|/g, ', ') }
-        );
-        // What do I prepend this to?
-        $(this).before('<div class="messages error file-upload-js-error">' + error + '</div>');
-        this.value = '';
-        return false;
-      }
-    }
-
-    /**
-     * Add filesize validation where possible.
-     */
-    /* @todo */
-  });
+  $("input[type=file]", context).bind('change', Drupal.filefield.validateExtensions);
 };
 
 
@@ -72,7 +47,28 @@
  * @param {Object} event
  */
 Drupal.filefield = {
-  disableFields: function(event){
+  validateExtensions: function(event) {
+    // Remove any previous errors.
+    $('.file-upload-js-error').remove();
+
+    var fieldName = this.name.replace(/^files\[([a-z0-9_]+)_\d+\]$/, '$1');
+    var extensions = '';
+    if (Drupal.settings.filefield && Drupal.settings.filefield[fieldName]) {
+      extensions = Drupal.settings.filefield[fieldName].replace(/,\s*/g, '|');
+    }
+    if (extensions.length > 1 && this.value.length > 0) {
+      var extensionPattern = new RegExp('\\.(' + extensions + ')$', 'gi');
+      if (!extensionPattern.test(this.value)) {
+        var error = Drupal.t("The selected file %filename cannot be uploaded. Only files with the following extensions are allowed: %extensions.",
+          { '%filename' : this.value, '%extensions' : extensions.replace(/\|/g, ', ') }
+        );
+        $(this).before('<div class="messages error file-upload-js-error">' + error + '</div>');
+        this.value = '';
+        return false;
+      }
+    }
+  },
+  disableFields: function(event) {
     var clickedButton = this;
 
     // Only disable upload fields for AHAH buttons.
Index: filefield_widget.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield_widget.inc,v
retrieving revision 1.102
diff -u -r1.102 filefield_widget.inc
--- filefield_widget.inc	8 Dec 2010 05:06:11 -0000	1.102
+++ filefield_widget.inc	8 Dec 2010 14:54:04 -0000
@@ -263,8 +263,7 @@
  * remove buttons, and the description field.
  */
 function filefield_widget_process($element, $edit, &$form_state, $form) {
-  // The widget is being presented, so apply the JavaScript.
-  drupal_add_js(drupal_get_path('module', 'filefield') .'/filefield.js');
+  static $settings_added;
 
   $item = $element['#value'];
   $field_name = $element['#field_name'];
@@ -273,6 +272,18 @@
 
   $field = $form['#field_info'][$field_name];
 
+  // The widget is being presented, so apply the JavaScript.
+  drupal_add_js(drupal_get_path('module', 'filefield') .'/filefield.js');
+  if (!isset($settings_added[$field_name]) && isset($element['#upload_validators']['filefield_validate_extensions'])) {
+    $settings_added[$field_name] = TRUE;
+    $settings = array(
+      'filefield' => array(
+        $field_name => $element['#upload_validators']['filefield_validate_extensions'][0],
+      ),
+    );
+    drupal_add_js($settings, 'setting');
+  }
+
   // Title is not necessary for each individual field.
   if ($field['multiple'] > 0) {
     unset($element['#title']);
@@ -423,9 +434,6 @@
     '#type' => 'file',
     '#description' => implode('<br />', $desc),
     '#size' => 22,
-    '#attributes' => array(
-      'accept' => implode(',', array_filter(explode(' ', $field['widget']['file_extensions']))),
-    ),
     '#access' => empty($item['fid']),
   );
 
