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