alecpl
2012-01-13 4391a7809edae1b552f0720a43924212519900a9
program/include/main.inc
@@ -839,11 +839,11 @@
function rcmail_get_edit_field($col, $value, $attrib, $type='text')
{
  static $colcounts = array();
  $fname = '_'.$col;
  $attrib['name'] = $fname . ($attrib['array'] ? '[]' : '');
  $attrib['class'] = trim($attrib['class'] . ' ff_' . $col);
  if ($type == 'checkbox') {
    $attrib['value'] = '1';
    $input = new html_checkbox($attrib);
@@ -856,6 +856,9 @@
    $input = new html_select($attrib);
    $input->add('---', '');
    $input->add(array_values($attrib['options']), array_keys($attrib['options']));
  }
  else if ($attrib['type'] == 'password') {
    $input = new html_passwordfield($attrib);
  }
  else {
    if ($attrib['type'] != 'text' && $attrib['type'] != 'hidden')
@@ -1059,20 +1062,23 @@
  if (empty($ts))
    return '';
  if ($convert) {
    // get user's timezone offset
    $tz = $RCMAIL->config->get_timezone();
    // convert time to user's timezone
    $timestamp = $ts - date('Z', $ts) + ($tz * 3600);
    // get current timestamp in user's timezone
    $now = time();  // local time
    $now -= (int)date('Z'); // make GMT time
    $now += ($tz * 3600); // user's time
  try {
    $date = new DateTime("@".$ts);
  }
  else {
    $now       = time();
  catch (Exception $e) {
    return '';
  }
  try {
    // convert to the right timezone
    $stz = date_default_timezone_get();
    $tz = new DateTimeZone($convert ? $RCMAIL->config->get('timezone') : 'GMT');
    $date->setTimezone($tz);
    date_default_timezone_set($tz->getName());
    $timestamp = $date->format('U');
  }
  catch (Exception $e) {
    $timestamp = $ts;
  }
@@ -1095,6 +1101,7 @@
  // strftime() format
  if (preg_match('/%[a-z]+/i', $format)) {
    $format = strftime($format, $timestamp);
    date_default_timezone_set($stz);
    return $today ? (rcube_label('today') . ' ' . $format) : $format;
  }
@@ -1110,20 +1117,20 @@
      $out .= $format[$i];
    // weekday (short)
    else if ($format[$i]=='D')
      $out .= rcube_label(strtolower(date('D', $timestamp)));
      $out .= rcube_label(strtolower($date->format('D')));
    // weekday long
    else if ($format[$i]=='l')
      $out .= rcube_label(strtolower(date('l', $timestamp)));
      $out .= rcube_label(strtolower($date->format('l')));
    // month name (short)
    else if ($format[$i]=='M')
      $out .= rcube_label(strtolower(date('M', $timestamp)));
      $out .= rcube_label(strtolower($date->format('M')));
    // month name (long)
    else if ($format[$i]=='F')
      $out .= rcube_label('long'.strtolower(date('M', $timestamp)));
      $out .= rcube_label('long'.strtolower($date->format('M')));
    else if ($format[$i]=='x')
      $out .= strftime('%x %X', $timestamp);
    else
      $out .= date($format[$i], $timestamp);
      $out .= $date->format($format[$i]);
  }
  if ($today) {
@@ -1137,6 +1144,7 @@
    }
  }
  date_default_timezone_set($stz);
  return $out;
}
@@ -1619,12 +1627,14 @@
  list($primary, $secondary) = explode('/', $mimetype);
  $classes = array($primary ? $primary : 'unknown');
  if ($secondary)
  if ($secondary) {
    $classes[] = $secondary;
  if (preg_match('/\.([a-z0-9]+)$/', $filename, $m))
  }
  if (preg_match('/\.([a-z0-9]+)$/i', $filename, $m)) {
    $classes[] = $m[1];
  }
  return join(" ", $classes);
  return strtolower(join(" ", $classes));
}
/**
@@ -1875,17 +1885,18 @@
// Returns RFC2822 formatted current date in user's timezone
function rcmail_user_date()
{
  global $RCMAIL, $CONFIG;
  global $RCMAIL;
  // get user's timezone
  $tz = $RCMAIL->config->get_timezone();
  try {
    $tz   = new DateTimeZone($RCMAIL->config->get('timezone'));
    $date = new DateTime('now', $tz);
  }
  catch (Exception $e) {
    $date = new DateTime();
  }
  $date = time() + $tz * 60 * 60;
  $date = gmdate('r', $date);
  $tz   = sprintf('%+05d', intval($tz) * 100 + ($tz - intval($tz)) * 60);
  $date = preg_replace('/[+-][0-9]{4}$/', $tz, $date);
  return $date;
  return $date->format('r');
}
@@ -2098,7 +2109,68 @@
  public function callback($matches)
  {
    return $matches[1] . '="' . make_absolute_url($matches[3], $this->base_url) . '"';
    return $matches[1] . '="' . self::absolute_url($matches[3], $this->base_url) . '"';
  }
  public function replace($body)
  {
    return preg_replace_callback(array(
      '/(src|background|href)=(["\']?)([^"\'\s]+)(\2|\s|>)/Ui',
      '/(url\s*\()(["\']?)([^"\'\)\s]+)(\2)\)/Ui',
      ),
      array($this, 'callback'), $body);
  }
  /**
   * Convert paths like ../xxx to an absolute path using a base url
   *
   * @param string $path     Relative path
   * @param string $base_url Base URL
   *
   * @return string Absolute URL
   */
  public static function absolute_url($path, $base_url)
  {
    $host_url = $base_url;
    $abs_path = $path;
    // check if path is an absolute URL
    if (preg_match('/^[fhtps]+:\/\//', $path)) {
      return $path;
    }
    // check if path is a content-id scheme
    if (strpos($path, 'cid:') === 0) {
      return $path;
    }
    // cut base_url to the last directory
    if (strrpos($base_url, '/') > 7) {
      $host_url = substr($base_url, 0, strpos($base_url, '/', 7));
      $base_url = substr($base_url, 0, strrpos($base_url, '/'));
    }
    // $path is absolute
    if ($path[0] == '/') {
      $abs_path = $host_url.$path;
    }
    else {
      // strip './' because its the same as ''
      $path = preg_replace('/^\.\//', '', $path);
      if (preg_match_all('/\.\.\//', $path, $matches, PREG_SET_ORDER)) {
        foreach ($matches as $a_match) {
          if (strrpos($base_url, '/')) {
            $base_url = substr($base_url, 0, strrpos($base_url, '/'));
          }
          $path = substr($path, 3);
        }
      }
      $abs_path = $base_url.'/'.$path;
    }
    return $abs_path;
  }
}