From e17702395e1aa0fa54eea36817e1150c231d49eb Mon Sep 17 00:00:00 2001
From: svncommit <devs@roundcube.net>
Date: Mon, 26 Feb 2007 01:51:39 -0500
Subject: [PATCH] fixed check for selected value in value array in rcube_shared::select

---
 program/include/rcube_shared.inc |  482 ++++++++++++++++++++++++++++++++--------------------
 1 files changed, 294 insertions(+), 188 deletions(-)

diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc
index 400e345..ba63c82 100644
--- a/program/include/rcube_shared.inc
+++ b/program/include/rcube_shared.inc
@@ -5,7 +5,7 @@
  | rcube_shared.inc                                                      |
  |                                                                       |
  | This file is part of the RoundCube PHP suite                          |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2006, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | CONTENTS:                                                             |
@@ -28,12 +28,15 @@
   
   var $scripts_path = '';
   var $script_files = array();
+  var $external_scripts = array();
   var $scripts = array();
   var $charset = 'ISO-8859-1';
   
   var $script_tag_file = "<script type=\"text/javascript\" src=\"%s%s\"></script>\n";
   var $script_tag      = "<script type=\"text/javascript\">\n<!--\n%s\n\n//-->\n</script>\n";
-  
+  var $default_template = "<html>\n<head><title></title></head>\n<body></body>\n</html>";
+  var $tag_format_external_script = "<script type=\"text/javascript\" src=\"%s\"></script>\n";
+
   var $title = '';
   var $header = '';
   var $footer = '';
@@ -68,43 +71,78 @@
     $this->script_files[$position][] = $file;
     }
     
-  
+  function include_external_script($script_location, $position='head')
+  {
+     if (!is_array($this->external_scripts[$position]))
+     {
+        $this->external_scripts[$position] = array();
+     }
+     
+     $this->external_scripts[$position][] = $script_location;
+  }
+
   function add_script($script, $position='head')
     {
     if (!isset($this->scripts[$position]))
-      $this->scripts[$position] = '';
-
-    $this->scripts[$position] .= "\n$script";
+      $this->scripts[$position] = "\n$script";
+    else
+      $this->scripts[$position] .= "\n$script";
     }
 
 
-  function set_title()
+  function set_title($t)
     {
-    
+    $this->title = $t;
     }
