name = $name; $this->caption = $caption; $this->type = $type; $this->refresh_level = $refresh_level; $this->possible_values = $possible_values; $this->htmlencoded = $htmlencoded; $this->size = SMOPT_SIZE_MEDIUM; $this->trailing_text = ''; $this->comment = ''; $this->script = ''; $this->post_script = ''; //Check for a current value. if (isset($GLOBALS[$name])) { $this->value = $GLOBALS[$name]; } else if (!empty($initial_value)) { $this->value = $initial_value; } else { $this->value = ''; } /* Check for a new value. */ if ( !sqgetGlobalVar("new_$name", $this->new_value, SQ_POST ) ) { $this->new_value = ''; } /* Set the default save function. */ if (($type != SMOPT_TYPE_HIDDEN) && ($type != SMOPT_TYPE_COMMENT)) { $this->save_function = SMOPT_SAVE_DEFAULT; } else { $this->save_function = SMOPT_SAVE_NOOP; } } /** * Set the value for this option. * @param mixed $value */ function setValue($value) { $this->value = $value; } /** * Set the new value for this option. * @param mixed $new_value */ function setNewValue($new_value) { $this->new_value = $new_value; } /** * 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 script for this option. * @param string $script */ function setScript($script) { $this->script = $script; } /** * 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: $result = '' . 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; } $result = "name\" value=\"" . htmlspecialchars($this->value) . "\" size=\"$width\" $this->script />$this->trailing_text\n"; return ($result); } /** * Create selection box * @return string html formated selection box */ function createWidget_StrList() { /* Begin the select tag. */ $result = "$this->trailing_text\n"; return ($result); } /** * Create folder selection box * @return string html formated selection box */ function createWidget_FolderList() { $selected = array(strtolower($this->value)); /* set initial value */ $result = ''; /* Add each possible value to the select list. */ foreach ($this->possible_values as $real_value => $disp_value) { if ( is_array($disp_value) ) { /* For folder list, we passed in the array of boxes.. */ $new_option = sqimap_mailbox_option_list(0, $selected, 0, $disp_value, $this->folder_filter); } else { /* Start the next new option string. */ $new_option = '\n"; } /* And add the new option string to our select tag. */ $result .= $new_option; } if (empty($result)) { // string is displayed when interface can't build folder selection box return _("unavailable"); } else { /* Begin the select tag. */ $ret = "\n"; return ($ret); } } /** * 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; } //FIXME: we need to change $this->script into $this->aExtraAttribs, and anyone who wants to add some javascript or other attributes to an options widget can put them in an array and pass them as extra attributes (key == attrib name, value == attrib value).... for now, this is the only place it is used, and there is no place in the code that text areas get extra attribs or javascript... in fact the only place that was using $this->script is include/options/display.php:200, so that's easy to change.... just have to go through this file and change all the places that use "script" $this->aExtraAttribs = array(); return addTextArea('new_' . $this->name, $this->value, $cols, $rows, $this->aExtraAttribs); } /** * Creates field for integer * * Difference from createWidget_String is visible only when javascript is enabled * @return string html formated option field */ function createWidget_Integer() { // add onChange javascript handler to a regular string widget // which will strip out all non-numeric chars if (checkForJavascript()) return preg_replace('/\/>/', ' onChange="origVal=this.value; newVal=\'\'; ' . 'for (i=0;i=\'0\' ' . '&& origVal.charAt(i)<=\'9\') newVal += origVal.charAt(i); } ' . 'this.value=newVal;" />', $this->createWidget_String()); else return $this->createWidget_String(); } /** * 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() { // add onChange javascript handler to a regular string widget // which will strip out all non-numeric (period also OK) chars if (checkForJavascript()) return preg_replace('/\/>/', ' onChange="origVal=this.value; newVal=\'\'; ' . 'for (i=0;i=\'0\' ' . '&& origVal.charAt(i)<=\'9\') || origVal.charAt(i)==\'.\') ' . 'newVal += origVal.charAt(i); } this.value=newVal;" />' , $this->createWidget_String()); else return $this->createWidget_String(); } /** * Creates radio field (yes/no) * @return string html formated radio field */ function createWidget_Boolean() { /* Do the whole current value thing. */ if ($this->value != SMPREF_NO) { $yes_chk = ' checked="checked"'; $no_chk = ''; } else { $yes_chk = ''; $no_chk = ' checked="checked"'; } /* Build the yes choice. */ $yes_option = 'script . ' /> ' . ''; /* Build the no choice. */ $no_option = 'script . ' /> ' . ''; /* Build and return the combined "boolean widget". */ $result = "$yes_option    $no_option"; return ($result); } /** * Creates hidden field * @return string html formated hidden input field */ function createWidget_Hidden() { $result = 'script . ' />'; return ($result); } /** * Creates comment * @return string comment */ function createWidget_Comment() { $result = $this->comment; return ($result); } /** * */ function save() { $function = $this->save_function; $function($this); } /** * */ 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 create_hidden_element('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 create_hidden_element('optmode', $optmode); } /** * Create hidden field. * @param string $name field name * @param string $value field value * @return string html formated hidden input field */ function create_hidden_element($name, $value) { $result = ''; return ($result); } /** * @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 script for this option. */ if (isset($optset['script'])) { $next_option->setScript($optset['script']); } /* 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); } // vim: et ts=4