diff -uprN ../work/signup/views/handlers/signup_handler_sort_user_form_data.inc signup/views/handlers/signup_handler_sort_user_form_data.inc
--- ../work/signup/views/handlers/signup_handler_sort_user_form_data.inc	1969-12-31 16:00:00.000000000 -0800
+++ signup/views/handlers/signup_handler_sort_user_form_data.inc	2009-10-06 21:54:54.000000000 -0700
@@ -0,0 +1,31 @@
+<?php
+// $Id$
+
+/**
+ * Sort handler to sort on custom (site-specific) signup form data.
+ */
+class signup_handler_sort_user_form_data extends views_handler_sort {
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $form['form_data_fieldname'] = array(
+      '#type' => 'textfield',
+      '#title' => t(' Field Name'),
+      '#description' => t('If you want to sort on a single field from the signup form (see theme/signup_form.inc), enter its name here. Otherwise, sort by all fields in their order on the form.'),
+      '#default_value' => isset($this->options['form_data_fieldname']) ? $this->options['form_data_fieldname'] : '',
+    );
+  }
+
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['form_data_fieldname'] = array('default' => '');
+    return $options;
+  }
+
+  function pre_query() {
+    // Save sort-by parameters for later... will be used in signup_views_pre_render()
+    if ($this->options['form_data_fieldname']) {
+      $this->query->signup_handler_sort_user_form_data[] = $this->options;
+    }
+  }
+}
+
diff -uprN ../work/signup/views/signup.views.inc signup/views/signup.views.inc
--- ../work/signup/views/signup.views.inc	2009-07-22 14:47:47.000000000 -0700
+++ signup/views/signup.views.inc	2009-10-06 22:13:50.282117798 -0700
@@ -252,6 +252,11 @@ function signup_views_data() {
     'field' => array(
       'handler' => 'signup_handler_field_signup_user_form_data',
       'option' => 'string',
+      'click sortable' => FALSE,
+    ),
+    'sort' => array(
+      'handler' => 'signup_handler_sort_user_form_data',
+      'help' => t('Sort by custom user form field.'),
     ),
   );
 
@@ -333,6 +338,9 @@ function signup_views_handlers() {
       'signup_handler_filter_signup_user_authenticated' => array(
         'parent' => 'views_handler_filter_boolean_operator',
       ),
+      'signup_handler_sort_user_form_data' => array(
+        'parent' => 'views_handler_sort',
+      ),
     ),
   );
 }
@@ -362,3 +370,51 @@ function signup_views_plugins() {
   );
 }
 
+/**
+ * Sort functions for usort().
+ */
+function signup_sort($a, $b) {
+  $acmp = (is_object($a) && isset($a->signup_sortby)) ? $a->signup_sortby : '';
+  $bcmp = (is_object($b) && isset($b->signup_sortby)) ? $b->signup_sortby : '';
+  return strcmp($acmp, $bcmp);
+}
+function signup_rsort($a, $b) {
+  $acmp = (is_object($a) && isset($a->signup_sortby)) ? $a->signup_sortby : '';
+  $bcmp = (is_object($b) && isset($b->signup_sortby)) ? $b->signup_sortby : '';
+  return -strcmp($acmp, $bcmp);
+}
+
+/**
+ * Implementation of hook views_pre_render().
+ * Performs data sort after the query is executed.
+ */
+function signup_views_pre_render(&$view) {
+  $query = $view->query;
+  if ($query->base_table == 'signup_log' && isset($query->signup_handler_sort_user_form_data)) {
+    $rows = &$view->result;
+    $option = $query->signup_handler_sort_user_form_data[0];
+
+    if (isset($option['form_data_fieldname'])) {
+
+      // Extract field from user data into the recordset, so we can sort by it
+      $field_alias = isset($option['field_alias']) ? $option['field_alias'] : $option['table'] . '_' . $option['field'];
+
+      $desc = (stripos($query->orderby[0], 'DESC') !== false);
+
+      foreach ($rows as $key => $result) {
+        $form_data = unserialize($result->{$field_alias});
+        if ($form_data) {
+          foreach ($form_data as $k => $v) {
+            if ($k == $option['form_data_fieldname']) {
+              $rows[$key]->signup_sortby = strtolower($v);	// Case-insensitive
+            }
+          }
+        }
+      }
+	  
+	  // Now sort the data
+	  usort($rows, $desc ? 'signup_rsort' : 'signup_sort');
+    }
+  }
+}
+