+
 
   function set_charset($charset)
     {
+    global $MBSTRING;
+    
     $this->charset = $charset;
+    
+    if ($MBSTRING && function_exists("mb_internal_encoding"))
+      {
+      if(!@mb_internal_encoding($charset))
+        $MBSTRING = FALSE;
+      }
+    }
+
+  function get_charset()
+    {
+    return $this->charset;
+    }
+
+
+  function reset()
+    {
+    $this->css = new rcube_css();
+    $this->script_files = array();
+    $this->scripts = array();
+    $this->title = '';
     }
 
 
   function write($templ='', $base_path='')
     {
-    $output = trim($templ);
-  
+    $output = empty($templ) ? $this->default_template : trim($templ);
+    
     // set default page title
-    if (!strlen($this->title))
-      $this->title = 'RoundCube|Mail';
+    if (empty($this->title))
+      $this->title = 'RoundCube Mail';
   
     // replace specialchars in content
-    $__page_title = rep_specialchars_output($this->title, 'html', 'show', FALSE);
+    $__page_title = Q($this->title, 'show', FALSE);
     $__page_header = $__page_body = $__page_footer = '';
     
     
     // include meta tag with charset
     if (!empty($this->charset))
-      $__page_header = '<meta http-equiv="content-type" content="text/html; charset='.$this->charset.'" />'."\n";;
+      {
+      header('Content-Type: text/html; charset='.$this->charset);
+      $__page_header = '<meta http-equiv="content-type" content="text/html; charset='.$this->charset.'" />'."\n";
+      }
   
   
     // definition of the code to be placed in the document header and footer
@@ -112,28 +150,39 @@
       foreach ($this->script_files['head'] as $file)
         $__page_header .= sprintf($this->script_tag_file, $this->scripts_path, $file);
 
-    if (strlen($this->scripts['head']))
+   if (is_array($this->external_scripts['head']))
+   {
+      foreach ($this->external_scripts['head'] as $xscript)
+      {
+         $__page_header .= sprintf($this->tag_format_external_script, $xscript);
+      }
+   }
+
+    if (!empty($this->scripts['head']))
       $__page_header .= sprintf($this->script_tag, $this->scripts['head']);
           
     if (is_array($this->script_files['foot']))
+      {
       foreach ($this->script_files['foot'] as $file)
         $__page_footer .= sprintf($this->script_tag_file, $this->scripts_path, $file);
+      }
 
-    if (strlen($this->scripts['foot']))
+    if (!empty($this->scripts['foot']))
       $__page_footer .= sprintf($this->script_tag, $this->scripts['foot']);
-
+      
+    if ($this->footer)
+      $__page_footer .= "\n" . $this->footer;
 
     $__page_header .= $this->css->show();
-
   
     // find page header
-    if($hpos = strpos(strtolower($output), '</head>'))
+    if($hpos = rc_strpos(rc_strtolower($output), '</head>'))
       $__page_header .= "\n";
     else 
       {
       if (!is_numeric($hpos))
-        $hpos = strpos(strtolower($output), '<body');
-      if (!is_numeric($hpos) && ($hpos = strpos(strtolower($output), '<html')))
+        $hpos = rc_strpos(rc_strtolower($output), '<body');
+      if (!is_numeric($hpos) && ($hpos = rc_strpos(rc_strtolower($output), '<html')))
         {
         while($output[$hpos]!='>')
         $hpos++;
@@ -145,28 +194,30 @@
   
     // add page hader
     if($hpos)
-      $output = substr($output,0,$hpos) . $__page_header . substr($output,$hpos,strlen($output));
+      $output = rc_substr($output,0,$hpos) . $__page_header . rc_substr($output,$hpos,rc_strlen($output));
     else
       $output = $__page_header . $output;
   
   
     // find page body
-    if($bpos = strpos(strtolower($output), '<body'))
+    if($bpos = rc_strpos(rc_strtolower($output), '<body'))
       {
       while($output[$bpos]!='>') $bpos++;
       $bpos++;
       }
     else
-      $bpos = strpos(strtolower($output), '</head>')+7;
+      $bpos = rc_strpos(rc_strtolower($output), '</head>')+7;
   
     // add page body
     if($bpos && $__page_body)
-      $output = substr($output,0,$bpos) . "\n$__page_body\n" . substr($output,$bpos,strlen($output));
+      $output = rc_substr($output,0,$bpos) . "\n$__page_body\n" . rc_substr($output,$bpos,rc_strlen($output));
   
   
     // find and add page footer
-    if(($fpos = strpos(strtolower($output), '</body>')) || ($fpos = strpos(strtolower($output), '</html>')))
-      $output = substr($output,0,$fpos) . "$__page_footer\n" . substr($output,$fpos,strlen($output));
+    $output_lc = rc_strtolower($output);
+    if(($fpos = strrstr($output_lc, '</body>')) ||
+       ($fpos = strrstr($output_lc, '</html>')))
+      $output = substr($output, 0, $fpos) . "$__page_footer\n" . substr($output, $fpos);
     else
       $output .= "\n$__page_footer";
   
@@ -175,10 +226,11 @@
     $__page_header = $__page_footer = '';
   
   
-    // correct absolute pathes in images and other tags
+    // correct absolute paths in images and other tags
     $output = preg_replace('/(src|href|background)=(["\']?)(\/[a-z0-9_\-]+)/Ui', "\\1=\\2$base_path\\3", $output);
+    $output = str_replace('$__skin_path', $base_path, $output);
   
-    print $output;
+    print rcube_charset_convert($output, 'UTF-8', $this->charset);
     }
     
     
@@ -673,7 +725,7 @@
 
       // encode textarea content
       if ($key=='value')
-        $value = rep_specialchars_output($value, 'html', 'replace', FALSE);
+        $value = Q($value, 'strict', FALSE);
 
       // attributes with no value
       if (in_array($key, array('checked', 'multiple', 'disabled', 'selected')))
@@ -826,9 +878,9 @@
     if (isset($this->attrib['value']))
       unset($this->attrib['value']);
 
-    if (strlen($value))
-      $value = rep_specialchars_output($value, 'html', 'replace', FALSE);
-    
+    if (!empty($value) && !isset($this->attrib['mce_editable']))
+      $value = Q($value, 'strict', FALSE);
+
     // return final tag
     return sprintf('<%s%s>%s</%s>%s',
                    $this->_conv_case('textarea', 'tag'),
@@ -957,20 +1009,22 @@
     
     if (!is_array($select))
       $select = array((string)$select);
-    
+
     foreach ($this->options as $option)
       {
-      $selected = ((strlen($option['value']) && in_array($option['value'], $select, TRUE)) ||
-                   (in_array($option['text'], $select, TRUE))) ? $this->_conv_case(' selected', 'attrib') : '';
+      $selected = ((isset($option['value']) &&
+                    in_array($option['value'], $select, TRUE)) ||
+                   (in_array($option['text'], $select, TRUE))) ?
+        $this->_conv_case(' selected', 'attrib') : '';
                   
       $options_str .= sprintf("<%s%s%s>%s</%s>\n",
                              $this->_conv_case('option', 'tag'),
-                             strlen($option['value']) ? sprintf($value_str, $option['value']) : '',
+                             isset($option['value']) ? sprintf($value_str, $option['value']) : '',
                              $selected, 
-                             rep_specialchars_output($option['text'], 'html', 'replace', FALSE),
+                             Q($option['text'], 'strict', FALSE),
                              $this->_conv_case('option', 'tag'));
       }
-                             
+
     // return final tag
     return sprintf('<%s%s>%s</%s>%s',
                    $this->_conv_case('select', 'tag'),
@@ -1052,7 +1106,7 @@
   $nr = is_numeric($attrib['nr']) ? $attrib['nr'] : 1;
   $vars = isset($attrib['vars']) ? $attrib['vars'] : '';
 
-  $command_name = strlen($attrib['command']) ? $attrib['command'] : NULL;
+  $command_name = !empty($attrib['command']) ? $attrib['command'] : NULL;
   $alias = $attrib['name'] ? $attrib['name'] : ($command_name && $command_label_map[$command_name] ? $command_label_map[$command_name] : '');
 
 
@@ -1062,8 +1116,8 @@
     $sa_text_data = array();
     
     // get english labels (these should be complete)
-    @include($INSTALL_PATH.'program/localization/en/labels.inc');
-    @include($INSTALL_PATH.'program/localization/en/messages.inc');
+    @include($INSTALL_PATH.'program/localization/en_US/labels.inc');
+    @include($INSTALL_PATH.'program/localization/en_US/messages.inc');
 
     if (is_array($labels))
       $sa_text_data = $labels;
@@ -1075,17 +1129,11 @@
       {
       include_once($INSTALL_PATH.'program/localization/'.$sess_user_lang.'/labels.inc');
       include_once($INSTALL_PATH.'program/localization/'.$sess_user_lang.'/messages.inc');
-      
+
       if (is_array($labels))
         $sa_text_data = array_merge($sa_text_data, $labels);
       if (is_array($messages))
         $sa_text_data = array_merge($sa_text_data, $messages);
-      }
-      
-    if (isset($utf8_decoding) && $utf8_decoding==TRUE)
-      {
-      @include_once('lib/utf8.inc');
-      $utf8_decode = TRUE;
       }
       
     $s_language = $sess_user_lang;
@@ -1142,14 +1190,6 @@
 EOF;
 ");
 
-
-  // perform utf-8 decoding
-  if ($utf8_decode && function_exists('utf8ToUnicodeEntities'))
-    $text = utf8ToUnicodeEntities($text);
-  else if ($utf8_decode)
-    $OUTPUT->set_charset('UTF-8');
-
-
   // format output
   if (($attrib['uppercase'] && strtolower($attrib['uppercase']=='first')) || $attrib['ucfirst'])
     return ucfirst($text);
@@ -1157,8 +1197,6 @@
     return strtoupper($text);
   else if ($attrib['lowercase'])
     return strtolower($text);
-  else
-    return $text;
 
   return $text;
   }
@@ -1180,126 +1218,13 @@
 // send header with expire date 30 days in future
 function send_future_expire_header()
   {
-  if (!headers_sent())
-    header("Expires: ".gmdate("D, d M Y H:i:s", mktime()+2600000)." GMT");
+  if (headers_sent())
+    return;
+
+  header("Expires: ".gmdate("D, d M Y H:i:s", mktime()+2600000)." GMT");
+  header("Cache-Control: ");
+  header("Pragma: ");
   }
-
-
-// replace specials characters to a specific encoding type
-function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
-  {
-  global $OUTPUT_TYPE, $CHARSET;
-  static $html_encode_arr, $js_rep_table, $rtf_rep_table, $xml_rep_table;
-
-  if (!$enctype)
-    $enctype = $GLOBALS['OUTPUT_TYPE'];
-
-  // convert nbsps back to normal spaces if not html
-  if ($enctype!='html')
-    $str = str_replace(chr(160), ' ', $str);
-
-
-  // encode for plaintext
-  if ($enctype=='text')
-    return str_replace("\r\n", "\n", $mode=='remove' ? strip_tags($str) : $str);
-
-  // encode for HTML output
-  if ($enctype=='html')
-    {
-    if (!$html_encode_arr)
-      {
-      if ($CHARSET=='ISO-8859-1')
-        {
-        $html_encode_arr = get_html_translation_table(HTML_ENTITIES);
-        $html_encode_arr[chr(128)] = '&euro;';
-        }
-      else
-        $html_encode_arr = get_html_translation_table(HTML_SPECIALCHARS);
-        
-      unset($html_encode_arr['?']);
-      unset($html_encode_arr['&']);
-      }
-
-    $ltpos = strpos($str, '<');
-    $encode_arr = $html_encode_arr;
-
-    // don't replace quotes and html tags
-    if (($mode=='show' || $mode=='') && $ltpos!==false && strpos($str, '>', $ltpos)!==false)
-      {
-      unset($encode_arr['"']);
-      unset($encode_arr['<']);
-      unset($encode_arr['>']);
-      }
-    else if ($mode=='remove')
-      $str = strip_tags($str);
-      
-    $out = strtr($str, $encode_arr);
-
-    return $newlines ? nl2br($out) : $out;
-    }
-
-
-  if ($enctype=='url')
-    return rawurlencode($str);
-
-
-  // if the replace tables for RTF, XML and JS are not yet defined
-  if (!$js_rep_table)
-    {
-    $js_rep_table = $rtf_rep_table = $xml_rep_table = array();
-
-    for ($c=160; $c<256; $c++)  // can be increased to support more charsets
-      {
-      $hex = dechex($c);
-      $rtf_rep_table[Chr($c)] = "\\'$hex";
-      $xml_rep_table[Chr($c)] = "&#$c;";
-      
-      if ($CHARSET=='ISO-8859-1')
-        $js_rep_table[Chr($c)] = sprintf("\u%s%s", str_repeat('0', 4-strlen($hex)), $hex);
-      }
-
-    $js_rep_table['"'] = sprintf("\u%s%s", str_repeat('0', 4-strlen(dechex(34))), dechex(34));
-    $xml_rep_table['"'] = '&quot;';
-    }
-
-  // encode for RTF
-  if ($enctype=='xml')
-    return strtr($str, $xml_rep_table);
-
-  // encode for javascript use
-  if ($enctype=='js')
-    return preg_replace(array("/\r\n/", '/"/', "/([^\\\])'/"), array('\n', '\"', "$1\'"), strtr($str, $js_rep_table));
-
-  // encode for RTF
-  if ($enctype=='rtf')
-    return preg_replace("/\r\n/", "\par ", strtr($str, $rtf_rep_table));
-
-  // no encoding given -> return original string
-  return $str;
-  }
-
-
-function decode_specialchars($input, $charset='')
-  {
-  $charset = strtolower($charset);
-  
-  if ($charset=='utf-8')
-    {
-    require_once('lib/utf8.inc');
-    return utf8ToUnicodeEntities($input);
-    }
-  else if ($charset=="koi8-r")
-    return convert_cyr_string($input, 'k', 'w');
-  else if ($charset=="iso8859-5")
-    return convert_cyr_string($input, 'i', 'w');
-  else if ($charset=="x-cp866")
-    return convert_cyr_string($input, 'a', 'w');
-  else if ($charset=="x-mac-cyrillic")
-    return convert_cyr_string($input, 'm', 'w');
-
-  return $input;
-  }
-
 
 
 // function to convert an array to a javascript array
@@ -1336,7 +1261,7 @@
         if (!ereg("^[_a-zA-Z]{1}[_a-zA-Z0-9]*$", $key) /* || is_js_reserved_word($key) */)
           $key = "'$key'";
 
-        if (!is_array($value))
+        if (!is_array($value) && is_string($value))
           {
           $value = str_replace("\r\n", '\n', $value);
           $value = str_replace("\n", '\n', $value);
@@ -1347,7 +1272,12 @@
           {
           if ($type=='string')
             $is_string = true;
-          else if ((($type=='mixed' && is_numeric($value)) || $type=='int') && strlen($value)<16)   // js interprets numbers with digits >15 as ...e+... 
+          else if (($type == 'mixed' && is_bool($value)) || $type == 'bool')
+            {
+            $is_string = false;
+            $value = $value ? "true" : "false";
+            }
+          else if ((($type=='mixed' && is_numeric($value)) || $type=='int') && rc_strlen($value)<16)   // js interprets numbers with digits >15 as ...e+... 
             $is_string = FALSE;
           else
             $is_string = TRUE;
@@ -1373,7 +1303,9 @@
       }
     }
   else
+    {
     return $arr;
+    }
   }
 
 
@@ -1402,12 +1334,51 @@
   }
 
 
-function show_bytes($numbytes)
+// parse a human readable string for a number of bytes
+function parse_bytes($str)
   {
-  if ($numbytes > 1024)
-    return sprintf('%d KB', round($numbytes/1024));
+  if (is_numeric($str))
+    return intval($str);
+    
+  if (preg_match('/([0-9]+)([a-z])/i', $str, $regs))
+    {
+      $bytes = floatval($regs[1]);
+      switch (strtolower($regs[2]))
+      {
+        case 'g':
+          $bytes *= 1073741824;
+          break;
+        case 'm':
+          $bytes *= 1048576;
+          break;
+        case 'k':
+          $bytes *= 1024;
+          break;
+      }
+    }
+
+  return intval($bytes);
+  }
+    
+// create a human readable string for a number of bytes
+function show_bytes($bytes)
+  {
+  if ($bytes > 1073741824)
+    {
+    $gb = $bytes/1073741824;
+    $str = sprintf($gb>=10 ? "%d GB" : "%.1f GB", $gb);
+    }
+  else if ($bytes > 1048576)
+    {
+    $mb = $bytes/1048576;
+    $str = sprintf($mb>=10 ? "%d MB" : "%.1f MB", $mb);
+    }
+  else if ($bytes > 1024)
+    $str = sprintf("%d KB",  round($bytes/1024));
   else
-    return sprintf('%d B', $numbytes);
+    $str = sprintf('%d B', $bytes);
+
+  return $str;
   }
 
 
@@ -1448,21 +1419,156 @@
     }
 
 
+// wrapper function for strlen
+function rc_strlen($str)
+  {
+    if (function_exists('mb_strlen'))
+      return mb_strlen($str);
+    else
+      return strlen($str);
+  }
+  
+// wrapper function for strtolower
+function rc_strtolower($str)
+  {
+    if (function_exists('mb_strtolower'))
+      return mb_strtolower($str);
+    else
+      return strtolower($str);
+  }
 
+// wrapper function for substr
+function rc_substr($str, $start, $len)
+  {
+  if (function_exists('mb_substr'))
+    return mb_substr($str, $start, $len);
+  else
+    return substr($str, $start, $len);
+  }
+
+// wrapper function for strpos
+function rc_strpos($haystack, $needle, $offset=0)
+  {
+  if (function_exists('mb_strpos'))
+    return mb_strpos($haystack, $needle, $offset);
+  else
+    return strpos($haystack, $needle, $offset);
+  }
+
+// wrapper function for strrpos
+function rc_strrpos($haystack, $needle, $offset=0)
+  {
+  if (function_exists('mb_strrpos'))
+    return mb_strrpos($haystack, $needle, $offset);
+  else
+    return strrpos($haystack, $needle, $offset);
+  }
+
+
+// replace the middle part of a string with ...
+// if it is longer than the allowed length
 function abbrevate_string($str, $maxlength, $place_holder='...')
   {
-  $length = strlen($str);
-  $first_part_length = floor($maxlength/2) - strlen($place_holder);
+  $length = rc_strlen($str);
+  $first_part_length = floor($maxlength/2) - rc_strlen($place_holder);
   
   if ($length > $maxlength)
     {
     $second_starting_location = $length - $maxlength + $first_part_length + 1;
-    $str = substr($str, 0, $first_part_length) . $place_holder . substr($str, $second_starting_location, $length);
+    $str = rc_substr($str, 0, $first_part_length) . $place_holder . rc_substr($str, $second_starting_location, $length);
     }
 
   return $str;
   }
