--- /f/projects/drupal/cvs/contributions/modules/cck/weburl.install	2006-05-23 18:38:24.234375000 -0400
+++ modules/cck/weburl.install	2006-05-23 18:28:19.906250000 -0400
@@ -5,28 +5,36 @@
  * Implementation of hook_install().
  */
 function weburl_install() {
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {node_field_weburl_data} (
-          nid int unsigned NOT NULL default '0',
-          vid int unsigned NOT NULL default '0',
-          field_name varchar(32) NOT NULL default '',
-          delta int unsigned NOT NULL default '0',
-          field_weburl varchar(255) NOT NULL default '',
-          PRIMARY KEY  (vid,field_name,delta)
-        ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
-      break;
+}
+
+/**
+ * Data is now stored in per-field tables.
+ */
+function weburl_update_1() {
+  $ret = array();
 
-    case 'pgsql':
-      db_query("CREATE TABLE {node_field_weburl_data} (
-          nid integer unsigned NOT NULL default '0',
-          vid integer unsigned NOT NULL default '0',
-          field_name varchar(32) NOT NULL default '',
-          delta integer unsigned NOT NULL default '0',
-          field_weburl varchar(255) NOT NULL default '',
-          PRIMARY KEY  (vid,field_name,delta)
-        )");
-      break;
+  include_once(drupal_get_path('module', 'content') .'/content.module');
+  include_once(drupal_get_path('module', 'content') .'/content_admin.inc');
+
+  $fields = _content_fields();
+  
+  foreach ($fields as $field) {
+    if ($field['type'] == 'weburl') {
+      $columns = array(
+        'value' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => "''"),
+      );
+      $db_info = content_database_info($field);
+      content_alter_db_field(array(), array(), $field, $columns);
+      if ($field['multiple']) {
+        $ret[] = update_sql('INSERT INTO {'. $db_info['table'] .'} (vid, delta, nid, '. $field['field_name'] ."_value) SELECT vid, delta, nid, field_weburl FROM {node_field_weburl_data} WHERE field_name = '". $field['field_name'] ."'");
+      }
+      else {
+        $ret[] = update_sql('INSERT INTO {'. $db_info['table'] .'} (vid, nid, '. $field['field_name'] ."_value) SELECT vid, nid, field_weburl FROM {node_field_weburl_data} WHERE field_name = '". $field['field_name'] ."'");
+      }
+    }
   }
+  $ret[] = update_sql('DROP TABLE {node_field_weburl_data}');
+
+  db_query('DELETE FROM {cache}');
+  return $ret;
 }
