fixed problem with usort getting bad data in some instances
[squirrelmail.git] / config / conf.pl
index 329a37b51bd1300ba30e174917dd171c6132a00d..7a3215236cb3862ed1e2f1c13a171e83996b0e83 100755 (executable)
@@ -12,11 +12,16 @@ $NRM = "\x1B[0m";
 # First, lets read in the data already in there...
 ############################################################              
 if ( -e "config.php") {
-   print "The file \"config.php\" exists.  Using it for defaults.\n\n";
+   $config = 1;
    open (FILE, "config.php");
-} else {
-   print "No config file found.  Reading from config_defaults.php.\n\n";
+} elsif (-e "config_default.php") {
+   $config = 2;
    open (FILE, "config_default.php");
+} else {
+   print "No configuration file found.  Please get config_default.php or\n";
+   print "config.php before running this again.  This program needs a\n";
+   print "default config file to get default values.\n";
+   exit;
 }
 
 #  Reads and parses the current configuration file (either
@@ -34,15 +39,7 @@ while ($line = <FILE>) {
          $options[1] =~ s/;.*$//g;
          $options[1] =~ s/"$//g;
 
-         if ($options[0] =~ /^special_folders/) {
-            if ($options[0] =~ /\[.*\]$/) {
-               $sub = $options[0];
-               $sub =~ s/\]$//;
-               $sub = substr ($sub, @sub-1, 1);
-
-               $special_folders[$sub] = $options[1];
-            }   
-         } elsif ($options[0] =~ /^theme\[[0-9]+\]\["PATH"\]/) {
+         if ($options[0] =~ /^theme\[[0-9]+\]\["PATH"\]/) {
             $sub = $options[0];
             $sub =~ s/\]\["PATH"\]//;
             $sub = substr ($sub, @sub-1, 1);
@@ -52,6 +49,53 @@ while ($line = <FILE>) {
             $sub =~ s/\]\["NAME"\]//;
             $sub = substr ($sub, @sub-1, 1);
             $theme_name[$sub] = $options[1];
+         } elsif ($options[0] =~ /^ldap_server\[[0-9]+\]/) {
+            $sub = $options[0];
+            $sub = substr ($sub, length($sub)-2, 1);
+            $continue = 0;
+            while (($tmp = <FILE>) && ($continue != 1)) {
+               if ($tmp =~ /\);\s*$/) {
+                  $continue = 1;
+               }
+               
+               if ($tmp =~ /^\s*"host"/i) {
+                  $tmp =~ s/^\s*"host"\s*=>\s*"//i;
+                  $tmp =~ s/",\s*$//;
+                  $tmp =~ s/"\);\s*$//;
+                  $host = $tmp;
+               } elsif ($tmp =~ /^\s*"base"/i) {
+                  $tmp =~ s/^\s*"base"\s*=>\s*"//i;
+                  $tmp =~ s/",\s*$//;
+                  $tmp =~ s/"\);\s*$//;
+                  $base = $tmp;
+               } elsif ($tmp =~ /^\s*"charset"/i) {
+                  $tmp =~ s/^\s*"charset"\s*=>\s*"//i;
+                  $tmp =~ s/",\s*$//;
+                  $tmp =~ s/"\);\s*$//;
+                  $charset = $tmp;
+               } elsif ($tmp =~ /^\s*"port"/i) {
+                  $tmp =~ s/^\s*"port"\s*=>\s*"//i;
+                  $tmp =~ s/",\s*$//;
+                  $tmp =~ s/"\);\s*$//;
+                  $port = $tmp;
+               } elsif ($tmp =~ /^\s*"maxrows"/i) {
+                  $tmp =~ s/^\s*"maxrows"\s*=>\s*"//i;
+                  $tmp =~ s/",\s*$//;
+                  $tmp =~ s/"\);\s*$//;
+                  $maxrows = $tmp;
+               } elsif ($tmp =~ /^\s*"name"/i) {
+                  $tmp =~ s/^\s*"name"\s*=>\s*"//i;
+                  $tmp =~ s/",\s*$//;
+                  $tmp =~ s/"\);\s*$//;
+                  $name = $tmp;
+               }
+            }
+            $ldap_host[$sub] = $host;
+            $ldap_base[$sub] = $base;
+            $ldap_name[$sub] = $name;
+            $ldap_port[$sub] = $port;
+            $ldap_maxrows[$sub] = $maxrows;
+            $ldap_charset[$sub] = $charset;
          } else {
             ${$options[0]} = $options[1];
          }   
