+ $rem_num = $#icon_theme_name;
+ }
+ if ( $rem_num == $icon_theme_def ) {
+ print "You cannot remove the default icon theme!\n";
+ } elsif ( $rem_num == $icon_theme_fallback ) {
+ print "You cannot remove the fallback icon theme!\n";
+ } else {
+ $count = 0;
+ @new_theme_name = ();
+ @new_theme_path = ();
+ while ( $count <= $#icon_theme_name ) {
+ if ( $count != $rem_num ) {
+ @new_theme_name = ( @new_theme_name, $icon_theme_name[$count] );
+ @new_theme_path = ( @new_theme_path, $icon_theme_path[$count] );
+ }
+ $count++;
+ }
+ @icon_theme_name = @new_theme_name;
+ @icon_theme_path = @new_theme_path;
+ if ( $icon_theme_def > $rem_num ) {
+ $icon_theme_def--;
+ }
+ }
+ } elsif ( $input =~ /^\s*t\s*/i ) {
+ print "\nStarting detection...\n\n";
+
+ opendir( DIR, "../images/themes/" );
+ @files = sort(readdir(DIR));
+ $cnt = 0;
+ while ( $cnt <= $#files ) {
+ $filename = "../images/themes/" . $files[$cnt] .'/';
+ if ( -d "../images/themes/" . $files[$cnt] && $files[$cnt] !~ /^\./ && $files[$cnt] ne ".svn" ) {
+ $found = 0;
+ for ( $x = 0 ; $x <= $#icon_theme_path ; $x++ ) {
+ if ( $icon_theme_path[$x] eq $filename ) {
+ $found = 1;
+ }
+ }
+ if ( $found != 1 ) {
+ print "** Found icon theme: $filename\n";
+ $def = $files[$cnt];
+ $def =~ s/_/ /g;
+ $def = lc($def);
+ #$def =~ s/(^\w+)/ucfirst $1/eg;
+ #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
+ $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
+ print " What is its name? [$def]: ";
+ $nm = <STDIN>;
+ $nm =~ s/^\s+|\s+$|[\n\r]//g;
+ if ( $nm eq '' ) { $nm = $def; }
+ $icon_theme_name[ $#icon_theme_name + 1 ] = $nm;
+ $icon_theme_path[ $#icon_theme_path + 1 ] = $filename;
+ }
+ }
+ $cnt++;
+ }
+ print "\n";
+ for ( $cnt = 0 ; $cnt <= $#icon_theme_path ; $cnt++ ) {
+ $filename = $icon_theme_path[$cnt];
+ if ( $filename ne "none" && $filename ne "template" && ! -d $filename ) {
+ print " Removing $filename (file not found)\n";
+ $offset = 0;
+ @new_icon_theme_name = ();
+ @new_icon_theme_path = ();
+ for ( $x = 0 ; $x < $#icon_theme_path ; $x++ ) {
+ if ( $icon_theme_path[$x] eq $filename ) {
+ $offset = 1;
+ }
+ if ( $offset == 1 ) {
+ $new_icon_theme_name[$x] = $icon_theme_name[ $x + 1 ];
+ $new_icon_theme_path[$x] = $icon_theme_path[ $x + 1 ];
+ } else {
+ $new_icon_theme_name[$x] = $icon_theme_name[$x];
+ $new_icon_theme_path[$x] = $icon_theme_path[$x];
+ }
+ }
+ @icon_theme_name = @new_icon_theme_name;
+ @icon_theme_path = @new_icon_theme_path;
+ }
+ }
+ print "\nDetection complete!\n\n";
+
+ closedir DIR;
+ } elsif ( $input =~ /^\s*\?\s*/ ) {
+ print ".------------------------------------.\n";
+ print "| t (detect icon themes) |\n";
+ print "| + (add icon theme) |\n";
+ print "| - N (remove icon theme) |\n";
+ print "| m N (mark default icon theme) |\n";
+ print "| f N (set fallback icon set) |\n";
+ print "| l (list icon themes) |\n";
+ print "| d (done) |\n";
+ print "`------------------------------------'\n";
+ }
+ print "[icon_themes] command (?=help) > ";
+ $input = <STDIN>;
+ $input =~ s/[\r\n]//g;
+ }
+}
+
+sub command_templates {
+ print "\nDefine the template sets (skins) that you wish to use. If you have added\n";
+ print "a template set of your own, just follow the instructions (?) about\n";
+ print "how to add them. You can also change the default template.\n";
+
+ print "\n Available Templates:\n";
+
+ $count = 0;
+ while ( $count <= $#templateset_name ) {
+ if ( $templateset_id[$count] eq $templateset_default ) {
+ print " d";
+ } else {
+ print " ";
+ }
+ if ( $templateset_id[$count] eq $templateset_fallback ) {
+ print "f";
+ } else {
+ print " ";
+ }
+ if ( $templateset_id[$count] eq $rpc_templateset ) {
+ print "r ";
+ } else {
+ print " ";
+ }
+ if ( $count < 10 ) {
+ print " ";
+ }
+ if ( $count < 100 ) {
+ print " ";
+ }
+ $name = $templateset_name[$count];
+
+ # present RPC template sets differently
+ #
+ if ( $templateset_id[$count] =~ /_rpc$/ ) {
+ $name = $name . " (not shown in user interface; used for RPC interface only)";
+ } else {
+
+ $num_spaces = 35 - length($name);
+ for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
+ $name = $name . " ";
+ }
+ $name = $name . "($templateset_id[$count])";
+
+ }
+
+ print " $count. $name\n";
+
+ $count++;
+ }
+ print "\n d = default template set\n"
+ . " f = fallback template set\n"
+ . " r = RPC template set\n\n";
+
+ $menu_text = ".-------------------------------------.\n"
+ . "| t (detect template set) |\n"
+ . "| + (add template set) |\n"
+ . "| - N (remove template set) |\n"
+ . "| m N (mark default template set) |\n"
+ . "| f N (set fallback template set) |\n"
+ . "| r N (set RPC template set) |\n"
+ . "| l (list template sets/skins) |\n"
+ . "| d (done) |\n"
+ . "|-------------------------------------|\n"
+ . "| where N is a template set number |\n"
+ . "`-------------------------------------'\n";
+ print "\n";
+ print $menu_text;
+ print "\n[template set] command (?=help) > ";
+
+ $input = <STDIN>;
+ $input =~ s/[\r\n]//g;
+ while ( $input ne "d" ) {
+
+ # list template sets
+ #
+ if ( $input =~ /^\s*l\s*/i ) {
+ $count = 0;
+ while ( $count <= $#templateset_name ) {
+ if ( $templateset_id[$count] eq $templateset_default ) {
+ print " d";
+ } else {
+ print " ";
+ }
+ if ( $templateset_id[$count] eq $templateset_fallback ) {
+ print "f";
+ } else {
+ print " ";
+ }
+ if ( $templateset_id[$count] eq $rpc_templateset ) {
+ print "r ";
+ } else {
+ print " ";
+ }
+ if ( $count < 10 ) {
+ print " ";
+ }
+ if ( $count < 100 ) {
+ print " ";
+ }
+ $name = $templateset_name[$count];
+
+ # present RPC template sets differently
+ #
+ if ( $templateset_id[$count] =~ /_rpc$/ ) {
+ $name = $name . " (not shown in user interface; used for RPC interface only)";
+ } else {
+
+ $num_spaces = 35 - length($name);
+ for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
+ $name = $name . " ";
+ }
+ $name = $name . "($templateset_id[$count])";
+
+ }
+
+ print " $count. $name\n";
+
+ $count++;
+ }
+ print "\n d = default template set\n"
+ . " f = fallback template set\n"
+ . " r = RPC template set\n\n";
+
+ # mark default template set
+ #
+ } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
+ $old_def = $templateset_default;
+ $input =~ s/^\s*m\s*//;
+ $templateset_default = $templateset_id[$input];
+ if ( $templateset_default =~ /^\s*$/ ) {
+ print "Cannot set default template set to $input. That template set does not exist.\n";
+ $templateset_default = $old_def;
+ }
+ if ( $templateset_default =~ /_rpc$/ ) {
+ print "Cannot set default template set to $input. That template set is intended for the RPC interface only.\n";
+ $templateset_default = $old_def;
+ }
+
+ # set fallback template set
+ #
+ } elsif ( $input =~ /^\s*f\s*[0-9]+/i ) {
+ $old_def = $templateset_fallback;
+ $input =~ s/^\s*f\s*//;
+ $templateset_fallback = $templateset_id[$input];
+ if ( $templateset_fallback =~ /^\s*$/ ) {
+ print "Cannot set fallback template set to $input. That template set does not exist.\n";
+ $templateset_fallback = $old_def;
+ }
+ if ( $templateset_fallback =~ /_rpc$/ ) {
+ print "Cannot set fallback template set to $input. That template set is intended for the RPC interface only.\n";
+ $templateset_fallback = $old_def;
+ }
+
+ # set RPC template set
+ #
+ } elsif ( $input =~ /^\s*r\s*[0-9]+/i ) {
+ $old_def = $rpc_templateset;
+ $input =~ s/^\s*r\s*//;
+ $rpc_templateset = $templateset_id[$input];
+ if ( $rpc_templateset =~ /^\s*$/ ) {
+ print "Cannot set RPC template set to $input. That template set does not exist.\n";
+ $rpc_templateset = $old_def;
+ }
+ if ( $rpc_templateset !~ /_rpc$/ ) {
+ print "Cannot set fallback template set to $input. That template set is not intended for the RPC interface.\n";
+ $rpc_templateset = $old_def;
+ }
+
+ # add template set
+ #
+ } elsif ( $input =~ /^\s*\+/ ) {
+ print "\nWhat is the name of this template (as shown to your users): ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $templateset_name[ $#templateset_name + 1 ] = $name;
+ print "\n\nThe directory name should not contain any path information\n"
+ . "or slashes, and should be the name of the directory that the\n"
+ . "template set is found in within the SquirrelMail templates\n"
+ . "directory.\n\n";
+ print "What directory is this stored in (ex: default_advanced): ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $templateset_id[ $#templateset_id + 1 ] = $name;
+
+ # detect template sets
+ #
+ } elsif ( $input =~ /^\s*t\s*/i ) {
+ print "\nStarting detection...\n\n";
+ opendir( DIR, "../templates" );
+ @files = sort(readdir(DIR));
+ $cnt = 0;
+ while ( $cnt <= $#files ) {
+ if ( -d "../templates/" . $files[$cnt] && $files[$cnt] !~ /^\./ && $files[$cnt] ne ".svn" ) {
+ $filename = $files[$cnt];
+ $found = 0;
+ for ( $x = 0 ; $x <= $#templateset_id ; $x++ ) {
+ if ( $templateset_id[$x] eq $filename ) {
+ $found = 1;
+ last;
+ }
+ }
+ if ( $found != 1) {
+ print "** Found template set: $filename\n";
+ $def = $files[$cnt];
+
+ # no user-friendly names needed for RPC template sets
+ #
+ if ( $def =~ /_rpc$/ ) {
+ $nm = $def;
+ } else {
+ $def = lc($def);
+ $def =~ s/_/ /g;
+ #$def =~ s/(^\w+)/ucfirst $1/eg;
+ #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
+ $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
+ print " What is it's name (as shown to your users)? [$def]: ";
+ $nm = <STDIN>;
+ $nm =~ s/^\s+|\s+$|[\n\r]//g;
+ if ( $nm eq '' ) { $nm = $def; }
+ }
+ $templateset_id[ $#templateset_id + 1 ] = $filename;
+ $templateset_name[ $#templateset_name + 1 ] = $nm;
+ }
+ }
+ $cnt++;
+ }
+ print "\n";
+ for ( $cnt= 0 ; $cnt <= $#templateset_id ; ) {
+ $filename = $templateset_id[$cnt];
+ if ( !(-d change_to_rel_path('SM_PATH . \'templates/' . $filename)) ) {
+ print " Removing \"$filename\" (template set directory not found)\n";
+ if ( $templateset_default eq $filename ) { $templateset_default = 'default'; }
+ if ( $templateset_fallback eq $filename ) { $templateset_fallback = 'default'; }
+ if ( $rpc_templateset eq $filename ) { $rpc_templateset = 'default_rpc'; }
+ $offset = 0;
+ @new_templateset_name = ();
+ @new_templateset_id = ();
+ for ( $x = 0 ; $x < $#templateset_id ; $x++ ) {
+ if ( $templateset_id[$x] eq $filename ) {
+ $offset = 1;
+ }
+ if ( $offset == 1 ) {
+ $new_templateset_name[$x] = $templateset_name[ $x + 1 ];
+ $new_templateset_id[$x] = $templateset_id[ $x + 1 ];
+ } else {
+ $new_templateset_name[$x] = $templateset_name[$x];
+ $new_templateset_id[$x] = $templateset_id[$x];
+ }
+ }
+ @templateset_name = @new_templateset_name;
+ @templateset_id = @new_templateset_id;
+ } else { $cnt++; }
+ }
+ print "\nDetection complete!\n\n";
+
+ closedir DIR;
+
+ # remove template set
+ #
+ # undocumented functionality of removing last template set isn't that great
+ #} elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
+ } 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 = $#templateset_name;
+ }
+ if ( $templateset_id[$rem_num] eq $templateset_default ) {
+ print "You cannot remove the default template set!\n";
+ } elsif ( $templateset_id[$rem_num] eq $templateset_fallback ) {
+ print "You cannot remove the fallback template set!\n";
+ } elsif ( $templateset_id[$rem_num] eq $rpc_templateset ) {
+ print "You cannot remove the RPC template set!\n";
+ } else {
+ $count = 0;
+ @new_templateset_name = ();
+ @new_templateset_id = ();
+ while ( $count <= $#templateset_name ) {
+ if ( $count != $rem_num ) {
+ @new_templateset_name = ( @new_templateset_name, $templateset_name[$count] );
+ @new_templateset_id = ( @new_templateset_id, $templateset_id[$count] );
+ }
+ $count++;
+ }
+ @templateset_name = @new_templateset_name;
+ @templateset_id = @new_templateset_id;
+ }
+
+ # help
+ #
+ } elsif ( $input =~ /^\s*\?\s*/ ) {
+ print $menu_text;
+
+ # command not understood
+ #
+ } else {
+ print "Command not understood\n";
+ }
+
+ print "[template set] command (?=help) > ";
+ $input = <STDIN>;
+ $input =~ s/[\r\n]//g;
+ }
+ return $templateset_default;
+}
+
+
+# sets default font size option
+sub command_default_fontsize {
+ print "Enter default font size [$WHT$$default_fontsize$NRM]: $WHT";
+ $new_size = <STDIN>;
+ if ( $new_size eq "\n" ) {
+ $new_size = $size;
+ } else {
+ $new_size =~ s/[\r\n]//g;
+ }
+ return $new_size;
+}
+
+# controls available fontsets
+sub command_fontsets {
+ # Greeting
+ print "You can control fontsets available to end users here.\n";
+ # set initial $input value
+ $input = 'l';
+ while ( $input ne "x" ) {
+ if ( $input =~ /^\s*a\s*/i ) {
+ # add new fontset
+ print "\nFontset name: ";
+ $name = <STDIN>;
+ if (! $fontsets{trim($name)}) {
+ print "Fontset string: ";
+ $value = <STDIN>;
+ $fontsets{trim($name)} = trim($value);
+ } else {
+ print "\nERROR: Such fontset already exists.\n";
+ }
+ } elsif ( $input =~ /^\s*e\s*/i ) {
+ # edit existing fontset
+ print "\nFontset name: ";
+ $name = <STDIN>;
+ if (! $fontsets{trim($name)}) {
+ print "\nERROR: No such fontset.\n";
+ } else {
+ print "Fontset string [$fontsets{trim($name)}]: ";
+ $value = <STDIN>;
+ $fontsets{trim($name)} = trim($value);
+ }
+ } elsif ( $input =~ /^\s*d\s*/ ) {
+ # delete existing fontset
+ print "\nFontset name: ";
+ $name = <STDIN>;
+ if (! $fontsets{trim($name)}) {
+ print "\nERROR: No such fontset.\n";
+ } else {
+ delete $fontsets{trim($name)};