011bb17af654683234b2b7a10057e427c8345a1c
[squirrelmail.git] / src / options.php
1 <?php
2
3 /**
4 * options.php
5 *
6 * Copyright (c) 1999-2003 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 */
14
15 /* Path for SquirrelMail required files. */
16 define('SM_PATH','../');
17
18 /* SquirrelMail required files. */
19 require_once(SM_PATH . 'include/validate.php');
20 require_once(SM_PATH . 'functions/global.php');
21 require_once(SM_PATH . 'functions/display_messages.php');
22 require_once(SM_PATH . 'functions/imap.php');
23 require_once(SM_PATH . 'functions/options.php');
24 require_once(SM_PATH . 'functions/strings.php');
25 require_once(SM_PATH . 'functions/html.php');
26
27 /*********************************/
28 /*** Build the resultant page. ***/
29 /*********************************/
30
31 displayPageHeader($color, 'None');
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 /*** MOVE THIS DISPLAY CODE DOWN EVENTUALLY!!! ***/
221
222 $optpage_title = _("Options");
223 if (isset($optpage_name) && ($optpage_name != '')) {
224 $optpage_title .= " - $optpage_name";
225 }
226
227 echo html_tag( 'table', '', 'center', $color[0], 'width="95%" cellpadding="1" cellspacing="0" border="0"' ) . "\n" .
228 html_tag( 'tr' ) . "\n" .
229 html_tag( 'td', '', 'center' ) .
230 "<b>$optpage_title</b><br>\n".
231 html_tag( 'table', '', '', '', 'width="100%" cellpadding="5" cellspacing="0" border="0"' ) . "\n" .
232 html_tag( 'tr' ) . "\n" .
233 html_tag( 'td', '', 'center', $color[4] ) . "\n";
234
235 /*******************************************************************/
236 /* DO OLD SAVING OF SUBMITTED OPTIONS. THIS WILL BE REMOVED LATER. */
237 /*******************************************************************/
238
239 /* If in submit mode, select a save hook name and run it. */
240 if ($optmode == SMOPT_MODE_SUBMIT) {
241 /* Select a save hook name. */
242 switch ($optpage) {
243 case SMOPT_PAGE_PERSONAL:
244 $save_hook_name = 'options_personal_save';
245 break;
246 case SMOPT_PAGE_DISPLAY:
247 $save_hook_name = 'options_display_save';
248 break;
249 case SMOPT_PAGE_FOLDER:
250 $save_hook_name = 'options_folder_save';
251 break;
252 default:
253 $save_hook_name = 'options_save';
254 break;
255 }
256
257 /* Run the options save hook. */
258 do_hook($save_hook_name);
259 }
260
261 /***************************************************************/
262 /* Apply logic to decide what optpage we want to display next. */
263 /***************************************************************/
264
265 /* If this is the result of an option page being submitted, then */
266 /* show the main page. Otherwise, show whatever page was called. */
267
268 if ($optmode == SMOPT_MODE_SUBMIT) {
269 $optpage = SMOPT_PAGE_MAIN;
270 }
271
272 /***************************************************************/
273 /* Finally, display whatever page we are supposed to show now. */
274 /***************************************************************/
275
276 /*
277 * The main option page has a different layout then the rest of the option
278 * pages. Therefore, we create it here first, then the others below.
279 */
280 if ($optpage == SMOPT_PAGE_MAIN) {
281 /**********************************************************/
282 /* First, display the results of a submission, if needed. */
283 /**********************************************************/
284 if ($optmode == SMOPT_MODE_SUBMIT) {
285 if (!isset($frame_top)) {
286 $frame_top = '_top';
287 }
288 /* Display a message indicating a successful save. */
289 echo '<b>' . _("Successfully Saved Options") . ": $optpage_name</b><br>\n";
290
291 /* If $max_refresh != SMOPT_REFRESH_NONE, provide a refresh link. */
292 if ( !isset( $max_refresh ) ) {
293 } else if ($max_refresh == SMOPT_REFRESH_FOLDERLIST) {
294 echo '<a href="../src/left_main.php" target="left">' . _("Refresh Folder List") . '</a><br>';
295 } else if ($max_refresh) {
296 echo '<a href="../src/webmail.php?right_frame=options.php" target="' . $frame_top . '">' . _("Refresh Page") . '</a><br>';
297 }
298 }
299 /******************************************/
300 /* Build our array of Option Page Blocks. */
301 /******************************************/
302 $optpage_blocks = array();
303
304 /* Build a section for Personal Options. */
305 $optpage_blocks[] = array(
306 'name' => _("Personal Information"),
307 'url' => 'options.php?optpage=' . SMOPT_PAGE_PERSONAL,
308 'desc' => _("This contains personal information about yourself such as your name, your email address, etc."),
309 'js' => false
310 );
311
312 /* Build a section for Display Options. */
313 $optpage_blocks[] = array(
314 'name' => _("Display Preferences"),
315 'url' => 'options.php?optpage=' . SMOPT_PAGE_DISPLAY,
316 'desc' => _("You can change the way that SquirrelMail looks and displays information to you, such as the colors, the language, and other settings."),
317 'js' => false
318 );
319
320 /* Build a section for Message Highlighting Options. */
321 $optpage_blocks[] = array(
322 'name' =>_("Message Highlighting"),
323 'url' => 'options_highlight.php',
324 '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."),
325 'js' => false
326 );
327
328 /* Build a section for Folder Options. */
329 $optpage_blocks[] = array(
330 'name' => _("Folder Preferences"),
331 'url' => 'options.php?optpage=' . SMOPT_PAGE_FOLDER,
332 'desc' => _("These settings change the way your folders are displayed and manipulated."),
333 'js' => false
334 );
335
336 /* Build a section for Index Order Options. */
337 $optpage_blocks[] = array(
338 'name' => _("Index Order"),
339 'url' => 'options_order.php',
340 'desc' => _("The order of the message index can be rearranged and changed to contain the headers in any order you want."),
341 'js' => false
342 );
343
344 /* Build a section for plugins wanting to register an optionpage. */
345 do_hook('optpage_register_block');
346
347 /*****************************************************/
348 /* Let's sort Javascript Option Pages to the bottom. */
349 /*****************************************************/
350 $js_optpage_blocks = array();
351 $reg_optpage_blocks = array();
352 foreach ($optpage_blocks as $cur_optpage) {
353 if (!$cur_optpage['js']) {
354 $reg_optpage_blocks[] = $cur_optpage;
355 } else if ($javascript_on == SMPREF_JS_ON) {
356 $js_optpage_blocks[] = $cur_optpage;
357 }
358 }
359 $optpage_blocks = array_merge($reg_optpage_blocks, $js_optpage_blocks);
360
361 /********************************************/
362 /* Now, print out each option page section. */
363 /********************************************/
364 $first_optpage = false;
365 echo html_tag( 'table', '', '', $color[4], 'width="100%" cellpadding="0" cellspacing="5" border="0"' ) . "\n" .
366 html_tag( 'tr' ) . "\n" .
367 html_tag( 'td', '', 'left', '', 'valign="top"' ) .
368 html_tag( 'table', '', '', $color[4], 'width="100%" cellpadding="3" cellspacing="0" border="0"' ) . "\n" .
369 html_tag( 'tr' ) . "\n" .
370 html_tag( 'td', '', 'left' );
371 foreach ($optpage_blocks as $next_optpage) {
372 if ($first_optpage == false) {
373 $first_optpage = $next_optpage;
374 } else {
375 print_optionpages_row($first_optpage, $next_optpage);
376 $first_optpage = false;
377 }
378 }
379
380 if ($first_optpage != false) {
381 print_optionpages_row($first_optpage);
382 }
383
384 echo "</td></tr></table></td></tr></table>\n";
385
386 do_hook('options_link_and_description');
387
388
389 /*************************************************************************/
390 /* If we are not looking at the main option page, display the page here. */
391 /*************************************************************************/
392 } else {
393 echo '<form name="f" action="options.php" method="post"><br>' . "\n"
394 . create_optpage_element($optpage)
395 . create_optmode_element(SMOPT_MODE_SUBMIT)
396 . html_tag( 'table', '', '', '', 'width="100%" cellpadding="2" cellspacing="0" border="0"' ) . "\n"
397 . html_tag( 'tr' ) . "\n"
398 . html_tag( 'td', '', 'left' ) . "\n";
399
400 /* Output the option groups for this page. */
401 print_option_groups($optpage_data['options']);
402
403 /* Set the inside_hook_name and submit_name. */
404 switch ($optpage) {
405 case SMOPT_PAGE_PERSONAL:
406 $inside_hook_name = 'options_personal_inside';
407 $bottom_hook_name = 'options_personal_bottom';
408 $submit_name = 'submit_personal';
409 break;
410 case SMOPT_PAGE_DISPLAY:
411 $inside_hook_name = 'options_display_inside';
412 $bottom_hook_name = 'options_display_bottom';
413 $submit_name = 'submit_display';
414 break;
415 case SMOPT_PAGE_HIGHLIGHT:
416 $inside_hook_name = 'options_highlight_inside';
417 $bottom_hook_name = 'options_highlight_bottom';
418 $submit_name = 'submit_highlight';
419 break;
420 case SMOPT_PAGE_FOLDER:
421 $inside_hook_name = 'options_folder_inside';
422 $bottom_hook_name = 'options_folder_bottom';
423 $submit_name = 'submit_folder';
424 break;
425 case SMOPT_PAGE_ORDER:
426 $inside_hook_name = 'options_order_inside';
427 $bottom_hook_name = 'options_order_bottom';
428 $submit_name = 'submit_order';
429 break;
430 default:
431 $inside_hook_name = '';
432 $bottom_hook_name = '';
433 $submit_name = 'submit';
434 }
435
436 /* If it is not empty, trigger the inside hook. */
437 if ($inside_hook_name != '') {
438 do_hook($inside_hook_name);
439 }
440
441 /* Spit out a submit button. */
442 OptionSubmit($submit_name);
443 echo '</td></tr></table></form>';
444
445 /* If it is not empty, trigger the bottom hook. */
446 if ($bottom_hook_name != '') {
447 do_hook($bottom_hook_name);
448 }
449 }
450
451 echo '</td></tr>' .
452 '</table>'.
453 '</td></tr>'.
454 '</table>' .
455 '</body></html>';
456
457 ?>