--- cck.orig/nodereference.module	2007-08-15 15:05:53.000000000 -0400
+++ cck/nodereference.module	2007-10-05 17:11:56.000000000 -0400
@@ -527,4 +527,277 @@
   $options = array(0 => t('<empty>'));
   $options = $options + _nodereference_potential_references($filterinfo['extra']['field']);
   return $options;
-}
\ No newline at end of file
+}
+ 
+ /**
+  * @file
+  * Interface between nodereference.module and views.module.
+  */
+ 
+ /**
+  * Implementation of hook_views_tables().
+  *
+  * Join in another node table and all the standard node fields for each nodereference field.
+  */
+ function nodereference_views_tables() {
+   $field_types = _content_field_types();
+ 
+   $tables = array();
+   foreach (content_fields() as $field) {
+     $db_info = content_database_info($field);
+     $module = $field_types[$field['type']]['module'];
+     if ($module == 'nodereference') {
+ 
+       $name = $field_types[$field['type']]['label'] .': '. $field['widget']['label'];
+ 
+       $tables['node_data_'. $field['field_name'] .'_node'] = array(
+         'name' => 'node',
+         'provider' => 'internal',
+         'join' => array(
+           'left' => array(
+             'table' => 'node_data_'. $field['field_name'],
+             'field' =>  $field['field_name'] .'_nid',
+           ),
+           'right' => array(
+             'field' =>'nid',
+           ),
+         ),
+         'fields' => array(
+          'title' => array(
+            'name' => t('%name Referenced Node: Title', array('%name' => $name)),
+	    'handler' => 'views_handler_nodereference_field_nodelink',
+            'option' => array(
+               '#type' => 'select',
+               '#options' => array(
+                 'link' => 'As link',
+                 'nolink' => 'Without link'
+                ),
+            ),
+            'sortable' => true,
+            'addlfields' => array('changed', 'nid'),
+            'help' => t('Display the title of the node.'),
+           ),
+           'nid' => array(
+            'name' => t('%name Referenced Node: ID', array('%name' => $name)),
+            'sortable' => true,
+            'help' => t('Display the NID of a node.'),
+          ),
+          'created' => array(
+            'name' => t('%name Referenced Node: Created Time', array('%name' => $name)),
+            'sortable' => true,
+            'handler' => views_handler_field_dates(),
+            'option' => 'string',
+            'help' => t('Display the post time of the node.'),
+          ),
+          'changed' => array(
+            'name' => t('%name Referenced Node: Updated Time', array('%name' => $name)),
+            'sortable' => true,
+            'handler' => views_handler_field_dates(),
+            'option' => 'string',
+            'help' => t('Display the last time the node was updated.'),
+          ),
+          'type' => array(
+            'name' => t('%name Referenced Node: Type', array('%name' => $name)),
+            'handler' => 'views_handler_nodetype',
+            'sortable' => true,
+            'help' => t("The Node Type field will display the type of a node (for example, 'blog entry', 'forum post', 'story', etc)"),
+          ),
+          'link' => array(
+            'name' => t('%name Referenced Node: Link to node', array('%name' => $name)),
+            'handler' => 'views_handler_field_node_link',
+            'sortable' => false,
+            'option' => 'string',
+            'notafield' => 'true',
+            'help' => t("This will create a link to the node; fill the option field with the text for the link. If you want titles that link to the node, use Node: Title instead."),
+          ),
+          'body' => array(
+            'name' => t('%name Referenced Node: Body', array('%name' => $name)),
+            'handler' => array(
+              'views_handler_field_body'   => t('Full Text'),
+              'views_handler_field_teaser' => t('Teaser')
+            ),
+            'addlfields' => array('nid'),
+            'notafield' => TRUE,
+            'help' => t('Display the Main Content.'),
+          ),
+          'view' => array(
+            'name' => t('%name Referenced Node: View link', array('%name' => $name)),
+            'handler' => 'views_handler_node_view',
+            'notafield' => TRUE,
+            'option' => 'string',
+            'help' => t('Display a link to view the node. Enter the text of this link into the option field; if blank the default "view" will be used.'),
+          ),
+          'edit' => array(
+            'name' => t('%name Referenced Node: Edit link', array('%name' => $name)),
+            'handler' => 'views_handler_node_edit',
+            'notafield' => TRUE,
+            'addlfields' => array('type', 'uid'),
+            'option' => 'string',
+            'help' => t('Display a link to edit the node. Enter the text of this link into the option field; if blank the default "edit" will be used.'),
+          ),
+          'delete' => array(
+            'name' => t('%name Referenced Node: Delete link', array('%name' => $name)),
+            'handler' => 'views_handler_node_delete',
+            'notafield' => TRUE,
+            'addlfields' => array('type', 'uid'),
+            'option' => 'string',
+            'help' => t('Display a link to delete the node. Enter the text of this link into the option field; if blank the default "delete" will be used.'),
+          ),
+        ),
+        'sorts' => array(
+          'nid' => array(
+            'name' => t('%name Referenced Node: ID', array('%name' => $name)),
+            'help' => t('Sort by the database ID of the node.'),
+           ),
+          'created' => array(
+            'name' => t('%name Referenced Node: Created Time', array('%name' => $name)),
+            'handler' => 'views_handler_sort_date',
+            'option' => views_handler_sort_date_options(),
+            'help' => t('Sort by the submission date of the node.'),
+           ),
+          'changed' => array(
+            'name' => t('%name Referenced Node: Updated Time', array('%name' => $name)),
+            'handler' => 'views_handler_sort_date',
+            'option' => views_handler_sort_date_options(),
+            'help' => t('Sort by the last update date of the node.'),
+          ),
+          'sticky' => array(
+            'name' => t('%name Referenced Node: Sticky', array('%name' => $name)),
+            'help' => t('Sort by whether or not the node is sticky. Choose descending to put sticky nodes at the top.'),
+          ),
+          'title' => array(
+            'name' => t('%name Referenced Node: Title', array('%name' => $name)),
+            'help' => t('Sort by the node title, alphabetically'),
+          ),
+          'type' => array(
+            'name' => t('%name Referenced Node: Type', array('%name' => $name)),
+            'help' => t('Sort by the node type, alphabetically'),
+          ),
+          'random' => array(
+            'name' => t('Referenced Random', array('%name' => $name)),
+            'handler' => 'views_handler_sort_random',
+            'help' => t('By choosing random, nodes will be ordered completely randomly. This is a good way to choose X random nodes from a group of nodes.'),
+          ),
+        ),
+        'filters' => array(
+          'status' => array(
+            'name' => t('%name Referenced Node: Published', array('%name' => $name)),
+            'operator' => array('=' => t('Equals')),
+            'list' => 'views_handler_operator_yesno',
+            'list-type' => 'select',
+            'help' => t('Filter by whether or not the node is published. This is recommended for most Views!'),
+          ),
+          'promote' => array(
+            'name' => t('%name Referenced Node: Front Page', array('%name' => $name)),
+            'operator' => array('=' => t('Equals')),
+            'list' => 'views_handler_operator_yesno',
+            'list-type' => 'select',
+            'help' => t('Filter by whether or not the node has been promoted to Front Page.'),
+          ),
+          'sticky' => array(
+            'name' => t('%name Referenced Node: Sticky', array('%name' => $name)),
+            'operator' => array('=' => t('Equals')),
+            'list' => 'views_handler_operator_yesno',
+            'list-type' => 'select',
+            'help' => t('Filter by whether or not the node is set sticky.'),
+          ),
+          'moderate' => array(
+            'name' => t('%name Referenced Node: Moderated', array('%name' => $name)),
+            'operator' => array('=' => t('Equals')),
+            'list' => 'views_handler_operator_yesno',
+            'list-type' => 'select',
+            'help' => t('Filter by whether or not the node is moderated.'),
+          ),
+          'type' => array(
+            'name' => t('%name Referenced Node: Type', array('%name' => $name)),
+            'list' => 'views_handler_filter_nodetype',
+            'list-type' => 'list',
+            'operator' => 'views_handler_operator_or',
+            'value-type' => 'array',
+            'help' => t('Include or exclude nodes of the selected types.'),
+          ),
+          'anon' => array(
+            'field' => 'uid',
+            'name' => t('%name Referenced Node: Author is Anonymous', array('%name' => $name)),
+            'operator' => 'views_handler_operator_eqneq',
+            'list' => 'views_handler_filter_useranon',
+            'value-type' => 'array',
+            'help' => t('This allows you to filter by whether or not the node author is anonymous.'),
+          ),
+          'currentuid' => array(
+            'field' => 'uid',
+            'name' => t('%name Referenced Node: Author is Current User', array('%name' => $name)),
+            'operator' => 'views_handler_operator_eqneq',
+            'list' => 'views_handler_filter_usercurrent',
+            'list-type' => 'select',
+            'help' => t('This allows you to filter by whether or not the node was authored by the logged in user of the view.'),
+          ),
+          'currentuidtouched' => array(
+            'field' => 'uid',
+            'name' => t('%name Referenced Node: Current User Authored or Commented', array('%name' => $name)),
+            'operator' => array('=' => 'touched by'),
+            'list' => 'views_handler_filter_usercurrent',
+            'list-type' => 'select',
+            'handler' => 'views_handler_filter_uid_touched',
+            'help' => t('This allows you to filter by whether or not the logged in user authored or commented on the node.'),
+          ),
+          'distinct' => array(
+            'name' => t('%name Referenced Node: Distinct', array('%name' => $name)),
+            'operator' => array('=' => 'is'),
+            'list' => array('distinct' => 'distinct'),
+            'handler' => 'views_handler_filter_distinct',
+            'value-type' => 'array',
+            'help' => t('This filter ensures that each node may only be listed once, even if it matches multiple criteria. Use this if multiple taxonomy matches return duplicated nodes.'),
+          ),
+          'title' => array(
+            'name' => t('%name Referenced Node: Title', array('%name' => $name)),
+            'operator' => 'views_handler_operator_like',
+            'handler' => 'views_handler_filter_like',
+            'help' => t('This filter allows nodes to be filtered by their title.'),
+	  ),
+          'created' => array(
+            'name' => t('%name Referenced Node: Created Time', array('%name' => $name)),
+            'operator' => 'views_handler_operator_gtlt',
+            'value' => views_handler_filter_date_value_form(),
+            'handler' => 'views_handler_filter_timestamp',
+            'option' => 'string',
+            'help' => t('This filter allows nodes to be filtered by their creation date. Enter dates in the format: CCYY-MM-DD HH:MM:SS. Enter \'now\' to use the current time. You may enter a delta (in seconds) to the option that will be added to the time; this is most useful when combined with now. If you have the jscalendar module from jstools installed, you can use a popup date picker here.'),
+          ),
+          'changed' => array(
+            'name' => t('%name Referenced Node: Updated Time', array('%name' => $name)),
+            'operator' => 'views_handler_operator_gtlt',
+            'value' => views_handler_filter_date_value_form(),
+            'handler' => 'views_handler_filter_timestamp',
+            'option' => 'string',
+            'help' => t('This filter allows nodes to be filtered by their creation date. Enter dates in the format: CCYY-MM-DD HH:MM:SS. Enter \'now\' to use the current time. You may enter a delta (in seconds) to the option that will be added to the time; this is most useful when combined with now. If you have the jscalendar module from jstools installed, you can use a popup date picker here.'),
+          ),
+          'body' => array(
+            'name' => t('%name Referenced Node: Body', array('%name' => $name)),
+            'operator' => 'views_handler_operator_like',
+            'handler' => 'views_handler_filter_body',
+            'help' => t('This filter allows nodes to be filtered by their body.'),
+          ),
+        ),
+       );
+     }
+   }
+   return $tables;
+ }
+ 
+ 
+/*
+ * Format a nodereference field as a link to the referenced node.
+ *
+ * This fn based on views_handler_field_nodelink(), from views_node.inc.
+ */
+function views_handler_nodereference_field_nodelink($fieldinfo, $fielddata, $value, $data) {
+  if ($fielddata['options'] == 'nolink') {
+    return check_plain($value);
+  }
+  else {
+      $nid_field = $fielddata['tablename'] . "_nid";
+      $referenced_nid = $data->$nid_field;
+      return l($value, "node/$referenced_nid");
+  }
+ }
+ 
