7dd666ff2dcd77a3da2649a5ec110909b74bafb9
[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-2007 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 /**
17 * Include the SquirrelMail initialization file.
18 */
19 require('../include/init.php');
20
21 /* SquirrelMail required files. */
22
23 //include(SM_PATH . 'functions/imap_general.php');
24 require_once(SM_PATH . 'functions/options.php');
25 require_once(SM_PATH . 'functions/forms.php');
26
27 /*********************************/
28 /*** Build the resultant page. ***/
29 /*********************************/
30
31 define('SMOPT_MODE_DISPLAY', 'display');
32 define('SMOPT_MODE_SUBMIT', 'submit');
33 define('SMOPT_MODE_LINK', 'link');
34
35 define('SMOPT_PAGE_MAIN', 'main');
36 define('SMOPT_PAGE_PERSONAL', 'personal');
37 define('SMOPT_PAGE_DISPLAY', 'display');
38 define('SMOPT_PAGE_COMPOSE', 'compose');
39 define('SMOPT_PAGE_HIGHLIGHT', 'highlight');
40 define('SMOPT_PAGE_FOLDER', 'folder');
41 define('SMOPT_PAGE_ORDER', 'order');
42
43 function 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) {
50 /* Remove Debug Mode Until Needed
51 echo "name = '$option->name', "
52 . "value = '$option->value', "
53 . "new_value = '$option->new_value'\n";
54 echo "<br />";
55 */
56 if ($option->changed()) {
57 $option->save();
58 $max_refresh = max($max_refresh, $option->refresh_level);
59 }
60 }
61 }
62
63 /* Return the max refresh level. */
64 return ($max_refresh);
65 }
66
67 function process_optionmode_link($optpage) {
68 /* There will be something here, later. */
69 }
70
71
72
73 /* ---------------------------- main ---------------------------- */
74
75 /* get the globals that we may need */
76 sqgetGlobalVar('optpage', $optpage);
77 sqgetGlobalVar('optmode', $optmode, SQ_FORM);
78 sqgetGlobalVar('optpage_data',$optpage_data, SQ_POST);
79 /* end of getting globals */
80
81 /* Make sure we have an Option Page set. Default to main. */
82 if ( !isset($optpage) || $optpage == '' ) {
83 $optpage = SMOPT_PAGE_MAIN;
84 } else {
85 $optpage = strip_tags( $optpage );
86 }
87
88 /* Make sure we have an Option Mode set. Default to display. */
89 if (!isset($optmode)) {
90 $optmode = SMOPT_MODE_DISPLAY;
91 }
92
93 /*
94 * First, set the load information for each option page.
95 */
96
97 /* Initialize load information variables. */
98 $optpage_name = '';
99 $optpage_file = '';
100 $optpage_loader = '';
101
102 /* Set the load information for each page. */
103 switch ($optpage) {
104 case SMOPT_PAGE_MAIN:
105 break;
106 case SMOPT_PAGE_PERSONAL:
107 $optpage_name = _("Personal Information");
108 $optpage_file = SM_PATH . 'include/options/personal.php';
109 $optpage_loader = 'load_optpage_data_personal';
110 $optpage_loadhook = 'optpage_loadhook_personal';
111 break;
112 case SMOPT_PAGE_DISPLAY:
113 $optpage_name = _("Display Preferences");
114 $optpage_file = SM_PATH . 'include/options/display.php';
115 $optpage_loader = 'load_optpage_data_display';
116 $optpage_loadhook = 'optpage_loadhook_display';
117 break;
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;
124 case SMOPT_PAGE_HIGHLIGHT:
125 $optpage_name = _("Message Highlighting");
126 $optpage_file = SM_PATH . 'include/options/highlight.php';
127 $optpage_loader = 'load_optpage_data_highlight';
128 $optpage_loadhook = 'optpage_loadhook_highlight';
129 break;
130 case SMOPT_PAGE_FOLDER:
131 $optpage_name = _("Folder Preferences");
132 $optpage_file = SM_PATH . 'include/options/folder.php';
133 $optpage_loader = 'load_optpage_data_folder';
134 $optpage_loadhook = 'optpage_loadhook_folder';
135 break;
136 case SMOPT_PAGE_ORDER:
137 $optpage_name = _("Index Order");
138 $optpage_file = SM_PATH . 'include/options/order.php';
139 $optpage_loader = 'load_optpage_data_order';
140 $optpage_loadhook = 'optpage_loadhook_order';
141 break;
142 default: do_hook('optpage_set_loadinfo', $null);
143 }
144
145 /**********************************************************/
146 /*** Second, load the option information for this page. ***/
147 /**********************************************************/
148
149 if ( !@is_file( $optpage_file ) ) {
150 $optpage = SMOPT_PAGE_MAIN;
151 } elseif ($optpage != SMOPT_PAGE_MAIN ) {
152 /* Include the file for this optionpage. */
153
154 require_once($optpage_file);
155
156 /* Assemble the data for this option page. */
157 $optpage_data = array();
158 $optpage_data = $optpage_loader();
159 do_hook($optpage_loadhook, $null);
160 $optpage_data['options'] = create_option_groups($optpage_data['grps'], $optpage_data['vals']);
161 }
162
163 /***********************************************************/
164 /*** Next, process anything that needs to be processed. ***/
165 /***********************************************************/
166
167 $optpage_save_error=array();
168
169 if ( 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 }
178 }
179
180 $optpage_title = _("Options");
181 if (isset($optpage_name) && ($optpage_name != '')) {
182 $optpage_title .= " - $optpage_name";
183 }
184
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. */
190 if ($optmode == SMOPT_MODE_SUBMIT) {
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;
199 case SMOPT_PAGE_COMPOSE:
200 $save_hook_name = 'options_compose_save';
201 break;
202 case SMOPT_PAGE_FOLDER:
203 $save_hook_name = 'options_folder_save';
204 break;
205 default:
206 $save_hook_name = 'options_save';
207 break;
208 }
209
210 /* Run the options save hook. */
211 do_hook($save_hook_name, $null);
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
221 if ($optmode == SMOPT_MODE_SUBMIT) {
222 $optpage = SMOPT_PAGE_MAIN;
223 }
224
225 /***************************************************************/
226 /* Finally, display whatever page we are supposed to show now. */
227 /***************************************************************/
228
229 displayPageHeader($color, 'None', (isset($optpage_data['xtra']) ? $optpage_data['xtra'] : ''));
230
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 */
235 if ($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()) {
246 //FIXME: REMOVE HTML FROM CORE
247 $notice = _("Error(s) occurred while saving your options") . "<br />\n<ul>\n";
248 foreach ($optpage_save_error as $error_message) {
249 $notice.= '<li><small>' . $error_message . "</small></li>\n";
250 }
251 $notice.= "</ul>\n" . _("Some of your preference changes were not applied.") . "\n";
252 } else {
253 /* Display a message indicating a successful save. */
254 $notice = _("Successfully Saved Options") . ": $optpage_name</b><br />\n";
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) {
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 }
266 } else if ($max_refresh) {
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 }
273 }
274 }
275
276 if (!empty($notice)) {
277 $oTemplate->assign('note', $notice);
278 $oTemplate->display('note.tpl');
279 }
280
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. */
335 do_hook('optpage_register_block', $null);
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;
345 } else if (checkForJavascript()) {
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 /********************************************/
354 $oTemplate->assign('page_title', $optpage_title);
355 $oTemplate->assign('options', $optpage_blocks);
356
357 $oTemplate->display('option_groups.tpl');
358
359 do_hook('options_link_and_description', $null);
360
361
362 /*************************************************************************/
363 /* If we are not looking at the main option page, display the page here. */
364 /*************************************************************************/
365 } else {
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
404 // Begin output form
405 echo addForm('options.php', 'post', 'f')
406 . create_optpage_element($optpage)
407 . create_optmode_element(SMOPT_MODE_SUBMIT);
408
409 //FIXME: NO HTML IN THE CORE!!
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
421 * variables can be passed to the template. Commenting out for now.
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
435 $oTemplate->assign('submit_name', $submit_name);
436 $oTemplate->display('options.tpl');
437
438 //FIXME: need to remove HTML from here!
439 echo " </td>\n" .
440 " </tr>\n";
441
442 /* If it is not empty, trigger the inside hook. */
443 if ($inside_hook_name != '') {
444 do_hook($inside_hook_name, $null);
445 }
446
447 //FIXME: need to remove HTML from here!
448 echo "</table>\n" .
449 "</form>\n";
450
451 /* If it is not empty, trigger the bottom hook. */
452 if ($bottom_hook_name != '') {
453 do_hook($bottom_hook_name, $null);
454 }
455
456 }
457
458 $oTemplate->display('footer.tpl');
459 ?>