Index: link.module
===================================================================
--- link.module	(revision 163)
+++ link.module	(working copy)
@@ -220,34 +220,36 @@
  * Implementation of hook_field().
  */
 function link_field($op, &$node, $field, &$items, $teaser, $page) {
-  switch ($op) {
-    case 'load':
-      return _link_load($field, $items);
+  if (!empty($field['type']) && $field['type'] == 'link') {
+    switch ($op) {
+      case 'load':
+        return _link_load($field, $items);
 
-    case 'validate':
-      $optional_field_found = FALSE;
-      if ($field['validate_url'] !== 0 || is_null($field['validate_url']) || !isset($field['validate_url'])) {
-        foreach ($items as $delta => $value) {
-          _link_validate($items[$delta], $delta, $field, $node, $optional_field_found);
+      case 'validate':
+        $optional_field_found = FALSE;
+        if (!isset($field['validate_url']) || is_null($field['validate_url']) || $field['validate_url'] !== 0) {
+          foreach ($items as $delta => $value) {
+            _link_validate($items[$delta], $delta, $field, $node, $optional_field_found);
+          }
         }
-      }
 
-      if ($field['url'] == 'optional' && $field['title'] == 'optional' && $field['required'] && !$optional_field_found) {
-        form_set_error($field['field_name'] .'][0][title', t('At least one title or URL must be entered.'));
-      }
-      break;
+        if ($field['url'] == 'optional' && $field['title'] == 'optional' && $field['required'] && !$optional_field_found) {
+          form_set_error($field['field_name'] .'][0][title', t('At least one title or URL must be entered.'));
+        }
+        break;
 
-    case 'presave':
-      foreach ($items as $delta => $value) {
-        _link_process($items[$delta], $delta, $field, $node);
-      }
-      break;
+      case 'presave':
+        foreach ($items as $delta => $value) {
+          _link_process($items[$delta], $delta, $field, $node);
+        }
+        break;
 
-    case 'sanitize':
-      foreach ($items as $delta => $value) {
-        _link_sanitize($items[$delta], $delta, $field, $node);
-      }
-      break;
+      case 'sanitize':
+        foreach ($items as $delta => $value) {
+          _link_sanitize($items[$delta], $delta, $field, $node);
+        }
+        break;
+    }
   }
 }
 
@@ -309,6 +311,14 @@
 }
 
 function _link_validate(&$item, $delta, $field, $node, &$optional_field_found) {
+  // Ensure the fields exist, make some of the rest of the validation simpler.
+  if (!isset($item['url'])) {
+    $item['url'] = '';
+  }
+  if (!isset($item['title'])) {
+    $item['title'] = '';
+  }
+
   if ($item['url'] && !(isset($field['widget']['default_value'][$delta]['url']) && $item['url'] == $field['widget']['default_value'][$delta]['url'] && !$field['required'])) {
     // Validate the link.
     if (link_validate_url(trim($item['url'])) == FALSE) {
@@ -346,6 +356,15 @@
   if (empty($item['url']) && empty($item['title'])) {
     return;
   }
+  // Ensure the values actually exist.
+  else {
+    if (!array_key_exists('url', $item)) {
+      $item['url'] = '';
+    }
+    if (!array_key_exists('title', $item)) {
+      $item['title'] = '';
+    }
+  }
 
   // Replace URL tokens.
   if (module_exists('token') && $field['enable_tokens']) {
@@ -441,9 +460,9 @@
   if ($type != LINK_EXTERNAL && $type != LINK_NEWS && strpos($item['attributes']['rel'], 'nofollow') !== FALSE) {
     $item['attributes']['rel'] = str_replace('nofollow', '', $item['attributes']['rel']);
   }
-  // Some old field data may have $element['#item']['attributes']['rel'] as an array, which will cause errors:
-  if (is_array($element['#item']['attributes']['rel'])) {
-    unset($element['#item']['attributes']['rel']);
+  // Some old field data may have $item['attributes']['rel'] as an array, which will cause errors:
+  if (is_array($item['attributes']['rel'])) {
+    unset($item['attributes']['rel']);
   }
 
   // Handle "title" link attribute
@@ -512,7 +531,7 @@
       $element['url']['#title'] = $element['#title'] .' '. $element['url']['#title'];
       $element['title']['#title'] = $element['#title'] .' '. $element['title']['#title'];
     }
-    elseif ($element['url']) {
+    elseif (!empty($element['url']) && isset($element['#title'])) {
       $element['url']['#title'] = $element['#title'];
     }
   }
@@ -725,7 +744,7 @@
     $item = $object[0];
 
     $tokens['url'] = $item['url'];
-    $tokens['title'] = $item['title'];
+    $tokens['title'] = isset($item['title']) ? $item['title'] : '';
     $tokens['view'] = isset($item['view']) ? $item['view'] : '';
 
     return $tokens;
