--- original.module1	2012-10-31 10:24:19.312046882 -0400
+++ entityreference_prepopulate.module	2012-11-05 23:15:48.220164971 -0500
@@ -53,13 +53,13 @@
  * Set the default from the URL context. This works even if the widget is
  * not shown, e.g. due to restricted field access.
  */
-function entityreference_prepopulate_field_default_value($entity_type, $entity, $field, $instance, $langcode) {
+function entityreference_prepopulate_field_default_value($entity_type, $entity, $field, $instance, $langcode) {  
   if (module_exists('og') && og_is_group_audience_field($instance['field_name'])) {
     return entityreference_prepopulate_og_field_default_value($entity_type, $entity, $field, $instance, $langcode);
   }
-  if ($items = entityreference_prepopulate_get_values_from_url($field, $instance)) {
-    // TODO: Check field cardinality.
-    return $items;
+  if ($items = entityreference_prepopulate_get_values_from_url($field, $instance)) {       
+    // TODO: Check field cardinality.    
+    return $items;    
   }
 }
 
@@ -88,16 +88,31 @@
 }
 
 /**
+ * After-build form function to enable storage of &_GET parameters in persistent storage 
+ */
+function entityreference_prepopulate_after_build_form($form, &$form_state) { 
+  $values = &drupal_static('entityreference_prepopulate_field_attach_form');  
+  if (!empty($values['entity_prep'])) {
+    $_SESSION['entity_prep'][$form['form_build_id']['#value']] = array();
+    foreach ($values['entity_prep'] as $field => $value) {
+      $_SESSION['entity_prep'][$form['form_build_id']['#value']][$field] = $value;
+    }
+  }  
+  
+  return $form;
+}
+
+/**
  * Implements hook_field_attach_form().
  */
-function entityreference_prepopulate_field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode) {
+function entityreference_prepopulate_field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode) {  
   list($id,,$bundle) = entity_extract_ids($entity_type, $entity);
   if ($id) {
     // Entity is already saved.
     return;
-  }
-
-  if (!empty($form_state['triggering_element']['#ajax'])) {
+  }   
+  
+  if (!empty($form_state['triggering_element']['#ajax'])) {   
     // We are inside AJAX, so values can't be taken from URL at the
     // moment.
     return;
@@ -115,22 +130,33 @@
 
   if (!$found) {
     return;
-  }
+  } 
 
   foreach (element_children($form_state['field']) as $field_name) {
     foreach ($form_state['field'][$field_name] as $lang => $value) {
-      $instance = $value['instance'];
+      $instance = $value['instance'];      
       if (empty($instance['settings']['behaviors']['prepopulate']['status'])) {
         continue;
       }
+      
       $settings = $instance['settings']['behaviors']['prepopulate'];
 
       if (!empty($settings['skip_perm']) && user_access($settings['skip_perm'])) {
         continue;
       }
 
-      $field = $value['field'];
-      if (entityreference_prepopulate_get_values_from_url($field, $instance)) {
+      $field = $value['field']; 
+      $values = entityreference_prepopulate_get_values_from_url($field, $instance);      
+      if ($values) {
+        //Store the values in persistent storage so they're available in future ajax requests
+        //Otherwise, values will not be accepted since elements have either #access = FALSE or #disabled = TRUE
+        //We don't have a unique identifier at this point; use an after-build function to get the form_build_id        
+        if (!isset($cache)) {
+          $cache = &drupal_static(__FUNCTION__, array());
+          $form['#after_build'][] = 'entityreference_prepopulate_after_build_form';
+        }
+        
+        $cache['entity_prep'][$field_name] = $values;        
         if ($settings['action'] == 'disable') {
           $form[$field_name][$lang]['#disabled'] = TRUE;
         }
@@ -151,7 +177,7 @@
         }
       }
     }
-  }
+  } 
 }
 
 /**
@@ -201,7 +227,7 @@
  *   TRUE if the group IDs should be sent as a simple array. FALSE, if we need
  *   to build array suited for field API's $items value.
  */
-function entityreference_prepopulate_get_values_from_url($field, $instance, $flat_array = FALSE) {
+function entityreference_prepopulate_get_values_from_url($field, $instance, $flat_array = FALSE) {  
   $cache = &drupal_static(__FUNCTION__, array());
   $field_name = $field['field_name'];
   $identifier = $instance['entity_type'] . ':' . $instance['bundle'] . ':' . $field_name . ':' . $flat_array;
@@ -210,16 +236,25 @@
   }
   $cache[$identifier] = FALSE;
 
-  if (empty($_GET[$field_name])) {
-    return;
+  if (empty($_GET[$field_name])) {    
+    //This may be an ajax request; check for a form_build_id and stored value(s) in session
+    if (isset($_POST['form_build_id']) && 
+      !empty($_SESSION['entity_prep'][$_POST['form_build_id']][$field_name])) {      
+      $ids = $_SESSION['entity_prep'][$_POST['form_build_id']][$field_name];
+    }
+    else {    
+      return;
+    }
   }
 
   if (empty($instance['settings']['behaviors']['prepopulate']['status'])) {
     return;
   }
 
-  $ids = explode(',', $_GET[$field_name]);
-
+  if (!isset($ids)) {
+    $ids = explode(',', $_GET[$field_name]);
+  }
+  
   // Check if the IDs are valid, and get filter out the ones that are not valid.
   $handler = entityreference_get_selection_handler($field, $instance);
   $ids = $handler->validateReferencableEntities($ids);
@@ -238,6 +273,7 @@
     }
   }
   $cache[$identifier] = $items;
+  //$_SESSION['prepops'][$identifier] = $items;
   return $items;
 }
 
