\n";
+ /**
+ * 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);
+ }
+
+ /**
+ * 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())
+ $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();
+ }
+
+ /**
+ * 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())
+ $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();
+ }
+
+ /**
+ * Creates radio field (yes/no)
+ * @return string html formated radio field
+ */
+ function createWidget_Boolean() {
+
+ global $oTemplate, $nbsp;
+
+ /* 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);
+ }
+
+ /**
+ * 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);
+ }
+
+ /**
+ * Creates an edit list
+ * @return string html formated list of edit fields and
+ * their associated controls
+ */
+ function createWidget_EditList() {
+
+ global $br, $nbsp;
+
+ switch ($this->size) {
+//FIXME: not sure about these sizes... seems like we could add another on the "large" side...
+ case SMOPT_SIZE_TINY:
+ $height = 3;
+ break;
+ case SMOPT_SIZE_SMALL:
+ $height = 8;
+ break;
+ case SMOPT_SIZE_LARGE:
+ $height = 15;
+ break;
+ case SMOPT_SIZE_HUGE:
+ $height = 25;
+ break;
+ case SMOPT_SIZE_NORMAL:
+ default:
+ $height = 5;
+ }
+
+//FIXME: $this->aExtraAttribs and $this->trailing_text probably should only be used in one place
+//FIXME: might be nice to have this in a template file instead of creating layout here
+ return create_label(_("Add"), '')
+ . $nbsp . addInput('add_' . $this->name, '', 38, 0, $this->aExtraAttribs) . htmlspecialchars($this->trailing_text)
+ . $br . addSelect('new_' . $this->name, $this->possible_values, $this->value, FALSE, !checkForJavascript() ? $this->aExtraAttribs : array_merge(array('onchange' => 'if (typeof(window.addinput) == \'undefined\') { var f = document.forms.length; var i = 0; var pos = -1; while( pos == -1 && i < f ) { var e = document.forms[i].elements.length; var j = 0; while( pos == -1 && j < e ) { if ( document.forms[i].elements[j].type == \'text\' && document.forms[i].elements[j].name == \'add_' . $this->name . '\' ) { pos = j; } j++; } i++; } if( pos >= 0 ) { window.addinput = document.forms[i-1].elements[pos]; } } for (x = 0; x < this.length; x++) { if (this.options[x].selected) { window.addinput.value = this.options[x].value; break; } }'), $this->aExtraAttribs), TRUE, $height) . htmlspecialchars($this->trailing_text)
+ . $br
+ . addCheckBox('delete_' . $this->name, FALSE, SMPREF_YES, array_merge(array('id' => 'delete_' . $this->name), $this->aExtraAttribs))
+ . $nbsp . create_label(_("Delete Selected"), 'delete_' . $this->name);
+
+ }
+
+ /**
+ *
+ */
+ function save() {
+ $function = $this->save_function;
+ $function($this);
+ }
+
+ /**
+ *
+ */
+ function changed() {
+
+ // edit lists have a lot going on, so we'll always process them
+ //
+ if ($this->type == SMOPT_TYPE_EDIT_LIST) return TRUE;
+
+ return ($this->value != $this->new_value);
+ }
+} /* End of SquirrelOption class*/
+
+/**
+ * Saves the option value (this is the default save function
+ * unless overridden by the user)
+ *
+ * @param object $option object that holds option name and new_value
+ */
+function save_option($option) {
+
+ // Can't save the pref if we don't have the username
+ //
+ if ( !sqgetGlobalVar('username', $username, SQ_SESSION ) ) {
+ return;
+ }
+
+ global $data_dir;
+
+ // edit lists: first add new elements to list, then
+ // remove any selected ones (note that we must add
+ // before deleting because the javascript that populates
+ // the "add" textbox when selecting items in the list
+ // (for deletion))
+ //
+ if ($option->type == SMOPT_TYPE_EDIT_LIST) {
+
+ // add element if given
+ //
+ if (sqGetGlobalVar('add_' . $option->name, $new_element, SQ_POST)) {
+ $new_element = trim($new_element);
+ if (!empty($new_element)
+ && !in_array($new_element, $option->possible_values))
+ $option->possible_values[] = $new_element;
+ }
+
+ // delete selected elements if needed
+ //
+ if (is_array($option->new_value)
+ && sqGetGlobalVar('delete_' . $option->name, $ignore, SQ_POST))
+ $option->possible_values = array_diff($option->possible_values, $option->new_value);
+
+ // save full list (stored in "possible_values")
+ //
+ setPref($data_dir, $username, $option->name, serialize($option->possible_values));
+
+ // Certain option types need to be serialized because
+ // they are not scalar
+ //
+ } else if ($option->type == SMOPT_TYPE_FLDRLIST_MULTI)
+ setPref($data_dir, $username, $option->name, serialize($option->new_value));
+
+ else
+ setPref($data_dir, $username, $option->name, $option->new_value);
+
}
-function OptionHidden( $name, $value ) {
- echo "\n";
+/**
+ * save function that does not save
+ * @param object $option
+ */
+function save_option_noop($option) {
+ /* Do nothing here... */
}
-function OptionCheck( $title, $name, $value, $comment ) {
- if ( $value )
- $chk = 'checked';
- echo "
$title:
" .
- " $comment" .
- "
\n";
+/**
+ * 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);
}
-function OptionTitle( $title ) {
- echo "
$title
\n";
+/**
+ * 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);
}
-function OptionSubmit( $name ) {
- echo '
' .
- '
';
+/**
+ * @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);
}
-?>