--- millennium_filter.info
+++ millennium_filter.info
@@ -0,0 +1,9 @@
+; $Id$
+name = Millennium Filter
+description = "Input filter to embed book information within filtered text fields."
+version = "$Name:  $"
+#dependencies[] = taxonomy
+#dependencies[] = biblio
+dependencies[] = millennium
+package = Millennium Integration
+core = 6.x

--- millennium_filter.module
+++ millennium_filter.module
@@ -0,0 +1,141 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Based on bookpost.module, which itself was based on the OpenBook plugin for Wordpress
+ * @see http://drupal.org/project/bookpost
+ * @see http://wordpress.org/extend/plugins/openbook-book-data/
+ * @see http://openlibrary.org
+ */
+
+/**
+ * Implementation of hook_filter_tips().
+ */
+function millennium_filter_filter_tips($delta, $format, $long = FALSE) {
+  switch($delta) {
+    case 0:
+      if ($long) {
+        return t('Placing a WebOPAC bibliographic or item record number (b123456, i123456) or a direct URL for one WebOPAC record between curly braces {{millennium|b123456}}, will return book information');
+      }
+      else {
+        return t('A WebOPAC record number (b123456, i123456) or WebOPAC record URL between curly braces {{}} will insert book information.');
+      }
+      break;
+  }
+}
+ 
+/**
+ * Implementation of hook_filter().
+ */
+function millennium_filter_filter($op, $delta = 0, $format = -1, $text ='') {
+  global $_millennium_field_labels;
+  switch ($op) {
+    case 'list':
+      return array(0 => t('Millennium Filter'));
+
+    case 'description':
+      return t('Replaces WebOPAC record number or URL (e.g. {{millennium|b123456}}, {{millennium|i123456}}, {{millennium|http://example.org/record=b123456}}) with book information');
+
+    case 'no cache':
+      return TRUE;
+
+    case 'prepare':
+      return $text;
+
+    case 'process':
+      preg_match_all('/{{millennium\|(.*)}}/', $text, $match);
+      $tag = $match[0];
+      $record_info = array();
+      for ($i = 0; $i < count($match[1]); $i++) {
+        $output = "";
+        $biblio_data = millennium_filter_retrieve_biblio_data($match[1][$i]);
+        if ($biblio_data) {
+          drupal_add_css( drupal_get_path('module', 'millennium') .'/millennium.css');
+          $output = "<div class='millennium-filter-record'>";
+          $output .= theme("millennium_biblio_data", $biblio_data, 'full');
+          $output .= "</div>";
+        }
+        $record_info[] = $output;
+      }
+      $text = str_replace($tag, $record_info, $text);  
+      return $text;
+
+    case 'settings':
+      $form = array();
+      $form['millennium_filter'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Millennium Records Filter'),
+        '#collapsible' => TRUE,
+        '#collapsed' => FALSE,
+      );
+      $form['millennium_filter']['millennium_filter_remove_fields'] = array(
+        '#type' => 'checkboxes',
+        '#title' => t('Fields to hide in shown records'),
+        '#options' => $_millennium_field_labels,
+        '#default_value' => variable_get('millennium_filter_remove_fields', array()),
+      );
+      return $form;
+  }
+}
+ 
+function millennium_filter_retrieve_biblio_data($id) {
+  $cid = "millennium_filter_record_{$id}";
+  $cache = cache_get($cid);
+  if ($cache) {
+    $biblio_data = $cache->data;
+    return $biblio_data;
+  }
+  
+  if(preg_match('/^http/', $id)) {
+    $url = $id;
+    $url = str_replace("&amp;", "&", $url);
+    // Determine base url from given URL
+    $base_url = millennium_get_real_baseurl($url);
+    
+    // Get record page from WebOPAC
+    $result = drupal_http_request($url);
+    $record_html = $result->data;
+    if (!$record_html) {
+      return t("Page at !url returns error %error.", array("!url" => $url, "%error" => $result->error));
+    }
+    $ok = preg_match('/\/record=([bi][0-9]+)/si', $record_html, $matches);
+    if (!$ok) {
+      dpm($record_html);
+      return t("Page at !url has no record number information.", array("!url" => $url));
+    }
+    $recnum = $matches[1];
+  } 
+  else {
+    $base_url = millennium_get_real_baseurl();
+    $recnum = $id;
+  }
+  
+  $output = "";
+  
+  // Try to find already-imported node
+  $nid = false;
+  switch (substr($recnum,0,1)) {
+    case "i":
+      $nid = db_result(db_query("SELECT MNB.nid FROM {millennium_node_bib} MNB,{millennium_bib_item} MBI WHERE MBI.item_recnum='%s' AND MNB.bib_recnum = MBI.bib_recnum AND MBI.base_url = '%s'", $recnum, $base_url));
+      break;
+    case "b":
+      $nid = db_result(db_query("SELECT nid FROM {millennium_node_bib} WHERE bib_recnum='%s' AND base_url = '%s'", $recnum, $base_url));
+  }
+  if ($nid) {
+    $biblio_data = millennium_get_biblio_data($nid);
+  } else {
+    // Fetch directly from WebOPAC
+    $marc_text_msg = "";
+    $marc_text = millennium_fetch_marc($recnum, $base_url);
+    $tmp_node = millennium_marc_to_nodeobject($marc_text, $recnum, $base_url);
+    $biblio_data = $tmp_node->millennium_biblio_data;
+  }
+  
+  // Show only certain biblio data; remove some fields
+  foreach (variable_get("millennium_filter_remove_fields", array()) as $field) {
+    unset($biblio_data[$field]);
+  }
+  cache_set($cid, $biblio_data, 'cache_filter');
+  return $biblio_data;
+}


