Index: modules/contact/contact.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.admin.inc,v
retrieving revision 1.8
diff -u -p -r1.8 contact.admin.inc
--- modules/contact/contact.admin.inc	8 Mar 2009 05:08:22 -0000	1.8
+++ modules/contact/contact.admin.inc	23 Mar 2009 17:34:30 -0000
@@ -12,7 +12,13 @@
 function contact_admin_categories() {
   $rows = array();
 
-  $header = array(t('Category'), t('Recipients'), t('Selected'), array('data' => t('Operations'), 'colspan' => 2));
+  $header = array(
+    t('Category'),
+    t('Recipients'),
+    t('Selected'),
+    t('Link to form'),
+    array('data' => t('Operations'), 'colspan' => 2)
+  );
 
   // Get all the contact categories from the database.
   $result = db_query('SELECT cid, category, recipients, selected FROM {contact} ORDER BY weight, category');
@@ -23,6 +29,7 @@ function contact_admin_categories() {
       $record->category,
       $record->recipients,
       ($record->selected ? t('Yes') : t('No')),
+      l(t('contact form'), 'contact/'. $record->cid),
       l(t('edit'), 'admin/build/contact/edit/' . $record->cid),
       l(t('delete'), 'admin/build/contact/delete/' . $record->cid),
     );
@@ -44,6 +51,7 @@ function contact_admin_edit($form_state 
   if (empty($contact) || $op == 'add') {
     $contact = array(
       'category' => '',
+      'information' => '',
       'recipients' => '',
       'reply' => '',
       'weight' => 0,
@@ -59,6 +67,12 @@ function contact_admin_edit($form_state 
     '#description' => t("Example: 'website feedback' or 'product information'."),
     '#required' => TRUE,
   );
+  $form['information'] = array('#type' => 'textarea',
+    '#title' => t('Additional information for this category'),
+    '#default_value' => $contact['information'],
+    '#description' => t("Leave empty if you want to use default."),
+    '#required' => FALSE,
+  );
   $form['recipients'] = array('#type' => 'textarea',
     '#title' => t('Recipients'),
     '#default_value' => $contact['recipients'],
Index: modules/contact/contact.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.install,v
retrieving revision 1.11
diff -u -p -r1.11 contact.install
--- modules/contact/contact.install	15 Nov 2008 13:01:05 -0000	1.11
+++ modules/contact/contact.install	23 Mar 2009 17:34:30 -0000
@@ -41,6 +41,12 @@ function contact_schema() {
         'default' => '',
         'description' => 'Category name.',
       ),
+      'information' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'Additional information.',
+      ),
       'recipients' => array(
         'type' => 'text',
         'not null' => TRUE,
@@ -79,3 +85,20 @@ function contact_schema() {
 
   return $schema;
 }
+
+
+/**
+ * Implementation of hook_update_N().
+ */
+function contact_update_7000() {
+  $ret = array();
+  db_add_field($ret, 'contact', 'information',
+    array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+      'description' => 'Additional information.',
+      'initial' => '',
+    ));
+  return $ret;
+}
\ No newline at end of file
Index: modules/contact/contact.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.module,v
retrieving revision 1.112
diff -u -p -r1.112 contact.module
--- modules/contact/contact.module	8 Mar 2009 05:08:22 -0000	1.112
+++ modules/contact/contact.module	23 Mar 2009 17:34:30 -0000
@@ -99,6 +99,14 @@ function contact_menu() {
     'access arguments' => array('access site-wide contact form'),
     'type' => MENU_SUGGESTED_ITEM,
   );
+  $items['contact/%contact'] = array(
+    'title callback' => 'contact_page_title',
+    'title arguments' => array(1),
+    'page callback' => 'contact_site_page',
+    'page arguments' => array(1),
+    'access arguments' => array('access site-wide contact form'),
+    'type' => MENU_SUGGESTED_ITEM,
+  );
   $items['user/%user/contact'] = array(
     'title' => 'Contact',
     'page callback' => 'contact_user_page',
@@ -131,7 +139,7 @@ function _contact_user_tab_access($accou
  * Load the data for a single contact category.
  */
 function contact_load($cid) {
-  $contact = db_query("SELECT cid, category, recipients, reply, weight, selected FROM {contact} WHERE cid = :cid", array(':cid' => $cid))
+  $contact = db_query("SELECT cid, category, information, recipients, reply, weight, selected FROM {contact} WHERE cid = :cid", array(':cid' => $cid))
     ->fetchAssoc();
   return empty($contact) ? FALSE : $contact;
 }
@@ -200,3 +208,10 @@ function contact_mail($key, &$message, $
       break;
   }
 }
+
+/**
+ * Set the page title for the contact pages.
+ */
+function contact_page_title($contact) {
+  return t('Contact @category', array('@category' => $contact['category']));
+}
Index: modules/contact/contact.pages.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.pages.inc,v
retrieving revision 1.16
diff -u -p -r1.16 contact.pages.inc
--- modules/contact/contact.pages.inc	8 Mar 2009 05:08:22 -0000	1.16
+++ modules/contact/contact.pages.inc	23 Mar 2009 17:34:30 -0000
@@ -9,21 +9,37 @@
 
 /**
  * Site-wide contact page.
+ *
+ * @param $contact
+ *   A keyed array containing the current data of the contact.
+ *
+ * @return
+ *   The generated page.
  */
-function contact_site_page() {
+function contact_site_page($contact = array()) {
   global $user;
 
   if (!flood_is_allowed('contact', variable_get('contact_hourly_threshold', 3)) && !user_access('administer site-wide contact form')) {
     $output = t("You cannot send more than %number messages per hour. Please try again later.", array('%number' => variable_get('contact_hourly_threshold', 3)));
   }
   else {
-    $output = drupal_get_form('contact_mail_page');
+    $output = drupal_get_form('contact_mail_page', $contact);
   }
 
   return $output;
 }
 
-function contact_mail_page() {
+/**
+ * Contact form.
+ *
+ * @param  $form_state
+ *   A keyed array containing the current state of the form.
+ * @param $contact
+ *   A keyed array containing the current data of the contact.
+ * @return
+ *   The contact form.
+ */
+function contact_mail_page($form_state, $contact = array()) {
   global $user;
 
   $form = $categories = array();
@@ -34,16 +50,29 @@ function contact_mail_page() {
     ->orderby('category')
     ->execute();
 
-  foreach ($result as $record) {
-    $categories[$record->cid] = $record->category;
-    if ($record->selected) {
-      $default_category = $record->cid;
+  if ($contact) {
+    $categories[] = $contact;
+  }
+  else {
+    foreach ($result as $record) {
+      $categories[$record->cid] = $record->category;
+      if ($record->selected) {
+        $default_category = $record->cid;
+      }
     }
   }
 
   if (count($categories) > 0) {
     $form['#token'] = $user->uid ? $user->name . $user->mail : '';
-    $form['contact_information'] = array('#markup' => filter_xss_admin(variable_get('contact_form_information', t('You can leave a message using the contact form below.'))));
+
+    if ($contact && trim($contact['information']) != '') {
+      $information = $contact['information'];
+    }
+    else {
+      $information = variable_get('contact_form_information', t('You can leave a message using the contact form below.'));
+    }
+
+    $form['contact_information'] = array('#markup' => filter_xss_admin($information));
     $form['name'] = array('#type' => 'textfield',
       '#title' => t('Your name'),
       '#maxlength' => 255,
Index: modules/contact/contact.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.test,v
retrieving revision 1.15
diff -u -p -r1.15 contact.test
--- modules/contact/contact.test	8 Mar 2009 05:08:22 -0000	1.15
+++ modules/contact/contact.test	23 Mar 2009 17:34:31 -0000
@@ -48,23 +48,23 @@ class ContactSitewideTestCase extends Dr
     // Test invalid recipients.
     $invalid_recipients = array('invalid', 'invalid@', 'invalid@site', 'invalid@site.', '@site.', '@site.com');
     foreach ($invalid_recipients as $invalid_recipient) {
-      $this->addCategory($this->randomName(16), $invalid_recipient, '', FALSE);
+      $this->addCategory($this->randomName(16), '', $invalid_recipient, '', FALSE);
       $this->assertRaw(t('%recipient is an invalid e-mail address.', array('%recipient' => $invalid_recipient)), t('Caught invalid recipient (' . $invalid_recipient . ').'));
     }
 
     // Test validation of empty category and recipients fields.
-    $this->addCategory($category = '', '', '', TRUE);
+    $this->addCategory($category = '', '', '', '', TRUE);
     $this->assertText(t('Category field is required.'), t('Caught empty category field'));
     $this->assertText(t('Recipients field is required.'), t('Caught empty recipients field.'));
 
     // Create first valid category.
     $recipients = array('simpletest@example.com', 'simpletest2@example.com', 'simpletest3@example.com');
-    $this->addCategory($category = $this->randomName(16), implode(',', array($recipients[0])), '', TRUE);
+    $this->addCategory($category = $this->randomName(16), '', implode(',', array($recipients[0])), '', TRUE);
     $this->assertRaw(t('Category %category has been added.', array('%category' => $category)), t('Category successfully added.'));
 
     // Test update contact form category.
     $categories = $this->getCategories();
-    $category_id = $this->updateCategory($categories, $category = $this->randomName(16), $recipients_str = implode(',', array($recipients[0], $recipients[1])), $reply = $this->randomName(30), FALSE);
+    $category_id = $this->updateCategory($categories, $category = $this->randomName(16), '', $recipients_str = implode(',', array($recipients[0], $recipients[1])), $reply = $this->randomName(30), FALSE);
     $category_array = db_query("SELECT category, recipients, reply, selected FROM {contact} WHERE cid = :cid", array(':cid' => $category_id))->fetchAssoc();
     $this->assertEqual($category_array['category'], $category);
     $this->assertEqual($category_array['recipients'], $recipients_str);
@@ -81,10 +81,10 @@ class ContactSitewideTestCase extends Dr
     $this->drupalLogin($admin_user);
 
     // Add more categories.
-    $this->addCategory($category = $this->randomName(16), implode(',', array($recipients[0], $recipients[1])), '', FALSE);
+    $this->addCategory($category = $this->randomName(16), '', implode(',', array($recipients[0], $recipients[1])), '', FALSE);
     $this->assertRaw(t('Category %category has been added.', array('%category' => $category)), t('Category successfully added.'));
 
-    $this->addCategory($category = $this->randomName(16), implode(',', array($recipients[0], $recipients[1], $recipients[2])), '', FALSE);
+    $this->addCategory($category = $this->randomName(16), '', implode(',', array($recipients[0], $recipients[1], $recipients[2])), '', FALSE);
     $this->assertRaw(t('Category %category has been added.', array('%category' => $category)), t('Category successfully added.'));
 
     // Clear flood table in preparation for flood test and allow other checks to complete.
@@ -159,9 +159,10 @@ class ContactSitewideTestCase extends Dr
    * @param string $reply Auto-reply text.
    * @param boolean $selected Defautly selected.
    */
-  function addCategory($category, $recipients, $reply, $selected) {
+  function addCategory($category, $information, $recipients, $reply, $selected) {
     $edit = array();
     $edit['category'] = $category;
+    $edit['information'] = $information;
     $edit['recipients'] = $recipients;
     $edit['reply'] = $reply;
     $edit['selected'] = ($selected ? '1' : '0');
@@ -176,10 +177,11 @@ class ContactSitewideTestCase extends Dr
    * @param string $reply Auto-reply text.
    * @param boolean $selected Defautly selected.
    */
-  function updateCategory($categories, $category, $recipients, $reply, $selected) {
+  function updateCategory($categories, $category, $information, $recipients, $reply, $selected) {
     $category_id = $categories[array_rand($categories)];
     $edit = array();
     $edit['category'] = $category;
+    $edit['information'] = $information;
     $edit['recipients'] = $recipients;
     $edit['reply'] = $reply;
     $edit['selected'] = ($selected ? '1' : '0');
