Changed codebase to PHP5 with autoloader + added some new classes from the devel-vnext branch
parent
b00bd0f27d
commit
47124c2279
@ -1,21 +1,11 @@
|
||||
<?php
|
||||
|
||||
require_once('../program/lib/html2text.inc');
|
||||
define('INSTALL_PATH', realpath('./../') . '/');
|
||||
require INSTALL_PATH.'program/include/iniset.php';
|
||||
|
||||
$htmlText = $HTTP_RAW_POST_DATA;
|
||||
$converter = new html2text($htmlText);
|
||||
$converter = new html2text($HTTP_RAW_POST_DATA);
|
||||
|
||||
header('Content-Type: text/plain; charset=UTF-8');
|
||||
$plaintext = $converter->get_text();
|
||||
|
||||
$phpver = explode('.', phpversion());
|
||||
$vernum = $phpver[0] . $phpver[1] . $phpver[2];
|
||||
|
||||
# html_entity_decode doesn't handle UTF character sets in PHP 4.x
|
||||
|
||||
if (($vernum >= 500) && function_exists('html_entity_decode'))
|
||||
print html_entity_decode($plaintext, ENT_COMPAT, 'UTF-8');
|
||||
else
|
||||
print $plaintext;
|
||||
print html_entity_decode($converter->get_text(), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
?>
|
||||
|
@ -1,14 +1,10 @@
|
||||
#!/usr/bin/php -qC
|
||||
<?php
|
||||
|
||||
$CWD = $INSTALL_PATH = preg_replace('/bin\/$/', '', getcwd() . '/');
|
||||
ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . $CWD.'program/');
|
||||
define('INSTALL_PATH', preg_replace('/bin\/$/', '', getcwd()) . '/');
|
||||
ini_set('memory_limit', -1);
|
||||
|
||||
require_once('include/rcube_shared.inc');
|
||||
require_once('include/rcube_imap.inc');
|
||||
require_once('include/main.inc');
|
||||
require_once('include/bugs.inc');
|
||||
require_once INSTALL_PATH.'program/include/iniset.php';
|
||||
|
||||
/**
|
||||
* Parse commandline arguments into a hash array
|
@ -0,0 +1,642 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| program/include/html.php |
|
||||
| |
|
||||
| This file is part of the RoundCube Webmail client |
|
||||
| Copyright (C) 2005-2008, RoundCube Dev, - Switzerland |
|
||||
| Licensed under the GNU GPL |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Helper class to create valid XHTML code |
|
||||
| |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
|
||||
$Id: $
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Class for HTML code creation
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class html
|
||||
{
|
||||
protected $tagname;
|
||||
protected $attrib = array();
|
||||
protected $allowed;
|
||||
protected $content;
|
||||
|
||||
protected static $common_attrib = array('id','class','style','title','align');
|
||||
public static $containers = array('div','span','p','h1','h2','h3','form','textarea');
|
||||
public static $lc_tags = true;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param array Hash array with tag attributes
|
||||
*/
|
||||
public function __construct($attrib = array())
|
||||
{
|
||||
if (is_array($attrib)) {
|
||||
$this->attrib = $attrib;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the tag code
|
||||
*
|
||||
* @return string The finally composed HTML tag
|
||||
*/
|
||||
public function show()
|
||||
{
|
||||
return self::tag($this->tagname, $this->attrib, $this->content, $this->allowed);
|
||||
}
|
||||
|
||||
/****** STATIC METHODS *******/
|
||||
|
||||
/**
|
||||
* Generic method to create a HTML tag
|
||||
*
|
||||
* @param string Tag name
|
||||
* @param array Tag attributes as key/value pairs
|
||||
* @param string Optinal Tag content (creates a container tag)
|
||||
* @param array List with allowed attributes, omit to allow all
|
||||
* @return string The XHTML tag
|
||||
*/
|
||||
public static function tag($tagname, $attrib = array(), $content = null, $allowed_attrib = null)
|
||||
{
|
||||
$inline_tags = array('a','span','img');
|
||||
$suffix = $attrib['nl'] || ($content && $attrib['nl'] !== false && !in_array($tagname, $inline_tags)) ? "\n" : '';
|
||||
|
||||
$tagname = self::$lc_tags ? strtolower($tagname) : $tagname;
|
||||
if ($content || in_array($tagname, self::$containers)) {
|
||||
$templ = $attrib['noclose'] ? "<%s%s>%s" : "<%s%s>%s</%s>%s";
|
||||
unset($attrib['noclose']);
|
||||
return sprintf($templ, $tagname, self::attrib_string($attrib, $allowed_attrib), $content, $tagname, $suffix);
|
||||
}
|
||||
else {
|
||||
return sprintf("<%s%s />%s", $tagname, self::attrib_string($attrib, $allowed_attrib), $suffix);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Derrived method for <div> containers
|
||||
*
|
||||
* @param mixed Hash array with tag attributes or string with class name
|
||||
* @param string Div content
|
||||
* @return string HTML code
|
||||
* @see html::tag()
|
||||
*/
|
||||
public static function div($attr = null, $cont = null)
|
||||
{
|
||||
if (is_string($attr)) {
|
||||
$attr = array('class' => $attr);
|
||||
}
|
||||
return self::tag('div', $attr, $cont, self::$common_attrib);
|
||||
}
|
||||
|
||||
/**
|
||||
* Derrived method for <p> blocks
|
||||
*
|
||||
* @param mixed Hash array with tag attributes or string with class name
|
||||
* @param string Paragraph content
|
||||
* @return string HTML code
|
||||
* @see html::tag()
|
||||
*/
|
||||
public static function p($attr = null, $cont = null)
|
||||
{
|
||||
if (is_string($attr)) {
|
||||
$attr = array('class' => $attr);
|
||||
}
|
||||
return self::tag('p', $attr, $cont, self::$common_attrib);
|
||||
}
|
||||
|
||||
/**
|
||||
* Derrived method to create <img />
|
||||
*
|
||||
* @param mixed Hash array with tag attributes or string with image source (src)
|
||||
* @return string HTML code
|
||||
* @see html::tag()
|
||||
*/
|
||||
public static function img($attr = null)
|
||||
{
|
||||
if (is_string($attr)) {
|
||||
$attr = array('src' => $attr);
|
||||
}
|
||||
return self::tag('img', $attr + array('alt' => ''), null, array_merge(self::$common_attrib, array('src','alt','width','height','border','usemap')));
|
||||
}
|
||||
|
||||
/**
|
||||
* Derrived method for link tags
|
||||
*
|
||||
* @param mixed Hash array with tag attributes or string with link location (href)
|
||||
* @param string Link content
|
||||
* @return string HTML code
|
||||
* @see html::tag()
|
||||
*/
|
||||
public static function a($attr, $cont)
|
||||
{
|
||||
if (is_string($attr)) {
|
||||
$attr = array('href' => $attr);
|
||||
}
|
||||
return self::tag('a', $attr, $cont, array_merge(self::$common_attrib, array('href','target','name','onclick','onmouseover','onmouseout')));
|
||||
}
|
||||
|
||||
/**
|
||||
* Derrived method for inline span tags
|
||||
*
|
||||
* @param mixed Hash array with tag attributes or string with class name
|
||||
* @param string Tag content
|
||||
* @return string HTML code
|
||||
* @see html::tag()
|
||||
*/
|
||||
public static function span($attr, $cont)
|
||||
{
|
||||
if (is_string($attr)) {
|
||||
$attr = array('class' => $attr);
|
||||
}
|
||||
return self::tag('span', $attr, $cont, self::$common_attrib);
|
||||
}
|
||||
|
||||
/**
|
||||
* Derrived method for form element labels
|
||||
*
|
||||
* @param mixed Hash array with tag attributes or string with 'for' attrib
|
||||
* @param string Tag content
|
||||
* @return string HTML code
|
||||
* @see html::tag()
|
||||
*/
|
||||
public static function label($attr, $cont)
|
||||
{
|
||||
if (is_string($attr)) {
|
||||
$attr = array('for' => $attr);
|
||||
}
|
||||
return self::tag('label', $attr, $cont, array_merge(self::$common_attrib, array('for')));
|
||||
}
|
||||
|
||||
/**
|
||||
* Derrived method for line breaks
|
||||
*
|
||||
* @return string HTML code
|
||||
* @see html::tag()
|
||||
*/
|
||||
public static function br()
|
||||
{
|
||||
return self::tag('br');
|
||||
}
|
||||
|
||||
/**
|
||||
* Create string with attributes
|
||||
*
|
||||
* @param array Associative arry with tag attributes
|
||||
* @param array List of allowed attributes
|
||||
* @return string Valid attribute string
|
||||
*/
|
||||
public static function attrib_string($attrib = array(), $allowed = null)
|
||||
{
|
||||
if (empty($attrib)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$allowed_f = array_flip((array)$allowed);
|
||||
$attrib_arr = array();
|
||||
foreach ($attrib as $key => $value) {
|
||||
// skip size if not numeric
|
||||
if (($key=='size' && !is_numeric($value))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// ignore "internal" or not allowed attributes
|
||||
if ($key == 'nl' || ($allowed && !isset($allowed_f[$key])) || $value === null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// skip empty eventhandlers
|
||||
if (preg_match('/^on[a-z]+/', $key) && !$value) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// attributes with no value
|
||||
if (in_array($key, array('checked', 'multiple', 'disabled', 'selected'))) {
|
||||
if ($value) {
|
||||
$attrib_arr[] = sprintf('%s="%s"', $key, $key);
|
||||
}
|
||||
}
|
||||
else if ($key=='value') {
|
||||
$attrib_arr[] = sprintf('%s="%s"', $key, Q($value, 'strict', false));
|
||||
}
|
||||
else {
|
||||
$attrib_arr[] = sprintf('%s="%s"', $key, Q($value));
|
||||
}
|
||||
}
|
||||
return count($attrib_arr) ? ' '.implode(' ', $attrib_arr) : '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class to create an HTML input field
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class html_inputfield extends html
|
||||
{
|
||||
protected $tagname = 'input';
|
||||
protected $type = 'text';
|
||||
|
||||
public function __construct($attrib = array())
|
||||
{
|
||||
if (is_array($attrib)) {
|
||||
$this->attrib = $attrib;
|
||||
}
|
||||
|
||||
if ($attrib['type']) {
|
||||
$this->type = $attrib['type'];
|
||||
}
|
||||
|
||||
if ($attrib['newline']) {
|
||||
$this->newline = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Compose input tag
|
||||
*
|
||||
* @param string Field value
|
||||
* @param array Additional attributes to override
|
||||
* @return string HTML output
|
||||
*/
|
||||
public function show($value = null, $attrib = null)
|
||||
{
|
||||
// overwrite object attributes
|
||||
if (is_array($attrib)) {
|
||||
$this->attrib = array_merge($this->attrib, $attrib);
|
||||
}
|
||||
|
||||
// set value attribute
|
||||
if ($value !== null) {
|
||||
$this->attrib['value'] = $value;
|
||||
}
|
||||
// set type
|
||||
$this->attrib['type'] = $this->type;
|
||||
return parent::show();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class to create an HTML password field
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class html_passwordfield extends html_inputfield
|
||||
{
|
||||
protected $type = 'password';
|
||||
}
|
||||
|
||||
/**
|
||||
* Class to create an hidden HTML input field
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
|
||||
class html_hiddenfield extends html_inputfield
|
||||
{
|
||||
protected $type = 'hidden';
|
||||
protected $fields_arr = array();
|
||||
protected $newline = true;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param array Named tag attributes
|
||||
*/
|
||||
public function __construct($attrib = null)
|
||||
{
|
||||
if (is_array($attrib)) {
|
||||
$this->add($attrib);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a hidden field to this instance
|
||||
*
|
||||
* @param array Named tag attributes
|
||||
*/
|
||||
public function add($attrib)
|
||||
{
|
||||
$this->fields_arr[] = $attrib;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create HTML code for the hidden fields
|
||||
*
|
||||
* @return string Final HTML code
|
||||
*/
|
||||
public function show()
|
||||
{
|
||||
$out = '';
|
||||
foreach ($this->fields_arr as $attrib) {
|
||||
$out .= self::tag($this->tagname, array('type' => $this->type) + $attrib);
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class to create HTML radio buttons
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class html_radiobutton extends html_inputfield
|
||||
{
|
||||
protected $type = 'radio';
|
||||
|
||||
/**
|
||||
* Get HTML code for this object
|
||||
*
|
||||
* @param string Value of the checked field
|
||||
* @param array Additional attributes to override
|
||||
* @return string HTML output
|
||||
*/
|
||||
public function show($value = '', $attrib = null)
|
||||
{
|
||||
// overwrite object attributes
|
||||
if (is_array($attrib)) {
|
||||
$this->attrib = array_merge($this->attrib, $attrib);
|
||||
}
|
||||
|
||||
// set value attribute
|
||||
$this->attrib['checked'] = ($value && (string)$value == (string)$this->attrib['value']);
|
||||
|
||||
return parent::show();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class to create HTML checkboxes
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class html_checkbox extends html_inputfield
|
||||
{
|
||||
protected $type = 'checkbox';
|
||||
|
||||
/**
|
||||
* Get HTML code for this object
|
||||
*
|
||||
* @param string Value of the checked field
|
||||
* @param array Additional attributes to override
|
||||
* @return string HTML output
|
||||
*/
|
||||
public function show($value = '', $attrib = null)
|
||||
{
|
||||
// overwrite object attributes
|
||||
if (is_array($attrib)) {
|
||||
$this->attrib = array_merge($this->attrib, $attrib);
|
||||
}
|
||||
|
||||
// set value attribute
|
||||
$this->attrib['checked'] = ($value && (string)$value == (string)$this->attrib['value']);
|
||||
|
||||
return parent::show();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class to create an HTML textarea
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class html_textarea extends html
|
||||
{
|
||||
protected $tagname = 'textarea';
|
||||
protected $allowed_attrib = array('name','rows','cols','wrap');
|
||||
|
||||
/**
|
||||
* Get HTML code for this object
|
||||
*
|
||||
* @param string Textbox value
|
||||
* @param array Additional attributes to override
|
||||
* @return string HTML output
|
||||
*/
|
||||
public function show($value = '', $attrib = null)
|
||||
{
|
||||
// overwrite object attributes
|
||||
if (is_array($attrib)) {
|
||||
$this->attrib = array_merge($this->attrib, $attrib);
|
||||
}
|
||||
|
||||
// take value attribute as content
|
||||
if ($value == '') {
|
||||
$value = $this->attrib['value'];
|
||||
}
|
||||
|
||||
// make shure we don't print the value attribute
|
||||
if (isset($this->attrib['value'])) {
|
||||
unset($this->attrib['value']);
|
||||
}
|
||||
|
||||
if (!empty($value) && !isset($this->attrib['mce_editable'])) {
|
||||
$value = Q($value, 'strict', FALSE);
|
||||
}
|
||||
return self::tag($this->tagname, $this->attrib, Q($value), array_merge(self::$common_attrib, $this->allowed_attrib));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder for HTML drop-down menus
|
||||
* Syntax:<pre>
|
||||
* // create instance. arguments are used to set attributes of select-tag
|
||||
* $select = new html_select(array('name' => 'fieldname'));
|
||||
*
|
||||
* // add one option
|
||||
* $select->add('Switzerland', 'CH');
|
||||
*
|
||||
* // add multiple options
|
||||
* $select->add(array('Switzerland','Germany'), array('CH','DE'));
|
||||
*
|
||||
* // generate pulldown with selection 'Switzerland' and return html-code
|
||||
* // as second argument the same attributes available to instanciate can be used
|
||||
* print $select->show('CH');
|
||||
* </pre>
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class html_select extends html
|
||||
{
|
||||
protected $tagname = 'select';
|
||||
protected $options = array();
|
||||
|
||||
/**
|
||||
* Add a new option to this drop-down
|
||||
*
|
||||
* @param mixed Option name or array with option names
|
||||
* @param mixed Option value or array with option values
|
||||
*/
|
||||
public function add($names, $values = null)
|
||||
{
|
||||
if (is_array($names)) {
|
||||
foreach ($names as $i => $text) {
|
||||
$this->options[] = array('text' => $text, 'value' => $values[$i]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$this->options[] = array('text' => $names, 'value' => $values);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get HTML code for this object
|
||||
*
|
||||
* @param string Value of the selection option
|
||||
* @param array Additional attributes to override
|
||||
* @return string HTML output
|
||||
*/
|
||||
public function show($select = array(), $attrib = null)
|
||||
{
|
||||
// overwrite object attributes
|
||||
if (is_array($attrib)) {
|
||||
$this->attrib = array_merge($this->attrib, $attrib);
|
||||
}
|
||||
|
||||
$this->content = "\n";
|
||||
$select = (array)$select;
|
||||
foreach ($this->options as $option) {
|
||||
$attr = array(
|
||||
'value' => $option['value'],
|
||||
'selected' => ((!empty($option['value']) && in_array($option['value'], $select, true)) ||
|
||||
(in_array($option['text'], $select, TRUE))) ? 1 : null);
|
||||
|
||||
$this->content .= self::tag('option', $attr, Q($option['text']));
|
||||
}
|
||||
return parent::show();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Class to build an HTML table
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class html_table extends html
|
||||
{
|
||||
protected $tagname = 'table';
|
||||
protected $allowed = array('id','class','style','width','summary','cellpadding','cellspacing','border');
|
||||
private $header = array();
|
||||
private $rows = array();
|
||||
private $rowindex = 0;
|
||||
private $colindex = 0;
|
||||
|
||||
|
||||
public function __construct($attrib = array())
|
||||
{
|
||||
$this->attrib = array_merge($attrib, array('summary' => '', 'border' => 0));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a table cell
|
||||
*
|
||||
* @param array Cell attributes
|
||||
* @param string Cell content
|
||||
*/
|
||||
public function add($attr, $cont)
|
||||
{
|
||||
if (is_string($attr)) {
|
||||
$attr = array('class' => $attr);
|
||||
}
|
||||
|
||||
$cell = new stdClass;
|
||||
$cell->attrib = $attr;
|
||||
$cell->content = $cont;
|
||||
|
||||
$this->rows[$this->rowindex]->cells[$this->colindex] = $cell;
|
||||
$this->colindex++;
|
||||
|
||||
if ($this->attrib['cols'] && $this->colindex == $this->attrib['cols']) {
|
||||
$this->add_row();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a table header cell
|
||||
*
|
||||
* @param array Cell attributes
|
||||
* @param string Cell content
|
||||
*/
|
||||
private function add_header($attr, $cont)
|
||||
{
|
||||
if (is_string($attr))
|
||||
$attr = array('class' => $attr);
|
||||
|
||||
$cell = new stdClass;
|
||||
$cell->attrib = $attr;
|
||||
$cell->content = $cont;
|
||||
$this->header[] = $cell;
|
||||
}
|
||||
|
||||
/**
|
||||
* Jump to next row
|
||||
*
|
||||
* @param array Row attributes
|
||||
*/
|
||||
private function add_row($attr = array())
|
||||
{
|
||||
$this->rowindex++;
|
||||
$this->colindex = 0;
|
||||
$this->rows[$this->rowindex] = new stdClass;
|
||||
$this->rows[$this->rowindex]->attrib = $attr;
|
||||
$this->rows[$this->rowindex]->cells = array();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Build HTML output of the table data
|
||||
*
|
||||
* @param array Table attributes
|
||||
* @return string The final table HTML code
|
||||
*/
|
||||
public function show($attr = array())
|
||||
{
|
||||
$this->attrib = array_merge($this->attrib, $attr);
|
||||
$thead = $tbody = "";
|
||||
|
||||
// include <thead>
|
||||
if (!empty($this->header)) {
|
||||
$rowcontent = '';
|
||||
foreach ($this->header as $c => $col) {
|
||||
$rowcontent .= self::tag('th', $col->attrib, $col->content);
|
||||
}
|
||||
$thead = self::tag('thead', null, self::tag('tr', null, $rowcontent));
|
||||
}
|
||||
|
||||
foreach ($this->rows as $r => $row) {
|
||||
$rowcontent = '';
|
||||
foreach ($row->cells as $c => $col) {
|
||||
$rowcontent .= self::tag('td', $col->attrib, $col->content);
|
||||
}
|
||||
|
||||
if ($r < $this->rowindex || count($row->cells)) {
|
||||
$tbody .= self::tag('tr', $rows->attrib, $rowcontent);
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->attrib['rowsonly']) {
|
||||
return $tbody;
|
||||
}
|
||||
|
||||
// add <tbody>
|
||||
$this->content = $thead . self::tag('tbody', null, $tbody);
|
||||
|
||||
unset($this->attrib['cols'], $this->attrib['rowsonly']);
|
||||
return parent::show();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| program/include/iniset.inc |
|
||||
| |
|
||||
| This file is part of the RoundCube Webmail client |
|
||||
| Copyright (C) 2008, RoundCube Dev, - Switzerland |
|
||||
| Licensed under the GNU GPL |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Setup the application envoronment required to process |
|
||||
| any request. |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Till Klampaeckel <till@php.net> |
|
||||
| Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
|
||||
$Id: cache.inc 88 2005-12-03 16:54:12Z roundcube $
|
||||
|
||||
*/
|
||||
|
||||
|
||||
// application constants
|
||||
define('RCMAIL_VERSION', '0.1-trunk');
|
||||
define('RCMAIL_CHARSET', 'UTF-8');
|
||||
define('JS_OBJECT_NAME', 'rcmail');
|
||||
|
||||
if (!defined('INSTALL_PATH')) {
|
||||
define('INSTALL_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');
|
||||
}
|
||||
|
||||
// make sure path_separator is defined
|
||||
if (!defined('PATH_SEPARATOR')) {
|
||||
define('PATH_SEPARATOR', (eregi('win', PHP_OS) ? ';' : ':'));
|
||||
}
|
||||
|
||||
// RC include folders MUST be included FIRST to avoid other
|
||||
// possible not compatible libraries (i.e PEAR) to be included
|
||||
// instead the ones provided by RC
|
||||
$include_path = INSTALL_PATH . PATH_SEPARATOR;
|
||||
$include_path.= INSTALL_PATH . 'program' . PATH_SEPARATOR;
|
||||
$include_path.= INSTALL_PATH . 'program/lib' . PATH_SEPARATOR;
|
||||
$include_path.= INSTALL_PATH . 'program/include' . PATH_SEPARATOR;
|
||||
$include_path.= ini_get('include_path');
|
||||
|
||||
if (set_include_path($include_path) === false) {
|
||||
die('Fatal error: ini_set/set_include_path does not work.');
|
||||
}
|
||||
|
||||
ini_set('session.name', 'roundcube_sessid');
|
||||
ini_set('session.use_cookies', 1);
|
||||
ini_set('session.gc_maxlifetime', 21600);
|
||||
ini_set('session.gc_divisor', 500);
|
||||
ini_set('error_reporting', E_ALL&~E_NOTICE);
|
||||
set_magic_quotes_runtime(0);
|
||||
|
||||
// increase maximum execution time for php scripts
|
||||
// (does not work in safe mode)
|
||||
if (!ini_get('safe_mode')) {
|
||||
set_time_limit(120);
|
||||
}
|
||||
|
||||
/**
|
||||
* Use PHP5 autoload for dynamic class loading
|
||||
*
|
||||
* @todo Make Zend, PEAR etc play with this
|
||||
*/
|
||||
function __autoload($classname)
|
||||
{
|
||||
$filename = preg_replace(
|
||||
array('/MDB2_(.+)/', '/Mail_(.+)/', '/^html_.+/', '/^utf8$/'),
|
||||
array('MDB2/\\1', 'Mail/\\1', 'html', 'utf8.class'),
|
||||
$classname
|
||||
);
|
||||
include_once $filename. '.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* Local callback function for PEAR errors
|
||||
*/
|
||||
function rcube_pear_error($err)
|
||||
{
|
||||
error_log(sprintf("%s (%s): %s",
|
||||
$err->getMessage(),
|
||||
$err->getCode(),
|
||||
$err->getUserinfo()), 0);
|
||||
}
|
||||
|
||||
// include global functions
|
||||
require_once 'include/bugs.inc';
|
||||
require_once 'include/main.inc';
|
||||
require_once 'include/rcube_shared.inc';
|
||||
|
||||
|
||||
// set PEAR error handling (will also load the PEAR main class)
|
||||
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'rcube_pear_error');
|
||||
|
@ -1,948 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| program/include/rcmail_template.inc |
|
||||
| |
|
||||
| This file is part of the RoundCube Webmail client |
|
||||
| Copyright (C) 2007, RoundCube Dev. - Switzerland |
|
||||
| Licensed under the GNU GPL |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Class to handle HTML page output using a skin template. |
|
||||
| Extends rcube_html_page class from rcube_html.inc |
|
||||
| |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
|
||||
$Id: $
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Classes and functions for HTML output
|
||||
*
|
||||
* @package View
|
||||
*/
|
||||
|
||||
require_once('include/rcube_html.inc');
|
||||
|
||||
|
||||
/**
|
||||
* Class to create HTML page output using a skin template
|
||||
*/
|
||||
class rcmail_template extends rcube_html_page
|
||||
{
|
||||
var $config;
|
||||
var $task = '';
|
||||
var $framed = false;
|
||||
var $ajax_call = false;
|
||||
var $pagetitle = '';
|
||||
var $env = array();
|
||||
var $js_env = array();
|
||||
var $js_commands = array();
|
||||
var $object_handlers = array();
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param array Configuration array
|
||||
* @param string Current task
|
||||
*/
|
||||
function __construct(&$config, $task)
|
||||
{
|
||||
$this->task = $task;
|
||||
$this->config = $config;
|
||||
$this->ajax_call = !empty($_GET['_remote']) || !empty($_POST['_remote']);
|
||||
|
||||
// add common javascripts
|
||||
if (!$this->ajax_call)
|
||||
{
|
||||
$javascript = "var ".JS_OBJECT_NAME." = new rcube_webmail();";
|
||||
|
||||
// don't wait for page onload. Call init at the bottom of the page (delayed)
|
||||
$javascript_foot = "if (window.call_init)\n call_init('".JS_OBJECT_NAME."');";
|
||||
|
||||
$this->add_script($javascript, 'head_top');
|
||||
$this->add_script($javascript_foot, 'foot');
|
||||
$this->scripts_path = 'program/js/';
|
||||
$this->include_script('common.js');
|
||||
$this->include_script('app.js');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* PHP 4 compatibility
|
||||
* @see rcmail_template::__construct()
|
||||
*/
|
||||
function rcmail_template(&$config, $task)
|
||||
{
|
||||
$this->__construct($config, $task);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set environment variable
|
||||
*
|
||||
* @param string Property name
|
||||
* @param mixed Property value
|
||||
* @param boolean True if this property should be added to client environment
|
||||
*/
|
||||
function set_env($name, $value, $addtojs=true)
|
||||
{
|
||||
$this->env[$name] = $value;
|
||||
if ($addtojs || isset($this->js_env[$name]))
|
||||
$this->js_env[$name] = $value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set page title variable
|
||||
*/
|
||||
function set_pagetitle($title)
|
||||
{
|
||||
$this->pagetitle = $title;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Register a template object handler
|
||||
*
|
||||
* @param string Object name
|
||||
* @param string Function name to call
|
||||
*/
|
||||
function add_handler($obj, $func)
|
||||
{
|
||||
$this->object_handlers[$obj] = $func;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a list of template object handlers
|
||||
*
|
||||
* @param array Hash array with object=>handler pairs
|
||||
*/
|
||||
function add_handlers($arr)
|
||||
{
|
||||
$this->object_handlers = array_merge($this->object_handlers, $arr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a GUI object to the client script
|
||||
*
|
||||
* @param string Object name
|
||||
* @param string Object ID
|
||||
*/
|
||||
function add_gui_object($obj, $id)
|
||||
{
|
||||
$this->add_script(JS_OBJECT_NAME.".gui_object('$obj', '$id');");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Call a client method
|
||||
*
|
||||
* @param string Method to call
|
||||
* @param ... Additional arguments
|
||||
*/
|
||||
function command()
|
||||
{
|
||||
$this->js_commands[] = func_get_args();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Invoke display_message command
|
||||
*
|
||||
* @param string Message to display
|
||||
* @param string Message type [notice|confirm|error]
|
||||
* @param array Key-value pairs to be replaced in localized text
|
||||
*/
|
||||
function show_message($message, $type='notice', $vars=NULL)
|
||||
{
|
||||
$this->command(
|
||||
'display_message',
|
||||
rcube_label(array('name' => $message, 'vars' => $vars)),
|
||||
$type);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Delete all stored env variables and commands
|
||||
*/
|
||||
function reset()
|
||||
{
|
||||
$this->env = array();
|
||||
$this->js_env = array();
|
||||
$this->js_commands = array();
|
||||
$this->object_handlers = array();
|
||||
parent::reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Send the request output to the client.
|
||||
* This will either parse a skin tempalte or send an AJAX response
|
||||
*
|
||||
* @param string Template name
|
||||
* @param boolean True if script should terminate (default)
|
||||
*/
|
||||
function send($templ=null, $exit=true)
|
||||
{
|
||||
if ($this->ajax_call)
|
||||
$this->remote_response('', !$exit);
|
||||
else if ($templ != 'iframe')
|
||||
$this->parse($templ, false);
|
||||
else
|
||||
{
|
||||
$this->framed = $templ == 'iframe' ? true : $this->framed;
|
||||
$this->write();
|
||||
}
|
||||
|
||||
if ($exit)
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send an AJAX response with executable JS code
|
||||
*
|
||||
* @param string Additional JS code
|
||||
* @param boolean True if output buffer should be flushed
|
||||
*/
|
||||
function remote_response($add='', $flush=false)
|
||||
{
|
||||
static $s_header_sent = FALSE;
|
||||
|
||||
if (!$s_header_sent)
|
||||
{
|
||||
$s_header_sent = TRUE;
|
||||
send_nocacheing_headers();
|
||||
header('Content-Type: application/x-javascript; charset='.RCMAIL_CHARSET);
|
||||
print '/** ajax response ['.date('d/M/Y h:i:s O')."] **/\n";
|
||||
}
|
||||
|
||||
// unset default env vars
|
||||
unset($this->js_env['task'], $this->js_env['action'], $this->js_env['comm_path']);
|
||||
|
||||
// send response code
|
||||
print rcube_charset_convert($this->get_js_commands() . $add, RCMAIL_CHARSET, $this->get_charset());
|
||||
|
||||
if ($flush) // flush the output buffer
|
||||
flush();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process template and write to stdOut
|
||||
*
|
||||
* @param string HTML template
|
||||
* @see rcube_html_page::write()
|
||||
*/
|
||||
function write($template='')
|
||||
{
|
||||
// unlock interface after iframe load
|
||||
if ($this->framed)
|
||||
array_unshift($this->js_commands, array('set_busy', false));
|
||||
|
||||
// write all env variables to client
|
||||
$js = $this->framed ? "if(window.parent) {\n" : '';
|
||||
$js .= $this->get_js_commands() . ($this->framed ? ' }' : '');
|
||||
$this->add_script($js, 'head_top');
|
||||
|
||||
// call super method
|
||||
parent::write($template, $this->config['skin_path']);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parse a specific skin template and deliver to stdout
|
||||
*
|
||||
* @param string Template name
|
||||
* @param boolean Exit script
|
||||
*/
|
||||
function parse($name='main', $exit=true)
|
||||
{
|
||||
$skin_path = $this->config['skin_path'];
|
||||
|
||||
// read template file
|
||||
$templ = '';
|
||||
$path = "$skin_path/templates/$name.html";
|
||||
|
||||
if($fp = @fopen($path, 'r'))
|
||||
{
|
||||
$templ = fread($fp, filesize($path));
|
||||
fclose($fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
raise_error(array(
|
||||
'code' => 501,
|
||||
'type' => 'php',
|
||||
'line' => __LINE__,
|
||||
'file' => __FILE__,
|
||||
'message' => "Error loading template for '$name'"), TRUE, TRUE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// parse for specialtags
|
||||
$output = $this->parse_xml($this->parse_conditions($templ));
|
||||
|
||||
// add debug console
|
||||
if ($this->config['debug_level'] & 8)
|
||||
$this->add_footer('<div style="position:absolute;top:5px;left:5px;width:400px;padding:0.2em;background:white;opacity:0.8;z-index:9000">
|
||||
<a href="#toggle" onclick="con=document.getElementById(\'dbgconsole\');con.style.display=(con.style.display==\'none\'?\'block\':\'none\');return false">console</a>
|
||||
<form action="/" name="debugform"><textarea name="console" id="dbgconsole" rows="20" cols="40" wrap="off" style="display:none;width:400px;border:none;font-size:x-small"></textarea></form></div>');
|
||||
|
||||
$this->write(trim($this->parse_with_globals($output)), $skin_path);
|
||||
|
||||
if ($exit)
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return executable javascript code for all registered commands
|
||||
* @access private
|
||||
*/
|
||||
function get_js_commands()
|
||||
{
|
||||
$out = '';
|
||||
if (!$this->framed && !empty($this->js_env))
|
||||
$out .= ($this->ajax_call ? 'this' : JS_OBJECT_NAME) . '.set_env('.json_serialize($this->js_env).");\n";
|
||||
|
||||
// add command to set page title
|
||||
if ($this->ajax_call && !empty($this->pagetitle))
|
||||
$out .= sprintf(
|
||||
"this.set_pagetitle('%s');\n",
|
||||
JQ((!empty($this->config['product_name']) ? $this->config['product_name'].' :: ' : '') . $this->pagetitle)
|
||||
);
|
||||
|
||||
foreach ($this->js_commands as $i => $args)
|
||||
{
|
||||
$method = array_shift($args);
|
||||
foreach ($args as $i => $arg)
|
||||
$args[$i] = json_serialize($arg);
|
||||
|
||||
$parent = $this->framed || preg_match('/^parent\./', $method);
|
||||
$out .= sprintf(
|
||||
"%s.%s(%s);\n",
|
||||
$this->ajax_call ? 'this' : ($parent ? 'parent.' : '') . JS_OBJECT_NAME,
|
||||
preg_replace('/^parent\./', '', $method),
|
||||
join(',', $args));
|
||||
}
|
||||
|
||||
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make URLs starting with a slash point to skin directory
|
||||
* @access private
|
||||
*/
|
||||
function abs_url($str)
|
||||
{
|
||||
return preg_replace('/^\//', $this->config['skin_path'].'/', $str);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***** Template parsing methods *****/
|
||||
|
||||
/**
|
||||
* Replace all strings ($varname)
|
||||
* with the content of the according global variable.
|
||||
* @access private
|
||||
*/
|
||||
function parse_with_globals($input)
|
||||
{
|
||||
$GLOBALS['__comm_path'] = Q($GLOBALS['COMM_PATH']);
|
||||
return preg_replace('/\$(__[a-z0-9_\-]+)/e', '$GLOBALS["\\1"]', $input);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parse for conditional tags
|
||||
* @access private
|
||||
*/
|
||||
function parse_conditions($input)
|
||||
{
|
||||
if (($matches = preg_split('/<roundcube:(if|elseif|else|endif)\s+([^>]+)>/is', $input, 2, PREG_SPLIT_DELIM_CAPTURE)) && count($matches)==4)
|
||||
{
|
||||
if (preg_match('/^(else|endif)$/i', $matches[1]))
|
||||
return $matches[0] . $this->parse_conditions($matches[3]);
|
||||
else
|
||||
{
|
||||
$attrib = parse_attrib_string($matches[2]);
|
||||
if (isset($attrib['condition']))
|
||||
{
|
||||
$condmet = $this->check_condition($attrib['condition']);
|
||||
$submatches = preg_split('/<roundcube:(elseif|else|endif)\s+([^>]+)>/is', $matches[3], 2, PREG_SPLIT_DELIM_CAPTURE);
|
||||
|
||||
if ($condmet)
|
||||
$result = $submatches[0] . ($submatches[1] != 'endif' ? preg_replace('/.*<roundcube:endif\s+[^>]+>/Uis', '', $submatches[3], 1) : $submatches[3]);
|
||||
else
|
||||
$result = "<roundcube:$submatches[1] $submatches[2]>" . $submatches[3];
|
||||
|
||||
return $matches[0] . $this->parse_conditions($result);
|
||||
}
|
||||
else
|
||||
{
|
||||
raise_error(array('code' => 500, 'type' => 'php', 'line' => __LINE__, 'file' => __FILE__,
|
||||
'message' => "Unable to parse conditional tag " . $matches[2]), TRUE, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $input;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Determines if a given condition is met
|
||||
*
|
||||
* @return True if condition is valid, False is not
|
||||
* @access private
|
||||
*/
|
||||
function check_condition($condition)
|
||||
{
|
||||
$condition = preg_replace(
|
||||
array('/session:([a-z0-9_]+)/i', '/config:([a-z0-9_]+)/i', '/env:([a-z0-9_]+)/i', '/request:([a-z0-9_]+)/ie'),
|
||||
array("\$_SESSION['\\1']", "\$this->config['\\1']", "\$this->env['\\1']", "get_input_value('\\1', RCUBE_INPUT_GPC)"),
|
||||
$condition);
|
||||
|
||||
return @eval("return (".$condition.");");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Search for special tags in input and replace them
|
||||
* with the appropriate content
|
||||
*
|
||||
* @param string Input string to parse
|
||||
* @return Altered input string
|
||||
* @access private
|
||||
*/
|
||||
function parse_xml($input)
|
||||
{
|
||||
return preg_replace('/<roundcube:([-_a-z]+)\s+([^>]+)>/Uie', "\$this->xml_command('\\1', '\\2')", $input);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a xml command tag into real content
|
||||
*
|
||||
* @param string Tag command: object,button,label, etc.
|
||||
* @param string Attribute string
|
||||
* @return Tag/Object content string
|
||||
* @access private
|
||||
*/
|
||||
function xml_command($command, $str_attrib, $add_attrib=array())
|
||||
{
|
||||
$command = strtolower($command);
|
||||
$attrib = parse_attrib_string($str_attrib) + $add_attrib;
|
||||
|
||||
// empty output if required condition is not met
|
||||
if (!empty($attrib['condition']) && !$this->check_condition($attrib['condition']))
|
||||
return '';
|
||||
|
||||
// execute command
|
||||
switch ($command)
|
||||
{
|
||||
// return a button
|
||||
case 'button':
|
||||
return $this->button($attrib);
|
||||
break;
|
||||
|
||||
// show a label
|
||||
case 'label':
|
||||
if ($attrib['name'] || $attrib['command'])
|
||||
return Q(rcube_label($attrib + array('vars' => array('product' => $this->config['product_name']))));
|
||||
break;
|
||||
|
||||
// include a file
|
||||
case 'include':
|
||||
$path = realpath($this->config['skin_path'].$attrib['file']);
|
||||
if (filesize($path))
|
||||
{
|
||||
if ($this->config['skin_include_php'])
|
||||
$incl = $this->include_php($path);
|
||||
else if ($fp = @fopen($path, 'r'))
|
||||
{
|
||||
$incl = fread($fp, filesize($path));
|
||||
fclose($fp);
|
||||
}
|
||||
return $this->parse_xml($incl);
|
||||
}
|
||||
break;
|
||||
|
||||
// return code for a specific application object
|
||||
case 'object':
|
||||
$object = strtolower($attrib['name']);
|
||||
|
||||
// execute object handler function
|
||||
if ($this->object_handlers[$object] && function_exists($this->object_handlers[$object]))
|
||||
return call_user_func($this->object_handlers[$object], $attrib);
|
||||
|
||||
else if ($object=='productname')
|
||||
{
|
||||
$name = !empty($this->config['product_name']) ? $this->config['product_name'] : 'RoundCube Webmail';
|
||||
return Q($name);
|
||||
}
|
||||
else if ($object=='version')
|
||||
{
|
||||
return (string)RCMAIL_VERSION;
|
||||
}
|
||||
else if ($object=='pagetitle')
|
||||
{
|
||||
$task = $this->task;
|
||||
$title = !empty($this->config['product_name']) ? $this->config['product_name'].' :: ' : '';
|
||||
|
||||
if (!empty($this->pagetitle))
|
||||
$title .= $this->pagetitle;
|
||||
else if ($task == 'login')
|
||||
$title = rcube_label(array('name' => 'welcome', 'vars' => array('product' => $this->config['product_name'])));
|
||||
else
|
||||
$title .= ucfirst($task);
|
||||
|
||||
return Q($title);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
// return variable
|
||||
case 'var':
|
||||
$var = explode(':', $attrib['name']);
|
||||
$name = $var[1];
|
||||
$value = '';
|
||||
|
||||
switch ($var[0])
|
||||
{
|
||||
case 'env':
|
||||
$value = $this->env[$name];
|
||||
break;
|
||||
case 'config':
|
||||
$value = $this->config[$name];
|
||||
if (is_array($value) && $value[$_SESSION['imap_host']])
|
||||
$value = $value[$_SESSION['imap_host']];
|
||||
break;
|
||||
case 'request':
|
||||
$value = get_input_value($name, RCUBE_INPUT_GPC);
|
||||
break;
|
||||
case 'session':
|
||||
$value = $_SESSION[$name];
|
||||
break;
|
||||
}
|
||||
|
||||
if (is_array($value))
|
||||
$value = join(", ", $value);
|
||||
|
||||
return Q($value);
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Include a specific file and return it's contents
|
||||
*
|
||||
* @param string File path
|
||||
* @return string Contents of the processed file
|
||||
*/
|
||||
function include_php($file)
|
||||
{
|
||||
ob_start();
|
||||
@include($file);
|
||||
$out = ob_get_contents();
|
||||
ob_end_clean();
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create and register a button
|
||||
*
|
||||
* @param array Button attributes
|
||||
* @return HTML button
|
||||
* @access private
|
||||
*/
|
||||
function button($attrib)
|
||||
{
|
||||
global $CONFIG, $OUTPUT, $BROWSER, $MAIN_TASKS;
|
||||
static $sa_buttons = array();
|
||||
static $s_button_count = 100;
|
||||
|
||||
// these commands can be called directly via url
|
||||
$a_static_commands = array('compose', 'list');
|
||||
|
||||
$skin_path = $this->config['skin_path'];
|
||||
|
||||
if (!($attrib['command'] || $attrib['name'] || $attrib['onclick']))
|
||||
return '';
|
||||
|
||||
// try to find out the button type
|
||||
if ($attrib['type'])
|
||||
$attrib['type'] = strtolower($attrib['type']);
|
||||
else
|
||||
$attrib['type'] = ($attrib['image'] || $attrib['imagepas'] || $attrib['imageact']) ? 'image' : 'link';
|
||||
|
||||
$command = $attrib['command'];
|
||||
|
||||
// take the button from the stack
|
||||
if($attrib['name'] && $sa_buttons[$attrib['name']])
|
||||
$attrib = $sa_buttons[$attrib['name']];
|
||||
|
||||
// add button to button stack
|
||||
else if($attrib['image'] || $attrib['imageact'] || $attrib['imagepas'] || $attrib['class'])
|
||||
{
|
||||
if (!$attrib['name'])
|
||||
$attrib['name'] = $command;
|
||||
|
||||
if (!$attrib['image'])
|
||||
$attrib['image'] = $attrib['imagepas'] ? $attrib['imagepas'] : $attrib['imageact'];
|
||||
|
||||
$sa_buttons[$attrib['name']] = $attrib;
|
||||
}
|
||||
|
||||
// get saved button for this command/name
|
||||
else if ($command && $sa_buttons[$command])
|
||||
$attrib = $sa_buttons[$command];
|
||||
|
||||
//else
|
||||
// return '';
|
||||
|
||||
|
||||
// set border to 0 because of the link arround the button
|
||||
if ($attrib['type']=='image' && !isset($attrib['border']))
|
||||
$attrib['border'] = 0;
|
||||
|
||||
if (!$attrib['id'])
|
||||
$attrib['id'] = sprintf('rcmbtn%d', $s_button_count++);
|
||||
|
||||
// get localized text for labels and titles
|
||||
if ($attrib['title'])
|
||||
$attrib['title'] = Q(rcube_label($attrib['title']));
|
||||
if ($attrib['label'])
|
||||
$attrib['label'] = Q(rcube_label($attrib['label']));
|
||||
|
||||
if ($attrib['alt'])
|
||||
$attrib['alt'] = Q(rcube_label($attrib['alt']));
|
||||
|
||||
// set title to alt attribute for IE browsers
|
||||
if ($BROWSER['ie'] && $attrib['title'] && !$attrib['alt'])
|
||||
{
|
||||
$attrib['alt'] = $attrib['title'];
|
||||
unset($attrib['title']);
|
||||
}
|
||||
|
||||
// add empty alt attribute for XHTML compatibility
|
||||
if (!isset($attrib['alt']))
|
||||
$attrib['alt'] = '';
|
||||
|
||||
|
||||
// register button in the system
|
||||
if ($attrib['command'])
|
||||
{
|
||||
$this->add_script(sprintf(
|
||||
"%s.register_button('%s', '%s', '%s', '%s', '%s', '%s');",
|
||||
JS_OBJECT_NAME,
|
||||
$command,
|
||||
$attrib['id'],
|
||||
$attrib['type'],
|
||||
$attrib['imageact'] ? $skin_path.$attrib['imageact'] : $attrib['classact'],
|
||||
$attrib['imagesel'] ? $skin_path.$attrib['imagesel'] : $attrib['classsel'],
|
||||
$attrib['imageover'] ? $skin_path.$attrib['imageover'] : '')
|
||||
);
|
||||
|
||||
// make valid href to specific buttons
|
||||
if (in_array($attrib['command'], $MAIN_TASKS))
|
||||
$attrib['href'] = Q(rcmail_url(null, null, $attrib['command']));
|
||||
else if (in_array($attrib['command'], $a_static_commands))
|
||||
$attrib['href'] = Q(rcmail_url($attrib['command']));
|
||||
}
|
||||
|
||||
// overwrite attributes
|
||||
if (!$attrib['href'])
|
||||
$attrib['href'] = '#';
|
||||
|
||||
if ($command)
|
||||
$attrib['onclick'] = sprintf("return %s.command('%s','%s',this)", JS_OBJECT_NAME, $command, $attrib['prop']);
|
||||
|
||||
if ($command && $attrib['imageover'])
|
||||
{
|
||||
$attrib['onmouseover'] = sprintf("return %s.button_over('%s','%s')", JS_OBJECT_NAME, $command, $attrib['id']);
|
||||
$attrib['onmouseout'] = sprintf("return %s.button_out('%s','%s')", JS_OBJECT_NAME, $command, $attrib['id']);
|
||||
}
|
||||
|
||||
if ($command && $attrib['imagesel'])
|
||||
{
|
||||
$attrib['onmousedown'] = sprintf("return %s.button_sel('%s','%s')", JS_OBJECT_NAME, $command, $attrib['id']);
|
||||
$attrib['onmouseup'] = sprintf("return %s.button_out('%s','%s')", JS_OBJECT_NAME, $command, $attrib['id']);
|
||||
}
|
||||
|
||||
$out = '';
|
||||
|
||||
// generate image tag
|
||||
if ($attrib['type']=='image')
|
||||
{
|
||||
$attrib_str = create_attrib_string($attrib, array('style', 'class', 'id', 'width', 'height', 'border', 'hspace', 'vspace', 'align', 'alt'));
|
||||
$img_tag = sprintf('<img src="%%s"%s />', $attrib_str);
|
||||
$btn_content = sprintf($img_tag, $skin_path.$attrib['image']);
|
||||
if ($attrib['label'])
|
||||
$btn_content .= ' '.$attrib['label'];
|
||||
|
||||
$link_attrib = array('href', 'onclick', 'onmouseover', 'onmouseout', 'onmousedown', 'onmouseup', 'title');
|
||||
}
|
||||
else if ($attrib['type']=='link')
|
||||
{
|
||||
$btn_content = $attrib['label'] ? $attrib['label'] : $attrib['command'];
|
||||
$link_attrib = array('href', 'onclick', 'title', 'id', 'class', 'style');
|
||||
}
|
||||
else if ($attrib['type']=='input')
|
||||
{
|
||||
$attrib['type'] = 'button';
|
||||
|
||||
if ($attrib['label'])
|
||||
$attrib['value'] = $attrib['label'];
|
||||
|
||||
$attrib_str = create_attrib_string($attrib, array('type', 'value', 'onclick', 'id', 'class', 'style'));
|
||||
$out = sprintf('<input%s disabled="disabled" />', $attrib_str);
|
||||
}
|
||||
|
||||
// generate html code for button
|
||||
if ($btn_content)
|
||||
{
|
||||
$attrib_str = create_attrib_string($attrib, $link_attrib);
|
||||
$out = sprintf('<a%s>%s</a>', $attrib_str, $btn_content);
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
} // end class rcmail_template
|
||||
|
||||
|
||||
|
||||
// ************** common functions delivering gui objects **************
|
||||
|
||||
|
||||
/**
|
||||
* Builder for GUI object 'message'
|
||||
*
|
||||
* @param array Named tag parameters
|
||||
* @return string HTML code for the gui object
|
||||
*/
|
||||
function rcmail_message_container($attrib)
|
||||
{
|
||||
global $OUTPUT;
|
||||
|
||||
if (!$attrib['id'])
|
||||
$attrib['id'] = 'rcmMessageContainer';
|
||||
|
||||
// allow the following attributes to be added to the <table> tag
|
||||
$attrib_str = create_attrib_string($attrib, array('style', 'class', 'id'));
|
||||
$out = '<div' . $attrib_str . "></div>";
|
||||
|
||||
$OUTPUT->add_gui_object('message', $attrib['id']);
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* GUI object 'username'
|
||||
* Showing IMAP username of the current session
|
||||
*
|
||||
* @param array Named tag parameters (currently not used)
|
||||
* @return string HTML code for the gui object
|
||||
*/
|
||||
function rcmail_current_username($attrib)
|
||||
{
|
||||
global $USER;
|
||||
static $s_username;
|
||||
|
||||
// alread fetched
|
||||
if (!empty($s_username))
|
||||
return $s_username;
|
||||
|
||||
if ($sql_arr = $USER->get_identity())
|
||||
$s_username = $sql_arr['email'];
|
||||
else if (strstr($_SESSION['username'], '@'))
|
||||
$s_username = $_SESSION['username'];
|
||||
else
|
||||
$s_username = $_SESSION['username'].'@'.$_SESSION['imap_host'];
|
||||
|
||||
return $s_username;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* GUI object 'loginform'
|
||||
* Returns code for the webmail login form
|
||||
*
|
||||
* @param array Named parameters
|
||||
* @return string HTML code for the gui object
|
||||
*/
|
||||
function rcmail_login_form($attrib)
|
||||
{
|
||||
global $CONFIG, $OUTPUT, $SESS_HIDDEN_FIELD;
|
||||
|
||||
$labels = array();
|
||||
$labels['user'] = rcube_label('username');
|
||||
$labels['pass'] = rcube_label('password');
|
||||
$labels['host'] = rcube_label('server');
|
||||
|
||||
$input_user = new textfield(array('name' => '_user', 'id' => 'rcmloginuser', 'size' => 30) + $attrib);
|
||||
$input_pass = new passwordfield(array('name' => '_pass', 'id' => 'rcmloginpwd', 'size' => 30) + $attrib);
|
||||
$input_action = new hiddenfield(array('name' => '_action', 'value' => 'login'));
|
||||
|
||||
$fields = array();
|
||||
$fields['user'] = $input_user->show(get_input_value('_user', RCUBE_INPUT_POST));
|
||||
$fields['pass'] = $input_pass->show();
|
||||
$fields['action'] = $input_action->show();
|
||||
|
||||
if (is_array($CONFIG['default_host']))
|
||||
{
|
||||
$select_host = new select(array('name' => '_host', 'id' => 'rcmloginhost'));
|
||||
|
||||
foreach ($CONFIG['default_host'] as $key => $value)
|
||||
{
|
||||
if (!is_array($value))
|
||||
$select_host->add($value, (is_numeric($key) ? $value : $key));
|
||||
else
|
||||
{
|
||||
unset($select_host);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$fields['host'] = isset($select_host) ? $select_host->show(get_input_value('_host', RCUBE_INPUT_POST)) : null;
|
||||
}
|
||||
else if (!strlen($CONFIG['default_host']))
|
||||
{
|
||||
$input_host = new textfield(array('name' => '_host', 'id' => 'rcmloginhost', 'size' => 30));
|
||||
$fields['host'] = $input_host->show(get_input_value('_host', RCUBE_INPUT_POST));
|
||||
}
|
||||
|
||||
$form_name = strlen($attrib['form']) ? $attrib['form'] : 'form';
|
||||
$form_start = !strlen($attrib['form']) ? '<form name="form" action="./" method="post">' : '';
|
||||
$form_end = !strlen($attrib['form']) ? '</form>' : '';
|
||||
|
||||
if ($fields['host'])
|
||||
$form_host = <<<EOF
|
||||
|
||||
</tr><tr>
|
||||
|
||||
<td class="title"><label for="rcmloginhost">$labels[host]</label></td>
|
||||
<td>$fields[host]</td>
|
||||
|
||||
EOF;
|
||||
|
||||
$OUTPUT->add_gui_object('loginform', $form_name);
|
||||
|
||||
$out = <<<EOF
|
||||
$form_start
|
||||
$SESS_HIDDEN_FIELD
|
||||
$fields[action]
|
||||
<table><tr>
|
||||
|
||||
<td class="title"><label for="rcmloginuser">$labels[user]</label></td>
|
||||
<td>$fields[user]</td>
|
||||
|
||||
</tr><tr>
|
||||
|
||||
<td class="title"><label for="rcmloginpwd">$labels[pass]</label></td>
|
||||
<td>$fields[pass]</td>
|
||||
$form_host
|
||||
</tr></table>
|
||||
$form_end
|
||||
EOF;
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* GUI object 'charsetselector'
|
||||
*
|
||||
* @param array Named parameters for the select tag
|
||||
* @return string HTML code for the gui object
|
||||
*/
|
||||
function rcmail_charset_selector($attrib)
|
||||
{
|
||||
global $OUTPUT;
|
||||
|
||||
// pass the following attributes to the form class
|
||||
$field_attrib = array('name' => '_charset');
|
||||
foreach ($attrib as $attr => $value)
|
||||
if (in_array($attr, array('id', 'class', 'style', 'size', 'tabindex')))
|
||||
$field_attrib[$attr] = $value;
|
||||
|
||||
$charsets = array(
|
||||
'US-ASCII' => 'ASCII (English)',
|
||||
'EUC-JP' => 'EUC-JP (Japanese)',
|
||||
'EUC-KR' => 'EUC-KR (Korean)',
|
||||
'BIG5' => 'BIG5 (Chinese)',
|
||||
'GB2312' => 'GB2312 (Chinese)',
|
||||
'ISO-2022-JP' => 'ISO-2022-JP (Japanese)',
|
||||
'ISO-8859-1' => 'ISO-8859-1 (Latin-1)',
|
||||
'ISO-8859-2' => 'ISO-8895-2 (Central European)',
|
||||
'ISO-8859-7' => 'ISO-8859-7 (Greek)',
|
||||
'ISO-8859-9' => 'ISO-8859-9 (Turkish)',
|
||||
'Windows-1251' => 'Windows-1251 (Cyrillic)',
|
||||
'Windows-1252' => 'Windows-1252 (Western)',
|
||||
'Windows-1255' => 'Windows-1255 (Hebrew)',
|
||||
'Windows-1256' => 'Windows-1256 (Arabic)',
|
||||
'Windows-1257' => 'Windows-1257 (Baltic)',
|
||||
'UTF-8' => 'UTF-8'
|
||||
);
|
||||
|
||||
$select = new select($field_attrib);
|
||||
$select->add(array_values($charsets), array_keys($charsets));
|
||||
|
||||
$set = $_POST['_charset'] ? $_POST['_charset'] : $OUTPUT->get_charset();
|
||||
return $select->show($set);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* GUI object 'searchform'
|
||||
* Returns code for search function
|
||||
*
|
||||
* @param array Named parameters
|
||||
* @return string HTML code for the gui object
|
||||
*/
|
||||
function rcmail_search_form($attrib)
|
||||
{
|
||||
global $OUTPUT;
|
||||
|
||||
// add some labels to client
|
||||
rcube_add_label('searching');
|
||||
|
||||
$attrib['name'] = '_q';
|
||||
|
||||
if (empty($attrib['id']))
|
||||
$attrib['id'] = 'rcmqsearchbox';
|
||||
|
||||
$input_q = new textfield($attrib);
|
||||
$out = $input_q->show();
|
||||
|
||||
$OUTPUT->add_gui_object('qsearchbox', $attrib['id']);
|
||||
|
||||
// add form tag around text field
|
||||
if (empty($attrib['form']))
|
||||
$out = sprintf(
|
||||
'<form name="rcmqsearchform" action="./" '.
|
||||
'onsubmit="%s.command(\'search\');return false" style="display:inline;">%s</form>',
|
||||
JS_OBJECT_NAME,
|
||||
$out);
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
|
||||
?>
|
@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| program/include/rcube_browser.php |
|
||||
| |
|
||||
| This file is part of the RoundCube Webmail client |
|
||||
| Copyright (C) 2007-2008, RoundCube Dev. - Switzerland |
|
||||
| Licensed under the GNU GPL |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Class representing the client browser's properties |
|
||||
| |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
|
||||
$Id: rcube_browser.php 328 2006-08-30 17:41:21Z thomasb $
|
||||
|
||||
*/
|
||||
|
||||
/**
|
||||
* rcube_browser
|
||||
*
|
||||
* Provide details about the client's browser based on the User-Agent header
|
||||
*
|
||||
* @package Core
|
||||
*/
|
||||
class rcube_browser
|
||||
{
|
||||
function __construct()
|
||||
{
|
||||
$HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
|
||||
|
||||
$this->ver = 0;
|
||||
$this->win = stristr($HTTP_USER_AGENT, 'win');
|
||||
$this->mac = stristr($HTTP_USER_AGENT, 'mac');
|
||||
$this->linux = stristr($HTTP_USER_AGENT, 'linux');
|
||||
$this->unix = stristr($HTTP_USER_AGENT, 'unix');
|
||||
|
||||
$this->ns4 = stristr($HTTP_USER_AGENT, 'mozilla/4') && !stristr($HTTP_USER_AGENT, 'msie');
|
||||
$this->ns = ($this->ns4 || stristr($HTTP_USER_AGENT, 'netscape'));
|
||||
$this->ie = stristr($HTTP_USER_AGENT, 'msie');
|
||||
$this->mz = stristr($HTTP_USER_AGENT, 'mozilla/5');
|
||||
$this->opera = stristr($HTTP_USER_AGENT, 'opera');
|
||||
$this->safari = stristr($HTTP_USER_AGENT, 'safari');
|
||||
|
||||
if ($this->ns) {
|
||||
$test = eregi("mozilla\/([0-9\.]+)", $HTTP_USER_AGENT, $regs);
|
||||
$this->ver = $test ? (float)$regs[1] : 0;
|
||||
}
|
||||
if ($this->mz) {
|
||||
$test = ereg("rv:([0-9\.]+)", $HTTP_USER_AGENT, $regs);
|
||||
$this->ver = $test ? (float)$regs[1] : 0;
|
||||
}
|
||||
if($this->ie) {
|
||||
$test = eregi("msie ([0-9\.]+)", $HTTP_USER_AGENT, $regs);
|
||||
$this->ver = $test ? (float)$regs[1] : 0;
|
||||
}
|
||||
if ($this->opera) {
|
||||
$test = eregi("opera ([0-9\.]+)", $HTTP_USER_AGENT, $regs);
|
||||
$this->ver = $test ? (float)$regs[1] : 0;
|
||||
}
|
||||
|
||||
if (eregi(" ([a-z]{2})-([a-z]{2})", $HTTP_USER_AGENT, $regs))
|
||||
$this->lang = $regs[1];
|
||||
else
|
||||
$this->lang = 'en';
|
||||
|
||||
$this->dom = ($this->mz || $this->safari || ($this->ie && $this->ver>=5) || ($this->opera && $this->ver>=7));
|
||||
$this->pngalpha = $this->mz || $this->safari || ($this->ie && $this->ver>=5.5) ||
|
||||
($this->ie && $this->ver>=5 && $this->mac) || ($this->opera && $this->ver>=7) ? true : false;
|
||||
}
|
||||
}
|
||||
|
@ -1,667 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| rcube_html.inc |
|
||||
| |
|
||||
| This file is part of the RoundCube PHP suite |
|
||||
| Copyright (C) 2005-2007, RoundCube Dev. - Switzerland |
|
||||
| Licensed under the GNU GPL |
|
||||
| |
|
||||
| CONTENTS: |
|
||||
| Common Classes to create HTML output |
|
||||
| |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
|
||||
$Id: $
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* HTML page builder class
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class rcube_html_page
|
||||
{
|
||||
var $scripts_path = '';
|
||||
var $script_files = array();
|
||||
var $scripts = array();
|
||||
var $charset = 'UTF-8';
|
||||
|
||||
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 $title = 'RoundCube Mail';
|
||||
var $header = '';
|
||||
var $footer = '';
|
||||
var $body = '';
|
||||
var $body_attrib = array();
|
||||
var $meta_tags = array();
|
||||
|
||||
|
||||
/**
|
||||
* Link an external script file
|
||||
*
|
||||
* @param string File URL
|
||||
* @param string Target position [head|foot]
|
||||
*/
|
||||
function include_script($file, $position='head')
|
||||
{
|
||||
static $sa_files = array();
|
||||
|
||||
if (in_array($file, $sa_files))
|
||||
return;
|
||||
|
||||
if (!is_array($this->script_files[$position]))
|
||||
$this->script_files[$position] = array();
|
||||
|
||||
$this->script_files[$position][] = $file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add inline javascript code
|
||||
*
|
||||
* @param string JS code snippet
|
||||
* @param string Target position [head|head_top|foot]
|
||||
*/
|
||||
function add_script($script, $position='head')
|
||||
{
|
||||
if (!isset($this->scripts[$position]))
|
||||
$this->scripts[$position] = "\n".rtrim($script);
|
||||
else
|
||||
$this->scripts[$position] .= "\n".rtrim($script);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add HTML code to the page header
|
||||
*/
|
||||
function add_header($str)
|
||||
{
|
||||
$this->header .= "\n".$str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add HTML code to the page footer
|
||||
* To be added right befor </body>
|
||||
*/
|
||||
function add_footer($str)
|
||||
{
|
||||
$this->footer .= "\n".$str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for page title
|
||||
*/
|
||||
function set_title($t)
|
||||
{
|
||||
$this->title = $t;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Setter for output charset.
|
||||
* To be specified in a meta tag and sent as http-header
|
||||
*/
|
||||
function set_charset($charset)
|
||||
{
|
||||
global $MBSTRING;
|
||||
|
||||
$this->charset = $charset;
|
||||
|
||||
if ($MBSTRING && function_exists("mb_internal_encoding"))
|
||||
{
|
||||
if(!@mb_internal_encoding($charset))
|
||||
$MBSTRING = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter for output charset
|
||||
*/
|
||||
function get_charset()
|
||||
{
|
||||
return $this->charset;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reset all saved properties
|
||||
*/
|
||||
function reset()
|
||||
{
|
||||
$this->script_files = array();
|
||||
$this->scripts = array();
|
||||
$this->title = '';
|
||||
$this->header = '';
|
||||
$this->footer = '';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process template and write to stdOut
|
||||
*
|
||||
* @param string HTML template
|
||||
* @param string Base for absolute paths
|
||||
*/
|
||||
function write($templ='', $base_path='')
|
||||
{
|
||||
$output = empty($templ) ? $this->default_template : trim($templ);
|
||||
|
||||
// replace specialchars in content
|
||||
$__page_title = Q($this->title, 'show', FALSE);
|
||||
$__page_header = $__page_body = $__page_footer = '';
|
||||
|
||||
|
||||
// include meta tag with charset
|
||||
if (!empty($this->charset))
|
||||
{
|
||||
header('Content-Type: text/html; charset='.$this->charset, true);
|
||||
$__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
|
||||
if (is_array($this->script_files['head']))
|
||||
foreach ($this->script_files['head'] as $file)
|
||||
$__page_header .= sprintf($this->script_tag_file, $this->scripts_path, $file);
|
||||
|
||||
$head_script = $this->scripts['head_top'] . $this->scripts['head'];
|
||||
if (!empty($head_script))
|
||||
$__page_header .= sprintf($this->script_tag, $head_script);
|
||||
|
||||
if (!empty($this->header))
|
||||
$__page_header .= $this->header;
|
||||
|
||||
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 (!empty($this->scripts['foot']))
|
||||
$__page_footer .= sprintf($this->script_tag, $this->scripts['foot']);
|
||||
|
||||
if (!empty($this->footer))
|
||||
$__page_footer .= $this->footer;
|
||||
|
||||
// find page header
|
||||
if ($hpos = strpos(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')))
|
||||
{
|
||||
while($output[$hpos]!='>')
|
||||
$hpos++;
|
||||
$hpos++;
|
||||
}
|
||||
|
||||
$__page_header = "<head>\n<title>$__page_title</title>\n$__page_header\n</head>\n";
|
||||
}
|
||||
|
||||
// add page hader
|
||||
if ($hpos)
|
||||
$output = substr($output,0,$hpos) . $__page_header . substr($output,$hpos,strlen($output));
|
||||
else
|
||||
$output = $__page_header . $output;
|
||||
|
||||
|
||||
// find page body
|
||||
if($bpos = strpos(strtolower($output), '<body'))
|
||||
{
|
||||
while($output[$bpos]!='>') $bpos++;
|
||||
$bpos++;
|
||||
}
|
||||
else
|
||||
$bpos = strpos(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));
|
||||
|
||||
|
||||
// find and add page footer
|
||||
$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";
|
||||
|
||||
|
||||
// reset those global vars
|
||||
$__page_header = $__page_footer = '';
|
||||
|
||||
|
||||
// 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 rcube_charset_convert($output, 'UTF-8', $this->charset);
|
||||
}
|
||||
|
||||
} // end class rcube_html_page
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Base class to build a HTML for element
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class rcube_form_element
|
||||
{
|
||||
var $uppertags = FALSE;
|
||||
var $upperattribs = FALSE;
|
||||
var $upperprops = FALSE;
|
||||
var $newline = FALSE;
|
||||
|
||||
var $attrib = array();
|
||||
|
||||
|
||||
/**
|
||||
* Create string with saved attributes
|
||||
*
|
||||
* @return string HTML formatted tag attributes
|
||||
*/
|
||||
function create_attrib_string()
|
||||
{
|
||||
if (!sizeof($this->attrib))
|
||||
return '';
|
||||
|
||||
if ($this->name!='')
|
||||
$this->attrib['name'] = $this->name;
|
||||
|
||||
$attrib_arr = array();
|
||||
foreach ($this->attrib as $key => $value)
|
||||
{
|
||||
// don't output some internally used attributes
|
||||
if (in_array($key, array('form', 'quicksearch')))
|
||||
continue;
|
||||
|
||||
// skip if size if not numeric
|
||||
if (($key=='size' && !is_numeric($value)))
|
||||
continue;
|
||||
|
||||
// skip empty eventhandlers
|
||||
if ((strpos($key,'on')===0 && $value==''))
|
||||
continue;
|
||||
|
||||
// attributes with no value
|
||||
if (in_array($key, array('checked', 'multiple', 'disabled', 'selected', 'nowrap')))
|
||||
{
|
||||
if ($value)
|
||||
$attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), $key);
|
||||
}
|
||||
// don't convert size of value attribute
|
||||
else if ($key=='value')
|
||||
$attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), Q($value, 'strict', false));
|
||||
|
||||
// regular tag attributes
|
||||
else
|
||||
$attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), $this->_conv_case(Q($value), 'value'));
|
||||
}
|
||||
|
||||
return sizeof($attrib_arr) ? ' '.implode(' ', $attrib_arr) : '';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert tags and attributes to upper-/lowercase
|
||||
*
|
||||
* @param string Input string
|
||||
* @param string Value type (can either be "tag" or "attrib")
|
||||
* @return string Converted output string
|
||||
* @access private
|
||||
*/
|
||||
function _conv_case($str, $type='attrib')
|
||||
{
|
||||
if ($type == 'tag')
|
||||
return $this->uppertags ? strtoupper($str) : strtolower($str);
|
||||
else if ($type == 'attrib')
|
||||
return $this->upperattribs ? strtoupper($str) : strtolower($str);
|
||||
else if ($type == 'value')
|
||||
return $this->upperprops ? strtoupper($str) : strtolower($str);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Builder for an <input> field
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class input_field extends rcube_form_element
|
||||
{
|
||||
var $type = 'text';
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param array Named tag attributes
|
||||
*/
|
||||
function input_field($attrib=array())
|
||||
{
|
||||
if (is_array($attrib))
|
||||
$this->attrib = $attrib;
|
||||
|
||||
if ($attrib['type'])
|
||||
$this->type = $attrib['type'];
|
||||
|
||||
if ($attrib['newline'])
|
||||
$this->newline = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compose input tag
|
||||
*
|
||||
* @param string Field value
|
||||
* @param array Additional tag attributes
|
||||
* @return string Final HTML code
|
||||
*/
|
||||
function show($value=NULL, $attrib=NULL)
|
||||
{
|
||||
// overwrite object attributes
|
||||
if (is_array($attrib))
|
||||
$this->attrib = array_merge($this->attrib, $attrib);
|
||||
|
||||
// set value attribute
|
||||
if ($value!==NULL)
|
||||
$this->attrib['value'] = $value;
|
||||
|
||||
$this->attrib['type'] = $this->type;
|
||||
|
||||
// return final tag
|
||||
return sprintf(
|
||||
'<%s%s />%s',
|
||||
$this->_conv_case('input', 'tag'),
|
||||
$this->create_attrib_string(),
|
||||
($this->newline ? "\n" : ""));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Builder for a <input type="text"> field
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class textfield extends input_field
|
||||
{
|
||||
var $type = 'text';
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder for a <input type="password"> field
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class passwordfield extends input_field
|
||||
{
|
||||
var $type = 'password';
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder for <input type="radio"> fields
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class radiobutton extends input_field
|
||||
{
|
||||
var $type = 'radio';
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder for <input type="checkbox"> fields
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class checkbox extends input_field
|
||||
{
|
||||
var $type = 'checkbox';
|
||||
|
||||
|
||||
/**
|
||||
* Compose input tag
|
||||
*
|
||||
* @param string Field value
|
||||
* @param array Additional tag attributes
|
||||
* @return string Final HTML code
|
||||
*/
|
||||
function show($value='', $attrib=NULL)
|
||||
{
|
||||
// overwrite object attributes
|
||||
if (is_array($attrib))
|
||||
$this->attrib = array_merge($this->attrib, $attrib);
|
||||
|
||||
$this->attrib['type'] = $this->type;
|
||||
|
||||
if ($value && (string)$value==(string)$this->attrib['value'])
|
||||
$this->attrib['checked'] = TRUE;
|
||||
else
|
||||
$this->attrib['checked'] = FALSE;
|
||||
|
||||
// return final tag
|
||||
return sprintf(
|
||||
'<%s%s />%s',
|
||||
$this->_conv_case('input', 'tag'),
|
||||
$this->create_attrib_string(),
|
||||
($this->newline ? "\n" : ""));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Builder for a <textarea> field
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class textarea extends rcube_form_element
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param array Named tag attributes
|
||||
*/
|
||||
function textarea($attrib=array())
|
||||
{
|
||||
$this->attrib = $attrib;
|
||||
|
||||
if ($attrib['newline'])
|
||||
$this->newline = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create HTML representation for this field
|
||||
*
|
||||
* @param string Field value
|
||||
* @param array Additional tag attributes
|
||||
* @return string Final HTML code
|
||||
*/
|
||||
function show($value='', $attrib=NULL)
|
||||
{
|
||||
// overwrite object attributes
|
||||
if (is_array($attrib))
|
||||
$this->attrib = array_merge($this->attrib, $attrib);
|
||||
|
||||
// take value attribute as content
|
||||
if ($value=='')
|
||||
$value = $this->attrib['value'];
|
||||
|
||||
// make shure we don't print the value attribute
|
||||
if (isset($this->attrib['value']))
|
||||
unset($this->attrib['value']);
|
||||
|
||||
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'),
|
||||
$this->create_attrib_string(),
|
||||
$value,
|
||||
$this->_conv_case('textarea', 'tag'),
|
||||
($this->newline ? "\n" : ""));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Builder for group of hidden form fields
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class hiddenfield extends rcube_form_element
|
||||
{
|
||||
var $fields_arr = array();
|
||||
var $newline = TRUE;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param array Named tag attributes
|
||||
*/
|
||||
function hiddenfield($attrib=NULL)
|
||||
{
|
||||
if (is_array($attrib))
|
||||
$this->add($attrib);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a hidden field to this instance
|
||||
* @param array Named tag attributes
|
||||
*/
|
||||
function add($attrib)
|
||||
{
|
||||
$this->fields_arr[] = $attrib;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create HTML code for the hidden fields
|
||||
*
|
||||
* @return string Final HTML code
|
||||
*/
|
||||
function show()
|
||||
{
|
||||
$out = '';
|
||||
foreach ($this->fields_arr as $attrib)
|
||||
{
|
||||
$this->attrib = $attrib;
|
||||
$this->attrib['type'] = 'hidden';
|
||||
|
||||
$out .= sprintf(
|
||||
'<%s%s />%s',
|
||||
$this->_conv_case('input', 'tag'),
|
||||
$this->create_attrib_string(),
|
||||
($this->newline ? "\n" : ""));
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Builder for HTML drop-down menus
|
||||
* Syntax:<pre>
|
||||
* // create instance. arguments are used to set attributes of select-tag
|
||||
* $select = new select(array('name' => 'fieldname'));
|
||||
*
|
||||
* // add one option
|
||||
* $select->add('Switzerland', 'CH');
|
||||
*
|
||||
* // add multiple options
|
||||
* $select->add(array('Switzerland','Germany'), array('CH','DE'));
|
||||
*
|
||||
* // generate pulldown with selection 'Switzerland' and return html-code
|
||||
* // as second argument the same attributes available to instanciate can be used
|
||||
* print $select->show('CH');
|
||||
* </pre>
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class select extends rcube_form_element
|
||||
{
|
||||
var $options = array();
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param array Named tag attributes
|
||||
*/
|
||||
function select($attrib=NULL)
|
||||
{
|
||||
if (is_array($attrib))
|
||||
$this->attrib = $attrib;
|
||||
|
||||
if ($attrib['newline'])
|
||||
$this->newline = TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add one ore more menu options
|
||||
*
|
||||
* @param mixed Array with names or single option name
|
||||
* @param mixed Array with values or single option value
|
||||
*/
|
||||
function add($names, $values=NULL)
|
||||
{
|
||||
if (is_array($names))
|
||||
{
|
||||
foreach ($names as $i => $text)
|
||||
$this->options[] = array('text' => $text, 'value' => $values[$i]);
|
||||
}
|
||||
else
|
||||
$this->options[] = array('text' => $names, 'value' => $values);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generate HTML code for this drop-down menu
|
||||
*
|
||||
* @param string Value of the selected option
|
||||
* @param array Additional tag attributes
|
||||
* @return string Final HTML code
|
||||
*/
|
||||
function show($select=array(), $attrib=NULL)
|
||||
{
|
||||
$options_str = "\n";
|
||||
$value_str = $this->_conv_case(' value="%s"', 'attrib');
|
||||
|
||||
if (!is_array($select))
|
||||
$select = array($select);
|
||||
|
||||
foreach ($this->options as $option)
|
||||
{
|
||||
$selected = ((isset($option['value']) &&
|
||||
in_array($option['value'], $select, TRUE)) ||
|
||||
(in_array($option['text'], $select, TRUE))) ?
|
||||
$this->_conv_case(' selected="selected"', 'attrib') : '';
|
||||
|
||||
$options_str .= sprintf("<%s%s%s>%s</%s>\n",
|
||||
$this->_conv_case('option', 'tag'),
|
||||
isset($option['value']) ? sprintf($value_str, Q($option['value'])) : '',
|
||||
$selected,
|
||||
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'),
|
||||
$this->create_attrib_string(),
|
||||
$options_str,
|
||||
$this->_conv_case('select', 'tag'),
|
||||
($this->newline ? "\n" : ""));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
?>
|
@ -0,0 +1,256 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| program/include/rcube_html_page.php |
|
||||
| |
|
||||
| This file is part of the RoundCube PHP suite |
|
||||
| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland |
|
||||
| Licensed under the GNU GPL |
|
||||
| |
|
||||
| CONTENTS: |
|
||||
| Class to build XHTML page output |
|
||||
| |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
|
||||
$Id: $
|
||||
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class for HTML page creation
|
||||
*
|
||||
* @package HTML
|
||||
*/
|
||||
class rcube_html_page
|
||||
{
|
||||
protected $scripts_path = '';
|
||||
protected $script_files = array();
|
||||
protected $external_scripts = array();
|
||||
protected $scripts = array();
|
||||
protected $charset = 'UTF-8';
|
||||
|
||||
protected $script_tag_file = "<script type=\"text/javascript\" src=\"%s%s\"></script>\n";
|
||||
protected $script_tag = "<script type=\"text/javascript\">\n<!--\n%s\n\n//-->\n</script>\n";
|
||||
protected $default_template = "<html>\n<head><title></title></head>\n<body></body>\n</html>";
|
||||
protected $tag_format_external_script = "<script type=\"text/javascript\" src=\"%s\"></script>\n";
|
||||
|
||||
protected $title = '';
|
||||
protected $header = '';
|
||||
protected $footer = '';
|
||||
protected $body = '';
|
||||
|
||||
|
||||
/** Constructor */
|
||||
public function __construct() {}
|
||||
|
||||
/**
|
||||
* Link an external script file
|
||||
*
|
||||
* @param string File URL
|
||||
* @param string Target position [head|foot]
|
||||
*/
|
||||
public function include_script($file, $position='head')
|
||||
{
|
||||
static $sa_files = array();
|
||||
|
||||
if (in_array($file, $sa_files)) {
|
||||
return;
|
||||
}
|
||||
if (!is_array($this->script_files[$position])) {
|
||||
$this->script_files[$position] = array();
|
||||
}
|
||||
$this->script_files[$position][] = $file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add inline javascript code
|
||||
*
|
||||
* @param string JS code snippet
|
||||
* @param string Target position [head|head_top|foot]
|
||||
*/
|
||||
public function add_script($script, $position='head')
|
||||
{
|
||||
if (!isset($this->scripts[$position])) {
|
||||
$this->scripts[$position] = "\n".rtrim($script);
|
||||
} else {
|
||||
$this->scripts[$position] .= "\n".rtrim($script);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add HTML code to the page header
|
||||
*/
|
||||
public function add_header($str)
|
||||
{
|
||||
$this->header .= "\n".$str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add HTML code to the page footer
|
||||
* To be added right befor </body>
|
||||
*/
|
||||
public function add_footer($str)
|
||||
{
|
||||
$this->footer .= "\n".$str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for page title
|
||||
*/
|
||||
public function set_title($t)
|
||||
{
|
||||
$this->title = $t;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for output charset.
|
||||
* To be specified in a meta tag and sent as http-header
|
||||
*/
|
||||
public function set_charset($charset)
|
||||
{
|
||||
$this->charset = $charset;
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter for output charset
|
||||
*/
|
||||
public function get_charset()
|
||||
{
|
||||
return $this->charset;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all saved properties
|
||||
*/
|
||||
public function reset()
|
||||
{
|
||||
$this->script_files = array();
|
||||
$this->scripts = array();
|
||||
$this->title = '';
|
||||
$this->header = '';
|
||||
$this->footer = '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Process template and write to stdOut
|
||||
*
|
||||
* @param string HTML template
|
||||
* @param string Base for absolute paths
|
||||
*/
|
||||
public function write($templ='', $base_path='')
|
||||
{
|
||||
$output = empty($templ) ? $this->default_template : trim($templ);
|
||||
|
||||
// set default page title
|
||||
if (empty($this->title)) {
|
||||
$this->title = 'RoundCube Mail';
|
||||
}
|
||||
|
||||
// replace specialchars in content
|
||||
$__page_title = Q($this->title, 'show', FALSE);
|
||||
$__page_header = $__page_body = $__page_footer = '';
|
||||
|
||||
// include meta tag with charset
|
||||
if (!empty($this->charset)) {
|
||||
if (!headers_sent()) {
|
||||
header('Content-Type: text/html; charset=' . $this->charset);
|
||||
}
|
||||
$__page_header = '<meta http-equiv="content-type"';
|
||||
$__page_header.= ' content="text/html; charset=';
|
||||
$__page_header.= $this->charset . '" />'."\n";
|
||||
}
|
||||
|
||||
// definition of the code to be placed in the document header and footer
|
||||
if (is_array($this->script_files['head'])) {
|
||||
foreach ($this->script_files['head'] as $file) {
|
||||
$__page_header .= sprintf($this->script_tag_file, $this->scripts_path, $file);
|
||||
}
|
||||
}
|
||||
|
||||
$head_script = $this->scripts['head_top'] . $this->scripts['head'];
|
||||
if (!empty($head_script)) {
|
||||
$__page_header .= sprintf($this->script_tag, $head_script);
|
||||
}
|
||||
|
||||
if (!empty($this->header)) {
|
||||
$__page_header .= $this->header;
|
||||
}
|
||||
|
||||
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 (!empty($this->scripts['foot'])) {
|
||||
$__page_footer .= sprintf($this->script_tag, $this->scripts['foot']);
|
||||
}
|
||||
|
||||
if (!empty($this->footer)) {
|
||||
$__page_footer .= $this->footer;
|
||||
}
|
||||
|
||||
// find page header
|
||||
if ($hpos = strpos(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'))) {
|
||||
while ($output[$hpos] != '>') {
|
||||
$hpos++;
|
||||
}
|
||||
$hpos++;
|
||||
}
|
||||
$__page_header = "<head>\n<title>$__page_title</title>\n$__page_header\n</head>\n";
|
||||
}
|
||||
|
||||
// add page hader
|
||||
if ($hpos) {
|
||||
$output = substr($output,0,$hpos) . $__page_header . substr($output,$hpos,strlen($output));
|
||||
}
|
||||
else {
|
||||
$output = $__page_header . $output;
|
||||
}
|
||||
|
||||
// find page body
|
||||
if ($bpos = strpos(strtolower($output), '<body')) {
|
||||
while ($output[$bpos] != '>') {
|
||||
$bpos++;
|
||||
}
|
||||
$bpos++;
|
||||
}
|
||||
else {
|
||||
$bpos = strpos(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));
|
||||
}
|
||||
|
||||
// find and add page footer
|
||||
$output_lc = strtolower($output);
|
||||
if (($fpos = strrpos($output_lc, '</body>')) || ($fpos = strrpos($output_lc, '</html>'))) {
|
||||
$output = substr($output, 0, $fpos) . "$__page_footer\n" . substr($output, $fpos);
|
||||
}
|
||||
else {
|
||||
$output .= "\n".$__page_footer;
|
||||
}
|
||||
|
||||
// reset those global vars
|
||||
$__page_header = $__page_footer = '';
|
||||
|
||||
// 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 rcube_charset_convert($output, 'UTF-8', $this->charset);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,237 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| program/include/rcube_json_output.php |
|
||||
| |
|
||||
| This file is part of the RoundCube Webmail client |
|
||||
| Copyright (C) 2008, RoundCube Dev. - Switzerland |
|
||||
| Licensed under the GNU GPL |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Class to handle HTML page output using a skin template. |
|
||||
| Extends rcube_html_page class from rcube_shared.inc |
|
||||
| |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
|
||||
$Id: $
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* View class to produce JSON responses
|
||||
*
|
||||
* @package View
|
||||
*/
|
||||
class rcube_json_output
|
||||
{
|
||||
private $config;
|
||||
private $charset = 'UTF-8';
|
||||
private $env = array();
|
||||
private $texts = array();
|
||||
private $commands = array();
|
||||
|
||||
public $task = '';
|
||||
public $ajax_call = true;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct(&$config, $task)
|
||||
{
|
||||
$this->task = $task;
|
||||
$this->config = $config;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set environment variable
|
||||
*
|
||||
* @param string Property name
|
||||
* @param mixed Property value
|
||||
*/
|
||||
public function set_env($name, $value)
|
||||
{
|
||||
$this->env[$name] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function set_pagetitle($title)
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
function set_charset($charset)
|
||||
{
|
||||
// ignore: $this->charset = $charset;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get charset for output
|
||||
*
|
||||
* @return string Output charset
|
||||
*/
|
||||
function get_charset()
|
||||
{
|
||||
return $this->charset;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Register a template object handler
|
||||
*
|
||||
* @param string Object name
|
||||
* @param string Function name to call
|
||||
* @return void
|
||||
*/
|
||||
public function add_handler($obj, $func)
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a list of template object handlers
|
||||
*
|
||||
* @param array Hash array with object=>handler pairs
|
||||
* @return void
|
||||
*/
|
||||
public function add_handlers($arr)
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Call a client method
|
||||
*
|
||||
* @param string Method to call
|
||||
* @param ... Additional arguments
|
||||
*/
|
||||
public function command()
|
||||
{
|
||||
$this->commands[] = func_get_args();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add a localized label to the client environment
|
||||
*/
|
||||
public function add_label()
|
||||
{
|
||||
$arg_list = func_get_args();
|
||||
foreach ($arg_list as $i => $name) {
|
||||
$this->texts[$name] = rcube::gettext($name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Invoke display_message command
|
||||
*
|
||||
* @param string Message to display
|
||||
* @param string Message type [notice|confirm|error]
|
||||
* @param array Key-value pairs to be replaced in localized text
|
||||
* @uses self::command()
|
||||
*/
|
||||
public function show_message($message, $type='notice', $vars=null)
|
||||
{
|
||||
$this->command(
|
||||
'display_message',
|
||||
rcube::gettext(array('name' => $message, 'vars' => $vars)),
|
||||
$type
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete all stored env variables and commands
|
||||
*/
|
||||
public public function reset()
|
||||
{
|
||||
$this->env = array();
|
||||
$this->texts = array();
|
||||
$this->commands = array();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send an AJAX response to the client.
|
||||
*/
|
||||
public function send()
|
||||
{
|
||||
$this->remote_response();
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send an AJAX response with executable JS code
|
||||
*
|
||||
* @param string Additional JS code
|
||||
* @param boolean True if output buffer should be flushed
|
||||
* @return void
|
||||
* @deprecated
|
||||
*/
|
||||
public function remote_response($add='', $flush=false)
|
||||
{
|
||||
static $s_header_sent = false;
|
||||
|
||||
if (!$s_header_sent) {
|
||||
$s_header_sent = true;
|
||||
send_nocacheing_headers();
|
||||
header('Content-Type: application/x-javascript; charset=' . $this->get_charset());
|
||||
print '/** ajax response ['.date('d/M/Y h:i:s O')."] **/\n";
|
||||
}
|
||||
|
||||
// unset default env vars
|
||||
unset($this->env['task'], $this->env['action'], $this->env['comm_path']);
|
||||
|
||||
// send response code
|
||||
echo $this->get_js_commands() . $add;
|
||||
|
||||
// flush the output buffer
|
||||
if ($flush)
|
||||
flush();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return executable javascript code for all registered commands
|
||||
*
|
||||
* @return string $out
|
||||
*/
|
||||
private function get_js_commands()
|
||||
{
|
||||
$out = 'this.set_env('.json_serialize($this->env).");\n";
|
||||
|
||||
foreach($this->texts as $name => $text) {
|
||||
$out .= sprintf("this.add_label('%s', '%s');\n", $name, JQ($text));
|
||||
}
|
||||
|
||||
foreach ($this->commands as $i => $args) {
|
||||
$method = array_shift($args);
|
||||
foreach ($args as $i => $arg) {
|
||||
$args[$i] = json_serialize($arg);
|
||||
}
|
||||
|
||||
$out .= sprintf(
|
||||
"this.%s(%s);\n",
|
||||
preg_replace('/^parent\./', '', $method),
|
||||
implode(',', $args)
|
||||
);
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| program/include/rcube_result_set.php |
|
||||
| |
|
||||
| This file is part of the RoundCube Webmail client |
|
||||
| Copyright (C) 2006-2008, RoundCube Dev. - Switzerland |
|
||||
| Licensed under the GNU GPL |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Class representing an address directory result set |
|
||||
| |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
|
||||
$Id: rcube_result_set.php 328 2006-08-30 17:41:21Z thomasb $
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* RoundCube result set class.
|
||||
* Representing an address directory result set.
|
||||
*
|
||||
* @package Addressbook
|
||||
*/
|
||||
class rcube_result_set
|
||||
{
|
||||
var $count = 0;
|
||||
var $first = 0;
|
||||
var $current = 0;
|
||||
var $records = array();
|
||||
|
||||
function __construct($c=0, $f=0)
|
||||
{
|
||||
$this->count = (int)$c;
|
||||
$this->first = (int)$f;
|
||||
}
|
||||
|
||||
function rcube_result_set($c=0, $f=0)
|
||||
{
|
||||
$this->__construct($c, $f);
|
||||
}
|
||||
|
||||
function add($rec)
|
||||
{
|
||||
$this->records[] = $rec;
|
||||
}
|
||||
|
||||
function iterate()
|
||||
{
|
||||
return $this->records[$this->current++];
|
||||
}
|
||||
|
||||
function first()
|
||||
{
|
||||
$this->current = 0;
|
||||
return $this->records[$this->current++];
|
||||
}
|
||||
|
||||
// alias
|
||||
function next()
|
||||
{
|
||||
return $this->iterate();
|
||||
}
|
||||
|
||||
function seek($i)
|
||||
{
|
||||
$this->current = $i;
|
||||
}
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue