thomascube
2006-11-22 d04d202234b0ba1e65b1c581acf0cbe715120dd7
program/include/rcube_shared.inc
@@ -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,34 +71,66 @@
    $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';
      $this->title = 'RoundCube Mail';
  
    // replace specialchars in content
    $__page_title = rep_specialchars_output($this->title, 'html', 'show', FALSE);
@@ -104,7 +139,10 @@
    
    // 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,19 +150,27 @@
      foreach ($this->script_files['head'] as $file)
        $__page_header .= sprintf($this->script_tag_file, $this->scripts_path, $file);
   if (is_array($this->external_scripts['head']))
   {
      foreach ($this->external_scripts['head'] as $xscript)
      {
         $__page_header .= sprintf($this->tag_format_external_script, $xscript);
      }
   }
    if (strlen($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']))
      $__page_footer .= sprintf($this->script_tag, $this->scripts['foot']);
    $__page_header .= $this->css->show();
  
    // find page header
    if($hpos = strpos(strtolower($output), '</head>'))
@@ -165,8 +211,10 @@
  
  
    // 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 = 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 +223,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);
    }
    
    
@@ -826,9 +875,9 @@
    if (isset($this->attrib['value']))
      unset($this->attrib['value']);
    if (strlen($value))
    if (strlen($value) && !isset($this->attrib['mce_editable']))
      $value = rep_specialchars_output($value, 'html', 'replace', FALSE);
    // return final tag
    return sprintf('<%s%s>%s</%s>%s',
                   $this->_conv_case('textarea', 'tag'),
@@ -1062,8 +1111,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 +1124,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 +1185,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);
@@ -1183,123 +1218,6 @@
  if (!headers_sent())
    header("Expires: ".gmdate("D, d M Y H:i:s", mktime()+2600000)." GMT");
  }
// 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 +1254,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,6 +1265,11 @@
          {
          if ($type=='string')
            $is_string = true;
          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') && strlen($value)<16)   // js interprets numbers with digits >15 as ...e+... 
            $is_string = FALSE;
          else
@@ -1373,7 +1296,9 @@
      }
    }
  else
    {
    return $arr;
    }
  }
@@ -1402,12 +1327,25 @@
  }
function show_bytes($numbytes)
// create a human readable string for a number of bytes
function show_bytes($bytes)
  {
  if ($numbytes > 1024)
    return sprintf('%d KB', round($numbytes/1024));
  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,7 +1386,8 @@
    }
// 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);
@@ -1462,7 +1401,95 @@
  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;
?>
  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;
      }
  }
?>