--- /Users/bevan/Desktop/adsense_injector/adsense_injector.module
+++ adsense_injector.module
@@ -29,7 +29,7 @@
 define('ADSENSE_INJECTOR_MODULE_VERSION', '$Id: adsense_injector.module,v 1.1.2.6 2007/04/06 16:05:55 inactivist Exp $' );
 define('ADSENSE_INJECTOR_INSERT_BODY_AD_DEFAULT', TRUE);
 
-define('ADSENSE_INJECTOR_BODY_INSERTION_TEMPLATE_DEFAULT', '<div class="ad-auto-inserted" style="float:left; margin: 0 1em .25em 0;">[adsense:120x240:1:1]</div>%body<br class="clear"/>[adsense:468x60:1:1]');
+define('ADSENSE_INJECTOR_BODY_INSERTION_TEMPLATE_DEFAULT', '%content1[adsense:468x60:1:1]%content2');
 define('ADSENSE_INJECTOR_BODY_MINWORDS_DEFAULT', 75);
 
 define('ADSENSE_INJECTOR_APPEND_IN_LISTVIEW_DEFAULT', FALSE);
@@ -73,41 +73,52 @@
  */ 
 function adsense_injector_nodeapi(&$node, $op, $teaser, $page) {
   // insert an ad into the body.
-  if (module_exists('adsense') && _adsense_page_match() && variable_get(ADSENSE_INJECTOR_INSERT_AD_NODETYPE . $node->type, FALSE)) {
-    if ($op == 'view') {
-      if ($page) {
-        if (variable_get('adsense_injector_insert_body_ad', ADSENSE_INJECTOR_INSERT_BODY_AD_DEFAULT)) {
-          $minwords = _adsense_injector_minwords_cfg($node->type);
-          $oldBody = $node->content['body']['#value'];
-          $wordcount = _adsense_injector_count_words($oldBody, $minwords);
-          if ($wordcount >= $minwords) {
-            $template = variable_get('adsense_injector_body_template', ADSENSE_INJECTOR_BODY_INSERTION_TEMPLATE_DEFAULT);
-            // Process adsense module tags in the template text, if enabled and possible
-            if (function_exists('_adsense_process_tags')) {
-              $template = _adsense_process_tags($template);
+  if (
+    $op == 'view'
+    && module_exists('adsense') 
+    && _adsense_page_match() 
+    && variable_get(ADSENSE_INJECTOR_INSERT_AD_NODETYPE . $node->type, FALSE)) {
+
+    if ($page && variable_get('adsense_injector_insert_body_ad', ADSENSE_INJECTOR_INSERT_BODY_AD_DEFAULT)) {
+      $minwords = _adsense_injector_minwords_cfg($node->type);
+      $content['old'] = $node->content['body']['#value'];
+      $wordcount = _adsense_injector_count_words($content['old'], $minwords);
+      if (!($wordcount >= $minwords)) {
+        $content['new'] = "<!-- adsense_injector: node body word count ($wordcount) is insufficient ($minwords required), so we won't insert an ad. -->" . $content['old'];
+      } 
+      else {
+        $template = variable_get('adsense_injector_body_template', ADSENSE_INJECTOR_BODY_INSERTION_TEMPLATE_DEFAULT);
+        $template = _adsense_injector_process_tags($template);
+        
+        if (!$dom = adsense_injector_xmlstrtodom($content['old'])) {
+          $content['new'] = $content['old'];
+        }
+        else {
+          $children = $dom->documentElement->childNodes;
+          $i = 3;
+          foreach ($children as $child) {
+            if ($i>>0) {
+              $content['parts'][1] .= $child->ownerDocument->saveXML($child);
+              if ($child->nodeName == 'p') {
+                $i--;
+              }
             }
             else {
-              watchdog('adsense_injector', t('adsense module function _adsense_process_tags() not found'), WATCHDOG_ERROR);
+              $content['parts'][2] .= $child->ownerDocument->saveXML($child);
             }
-            $node->body = 
-              $node->content['body']['#value'] = strtr($template, array('%body' => $oldBody));
-          } else {
-            $node->content['body']['#value'] = "<!-- adsense_injector: node body word count ($wordcount) is insufficient ($minwords required), so we won't insert an ad. -->" . $oldBody;
           }
+          $content['new'] = strtr($template, array('%content1' => $content['parts'][1], '%content2' => $content['parts'][2]));
         }
       }
-      else if ($teaser
-               && variable_get('adsense_injector_append_in_listview', ADSENSE_INJECTOR_APPEND_IN_LISTVIEW_DEFAULT)) {
-        $template = variable_get('adsense_injector_listview_insertion_template', ADSENSE_INJECTOR_LISTVIEW_INSERTION_TEMPLATE_DEFAULT);
-        // Process adsense module tags in the template text, if enabled and possible
-        if (function_exists('_adsense_process_tags')) {
-          $template = _adsense_process_tags($template);
-        }
-        else {
-          watchdog('adsense_injector', t('adsense module function _adsense_process_tags() not found'), WATCHDOG_ERROR);
-        }
-        $node->content['body']['#value'] = strtr($template, array('%teaser' => $node->teaser));
-      }
+      $node->content['body']['#value'] = $content['new'];
+    }
+    elseif (
+      $teaser 
+      && variable_get('adsense_injector_append_in_listview', ADSENSE_INJECTOR_APPEND_IN_LISTVIEW_DEFAULT)) {
+
+      $template = variable_get('adsense_injector_listview_insertion_template', ADSENSE_INJECTOR_LISTVIEW_INSERTION_TEMPLATE_DEFAULT);
+      $template = _adsense_injector_process_tags($template);
+      $node->content['body']['#value'] = strtr($template, array('%teaser' => $node->teaser));
     }
   }
 }
@@ -251,3 +262,52 @@
                                  '#value' => '<div style="border: solid 1px #eee; margin: .5em; padding: .5em;"><div style="float:right;">' . $d . '</div><strong>Module development sponsored by <a href="http://exodusdev.com">Exodus Development</a></strong><br/>');
   $form['module_id'] = array('#type' => 'markup', '#value' => ADSENSE_INJECTOR_MODULE_VERSION . '<br/></div>');
 }
+
+/**
+ * Wrapper fnctn for _adsense_process_tags().  logs an error if _adsense_process_tags() doesn't exist
+ * @param $template
+ * @return $template
+ */
+function _adsense_injector_process_tags($template) {
+  // Process adsense module tags in the template text, if enabled and possible
+  if (function_exists('_adsense_process_tags')) {
+    $template = _adsense_process_tags($template);
+  }
+  else {
+    watchdog('adsense_injector', t('adsense module function _adsense_process_tags() not found'), WATCHDOG_ERROR);
+  }
+  return $template;
+}
+
+/**
+* Turns an XML string into a $dom object
+* @param string of xml
+* @return object DOMdocument object
+*/
+function adsense_injector_xmlstrtodom($xmlstr) {
+/*  $tidy = new tidy;
+  $tidy->parseString($xmlstr);
+  $tidy->cleanRepair;
+  $xmlstr = $tidy->body();*/
+  $dom = new DOMDocument();
+/*  $dom->substituteEntities = false;
+  $dom->strictErrorChecking = false;
+  $dom->resolveExternals = true;*/
+  $dom->loadXML('<root/>');
+  $fragment = $dom->createDocumentFragment();
+  if (!$fragment->appendXML($xmlstr)) {
+    return watchdog('adsense_injector', $dom->doctype->entities .'This string could not be parsed as XML<pre>'. htmlspecialchars($xmlstr) .'</pre>', WATCHDOG_WARNING);
+  }
+  else {
+    $dom->documentElement->appendChild($fragment);
+    return $dom;
+  }
+}
+
+/**
+* Send Debug messages to watchdog
+*/
+function adsense_injector_debug($variable) {
+  watchdog('adsense_injector_debug', '<pre>'. print_r($variable, true) .'</pre>');
+  return false;
+}