@@ -65,13 +109,16 @@ if (!$sendmail_path) {
    $sendmail_path = "/usr/sbin/sendmail";
 }
 
-
 #####################################################################################
 
 while (($command ne "q") && ($command ne "Q")) {
    system "clear";
    if ($menu == 0) {
-      print $WHT."SquirrelMail Configuration Utility\n".$NRM;
+      print $WHT."SquirrelMail Configuration : ".$NRM;
+      if ($config == 1) { print "Read: config.php"; }
+      elsif ($config == 2) { print "Read: config_default.php"; }
+      print "\n";
+
       print $WHT."Main Menu --\n".$NRM;
       print "1.  Organization Preferences\n";
       print "2.  Server Settings\n";
@@ -81,6 +128,8 @@ while (($command ne "q") && ($command ne "Q")) {
       print "6.  Address Books (LDAP)\n";
       print "7.  Message of the Day (MOTD)\n";
       print "\n";
+      print "D.  Set pre-defined settings for specific IMAP servers\n";
+      print "\n";
    } elsif ($menu == 1) {
       print $WHT."Organization Preferences\n".$NRM;
       print "1.  Organization Name    : $WHT$org_name$NRM\n";
@@ -100,6 +149,7 @@ while (($command ne "q") && ($command ne "Q")) {
          print "6.    SMTP Server        : $WHT$smtpServerAddress$NRM\n";
          print "7.    SMTP Port          : $WHT$smtpPort$NRM\n";
       }
+      print "8.  Server               : $WHT$imap_server_type$NRM\n";
       print "\n";
       print "R   Return to Main Menu\n";
    } elsif ($menu == 3) {
@@ -108,16 +158,13 @@ while (($command ne "q") && ($command ne "Q")) {
       print "2.  Show Folder Prefix Option  : $WHT$show_prefix_option$NRM\n";
       print "3.  Trash Folder               : $WHT$trash_folder$NRM\n";
       print "4.  Sent Folder                : $WHT$sent_folder$NRM\n";
-      print "5.  List Special Folders First : $WHT$list_special_folders_first$NRM\n";
-      print "6.  Show Special Folders Color : $WHT$use_special_folder_color$NRM\n";
-      print "7.  By default, move to trash  : $WHT$default_move_to_trash$NRM\n";
-      print "8.  Auto Expunge               : $WHT$auto_expunge$NRM\n";
-      print "9.  Default Sub. of INBOX      : $WHT$default_sub_of_inbox$NRM\n";
-      print "10. Show 'Contain Sub.' Option : $WHT$show_contain_subfolders_option$NRM\n";
-      print "11. Special Folders            > $WHT$special_folders[0]$NRM\n";
-      for ($count = 1; $count <= $#special_folders; $count++) {
-         print "                               > $WHT$special_folders[$count]$NRM\n";
-      }
+      print "5.  By default, move to trash  : $WHT$default_move_to_trash$NRM\n";
+      print "6.  By default, move to sent   : $WHT$default_move_to_sent$NRM\n";
+      print "7.  List Special Folders First : $WHT$list_special_folders_first$NRM\n";
+      print "8.  Show Special Folders Color : $WHT$use_special_folder_color$NRM\n";
+      print "9.  Auto Expunge               : $WHT$auto_expunge$NRM\n";
+      print "10. Default Sub. of INBOX      : $WHT$default_sub_of_inbox$NRM\n";
+      print "11. Show 'Contain Sub.' Option : $WHT$show_contain_subfolders_option$NRM\n";
       print "\n";
       print "R   Return to Main Menu\n";
    } elsif ($menu == 4) {
@@ -133,12 +180,17 @@ while (($command ne "q") && ($command ne "Q")) {
       print $WHT."Themes\n".$NRM;
       print "1.  Change Themes\n";
       for ($count = 0; $count <= $#theme_name; $count++) {
-         print "    |  $theme_name[$count]\n";
+         print "    >  $theme_name[$count]\n";
       }
       print "\n";
       print "R   Return to Main Menu\n";
    } elsif ($menu == 6) {
       print $WHT."Address Books (LDAP)\n".$NRM;
+      print "1.  Change Servers\n";
+      for ($count = 0; $count <= $#ldap_host; $count++) {
+         print "    >  $ldap_host[$count]\n";
+      }
+      print "2.  Use Javascript Address Book Search  : $WHT$default_use_javascript_addr_book$NRM\n";
       print "\n";
       print "R   Return to Main Menu\n";
    } elsif ($menu == 7) {
@@ -174,6 +226,8 @@ while (($command ne "q") && ($command ne "Q")) {
       if (($save =~ /^y/i) || ($save =~ /^\s*$/)) {
          save_data ();
        }
+   } elsif (($command eq "d") || ($command eq "D")) {
+      set_defaults ();
    } else {
       $saved = 0;
       if ($menu == 0) {
@@ -192,18 +246,19 @@ while (($command ne "q") && ($command ne "Q")) {
          elsif ($command == 5) { $sendmail_path      = command15 (); }
          elsif ($command == 6) { $smtpServerAddress  = command16 (); }
          elsif ($command == 7) { $smtpPort           = command17 (); }
+         elsif ($command == 8) { $imap_server_type   = command18 (); }
       } elsif ($menu == 3) {
          if    ($command == 1) { $default_folder_prefix          = command21 (); }
          elsif ($command == 2) { $show_prefix_option             = command22 (); }
          elsif ($command == 3) { $trash_folder                   = command23 (); }
          elsif ($command == 4) { $sent_folder                    = command24 (); }
-         elsif ($command == 5) { $list_special_folders_first     = command25 (); }
-         elsif ($command == 6) { $use_special_folder_color       = command26 (); }
-         elsif ($command == 7) { $default_move_to_trash          = command27 (); }
-         elsif ($command == 8) { $auto_expunge                   = command28 (); }
-         elsif ($command == 9) { $default_sub_of_inbox           = command29 (); }
-         elsif ($command == 10){ $show_contain_subfolders_option = command210(); }
-         elsif ($command == 11){ $special_folders                = command211(); }
+         elsif ($command == 5) { $default_move_to_trash          = command25 (); }
+         elsif ($command == 6) { $default_move_to_sent           = command26 (); }
+         elsif ($command == 7) { $list_special_folders_first     = command27 (); }
+         elsif ($command == 8) { $use_special_folder_color       = command28 (); }
+         elsif ($command == 9) { $auto_expunge                   = command29 (); }
+         elsif ($command == 10){ $default_sub_of_inbox           = command210(); }
+         elsif ($command == 11){ $show_contain_subfolders_option = command211(); }
       } elsif ($menu == 4) {
          if    ($command == 1) { $default_charset    = command31 (); }
          elsif ($command == 2) { $auto_forward       = command32 (); }
@@ -215,6 +270,8 @@ while (($command ne "q") && ($command ne "Q")) {
             command41 (); 
          }
       } elsif ($menu == 6) {
+         if    ($command == 1) { command61(); }
+         elsif ($command == 2) { command62(); }
       } elsif ($menu == 7) {
          if    ($command == 1) { $motd = command71 (); $motd =~ s/"/\\"/g;}
       }
@@ -379,6 +436,27 @@ sub command17 {
    }
    return $new_smtpPort;
 }
+# imap_server_type 
+sub command18 {
+   print "Eash IMAP server has its own quirks.  As much as we tried to stick\n";
+   print "to standards, it doesn't help much if the IMAP server doesn't follow\n";
+   print "the same principles.  We have made some work-arounds for some of\n";
+   print "these servers.  If you would like to use them, please select your\n";
+   print "IMAP server.  If you do not wish to use these work-arounds, you can\n";
+   print "set this to \"other\", and none will be used.\n";
+   print "    cyrus      = Cyrus IMAP server\n";
+   print "    uw         = University of Washington's IMAP server\n";
+   print "    exchange   = Microsoft Exchange IMAP server\n";
+   print "    courier    = Courier IMAP server\n";
+   print "[$WHT$imap_server_type$NRM]: $WHT";
+   $new_imap_server_type = <STDIN>;
+   if ($new_imap_server_type eq "\n") {
+      $new_imap_server_type = $imap_server_type;
+   } else {
+      $new_imap_server_type =~ s/[\r|\n]//g;
+   }
+   return $new_imap_server_type;
+}
 
 # MOTD
 sub command71 {
@@ -498,8 +576,58 @@ sub command24 {
    return $new_sent_folder;
 }
 
-# List special folders first 
+# default move to trash 
 sub command25 {
+   print "By default, should messages get moved to the trash folder?  You\n";
+   print "can specify the default trash folder in option 3.  If this is set\n";
+   print "to false, messages will get deleted immediately without moving\n";
+   print "to the trash folder.\n";
+   print "\n";
+   print "Trash folder is currently: $trash_folder\n";
+   print "\n";
+   
+   if ($default_move_to_trash eq "true") {
+      $default_value = "y";
+   } else {
+      $default_value = "n";
+   }
+   print "By default, move to trash (y/n) [$WHT$default_value$NRM]: $WHT";
+   $new_show = <STDIN>;
+   if (($new_show =~ /^y\n/i) || (($new_show =~ /^\n/) && ($default_value eq "y"))) {
+      $default_move_to_trash = "true";
+   } else {
+      $default_move_to_trash = "false";
+   }
+   return $default_move_to_trash;
+}
+
+# default move to sent 
+sub command26 {
+   print "By default, should messages get moved to the sent folder?  You\n";
+   print "can specify the default sent folder in option 4.  If this is set\n";
+   print "to false, messages will get deleted immediately without moving\n";
+   print "to the sent folder.\n";
+   print "\n";
+   print "Trash folder is currently: $sent_folder\n";
+   print "\n";
+   
+   if ($default_move_to_sent eq "true") {
+      $default_value = "y";
+   } else {
+      $default_value = "n";
+   }
+   print "By default, move to sent (y/n) [$WHT$default_value$NRM]: $WHT";
+   $new_show = <STDIN>;
+   if (($new_show =~ /^y\n/i) || (($new_show =~ /^\n/) && ($default_value eq "y"))) {
+      $default_move_to_sent = "true";
+   } else {
+      $default_move_to_sent = "false";
+   }
+   return $default_move_to_sent;
+}
+
+# List special folders first 
+sub command27 {
    print "SquirrelMail has what we call 'special folders' that are not\n";
    print "manipulated and viewed like normal folders.  Some examples of\n";
    print "these folders would be INBOX, Trash, Sent, etc.  This option\n";
@@ -524,7 +652,7 @@ sub command25 {
 }
 
 # Show special folders color 
-sub command26 {
+sub command28 {
    print "SquirrelMail has what we call 'special folders' that are not\n";
    print "manipulated and viewed like normal folders.  Some examples of\n";
    print "these folders would be INBOX, Trash, Sent, etc.  This option\n";
@@ -548,33 +676,8 @@ sub command26 {
    return $use_special_folder_color;
 }
 
-# default move to trash
-sub command27 {
-   print "By default, should messages get moved to the trash folder?  You\n";
-   print "can specify the default trash folder in option 3.  If this is set\n";
-   print "to false, messages will get deleted immediately without moving\n";
-   print "to the trash folder.\n";
-   print "\n";
-   print "Trash folder is currently: $trash_folder\n";
-   print "\n";
-   
-   if ($default_move_to_trash eq "true") {
-      $default_value = "y";
-   } else {
-      $default_value = "n";
-   }
-   print "By default, move to trash (y/n) [$WHT$default_value$NRM]: $WHT";
-   $new_show = <STDIN>;
-   if (($new_show =~ /^y\n/i) || (($new_show =~ /^\n/) && ($default_value eq "y"))) {
-      $default_move_to_trash = "true";
-   } else {
-      $default_move_to_trash = "false";
-   }
-   return $default_move_to_trash;
-}
-
 # Auto expunge 
-sub command28 {
+sub command29 {
    print "The way that IMAP handles deleting messages is as follows.  You\n";
    print "mark the message as deleted, and then to 'really' delete it, you\n";
    print "expunge it.  This option asks if you want to just have messages\n";
@@ -598,7 +701,7 @@ sub command28 {
 }
 
 # Default sub of inbox 
-sub command29 {
+sub command210 {
    print "Some IMAP servers (Cyrus) have all folders as subfolders of INBOX.\n";
    print "This can cause some confusion in folder creation for users when\n";
    print "they try to create folders and don't put it as a subfolder of INBOX\n";
@@ -622,7 +725,7 @@ sub command29 {
 }
 
 # Show contain subfolder option 
-sub command210 {
+sub command211 {
    print "Some IMAP servers (UW) make it so that there are two types of\n";
    print "folders.  Those that contain messages, and those that contain\n";
    print "subfolders.  If this is the case for your server, set this to\n";
@@ -645,87 +748,6 @@ sub command210 {
    return $show_contain_subfolders_option;
 }
 
-# special folders
-sub command211 {
-   print "\nSpecial folders are folders that can't be manipulated like normal\n";
-   print "user-created folders.  A couple of examples of these would be the\n";
-   print "trash folder, the sent folder, etc.\n";
-   print "Special Folders:\n";
-   $count = 0;
-   print "\n";
-   while ($count < @special_folders) {
-      print "   $count) $WHT" . $special_folders[$count] . "$NRM\n";
-      $count++;
-   }
-   print "\n[folders] command (?=help) > ";
-   $input = <STDIN>;
-   $input =~ s/[\r|\n]//g;
-   while ($input !~ /^d$/i) {
-      ## ADD
-      if ($input =~ /^\s*\+\s*.*/) {
-         $input =~ s/^\s*\+\s*//;
-         $special_folders[$#special_folders+1] = $input;
-      }
-   
-      elsif ($input =~ /^\s*-\s*[0-9]?/i) {
-         if ($input =~ /[0-9]+\s*$/) {
-            $rem_num = $input;
-            $rem_num =~ s/^\s*-\s*//g;
-            $rem_num =~ s/\s*$//;
-         } else {
-            $rem_num = $#special_folders;
-         }
-   
-         if ($rem_num == 0) {
-            print "You cannot remove INBOX.  It is a very special folder.\n";
-         } else {
-            $count = 0;
-            @new_special_folders = ();
-            $removed = 0;
-            while ($count <= $#special_folders) {
-               if ($count != $rem_num) {
-                  @new_special_folders = (@new_special_folders, $special_folders[$count]);     
-               }
-               if ($count == $rem_num) {
-                  print "Removed: $special_folders[$rem_num]\n";
-                  $removed = 1;
-               }
-               $count++;
-            }
-            if ($removed != 1) {
-               print "Error: Can't delete an entry that's not there!\n";
-            }
-            @special_folders = @new_special_folders;
-         }
-      }
-   
-      elsif ($input =~ /^\s*l\s*/i) {
-         $count = 0;
-         print "\n";
-         while ($count < @special_folders) {
-            print "   $count) $WHT" . $special_folders[$count] . "$NRM\n";
-            $count++;
-         }
-      } elsif ($input =~ /^\s*\?\s*/) {
-         print ".-------------------------.\n";
-         print "| + Folder   (add folder) |\n";
-         print "| - N     (remove folder) |\n";
-         print "| l        (list folders) |\n";
-         print "| d                (done) |\n";
-         print "`-------------------------'\n";
-      }
-   
-      else {
-         print "Unrecognized command.\n";
-      }
-   
-      print "\n[folders] command (?=help) > ";
-      $input = <STDIN>;
-      $input =~ s/[\r|\n]//g;
-   }
-   return @special_folders;
-}
-
 ############# GENERAL OPTIONS #####################
 
 # Default Charset
@@ -938,6 +960,163 @@ sub command41 {
 }   
 
 
+sub command61 {
+   print "You can now define different LDAP servers.\n";
+   print "[ldap] command (?=help) > ";
+   $input = <STDIN>;
+   $input =~ s/[\r|\n]//g;
+   while ($input ne "d") {
+      if ($input =~ /^\s*l\s*/i) {
+         $count = 0;
+         while ($count <= $#ldap_host) {
+            print "$count. $ldap_host[$count]\n";
+            print "        base: $ldap_base[$count]\n";
+            if ($ldap_charset[$count]) {
+               print "     charset: $ldap_charset[$count]\n";
+            }
+            if ($ldap_port[$count]) {
+               print "        port: $ldap_port[$count]\n";
+            }
+            if ($ldap_name[$count]) {
+               print "        name: $ldap_name[$count]\n";
+            }
+            if ($ldap_maxrows[$count]) {
+               print "     maxrows: $ldap_maxrows[$count]\n";
+            }
+            print "\n";
+            $count++;
+         }
+      } elsif ($input =~ /^\s*\+/) {
+         $sub = $#ldap_host + 1;
+         
+         print "First, we need to have the hostname or the IP address where\n";
+         print "this LDAP server resides.  Example: ldap.bigfoot.com\n";
+         print "hostname: ";
+         $name = <STDIN>;
+         $name =~ s/[\r|\n]//g;
+         $ldap_host[$sub] = $name;
+         
+         print "\n";
+
+         print "Next, we need the server root (base dn).  For this, an empty\n";
+         print "string is allowed.\n";
+         print "Example: ou=member_directory,o=netcenter.com\n";
+         print "base: ";
+         $name = <STDIN>;
+         $name =~ s/[\r|\n]//g;
+         $ldap_base[$sub] = $name;
+
+         print "\n";
+
+         print "This is the TCP/IP port number for the LDAP server.  Default\n";
+         print "port is 389.  This is optional.  Press ENTER for default.\n";
+         print "port: ";
+         $name = <STDIN>;
+         $name =~ s/[\r|\n]//g;
+         $ldap_port[$sub] = $name;
+
+         print "\n";
+
+         print "This is the charset for the server.  Default is utf-8.  This\n";
+         print "is also optional.  Press ENTER for default.\n";
+         print "charset: ";
+         $name = <STDIN>;
+         $name =~ s/[\r|\n]//g;
+         $ldap_charset[$sub] = $name;
+
+         print "\n";
+
+         print "This is the name for the server, used to tag the results of\n";
+         print "the search.  Default it \"LDAP: hostname\".  Press ENTER for default\n";
+         print "name: ";
+         $name = <STDIN>;
+         $name =~ s/[\r|\n]//g;
+         $ldap_name[$sub] = $name;
+
+         print "\n";
+
+         print "You can specify the maximum number of rows in the search result.\n";
+         print "Default is unlimited.  Press ENTER for default.\n";
+         print "maxrows: ";
+         $name = <STDIN>;
+         $name =~ s/[\r|\n]//g;
+         $ldap_maxrows[$sub] = $name;
+
+         print "\n";
+
+      } elsif ($input =~ /^\s*-\s*[0-9]?/) {
+         if ($input =~ /[0-9]+\s*$/) {
+            $rem_num = $input;
+            $rem_num =~ s/^\s*-\s*//g;
+            $rem_num =~ s/\s*$//;
+         } else {
+            $rem_num = $#ldap_host;
+         }
+         $count = 0;
+         @new_ldap_host = ();
+         @new_ldap_base = ();
+         @new_ldap_port = ();
+         @new_ldap_name = ();
+         @new_ldap_charset = ();
+         @new_ldap_maxrows = ();
+         while ($count <= $#ldap_host) {
+            if ($count != $rem_num) {
+               @new_ldap_host = (@new_ldap_host, $ldap_host[$count]);
+               @new_ldap_base = (@new_ldap_base, $ldap_base[$count]);
+               @new_ldap_port = (@new_ldap_port, $ldap_port[$count]);
+               @new_ldap_name = (@new_ldap_name, $ldap_name[$count]);
+               @new_ldap_charset = (@new_ldap_charset, $ldap_charset[$count]);
+               @new_ldap_maxrows = (@new_ldap_maxrows, $ldap_maxrows[$count]);
+            }
+            $count++;
+         }
+         @ldap_host = @new_ldap_host;
+         @ldap_base = @new_ldap_base;
+         @ldap_port = @new_ldap_port;
+         @ldap_name = @new_ldap_name;
+         @ldap_charset = @new_ldap_charset;
+         @ldap_maxrows = @new_ldap_maxrows;
+      } elsif ($input =~ /^\s*\?\s*/) {
+         print ".-------------------------.\n";
+         print "| +            (add host) |\n";
+         print "| - N       (remove host) |\n";
+         print "| l          (list hosts) |\n";
+         print "| d                (done) |\n";
+         print "`-------------------------'\n";
+      }
+      print "[ldap] command (?=help) > ";
+      $input = <STDIN>;
+      $input =~ s/[\r|\n]//g;
+   }
+}   
+
+sub command62 {
+   print "Some of our developers have come up with very good javascript interface\n";
+   print "for searching through address books, however, our original goals said\n";
+   print "that we would be 100% HTML.  In order to make it possible to use their\n";
+   print "interface, and yet stick with our goals, we have also written a plain\n";
+   print "HTML version of the search.  Here, you can choose which version to use.\n";
+   print "\n";
+   print "This is just the default value.  It is also a user option that each\n";
+   print "user can configure individually\n";
+   print "\n";
+   
+   if ($default_use_javascript_addr_book eq "true") {
+      $default_value = "y";
+   } else {
+      $default_use_javascript_addr_book = "false";
+      $default_value = "n";
+   }
+   print "Use javascript version (y/n) [$WHT$default_value$NRM]: $WHT";
+   $new_show = <STDIN>;
+   if (($new_show =~ /^y\n/i) || (($new_show =~ /^\n/) && ($default_value eq "y"))) {
+      $default_use_javascript_addr_book = "true";
+   } else {
+      $default_use_javascript_addr_book = "false";
+   }
+   return $default_use_javascript_addr_book;
+}
+
 
 sub save_data {
    open (FILE, ">config.php");
@@ -951,29 +1130,28 @@ sub save_data {
 
    print FILE "\n";
 
-   print FILE "\t\$domain               = $domain;\n";
-   print FILE "\t\$imapServerAddress    = $imapServerAddress;\n";
-   print FILE "\t\$imapPort             = $imapPort;\n";
-   print FILE "\t\$useSendmail          = $useSendmail;\n";
-   print FILE "\t\$smtpServerAddress    = $smtpServerAddress;\n";
-   print FILE "\t\$smtpPort             = $smtpPort;\n";
-   print FILE "\t\$sendmailPath         = $sendmailPath;\n";
+   print FILE "\t\$domain               = \"$domain\";\n";
+   print FILE "\t\$imapServerAddress    = \"$imapServerAddress\";\n";
+   print FILE "\t\$imapPort             =  $imapPort;\n";
+   print FILE "\t\$useSendmail          =  $useSendmail;\n";
+   print FILE "\t\$smtpServerAddress    = \"$smtpServerAddress\";\n";
+   print FILE "\t\$smtpPort             =  $smtpPort;\n";
+   print FILE "\t\$sendmailPath         = \"$sendmail_path\";\n";
+   print FILE "\t\$imap_server_type     = \"$imap_server_type\";\n";
    
    print FILE "\n";
 
    print FILE "\t\$default_folder_prefix            = \"$default_folder_prefix\";\n";
    print FILE "\t\$trash_folder                     = \"$trash_folder\";\n";
    print FILE "\t\$sent_folder                      = \"$sent_folder\";\n";
+   print FILE "\t\$default_move_to_trash            =  $default_move_to_trash;\n";
+   print FILE "\t\$default_move_to_sent             =  $default_move_to_sent;\n";
    print FILE "\t\$show_prefix_option               =  $show_prefix_option;\n";
    print FILE "\t\$list_special_folders_first       =  $list_special_folders_first;\n";
    print FILE "\t\$use_special_folder_color         =  $use_special_folder_color;\n";
-   print FILE "\t\$default_move_to_trash            =  $default_move_to_trash;\n";
    print FILE "\t\$auto_expunge                     =  $auto_expunge;\n";
    print FILE "\t\$default_sub_of_inbox             =  $default_sub_of_inbox;\n";
-   print FILE "\t\$show_contain_subfolders_option  = $show_contain_subfolders_option;\n";
-   for ($count=0; $count <= $#special_folders; $count++) {
-      print FILE "\t\$special_folders[$count]               = \"$special_folders[$count]\";\n";
-   }
+   print FILE "\t\$show_contain_subfolders_option   =  $show_contain_subfolders_option;\n";
    print FILE "\n";
 
    print FILE "\t\$default_charset   = \"$default_charset\";\n";
@@ -991,8 +1169,100 @@ sub save_data {
    
    print FILE "\n";
 
+   if ($default_use_javascript_addr_book ne "true") {
+      $default_use_javascript_addr_book = "false";
+   }   
+   print FILE "\t\$default_use_javascript_addr_book = $default_use_javascript_addr_book;\n";
+   for ($count=0; $count <= $#ldap_host; $count++) {
+      print FILE "\t\$ldap_server[$count] = Array(\n";
+      print FILE "\t\t\t\"host\" => \"$ldap_host[$count]\",\n";
+      print FILE "\t\t\t\"base\" => \"$ldap_base[$count]\"";
+      if ($ldap_name[$count]) {
+         print FILE ",\n\t\t\t\"name\" => \"$ldap_name[$count]\"";
+      }
+      if ($ldap_port[$count]) {
+         print FILE ",\n\t\t\t\"port\" => \"$ldap_port[$count]\"";
+      }
+      if ($ldap_charset[$count]) {
+         print FILE ",\n\t\t\t\"charset\" => \"$ldap_charset[$count]\"";
+      }
+      if ($ldap_maxrows[$count]) {
+         print FILE ",\n\t\t\t\"maxrows\" => \"$ldap_maxrows[$count]\"";
+      }
+      print FILE ");\n\n";
+   }
+
+   print FILE "\n";
    print FILE "\t\$motd = \"$motd\";\n";
 
    print FILE "?>\n";
    close FILE;
 }
+
+sub set_defaults {
+   system "clear";
+   print "While we have been building SquirrelMail, we have discovered some\n";
+   print "preferences that work better with some servers that don't work so\n";
+   print "well with others.  If you select your IMAP server, this option will\n";
+   print "set some pre-defined settings for that server.\n";
+   print "\n";
+   print "Please note that you will still need to go through and make sure\n";
+   print "everything is correct.  This does not change everything.  There are\n";
+   print "only a few settings that thils will change.\n";
+   print "\n";
+
+   $continue = 0;
+   while ($continue != 1) {
+      print "Please select your IMAP server:\n";
+      print "    cyrus      = Cyrus IMAP server\n";
+      print "    uw         = University of Washington's IMAP server\n";
+      print "    exchange   = Microsoft Exchange IMAP server\n";
+      print "    courier    = Courier IMAP server\n";
+      print "    quit       = Do not change anything\n";
+      print "Command >> ";
+      $server = <STDIN>;
+      $server =~ s/[\r|\n]//g;
+
+      if      ($server eq "cyrus") { 
+                       $default_folder_prefix = "";
+                       $trash_folder = "INBOX.Trash";
+                       $sent_folder = "INBOX.Sent";
+                       $show_prefix_option = false;
+                       $default_sub_of_inbox = true;
+                       $show_contain_subfolders_option = false;
+                       $imap_server_type = "cyrus";
+
+         $continue = 1;
+      } elsif ($server eq "uw") {
+                       $default_folder_prefix = "mail/";
+                       $trash_folder = "Trash";
+                       $sent_folder = "Sent";
+                       $show_prefix_option = true;
+                       $default_sub_of_inbox = false;
+                       $show_contain_subfolders_option = true;
+                       $imap_server_type = "uw";
+                       
+         $continue = 1;
+      } elsif ($server eq "exchange") {
+                       $default_folder_prefix = "INBOX/";
+                       $default_sub_of_inbox = true;
+                       $trash_folder = "INBOX/Deleted Items";
+                       $sent_folder = "INBOX/Sent Items";
+                       $show_prefix_option = false;
+                       $show_contain_subfolders_option = false;
+                       
+                       $imap_server_type = "exchange";
+         
+                       $continue = 1;
+      } elsif ($server eq "courier") {
+                       $imap_server_type = "courier";
+                       
+         $continue = 1;
+               } elsif ($server eq "quit") {
+                       $continue = 1;
+      } else {
+         print "Unrecognized server: $server\n";
+                       print "\n";
+      }
+   }   
+}