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