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