| 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 | * Functions needed to display the options pages. |
| 10 | * |
| 11 | * $Id$ |
| 12 | */ |
| 13 | |
| 14 | /**********************************************/ |
| 15 | /* Define constants used in the options code. */ |
| 16 | /**********************************************/ |
| 17 | |
| 18 | /* Define constants for the various option types. */ |
| 19 | define('SMOPT_TYPE_STRING', 0); |
| 20 | define('SMOPT_TYPE_STRLIST', 1); |
| 21 | define('SMOPT_TYPE_TEXTAREA', 2); |
| 22 | define('SMOPT_TYPE_INTEGER', 3); |
| 23 | define('SMOPT_TYPE_FLOAT', 4); |
| 24 | define('SMOPT_TYPE_BOOLEAN', 5); |
| 25 | define('SMOPT_TYPE_HIDDEN', 6); |
| 26 | define('SMOPT_TYPE_COMMENT', 7); |
| 27 | define('SMOPT_TYPE_FLDRLIST', 8); |
| 28 | |
| 29 | /* Define constants for the options refresh levels. */ |
| 30 | define('SMOPT_REFRESH_NONE', 0); |
| 31 | define('SMOPT_REFRESH_FOLDERLIST', 1); |
| 32 | define('SMOPT_REFRESH_ALL', 2); |
| 33 | |
| 34 | /* Define constants for the options size. */ |
| 35 | define('SMOPT_SIZE_TINY', 0); |
| 36 | define('SMOPT_SIZE_SMALL', 1); |
| 37 | define('SMOPT_SIZE_MEDIUM', 2); |
| 38 | define('SMOPT_SIZE_LARGE', 3); |
| 39 | define('SMOPT_SIZE_HUGE', 4); |
| 40 | define('SMOPT_SIZE_NORMAL', 5); |
| 41 | |
| 42 | define('SMOPT_SAVE_DEFAULT', 'save_option'); |
| 43 | define('SMOPT_SAVE_NOOP', 'save_option_noop'); |
| 44 | |
| 45 | /** |
| 46 | * SquirrelOption: An option for Squirrelmail. |
| 47 | * |
| 48 | * This class is a work in progress. When complete, it will handle |
| 49 | * presentation and saving of Squirrelmail user options in a simple, |
| 50 | * streamline manner. Stay tuned for more stuff. |
| 51 | * |
| 52 | * Also, I'd like to ask that people leave this alone (mostly :) until |
| 53 | * I get it a little further along. That should only be a day or two or |
| 54 | * three. I will remove this message when it is ready for primetime usage. |
| 55 | */ |
| 56 | class SquirrelOption { |
| 57 | /* The basic stuff. */ |
| 58 | var $name; |
| 59 | var $caption; |
| 60 | var $type; |
| 61 | var $refresh_level; |
| 62 | var $size; |
| 63 | var $comment; |
| 64 | var $script; |
| 65 | |
| 66 | /* The name of the Save Function for this option. */ |
| 67 | var $save_function; |
| 68 | |
| 69 | /* The various 'values' for this options. */ |
| 70 | var $value; |
| 71 | var $new_value; |
| 72 | var $possible_values; |
| 73 | |
| 74 | function SquirrelOption |
| 75 | ($name, $caption, $type, $refresh_level, $possible_values = '') { |
| 76 | /* Set the basic stuff. */ |
| 77 | $this->name = $name; |
| 78 | $this->caption = $caption; |
| 79 | $this->type = $type; |
| 80 | $this->refresh_level = $refresh_level; |
| 81 | $this->possible_values = $possible_values; |
| 82 | $this->size = SMOPT_SIZE_MEDIUM; |
| 83 | $this->comment = ''; |
| 84 | $this->script = ''; |
| 85 | |
| 86 | /* Check for a current value. */ |
| 87 | if (isset($GLOBALS[$name])) { |
| 88 | $this->value = $GLOBALS[$name]; |
| 89 | } else { |
| 90 | $this->value = ''; |
| 91 | } |
| 92 | |
| 93 | /* Check for a new value. */ |
| 94 | if ( !sqgetGlobalVar("new_$name", $this->new_value, SQ_POST ) ) { |
| 95 | $this->new_value = ''; |
| 96 | } |
| 97 | |
| 98 | /* Set the default save function. */ |
| 99 | if (($type != SMOPT_TYPE_HIDDEN) && ($type != SMOPT_TYPE_COMMENT)) { |
| 100 | $this->save_function = SMOPT_SAVE_DEFAULT; |
| 101 | } else { |
| 102 | $this->save_function = SMOPT_SAVE_NOOP; |
| 103 | } |
| 104 | } |
| 105 | |
| 106 | /* Set the value for this option. */ |
| 107 | function setValue($value) { |
| 108 | $this->value = $value; |
| 109 | } |
| 110 | |
| 111 | /* Set the new value for this option. */ |
| 112 | function setNewValue($new_value) { |
| 113 | $this->new_value = $new_value; |
| 114 | } |
| 115 | |
| 116 | /* Set the size for this option. */ |
| 117 | function setSize($size) { |
| 118 | $this->size = $size; |
| 119 | } |
| 120 | |
| 121 | /* Set the comment for this option. */ |
| 122 | function setComment($comment) { |
| 123 | $this->comment = $comment; |
| 124 | } |
| 125 | |
| 126 | /* Set the script for this option. */ |
| 127 | function setScript($script) { |
| 128 | $this->script = $script; |
| 129 | } |
| 130 | |
| 131 | /* Set the save function for this option. */ |
| 132 | function setSaveFunction($save_function) { |
| 133 | $this->save_function = $save_function; |
| 134 | } |
| 135 | |
| 136 | function createHTMLWidget() { |
| 137 | global $javascript_on; |
| 138 | |
| 139 | /* Get the widget for this option type. */ |
| 140 | switch ($this->type) { |
| 141 | case SMOPT_TYPE_STRING: |
| 142 | $result = $this->createWidget_String(); |
| 143 | break; |
| 144 | case SMOPT_TYPE_STRLIST: |
| 145 | $result = $this->createWidget_StrList(); |
| 146 | break; |
| 147 | case SMOPT_TYPE_TEXTAREA: |
| 148 | $result = $this->createWidget_TextArea(); |
| 149 | break; |
| 150 | case SMOPT_TYPE_INTEGER: |
| 151 | $result = $this->createWidget_Integer(); |
| 152 | break; |
| 153 | case SMOPT_TYPE_FLOAT: |
| 154 | $result = $this->createWidget_Float(); |
| 155 | break; |
| 156 | case SMOPT_TYPE_BOOLEAN: |
| 157 | $result = $this->createWidget_Boolean(); |
| 158 | break; |
| 159 | case SMOPT_TYPE_HIDDEN: |
| 160 | $result = $this->createWidget_Hidden(); |
| 161 | break; |
| 162 | case SMOPT_TYPE_COMMENT: |
| 163 | $result = $this->createWidget_Comment(); |
| 164 | break; |
| 165 | case SMOPT_TYPE_FLDRLIST: |
| 166 | $result = $this->createWidget_FolderList(); |
| 167 | break; |
| 168 | default: |
| 169 | $result = '<font color="' . $color[2] . '">' |
| 170 | . sprintf(_("Option Type '%s' Not Found"), $this->type) |
| 171 | . '</font>'; |
| 172 | } |
| 173 | |
| 174 | /* Add the script for this option. */ |
| 175 | $result .= $this->script; |
| 176 | |
| 177 | /* Now, return the created widget. */ |
| 178 | return ($result); |
| 179 | } |
| 180 | |
| 181 | function createWidget_String() { |
| 182 | switch ($this->size) { |
| 183 | case SMOPT_SIZE_TINY: |
| 184 | $width = 5; |
| 185 | break; |
| 186 | case SMOPT_SIZE_SMALL: |
| 187 | $width = 12; |
| 188 | break; |
| 189 | case SMOPT_SIZE_LARGE: |
| 190 | $width = 38; |
| 191 | break; |
| 192 | case SMOPT_SIZE_HUGE: |
| 193 | $width = 50; |
| 194 | break; |
| 195 | case SMOPT_SIZE_NORMAL: |
| 196 | default: |
| 197 | $width = 25; |
| 198 | } |
| 199 | |
| 200 | $result = "<input name=\"new_$this->name\" value=\"$this->value\" size=\"$width\">"; |
| 201 | return ($result); |
| 202 | } |
| 203 | |
| 204 | function createWidget_StrList() { |
| 205 | /* Begin the select tag. */ |
| 206 | $result = "<select name=\"new_$this->name\">"; |
| 207 | |
| 208 | /* Add each possible value to the select list. */ |
| 209 | foreach ($this->possible_values as $real_value => $disp_value) { |
| 210 | /* Start the next new option string. */ |
| 211 | $new_option = "<option value=\"$real_value\""; |
| 212 | |
| 213 | /* If this value is the current value, select it. */ |
| 214 | if ($real_value == $this->value) { |
| 215 | $new_option .= ' selected'; |
| 216 | } |
| 217 | |
| 218 | /* Add the display value to our option string. */ |
| 219 | $new_option .= ">$disp_value</option>"; |
| 220 | |
| 221 | /* And add the new option string to our select tag. */ |
| 222 | $result .= $new_option; |
| 223 | } |
| 224 | |
| 225 | /* Close the select tag and return our happy result. */ |
| 226 | $result .= '</select>'; |
| 227 | return ($result); |
| 228 | } |
| 229 | |
| 230 | function createWidget_FolderList() { |
| 231 | $selected = array(strtolower($this->value)); |
| 232 | |
| 233 | /* Begin the select tag. */ |
| 234 | $result = "<select name=\"new_$this->name\">"; |
| 235 | |
| 236 | /* Add each possible value to the select list. */ |
| 237 | foreach ($this->possible_values as $real_value => $disp_value) { |
| 238 | if ( is_array($disp_value) ) { |
| 239 | /* For folder list, we passed in the array of boxes.. */ |
| 240 | $new_option = sqimap_mailbox_option_list(0, $selected, 0, $disp_value); |
| 241 | } else { |
| 242 | /* Start the next new option string. */ |
| 243 | $new_option = "<option value=\"$real_value\""; |
| 244 | |
| 245 | /* If this value is the current value, select it. */ |
| 246 | if ($real_value == $this->value) { |
| 247 | $new_option .= ' selected'; |
| 248 | } |
| 249 | |
| 250 | /* Add the display value to our option string. */ |
| 251 | $new_option .= ">$disp_value</option>"; |
| 252 | } |
| 253 | /* And add the new option string to our select tag. */ |
| 254 | $result .= $new_option; |
| 255 | } |
| 256 | /* Close the select tag and return our happy result. */ |
| 257 | $result .= '</select>'; |
| 258 | return ($result); |
| 259 | } |
| 260 | |
| 261 | |
| 262 | function createWidget_TextArea() { |
| 263 | switch ($this->size) { |
| 264 | case SMOPT_SIZE_TINY: $rows = 3; $cols = 10; break; |
| 265 | case SMOPT_SIZE_SMALL: $rows = 4; $cols = 30; break; |
| 266 | case SMOPT_SIZE_LARGE: $rows = 10; $cols = 60; break; |
| 267 | case SMOPT_SIZE_HUGE: $rows = 20; $cols = 80; break; |
| 268 | case SMOPT_SIZE_NORMAL: |
| 269 | default: $rows = 5; $cols = 50; |
| 270 | } |
| 271 | $result = "<textarea name=\"new_$this->name\" rows=\"$rows\" " |
| 272 | . "cols=\"$cols\">$this->value</textarea>"; |
| 273 | return ($result); |
| 274 | } |
| 275 | |
| 276 | function createWidget_Integer() { |
| 277 | |
| 278 | return $this->createWidget_String(); |
| 279 | |
| 280 | } |
| 281 | |
| 282 | function createWidget_Float() { |
| 283 | |
| 284 | return $this->createWidget_String(); |
| 285 | |
| 286 | } |
| 287 | |
| 288 | function createWidget_Boolean() { |
| 289 | /* Do the whole current value thing. */ |
| 290 | if ($this->value != SMPREF_NO) { |
| 291 | $yes_chk = ' checked'; |
| 292 | $no_chk = ''; |
| 293 | } else { |
| 294 | $yes_chk = ''; |
| 295 | $no_chk = ' checked'; |
| 296 | } |
| 297 | |
| 298 | /* Build the yes choice. */ |
| 299 | $yes_option = '<input type="radio" name="new_' . $this->name |
| 300 | . '" value="' . SMPREF_YES . "\"$yes_chk> " |
| 301 | . _("Yes"); |
| 302 | |
| 303 | /* Build the no choice. */ |
| 304 | $no_option = '<input type="radio" name="new_' . $this->name |
| 305 | . '" value="' . SMPREF_NO . "\"$no_chk> " |
| 306 | . _("No"); |
| 307 | |
| 308 | /* Build and return the combined "boolean widget". */ |
| 309 | $result = "$yes_option $no_option"; |
| 310 | return ($result); |
| 311 | } |
| 312 | |
| 313 | function createWidget_Hidden() { |
| 314 | $result = '<input type="hidden" name="new_' . $this->name |
| 315 | . '" value="' . $this->value . '">'; |
| 316 | return ($result); |
| 317 | } |
| 318 | |
| 319 | function createWidget_Comment() { |
| 320 | $result = $this->comment; |
| 321 | return ($result); |
| 322 | } |
| 323 | |
| 324 | function save() { |
| 325 | $function = $this->save_function; |
| 326 | $function($this); |
| 327 | } |
| 328 | |
| 329 | function changed() { |
| 330 | return ($this->value != $this->new_value); |
| 331 | } |
| 332 | } |
| 333 | |
| 334 | function save_option($option) { |
| 335 | if ( !sqgetGlobalVar('username', $username, SQ_SESSION ) ) { |
| 336 | /* Can't save the pref if we don't have the username */ |
| 337 | return; |
| 338 | } |
| 339 | global $data_dir; |
| 340 | setPref($data_dir, $username, $option->name, $option->new_value); |
| 341 | } |
| 342 | |
| 343 | function save_option_noop($option) { |
| 344 | /* Do nothing here... */ |
| 345 | } |
| 346 | |
| 347 | function create_optpage_element($optpage) { |
| 348 | return create_hidden_element('optpage', $optpage); |
| 349 | } |
| 350 | |
| 351 | function create_optmode_element($optmode) { |
| 352 | return create_hidden_element('optmode', $optmode); |
| 353 | } |
| 354 | |
| 355 | function create_hidden_element($name, $value) { |
| 356 | $result = '<input type="hidden" ' |
| 357 | . 'name="' . $name . '" ' |
| 358 | . 'value="' . $value . '">'; |
| 359 | return ($result); |
| 360 | } |
| 361 | |
| 362 | function create_option_groups($optgrps, $optvals) { |
| 363 | /* Build a simple array with which to start. */ |
| 364 | $result = array(); |
| 365 | |
| 366 | /* Create option group for each option group name. */ |
| 367 | foreach ($optgrps as $grpkey => $grpname) { |
| 368 | $result[$grpkey] = array(); |
| 369 | $result[$grpkey]['name'] = $grpname; |
| 370 | $result[$grpkey]['options'] = array(); |
| 371 | } |
| 372 | |
| 373 | /* Create a new SquirrelOption for each set of option values. */ |
| 374 | foreach ($optvals as $grpkey => $grpopts) { |
| 375 | foreach ($grpopts as $optset) { |
| 376 | if (isset($optset['posvals'])) { |
| 377 | /* Create a new option with all values given. */ |
| 378 | $next_option = new SquirrelOption( |
| 379 | $optset['name'], |
| 380 | $optset['caption'], |
| 381 | $optset['type'], |
| 382 | $optset['refresh'], |
| 383 | $optset['posvals'] |
| 384 | ); |
| 385 | } else { |
| 386 | /* Create a new option with all but possible values given. */ |
| 387 | $next_option = new SquirrelOption( |
| 388 | $optset['name'], |
| 389 | $optset['caption'], |
| 390 | $optset['type'], |
| 391 | $optset['refresh'] |
| 392 | ); |
| 393 | } |
| 394 | |
| 395 | /* If provided, set the size for this option. */ |
| 396 | if (isset($optset['size'])) { |
| 397 | $next_option->setSize($optset['size']); |
| 398 | } |
| 399 | |
| 400 | /* If provided, set the comment for this option. */ |
| 401 | if (isset($optset['comment'])) { |
| 402 | $next_option->setComment($optset['comment']); |
| 403 | } |
| 404 | |
| 405 | /* If provided, set the save function for this option. */ |
| 406 | if (isset($optset['save'])) { |
| 407 | $next_option->setSaveFunction($optset['save']); |
| 408 | } |
| 409 | |
| 410 | /* If provided, set the script for this option. */ |
| 411 | if (isset($optset['script'])) { |
| 412 | $next_option->setScript($optset['script']); |
| 413 | } |
| 414 | |
| 415 | /* Add this option to the option array. */ |
| 416 | $result[$grpkey]['options'][] = $next_option; |
| 417 | } |
| 418 | } |
| 419 | |
| 420 | /* Return our resulting array. */ |
| 421 | return ($result); |
| 422 | } |
| 423 | |
| 424 | function print_option_groups($option_groups) { |
| 425 | /* Print each option group. */ |
| 426 | foreach ($option_groups as $next_optgrp) { |
| 427 | /* If it is not blank, print the name for this option group. */ |
| 428 | if ($next_optgrp['name'] != '') { |
| 429 | echo html_tag( 'tr', "\n". |
| 430 | html_tag( 'td', |
| 431 | '<b>' . $next_optgrp['name'] . '</b>' , |
| 432 | 'center' ,'', 'valign="middle" colspan="2" nowrap' ) |
| 433 | ) ."\n"; |
| 434 | } |
| 435 | |
| 436 | /* Print each option in this option group. */ |
| 437 | foreach ($next_optgrp['options'] as $option) { |
| 438 | if ($option->type != SMOPT_TYPE_HIDDEN) { |
| 439 | echo html_tag( 'tr', "\n". |
| 440 | html_tag( 'td', $option->caption . ':', 'right' ,'', 'valign="middle"' ) . |
| 441 | html_tag( 'td', $option->createHTMLWidget(), 'left' ) |
| 442 | ) ."\n"; |
| 443 | } else { |
| 444 | echo $option->createHTMLWidget(); |
| 445 | } |
| 446 | } |
| 447 | |
| 448 | /* Print an empty row after this option group. */ |
| 449 | echo html_tag( 'tr', |
| 450 | html_tag( 'td', ' ', 'left', '', 'colspan="2"' ) |
| 451 | ) . "\n"; |
| 452 | } |
| 453 | } |
| 454 | |
| 455 | function OptionSubmit( $name ) { |
| 456 | echo html_tag( 'tr', |
| 457 | html_tag( 'td', ' ', 'left', '', 'colspan="2"' ) . |
| 458 | html_tag( 'td', '<input type="submit" value="' . _("Submit") . '" name="' . $name . '">', 'left', '', 'colspan="2"' ) |
| 459 | ) . "\n"; |
| 460 | } |
| 461 | |
| 462 | ?> |