Reworked paginator code, everyone try it out.
authorthomppj <thomppj@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Fri, 7 Dec 2001 07:44:21 +0000 (07:44 +0000)
committerthomppj <thomppj@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Fri, 7 Dec 2001 07:44:21 +0000 (07:44 +0000)
git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@1843 7612ce4b-ef26-0410-bec9-ea0150e637f0

ChangeLog
functions/mailbox_display.php
functions/prefs.php

index f736bc40aad827f75c99040cc4a28e1145975d57..2dc49ad4df5abee858ff567964d972fb6708317c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,11 @@
-****************************************************************
+***************************************************************
 *** Squirrelmail Development Series 1.1 and 1.1 Pre-Releases ***
 ****************************************************************
 
+Version 1.2.0-rc4 -- December ??, 2001 (PENDING)
+------------------------------------------------
+  - Cleanup of the paginator code, improving display style.
+
 Version 1.2.0-rc3 -- December 2, 2001
 -------------------------------------
   - Speed improvements and optimizations on much of the code
index 8e80efa69bfb6feba4dab4e51d4f322b4dbdf87c..1dcc345018dd7eda25c847368ad939b85eac8505 100644 (file)
@@ -378,7 +378,8 @@ function displayMessageArray($imapConnection, $num_msgs, $start_msg, &$msgs, $ms
     do_hook('mailbox_index_before');
 
     $msg_cnt_str = get_msgcnt_str($start_msg, $end_msg, $num_msgs);
-    $paginator_str = get_paginator_str($urlMailbox, $start_msg, $end_msg, $num_msgs, $show_num, $sort);
+    $paginator_str = get_paginator_str
+        ($urlMailbox, $start_msg, $end_msg, $num_msgs, $show_num, $sort);
 
     if (! isset($msg)) {
         $msg = '';
@@ -478,33 +479,27 @@ function mail_message_listing_beginning
     * This is the beginning of the message list table.
     * It wraps around all messages
     */
-    echo "<TABLE WIDTH=\"100%\" BORDER=\"0\" CELLPADDING=\"1\" CELLSPACING=\"0\">\n".
-        "<TR BGCOLOR=\"$color[0]\"><TD>".
-            "<TABLE BGCOLOR=\"$color[4]\" width=\"100%\" CELLPADDING=\"2\" CELLSPACING=\"0\" BORDER=\"0\"><TR>\n".
-        "    <TD ALIGN=LEFT>$paginator";
-
-    if( $paginator <> '&nbsp;' ) {
-        echo ' | ';
-    }
-
-    echo get_selectall_link($start_msg, $sort) . "</TD>\n".
-        "    <TD ALIGN=RIGHT>$msg_cnt_str</TD>\n".
-        "  </TR></TABLE>\n".
-        '</TD></TR>'.
-        "<TR><TD BGCOLOR=\"$color[0]\">\n".
-        "<FORM name=messageList method=post action=\"$moveURL\">\n".
-        "<TABLE BGCOLOR=\"$color[0]\" COLS=2 BORDER=0 cellpadding=0 cellspacing=0 width=\"100%\">\n".
-        "   <TR>\n" .
-        "      <TD ALIGN=LEFT VALIGN=CENTER NOWRAP>\n" .
-        '         <SMALL>&nbsp;' . _("Move selected to:") . "</SMALL>\n" .
-        "      </TD>\n" .
-        "      <TD ALIGN=RIGHT NOWRAP>\n" .
-        '         <SMALL>&nbsp;' . _("Transform Selected Messages") . ": &nbsp; </SMALL><BR>\n" .
-        "      </TD>\n" .
-        "   </TR>\n" .
-        "   <TR>\n" .
-        "      <TD ALIGN=LEFT VALIGN=CENTER NOWRAP>\n" .
-        '         <SMALL>&nbsp;<TT><SELECT NAME="targetMailbox">';
+    echo "<TABLE WIDTH=\"100%\" BORDER=\"0\" CELLPADDING=\"1\" CELLSPACING=\"0\">\n"
+       . "<TR BGCOLOR=\"$color[0]\"><TD>"
+       . "    <TABLE BGCOLOR=\"$color[4]\" width=\"100%\" CELLPADDING=\"2\" CELLSPACING=\"0\" BORDER=\"0\"><TR>\n"
+       . "    <TD ALIGN=LEFT>$paginator</TD>\n"
+       . "    <TD ALIGN=RIGHT>$msg_cnt_str</TD>\n"
+       . "  </TR></TABLE>\n"
+       . '</TD></TR>'
+       . "<TR><TD BGCOLOR=\"$color[0]\">\n"
+       . "<FORM name=messageList method=post action=\"$moveURL\">\n"
+       . "<TABLE BGCOLOR=\"$color[0]\" COLS=2 BORDER=0 cellpadding=0 cellspacing=0 width=\"100%\">\n"
+       . "   <TR>\n"
+       . "      <TD ALIGN=LEFT VALIGN=CENTER NOWRAP>\n"
+       . '         <SMALL>&nbsp;' . _("Move selected to:") . "</SMALL>\n"
+       . "      </TD>\n"
+       . "      <TD ALIGN=RIGHT NOWRAP>\n"
+       . '         <SMALL>&nbsp;' . _("Transform Selected Messages") . ": &nbsp; </SMALL><BR>\n"
+       . "      </TD>\n"
+       . "   </TR>\n"
+       . "   <TR>\n"
+       . "      <TD ALIGN=LEFT VALIGN=CENTER NOWRAP>\n"
+       . '         <SMALL>&nbsp;<TT><SELECT NAME="targetMailbox">';
 
     $boxes = sqimap_mailbox_list($imapConnection);
     for ($i = 0; $i < count($boxes); $i++) {
@@ -667,75 +662,205 @@ function get_msgcnt_str($start_msg, $end_msg, $num_msgs) {
 }
 
 /**
-* This function computes the paginator string.
-*/
+ * Generate a paginator link.
+ */
+function get_paginator_link
+($box, $start_msg, $use, $text) {
+    $result = "<A HREF=\"right_main.php?use_mailbox_cache=$use"
+            . "&startMessage=$start_msg&mailbox=$box\" "
+            . "TARGET=\"right\">$text</A>";
+    return ($result);
+}
+
+/**
+ * This function computes the paginator string.
+ */
 function get_paginator_str
-($urlMailbox, $start_msg, $end_msg, $num_msgs, $show_num, $sort) {
+($box, $start_msg, $end_msg, $num_msgs, $show_num, $sort) {
     global $username, $data_dir, $use_mailbox_cache, $color;
 
-    $nextGroup = $start_msg + $show_num;
-    $prevGroup = $start_msg - $show_num;
+    /* Initialize paginator string chunks. */
+    $prv_str = '';
+    $nxt_str = '';
+    $pg_str = '';
+    $all_str = '';
+    $tgl_str = '';
+
+    /* Create simple strings that will be creating the paginator. */
+    $spc = '&nbsp;';     /* This will be used as a space. */
+    $sep = '|';          /* This will be used as a seperator. */
 
+    /* Get some paginator preference values. */
+    $pg_sel = getPref($data_dir, $username, 'page_selector', SM_OPT_ON);
+    $pg_max = getPref($data_dir, $username, 'page_selector_max', PG_SEL_MAX);
+
+    /* Make sure that our start message number is not too big. */
+    $start_msg = min($start_msg, $num_msgs);
+
+    /* Decide whether or not we will use the mailbox cache. */
+    /* Not sure why $use_mailbox_cache is even passed in.   */
     if ($sort == 6) {
         $use = 0;
     } else {
         $use = 1;
     }
-    $lMore = '';
-    $rMore = '';
-    if (($nextGroup <= $num_msgs) && ($prevGroup >= 0)) {
-        $lMore = "<A HREF=\"right_main.php?use_mailbox_cache=$use&startMessage=$prevGroup&mailbox=$urlMailbox\" TARGET=\"right\">". _("Previous") . '</A>';
-        $rMore = "<A HREF=\"right_main.php?use_mailbox_cache=$use&&startMessage=$nextGroup&mailbox=$urlMailbox\" TARGET=\"right\">". _("Next") ."</A>\n";
-    } else if (($nextGroup > $num_msgs) && ($prevGroup >= 0)) {
-        $lMore = "<A HREF=\"right_main.php?use_mailbox_cache=$use&startMessage=$prevGroup&mailbox=$urlMailbox\" TARGET=\"right\">". _("Previous") . '</A>';
-        $rMore = "<FONT COLOR=\"$color[9]\">"._("Next")."</FONT>\n";
-    } else if (($nextGroup <= $num_msgs) && ($prevGroup < 0)) {
-        $lMore = "<FONT COLOR=\"$color[9]\">"._("Previous") . '</FONT>';
-        $rMore = "<A HREF=\"right_main.php?use_mailbox_cache=$use&startMessage=$nextGroup&mailbox=$urlMailbox\" TARGET=\"right\">". _("Next") ."</A>\n";
-    }
-    if ($lMore <> '') {
-        $lMore .= ' | ';
-    }
-    if ($rMore <> '' || $lMore <> '' ) {
-        $rMore = "<A HREF=\"right_main.php?PG_SHOWNUM=9999use_mailbox_cache=$use&startMessage=1&mailbox=$urlMailbox\" TARGET=\"right\">" .
-                 _("All") . '</A> | ' . $rMore;
+
+    /* Compute the starting message of the previous and next page group. */
+    $next_grp = $start_msg + $show_num;
+    $prev_grp = $start_msg - $show_num;
+
+    /* Compute the basic previous and next strings. */
+    if (($next_grp <= $num_msgs) && ($prev_grp >= 0)) {
+        $prv_str = get_paginator_link($box, $prev_grp, $use, _("Previous"));
+        $nxt_str = get_paginator_link($box, $next_grp, $use, _("Next"));
+    } else if (($next_grp > $num_msgs) && ($prev_grp >= 0)) {
+        $prv_str = get_paginator_link($box, $prev_grp, $use, _("Previous"));
+        $nxt_str = "<FONT COLOR=\"$color[9]\">"._("Next")."</FONT>\n";
+    } else if (($next_grp <= $num_msgs) && ($prev_grp < 0)) {
+        $prv_str = "<FONT COLOR=\"$color[9]\">"._("Previous") . '</FONT>';
+        $nxt_str = get_paginator_link($box, $next_grp, $use, _("Next"));
     }
+
     /* Page selector block. Following code computes page links. */
-    $mMore = '';
-    if (getPref($data_dir, $username, 'page_selector')
-        && ($num_msgs > $show_num)) {
-        $j = intval( $num_msgs / $show_num );  // Max pages
-        $k = max( 1, $j / getPref($data_dir, $username, 'page_selector_max', PG_SEL_MAX ) );
-        if ($num_msgs % $show_num <> 0 ) {
-            $j++;
+    if ($pg_sel && ($num_msgs > $show_num)) {
+        /* Most importantly, what is the current page!!! */
+        $cur_pg = intval($start_msg / $show_num) + 1;
+
+        /* Compute total # of pages and # of paginator page links. */
+        $tot_pgs = ceil($num_msgs / $show_num);  /* Total # of Pages */
+        $vis_pgs = min($pg_max, $tot_pgs - 1);   /* Visible Pages    */
+
+        /************************************************************/
+        /* Compute the size of the four quarters of the page links. */
+        /************************************************************/
+
+        /* If we can, just show all the pages. */
+        if (($tot_pgs - 1) <= $pg_max) {
+            $q1_pgs = $cur_pg - 1;
+            $q2_pgs = $q3_pgs = 0;
+            $q4_pgs = $tot_pgs - $cur_pg;
+            
+        /* Otherwise, compute some magic to choose the four quarters. */
+        } else {
+            /* Compute the magic base values. Added together,  */
+            /* these values will always equal to the $pag_pgs. */
+            /* NOTE: These are DEFAULT values and do not take  */
+            /* the current page into account. That is below.   */
+            $q1_pgs = floor($vis_pgs/4);
+            $q2_pgs = round($vis_pgs/4, 0);
+            $q3_pgs = ceil($vis_pgs/4);
+            $q4_pgs = round(($vis_pgs - $q2_pgs)/3, 0);
+        
+            /* Adjust if the first quarter contains the current page. */
+            if (($cur_pg - $q1_pgs) < 1) {
+                $extra_pgs = ($q1_pgs - ($cur_pg - 1)) + $q2_pgs;
+                $q1_pgs = $cur_pg - 1;
+                $q2_pgs = 0;
+                $q3_pgs += ceil($extra_pgs / 2);
+                $q4_pgs += floor($extra_pgs / 2);
+
+            /* Adjust if the first and second quarters intersect. */
+            } else if (($cur_pg - $q2_pgs - ceil($q2_pgs/3)) <= $q1_pgs) {
+                $extra_pgs = $q2_pgs;
+                $extra_pgs -= ceil(($cur_pg - $q1_pgs - 1) * 0.75);
+                $q2_pgs = ceil(($cur_pg - $q1_pgs - 1) * 0.75);
+                $q3_pgs += ceil($extra_pgs / 2);
+                $q4_pgs += floor($extra_pgs / 2);
+
+            /* Adjust if the fourth quarter contains the current page. */
+            } else if (($cur_pg + $q4_pgs) >= $tot_pgs) {
+                $extra_pgs = ($q4_pgs - ($tot_pgs - $cur_pg)) + $q3_pgs;
+                $q3_pgs = 0;
+                $q4_pgs = $tot_pgs - $cur_pg;
+                $q1_pgs += floor($extra_pgs / 2);
+                $q2_pgs += ceil($extra_pgs / 2);
+
+            /* Adjust if the third and fourth quarter intersect. */
+            } else if (($cur_pg + $q3_pgs + 1) >= ($tot_pgs - $q4_pgs + 1)) {
+                $extra_pgs = $q3_pgs;
+                $extra_pgs -= ceil(($tot_pgs - $cur_pg - $q4_pgs) * 0.75);
+                $q3_pgs = ceil(($tot_pgs - $cur_pg - $q4_pgs) * 0.75);
+                $q1_pgs += floor($extra_pgs / 2);
+                $q2_pgs += ceil($extra_pgs / 2);
+            }
         }
-        $start_msg = min( $start_msg, $num_msgs );
-        $p = intval( $start_msg / $show_num ) + 1;
-        $i = 1;
-        while( $i < $p ) {
-            $pg = intval( $i );
-            $start = ( ($pg-1) * $show_num ) + 1;
-            $mMore .= "<a href=\"right_main.php?use_mailbox_cache=$use_mailbox_cache&startMessage=$start" .
-                    "&mailbox=$urlMailbox\" TARGET=\"right\">$pg</a>&nbsp;";
-            $i += $k;
+
+        /* I am leaving this debug code here, commented out, because    */
+        /* it is a really nice way to see what the above code is doing. */
+        /* echo "qts =  $q1_pgs/$q2_pgs/$q3_pgs/$q4_pgs = "             */
+        /*    . ($q1_pgs + $q2_pgs + $q3_pgs + $q4_pgs) . '<br>';       */
+
+        /************************************************************/
+        /* Print out the page links from the compute page quarters. */
+        /************************************************************/
+
+        /* Start with the first quarter. */
+        if (($q1_pgs == 0) && ($cur_pg > 1)) {
+            $pg_str .= "...$spc";
+        } else {
+            for ($pg = 1; $pg <= $q1_pgs; ++$pg) {
+                $start = (($pg-1) * $show_num) + 1;
+                $pg_str .= get_paginator_link($box, $start, $use, $pg) . $spc;
+            }
+            if ($cur_pg - $q2_pgs - $q1_pgs > 1) {
+                $pg_str .= "...$spc";
+            }
         }
-        $mMore .= "<B>$p</B>&nbsp;";
-        $i += $k;
-        while( $i <= $j ) {
-        $pg = intval( $i );
-        $start = ( ($pg-1) * $show_num ) + 1;
-        $mMore .= "<a href=\"right_main.php?use_mailbox_cache=$use_mailbox_cache&startMessage=$start"
-                . "&mailbox=$urlMailbox\" TARGET=\"right\">$pg</a>&nbsp;";
-        $i+=$k;
+
+        /* Continue with the second quarter. */
+        for ($pg = $cur_pg - $q2_pgs; $pg < $cur_pg; ++$pg) {
+            $start = (($pg-1) * $show_num) + 1;
+            $pg_str .= get_paginator_link($box, $start, $use, $pg) . $spc;
         }
-        $mMore .= '&nbsp;|&nbsp;';
+
+        /* Now print the current page. */
+        $pg_str .= $cur_pg . $spc;
+
+        /* Next comes the third quarter. */
+        for ($pg = $cur_pg + 1; $pg <= $cur_pg + $q3_pgs; ++$pg) {
+            $start = (($pg-1) * $show_num) + 1;
+            $pg_str .= get_paginator_link($box, $start, $use, $pg) . $spc;
+        }
+
+        /* And last, print the forth quarter page links. */
+        if (($q4_pgs == 0) && ($cur_pg < $tot_pgs)) {
+            $pg_str .= "...$spc";
+        } else {
+            if (($tot_pgs - $q4_pgs) > ($cur_pg + $q3_pgs)) {
+                $pg_str .= "...$spc";
+            }
+            for ($pg = $tot_pgs - $q4_pgs + 1; $pg <= $tot_pgs; ++$pg) {
+                $start = (($pg-1) * $show_num) + 1;
+                $pg_str .= get_paginator_link($box, $start, $use, $pg) . $spc;
+            }
+        }
+    }
+
+    /* If necessary, compute the 'show all' string. */
+    if (($prv_str != '') || ($nxt_str != '')) {
+        $all_str = "<A HREF=\"right_main.php?PG_SHOWNUM=9999"
+                 . "&use_mailbox_cache=$use&startMessage=1&mailbox=$box\" "
+                 . "TARGET=\"right\">" . _("Show All") . '</A>';
     }
 
-    /* Return the resulting string. */
-    if( $lMore . $mMore . $rMore == '' ) {
-        $lMore = '&nbsp;';
+    /* Last but not least, get the value for the toggle all link. */
+    $tgl_str = get_selectall_link($start_msg, $sort);
+
+    /* Put all the pieces of the paginator string together. */
+    $result = '';
+    $result .= ($all_str != '' ? $all_str . $spc . $sep . $spc: '');
+    $result .= ($prv_str != '' ? $prv_str . $spc . $sep . $spc : '');
+    $result .= ($pg_str != '' ? $pg_str . $sep . $spc : '');
+    $result .= ($nxt_str != '' ? $nxt_str : '');
+    $result .= ($result != '' ? $spc . $sep . $spc . $tgl_str: $tgl_str);
+
+    /* If the resulting string is blank, return a non-breaking space. */
+    if ($result == '') {
+        $result = '&nbsp;';
     }
-    return ($lMore . $mMore . $rMore);
+
+    /* Return our final magical paginator string. */
+    return ($result);
 }
 
 function processSubject($subject) {
index 4430a191cd6e8912d5f8684184994831d0cfbccc..a41121353c419915121a8a56083177dad65767e9 100644 (file)
  * $Id$
  */
 
-/*****************************************************************/
-/*** THIS FILE NEEDS TO HAVE ITS FORMATTING FIXED!!!           ***/
-/*** PLEASE DO SO AND REMOVE THIS COMMENT SECTION.             ***/
-/***    + Base level indent should begin at left margin, as    ***/
-/***      the $prefs_are_cached and $prefs_cache stuff below.  ***/
-/***    + All identation should consist of four space blocks   ***/
-/***    + Tab characters are evil.                             ***/
-/***    + all comments should use "slash-star ... star-slash"  ***/
-/***      style -- no pound characters, no slash-slash style   ***/
-/***    + FLOW CONTROL STATEMENTS (if, while, etc) SHOULD      ***/
-/***      ALWAYS USE { AND } CHARACTERS!!!                     ***/
-/***    + Please use ' instead of ", when possible. Note "     ***/
-/***      should always be used in _( ) function calls.        ***/
-/*** Thank you for your help making the SM code more readable. ***/
-/*****************************************************************/
-
 global $prefs_are_cached, $prefs_cache;
 if (!session_is_registered('prefs_are_cached')) {
     $prefs_are_cached = false;
     $prefs_cache = array();
 }
 
-   function cachePrefValues($data_dir, $username) {
-       global $prefs_are_cached, $prefs_cache;
-       
-       if ($prefs_are_cached)
-           return;
-       
-       $filename = $data_dir . $username . '.pref';
+/**
+ * Check the preferences into the session cache.
+ */
+function cachePrefValues($data_dir, $username) {
+    global $prefs_are_cached, $prefs_cache;
        
-       if (!file_exists($filename)) {
-           printf (_("Preference file, %s, does not exist. Log out, and log back in to create a default preference file."), $filename);
-           exit;
-       }
-
-       $file = fopen($filename, 'r');
-
-       /** read in all the preferences **/
-       $highlight_num = 0;
-       while (! feof($file)) {
-          $pref = trim(fgets($file, 1024));
-          $equalsAt = strpos($pref, '=');
-          if ($equalsAt > 0) {
-              $Key = substr($pref, 0, $equalsAt);
-              $Value = substr($pref, $equalsAt + 1);
-              if (substr($Key, 0, 9) == 'highlight') {
-                  $Key = 'highlight' . $highlight_num;
-                  $highlight_num ++;
-              }
-
-              if ($Value != '') {
-                  $prefs_cache[$Key] = $Value;
-              }
-          }
-       }
-       fclose($file);
-
-       session_unregister('prefs_cache');
-       session_register('prefs_cache');
+    if ($prefs_are_cached) {
+        return;
+    }
+
+    $filename = $data_dir . $username . '.pref';
+
+    if (!file_exists($filename)) {
+        printf (_("Preference file, %s, does not exist. Log out, and log back in to create a default preference file."), $filename);
+        exit;
+    }
+
+    $file = fopen($filename, 'r');
+
+    /* Read in the preferences. */
+    $highlight_num = 0;
+    while (! feof($file)) {
+        $pref = trim(fgets($file, 1024));
+        $equalsAt = strpos($pref, '=');
+        if ($equalsAt > 0) {
+            $key = substr($pref, 0, $equalsAt);
+            $value = substr($pref, $equalsAt + 1);
+            if (substr($key, 0, 9) == 'highlight') {
+                $key = 'highlight' . $highlight_num;
+                $highlight_num ++;
+            }
+
+            if ($value != '') {
+                $prefs_cache[$key] = $value;
+            }
+        }
+     }
+     fclose($file);
+
+     session_unregister('prefs_cache');
+     session_register('prefs_cache');
        
-       $prefs_are_cached = true;
-       session_unregister('prefs_are_cached');
-       session_register('prefs_are_cached');
-   }
+     $prefs_are_cached = true;
+     session_unregister('prefs_are_cached');
+     session_register('prefs_are_cached');
+}
    
+/**
+ * Return the value for the prefernce given by $string.
+ */
+function getPref($data_dir, $username, $string, $default = '') {
+    global $prefs_cache;
+    $result = '';
+
+    cachePrefValues($data_dir, $username);
+
+    if (isset($prefs_cache[$string])) {
+        $result = $prefs_cache[$string];
+    } else {
+        $result = $default;
+    }
+
+    return ($result);
+}
+
+/**
+ * Save the preferences for this user.
+ */
+function savePrefValues($data_dir, $username) {
+    global $prefs_cache;
    
-   /** returns the value for $string **/
-   function getPref($data_dir, $username, $string, $default = '') {
-      global $prefs_cache;
-
-      cachePrefValues($data_dir, $username);
-
-      if (isset($prefs_cache[$string]))
-          return $prefs_cache[$string];
-      else
-          return $default;
-   }
-
-
-   function savePrefValues($data_dir, $username) {
-      global $prefs_cache;
-      
-      $file = fopen($data_dir . $username . '.pref', 'w');
-      foreach ($prefs_cache as $Key => $Value) {
-          if (isset($Value)) {
-              fwrite($file, $Key . '=' . $Value . "\n");
-          }
-      }
-      fclose($file);
-   }
-
-
-   function removePref($data_dir, $username, $string) {
-      global $prefs_cache;
-
-      cachePrefValues($data_dir, $username);
-
-      if (isset($prefs_cache[$string])) {
-          unset($prefs_cache[$string]);
-      }
-
-      savePrefValues($data_dir, $username);
-   }
-
-   /** sets the pref, $string, to $set_to **/
-   function setPref($data_dir, $username, $string, $set_to) {
-      global $prefs_cache;
-
-      cachePrefValues($data_dir, $username);
-      if (isset($prefs_cache[$string]) && $prefs_cache[$string] == $set_to)
-         return;
-      if ($set_to === '') {
-         removePref($data_dir, $username, $string);
-         return;
-      }
-      $prefs_cache[$string] = $set_to;
-      savePrefValues($data_dir, $username);
-   }
-
-
-   /** This checks if there is a pref file, if there isn't, it will
-       create it. **/
-   function checkForPrefs($data_dir, $username) {
-      $filename = $data_dir . $username . '.pref';
-      if (!file_exists($filename) ) {
-         if (!copy($data_dir . 'default_pref', $filename)) {
-            echo _("Error opening ") . $filename;
-            exit;
-         }
-      }
-   }
+    $file = fopen($data_dir . $username . '.pref', 'w');
+    foreach ($prefs_cache as $Key => $Value) {
+        if (isset($Value)) {
+            fwrite($file, $Key . '=' . $Value . "\n");
+        }
+    }
+    fclose($file);
+}
+
+/**
+ * Remove a preference for the current user.
+ */
+function removePref($data_dir, $username, $string) {
+    global $prefs_cache;
+
+    cachePrefValues($data_dir, $username);
+    if (isset($prefs_cache[$string])) {
+        unset($prefs_cache[$string]);
+    }
+    savePrefValues($data_dir, $username);
+}
 
+/**
+ * Set a there preference $string to $value.
+ */
+function setPref($data_dir, $username, $string, $value) {
+    global $prefs_cache;
 
-   /** Writes the Signature **/
-   function setSig($data_dir, $username, $string) {
-      $file = fopen($data_dir . $username . '.sig', 'w');
-      fwrite($file, $string);
-      fclose($file);
-   }
+    cachePrefValues($data_dir, $username);
+    if (isset($prefs_cache[$string]) && ($prefs_cache[$string] == $value)) {
+        return;
+    }
 
+    if ($value === '') {
+        removePref($data_dir, $username, $string);
+        return;
+    }
 
+    $prefs_cache[$string] = $value;
+    savePrefValues($data_dir, $username);
+}
 
-   /** Gets the signature **/
-   function getSig($data_dir, $username) {
-      $filename = $data_dir . $username . '.sig';
-      $sig = '';
-      if (file_exists($filename)) {
-         $file = fopen($filename, 'r');
-         while (!feof($file)) {
+/**
+ * Check for a preferences file. If one can not be found, create it.
+ */
+function checkForPrefs($data_dir, $username) {
+    $filename = $data_dir . $username . '.pref';
+    if (!file_exists($filename) ) {
+        if (!copy($data_dir . 'default_pref', $filename)) {
+            echo _("Error opening ") . $filename;
+            exit;
+        }
+    }
+}
+
+/**
+ * Write the User Signature.
+ */
+function setSig($data_dir, $username, $value) {
+    $file = fopen($data_dir . $username . '.sig', 'w');
+    fwrite($file, $value);
+    fclose($file);
+}
+
+/**
+ * Get the signature.
+ */
+function getSig($data_dir, $username) {
+    $filename = $data_dir . $username . '.sig';
+    $sig = '';
+    if (file_exists($filename)) {
+        $file = fopen($filename, 'r');
+        while (!feof($file)) {
             $sig .= fgets($file, 1024);
-         }
-         fclose($file);
-      }
-      return $sig;
-   }
+        }
+        fclose($file);
+    }
+    return $sig;
+}
 
 ?>