Anchor the regexp. Thanks Thijs Kinkhorst.
[squirrelmail.git] / src / options.php
1 <?php
2
3 /**
4 * options.php
5 *
6 * Displays the options page. Pulls from proper user preference files
7 * and config.php. Displays preferences as selected and other options.
8 *
9 * @copyright &copy; 1999-2009 The SquirrelMail Project Team
10 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
11 * @version $Id$
12 * @package squirrelmail
13 * @subpackage prefs
14 */
15
16 /** This is the options page */
17 define('PAGE_NAME', 'options');
18
19 /**
20 * Include the SquirrelMail initialization file.
21 */
22 require('../include/init.php');
23
24 /* SquirrelMail required files. */
25
26 //include(SM_PATH . 'functions/imap_general.php');
27 require_once(SM_PATH . 'functions/options.php');
28 require_once(SM_PATH . 'functions/forms.php');
29
30 /*********************************/
31 /*** Build the resultant page. ***/
32 /*********************************/
33
34 define('SMOPT_MODE_DISPLAY', 'display');
35 define('SMOPT_MODE_SUBMIT', 'submit');
36 define('SMOPT_MODE_LINK', 'link');
37
38 define('SMOPT_PAGE_MAIN', 'main');
39 define('SMOPT_PAGE_PERSONAL', 'personal');
40 define('SMOPT_PAGE_DISPLAY', 'display');
41 define('SMOPT_PAGE_COMPOSE', 'compose');
42 define('SMOPT_PAGE_ACCESSIBILITY', 'accessibility');
43 define('SMOPT_PAGE_HIGHLIGHT', 'highlight');
44 define('SMOPT_PAGE_FOLDER', 'folder');
45 define('SMOPT_PAGE_ORDER', 'order');
46
47 /**
48 * Save submitted options and calculate the most
49 * we need to refresh the page
50 *
51 * @param string $optpage The name of the page being submitted
52 * @param array $optpage_data An array of all the submitted options
53 *
54 * @return int The highest level of screen refresh needed per
55 * the options that were changed. This value will
56 * correspond to the SMOPT_REFRESH_* constants found
57 * in functions/options.php.
58 *
59 */
60 function process_optionmode_submit($optpage, $optpage_data) {
61 /* Initialize the maximum option refresh level. */
62 $max_refresh = SMOPT_REFRESH_NONE;
63
64
65
66 /* Save each option in each option group. */
67 foreach ($optpage_data['options'] as $option_grp) {
68 foreach ($option_grp['options'] as $option) {
69
70 /* Special case: need to make sure emailaddress
71 * is saved if we use it as a test for ask_user_info */
72 global $ask_user_info;
73 if ( $optpage = SMOPT_PAGE_PERSONAL && $ask_user_info &&
74 $option->name == 'email_address' ) {
75 $option->setValue('');
76 }
77
78 /* Remove Debug Mode Until Needed
79 echo "name = '$option->name', "
80 . "value = '$option->value', "
81 . "new_value = '$option->new_value'\n";
82 //FIXME: NO HTML IN THE CORE!
83 echo "<br />";
84 */
85 if ($option->changed()) {
86 $option->save();
87 $max_refresh = max($max_refresh, $option->refresh_level);
88 }
89 }
90 }
91
92 /* Return the max refresh level. */
93 return ($max_refresh);
94 }
95
96 function process_optionmode_link($optpage) {
97 /* There will be something here, later. */
98 }
99
100
101
102 /* ---------------------------- main ---------------------------- */
103
104 /* get the globals that we may need */
105 sqgetGlobalVar('optpage', $optpage);
106 sqgetGlobalVar('optmode', $optmode, SQ_FORM);
107 sqgetGlobalVar('optpage_data',$optpage_data, SQ_POST);
108 /* end of getting globals */
109
110 /* Make sure we have an Option Page set. Default to main. */
111 if ( !isset($optpage) || $optpage == '' ) {
112 $optpage = SMOPT_PAGE_MAIN;
113 } else {
114 $optpage = strip_tags( $optpage );
115 }
116
117 /* Make sure we have an Option Mode set. Default to display. */
118 if (!isset($optmode)) {
119 $optmode = SMOPT_MODE_DISPLAY;
120 }
121
122 /*
123 * First, set the load information for each option page.
124 */
125
126 /* Initialize load information variables. */
127 $optpage_name = '';
128 $optpage_file = '';
129 $optpage_loader = '';
130
131 /* Set the load information for each page. */
132 switch ($optpage) {
133 case SMOPT_PAGE_MAIN:
134 break;
135 case SMOPT_PAGE_PERSONAL:
136 $optpage_name = _("Personal Information");
137 $optpage_file = SM_PATH . 'include/options/personal.php';
138 $optpage_loader = 'load_optpage_data_personal';
139 $optpage_loadhook = 'optpage_loadhook_personal';
140 break;
141 case SMOPT_PAGE_DISPLAY:
142 $optpage_name = _("Display Preferences");
143 $optpage_file = SM_PATH . 'include/options/display.php';
144 $optpage_loader = 'load_optpage_data_display';
145 $optpage_loadhook = 'optpage_loadhook_display';
146 break;
147 case SMOPT_PAGE_COMPOSE:
148 $optpage_name = _("Compose Preferences");
149 $optpage_file = SM_PATH . 'include/options/compose.php';
150 $optpage_loader = 'load_optpage_data_compose';
151 $optpage_loadhook = 'optpage_loadhook_compose';
152 break;
153 case SMOPT_PAGE_ACCESSIBILITY:
154 $optpage_name = _("Accessibility Preferences");
155 $optpage_file = SM_PATH . 'include/options/accessibility.php';
156 $optpage_loader = 'load_optpage_data_accessibility';
157 $optpage_loadhook = 'optpage_loadhook_accessibility';
158 break;
159 case SMOPT_PAGE_HIGHLIGHT:
160 $optpage_name = _("Message Highlighting");
161 $optpage_file = SM_PATH . 'include/options/highlight.php';
162 $optpage_loader = 'load_optpage_data_highlight';
163 $optpage_loadhook = 'optpage_loadhook_highlight';
164 break;
165 case SMOPT_PAGE_FOLDER:
166 $optpage_name = _("Folder Preferences");
167 $optpage_file = SM_PATH . 'include/options/folder.php';
168 $optpage_loader = 'load_optpage_data_folder';
169 $optpage_loadhook = 'optpage_loadhook_folder';
170 break;
171 case SMOPT_PAGE_ORDER:
172 $optpage_name = _("Index Order");
173 $optpage_file = SM_PATH . 'include/options/order.php';
174 $optpage_loader = 'load_optpage_data_order';
175 $optpage_loadhook = 'optpage_loadhook_order';
176 break;
177 default: do_hook('optpage_set_loadinfo', $null);
178 }
179
180 /**********************************************************/
181 /*** Second, load the option information for this page. ***/
182 /**********************************************************/
183
184 if ( !@is_file( $optpage_file ) ) {
185 $optpage = SMOPT_PAGE_MAIN;
186 } elseif ($optpage != SMOPT_PAGE_MAIN ) {
187 /* Include the file for this optionpage. */
188
189 require_once($optpage_file);
190
191 /* Assemble the data for this option page. */
192 $optpage_data = array();
193 $optpage_data = $optpage_loader();
194 do_hook($optpage_loadhook, $null);
195 $optpage_data['options'] = create_option_groups($optpage_data['grps'], $optpage_data['vals']);
196 }
197
198 /***********************************************************/
199 /*** Next, process anything that needs to be processed. ***/
200 /***********************************************************/
201
202 $optpage_save_error=array();
203
204 if ( isset( $optpage_data ) ) {
205 switch ($optmode) {
206 case SMOPT_MODE_SUBMIT:
207 $max_refresh = process_optionmode_submit($optpage, $optpage_data);
208 break;
209 case SMOPT_MODE_LINK:
210 $max_refresh = process_optionmode_link($optpage, $optpage_data);
211 break;
212 }
213 }
214
215 $optpage_title = _("Options");
216 if (isset($optpage_name) && ($optpage_name != '')) {
217 $optpage_title .= " - $optpage_name";
218 }
219
220 /*******************************************************************/
221 /* DO OLD SAVING OF SUBMITTED OPTIONS. THIS WILL BE REMOVED LATER. */
222 /*******************************************************************/
223
224 //FIXME: let's remove these finally in 1.5.2..... but first, are there any plugins using them?
225 /* If in submit mode, select a save hook name and run it. */
226 if ($optmode == SMOPT_MODE_SUBMIT) {
227 /* Select a save hook name. */
228 switch ($optpage) {
229 case SMOPT_PAGE_PERSONAL:
230 $save_hook_name = 'options_personal_save';
231 break;
232 case SMOPT_PAGE_DISPLAY:
233 $save_hook_name = 'options_display_save';
234 break;
235 case SMOPT_PAGE_COMPOSE:
236 $save_hook_name = 'options_compose_save';
237 break;
238 case SMOPT_PAGE_ACCESSIBILITY:
239 $save_hook_name = 'options_accessibility_save';
240 break;
241 case SMOPT_PAGE_FOLDER:
242 $save_hook_name = 'options_folder_save';
243 break;
244 default:
245 $save_hook_name = 'options_save';
246 break;
247 }
248
249 /* Run the options save hook. */
250 do_hook($save_hook_name, $null);
251 }
252
253 /***************************************************************/
254 /* Apply logic to decide what optpage we want to display next. */
255 /***************************************************************/
256
257 /* If this is the result of an option page being submitted, then */
258 /* show the main page. Otherwise, show whatever page was called. */
259
260 if ($optmode == SMOPT_MODE_SUBMIT) {
261 $optpage = SMOPT_PAGE_MAIN;
262 $optpage_title = _("Options");
263 }
264
265 /***************************************************************/
266 /* Finally, display whatever page we are supposed to show now. */
267 /***************************************************************/
268
269 displayPageHeader($color, null, (isset($optpage_data['xtra']) ? $optpage_data['xtra'] : ''));
270
271 /*
272 * The main option page has a different layout then the rest of the option
273 * pages. Therefore, we create it here first, then the others below.
274 */
275 if ($optpage == SMOPT_PAGE_MAIN) {
276 /**********************************************************/
277 /* First, display the results of a submission, if needed. */
278 /**********************************************************/
279 $notice = '';
280 if ($optmode == SMOPT_MODE_SUBMIT) {
281 if (!isset($frame_top)) {
282 $frame_top = '_top';
283 }
284
285 if (isset($optpage_save_error) && $optpage_save_error!=array()) {
286 //FIXME: REMOVE HTML FROM CORE
287 $notice = _("Error(s) occurred while saving your options") . "<br />\n<ul>\n";
288 foreach ($optpage_save_error as $error_message) {
289 $notice.= '<li><small>' . $error_message . "</small></li>\n";
290 }
291 $notice.= "</ul>\n" . _("Some of your preference changes were not applied.") . "\n";
292 } else {
293 /* Display a message indicating a successful save. */
294 // i18n: The %s represents the name of the option page saving the options
295 $notice = sprintf(_("Successfully Saved Options: %s"), $optpage_name) . "<br />\n";
296 }
297
298 /* If $max_refresh != SMOPT_REFRESH_NONE, provide a refresh link. */
299 if ( !isset( $max_refresh ) ) {
300 } else if ($max_refresh == SMOPT_REFRESH_FOLDERLIST) {
301 //FIXME: REMOVE HTML FROM CORE - when migrating, keep in mind that the javascript below assumes the folder list is in a separate sibling frame under the same parent, and it is called "left"
302 if (checkForJavascript()) {
303 $notice .= sprintf(_("Folder list should automatically %srefresh%s."), '<a href="../src/left_main.php" target="left">', '</a>') . '<br /><script type="text/javascript">' . "\n<!--\nparent.left.location = '../src/left_main.php';\n// -->\n</script>\n";
304 } else {
305 $notice .= '<a href="../src/left_main.php" target="left">' . _("Refresh Folder List") . '</a><br />';
306 }
307 } else if ($max_refresh) {
308 if (checkForJavascript()) {
309 //FIXME: REMOVE HTML FROM CORE - when migrating, keep in mind that the javascript below assumes the parent is the top-most SM frame and is what should be refreshed with webmail.php
310 $notice .= sprintf(_("This page should automatically %srefresh%s."), '<a href="../src/webmail.php?right_frame=options.php" target="' . $frame_top . '">', '</a>') . '<br /><script type="text/javascript">' . "\n<!--\nparent.location = '../src/webmail.php?right_frame=options.php';\n// -->\n</script>\n";
311 } else {
312 $notice .= '<a href="../src/webmail.php?right_frame=options.php" target="' . $frame_top . '">' . _("Refresh Page") . '</a><br />';
313 }
314 }
315 }
316
317 if (!empty($notice)) {
318 $oTemplate->assign('note', $notice);
319 $oTemplate->display('note.tpl');
320 }
321
322 /******************************************/
323 /* Build our array of Option Page Blocks. */
324 /******************************************/
325 $optpage_blocks = array();
326
327 // access keys...
328 global $accesskey_options_personal, $accesskey_options_display,
329 $accesskey_options_highlighting, $accesskey_options_folders,
330 $accesskey_options_index_order, $accesskey_options_compose,
331 $accesskey_options_accessibility;
332
333 /* Build a section for Personal Options. */
334 $optpage_blocks[] = array(
335 'name' => _("Personal Information"),
336 'url' => 'options.php?optpage=' . SMOPT_PAGE_PERSONAL,
337 'desc' => _("This contains personal information about yourself such as your name, your email address, etc."),
338 'js' => false,
339 'accesskey' => $accesskey_options_personal,
340 );
341
342 /* Build a section for Display Options. */
343 $optpage_blocks[] = array(
344 'name' => _("Display Preferences"),
345 'url' => 'options.php?optpage=' . SMOPT_PAGE_DISPLAY,
346 'desc' => _("You can change the way that SquirrelMail looks and displays information to you, such as the colors, the language, and other settings."),
347 'js' => false,
348 'accesskey' => $accesskey_options_display,
349 );
350
351 /* Build a section for Message Highlighting Options. */
352 $optpage_blocks[] = array(
353 'name' =>_("Message Highlighting"),
354 'url' => 'options_highlight.php',
355 '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."),
356 'js' => false,
357 'accesskey' => $accesskey_options_highlighting,
358 );
359
360 /* Build a section for Folder Options. */
361 $optpage_blocks[] = array(
362 'name' => _("Folder Preferences"),
363 'url' => 'options.php?optpage=' . SMOPT_PAGE_FOLDER,
364 'desc' => _("These settings change the way your folders are displayed and manipulated."),
365 'js' => false,
366 'accesskey' => $accesskey_options_folders,
367 );
368
369 /* Build a section for Index Order Options. */
370 $optpage_blocks[] = array(
371 'name' => _("Index Order"),
372 'url' => 'options_order.php',
373 'desc' => _("The order of the message index can be rearranged and changed to contain the headers in any order you want."),
374 'js' => false,
375 'accesskey' => $accesskey_options_index_order,
376 );
377
378 /* Build a section for Compose Options. */
379 $optpage_blocks[] = array(
380 'name' => _("Compose Preferences"),
381 'url' => 'options.php?optpage=' . SMOPT_PAGE_COMPOSE,
382 'desc' => _("Control the behaviour and layout of writing new mail messages, replying to and forwarding messages."),
383 'js' => false,
384 'accesskey' => $accesskey_options_compose,
385 );
386
387 /* Build a section for Accessibility Options. */
388 $optpage_blocks[] = array(
389 'name' => _("Accessibility Preferences"),
390 'url' => 'options.php?optpage=' . SMOPT_PAGE_ACCESSIBILITY,
391 'desc' => _("You can configure features that improve interface usability."),
392 'js' => false,
393 'accesskey' => $accesskey_options_accessibility,
394 );
395
396 /* Build a section for plugins wanting to register an optionpage. */
397 do_hook('optpage_register_block', $null);
398
399 /*****************************************************/
400 /* Let's sort Javascript Option Pages to the bottom. */
401 /*****************************************************/
402 $js_optpage_blocks = array();
403 $reg_optpage_blocks = array();
404 foreach ($optpage_blocks as $cur_optpage) {
405 if (!isset($cur_optpage['accesskey'])) {
406 $cur_optpage['accesskey'] = 'NONE';
407 }
408 if (!isset($cur_optpage['js']) || !$cur_optpage['js']) {
409 $reg_optpage_blocks[] = $cur_optpage;
410 } else if (checkForJavascript()) {
411 $js_optpage_blocks[] = $cur_optpage;
412 }
413 }
414 $optpage_blocks = array_merge($reg_optpage_blocks, $js_optpage_blocks);
415
416 /********************************************/
417 /* Now, print out each option page section. */
418 /********************************************/
419 $oTemplate->assign('page_title', $optpage_title);
420 $oTemplate->assign('options', $optpage_blocks);
421
422 $oTemplate->display('option_groups.tpl');
423
424 do_hook('options_link_and_description', $null);
425
426
427 /*************************************************************************/
428 /* If we are not looking at the main option page, display the page here. */
429 /*************************************************************************/
430 } else {
431 /* Set the bottom_hook_name and submit_name. */
432 switch ($optpage) {
433 case SMOPT_PAGE_PERSONAL:
434 $bottom_hook_name = 'options_personal_bottom';
435 $submit_name = 'submit_personal';
436 break;
437 case SMOPT_PAGE_DISPLAY:
438 $bottom_hook_name = 'options_display_bottom';
439 $submit_name = 'submit_display';
440 break;
441 case SMOPT_PAGE_COMPOSE:
442 $bottom_hook_name = 'options_compose_bottom';
443 $submit_name = 'submit_compose';
444 break;
445 case SMOPT_PAGE_ACCESSIBILITY:
446 $bottom_hook_name = 'options_accessibility_bottom';
447 $submit_name = 'submit_accessibility';
448 break;
449 case SMOPT_PAGE_HIGHLIGHT:
450 $bottom_hook_name = 'options_highlight_bottom';
451 $submit_name = 'submit_highlight';
452 break;
453 case SMOPT_PAGE_FOLDER:
454 $bottom_hook_name = 'options_folder_bottom';
455 $submit_name = 'submit_folder';
456 break;
457 case SMOPT_PAGE_ORDER:
458 $bottom_hook_name = 'options_order_bottom';
459 $submit_name = 'submit_order';
460 break;
461 default:
462 $bottom_hook_name = '';
463 $submit_name = 'submit';
464 }
465
466 // Begin output form
467 echo addForm('options.php', 'post', 'option_form')
468 . create_optpage_element($optpage)
469 . create_optmode_element(SMOPT_MODE_SUBMIT);
470
471 // This is the only variable that is needed by *just* the template.
472 $oTemplate->assign('option_groups', $optpage_data['options']);
473
474 global $ask_user_info, $org_name;
475 if ( $optpage == SMOPT_PAGE_PERSONAL && $ask_user_info
476 && getPref($data_dir, $username,'email_address') == "" ) {
477 $oTemplate->assign('topmessage',
478 sprintf(_("Welcome to %s. Please supply your full name and email address."), $org_name) );
479 }
480
481 // These variables are not specifically needed by the template,
482 // but they are relevant to the page being built, so we'll add
483 // them in case some plugin is modifying the page, etc....
484 //
485 $oTemplate->assign('max_refresh', isset($max_refresh) ? $max_refresh : NULL);
486 $oTemplate->assign('page_title', $optpage_title);
487 $oTemplate->assign('optpage', $optpage);
488 $oTemplate->assign('optpage_name', $optpage_name);
489 $oTemplate->assign('optmode', $optmode);
490 $oTemplate->assign('optpage_data', $optpage_data);
491
492 $oTemplate->assign('submit_name', $submit_name);
493 $oTemplate->display('options.tpl');
494
495 $oTemplate->display('form_close.tpl');
496
497 /* If it is not empty, trigger the bottom hook. */
498 if ($bottom_hook_name != '') {
499 do_hook($bottom_hook_name, $null);
500 }
501
502 }
503
504 $oTemplate->display('footer.tpl');