diff -ru old/ed_readmore.module new/ed_readmore.module
--- old/ed_readmore.module	2009-11-24 07:51:46.000000000 +0100
+++ new/ed_readmore.module	2011-11-25 22:14:13.000000000 +0100
@@ -28,6 +28,7 @@
 
 define('ED_READMORE_PLACEMENT_DEFAULT', 'inline');
 define('ED_READMORE_TEXT_DEFAULT', t('<strong>Read more &raquo;</strong>'));
+define('ED_READMORE_PHP_DEFAULT', t(''));
 define('ED_READMORE_TITLE_DEFAULT', t('Read the whole post'));
 define('ED_READMORE_SEPARATOR_DEFAULT', '');
 
@@ -87,6 +88,7 @@
         'inline'  => t('Inline: Try to add the Read More link after the last word of the teaser. If this fails, add the link on a new line after the teaser.'),
         'after'   => t('On a new line: Add the Read More link on a new line after the teaser.'),
         'disable' => t('Disable the link: Do not add a Read More link to the teaser.'),
+	'before'  => t('Add link before the teaser'),
       ),
       '#default_value' => variable_get('ed_readmore_placement', ED_READMORE_PLACEMENT_DEFAULT),
       '#description' => t('The inline option will attempt to add the Read More link after the last word of the teaser and before any CCK fields. The HTML elements into which the Read More link may be inserted can be chosen in the "Advanced options for inline placement" interface below.'),
@@ -106,6 +108,13 @@
         '#default_value' => variable_get('ed_readmore_elements', array('p')),
         '#size' => 10,
       );
+	$form['ed_readmore_display']['ed_readmore_placement_advanced']['ed_readmore_php'] = array(
+	      '#type' => 'textarea',
+	      '#title' =>  t('PHP Placement code'),
+	      '#default_value' => variable_get('ed_readmore_php', ED_READMORE_PHP_DEFAULT),
+	      '#description' => t('Enter PHP code which decides on placement of the readmore location. Possible return values: <br><ul><li>inline<li>after<li>disable<li>before</ul><br>The $node variable gets exposed to the code and its fields can be used to decide upon the return value (e.g. $node->type)'),
+	      '#required' => FALSE,
+	    );
 
   $form['ed_readmore_formatting'] = array(
     '#type' => 'fieldset',
@@ -175,12 +184,37 @@
   }
 }
 
+/*
+In seperate function to not to allow code to interfere with the implementation of calling functions.
+
+This function returns the placement value possibly overriden by the php code.
+*/
+function ed_readmore_eval_placement($node)
+{
+	$display = variable_get('ed_readmore_placement', ED_READMORE_PLACEMENT_DEFAULT);
+	$php = variable_get('ed_readmore_php', ED_READMORE_PHP_DEFAULT);
+	if ($php == "")
+	{
+		return $display;
+	}
+	$rv= eval($php);
+	switch ($rv)
+	{
+		case 'disable':
+		case 'inline':
+		case 'before':
+		case 'after':
+			return $rv;
+		default:
+			return variable_get('ed_readmore_placement', ED_READMORE_PLACEMENT_DEFAULT);
+	}
+}
 
 /**
  * Implementation of template_preprocess_node().
  */
 function ed_readmore_preprocess_node(&$variables) {
-  $display = variable_get('ed_readmore_placement', ED_READMORE_PLACEMENT_DEFAULT);
+  $display = ed_readmore_eval_placement($variables['node']);
 
   // Don't do anything if placing the link is disabled
   if ($display != 'disable') {
@@ -220,7 +254,9 @@
       $teaser .= ed_readmore_link_render($node, $display); // Not found, so just append it
     }
   }
-  else {
+  else if ($display == 'before') {
+    $teaser = ed_readmore_link_render($node, $display).$teaser; // Place the link before the teaser
+  } else {
     $teaser .= ed_readmore_link_render($node, $display); // Not inline, so just append it
   }
 
@@ -295,7 +331,7 @@
  */
 function theme_ed_readmore_link($node, $link_text, $link_options, $separator, $display) {
   // Use a <div> (block-level) element for links appended after the teaser
-  if ($display == 'after') {
+  if (($display == 'after') || ($display == 'before')) {
     $element = 'div';
     $separator = '';
   }
@@ -307,5 +343,5 @@
     }
   }
 
-  return $separator . '<' . $element . ' class="read-more">' . l($link_text, 'node/'. $node->nid, $link_options) . '</' . $element . '>';
+  return $separator . '<' . $element . ' class="read-more read-more-'.$node->type.'">' . l($link_text, 'node/'. $node->nid, $link_options) . '</' . $element . '>';
 }
