--- invisimail.module.HEAD	2007-12-15 10:13:09.000000000 -0800
+++ invisimail.module	2007-12-15 10:11:34.000000000 -0800
@@ -87,24 +87,41 @@ function invisimail_filter($op, $delta =
 }
 
 function invisimail($string, $format) {
-  $pattern = "!(<p>|<li>|<br />|[ \n\r\t\(])([A-Za-z0-9._-]+@[A-Za-z0-9._-]+\.[A-Za-z]{2,4})([.,]?)(?=(</p>|</li>|<br />|[ \n\r\t\)]))!i";
-  
   // the callback needs to know what filter we're using
   // however there's no way to hand off that variable
   // so we'll set a global variable
   $GLOBALS['invisimail_format'] = $format;
 
+  // First fix addresses that are already linked
+  $pattern = "!<a([^>]+?)href=[\"']mailto:([^\"']+?)[\"'](.*?)>(.*?)</a>!is";
+  $string = preg_replace_callback($pattern, 'invisimail_callback2', $string);
+
+  $pattern = "!(<p>|<li>|<br />|[ \n\r\t\(])([A-Za-z0-9._-]+@[A-Za-z0-9._-]+\.[A-Za-z]{2,4})([.,]?)(?=(</p>|</li>|<br />|[ \n\r\t\)]))!i";
   return preg_replace_callback($pattern, 'invisimail_callback', $string);
+
  }
 
 function invisimail_callback($matches) {
   return $matches[1] . invisimail_ascii_encode($matches[2]) . $matches[3];
 }
 
-function invisimail_ascii_encode($string) {
+function invisimail_callback2($matches) {
+  $attribs = $matches[1] . $matches[3];
+  $text = '';
+  // If the text is not an email address we don't want it encoded
+  if (!preg_match("![A-Za-z0-9._-]+@[A-Za-z0-9._-]+\.[A-Za-z]{2,4}!i", $matches[4])) {
+    $text = $matches[4];
+  }
+
+  return invisimail_ascii_encode($matches[2], $attribs, $text);
+}
+
+function invisimail_ascii_encode($string, $attribs = '', $text = '') {
   $format = $GLOBALS['invisimail_format'];
-  $js = variable_get('invisimail_js_'.$format, FALSE);
-  $link = variable_get('invisimail_link_'.$format, FALSE);
+  //$js = variable_get('invisimail_js_'.$format, FALSE);
+  //$link = variable_get('invisimail_link_'.$format, FALSE);
+  $js = true;
+  $link = true;
     
   if ($js) {
     $output = "<script type='text/javascript'><!--
@@ -123,11 +140,14 @@ function invisimail_ascii_encode($string
   }
   
   if ($link && !$js) {
+    $linkText = $text == '' ? $encode : $text;
     // ascii in this next line is "mailto:"
-    $output .= "<a href=\"&#109;&#97;&#105;&#108;&#116;&#111;&#58;$encode\">$encode</a>";
+    $output .= "<a href=\"&#109;&#97;&#105;&#108;&#116;&#111;&#58;$encode\"$attribs>$linkText</a>";
   }
   elseif ($link && $js) {
-    $output .= "<a href=\"&#109;&#97;&#105;&#108;&#116;&#111;&#58;'+'$encode'+'\">'+'$encode'+'</a>";    
+    $attribs = str_replace("'", "\\'", $attribs);
+    $linkText = $text == '' ? $encode : str_replace("'", "\\'", $text);
+    $output .= "<a href=\"&#109;&#97;&#105;&#108;&#116;&#111;&#58;'+'$encode'+'\"$attribs>'+'$linkText'+'</a>";    
   }
   else {
     $output .= $encode;