--- /f/projects/drupal/cvs/contributions/modules/cck/weburl.module	2006-05-23 18:38:24.343750000 -0400
+++ modules/cck/weburl.module	2006-05-23 18:28:19.890625000 -0400
@@ -26,91 +26,37 @@ function weburl_field_info() {
 }
 
 /**
+ * Implementation of hook_field_settings().
+ */
+function weburl_field_settings($op, $field) {
+  switch ($op) {
+    case 'database columns':
+      return array(
+        'value' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => "''"),
+      );
+  }
+}
+
+/**
  * Implementation of hook_field().
  */
 function weburl_field($op, &$node, $field, &$node_field, $teaser, $page) {
   switch ($op) {
-    case 'load':
-      switch($field['type']) {
-        case 'weburl':
-          $result = db_query("SELECT field_weburl FROM {node_field_weburl_data} WHERE vid = %d AND field_name = '%s' ORDER BY delta", $node->vid, $field['field_name']);
-          if ($field['multiple']) {
-            $values = array();
-            while ($value = db_fetch_object($result)) {
-              $values[] = array('value' => $value->field_weburl);
-            }
-            $additions = array($field['field_name'] => $values);
-          }
-          else {
-            $value = db_fetch_object($result);
-            $additions = array($field['field_name'] => array('value' => $value->field_weburl));
-          }
-          break;
-      }
-      return $additions;
-
     case 'view':
-      $output = '';
-      if ($field['multiple']) {
-        foreach ($node_field as $delta => $item) {
-          $node_field[$delta]['view'] = weburl_field_view($field, $item['value'], $item, $node);
-        }
-      }
-      else {
-        $node_field['view'] = weburl_field_view($field, $node_field['value'], $node_field, $node);
-      }
-      $node->$field['field_name'] = $node_field;
-      if ($field['multiple']) {
-        $output = '';
-        foreach ($node_field as $delta => $item) {
-          $output .= '<div class="'. $field['field_name'] .'">'. $item['view'] .'</div>';
-        }
-        return $output;
-      }
-      else {
-        return '<div class="'. $field['field_name'] .'">'. $node_field['view'] .'</div>';
-      }
-
-    case 'insert':
-      switch($field['type']) {
-        case 'weburl':
-          if ($field['multiple']) {
-            foreach ($node_field as $delta => $item) {
-              db_query("INSERT INTO {node_field_weburl_data} (nid, vid, field_name, delta, field_weburl) VALUES (%d, %d, '%s', %d, '%s')", $node->nid, $node->vid, $field['field_name'], $delta, $item['value']);
-            }
-          }
-          else {
-            db_query("INSERT INTO {node_field_weburl_data} (nid, vid, field_name, field_weburl) VALUES (%d, %d, '%s', '%s')", $node->nid, $node->vid, $field['field_name'], $node_field['value']);
-          }
-          break;
+      foreach ($node_field as $delta => $item) {
+        $node_field[$delta]['view'] = weburl_field_view_item($field, $item, $node);
       }
-      return;
+      return theme('field', $node, $field, $node_field, $teaser, $page);
 
-    case 'update':
-      // Delete and insert, rather than update, in case a field was added.
-      switch($field['type']) {
-        case 'weburl':
-          db_query("DELETE FROM {node_field_weburl_data} WHERE vid = %d AND field_name = '%s'", $node->vid, $field['field_name']);
-          if ($field['multiple']) {
-            foreach ($node_field as $delta => $item) {
-              db_query("INSERT INTO {node_field_weburl_data} (nid, vid, field_name, delta, field_weburl) VALUES (%d, %d, '%s', %d, '%s')", $node->nid, $node->vid, $field['field_name'], $delta, $item['value']);
-            }
-          }
-          else {
-            db_query("INSERT INTO {node_field_weburl_data} (nid, vid, field_name, field_weburl) VALUES (%d, %d, '%s', '%s')", $node->nid, $node->vid, $field['field_name'], $node_field['value']);
+    case 'validate':
+      if (is_array($node_field)) {
+        foreach($node_field as $delta => $item) {
+          if ($item['value'] && !weburl_validate_weburl($item['value'])) {
+            form_set_error($field['field_name'], t('%name must be entered in a valid URL format.', array('%name' => t($field['widget']['label']))));
           }
-          break;
-      }
-      return;
-
-    case 'delete':
-      // Delete using nid rather than vid to purge all revisions.
-      switch($field['type']) {
-        case 'weburl':
-          db_query("DELETE FROM {node_field_weburl_data} WHERE nid = %d AND field_name = '%s'", $node->nid, $field['field_name']);
-          break;
+        }
       }
-      return;
+      break;
   }
 }
 
@@ -147,119 +93,68 @@ function weburl_widget($op, &$node, $fie
         }
       }
       else {
-        $form[$field['field_name']]['value'] = array(
+        $form[$field['field_name']][0]['value'] = array(
           '#type' => 'textfield',
           '#title' => t($field['widget']['label']),
-          '#default_value' => $node_field['value'],
+          '#default_value' => $node_field[0]['value'],
           '#required' => $field['required'],
         );
       }
       return $form;
 
-    case 'validate':
+    case 'process form values':
+      // Don't save empty fields.
       if ($field['multiple']) {
-        foreach($node_field as $delta => $value) {
-        	if ($node_field[$delta]['value']) {
-        	  if (!weburl_validate_weburl($value['value'])) {
-              form_set_error($field['field_name'] .']['. $delta. '][value', t('Not a valid Web URL.'));
-            }
-        	}
-        }
-      }
-      else {
-      	if ($node_field['value']) {
-          if (!weburl_validate_weburl($node_field['value'])) {
-            form_set_error($field['field_name'] .'][value', t('Not a valid Web URL.'));
+        foreach ($node_field as $delta => $item) {
+          if ($item['value'] == '') {
+            unset($node_field[$delta]);
           }
-      	}
+        }
       }
-      return;
-
-    case 'submit':
-      return;
+      break;
   }
 }
 
 /**
- * Implementation of hook_field_view() which performs any translation necessary.
- */
-function weburl_field_view($field, $value, $addlfields = array(), $node = NULL) {
-  return check_plain($value);
-}
-
-/**
- * Implementation of hook_views_tables().
+ * Implementation of hook_field_view_item().
+ *
+ * The extra $node argument is necessary so that filter access can be checked on
+ * node preview.
  */
-function weburl_views_tables() {
-  $tables = array();
-
-  $fields = _content_fields();
-  foreach ($fields as $field) {
-    if ($field['type'] == 'weburl') {
-      $tables['node_field_weburl_data_'. $field['field_name']] = array(
-        'name' => 'node_field_weburl_data',
-        'join' => array(
-          'left' => array(
-            'table' => 'node',
-            'field' => 'vid',
-          ),
-          'right' => array(
-            'field' => 'vid',
-          ),
-            'extra' => array('field_name' => $field['field_name']),
-        ),
-        'fields' => array(
-          'field_weburl' => array(
-            'name' => 'Web URL: '. $field['field_name'],
-            'sortable' => TRUE,
-          ),
-        ),
-        'sorts' => array(
-          'field_weburl' => array('name' => 'Web URL: '. $field['field_name']),
-        ),
-        'filters' => array(
-          'field_weburl' => array(
-            'name' => 'Web URL: '. $field['field_name'],
-            'operator' => array(
-              '='  => 'is',
-              'contains' => 'contains',
-              'begins' => 'begins with',
-              'ends' => 'ends wth',
-              'LIKE'  => 'matches pattern',
-            ),
-            'operator-handler' => '_text_filter_operator',
-          ),
-        ),
-      );
+function weburl_field_view_item($field, $item, $node = NULL) {
+  $value = check_plain($item['value']);
+  if ($value) {
+    if (preg_match('!^(https|http|ftp|news)://!i', $value)) {
+      return '<a href="'. $value .'">'. $value .'</a>';
+    }
+    else {
+      return '<a href="http://'. $value .'">'. $value .'</a>';
     }
   }
-
-  return $tables;
 }
 
 function weburl_validate_weburl($text) {
-	if (!preg_match(
-	  // The protocols: http://
-    '/^((https|http|ftp|news):\/\/)?'.
-    // domains
-    '(([a-z]([a-z0-9\-_]*\.)+)(aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|[a-z]{2})(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.\/%=&]*)?)?)'.
-    // OR ip addresses
-    '|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'.
-    // port number
-    '(:([0-9]{1,4}))'.
-    // forward slash 0 or 1 times
-    '((\/)|(\/(.*)))?'.
-    // end of the expression, case insensitive
-    '$/i', $text, $m)) {
-  	return false;
-  }
-  else {
-  	$url = new stdClass();
+  if (preg_match(
+        // The protocols: http://
+        '/^((https|http|ftp|news):\/\/)?'.
+        // domains
+        '(([a-z]([a-z0-9\-_]*\.)+)(aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|[a-z]{2})(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.\/%=&]*)?)?)'.
+        // OR ip addresses
+        '|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'.
+        // port number
+        '(:([0-9]{1,4}))'.
+        // forward slash 0 or 1 times
+        '((\/)|(\/(.*)))?'.
+        // end of the expression, case insensitive
+        '$/i', $text, $m)) {
+    $url = new stdClass();
     $url->protocol = $m[2];
     $url->hostname = strtolower($m[5]).strtolower($m[6]);
     $url->ip = $m[11];
     $url->port = $m[13];
-
     return $url;
   }
-}
\ No newline at end of file
+  else {
+    return FALSE;
+  }
+}
