Index: privatemsg.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/privatemsg.module,v
retrieving revision 1.70.2.30.2.91.2.100
diff -u -p -r1.70.2.30.2.91.2.100 privatemsg.module
--- privatemsg.module	23 Nov 2009 19:54:49 -0000	1.70.2.30.2.91.2.100
+++ privatemsg.module	25 Nov 2009 11:32:08 -0000
@@ -14,6 +14,10 @@ define('PRIVATEMSG_READ', 0);
  * Status constant for unread messages.
  */
 define('PRIVATEMSG_UNREAD', 1);
+/**
+ * Show unlimited messages in a thread.
+ */
+define('PRIVATEMSG_UNLIMITED', 'unlimited');
 
 /**
  * Implements hook_perm().
@@ -295,27 +299,36 @@ function privatemsg_thread_load($thread_
 
       // If limit is NULL, select based on get params.
       if (is_null($limit)) {
-        if (isset($_GET['show']) && (int)$_GET['show'] > 0) {
-          $limit = (int)$_GET['show'];
+        if (isset($_GET['show'])) {
+          $limit = $_GET['show'];
         }
         else {
-          $limit = variable_get('privatemsg_view_default_amount', 10);
+          $limit = variable_get('privatemsg_view_use_max_as_default', FALSE) ? variable_get('privatemsg_view_default_amount', 10) : variable_get('privatemsg_view_max_amount', 20);
         }
       }
       $thread['limit'] = $limit;
 
-      // load messages returned by the messages query with privatemsg_message_load_multiple().
+      // Load messages returned by the messages query with privatemsg_message_load_multiple().
       $query = _privatemsg_assemble_query('messages', array($thread_id), $thread['read_all'] ? NULL : $account);
       $thread['message_count'] = db_result(db_query($query['count']));
       // Check if we need to limit the messages.
-      $startwith = 0;
-      if ($thread['message_count'] > $limit) {
-        $startwith = $thread['message_count'] - $limit;
-      }
-      elseif ($limit > variable_get('privatemsg_view_default_amount', 10) && $limit > $thread['message_count']) {
-        $thread['limit'] = $limit = $thread['message_count'];
+      $max_amount = variable_get('privatemsg_view_max_amount', 20);
+      if ($limit != PRIVATEMSG_UNLIMITED) {
+        if ($max_amount == PRIVATEMSG_UNLIMITED) {
+          $max_amount = $thread['message_count'];
+        }
+        $startwith = 0;
+        if ($thread['message_count'] > $limit) {
+          $startwith = $thread['message_count'] - $limit;
+        }
+        elseif ($limit > $max_amount && $limit > $thread['message_count']) {
+          $limit = $thread['message_count'];
+        }
+        $conversation = db_query_range($query['query'], $startwith, $max_amount);
+        }
+      else {
+        $conversation = db_query($query['query']);
       }
-      $conversation = db_query_range($query['query'], $startwith, variable_get('privatemsg_view_max_amount', 50));
       $mids = array();
       while ($result = db_fetch_array($conversation)) {
         $mids[] = $result['mid'];
@@ -379,13 +392,6 @@ function private_message_settings() {
     '#default_value' => variable_get('private_message_view_template', 'privatemsg-view'),
     '#options'       => private_message_view_options(),
   );
-  $form['privatemsg_per_page'] = array(
-    '#type' => 'select',
-    '#title' => t('Messages per page'),
-    '#default_value' => variable_get('privatemsg_per_page', 25),
-    '#options' => drupal_map_assoc(array(10, 25, 50, 75, 100)),
-    '#description' => t('Choose the number of conversations that should be listed per page.'),
-  );
   $form['privatemsg_display_loginmessage'] = array(
     '#type' => 'checkbox',
     '#title' => t('Inform the user about new messages on login'),
@@ -429,6 +435,14 @@ function private_message_settings() {
     '#collapsed' => FALSE,
   );
 
+  $form['privatemsg_listing']['privatemsg_per_page'] = array(
+    '#type' => 'select',
+    '#title' => t('Threads per page'),
+    '#default_value' => variable_get('privatemsg_per_page', 25),
+    '#options' => drupal_map_assoc(array(10, 25, 50, 75, 100)),
+    '#description' => t('Choose the number of conversations that should be listed per page.'),
+  );
+
   $form['privatemsg_listing']['privatemsg_display_fields'] = array(
     '#type' => 'checkboxes',
     '#title' => t('Configure fields'),
@@ -441,22 +455,36 @@ function private_message_settings() {
     '#default_value' => variable_get('privatemsg_display_fields', array('participants')),
   );
 
-  $form['privatemsg_listing']['privatemsg_view_default_amount'] = array(
-    '#type'          => 'textfield',
-    '#title'         => t('Number of messages on first thread page'),
-    '#default_value' => variable_get('privatemsg_view_default_amount', 10),
-    '#description'   => t('The number of messages to be displayed on first page. Displays the newest messages.'),
+  $amounts = drupal_map_assoc(array(5, 10, 30, 50, 70, 90, 150, 200, 250, 300));
+  $form['privatemsg_listing']['privatemsg_view_max_amount'] = array(
+    '#type'          => 'select',
+    '#title'         => t('Number of messages on thread pages'),
+    '#options'       => $amounts + array(PRIVATEMSG_UNLIMITED => t('Unlimited')),
+    '#default_value' => variable_get('privatemsg_view_max_amount', 20),
+    '#description'   => t('Threads will not show more than this number of messages on a single page.'),
     '#weight'        => 10,
   );
 
-  $form['privatemsg_listing']['privatemsg_view_max_amount'] = array(
-    '#type'          => 'textfield',
-    '#title'         => t('Number of messages on other thread pages'),
-    '#default_value' => variable_get('privatemsg_view_max_amount', 50),
-    '#description'   => t('Threads will not show more than this number of messages on a single page.'),
+  $form['privatemsg_listing']['privatemsg_view_use_max_as_default'] = array(
+    '#type'          => 'checkbox',
+    '#title'         => t('Display different amount of messages on first thread page'),
+    '#default_value' => variable_get('privatemsg_view_use_max_as_default', FALSE),
+    '#description'   => t('By default, the first thread page shows the maximally allowed amount of messages. Enable this checkbox to set a different value.'),
     '#weight'        => 15,
   );
 
+  $form['privatemsg_listing']['privatemsg_view_default_amount'] = array(
+    '#prefix'        => '<div id="privatemsg-view-default-button">',
+    '#suffix'        => '</div>',
+    '#type'          => 'select',
+    '#title'         => t('Number of messages on first thread page'),
+    '#default_value' => variable_get('privatemsg_view_default_amount', 10),
+    '#description'   => t('The number of messages to be displayed on first thread page. Displays the newest messages.'),
+    '#options'       => $amounts,
+    '#weight'        => 20,
+  );
+  drupal_add_js(drupal_get_path('module', 'privatemsg') .'/privatemsg-admin.js');
+
   $form['#submit'][] = 'private_message_settings_submit';
   return system_settings_form($form);
 }
@@ -685,31 +713,47 @@ function privatemsg_view($thread) {
   drupal_set_title(check_plain($thread['subject']));
 
   // Generate paging links.
-  if ($thread['message_count'] > count($thread['messages'])) {
-    $from = $thread['message_count'] - $thread['limit'] + 1;
-    $to = $from - 1 + (($thread['limit'] > variable_get('privatemsg_view_max_amount', 50)) ? variable_get('privatemsg_view_max_amount', 50) : $thread['limit']);
-
-    $previous = '';
-    if ($from > 1) {
-      $options = array(
-        'query' => array('show' => (isset($_GET['show']) ? $_GET['show'] : 0) + variable_get('privatemsg_view_max_amount', 50)),
-        'title' => t('Display older messages'),
-      );
-       $previous = l(t('<<'), 'messages/view/' . $thread['thread_id'], $options);
+  $max_amount =  variable_get('privatemsg_view_max_amount', 20);
+  if ($thread['limit'] == PRIVATEMSG_UNLIMITED) {
+    $from = 1;
+    $to = $thread['message_count'];
+  }
+  else {
+    $from = ($thread['message_count'] > $thread['limit']) ? $thread['message_count'] - $thread['limit'] + 1 : 1;
+    if ($max_amount == PRIVATEMSG_UNLIMITED) {
+      $to = $thread['message_count'];
     }
-    $newer = '';
-    if ($to < $thread['message_count']) {
-      $options = array(
-        'query' => array('show' => $thread['limit'] - variable_get('privatemsg_view_max_amount', 50)),
-        'title' => t('Display newer messages'),
-      );
-      $newer = l(t('>>'), 'messages/view/' . $thread['thread_id'], $options);
+    else {
+      $to = $from - 1 + (($thread['limit'] > $max_amount) ? $max_amount : $thread['limit']);
+      if ($to > $thread['message_count']) {
+        $to = $thread['message_count'];
+      }
     }
-
-    $title = t('!previous_link Displaying messages @from - @to of @total !newer_link', array('@from' => $from, '@to' => $to, '@total' => $thread['message_count'], '!previous_link' => $previous, '!newer_link' => $newer));
-    $content['display_all']['#value'] = trim($title);
-    $content['display_all']['#weight'] = -10;
   }
+  $previous = '';
+  if ($from > 1) {
+    $options = array(
+      'query' => array('show' => ($max_amount == PRIVATEMSG_UNLIMITED) ? $max_amount : $thread['limit'] + $max_amount),
+      'title' => t('Display older messages'),
+    );
+     $previous = l(t('<<'), 'messages/view/' . $thread['thread_id'], $options);
+  }
+  $newer = '';
+  if ($to < $thread['message_count']) {
+    $options = array(
+      'query' => array('show' => $thread['limit'] - $max_amount),
+      'title' => t('Display newer messages'),
+    );
+    $newer = l(t('>>'), 'messages/view/' . $thread['thread_id'], $options);
+  }
+
+  $title = t('!previous_link Displaying messages @from - @to of @total !newer_link', array('@from' => $from, '@to' => $to, '@total' => $thread['message_count'], '!previous_link' => $previous, '!newer_link' => $newer));
+  $content['display_all']['#value'] = trim($title);
+  $content['display_all']['#weight'] = -10;
+
+  // Display a copy at the end.
+  $content['display_all_bottom']['#value'] = trim($title);
+  $content['display_all_bottom']['#weight'] = 3;
 
   // Render the participants.
   $content['participants']['#value'] = theme('privatemsg_recipients', $thread);
Index: privatemsg.install
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/privatemsg.install,v
retrieving revision 1.5.2.4.2.11.2.16
diff -u -p -r1.5.2.4.2.11.2.16 privatemsg.install
--- privatemsg.install	6 Nov 2009 13:06:26 -0000	1.5.2.4.2.11.2.16
+++ privatemsg.install	25 Nov 2009 11:32:10 -0000
@@ -116,6 +116,7 @@ function privatemsg_uninstall() {
   variable_del('privatemsg_per_page');
   variable_del('privatemsg_display_loginmessage');
   variable_del('privatemsg_display_fields');
+  variable_del('privatemsg_view_max_amount');
   drupal_uninstall_schema('privatemsg');
 }
 
Index: privatemsg-admin.js
===================================================================
RCS file: privatemsg-admin.js
diff -N privatemsg-admin.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ privatemsg-admin.js	25 Nov 2009 11:32:10 -0000
@@ -0,0 +1,10 @@
+// $Id$
+
+Drupal.behaviors.privatemsgAdminSettings = function (context) {
+  if (!$('#edit-privatemsg-view-use-max-as-default').attr('checked')) {
+    $('#privatemsg-view-default-button').hide();
+  }
+  $('#edit-privatemsg-view-use-max-as-default').change( function () {
+    $('#privatemsg-view-default-button').toggle();
+  });
+}
\ No newline at end of file
Index: privatemsg.test
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/privatemsg.test,v
retrieving revision 1.2.2.11
diff -u -p -r1.2.2.11 privatemsg.test
--- privatemsg.test	23 Nov 2009 15:09:14 -0000	1.2.2.11
+++ privatemsg.test	25 Nov 2009 11:32:12 -0000
@@ -74,11 +74,11 @@ class PrivatemsgTestCase extends DrupalW
 
     $subject = $this->randomName(20);
     $bodies = array();
-    for ($i = 0; $i < 25; $i++) {
+    for ($i = 0; $i < 23; $i++) {
       $bodies[$i] = $this->randomName(100);
     }
     $thread = privatemsg_new_thread(array($recipient), $subject, $bodies[0], array('author' => $author));
-    for ($i = 1; $i < 25; $i++) {
+    for ($i = 1; $i < 23; $i++) {
       privatemsg_reply($thread['message']['thread_id'], $bodies[$i], array('author' => $author));
     }
 
@@ -86,37 +86,67 @@ class PrivatemsgTestCase extends DrupalW
     $this->drupalGet('messages');
     $this->clickLink($subject);
 
+    // Verify that only the last 10 messages are displayed.
+    $this->assertText(t('Displaying messages 14 - 23 of 23'), t('Pager is displayed'));
+    $this->assertNoText($bodies[0], t('First message is not displayed.'));
+    $this->assertNoText($bodies[12], t('Hidden message is not displayed.'));
+    $this->assertText($bodies[13], t('Message is displayed.'));
+    $this->assertText($bodies[22], t('Message is displayed.'));
+
+    variable_set('privatemsg_view_use_max_as_default', TRUE);
+    $this->drupalGet('messages');
+    $this->clickLink($subject);
+
+    // Now with separate default value.
     // Verify that only the last 5 messages are displayed.
-    $this->assertText(t('Displaying messages 21 - 25 of 25'), t('Pager is displayed'));
+    $this->assertText(t('Displaying messages 19 - 23 of 23'), t('Pager is displayed'));
     $this->assertNoText($bodies[0], t('First message is not displayed.'));
-    $this->assertNoText($bodies[19], t('Hidden message is not displayed.'));
-    $this->assertText($bodies[20], t('Message is displayed.'));
-    $this->assertText($bodies[24], t('Message is displayed.'));
+    $this->assertNoText($bodies[17], t('Hidden message is not displayed.'));
+    $this->assertText($bodies[18], t('Message is displayed.'));
+    $this->assertText($bodies[22], t('Message is displayed.'));
 
     // Load older messages and verify again.
     $this->clickLink(t('<<'));
-    $this->assertText(t('Displaying messages 16 - 25 of 25'), t('Pager is displayed'));
+    $this->assertText(t('Displaying messages 9 - 18 of 23'), t('Pager is displayed'));
     $this->assertNoText($bodies[0], t('First message is not displayed.'));
-    $this->assertNoText($bodies[14], t('Hidden message is not displayed.'));
-    $this->assertText($bodies[15], t('Message is displayed.'));
-    $this->assertText($bodies[24], t('Message is displayed.'));
+    $this->assertNoText($bodies[7], t('Hidden message is not displayed.'));
+    $this->assertText($bodies[8], t('Message is displayed.'));
+    $this->assertText($bodies[17], t('Message is displayed.'));
+    $this->assertNoText($bodies[22], t('Hidden message is not displayed.'));
 
     // Load older messages and verify again.
     $this->clickLink(t('<<'));
-    $this->assertText(t('Displaying messages 6 - 15 of 25'), t('Pager is displayed'));
-    $this->assertNoText($bodies[0], t('First message is not displayed.'));
-    $this->assertNoText($bodies[4], t('Hidden message is not displayed.'));
-    $this->assertText($bodies[5], t('Message is displayed.'));
-    $this->assertText($bodies[14], t('Message is displayed.'));
-    $this->assertNoText($bodies[15], t('Hidden message is not displayed.'));
+    $this->assertText(t('Displaying messages 1 - 10 of 23'), t('Pager is displayed'));
+    $this->assertText($bodies[0], t('Message is displayed.'));
+    $this->assertText($bodies[9], t('Message is displayed.'));
+    $this->assertNoText($bodies[10], t('Hidden message is not displayed.'));
 
-    // Display newer messages and verify again.
+    // Going back should follow the same order.
     $this->clickLink(t('>>'));
-    $this->assertText(t('Displaying messages 16 - 25 of 25'), t('Pager is displayed'));
+    $this->assertText(t('Displaying messages 9 - 18 of 23'), t('Pager is displayed'));
     $this->assertNoText($bodies[0], t('First message is not displayed.'));
-    $this->assertNoText($bodies[14], t('Hidden message is not displayed.'));
-    $this->assertText($bodies[15], t('Message is displayed.'));
-    $this->assertText($bodies[24], t('Message is displayed.'));
+    $this->assertNoText($bodies[7], t('Hidden message is not displayed.'));
+    $this->assertText($bodies[8], t('Message is displayed.'));
+    $this->assertText($bodies[17], t('Message is displayed.'));
+    $this->assertNoText($bodies[22], t('Hidden message is not displayed.'));
+
+    variable_set('privatemsg_view_max_amount', PRIVATEMSG_UNLIMITED);
+    $this->drupalGet('messages');
+    $this->clickLink($subject);
+
+    // Now with separate default value.
+    // Verify that only the last 5 messages are displayed.
+    $this->assertText(t('Displaying messages 19 - 23 of 23'), t('Pager is displayed'));
+    $this->assertNoText($bodies[0], t('First message is not displayed.'));
+    $this->assertNoText($bodies[17], t('Hidden message is not displayed.'));
+    $this->assertText($bodies[18], t('Message is displayed.'));
+    $this->assertText($bodies[22], t('Message is displayed.'));
+
+    // Load older messages and verify again.
+    $this->clickLink(t('<<'));
+    $this->assertText(t('Displaying messages 1 - 23 of 23'), t('Pager is displayed'));
+    $this->assertText($bodies[0], t('Message is displayed.'));
+    $this->assertText($bodies[22], t('Message is displayed.'));
   }
 
   /**
