--- page_title.module	2007-08-02 23:52:10.000000000 -0700
+++ page_title.module	2008-10-25 17:14:22.000000000 -0700
@@ -1,5 +1,5 @@
 <?php
-// $Id: page_title.module,v 1.2.2.10 2007/08/03 06:52:10 johnalbin Exp $
+// $Id: $
 
 /**
  * @file
@@ -54,6 +54,10 @@ function page_title_menu($may_cache) {
       'type' => MENU_NORMAL_ITEM,
     );
   }
+  else {
+    // this is where nodewords set the html head...  will it work for page title too?
+    $page_title = page_title_page_get_title();
+  }
   return $items;
 }
 
@@ -89,16 +93,94 @@ function page_title_admin_settings() {
  * Implementation of hook_form_alter().
  */
 function page_title_form_alter($form_id, &$form) {
-  if ($form['#id'] == 'node-form' && user_access('set page title')) {
-    $form['page_title'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Page title'),
-      '#description' => t('Optionally specify a different title to appear in the &lt;title&gt; tag of the page.'),
-      '#default_value' => $form['#node']->page_title,
-      '#size' => 60,
-      '#maxlength' => 255,
-      '#weight' => -4,
-    );
+  if (!user_access('set page title')){
+    return;
+  }
+  // nodes
+  if ($form['#id'] == 'node-form') {
+    page_title_add_form_field($form, 'node', $form['#node']->nid);
+  }
+  // taxonomy
+  else if ($form_id == 'taxonomy_form_term') {
+    page_title_add_form_field($form, 'term', $form['tid']['#value']);
+  }
+  // panels 1.x
+  else if ($form_id == 'panels_edit_form') {
+    page_title_add_form_field($form, 'panels', $form['did']['#value']);
+    $form['page_title']['#weight'] = '-10';
+    $form['#submit']['page_title_panels_handler'] = array();
+  }
+  else if ($form_id == 'panels_delete_confirm') {
+    $form['#submit']['page_title_panels_handler'] = array();
+  }
+  // panels 2.x
+  else if ($form_id == 'panels_page_edit_form') {
+    page_title_add_form_field($form, 'panels', $panels_page['panel_page']['#value']->did);
+    $form['#submit']['page_title_panels_page_handler'] = array();  
+  }
+  else if ($form_id == 'panels_page_delete_confirm') {
+    $form['#submit']['page_title_panels_page_handler'] = array();
+  }
+}
+
+function page_title_add_form_field(&$form, $type, $id){
+  $default = '';
+  if (isset($type)) {
+    if ($type == 'node'){
+      $default = $form['#node']->page_title;
+    }
+    else if (isset($type) && isset($id) && is_numeric($id)) {
+      $default = _page_title_load($type, $id);
+    }
+  }
+  
+  $form['page_title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Page title'),
+    '#description' => t('Optionally specify a different title to appear in the &lt;title&gt; tag of the page.'),
+    '#default_value' => $default,
+    '#size' => 60,
+    '#maxlength' => 255,
+    '#weight' => -4,
+  );
+  return $form;
+}
+
+/**
+ * Handling of edit/delete form for panels.
+ */
+function page_title_panels_handler($form_id, $form_values) {
+  switch ($_POST['op']) {
+    case t('Save'):
+      if (isset($form_values['page_title']) && user_access('administer meta tags')) {
+        _page_title_set('panels', $form_values['did'], $form_values['page_title']);
+      }
+      break;
+
+    case t('Delete'):
+      if ($form_values['confirm']) {
+        _page_title_delete('panels', $form_values['did']);
+      }
+      break;
+  }
+}
+
+/**
+ * Handling of edit/delete form for panels (v2).
+ */
+function page_title_panels_page_handler($form_id, $form_values) {
+  switch ($_POST['op']) {
+    case t('Save'):
+      if (isset($form_values['page_title']) && user_access('administer meta tags')) {
+        _page_title_set('panels', $form_values['panel_page']->did, $form_values['page_title']);
+      }
+      break;
+
+    case t('Delete'):
+      if ($form_values['confirm']) {
+        _page_title_delete('panels', $form_values->did);
+      }
+      break;
   }
 }
 