+
+
+// make sure the string ends with a slash
+function slashify($str)
+  {
+  return unslashify($str).'/';
+  }
+
+
+// remove slash at the end of the string
+function unslashify($str)
+  {
+  return preg_replace('/\/$/', '', $str);
+  }
   
 
+// delete all files within a folder
+function clear_directory($dir_path)
+  {
+  $dir = @opendir($dir_path);
+  if(!$dir) return FALSE;
 
-?>
\ No newline at end of file
+  while ($file = readdir($dir))
+    if (strlen($file)>2)
+      unlink("$dir_path/$file");
+
+  closedir($dir);
+  return TRUE;
+  }
+
+
+// create a unix timestamp with a specified offset from now
+function get_offset_time($offset_str, $factor=1)
+  {
+  if (preg_match('/^([0-9]+)\s*([smhdw])/i', $offset_str, $regs))
+    {
+    $amount = (int)$regs[1];
+    $unit = strtolower($regs[2]);
+    }
+  else
+    {
+    $amount = (int)$offset_str;
+    $unit = 's';
+    }
+    
+  $ts = mktime();
+  switch ($unit)
+    {
+    case 'w':
+      $amount *= 7;
+    case 'd':
+      $amount *= 24;
+    case 'h':
+      $amount *= 60;
+    case 'h':
+      $amount *= 60;
+    case 's':
+      $ts += $amount * $factor;
+    }
+
+  return $ts;
+  }
+
+
+/**
+ * strrstr
+ *
+ * return the last occurence of a string in another string
+ * @param haystack string string in which to search
+ * @param needle string string for which to search
+ * @return index of needle within haystack, or false if not found
+ */
+function strrstr($haystack, $needle)
+  {
+    $pver = phpversion();
+    if ($pver[0] >= 5)
+      {
+        return strrpos($haystack, $needle);
+      }
+    else
+      {
+        $index = strpos(strrev($haystack), strrev($needle));
+        if($index === false) {
+            return false;
+        }
+        $index = strlen($haystack) - strlen($needle) - $index;
+        return $index;
+      }
+  }
+
+
+?>

--
Gitblit v1.9.1