Small fixes to option page stuff...
[squirrelmail.git] / src / options.php
1 <?php
2
3 /**
4 * options.php
5 *
6 * Copyright (c) 1999-2001 The Squirrelmail Development Team
7 * Licensed under the GNU GPL. For full terms see the file COPYING.
8 *
9 * Displays the options page. Pulls from proper user preference files
10 * and config.php. Displays preferences as selected and other options.
11 *
12 * $Id$
13 */
14
15 require_once('../src/validate.php');
16 require_once('../functions/display_messages.php');
17 require_once('../functions/imap.php');
18 require_once('../functions/array.php');
19 require_once('../functions/options.php');
20
21 /* Set the base uri. */
22 ereg ("(^.*/)[^/]+/[^/]+$", $PHP_SELF, $regs);
23 $base_uri = $regs[1];
24
25 /* First and foremost, deal with language stuff. */
26 if (isset($language)) {
27 setcookie('squirrelmail_language', $language, time()+2592000, $base_uri);
28 $squirrelmail_language = $language;
29 } else {
30 $language = getPref($data_dir, $username, 'language');
31 }
32
33 /*********************************/
34 /*** Build the resultant page. ***/
35 /*********************************/
36
37 displayPageHeader($color, 'None');
38
39 define('SMOPT_MODE_DISPLAY', 'display');
40 define('SMOPT_MODE_SUBMIT', 'submit');
41 define('SMOPT_MODE_LINK', 'link');
42
43 define('SMOPT_PAGE_MAIN', 'main');
44 define('SMOPT_PAGE_PERSONAL', 'personal');
45 define('SMOPT_PAGE_DISPLAY', 'display');
46 define('SMOPT_PAGE_HIGHLIGHT', 'highlight');
47 define('SMOPT_PAGE_FOLDER', 'folder');
48 define('SMOPT_PAGE_ORDER', 'order');
49
50 function process_optionmode_submit($optpage, $optpage_data) {
51 /* Initialize the maximum option refresh level. */
52 $max_refresh = SMOPT_REFRESH_NONE;
53
54 /* Save each option in each option group. */
55 foreach ($optpage_data['options'] as $option_grp) {
56 foreach ($option_grp['options'] as $option) {
57 /* Remove Debug Mode Until Needed
58 echo "name = '$option->name', "
59 . "value = '$option->value', "
60 . "new_value = '$option->new_value'<BR>\n";
61 */
62 if ($option->changed()) {
63 $option->save();
64 $max_refresh = max($max_refresh, $option->refresh_level);
65 }
66 }
67 }
68
69 /* Return the max refresh level. */
70 return ($max_refresh);
71 }
72
73 function process_optionmode_link($optpage) {
74 /* There will be something here, later. */
75 }
76
77 /* Make sure we have an Option Page set. Default to main. */
78 if (!isset($optpage)) {
79 $optpage = 'main';
80 }
81
82 /* Make sure we have an Option Mode set. Default to display. */
83 if (!isset($optmode)) {
84 $optmode = SMOPT_MODE_DISPLAY;
85 }
86
87 /*************************************************************/
88 /*** First, set the load information for each option page. ***/
89 /*************************************************************/
90
91 /* Initialize load information variables. */
92 $optpage_name = '';
93 $optpage_file = '';
94 $optpage_loader = '';
95
96 /* Set the load information for each page. */
97 switch ($optpage) {
98 case SMOPT_PAGE_MAIN: break;
99 case SMOPT_PAGE_PERSONAL:
100 $optpage_name = _("Personal Information");
101 $optpage_file = '../src/options_personal.php';
102 $optpage_loader = 'load_optpage_data_personal';
103 break;
104 case SMOPT_PAGE_DISPLAY:
105 $optpage_name = _("Display Preferences");
106 $optpage_file = '../src/options_display.php';
107 $optpage_loader = 'load_optpage_data_display';
108 break;
109 case SMOPT_PAGE_HIGHLIGHT:
110 $optpage_name = _("Message Highlighting");
111 $optpage_file = '../src/options_highlight.php';
112 $optpage_loader = 'load_optpage_data_highlight';
113 break;
114 case SMOPT_PAGE_FOLDER:
115 $optpage_name = _("Folder Preferences");
116 $optpage_file = '../src/options_folder.php';
117 $optpage_loader = 'load_optpage_data_folder';
118 break;
119 case SMOPT_PAGE_ORDER:
120 $optpage_name = _("Index Order");
121 $optpage_file = '../src/options_order.php';
122 $optpage_loader = 'load_optpage_data_order';
123 break;
124 default: do_hook('optpage_set_loadinfo');
125 }
126
127 /**********************************************************/
128 /*** Second, load the option information for this page. ***/
129 /**********************************************************/
130
131 if ($optpage != SMOPT_PAGE_MAIN) {
132 /* Include the file for this optionpage. */
133 require_once($optpage_file);
134
135 /* Assemble the data for this option page. */
136 $optpage_data = array();
137 $optpage_data = $optpage_loader();
138 $optpage_data['options'] =
139 create_option_groups($optpage_data['grps'], $optpage_data['vals']);
140 }
141
142 /***********************************************************/
143 /*** Next, process anything that needs to be processed. ***/
144 /***********************************************************/
145
146 if ( isset( $optpage_data ) ) {
147 switch ($optmode) {
148 case SMOPT_MODE_SUBMIT:
149 $max_refresh = process_optionmode_submit($optpage, $optpage_data);
150 break;
151 case SMOPT_MODE_LINK:
152 $max_refresh = process_optionmode_link($optpage, $optpage_data);
153 break;
154 }
155 }
156 /*** MOVE THIS DISPLAY CODE DOWN EVENTUALLY!!! ***/
157
158 $optpage_title = _("Options");
159 if (isset($optpage_name) && ($optpage_name != '')) {
160 $optpage_title .= " - $optpage_name";
161 }
162
163 ?>
164
165 <BR>
166 <TABLE BGCOLOR="<?php echo $color[0] ?>" WIDTH="95%" ALIGN="CENTER" CELLPADDING="2" CELLSPACING="0" BORDER="0">
167 <TR><TD ALIGN="CENTER">
168 <B><?php echo $optpage_title; ?></B><BR>
169 <TABLE WIDTH="100%" BORDER="0" CELLPADDING="5" CELLSPACING="0">
170 <TR><TD BGCOLOR="<?php echo $color[4] ?>" ALIGN="CENTER">
171
172 <?php
173
174 /*******************************************************************/
175 /* DO OLD SAVING OF SUBMITTED OPTIONS. THIS WILL BE REMOVED LATER. */
176 /*******************************************************************/
177
178 /* If in submit mode, select a save hook name and run it. */
179 if ($optmode == SMOPT_MODE_SUBMIT) {
180 /* Select a save hook name. */
181 switch ($optpage) {
182 case SMOPT_PAGE_PERSONAL:
183 $save_hook_name = 'options_personal_save';
184 break;
185 case SMOPT_PAGE_DISPLAY:
186 $save_hook_name = 'options_display_save';
187 break;
188 case SMOPT_PAGE_FOLDER:
189 $save_hook_name = 'options_folder_save';
190 break;
191 default:
192 $save_hook_name = 'options_save';
193 break;
194 }
195
196 /* Run the options save hook. */
197 do_hook($save_hook_name);
198 }
199
200 /***************************************************************/
201 /* Apply logic to decide what optpage we want to display next. */
202 /***************************************************************/
203
204 /* If this is the result of an option page being submitted, then */
205 /* show the main page. Otherwise, show whatever page was called. */
206
207 if ($optmode == SMOPT_MODE_SUBMIT) {
208 $optpage = SMOPT_PAGE_MAIN;
209 }
210
211 /***************************************************************/
212 /* Finally, display whatever page we are supposed to show now. */
213 /***************************************************************/
214
215 /*
216 * The main option page has a different layout then the rest of the option
217 * pages. Therefore, we create it here first, then the others below.
218 */
219 if ($optpage == SMOPT_PAGE_MAIN) {
220 /**********************************************************/
221 /* First, display the results of a submission, if needed. */
222 /**********************************************************/
223 if ($optmode == SMOPT_MODE_SUBMIT) {
224 /* Display a message indicating a successful save. */
225 echo '<B>' . _("Successfully Saved Options") . ": $optpage_name</B><BR>\n";
226
227 /* If $max_refresh != SMOPT_REFRESH_NONE, provide a refresh link. */
228 if ($max_refresh == SMOPT_REFRESH_FOLDERLIST) {
229 echo '<A HREF="../src/left_main.php" TARGET="left">' . _("Refresh Folder List") . '</A><BR>';
230 } else if ($max_refresh) {
231 echo '<A HREF="../src/webmail.php?right_frame=options.php" TARGET="_top">' . _("Refresh Page") . '</A><BR>';
232 }
233 }
234 /******************************************/
235 /* Build our array of Option Page Blocks. */
236 /******************************************/
237 $optpage_blocks = array();
238
239 /* Build a section for Personal Options. */
240 $optpage_blocks[] = array(
241 'name' => _("Personal Information"),
242 'url' => 'options.php?optpage=' . SMOPT_PAGE_PERSONAL,
243 'desc' => _("This contains personal information about yourself such as your name, your email address, etc."),
244 'js' => false
245 );
246
247 /* Build a section for Display Options. */
248 $optpage_blocks[] = array(
249 'name' => _("Display Preferences"),
250 'url' => 'options.php?optpage=' . SMOPT_PAGE_DISPLAY,
251 'desc' => _("You can change the way that SquirrelMail looks and displays information to you, such as the colors, the language, and other settings."),
252 'js' => false
253 );
254
255 /* Build a section for Message Highlighting Options. */
256 $optpage_blocks[] = array(
257 'name' =>_("Message Highlighting"),
258 'url' => 'options_highlight.php',
259 'desc' =>_("Based upon given criteria, incoming messages can have different background colors in the message list. This helps to easily distinguish who the messages are from, especially for mailing lists."),
260 'js' => false
261 );
262
263 /* Build a section for Folder Options. */
264 $optpage_blocks[] = array(
265 'name' => _("Folder Preferences"),
266 'url' => 'options.php?optpage=' . SMOPT_PAGE_FOLDER,
267 'desc' => _("These settings change the way your folders are displayed and manipulated."),
268 'js' => false
269 );
270
271 /* Build a section for Index Order Options. */
272 $optpage_blocks[] = array(
273 'name' => _("Index Order"),
274 'url' => 'options_order.php',
275 'desc' => _("The order of the message index can be rearanged and changed to contain the headers in any order you want."),
276 'js' => false
277 );
278
279 /* Build a section for plugins wanting to register an optionpage. */
280 do_hook('optpage_register_block');
281
282 /*****************************************************/
283 /* Let's sort Javascript Option Pages to the bottom. */
284 /*****************************************************/
285 $js_optpage_blocks = array();
286 $reg_optpage_blocks = array();
287 foreach ($optpage_blocks as $cur_optpage) {
288 if (!$cur_optpage['js']) {
289 $reg_optpage_blocks[] = $cur_optpage;
290 } else if ($javascript_on == SMPREF_JS_ON) {
291 $js_optpage_blocks[] = $cur_optpage;
292 }
293 }
294 $optpage_blocks = array_merge($reg_optpage_blocks, $js_optpage_blocks);
295
296 /********************************************/
297 /* Now, print out each option page section. */
298 /********************************************/
299 $first_optpage = false;
300 echo "<TABLE BGCOLOR=\"$color[4]\" WIDTH=\"100%\" CELLPADDING=0 CELLSPACING=\"5\" BORDER=\"0\">" .
301 '<TR><TD VALIGN="TOP">' .
302 "<TABLE BGCOLOR=\"$color[4]\" WIDTH=\"100%\" CELLPADDING=\"3\" CELLSPACING=\"0\" BORDER=\"0\">";
303 foreach ($optpage_blocks as $next_optpage) {
304 if ($first_optpage == false) {
305 $first_optpage = $next_optpage;
306 } else {
307 print_optionpages_row($first_optpage, $next_optpage);
308 $first_optpage = false;
309 }
310 }
311
312 if ($first_optpage != false) {
313 print_optionpages_row($first_optpage);
314 }
315
316 echo "</TABLE></TD></TR></TABLE>\n";
317
318 do_hook('options_link_and_description');
319
320
321 /*************************************************************************/
322 /* If we are not looking at the main option page, display the page here. */
323 /*************************************************************************/
324 } else {
325 echo '<FORM NAME="f" ACTION="options.php" METHOD="POST"><BR>' . "\n"
326 . '<TABLE WIDTH="100%" CELLPADDING=2 CELLSPACING=0 BORDER=0>' . "\n"
327 . create_optpage_element($optpage)
328 . create_optmode_element(SMOPT_MODE_SUBMIT);
329
330 /* Output the option groups for this page. */
331 print_option_groups($optpage_data['options']);
332
333 /* Set the inside_hook_name and submit_name. */
334 switch ($optpage) {
335 case SMOPT_PAGE_PERSONAL:
336 $inside_hook_name = 'options_personal_inside';
337 $bottom_hook_name = 'options_personal_bottom';
338 $submit_name = 'submit_personal';
339 break;
340 case SMOPT_PAGE_DISPLAY:
341 $inside_hook_name = 'options_display_inside';
342 $bottom_hook_name = 'options_display_bottom';
343 $submit_name = 'submit_display';
344 break;
345 case SMOPT_PAGE_HIGHLIGHT:
346 $inside_hook_name = 'options_highlight_inside';
347 $bottom_hook_name = 'options_highlight_bottom';
348 $submit_name = 'submit_highlight';
349 break;
350 case SMOPT_PAGE_FOLDER:
351 $inside_hook_name = 'options_folder_inside';
352 $bottom_hook_name = 'options_folder_bottom';
353 $submit_name = 'submit_folder';
354 break;
355 case SMOPT_PAGE_ORDER:
356 $inside_hook_name = 'options_order_inside';
357 $bottom_hook_name = 'options_order_bottom';
358 $submit_name = 'submit_order';
359 break;
360 default:
361 $inside_hook_name = '';
362 $bottom_hook_name = '';
363 $submit_name = 'submit';
364 }
365
366 /* If it is not empty, trigger the inside hook. */
367 if ($inside_hook_name != '') {
368 do_hook($inside_hook_name);
369 }
370
371 /* Spit out a submit button. */
372 OptionSubmit($submit_name);
373 echo '</TABLE></FORM>';
374
375 /* If it is not empty, trigger the bottom hook. */
376 if ($bottom_hook_name != '') {
377 do_hook($bottom_hook_name);
378 }
379 }
380
381 ?>
382 </TD></TR>
383 </TABLE>
384
385 </TD></TR>
386 </TABLE>
387
388 </BODY></HTML>
389
390 <?php
391
392 /*******************************************************************/
393 /* Please be warned. The code below this point sucks. This is just */
394 /* my first implementation to make the option rows work for both */
395 /* Javascript and non-Javascript option chunks. */
396 /* */
397 /* Please, someone make these better for me. All three functions */
398 /* below REALLY do close to the same thing. */
399 /* */
400 /* This code would be GREATLY improved by a templating system. */
401 /* Don't try to implement that now, however. That will come later. */
402 /*******************************************************************/
403
404 /*******************************************************************/
405 /* Actually, now that I think about it, don't do anything with */
406 /* this code yet. There is ACTUALLY supposed to be a difference */
407 /* between the three functions that write the option rows. I just */
408 /* have not yet gotten to integrating that yet. */
409 /*******************************************************************/
410
411 /**
412 * This function prints out an option page row.
413 */
414 function print_optionpages_row($leftopt, $rightopt = false) {
415 global $color;
416
417 echo "<TABLE BGCOLOR=\"$color[4]\" WIDTH=\"100%\" CELLPADDING=0 CELLSPACING=5 BORDER=0>" .
418 '<TR><TD VALIGN="TOP">' .
419 '<TABLE WIDTH="100%" CELLPADDING="3" CELLSPACING="0" BORDER="0">' .
420 '<TR>' .
421 "<TD VALIGN=TOP BGCOLOR=\"$color[9]\" WIDTH=\"50%\">" .
422 '<A HREF="' . $leftopt['url'] . '">' . $leftopt['name'] . '</A>'.
423 '</TD>'.
424 "<TD VALIGN=TOP BGCOLOR=\"$color[4]\">&nbsp;</TD>";
425 if ($rightopt) {
426 echo "<TD VALIGN=top BGCOLOR=\"$color[9]\" WIDTH=\"50%\">" .
427 '<A HREF="' . $rightopt['url'] . '">' . $rightopt['name'] . '</A>' .
428 '</TD>';
429 } else {
430 echo "<TD VALIGN=top BGCOLOR=\"$color[4]\" WIDTH=\"50%\">&nbsp;</TD>";
431 }
432
433 echo '</TR>' .
434 '<TR>' .
435 "<TD VALIGN=top BGCOLOR=\"$color[0]\" WIDTH=\"50%\">" .
436 $leftopt['desc'] .
437 '</TD>' .
438 "<TD VALIGN=top BGCOLOR=\"$color[4]\">&nbsp;</TD>";
439 if ($rightopt) {
440 echo "<TD VALIGN=top BGCOLOR=\"$color[0]\" WIDTH=\"50%\">" .
441 $rightopt['desc'] .
442 '</TD>';
443 } else {
444 echo "<TD VALIGN=top BGCOLOR=\"$color[4]\" WIDTH=\"50%\">&nbsp;</TD>";
445 }
446
447 echo '</TR>' .
448 '</TABLE>' .
449 '</TD></TR>' .
450 "</TABLE>\n";
451 }
452
453 ?>