@@ -108,21 +190,19 @@ function page_title_form_alter($form_id,
 function page_title_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
   switch ($op) {
     case 'update':
-      db_query("DELETE FROM {page_title} WHERE nid = %d", $node->nid);
-      // fallthrough to insert intentional!
     case 'insert':
       if (strlen(trim($node->page_title)) > 0) {
-        db_query("INSERT INTO {page_title} VALUES (%d, '%s')", $node->nid, $node->page_title);
+        _page_title_set('node', $node->nid, $node->page_title);
       }
       break;
 
     case 'delete':
-      db_query('DELETE FROM {page_title} WHERE nid = %d', $node->nid);
+      _page_title_delete('node', $node->nid);
       break;
 
     case 'load':
       $object = new stdClass();
-      $object->page_title = page_title_node_get_title($node->nid);
+      $object->page_title = _page_title_load('node', $node->nid);
       return array('page_title' => $object->page_title);
 
     case 'view':
@@ -134,6 +214,33 @@ function page_title_nodeapi(&$node, $op,
 }
 
 /**
+ * Implementation of hook_taxonomy().
+ */
+function page_title_taxonomy($op, $type, $object = NULL) {
+  if ($type == 'term') {
+    $id = $object['tid'];
+  }
+  else {
+    return;
+  }
+
+  switch ($op) {
+    case 'delete':
+      if (user_access('edit meta tags')) {
+        _page_title_delete($type, $id);
+      }
+      break;
+
+    case 'insert':
+    case 'update':
+      if (isset($object['nodewords']) && user_access('edit meta tags')) {
+        _page_title_set($type, $id, $object['page_title']);
+      }
+      break;
+  }
+}
+
+/**
  * Sets or retrieves the page title of the current page.
  *
  * @param $title
@@ -161,8 +268,8 @@ function page_title_set_title($title = N
  *   string The node's page title.
  */
 function page_title_node_get_title($nid) {
-  $row = db_fetch_object(db_query('SELECT page_title FROM {page_title} WHERE nid = %d', $nid));
-  return $row->page_title;
+  // keep this function around for backwards compatibility
+  return _page_title_load('node', $nid);
 }
 
 /**
@@ -178,18 +285,37 @@ function page_title_page_get_title() {
   static $title = NULL;
 
   if (is_null($title)) {
+    // get the format
     $page_title_individual = variable_get('page_title_individual', '!page_title | !site_name');
     $page_title_front = variable_get('page_title_front', '!site_name | !site_slogan');
+    // get the other pieces
+    $site_name = variable_get('site_name', 'drupal');
+    $site_slogan = variable_get('site_slogan', '');
+    
+    // Autodetect if $type and/or $ids is not set
+    $result = _page_title_detect_type_and_ids();
+    $type = $result['type'];
+    $ids = $result['ids'];
+
+    if (!is_array($ids)) {
+      $ids = array($ids);
+    }
+
+    // Load the values from the database
+    $custom_title = _page_title_load($type, $ids[0]);
 
     // this is the normal title. For node pages it is $node->title
     $drupal_title = drupal_get_title();
 
     // this is the custom page title. For node pages it is $node->page_title.
-    $page_title = (page_title_set_title()) ? page_title_set_title() : $drupal_title;
-    $page_title = strip_tags($page_title);
-
-    $site_name = variable_get('site_name', 'drupal');
-    $site_slogan = variable_get('site_slogan', '');
+    if ($custom_title){
+       $page_title = strip_tags($custom_title);
+    }
+    else {
+      $page_title = (page_title_set_title()) ? page_title_set_title() : $drupal_title;
+      $page_title = strip_tags($page_title); 
+    }
+    //print_r($page_title);exit;
 
     if (drupal_is_front_page() || !$drupal_title) {
       $title = t($page_title_front, array('!site_name' => $site_name, '!site_slogan' => $site_slogan));
@@ -200,3 +326,88 @@ function page_title_page_get_title() {
   }
   return $title;
 }
+
+// some more new functions
+
+function _page_title_load($type, $id){
+  $result = db_result(db_query('SELECT page_title from {page_title} WHERE type = "%s" AND id = %d', $type, $id));
+  return $result;
+}
+
+function _page_title_set($type = NULL, $id = 0, $title = ''){
+  if ($row = db_result(db_query('SELECT sequence from {page_title} WHERE type = "%s" AND id = %d', $type, $id))){
+    db_query('UPDATE {page_title} SET title = "%s" WHERE sequence = %d', $title, $row);
+  }
+  db_query("INSERT INTO {page_title} (id, page_title, type) VALUES (%d, '%s', '%s')", $id, $title, $type);
+}
+
+function _page_title_delete($type = NULL, $id = 0){
+  db_query("DELETE FROM {page_title} WHERE type = '%s' AND id = %d'", $type, $id);
+}
+
+function _page_title_detect_type_and_ids(){
+  if (module_exists('panels')) {
+    if (function_exists('panels_api_version') && module_exists('panels_page')) {
+      $version = panels_api_version();
+      if ($version[0] == 2 && $version[1] == 0) {
+        $panel = db_fetch_array(db_query("SELECT * FROM {panels_page} WHERE path = '%s'", $_GET['q']));
+      }
+    }
+    else if (db_table_exists('panels_info')) {
+      $panel = db_fetch_array(db_query("SELECT * FROM {panels_info} WHERE path = '%s'", $_GET['q']));
+    }
+    if ($panel) {
+      return array('type' => 'panels', 'ids' => array($panel['did']));
+    }
+  }
+
+  switch (arg(0)) {
+    case 'node':
+      // Node paths: node/$nid
+      if (is_numeric(arg(1))) {
+        return array('type' => 'node', 'ids' => arg(1));
+      }
+      break;
+
+    case 'user':
+      // User paths translated into nodes: user/$uid -> node/$bio_nid
+      if (is_numeric(arg(1)) && module_exists('bio') && variable_get('bio_profile_takeover', 0)) {
+        if (($bio_nid = bio_for_user(arg(1)))) {
+          return array('type' => 'node', 'ids' => $bio_nid);
+        }
+      }
+      break;
+
+    case 'taxonomy':
+      // Taxonomy paths: term/$tid , term/$tid1+$tid2
+      if (arg(1) == 'term') {
+        $ids = preg_split('![+, ]!', arg(2));
+        if (count($ids)) {
+          return array('type' => arg(1), 'ids' => $ids);
+        }
+      }
+      break;
+
+    case 'forum':
+      // Forum paths: forum/$tid , forum/
+      if (is_numeric(arg(1))) {
+        return array('type' => 'term', 'ids' => arg(1));
+      }
+      elseif (is_null(arg(1))) {
+        return array('type' => 'vocabulary', 'ids' => variable_get('forum_nav_vocabulary', 0));
+      }
+      break;
+
+    case 'image':
+      // Image gallery paths: image/ , image/???/$tid
+      if (is_null(arg(1))) {
+        return array('type' => 'vocabulary', 'ids' => variable_get('image_gallery_nav_vocabulary', 0));
+      }
+      else if (is_numeric(arg(2))) {
+        return array('type' => 'term', 'ids' => arg(2));
+      }
+      break;
+  }
+
+  return array('type' => 'none', 'ids' => array());
+}
\ No newline at end of file
