Source for file options.php

Documentation is available at options.php

  1. <?php
  2.  
  3. /**
  4.  * options.php
  5.  *
  6.  * Functions needed to display the options pages.
  7.  *
  8.  * @copyright 1999-2012 The SquirrelMail Project Team
  9.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  10.  * @version $Id: options.php 14346 2012-12-09 12:06:30Z kink $
  11.  * @package squirrelmail
  12.  * @subpackage prefs
  13.  */
  14.  
  15. /**
  16.  * SquirrelOption: An option for SquirrelMail.
  17.  *
  18.  * @package squirrelmail
  19.  * @subpackage prefs
  20.  */
  21. class SquirrelOption {
  22.     /**
  23.      * The original option configuration array
  24.      * @var array 
  25.      */
  26.     var $raw_option_array;
  27.     /**
  28.      * The name of this setting
  29.      * @var string 
  30.      */
  31.     var $name;
  32.     /**
  33.      * The text that prefaces setting on the preferences page
  34.      * @var string 
  35.      */
  36.     var $caption;
  37.     /**
  38.      * Whether or not the caption text is allowed to wrap
  39.      * @var boolean 
  40.      */
  41.     var $caption_wrap;
  42.     /**
  43.      * The type of INPUT element
  44.      *
  45.      * See SMOPT_TYPE_* defines
  46.      * @var integer 
  47.      */
  48.     var $type;
  49.     /**
  50.      * Indicates if a link should be shown to refresh part
  51.      * or all of the window
  52.      *
  53.      * See SMOPT_REFRESH_* defines
  54.      * @var integer 
  55.      */
  56.     var $refresh_level;
  57.     /**
  58.      * Specifies the size of certain input items
  59.      *
  60.      * See SMOPT_SIZE_* defines
  61.      * @var integer 
  62.      */
  63.     var $size;
  64.     /**
  65.      * Text that follows a text input or
  66.      * select list input on the preferences page
  67.      *
  68.      * useful for indicating units, meanings of special values, etc.
  69.      * @var string 
  70.      */
  71.     var $trailing_text;
  72.     /**
  73.      * Text that overrides the "Yes" label for boolean
  74.      * radio option widgets
  75.      *
  76.      * @var string 
  77.      */
  78.     var $yes_text;
  79.     /**
  80.      * Text that overrides the "No" label for boolean
  81.      * radio option widgets
  82.      *
  83.      * @var string 
  84.      */
  85.     var $no_text;
  86.     /**
  87.      * Some widgets support more than one layout type
  88.      *
  89.      * @var int 
  90.      */
  91.     var $layout_type;
  92.     /**
  93.      * Indicates if the Add widget should be included
  94.      * with edit lists.
  95.      *
  96.      * @var boolean 
  97.      */
  98.     var $use_add_widget;
  99.     /**
  100.      * Indicates if the Delete widget should be included
  101.      * with edit lists.
  102.      *
  103.      * @var boolean 
  104.      */
  105.     var $use_delete_widget;
  106.     /**
  107.      * text displayed to the user
  108.      *
  109.      * Used with SMOPT_TYPE_COMMENT options
  110.      * @var string 
  111.      */
  112.     var $comment;
  113.     /**
  114.      * additional javascript or other widget attributes added to the
  115.      * user input; must be an array where keys are attribute names
  116.      * ("onclick", etc) and values are the attribute values.
  117.      * @var array 
  118.      */
  119.     var $aExtraAttribs;
  120.     /**
  121.      * script (usually Javascript) that will be placed after (outside of)
  122.      * the INPUT tag
  123.      * @var string 
  124.      */
  125.     var $post_script;
  126.  
  127.     /**
  128.      * The name of the Save Function for this option.
  129.      * @var string 
  130.      */
  131.     var $save_function;
  132.  
  133.     /* The various 'values' for this options. */
  134.     /**
  135.      * default/preselected value for this option
  136.      * @var mixed 
  137.      */
  138.     var $value;
  139.     /**
  140.      * new option value
  141.      * @var mixed 
  142.      */
  143.     var $new_value;
  144.     /**
  145.      * associative array, where each key is an actual input value
  146.      * and the corresponding value is what is displayed to the user
  147.      * for that list item in the drop-down list
  148.      * @var array 
  149.      */
  150.     var $possible_values;
  151.     /**
  152.      * disables html sanitizing.
  153.      *
  154.      * WARNING - don't use it, if user input is possible in option
  155.      * or use own sanitizing functions. Currently only works for SMOPT_TYPE_STRLIST.
  156.      * @var bool 
  157.      */
  158.     var $htmlencoded=false;
  159.     /**
  160.      * Controls folder list limits in SMOPT_TYPE_FLDRLIST and
  161.      * SMOPT_TYPE_FLDRLIST_MULTI widgets.
  162.      * See $flag argument in sqimap_mailbox_option_list() function.
  163.      * @var string 
  164.      * @since 1.5.1
  165.      */
  166.     var $folder_filter='noselect';
  167.  
  168.     /**
  169.      * Constructor function
  170.      * @param array $raw_option_array 
  171.      * @param string $name 
  172.      * @param string $caption 
  173.      * @param integer $type 
  174.      * @param integer $refresh_level 
  175.      * @param mixed $initial_value 
  176.      * @param array $possible_values 
  177.      * @param bool $htmlencoded 
  178.      */
  179.     function SquirrelOption
  180.     ($raw_option_array$name$caption$type$refresh_level$initial_value ''$possible_values ''$htmlencoded false{
  181.         /* Set the basic stuff. */
  182.         $this->raw_option_array = $raw_option_array;
  183.         $this->name = $name;
  184.         $this->caption = $caption;
  185.         $this->caption_wrap = TRUE;
  186.         $this->type = $type;
  187.         $this->refresh_level = $refresh_level;
  188.         $this->possible_values = $possible_values;
  189.         $this->htmlencoded = $htmlencoded;
  190.         $this->size = SMOPT_SIZE_NORMAL;
  191.         $this->trailing_text = '';
  192.         $this->yes_text = '';
  193.         $this->no_text = '';
  194.         $this->comment = '';
  195.         $this->layout_type = 0;
  196.         $this->use_add_widget = TRUE;
  197.         $this->use_delete_widget = TRUE;
  198.         $this->aExtraAttribs = array();
  199.         $this->post_script = '';
  200.  
  201.         //Check for a current value.  
  202.         if (isset($GLOBALS[$name])) {
  203.             $this->value = $GLOBALS[$name];
  204.         else if (!empty($initial_value)) {
  205.             $this->value = $initial_value;
  206.         else {
  207.             $this->value = '';
  208.         }
  209.  
  210.         /* Check for a new value. */
  211.         if !sqgetGlobalVar("new_$name"$this->new_valueSQ_POST ) ) {
  212.             $this->new_value = NULL;
  213.         }
  214.  
  215.         /* Set the default save function. */
  216.         if ($type != SMOPT_TYPE_HIDDEN
  217.          && $type != SMOPT_TYPE_INFO
  218.          && $type != SMOPT_TYPE_COMMENT{
  219.             $this->save_function = SMOPT_SAVE_DEFAULT;
  220.         else {
  221.             $this->save_function = SMOPT_SAVE_NOOP;
  222.         }
  223.     }
  224.  
  225.     /** Convenience function that identifies which types of
  226.         widgets are stored as (serialized) array values. */
  227.     function is_multiple_valued({
  228.         return ($this->type == SMOPT_TYPE_FLDRLIST_MULTI
  229.              || $this->type == SMOPT_TYPE_STRLIST_MULTI
  230.              || $this->type == SMOPT_TYPE_EDIT_LIST);
  231.     }
  232.  
  233.     /**
  234.      * Set the value for this option.
  235.      * @param mixed $value 
  236.      */
  237.     function setValue($value{
  238.         $this->value = $value;
  239.     }
  240.  
  241.     /**
  242.      * Set the new value for this option.
  243.      * @param mixed $new_value 
  244.      */
  245.     function setNewValue($new_value{
  246.         $this->new_value = $new_value;
  247.     }
  248.  
  249.     /**
  250.      * Set whether the caption is allowed to wrap for this option.
  251.      * @param boolean $caption_wrap 
  252.      */
  253.     function setCaptionWrap($caption_wrap{
  254.         $this->caption_wrap = $caption_wrap;
  255.     }
  256.  
  257.     /**
  258.      * Set the size for this option.
  259.      * @param integer $size 
  260.      */
  261.     function setSize($size{
  262.         $this->size = $size;
  263.     }
  264.  
  265.     /**
  266.      * Set the trailing_text for this option.
  267.      * @param string $trailing_text 
  268.      */
  269.     function setTrailingText($trailing_text{
  270.         $this->trailing_text = $trailing_text;
  271.     }
  272.  
  273.     /**
  274.      * Set the yes_text for this option.
  275.      * @param string $yes_text 
  276.      */
  277.     function setYesText($yes_text{
  278.         $this->yes_text = $yes_text;
  279.     }
  280.  
  281.     /**
  282.      * Set the no_text for this option.
  283.      * @param string $no_text 
  284.      */
  285.     function setNoText($no_text{
  286.         $this->no_text = $no_text;
  287.     }
  288.  
  289.     /* Set the "use add widget" value for this option. */
  290.     function setUseAddWidget($use_add_widget{
  291.         $this->use_add_widget = $use_add_widget;
  292.     }
  293.  
  294.     /* Set the "use delete widget" value for this option. */
  295.     function setUseDeleteWidget($use_delete_widget{
  296.         $this->use_delete_widget = $use_delete_widget;
  297.     }
  298.  
  299.     /**
  300.      * Set the layout type for this option.
  301.      * @param int $layout_type 
  302.      */
  303.     function setLayoutType($layout_type{
  304.         $this->layout_type = $layout_type;
  305.     }
  306.  
  307.     /**
  308.      * Set the comment for this option.
  309.      * @param string $comment 
  310.      */
  311.     function setComment($comment{
  312.         $this->comment = $comment;
  313.     }
  314.  
  315.     /**
  316.      * Set the extra attributes for this option.
  317.      * @param array $aExtraAttribs 
  318.      */
  319.     function setExtraAttributes($aExtraAttribs{
  320.         $this->aExtraAttribs = $aExtraAttribs;
  321.     }
  322.  
  323.     /**
  324.      * Set the "post script" for this option.
  325.      * @param string $post_script 
  326.      */
  327.     function setPostScript($post_script{
  328.         $this->post_script = $post_script;
  329.     }
  330.  
  331.     /**
  332.      * Set the save function for this option.
  333.      * @param string $save_function 
  334.      */
  335.     function setSaveFunction($save_function{
  336.         $this->save_function = $save_function;
  337.     }
  338.  
  339.     /**
  340.      * Set the folder_filter for this option.
  341.      * @param string $folder_filter 
  342.      * @since 1.5.1
  343.      */
  344.     function setFolderFilter($folder_filter{
  345.         $this->folder_filter = $folder_filter;
  346.     }
  347.  
  348.     /**
  349.      * Creates fields on option pages according to option type
  350.      *
  351.      * This is the function that calls all other createWidget* functions.
  352.      *
  353.      * @return string The formated option field
  354.      *
  355.      */
  356.     function createWidget({
  357.         global $color;
  358.  
  359.         // Use new value if available
  360.         if (!is_null($this->new_value)) {
  361.             $tempValue $this->value;
  362.             $this->value = $this->new_value;
  363.         }
  364.  
  365.         /* Get the widget for this option type. */
  366.         switch ($this->type{
  367.             case SMOPT_TYPE_PASSWORD:
  368.                 $result $this->createWidget_String(TRUE);
  369.                 break;
  370.             case SMOPT_TYPE_STRING:
  371.                 $result $this->createWidget_String();
  372.                 break;
  373.             case SMOPT_TYPE_STRLIST:
  374.                 $result $this->createWidget_StrList();
  375.                 break;
  376.             case SMOPT_TYPE_TEXTAREA:
  377.                 $result $this->createWidget_TextArea();
  378.                 break;
  379.             case SMOPT_TYPE_INTEGER:
  380.                 $result $this->createWidget_Integer();
  381.                 break;
  382.             case SMOPT_TYPE_FLOAT:
  383.                 $result $this->createWidget_Float();
  384.                 break;
  385.             case SMOPT_TYPE_BOOLEAN:
  386.                 $result $this->createWidget_Boolean();
  387.                 break;
  388.             case SMOPT_TYPE_BOOLEAN_CHECKBOX:
  389.                 $result $this->createWidget_Boolean(TRUE);
  390.                 break;
  391.             case SMOPT_TYPE_BOOLEAN_RADIO:
  392.                 $result $this->createWidget_Boolean(FALSE);
  393.                 break;
  394.             case SMOPT_TYPE_HIDDEN:
  395.                 $result $this->createWidget_Hidden();
  396.                 break;
  397.             case SMOPT_TYPE_COMMENT:
  398.                 $result $this->createWidget_Comment();
  399.                 break;
  400.             case SMOPT_TYPE_FLDRLIST:
  401.                 $result $this->createWidget_FolderList();
  402.                 break;
  403.             case SMOPT_TYPE_FLDRLIST_MULTI:
  404.                 $result $this->createWidget_FolderList(TRUE);
  405.                 break;
  406.             case SMOPT_TYPE_EDIT_LIST:
  407.                 $result $this->createWidget_EditList();
  408.                 break;
  409.             case SMOPT_TYPE_STRLIST_MULTI:
  410.                 $result $this->createWidget_StrList(TRUE);
  411.                 break;
  412.             case SMOPT_TYPE_STRLIST_RADIO:
  413.                 $result $this->createWidget_StrList(FALSETRUE);
  414.                 break;
  415.             case SMOPT_TYPE_SUBMIT:
  416.                 $result $this->createWidget_Submit();
  417.                 break;
  418.             case SMOPT_TYPE_INFO:
  419.                 $result $this->createWidget_Info();
  420.                 break;
  421.             default:
  422.                 error_box 
  423.                     sprintf(_("Option Type '%s' Not Found")$this->type)
  424.                     );
  425.         }
  426.  
  427.         /* Add the "post script" for this option. */
  428.         $result .= $this->post_script;
  429.  
  430.         // put correct value back if need be
  431.         if (!is_null($this->new_value)) {
  432.             $this->value = $tempValue;
  433.         }
  434.  
  435.         /* Now, return the created widget. */
  436.         return $result;
  437.     }
  438.  
  439.     /**
  440.      * Creates info block
  441.      * @return string html formated output
  442.      */
  443.     function createWidget_Info({
  444.         return sq_htmlspecialchars($this->value);
  445.     }
  446.  
  447.     /**
  448.      * Create string field
  449.      *
  450.      * @param boolean $password When TRUE, the text in the input
  451.      *                           widget will be obscured (OPTIONAL;
  452.      *                           default = FALSE).
  453.      *
  454.      * @return string html formated option field
  455.      *
  456.      */
  457.     function createWidget_String($password=FALSE{
  458.         switch ($this->size{
  459.             case SMOPT_SIZE_TINY:
  460.                 $width 5;
  461.                 break;
  462.             case SMOPT_SIZE_SMALL:
  463.                 $width 12;
  464.                 break;
  465.             case SMOPT_SIZE_LARGE:
  466.                 $width 38;
  467.                 break;
  468.             case SMOPT_SIZE_HUGE:
  469.                 $width 50;
  470.                 break;
  471.             case SMOPT_SIZE_NORMAL:
  472.             default:
  473.                 $width 25;
  474.         }
  475.  
  476. //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
  477.         if ($password)
  478.             return addPwField('new_' $this->name$this->value$width0$this->aExtraAttribs' ' sm_encode_html_special_chars($this->trailing_text);
  479.         else
  480.             return addInput('new_' $this->name$this->value$width0$this->aExtraAttribs' ' sm_encode_html_special_chars($this->trailing_text);
  481.     }
  482.  
  483.     /**
  484.      * Create selection box or radio button group
  485.      *
  486.      * When $this->htmlencoded is TRUE, the keys and values in
  487.      * $this->possible_values are assumed to be display-safe.
  488.      * Use with care!
  489.      *
  490.      * Note that when building radio buttons instead of a select
  491.      * widget, if the "size" attribute is SMOPT_SIZE_TINY, the
  492.      * radio buttons will be output one after another without
  493.      * linebreaks between them.  Otherwise, each radio button
  494.      * goes on a line of its own.
  495.      *
  496.      * @param boolean $multiple_select When TRUE, the select widget
  497.      *                                  will allow multiple selections
  498.      *                                  (OPTIONAL; default is FALSE
  499.      *                                  (single select list))
  500.      * @param boolean $radio_buttons   When TRUE, the widget will
  501.      *                                  instead be built as a group
  502.      *                                  of radio buttons (and
  503.      *                                  $multiple_select will be
  504.      *                                  forced to FALSE) (OPTIONAL;
  505.      *                                  default is FALSE (select widget))
  506.      *
  507.      * @return string html formated selection box or radio buttons
  508.      *
  509.      */
  510.     function createWidget_StrList($multiple_select=FALSE$radio_buttons=FALSE{
  511. //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
  512.  
  513.         // radio buttons instead of select widget?
  514.         //
  515.         if ($radio_buttons{
  516.  
  517.             global $br$nbsp;
  518.             $result '';
  519.             foreach ($this->possible_values as $real_value => $disp_value{
  520.                 $result .= addRadioBox('new_' $this->name($this->value == $real_value)$real_valuearray_merge(array('id' => 'new_' $this->name . '_' $real_value)$this->aExtraAttribs)) $nbsp create_label($disp_value'new_' $this->name . '_' $real_value);
  521.                 if ($this->size != SMOPT_SIZE_TINY)
  522.                     $result .= $br;
  523.             }
  524.  
  525.             return $result;
  526.         }
  527.  
  528.  
  529.         // everything below applies to select widgets
  530.         //
  531.         switch ($this->size{
  532. //FIXME: not sure about these sizes... seems like we could add another on the "large" side...
  533.             case SMOPT_SIZE_TINY:
  534.                 $height 3;
  535.                 break;
  536.             case SMOPT_SIZE_SMALL:
  537.                 $height 8;
  538.                 break;
  539.             case SMOPT_SIZE_LARGE:
  540.                 $height 15;
  541.                 break;
  542.             case SMOPT_SIZE_HUGE:
  543.                 $height 25;
  544.                 break;
  545.             case SMOPT_SIZE_NORMAL:
  546.             default:
  547.                 $height 5;
  548.         }
  549.  
  550.         return addSelect('new_' $this->name$this->possible_values$this->valueTRUE$this->aExtraAttribs$multiple_select$height!$this->htmlencodedsm_encode_html_special_chars($this->trailing_text);
  551.  
  552.     }
  553.  
  554.     /**
  555.      * Create folder selection box
  556.      *
  557.      * @param boolean $multiple_select When TRUE, the select widget
  558.      *                                  will allow multiple selections
  559.      *                                  (OPTIONAL; default is FALSE
  560.      *                                  (single select list))
  561.      *
  562.      * @return string html formated selection box
  563.      *
  564.      */
  565.     function createWidget_FolderList($multiple_select=FALSE{
  566.  
  567.         switch ($this->size{
  568. //FIXME: not sure about these sizes... seems like we could add another on the "large" side...
  569.             case SMOPT_SIZE_TINY:
  570.                 $height 3;
  571.                 break;
  572.             case SMOPT_SIZE_SMALL:
  573.                 $height 8;
  574.                 break;
  575.             case SMOPT_SIZE_LARGE:
  576.                 $height 15;
  577.                 break;
  578.             case SMOPT_SIZE_HUGE:
  579.                 $height 25;
  580.                 break;
  581.             case SMOPT_SIZE_NORMAL:
  582.             default:
  583.                 $height 5;
  584.         }
  585.  
  586.         // possible values might include a nested array of 
  587.         // possible values (list of folders)
  588.         //
  589.         $option_list array();
  590.         foreach ($this->possible_values as $value => $text{
  591.  
  592.             // list of folders (boxes array)
  593.             //
  594.             if (is_array($text)) {
  595.               $option_list array_merge($option_listsqimap_mailbox_option_array(00$text$this->folder_filter));
  596.  
  597.             // just one option here
  598.             //
  599.             else {
  600.               $option_list array_merge($option_listarray($value => $text));
  601.             }
  602.  
  603.         }
  604.         if (empty($option_list))
  605.             $option_list array('ignore' => _("unavailable"));
  606.  
  607.  
  608.         return addSelect('new_' $this->name$option_list$this->valueTRUE$this->aExtraAttribs$multiple_select$heightsm_encode_html_special_chars($this->trailing_text);
  609.  
  610.     }
  611.  
  612.     /**
  613.      * Creates textarea
  614.      * @return string html formated textarea field
  615.      */
  616.     function createWidget_TextArea({
  617.         switch ($this->size{
  618.             case SMOPT_SIZE_TINY:  $rows 3$cols =  10break;
  619.             case SMOPT_SIZE_SMALL$rows 4$cols =  30break;
  620.             case SMOPT_SIZE_LARGE$rows 10$cols =  60break;
  621.             case SMOPT_SIZE_HUGE:  $rows 20$cols =  80break;
  622.             case SMOPT_SIZE_NORMAL:
  623.             default$rows 5$cols =  50;
  624.         }
  625.         return addTextArea('new_' $this->name$this->value$cols$rows$this->aExtraAttribs);
  626.     }
  627.  
  628.     /**
  629.      * Creates field for integer
  630.      *
  631.      * Difference from createWidget_String is visible only when javascript is enabled
  632.      * @return string html formated option field
  633.      */
  634.     function createWidget_Integer({
  635.  
  636.         // add onChange javascript handler to a regular string widget
  637.         // which will strip out all non-numeric chars
  638.         if (checkForJavascript())
  639.            $this->aExtraAttribs['onchange''origVal=this.value; newVal=\'\'; '
  640.                     . 'for (i=0;i<origVal.length;i++) { if (origVal.charAt(i)>=\'0\' '
  641.                     . '&& origVal.charAt(i)<=\'9\') newVal += origVal.charAt(i); } '
  642.                     . 'this.value=newVal;';
  643.  
  644.         return $this->createWidget_String();
  645.     }
  646.  
  647.     /**
  648.      * Creates field for floating number
  649.      * Difference from createWidget_String is visible only when javascript is enabled
  650.      * @return string html formated option field
  651.      */
  652.     function createWidget_Float({
  653.  
  654.         // add onChange javascript handler to a regular string widget
  655.         // which will strip out all non-numeric (period also OK) chars
  656.         if (checkForJavascript())
  657.            $this->aExtraAttribs['onchange''origVal=this.value; newVal=\'\'; '
  658.                     . 'for (i=0;i<origVal.length;i++) { if ((origVal.charAt(i)>=\'0\' '
  659.                     . '&& origVal.charAt(i)<=\'9\') || origVal.charAt(i)==\'.\') '
  660.                     . 'newVal += origVal.charAt(i); } this.value=newVal;';
  661.  
  662.         return $this->createWidget_String();
  663.     }
  664.  
  665.     /**
  666.      * Create boolean widget
  667.      *
  668.      * When creating Yes/No radio buttons, the "yes_text"
  669.      * and "no_text" option attributes are used to override
  670.      * the typical "Yes" and "No" text.
  671.      *
  672.      * @param boolean $checkbox When TRUE, the widget will be
  673.      *                           constructed as a checkbox,
  674.      *                           otherwise it will be a set of
  675.      *                           Yes/No radio buttons (OPTIONAL;
  676.      *                           default is TRUE (checkbox)).
  677.      *
  678.      * @return string html formated boolean widget
  679.      *
  680.      */
  681.     function createWidget_Boolean($checkbox=TRUE{
  682.  
  683.         global $oTemplate$nbsp;
  684.  
  685.  
  686.         // checkbox...
  687.         //
  688.         if ($checkbox{
  689.             $result addCheckbox('new_' $this->name($this->value != SMPREF_NO)SMPREF_YESarray_merge(array('id' => 'new_' $this->name)$this->aExtraAttribs)) $nbsp create_label($this->trailing_text'new_' $this->name);
  690.         }
  691.  
  692.         // radio buttons...
  693.         //
  694.         else {
  695.  
  696.             /* Build the yes choice. */
  697.             $yes_option addRadioBox('new_' $this->name($this->value != SMPREF_NO)SMPREF_YESarray_merge(array('id' => 'new_' $this->name . '_yes')$this->aExtraAttribs)) $nbsp create_label((!empty($this->yes_text$this->yes_text : _("Yes"))'new_' $this->name . '_yes');
  698.  
  699.             /* Build the no choice. */
  700.             $no_option addRadioBox('new_' $this->name($this->value == SMPREF_NO)SMPREF_NOarray_merge(array('id' => 'new_' $this->name . '_no')$this->aExtraAttribs)) $nbsp create_label((!empty($this->no_text$this->no_text : _("No"))'new_' $this->name . '_no');
  701.  
  702.             /* Build the combined "boolean widget". */
  703.             $result "$yes_option$nbsp$nbsp$nbsp$nbsp$no_option";
  704.  
  705.         }
  706.  
  707.         return ($result);
  708.     }
  709.  
  710.     /**
  711.      * Creates hidden field
  712.      * @return string html formated hidden input field
  713.      */
  714.     function createWidget_Hidden({
  715.         return addHidden('new_' $this->name$this->value$this->aExtraAttribs);
  716.     }
  717.  
  718.     /**
  719.      * Creates comment
  720.      * @return string comment
  721.      */
  722.     function createWidget_Comment({
  723.         $result $this->comment;
  724.         return ($result);
  725.     }
  726.  
  727.     /**
  728.      * Creates an edit list
  729.      *
  730.      * Note that multiple layout types are supported for this widget.
  731.      * $this->layout_type must be one of the SMOPT_EDIT_LIST_LAYOUT_*
  732.      * constants.
  733.      *
  734.      * @return string html formated list of edit fields and
  735.      *                 their associated controls
  736.      */
  737.     function createWidget_EditList({
  738.  
  739.         global $oTemplate;
  740.  
  741.         switch ($this->size{
  742.             case SMOPT_SIZE_TINY:
  743.                 $height 3;
  744.                 break;
  745.             case SMOPT_SIZE_SMALL:
  746.                 $height 8;
  747.                 break;
  748.             case SMOPT_SIZE_MEDIUM:
  749.                 $height 15;
  750.                 break;
  751.             case SMOPT_SIZE_LARGE:
  752.                 $height 25;
  753.                 break;
  754.             case SMOPT_SIZE_HUGE:
  755.                 $height 40;
  756.                 break;
  757.             case SMOPT_SIZE_NORMAL:
  758.             default:
  759.                 $height 5;
  760.         }
  761.  
  762.         if (empty($this->possible_values)) $this->possible_values = array();
  763.         if (!is_array($this->possible_values)) $this->possible_values = array($this->possible_values);
  764.  
  765. //FIXME: $this->aExtraAttribs probably should only be used in one place
  766.         $oTemplate->assign('input_widget'addInput('add_' $this->name''380$this->aExtraAttribs));
  767.         $oTemplate->assign('use_input_widget'$this->use_add_widget);
  768.         $oTemplate->assign('use_delete_widget'$this->use_delete_widget);
  769.  
  770.         $oTemplate->assign('trailing_text'$this->trailing_text);
  771.         $oTemplate->assign('possible_values'$this->possible_values);
  772.         $oTemplate->assign('select_widget'addSelect('new_' $this->name$this->possible_values$this->valueFALSE!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));
  773.         $oTemplate->assign('checkbox_widget'addCheckBox('delete_' $this->nameFALSESMPREF_YESarray_merge(array('id' => 'delete_' $this->name)$this->aExtraAttribs)));
  774.         $oTemplate->assign('name'$this->name);
  775.  
  776.         switch ($this->layout_type{
  777.             case SMOPT_EDIT_LIST_LAYOUT_SELECT:
  778.                 return $oTemplate->fetch('edit_list_widget.tpl');
  779.             case SMOPT_EDIT_LIST_LAYOUT_LIST:
  780.                 return $oTemplate->fetch('edit_list_widget_list_style.tpl');
  781.             default:
  782.                 error_box(sprintf(_("Edit List Layout Type '%s' Not Found")$layout_type));
  783.         }
  784.  
  785.     }
  786.  
  787.     /**
  788.      * Creates a submit button
  789.      *
  790.      * @return string html formated submit button widget
  791.      *
  792.      */
  793.     function createWidget_Submit({
  794.  
  795.         return addSubmit($this->comment$this->name$this->aExtraAttribssm_encode_html_special_chars($this->trailing_text);
  796.  
  797.     }
  798.  
  799.     /**
  800.      *
  801.      */
  802.     function save({
  803.         $function $this->save_function;
  804.         $function($this);
  805.     }
  806.  
  807.     /**
  808.      *
  809.      */
  810.     function changed({
  811.  
  812.         // edit lists have a lot going on, so we'll always process them
  813.         //
  814.         if ($this->type == SMOPT_TYPE_EDIT_LISTreturn TRUE;
  815.  
  816.         return ($this->value != $this->new_value);
  817.     }
  818. /* End of SquirrelOption class*/
  819.  
  820. /**
  821.  * Saves the option value (this is the default save function
  822.  * unless overridden by the user)
  823.  *
  824.  * @param object $option object that holds option name and new_value
  825.  */
  826. function save_option($option{
  827.  
  828.     // Can't save the pref if we don't have the username
  829.     //
  830.     if !sqgetGlobalVar('username'$usernameSQ_SESSION ) ) {
  831.         return;
  832.     }
  833.  
  834.     // if the widget is a selection list, make sure the new
  835.     // value is actually in the selection list and is not an
  836.     // injection attack
  837.     //
  838.     if ($option->type == SMOPT_TYPE_STRLIST
  839.      && !array_key_exists($option->new_value$option->possible_values))
  840.         return;
  841.  
  842.  
  843.     // all other widgets except TEXTAREAs should never be allowed to have newlines
  844.     //
  845.     else if ($option->type != SMOPT_TYPE_TEXTAREA)
  846.         $option->new_value str_replace(array("\r""\n")''$option->new_value);
  847.  
  848.  
  849.     global $data_dir;
  850.  
  851.     // edit lists: first add new elements to list, then
  852.     // remove any selected ones (note that we must add
  853.     // before deleting because the javascript that populates
  854.     // the "add" textbox when selecting items in the list
  855.     // (for deletion))
  856.     //
  857.     if ($option->type == SMOPT_TYPE_EDIT_LIST{
  858.  
  859.         if (empty($option->possible_values)) $option->possible_values array();
  860.         if (!is_array($option->possible_values)) $option->possible_values array($option->possible_values);
  861.  
  862.         // add element if given
  863.         //
  864.         if ((isset($option->use_add_widget&& $option->use_add_widget)
  865.          && sqGetGlobalVar('add_' $option->name$new_elementSQ_POST)) {
  866.             $new_element trim($new_element);
  867.             if (!empty($new_element)
  868.              && !in_array($new_element$option->possible_values))
  869.                 $option->possible_values[$new_element;
  870.         }
  871.         
  872.         // delete selected elements if needed
  873.         //
  874.         if ((isset($option->use_delete_widget&& $option->use_delete_widget)
  875.          && is_array($option->new_value)
  876.          && sqGetGlobalVar('delete_' $option->name$ignoreSQ_POST))
  877.             $option->possible_values array_diff($option->possible_values$option->new_value);
  878.  
  879.         // save full list (stored in "possible_values")
  880.         //
  881.         setPref($data_dir$username$option->nameserialize($option->possible_values));
  882.  
  883.     // Certain option types need to be serialized because
  884.     // they are not scalar
  885.     //
  886.     else if ($option->is_multiple_valued())
  887.         setPref($data_dir$username$option->nameserialize($option->new_value));
  888.  
  889.     // Checkboxes, when unchecked, don't submit anything in
  890.     // the POST, so set to SMPREF_OFF if not found
  891.     //
  892.     else if (($option->type == SMOPT_TYPE_BOOLEAN
  893.            || $option->type == SMOPT_TYPE_BOOLEAN_CHECKBOX)
  894.           && empty($option->new_value)) 
  895.         setPref($data_dir$username$option->nameSMPREF_OFF);
  896.  
  897.     // For integer fields, make sure we only have digits...
  898.     // We'll be nice and instead of just converting to an integer,
  899.     // we'll physically remove each non-digit in the string.
  900.     //
  901.     else if ($option->type == SMOPT_TYPE_INTEGER{
  902.         $option->new_value preg_replace('/[^0-9]/'''$option->new_value);
  903.         setPref($data_dir$username$option->name$option->new_value);
  904.     }
  905.  
  906.     else
  907.         setPref($data_dir$username$option->name$option->new_value);
  908.  
  909.  
  910.     // if a checkbox or multi select is zeroed/cleared out, it
  911.     // needs to have an empty value pushed into its "new_value" slot
  912.     //
  913.     if (($option->type == SMOPT_TYPE_STRLIST_MULTI
  914.       || $option->type == SMOPT_TYPE_BOOLEAN_CHECKBOX)
  915.      && is_null($option->new_value))
  916.         $option->new_value '';
  917.  
  918. }
  919.  
  920. /**
  921.  * save function that does not save
  922.  * @param object $option 
  923.  */
  924. function save_option_noop($option{
  925.     /* Do nothing here... */
  926. }
  927.  
  928. /**
  929.  * Create hidden 'optpage' input field with value set by argument
  930.  * @param string $optpage identification of option page
  931.  * @return string html formated hidden input field
  932.  */
  933. function create_optpage_element($optpage{
  934.     return addHidden('optpage'$optpage);
  935. }
  936.  
  937. /**
  938.  * Create hidden 'optmode' input field with value set by argument
  939.  * @param string $optmode 
  940.  * @return string html formated hidden input field
  941.  */
  942. function create_optmode_element($optmode{
  943.     return addHidden('optmode'$optmode);
  944. }
  945.  
  946. /**
  947.  * @param array $optgrps 
  948.  * @param array $optvals 
  949.  * @return array 
  950.  */
  951. function create_option_groups($optgrps$optvals{
  952.     /* Build a simple array with which to start. */
  953.     $result array();
  954.  
  955.     /* Create option group for each option group name. */
  956.     foreach ($optgrps as $grpkey => $grpname{
  957.         $result[$grpkeyarray();
  958.         $result[$grpkey]['name'$grpname;
  959.         $result[$grpkey]['options'array();
  960.     }
  961.  
  962.      /* Create a new SquirrelOption for each set of option values. */
  963.     foreach ($optvals as $grpkey => $grpopts{
  964.         foreach ($grpopts as $optset{
  965.             /* Create a new option with all values given. */
  966.             $next_option new SquirrelOption(
  967.                     $optset,
  968.                     $optset['name'],
  969.                     $optset['caption'],
  970.                     $optset['type'],
  971.                     (isset($optset['refresh']$optset['refresh'SMOPT_REFRESH_NONE),
  972.                     (isset($optset['initial_value']$optset['initial_value'''),
  973.                     (isset($optset['posvals']$optset['posvals'''),
  974.                     (isset($optset['htmlencoded']$optset['htmlencoded'false)
  975.                     );
  976.  
  977.             /* If provided, set if the caption is allowed to wrap for this option. */
  978.             if (isset($optset['caption_wrap'])) {
  979.                 $next_option->setCaptionWrap($optset['caption_wrap']);
  980.             }
  981.  
  982.             /* If provided, set the size for this option. */
  983.             if (isset($optset['size'])) {
  984.                 $next_option->setSize($optset['size']);
  985.             }
  986.  
  987.             /* If provided, set the trailing_text for this option. */
  988.             if (isset($optset['trailing_text'])) {
  989.                 $next_option->setTrailingText($optset['trailing_text']);
  990.             }
  991.  
  992.             /* If provided, set the yes_text for this option. */
  993.             if (isset($optset['yes_text'])) {
  994.                 $next_option->setYesText($optset['yes_text']);
  995.             }
  996.  
  997.             /* If provided, set the no_text for this option. */
  998.             if (isset($optset['no_text'])) {
  999.                 $next_option->setNoText($optset['no_text']);
  1000.             }
  1001.  
  1002.             /* If provided, set the layout type for this option. */
  1003.             if (isset($optset['layout_type'])) {
  1004.                 $next_option->setLayoutType($optset['layout_type']);
  1005.             }
  1006.  
  1007.             /* If provided, set the use_add_widget value for this option. */
  1008.             if (isset($optset['use_add_widget'])) {
  1009.                 $next_option->setUseAddWidget($optset['use_add_widget']);
  1010.             }
  1011.  
  1012.             /* If provided, set the use_delete_widget value for this option. */
  1013.             if (isset($optset['use_delete_widget'])) {
  1014.                 $next_option->setUseDeleteWidget($optset['use_delete_widget']);
  1015.             }
  1016.  
  1017.             /* If provided, set the comment for this option. */
  1018.             if (isset($optset['comment'])) {
  1019.                 $next_option->setComment($optset['comment']);
  1020.             }
  1021.  
  1022.             /* If provided, set the save function for this option. */
  1023.             if (isset($optset['save'])) {
  1024.                 $next_option->setSaveFunction($optset['save']);
  1025.             }
  1026.  
  1027.             /* If provided, set the extra attributes for this option. */
  1028.             if (isset($optset['extra_attributes'])) {
  1029.                 $next_option->setExtraAttributes($optset['extra_attributes']);
  1030.             }
  1031.  
  1032.             /* If provided, set the "post script" for this option. */
  1033.             if (isset($optset['post_script'])) {
  1034.                 $next_option->setPostScript($optset['post_script']);
  1035.             }
  1036.  
  1037.             /* If provided, set the folder_filter for this option. */
  1038.             if (isset($optset['folder_filter'])) {
  1039.                 $next_option->setFolderFilter($optset['folder_filter']);
  1040.             }
  1041.  
  1042.             /* Add this option to the option array. */
  1043.             $result[$grpkey]['options'][$next_option;
  1044.         }
  1045.     }
  1046.  
  1047.     /* Return our resulting array. */
  1048.     return ($result);
  1049. }

Documentation generated on Mon, 20 May 2013 04:20:12 +0200 by phpDocumentor 1.4.3