Oops
[squirrelmail.git] / functions / options.php
index 1814e30364fffd43e90bf27d4e36134e67dcccc7..4608d798433f1c5ec0cfef53655e98bb221e6719 100644 (file)
  * @subpackage prefs
  */
 
-/**********************************************/
-/* Define constants used in the options code. */
-/**********************************************/
-
-/* Define constants for the various option types. */
-define('SMOPT_TYPE_STRING', 0);
-define('SMOPT_TYPE_STRLIST', 1);
-define('SMOPT_TYPE_TEXTAREA', 2);
-define('SMOPT_TYPE_INTEGER', 3);
-define('SMOPT_TYPE_FLOAT', 4);
-define('SMOPT_TYPE_BOOLEAN', 5);
-define('SMOPT_TYPE_HIDDEN', 6);
-define('SMOPT_TYPE_COMMENT', 7);
-define('SMOPT_TYPE_FLDRLIST', 8);
-define('SMOPT_TYPE_FLDRLIST_MULTI', 9);
-define('SMOPT_TYPE_EDIT_LIST', 10);
-define('SMOPT_TYPE_STRLIST_MULTI', 11);
-define('SMOPT_TYPE_BOOLEAN_CHECKBOX', 12);
-define('SMOPT_TYPE_BOOLEAN_RADIO', 13);
-define('SMOPT_TYPE_STRLIST_RADIO', 14);
-
-/* Define constants for the layout scheme for edit lists. */
-define('SMOPT_EDIT_LIST_LAYOUT_LIST', 0);
-define('SMOPT_EDIT_LIST_LAYOUT_SELECT', 1);
-
-/* Define constants for the options refresh levels. */
-define('SMOPT_REFRESH_NONE', 0);
-define('SMOPT_REFRESH_FOLDERLIST', 1);
-define('SMOPT_REFRESH_ALL', 2);
-
-/* Define constants for the options size. */
-define('SMOPT_SIZE_TINY', 0);
-define('SMOPT_SIZE_SMALL', 1);
-define('SMOPT_SIZE_MEDIUM', 2);
-define('SMOPT_SIZE_LARGE', 3);
-define('SMOPT_SIZE_HUGE', 4);
-define('SMOPT_SIZE_NORMAL', 5);
-
-define('SMOPT_SAVE_DEFAULT', 'save_option');
-define('SMOPT_SAVE_NOOP', 'save_option_noop');
-
 /**
  * SquirrelOption: An option for SquirrelMail.
  *
@@ -75,6 +34,11 @@ class SquirrelOption {
      * @var string
      */
     var $caption;
+    /**
+     * Whether or not the caption text is allowed to wrap
+     * @var boolean
+     */
+    var $caption_wrap;
     /**
      * The type of INPUT element
      *
@@ -125,6 +89,20 @@ class SquirrelOption {
      * @var int
      */
     var $layout_type;
+    /**
+     * Indicates if the Add widget should be included
+     * with edit lists.
+     *
+     * @var boolean
+     */
+    var $use_add_widget;
+    /**
+     * Indicates if the Delete widget should be included
+     * with edit lists.
+     *
+     * @var boolean
+     */
+    var $use_delete_widget;
     /**
      * text displayed to the user
      *
@@ -204,16 +182,19 @@ class SquirrelOption {
         $this->raw_option_array = $raw_option_array;
         $this->name = $name;
         $this->caption = $caption;
+        $this->caption_wrap = TRUE;
         $this->type = $type;
         $this->refresh_level = $refresh_level;
         $this->possible_values = $possible_values;
         $this->htmlencoded = $htmlencoded;
-        $this->size = SMOPT_SIZE_MEDIUM;
+        $this->size = SMOPT_SIZE_NORMAL;
         $this->trailing_text = '';
         $this->yes_text = '';
         $this->no_text = '';
         $this->comment = '';
         $this->layout_type = 0;
+        $this->use_add_widget = TRUE;
+        $this->use_delete_widget = TRUE;
         $this->aExtraAttribs = array();
         $this->post_script = '';
 
@@ -232,7 +213,9 @@ class SquirrelOption {
         }
 
         /* Set the default save function. */
