X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Foptions.php;h=424e4c870e6671f88a48cee5c825ebaa75023c42;hb=0cc820f91a30f0a7279dd961514654802725c842;hp=02e63f44c230300cfbdb9ada1f2e0a866000319f;hpb=02ddcd005d0e36bc9b13aef39b3970753c63c56d;p=squirrelmail.git diff --git a/functions/options.php b/functions/options.php index 02e63f44..424e4c87 100644 --- a/functions/options.php +++ b/functions/options.php @@ -1,97 +1,627 @@ $title: " . - "\n"; + } + /** + * Set the value for this option. + * @param mixed $value + */ + function setValue($value) { + $this->value = $value; } - function OptionRadio( $title, $name, $data, $default, $show = '', $store = '', $sep = '   ' ) { + /** + * Set the new value for this option. + * @param mixed $new_value + */ + function setNewValue($new_value) { + $this->new_value = $new_value; + } - echo "$title: "; - foreach( $data as $key => $opt ) { - if ( $store == '' ) { - $vl = $key; - } else{ - $vl = $opt[$store]; - } - if ( $show == '' ) { - $nm = $opt; - } else{ - $nm = $opt[$show]; - } - if ( $nm <> '') { - echo "$nm $sep\n"; + /** + * Set the size for this option. + * @param integer $size + */ + function setSize($size) { + $this->size = $size; + } + + /** + * Set the trailing_text for this option. + * @param string $trailing_text + */ + function setTrailingText($trailing_text) { + $this->trailing_text = $trailing_text; + } + + /** + * Set the comment for this option. + * @param string $comment + */ + function setComment($comment) { + $this->comment = $comment; + } + + /** + * Set the extra attributes for this option. + * @param array $aExtraAttribs + */ + function setExtraAttributes($aExtraAttribs) { + $this->aExtraAttribs = $aExtraAttribs; + } + + /** + * Set the "post script" for this option. + * @param string $post_script + */ + function setPostScript($post_script) { + $this->post_script = $post_script; + } + + /** + * Set the save function for this option. + * @param string $save_function + */ + function setSaveFunction($save_function) { + $this->save_function = $save_function; + } + + /** + * Set the trailing_text for this option. + * @param string $folder_filter + * @since 1.5.1 + */ + function setFolderFilter($folder_filter) { + $this->folder_filter = $folder_filter; + } + + /** + * Creates fields on option pages according to option type + * + * Function that calls other createWidget* functions. + * @return string html formated option field + */ + function createHTMLWidget() { + global $color; + + // Use new value if available + if (!empty($this->new_value)) { + $tempValue = $this->value; + $this->value = $this->new_value; + } + + /* Get the widget for this option type. */ + switch ($this->type) { + case SMOPT_TYPE_STRING: + $result = $this->createWidget_String(); + break; + case SMOPT_TYPE_STRLIST: + $result = $this->createWidget_StrList(); + break; + case SMOPT_TYPE_TEXTAREA: + $result = $this->createWidget_TextArea(); + break; + case SMOPT_TYPE_INTEGER: + $result = $this->createWidget_Integer(); + break; + case SMOPT_TYPE_FLOAT: + $result = $this->createWidget_Float(); + break; + case SMOPT_TYPE_BOOLEAN: + $result = $this->createWidget_Boolean(); + break; + case SMOPT_TYPE_HIDDEN: + $result = $this->createWidget_Hidden(); + break; + case SMOPT_TYPE_COMMENT: + $result = $this->createWidget_Comment(); + break; + case SMOPT_TYPE_FLDRLIST: + $result = $this->createWidget_FolderList(); + break; + default: + error_box ( + sprintf(_("Option Type '%s' Not Found"), $this->type) + ); + } + + /* Add the "post script" for this option. */ + $result .= $this->post_script; + + // put correct value back if need be + if (!empty($this->new_value)) { + $this->value = $tempValue; + } + + /* Now, return the created widget. */ + return ($result); + } + + /** + * Create string field + * @return string html formated option field + */ + function createWidget_String() { + switch ($this->size) { + case SMOPT_SIZE_TINY: + $width = 5; + break; + case SMOPT_SIZE_SMALL: + $width = 12; + break; + case SMOPT_SIZE_LARGE: + $width = 38; + break; + case SMOPT_SIZE_HUGE: + $width = 50; + break; + case SMOPT_SIZE_NORMAL: + default: + $width = 25; + } + + return addInput('new_' . $this->name, $this->value, $width, 0, $this->aExtraAttribs) . htmlspecialchars($this->trailing_text); + } + + /** + * Create selection box + * + * When $this->htmlencoded is TRUE, the keys and values in + * $this->possible_values are assumed to be display-safe. + * Use with care! + * + * @return string html formated selection box + */ + function createWidget_StrList() { +//FIXME: Currently, $this->htmlencoded is ignored here -- was removed when changing to template-based output; a fix is available as part of proposed centralized sanitizing patch + return addSelect('new_' . $this->name, $this->possible_values, $this->value, TRUE, $this->aExtraAttribs) . htmlspecialchars($this->trailing_text); + + } + + /** + * Create folder selection box + * @return string html formated selection box + */ + function createWidget_FolderList() { + + // possible values might include a nested array of + // possible values (list of folders) + // + $option_list = array(); + foreach ($this->possible_values as $value => $text) { + + // list of folders (boxes array) + // + if (is_array($text)) { + $option_list = array_merge($option_list, sqimap_mailbox_option_array(0, array(strtolower($this->value)), 0, $text, $this->folder_filter)); + + // just one option here + // + } else { + $option_list = array_merge($option_list, array($value => $text)); } + } - echo "\n"; + if (empty($option_list)) + $option_list = array('ignore' => _("unavailable")); + + + return addSelect('new_' . $this->name, $option_list, $this->value, TRUE, $this->aExtraAttribs) . htmlspecialchars($this->trailing_text); + + } + /** + * Creates textarea + * @return string html formated textarea field + */ + function createWidget_TextArea() { + switch ($this->size) { + case SMOPT_SIZE_TINY: $rows = 3; $cols = 10; break; + case SMOPT_SIZE_SMALL: $rows = 4; $cols = 30; break; + case SMOPT_SIZE_LARGE: $rows = 10; $cols = 60; break; + case SMOPT_SIZE_HUGE: $rows = 20; $cols = 80; break; + case SMOPT_SIZE_NORMAL: + default: $rows = 5; $cols = 50; + } + return addTextArea('new_' . $this->name, $this->value, $cols, $rows, $this->aExtraAttribs); } - function OptionText( $title, $name, $value, $size ) { + /** + * Creates field for integer + * + * Difference from createWidget_String is visible only when javascript is enabled + * @return string html formated option field + */ + function createWidget_Integer() { - echo "$title: " . - "" . - "\n"; + // add onChange javascript handler to a regular string widget + // which will strip out all non-numeric chars + if (checkForJavascript()) + $this->aExtraAttribs['onchange'] = 'origVal=this.value; newVal=\'\'; ' + . 'for (i=0;i=\'0\' ' + . '&& origVal.charAt(i)<=\'9\') newVal += origVal.charAt(i); } ' + . 'this.value=newVal;'; + return $this->createWidget_String(); } - function OptionCheck( $title, $name, $value, $comment ) { + /** + * Creates field for floating number + * Difference from createWidget_String is visible only when javascript is enabled + * @return string html formated option field + */ + function createWidget_Float() { - if ( $value ) - $chk = 'checked'; - echo "$title: " . - " $comment" . - "\n"; + // add onChange javascript handler to a regular string widget + // which will strip out all non-numeric (period also OK) chars + if (checkForJavascript()) + $this->aExtraAttribs['onchange'] = 'origVal=this.value; newVal=\'\'; ' + . 'for (i=0;i=\'0\' ' + . '&& origVal.charAt(i)<=\'9\') || origVal.charAt(i)==\'.\') ' + . 'newVal += origVal.charAt(i); } this.value=newVal;'; + return $this->createWidget_String(); } - function OptionTitle( $title ) { + /** + * Creates radio field (yes/no) + * @return string html formated radio field + */ + function createWidget_Boolean() { + + global $oTemplate; + $nbsp = $oTemplate->fetch('non_breaking_space.tpl'); + + /* Build the yes choice. */ + $yes_option = addRadioBox('new_' . $this->name, ($this->value != SMPREF_NO), SMPREF_YES, array_merge(array('id' => 'new_' . $this->name . '_yes'), $this->aExtraAttribs)) . $nbsp . create_label(_("Yes"), 'new_' . $this->name . '_yes'); + + /* Build the no choice. */ + $no_option = addRadioBox('new_' . $this->name, ($this->value == SMPREF_NO), SMPREF_NO, array_merge(array('id' => 'new_' . $this->name . '_no'), $this->aExtraAttribs)) . $nbsp . create_label(_("No"), 'new_' . $this->name . '_no'); + + /* Build and return the combined "boolean widget". */ + $result = "$yes_option$nbsp$nbsp$nbsp$nbsp$no_option"; + return ($result); + } - echo "$title\n"; + /** + * Creates hidden field + * @return string html formated hidden input field + */ + function createWidget_Hidden() { + return addHidden('new_' . $this->name, $this->value, $this->aExtraAttribs); + } + /** + * Creates comment + * @return string comment + */ + function createWidget_Comment() { + $result = $this->comment; + return ($result); } - function OptionSubmit() { + /** + * + */ + function save() { + $function = $this->save_function; + $function($this); + } - echo ' ' . - ''; + /** + * + */ + function changed() { + return ($this->value != $this->new_value); + } +} /* End of SquirrelOption class*/ +/** + * Saves option + * @param object $option object that holds option name and new_value + */ +function save_option($option) { + if ( !sqgetGlobalVar('username', $username, SQ_SESSION ) ) { + /* Can't save the pref if we don't have the username */ + return; } + global $data_dir; + setPref($data_dir, $username, $option->name, $option->new_value); +} + +/** + * save function that does not save + * @param object $option + */ +function save_option_noop($option) { + /* Do nothing here... */ +} + +/** + * Create hidden 'optpage' input field with value set by argument + * @param string $optpage identification of option page + * @return string html formated hidden input field + */ +function create_optpage_element($optpage) { + return addHidden('optpage', $optpage); +} + +/** + * Create hidden 'optmode' input field with value set by argument + * @param string $optmode + * @return string html formated hidden input field + */ +function create_optmode_element($optmode) { + return addHidden('optmode', $optmode); +} + +/** + * @param array $optgrps + * @param array $optvals + * @return array + */ +function create_option_groups($optgrps, $optvals) { + /* Build a simple array with which to start. */ + $result = array(); + + /* Create option group for each option group name. */ + foreach ($optgrps as $grpkey => $grpname) { + $result[$grpkey] = array(); + $result[$grpkey]['name'] = $grpname; + $result[$grpkey]['options'] = array(); + } + + /* Create a new SquirrelOption for each set of option values. */ + foreach ($optvals as $grpkey => $grpopts) { + foreach ($grpopts as $optset) { + /* Create a new option with all values given. */ + $next_option = new SquirrelOption( + $optset['name'], + $optset['caption'], + $optset['type'], + (isset($optset['refresh']) ? $optset['refresh'] : SMOPT_REFRESH_NONE), + (isset($optset['initial_value']) ? $optset['initial_value'] : ''), + (isset($optset['posvals']) ? $optset['posvals'] : ''), + (isset($optset['htmlencoded']) ? $optset['htmlencoded'] : false) + ); + + /* If provided, set the size for this option. */ + if (isset($optset['size'])) { + $next_option->setSize($optset['size']); + } + + /* If provided, set the trailing_text for this option. */ + if (isset($optset['trailing_text'])) { + $next_option->setTrailingText($optset['trailing_text']); + } + + /* If provided, set the comment for this option. */ + if (isset($optset['comment'])) { + $next_option->setComment($optset['comment']); + } + + /* If provided, set the save function for this option. */ + if (isset($optset['save'])) { + $next_option->setSaveFunction($optset['save']); + } + + /* If provided, set the extra attributes for this option. */ + if (isset($optset['extra_attributes'])) { + $next_option->setExtraAttributes($optset['extra_attributes']); + } + + /* If provided, set the "post script" for this option. */ + if (isset($optset['post_script'])) { + $next_option->setPostScript($optset['post_script']); + } + + /* If provided, set the folder_filter for this option. */ + if (isset($optset['folder_filter'])) { + $next_option->setFolderFilter($optset['folder_filter']); + } + + /* Add this option to the option array. */ + $result[$grpkey]['options'][] = $next_option; + } + } + + /* Return our resulting array. */ + return ($result); +} -?> \ No newline at end of file