Increment year in copyright notice.
[squirrelmail.git] / src / options.php
1 <?php
2
3 /**
4 * options.php
5 *
6 * Copyright (c) 1999-2005 The SquirrelMail Project 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 * @version $Id$
13 * @package squirrelmail
14 */
15
16 /**
17 * Path for SquirrelMail required files.
18 * @ignore
19 */
20 define('SM_PATH','../');
21
22 /* SquirrelMail required files. */
23 require_once(SM_PATH . 'include/validate.php');
24 require_once(SM_PATH . 'functions/global.php');
25 require_once(SM_PATH . 'functions/display_messages.php');
26 require_once(SM_PATH . 'functions/imap.php');
27 require_once(SM_PATH . 'functions/options.php');
28 require_once(SM_PATH . 'functions/strings.php');
29 require_once(SM_PATH . 'functions/html.php');
30 require_once(SM_PATH . 'functions/forms.php');
31
32 /*********************************/
33 /*** Build the resultant page. ***/
34 /*********************************/
35
36 define('SMOPT_MODE_DISPLAY', 'display');
37 define('SMOPT_MODE_SUBMIT', 'submit');
38 define('SMOPT_MODE_LINK', 'link');
39
40 define('SMOPT_PAGE_MAIN', 'main');
41 define('SMOPT_PAGE_PERSONAL', 'personal');
42 define('SMOPT_PAGE_DISPLAY', 'display');
43 define('SMOPT_PAGE_HIGHLIGHT', 'highlight');
44 define('SMOPT_PAGE_FOLDER', 'folder');
45 define('SMOPT_PAGE_ORDER', 'order');
46
47 function process_optionmode_submit($optpage, $optpage_data) {
48 /* Initialize the maximum option refresh level. */
49 $max_refresh = SMOPT_REFRESH_NONE;
50
51 /* Save each option in each option group. */
52 foreach ($optpage_data['options'] as $option_grp) {
53 foreach ($option_grp['options'] as $option) {
54 /* Remove Debug Mode Until Needed
55 echo "name = '$option->name', "
56 . "value = '$option->value', "
57 . "new_value = '$option->new_value'\n";
58 echo "<br />";
59 */
60 if ($option->changed()) {
61 $option->save();
62 $max_refresh = max($max_refresh, $option->refresh_level);
63 }
64 }
65 }
66
67 /* Return the max refresh level. */
68 return ($max_refresh);
69 }
70
71 function process_optionmode_link($optpage) {
72 /* There will be something here, later. */
73 }
74
75
76 /**
77 * This function prints out an option page row.
78 */
79 function print_optionpages_row($leftopt, $rightopt = false) {
80 global $color;
81
82 if ($rightopt) {
83 $rightopt_name = html_tag( 'td', '<a href="' . $rightopt['url'] . '">' . $rightopt['name'] . '</a>', 'left', $color[9], 'valign="top" width="49%"' );
84 $rightopt_desc = html_tag( 'td', $rightopt['desc'], 'left', $color[0], 'valign="top" width="49%"' );
85 } else {
86 $rightopt_name = html_tag( 'td', '&nbsp;', 'left', $color[4], 'valign="top" width="49%"' );
87 $rightopt_desc = html_tag( 'td', '&nbsp;', 'left', $color[4], 'valign="top" width="49%"' );
88 }
89
90 echo
91 html_tag( 'table', "\n" .
92 html_tag( 'tr', "\n" .
93 html_tag( 'td', "\n" .
94 html_tag( 'table', "\n" .
95 html_tag( 'tr', "\n" .
96 html_tag( 'td',
97 '<a href="' . $leftopt['url'] . '">' . $leftopt['name'] . '</a>' ,
98 'left', $color[9], 'valign="top" width="49%"' ) .
99 html_tag( 'td',
100 '&nbsp;' ,
101 'left', $color[4], 'valign="top" width="2%"' ) . "\n" .
102 $rightopt_name
103 ) . "\n" .
104 html_tag( 'tr', "\n" .
105 html_tag( 'td',
106 $leftopt['desc'] ,
107 'left', $color[0], 'valign="top" width="49%"' ) .
108 html_tag( 'td',
109 '&nbsp;' ,
110 'left', $color[4], 'valign="top" width="2%"' ) . "\n" .
111 $rightopt_desc
112 ) ,
113 '', '', 'width="100%" cellpadding="2" cellspacing="0" border="0"' ) ,
114 'left', '', 'valign="top"' )
115 ) ,
116 '', $color[4], 'width="100%" cellpadding="0" cellspacing="5" border="0"' );
117 }
118
119 /* ---------------------------- main ---------------------------- */
120
121 /* get the globals that we may need */
122 sqgetGlobalVar('key', $key, SQ_COOKIE);
123 sqgetGlobalVar('username', $username, SQ_SESSION);
124 sqgetGlobalVar('onetimepad',$onetimepad, SQ_SESSION);
125 sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION);
126
127 sqgetGlobalVar('optpage', $optpage);
128 sqgetGlobalVar('optmode', $optmode, SQ_FORM);
129 sqgetGlobalVar('optpage_data',$optpage_data, SQ_POST);
130 /* end of getting globals */
131
132 /* Make sure we have an Option Page set. Default to main. */
133 if ( !isset($optpage) || $optpage == '' ) {
134 $optpage = SMOPT_PAGE_MAIN;
135 } else {
136 $optpage = strip_tags( $optpage );
137 }
138
139 /* Make sure we have an Option Mode set. Default to display. */
140 if (!isset($optmode)) {
141 $optmode = SMOPT_MODE_DISPLAY;
142 }
143
144 /*
145 * First, set the load information for each option page.
146 */
147
148 /* Initialize load information variables. */
149 $optpage_name = '';
150 $optpage_file = '';
151 $optpage_loader = '';
152
153 /* Set the load information for each page. */
154 switch ($optpage) {
155 case SMOPT_PAGE_MAIN:
156 break;
157 case SMOPT_PAGE_PERSONAL:
158 $optpage_name = _("Personal Information");
159 $optpage_file = SM_PATH . 'include/options/personal.php';
160 $optpage_loader = 'load_optpage_data_personal';
161 $optpage_loadhook = 'optpage_loadhook_personal';
162 break;
163 case SMOPT_PAGE_DISPLAY:
164 $optpage_name = _("Display Preferences");
165 $optpage_file = SM_PATH . 'include/options/display.php';
166 $optpage_loader = 'load_optpage_data_display';
167 $optpage_loadhook = 'optpage_loadhook_display';
168 break;
169 case SMOPT_PAGE_HIGHLIGHT:
170 $optpage_name = _("Message Highlighting");
171 $optpage_file = SM_PATH . 'include/options/highlight.php';
172 $optpage_loader = 'load_optpage_data_highlight';
173 $optpage_loadhook = 'optpage_loadhook_highlight';
174 break;
175 case SMOPT_PAGE_FOLDER:
176 $optpage_name = _("Folder Preferences");
177 $optpage_file = SM_PATH . 'include/options/folder.php';
178 $optpage_loader = 'load_optpage_data_folder';
179 $optpage_loadhook = 'optpage_loadhook_folder';
180 break;
181 case SMOPT_PAGE_ORDER:
182 $optpage_name = _("Index Order");
183 $optpage_file = SM_PATH . 'include/options/order.php';
184 $optpage_loader = 'load_optpage_data_order';
185 $optpage_loadhook = 'optpage_loadhook_order';
186 break;
187 default: do_hook('optpage_set_loadinfo');
188 }
189
190 /**********************************************************/
191 /*** Second, load the option information for this page. ***/
192 /**********************************************************/
193
194 if ( !@is_file( $optpage_file ) ) {
195 $optpage = SMOPT_PAGE_MAIN;
196 } else if ($optpage != SMOPT_PAGE_MAIN ) {
197 /* Include the file for this optionpage. */
198
199 require_once($optpage_file);
200
201 /* Assemble the data for this option page. */
202 $optpage_data = array();
203 $optpage_data = $optpage_loader();
204 do_hook($optpage_loadhook);
205 $optpage_data['options'] =
206 create_option_groups($optpage_data['grps'], $optpage_data['vals']);
207 }
208
209 /***********************************************************/
210 /*** Next, process anything that needs to be processed. ***/
211 /***********************************************************/
212
213 $optpage_save_error=array();
214
215 if ( isset( $optpage_data ) ) {
216 switch ($optmode) {
217 case SMOPT_MODE_SUBMIT:
218 $max_refresh = process_optionmode_submit($optpage, $optpage_data);
219 break;
220 case SMOPT_MODE_LINK:
221 $max_refresh = process_optionmode_link($optpage, $optpage_data);
222 break;
223 }
224 }
225
226 $optpage_title = _("Options");
227 if (isset($optpage_name) && ($optpage_name != '')) {
228 $optpage_title .= " - $optpage_name";
229 }
230
231 /*******************************************************************/
232 /* DO OLD SAVING OF SUBMITTED OPTIONS. THIS WILL BE REMOVED LATER. */
233 /*******************************************************************/
234
235 /* If in submit mode, select a save hook name and run it. */
236 if ($optmode == SMOPT_MODE_SUBMIT) {
237 /* Select a save hook name. */
238 switch ($optpage) {
239 case SMOPT_PAGE_PERSONAL:
240 $save_hook_name = 'options_personal_save';
241 break;
242 case SMOPT_PAGE_DISPLAY:
243 $save_hook_name = 'options_display_save';
244 break;
245 case SMOPT_PAGE_FOLDER:
246 $save_hook_name = 'options_folder_save';
247 break;
248 default:
249 $save_hook_name = 'options_save';
250 break;
251 }
252
253 /* Run the options save hook. */
254 do_hook($save_hook_name);
255 }
256
257 /***************************************************************/
258 /* Apply logic to decide what optpage we want to display next. */
259 /***************************************************************/
260
261 /* If this is the result of an option page being submitted, then */
262 /* show the main page. Otherwise, show whatever page was called. */
263
264 if ($optmode == SMOPT_MODE_SUBMIT) {
265 $optpage = SMOPT_PAGE_MAIN;
266 }
267
268 /***************************************************************/
269 /* Finally, display whatever page we are supposed to show now. */
270 /***************************************************************/
271
272 displayPageHeader($color, 'None', (isset($optpage_data['xtra']) ? $optpage_data['xtra'] : ''));
273
274 echo html_tag( 'table', '', 'center', $color[0], 'width="95%" cellpadding="1" cellspacing="0" border="0"' ) . "\n" .
275 html_tag( 'tr' ) . "\n" .
276 html_tag( 'td', '', 'center' ) .
277 "<b>$optpage_title</b><br />\n".
278 html_tag( 'table', '', '', '', 'width="100%" cellpadding="5" cellspacing="0" border="0"' ) . "\n" .
279 html_tag( 'tr' ) . "\n" .
280 html_tag( 'td', '', 'center', $color[4] ) . "\n";
281
282 /*
283 * The main option page has a different layout then the rest of the option
284 * pages. Therefore, we create it here first, then the others below.
285 */
286 if ($optpage == SMOPT_PAGE_MAIN) {
287 /**********************************************************/
288 /* First, display the results of a submission, if needed. */
289 /**********************************************************/
290 if ($optmode == SMOPT_MODE_SUBMIT) {
291 if (!isset($frame_top)) {
292 $frame_top = '_top';
293 }
294
295 if (isset($optpage_save_error) && $optpage_save_error!=array()) {
296 echo "<font color=\"$color[2]\"><b>" . _("Error(s) happened while saving your options") . "</b></font><br />\n";
297 echo "<ul>\n";
298 foreach ($optpage_save_error as $error_message) {
299 echo '<li><small>' . $error_message . "</small></li>\n";
300 }
301 echo "</ul>\n";
302 echo '<b>' . _("Some of your preference changes are not applied.") . "</b><br />\n";
303 } else {
304 /* Display a message indicating a successful save. */
305 echo '<b>' . _("Successfully Saved Options") . ": $optpage_name</b><br />\n";
306 }
307
308 /* If $max_refresh != SMOPT_REFRESH_NONE, provide a refresh link. */
309 if ( !isset( $max_refresh ) ) {
310 } else if ($max_refresh == SMOPT_REFRESH_FOLDERLIST) {
311 echo '<a href="../src/left_main.php" target="left">' . _("Refresh Folder List") . '</a><br />';
312 } else if ($max_refresh) {
313 echo '<a href="../src/webmail.php?right_frame=options.php" target="' . $frame_top . '">' . _("Refresh Page") . '</a><br />';
314 }
315 }
316 /******************************************/
317 /* Build our array of Option Page Blocks. */
318 /******************************************/
319 $optpage_blocks = array();
320
321 /* Build a section for Personal Options. */
322 $optpage_blocks[] = array(
323 'name' => _("Personal Information"),
324 'url' => 'options.php?optpage=' . SMOPT_PAGE_PERSONAL,
325 'desc' => _("This contains personal information about yourself such as your name, your email address, etc."),
326 'js' => false
327 );
328
329 /* Build a section for Display Options. */
330 $optpage_blocks[] = array(
331 'name' => _("Display Preferences"),
332 'url' => 'options.php?optpage=' . SMOPT_PAGE_DISPLAY,
333 'desc' => _("You can change the way that SquirrelMail looks and displays information to you, such as the colors, the language, and other settings."),
334 'js' => false
335 );
336
337 /* Build a section for Message Highlighting Options. */
338 $optpage_blocks[] = array(
339 'name' =>_("Message Highlighting"),
340 'url' => 'options_highlight.php',
341 '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."),
342 'js' => false
343 );
344
345 /* Build a section for Folder Options. */
346 $optpage_blocks[] = array(
347 'name' => _("Folder Preferences"),
348 'url' => 'options.php?optpage=' . SMOPT_PAGE_FOLDER,
349 'desc' => _("These settings change the way your folders are displayed and manipulated."),
350 'js' => false
351 );
352
353 /* Build a section for Index Order Options. */
354 $optpage_blocks[] = array(
355 'name' => _("Index Order"),
356 'url' => 'options_order.php',
357 'desc' => _("The order of the message index can be rearranged and changed to contain the headers in any order you want."),
358 'js' => false
359 );
360
361 /* Build a section for plugins wanting to register an optionpage. */
362 do_hook('optpage_register_block');
363
364 /*****************************************************/
365 /* Let's sort Javascript Option Pages to the bottom. */
366 /*****************************************************/
367 $js_optpage_blocks = array();
368 $reg_optpage_blocks = array();
369 foreach ($optpage_blocks as $cur_optpage) {
370 if (!isset($cur_optpage['js']) || !$cur_optpage['js']) {
371 $reg_optpage_blocks[] = $cur_optpage;
372 } else if ($javascript_on == SMPREF_JS_ON) {
373 $js_optpage_blocks[] = $cur_optpage;
374 }
375 }
376 $optpage_blocks = array_merge($reg_optpage_blocks, $js_optpage_blocks);
377
378 /********************************************/
379 /* Now, print out each option page section. */
380 /********************************************/
381 $first_optpage = false;
382 echo html_tag( 'table', '', '', $color[4], 'width="100%" cellpadding="0" cellspacing="5" border="0"' ) . "\n" .
383 html_tag( 'tr' ) . "\n" .
384 html_tag( 'td', '', 'left', '', 'valign="top"' ) .
385 html_tag( 'table', '', '', $color[4], 'width="100%" cellpadding="3" cellspacing="0" border="0"' ) . "\n" .
386 html_tag( 'tr' ) . "\n" .
387 html_tag( 'td', '', 'left' );
388 foreach ($optpage_blocks as $next_optpage) {
389 if ($first_optpage == false) {
390 $first_optpage = $next_optpage;
391 } else {
392 print_optionpages_row($first_optpage, $next_optpage);
393 $first_optpage = false;
394 }
395 }
396
397 if ($first_optpage != false) {
398 print_optionpages_row($first_optpage);
399 }
400
401 echo "</td></tr></table></td></tr></table>\n";
402
403 do_hook('options_link_and_description');
404
405
406 /*************************************************************************/
407 /* If we are not looking at the main option page, display the page here. */
408 /*************************************************************************/
409 } else {
410 echo addForm('options.php', 'post', 'f')
411 . create_optpage_element($optpage)
412 . create_optmode_element(SMOPT_MODE_SUBMIT)
413 . html_tag( 'table', '', '', '', 'width="100%" cellpadding="2" cellspacing="0" border="0"' ) . "\n";
414
415 /* Output the option groups for this page. */
416 print_option_groups($optpage_data['options']);
417
418 /* Set the inside_hook_name and submit_name. */
419 switch ($optpage) {
420 case SMOPT_PAGE_PERSONAL:
421 $inside_hook_name = 'options_personal_inside';
422 $bottom_hook_name = 'options_personal_bottom';
423 $submit_name = 'submit_personal';
424 break;
425 case SMOPT_PAGE_DISPLAY:
426 $inside_hook_name = 'options_display_inside';
427 $bottom_hook_name = 'options_display_bottom';
428 $submit_name = 'submit_display';
429 break;
430 case SMOPT_PAGE_HIGHLIGHT:
431 $inside_hook_name = 'options_highlight_inside';
432 $bottom_hook_name = 'options_highlight_bottom';
433 $submit_name = 'submit_highlight';
434 break;
435 case SMOPT_PAGE_FOLDER:
436 $inside_hook_name = 'options_folder_inside';
437 $bottom_hook_name = 'options_folder_bottom';
438 $submit_name = 'submit_folder';
439 break;
440 case SMOPT_PAGE_ORDER:
441 $inside_hook_name = 'options_order_inside';
442 $bottom_hook_name = 'options_order_bottom';
443 $submit_name = 'submit_order';
444 break;
445 default:
446 $inside_hook_name = '';
447 $bottom_hook_name = '';
448 $submit_name = 'submit';
449 }
450
451 /* If it is not empty, trigger the inside hook. */
452 if ($inside_hook_name != '') {
453 do_hook($inside_hook_name);
454 }
455
456 /* Spit out a submit button. */
457 OptionSubmit($submit_name);
458 echo '</table></form>';
459
460 /* If it is not empty, trigger the bottom hook. */
461 if ($bottom_hook_name != '') {
462 do_hook($bottom_hook_name);
463 }
464 }
465 ?>
466 </td></tr>
467 </table>
468 </td></tr>
469 </table>
470 </body></html>