-        if (($type != SMOPT_TYPE_HIDDEN) && ($type != SMOPT_TYPE_COMMENT)) {
+        if ($type != SMOPT_TYPE_HIDDEN
+         && $type != SMOPT_TYPE_INFO
+         && $type != SMOPT_TYPE_COMMENT) {
             $this->save_function = SMOPT_SAVE_DEFAULT;
         } else {
             $this->save_function = SMOPT_SAVE_NOOP;
@@ -263,6 +246,14 @@ class SquirrelOption {
         $this->new_value = $new_value;
     }
 
+    /**
+     * Set whether the caption is allowed to wrap for this option.
+     * @param boolean $caption_wrap
+     */
+    function setCaptionWrap($caption_wrap) {
+        $this->caption_wrap = $caption_wrap;
+    }
+
     /**
      * Set the size for this option.
      * @param integer $size
@@ -295,6 +286,16 @@ class SquirrelOption {
         $this->no_text = $no_text;
     }
 
+    /* Set the "use add widget" value for this option. */
+    function setUseAddWidget($use_add_widget) {
+        $this->use_add_widget = $use_add_widget;
+    }
+
+    /* Set the "use delete widget" value for this option. */
+    function setUseDeleteWidget($use_delete_widget) {
+        $this->use_delete_widget = $use_delete_widget;
+    }
+
     /**
      * Set the layout type for this option.
      * @param int $layout_type
@@ -363,6 +364,9 @@ class SquirrelOption {
 
         /* Get the widget for this option type. */
         switch ($this->type) {
+            case SMOPT_TYPE_PASSWORD:
+                $result = $this->createWidget_String(TRUE);
+                break;
             case SMOPT_TYPE_STRING:
                 $result = $this->createWidget_String();
                 break;
@@ -408,6 +412,12 @@ class SquirrelOption {
             case SMOPT_TYPE_STRLIST_RADIO:
                 $result = $this->createWidget_StrList(FALSE, TRUE);
                 break;
+            case SMOPT_TYPE_SUBMIT:
+                $result = $this->createWidget_Submit();
+                break;
+            case SMOPT_TYPE_INFO:
+                $result = $this->createWidget_Info();
+                break;
             default:
                 error_box ( 
                     sprintf(_("Option Type '%s' Not Found"), $this->type)
@@ -426,11 +436,25 @@ class SquirrelOption {
         return $result;
     }
 
+    /**
+     * Creates info block
+     * @return string html formated output
+     */
+    function createWidget_Info() {
+        return sq_htmlspecialchars($this->value);
+    }
+
     /**
      * Create string field
+     *
+     * @param boolean $password When TRUE, the text in the input
+     *                          widget will be obscured (OPTIONAL;
+     *                          default = FALSE).
+     *
      * @return string html formated option field
+     *
      */
-    function createWidget_String() {
+    function createWidget_String($password=FALSE) {
         switch ($this->size) {
             case SMOPT_SIZE_TINY:
                 $width = 5;
@@ -449,7 +473,11 @@ class SquirrelOption {
                 $width = 25;
         }
 
-        return addInput('new_' . $this->name, $this->value, $width, 0, $this->aExtraAttribs) . htmlspecialchars($this->trailing_text); 
+//TODO: might be better to have a separate template file for all widgets, because then the layout of the widget and the "trailing text" can be customized - they are still hard coded here
+        if ($password)
+            return addPwField('new_' . $this->name, $this->value, $width, 0, $this->aExtraAttribs) . ' ' . htmlspecialchars($this->trailing_text);
+        else
+            return addInput('new_' . $this->name, $this->value, $width, 0, $this->aExtraAttribs) . ' ' . htmlspecialchars($this->trailing_text);
     }
 
     /**
@@ -711,19 +739,21 @@ class SquirrelOption {
         global $oTemplate;
 
         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:
+            case SMOPT_SIZE_MEDIUM:
                 $height = 15;
                 break;
-            case SMOPT_SIZE_HUGE:
+            case SMOPT_SIZE_LARGE:
                 $height = 25;
                 break;
+            case SMOPT_SIZE_HUGE:
+                $height = 40;
+                break;
             case SMOPT_SIZE_NORMAL:
             default:
                 $height = 5;
@@ -734,6 +764,9 @@ class SquirrelOption {
 
 //FIXME: $this->aExtraAttribs probably should only be used in one place
         $oTemplate->assign('input_widget', addInput('add_' . $this->name, '', 38, 0, $this->aExtraAttribs));
+        $oTemplate->assign('use_input_widget', $this->use_add_widget);
+        $oTemplate->assign('use_delete_widget', $this->use_delete_widget);
+
         $oTemplate->assign('trailing_text', $this->trailing_text);
         $oTemplate->assign('possible_values', $this->possible_values);
         $oTemplate->assign('select_widget', addSelect('new_' . $this->name, $this->possible_values, $this->value, FALSE, !checkForJavascript() ? $this->aExtraAttribs : array_merge(array('onchange' => 'if (typeof(window.addinput_' . $this->name . ') == \'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_' . $this->name . ' = document.forms[i-1].elements[pos]; } } for (x = 0; x < this.length; x++) { if (this.options[x].selected) { window.addinput_' . $this->name . '.value = this.options[x].value; break; } }'), $this->aExtraAttribs), TRUE, $height));
@@ -751,6 +784,18 @@ class SquirrelOption {
 
     }
 
+    /**
+     * Creates a submit button
+     *
+     * @return string html formated submit button widget
+     *
+     */
+    function createWidget_Submit() {
+
+        return addSubmit($this->comment, $this->name, $this->aExtraAttribs) . htmlspecialchars($this->trailing_text);
+
+    }
+
     /**
      *
      */
@@ -801,7 +846,8 @@ function save_option($option) {
 
         // add element if given
         //
-        if (sqGetGlobalVar('add_' . $option->name, $new_element, SQ_POST)) {
+        if ((isset($option->use_add_widget) && $option->use_add_widget)
+         && sqGetGlobalVar('add_' . $option->name, $new_element, SQ_POST)) {
             $new_element = trim($new_element);
             if (!empty($new_element)
              && !in_array($new_element, $option->possible_values))
@@ -810,7 +856,8 @@ function save_option($option) {
         
         // delete selected elements if needed
         //
-        if (is_array($option->new_value)
+        if ((isset($option->use_delete_widget) && $option->use_delete_widget)
+         && is_array($option->new_value)
          && sqGetGlobalVar('delete_' . $option->name, $ignore, SQ_POST))
             $option->possible_values = array_diff($option->possible_values, $option->new_value);
 
@@ -903,6 +950,11 @@ function create_option_groups($optgrps, $optvals) {
                     (isset($optset['htmlencoded']) ? $optset['htmlencoded'] : false)
                     );
 
+            /* If provided, set if the caption is allowed to wrap for this option. */
+            if (isset($optset['caption_wrap'])) {
+                $next_option->setCaptionWrap($optset['caption_wrap']);
+            }
+
             /* If provided, set the size for this option. */
             if (isset($optset['size'])) {
                 $next_option->setSize($optset['size']);
@@ -928,6 +980,16 @@ function create_option_groups($optgrps, $optvals) {
                 $next_option->setLayoutType($optset['layout_type']);
             }
 
+            /* If provided, set the use_add_widget value for this option. */
+            if (isset($optset['use_add_widget'])) {
+                $next_option->setUseAddWidget($optset['use_add_widget']);
+            }
+
+            /* If provided, set the use_delete_widget value for this option. */
+            if (isset($optset['use_delete_widget'])) {
+                $next_option->setUseDeleteWidget($optset['use_delete_widget']);
+            }
+
             /* If provided, set the comment for this option. */
             if (isset($optset['comment'])) {
                 $next_option->setComment($optset['comment']);