Code

Removed plugin stuff from the Snapshot handler
[gosa.git] / gosa-core / include / smarty / Smarty.class.php
index 6f28857311f6063262a09a46f4f2f370d34d8c90..2d2ed357edd0c3efc8035c5ff21d67577c91021a 100644 (file)
@@ -1,55 +1,55 @@
 <?php
 
 /**
-* Project:     Smarty: the PHP compiling template engine
-* File:        Smarty.class.php
-* SVN:         $Id: Smarty.class.php 3420 2009-12-29 20:12:11Z Uwe.Tews $
-* 
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation; either
-* version 2.1 of the License, or (at your option) any later version.
-* 
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-* Lesser General Public License for more details.
-* 
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-* 
-* For questions, help, comments, discussion, etc., please join the
-* Smarty mailing list. Send a blank e-mail to
-* smarty-discussion-subscribe@googlegroups.com
-* 
-* @link http://www.smarty.net/
-* @copyright 2008 New Digital Group, Inc.
-* @author Monte Ohrt <monte at ohrt dot com> 
-* @author Uwe Tews 
-* @package Smarty
-* @version 3-SVN$Rev: 3286 $
-*/
+ * Project:     Smarty: the PHP compiling template engine
+ * File:        Smarty.class.php
+ * SVN:         $Id: Smarty.class.php 3508 2010-02-26 12:58:36Z Uwe.Tews $
+ 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ 
+ * For questions, help, comments, discussion, etc., please join the
+ * Smarty mailing list. Send a blank e-mail to
+ * smarty-discussion-subscribe@googlegroups.com
+ 
+ * @link http://www.smarty.net/
+ * @copyright 2008 New Digital Group, Inc.
+ * @author Monte Ohrt <monte at ohrt dot com> 
+ * @author Uwe Tews 
+ * @package Smarty
+ * @version 3-SVN$Rev: 3286 $
+ */
 
 /**
-* define shorthand directory separator constant
-*/
+ * define shorthand directory separator constant
+ */
 if (!defined('DS')) {
     define('DS', DIRECTORY_SEPARATOR);
 } 
 
 /**
-* set SMARTY_DIR to absolute path to Smarty library files.
-* Sets SMARTY_DIR only if user application has not already defined it.
-*/
+ * set SMARTY_DIR to absolute path to Smarty library files.
+ * Sets SMARTY_DIR only if user application has not already defined it.
+ */
 if (!defined('SMARTY_DIR')) {
     define('SMARTY_DIR', dirname(__FILE__) . DS);
 } 
 
 /**
-* set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins.
-* Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it.
-*/
+ * set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins.
+ * Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it.
+ */
 if (!defined('SMARTY_SYSPLUGINS_DIR')) {
     define('SMARTY_SYSPLUGINS_DIR', SMARTY_DIR . 'sysplugins' . DS);
 } 
@@ -64,32 +64,32 @@ if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) {
 } 
 
 /**
-* define variable scopes
-*/
+ * define variable scopes
+ */
 define('SMARTY_LOCAL_SCOPE', 0);
 define('SMARTY_PARENT_SCOPE', 1);
 define('SMARTY_ROOT_SCOPE', 2);
 define('SMARTY_GLOBAL_SCOPE', 3);
 
 /**
-* define caching modes
-*/
+ * define caching modes
+ */
 define('SMARTY_CACHING_OFF', 0);
 define('SMARTY_CACHING_LIFETIME_CURRENT', 1);
 define('SMARTY_CACHING_LIFETIME_SAVED', 2);
 
 /**
-* This determines how Smarty handles "<?php ... ?>" tags in templates.
-* possible values:
-*/
+ * This determines how Smarty handles "<?php ... ?>" tags in templates.
+ * possible values:
+ */
 define('SMARTY_PHP_PASSTHRU', 0); //-> print tags as plain text
 define('SMARTY_PHP_QUOTE', 1); //-> escape tags as entities
 define('SMARTY_PHP_REMOVE', 2); //-> escape tags as entities
 define('SMARTY_PHP_ALLOW', 3); //-> escape tags as entities
 
 /**
-* register the class autoloader
-*/
+ * register the class autoloader
+ */
 if (!defined('SMARTY_SPL_AUTOLOAD')) {
     define('SMARTY_SPL_AUTOLOAD', 0);
 } 
@@ -104,11 +104,11 @@ if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR
 } 
 
 /**
-* This is the main Smarty class
-*/
+ * This is the main Smarty class
+ */
 class Smarty extends Smarty_Internal_Data {
     // smarty version
-    const SMARTY_VERSION = 'Smarty3-b7'; 
+    const SMARTY_VERSION = 'Smarty3-b8'; 
     // auto literal on delimiters with whitspace
     public $auto_literal = true; 
     // display error on not assigned variables
@@ -167,7 +167,7 @@ class Smarty extends Smarty_Internal_Data {
     // config var settings
     public $config_overwrite = true; //Controls whether variables with the same name overwrite each other.
     public $config_booleanize = true; //Controls whether config values of on/true/yes and off/false/no get converted to boolean
-    public $config_read_hidden = true; //Controls whether hidden config sections/vars are read from the file.                                              
+    public $config_read_hidden = true; //Controls whether hidden config sections/vars are read from the file.                                                     
     // config vars
     public $config_vars = array(); 
     // assigned tpl vars
@@ -184,6 +184,10 @@ class Smarty extends Smarty_Internal_Data {
     public $caching_type = 'file'; 
     // internal cache resource types
     public $cache_resource_types = array('file'); 
+    // internal cache resource objects
+    public $cache_resource_objects = array(); 
+    // internal config properties
+    public $properties = array(); 
     // config type
     public $default_config_type = 'file'; 
     // exception handler: array('ExceptionClass','ExceptionMethod');
@@ -204,6 +208,8 @@ class Smarty extends Smarty_Internal_Data {
     public $autoload_filters = array(); 
     // status of filter on variable output
     public $variable_filter = true; 
+    // default modifier
+    public $default_modifiers = array(); 
     // global internal smarty  vars
     public $_smarty_vars = array(); 
     // start time for execution time calculation
@@ -213,12 +219,21 @@ class Smarty extends Smarty_Internal_Data {
     // default dir permissions
     public $_dir_perms = 0771; 
     // smarty object reference
-    public $smarty = null;
+    public $smarty = null; 
+    // block data at template inheritance
+    public $block_data = array(); 
+    // block tag hierarchy
+    public $_tag_stack = array(); 
+    // plugins
+    public $_plugins = array(); 
+    // generate deprecated function call notices?
+    public $deprecation_notices = true;
 
     /**
-    * Class constructor, initializes basic smarty properties
-    */
-    public function __construct() {
+     * Class constructor, initializes basic smarty properties
+     */
+    public function __construct()
+    { 
         // self reference needed by other classes methods
         $this->smarty = $this;
 
@@ -228,7 +243,7 @@ class Smarty extends Smarty_Internal_Data {
         $this->start_time = $this->_get_time(); 
         // set exception handler
         if (!empty($this->exception_handler))
-        set_exception_handler($this->exception_handler); 
+            set_exception_handler($this->exception_handler); 
         // set default dirs
         $this->template_dir = array('.' . DS . 'templates' . DS);
         $this->compile_dir = '.' . DS . 'templates_c' . DS;
@@ -239,8 +254,7 @@ class Smarty extends Smarty_Internal_Data {
         if (!$this->debugging && $this->debugging_ctrl == 'URL') {
             if (isset($_SERVER['QUERY_STRING'])) {
                 $_query_string = $_SERVER['QUERY_STRING'];
-            } 
-            else {
+            } else {
                 $_query_string = '';
             } 
             if (false !== strpos($_query_string, $this->smarty_debug_id)) {
@@ -248,45 +262,46 @@ class Smarty extends Smarty_Internal_Data {
                     // enable debugging for this browser session
                     setcookie('SMARTY_DEBUG', true);
                     $this->debugging = true;
-                } 
-                elseif (false !== strpos($_query_string, $this->smarty_debug_id . '=off')) {
+                } elseif (false !== strpos($_query_string, $this->smarty_debug_id . '=off')) {
                     // disable debugging for this browser session
                     setcookie('SMARTY_DEBUG', false);
                     $this->debugging = false;
-                } 
-                else {
+                } else {
                     // enable debugging for this page
                     $this->debugging = true;
                 } 
-            } 
-            else {
+            } else {
                 if (isset($_COOKIE['SMARTY_DEBUG'])) {
                     $this->debugging = true;
                 } 
             } 
         } 
-        $this->assign_global('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
+        if (isset($_SERVER['SCRIPT_NAME'])) {
+            $this->assignGlobal('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
+        } 
     } 
 
     /**
-    * Class destructor
-    */
-    public function __destruct() {
+     * Class destructor
+     */
+    public function __destruct()
+    { 
         // restore to previous exception handler, if any
         if (!empty($this->exception_handler))
-        restore_exception_handler();
+            restore_exception_handler();
     } 
 
     /**
-    * fetches a rendered Smarty template
-    * 
-    * @param string $template the resource handle of the template file or template object
-    * @param mixed $cache_id cache id to be used with this template
-    * @param mixed $compile_id compile id to be used with this template
-    * @param object $ |null $parent next higher level of Smarty variables
-    * @return string rendered template output
-    */
-    public function fetch($template, $cache_id = null, $compile_id = null, $parent = null) {
+     * fetches a rendered Smarty template
+     * 
+     * @param string $template the resource handle of the template file or template object
+     * @param mixed $cache_id cache id to be used with this template
+     * @param mixed $compile_id compile id to be used with this template
+     * @param object $ |null $parent next higher level of Smarty variables
+     * @return string rendered template output
+     */
+    public function fetch($template, $cache_id = null, $compile_id = null, $parent = null, $display = false)
+    {
         if (is_object($cache_id)) {
             $parent = $cache_id;
             $cache_id = null;
@@ -300,45 +315,74 @@ class Smarty extends Smarty_Internal_Data {
         $_template = $this->createTemplate ($template, $cache_id, $compile_id, $parent);
         $_smarty_old_error_level = $this->debugging ? error_reporting() : error_reporting(isset($this->error_reporting)
             ? $this->error_reporting : error_reporting() &~E_NOTICE); 
+        // obtain data for cache modified check
+        if ($this->cache_modified_check && $this->caching && $display) {
+            $_isCached = $_template->isCached() && !$_template->has_nocache_code;
+            if ($_isCached) {
+                $_gmt_mtime = gmdate('D, d M Y H:i:s', $_template->getCachedTimestamp()) . ' GMT';
+            } else {
+                $_gmt_mtime = '';
+            } 
+        } 
         // return redered template
         if (isset($this->autoload_filters['output']) || isset($this->registered_filters['output'])) {
             $_output = Smarty_Internal_Filter_Handler::runFilter('output', $_template->getRenderedTemplate(), $this);
-        } 
-        else {
+        } else {
             $_output = $_template->getRenderedTemplate();
         } 
         $_template->rendered_content = null;
-        error_reporting($_smarty_old_error_level);
-        return $_output;
+        error_reporting($_smarty_old_error_level); 
+        // display or fetch
+        if ($display) {
+            if ($this->caching && $this->cache_modified_check) {
+                $_last_modified_date = @substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
+                if ($_isCached && $_gmt_mtime == $_last_modified_date) {
+                    if (php_sapi_name() == 'cgi')
+                        header('Status: 304 Not Modified');
+                    else
+                        header('HTTP/1.1 304 Not Modified');
+                } else {
+                    header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->getCachedTimestamp()) . ' GMT');
+                    echo $_output;
+                } 
+            } else {
+                echo $_output;
+            } 
+            // debug output
+            if ($this->debugging) {
+                Smarty_Internal_Debug::display_debug($this);
+            } 
+            return;
+        } else {
+          // return fetched content
+            return $_output;
+        } 
     } 
 
     /**
-    * displays a Smarty template
-    * 
-    * @param string $ |object $template the resource handle of the template file  or template object
-    * @param mixed $cache_id cache id to be used with this template
-    * @param mixed $compile_id compile id to be used with this template
-    * @param object $parent next higher level of Smarty variables
-    */
-    public function display($template, $cache_id = null, $compile_id = null, $parent = null) {
+     * displays a Smarty template
+     * 
+     * @param string $ |object $template the resource handle of the template file  or template object
+     * @param mixed $cache_id cache id to be used with this template
+     * @param mixed $compile_id compile id to be used with this template
+     * @param object $parent next higher level of Smarty variables
+     */
+    public function display($template, $cache_id = null, $compile_id = null, $parent = null)
+    { 
         // display template
-        echo $this->fetch ($template, $cache_id, $compile_id, $parent); 
-        // debug output
-        if ($this->debugging) {
-            Smarty_Internal_Debug::display_debug($this);
-        } 
-        return true;
+        $this->fetch ($template, $cache_id, $compile_id, $parent, true);
     } 
 
     /**
-    * test if cache i valid
-    * 
-    * @param string $ |object $template the resource handle of the template file or template object
-    * @param mixed $cache_id cache id to be used with this template
-    * @param mixed $compile_id compile id to be used with this template
-    * @return boolean cache status
-    */
-    public function is_cached($template, $cache_id = null, $compile_id = null) {
+     * test if cache i valid
+     * 
+     * @param string $ |object $template the resource handle of the template file or template object
+     * @param mixed $cache_id cache id to be used with this template
+     * @param mixed $compile_id compile id to be used with this template
+     * @return boolean cache status
+     */
+    public function isCached($template, $cache_id = null, $compile_id = null)
+    {
         if (!($template instanceof $this->template_class)) {
             $template = $this->createTemplate ($template, $cache_id, $compile_id, $this);
         } 
@@ -347,84 +391,134 @@ class Smarty extends Smarty_Internal_Data {
     } 
 
     /**
-    * Loads security class and enables security
-    */
-    public function enableSecurity() {
+     * creates a data object
+     * 
+     * @param object $parent next higher level of Smarty variables
+     * @returns object data object
+     */
+    public function createData($parent = null)
+    {
+        return new Smarty_Data($parent, $this);
+    } 
+
+    /**
+     * creates a template object
+     * 
+     * @param string $template the resource handle of the template file
+     * @param object $parent next higher level of Smarty variables
+     * @param mixed $cache_id cache id to be used with this template
+     * @param mixed $compile_id compile id to be used with this template
+     * @returns object template object
+     */
+    public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null)
+    {
+        if (is_object($cache_id) || is_array($cache_id)) {
+            $parent = $cache_id;
+            $cache_id = null;
+        } 
+        if (is_array($parent)) {
+            $data = $parent;
+            $parent = null;
+        } else {
+            $data = null;
+        } 
+        if (!is_object($template)) {
+            // we got a template resource
+            // already in template cache?
+            $_templateId = crc32($template . $cache_id . $compile_id);
+            if (isset($this->template_objects[$_templateId]) && $this->caching) {
+                // return cached template object
+                $tpl = $this->template_objects[$_templateId];
+            } else {
+                // create new template object
+                $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id);
+            } 
+        } else {
+            // just return a copy of template class
+            $tpl = $template;
+        } 
+        // fill data if present
+        if (is_array($data)) {
+            // set up variable values
+            foreach ($data as $_key => $_val) {
+                $tpl->tpl_vars[$_key] = new Smarty_variable($_val);
+            } 
+        } 
+        return $tpl;
+    } 
+
+    /**
+     * Loads security class and enables security
+     */
+    public function enableSecurity()
+    {
         if (isset($this->security_class)) {
             $this->security_policy = new $this->security_class;
             $this->security_handler = new Smarty_Internal_Security_Handler($this);
             $this->security = true;
-        } 
-        else {
+        } else {
             throw new Exception('Property security_class is not defined');
         } 
     } 
 
     /**
-    * Set template directory
-    * 
-    * @param string $ |array $template_dir folder(s) of template sorces
-    */
-    public function setTemplateDir($template_dir) {
+     * Disable security
+     */
+    public function disableSecurity()
+    {
+        $this->security = true;
+    } 
+
+    /**
+     * Set template directory
+     * 
+     * @param string $ |array $template_dir folder(s) of template sorces
+     */
+    public function setTemplateDir($template_dir)
+    {
         $this->template_dir = (array)$template_dir;
         return;
     } 
+
     /**
-    * Adds template directory(s) to existing ones
-    * 
-    * @param string $ |array $template_dir folder(s) of template sources
-    */
-    public function addTemplateDir($template_dir) {
+     * Adds template directory(s) to existing ones
+     * 
+     * @param string $ |array $template_dir folder(s) of template sources
+     */
+    public function addTemplateDir($template_dir)
+    {
         $this->template_dir = array_merge((array)$this->template_dir, (array)$template_dir);
         $this->template_dir = array_unique($this->template_dir);
         return;
     } 
+
     /**
-    * Set compile directory
-    * 
-    * @param string $compile_dir folder of compiled template sources
-    */
-    public function setCompileDir($compile_dir) {
-        $this->compile_dir = $compile_dir;
-        return;
-    } 
-    /**
-    * Set cache directory
-    * 
-    * @param string $cache_dir folder of cache files
-    */
-    public function setCacheDir($cache_dir) {
-        $this->cache_dir = $cache_dir;
-        return;
-    } 
-    /**
-    * Enable Caching
-    */
-    public function enableCaching() {
-        $this->caching = SMARTY_CACHING_LIFETIME_CURRENT;
-        return;
-    } 
-    /**
-    * Set caching life time
-    * 
-    * @param integer $lifetime lifetime of cached file in seconds
-    */
-    public function setCacheLifetime($lifetime) {
-        $this->cache_lifetime = $lifetime;
-        return;
+     * Check if a template resource exists
+     * 
+     * @param string $resource_name template name
+     * @return boolean status
+     */
+    function templateExists($resource_name)
+    { 
+        // create template object
+        $tpl = new $this->template_class($resource_name, $this); 
+        // check if it does exists
+        return $tpl->isExisting();
     } 
+
     /**
-    * Takes unknown classes and loads plugin files for them
-    * class name format: Smarty_PluginType_PluginName
-    * plugin filename format: plugintype.pluginname.php
-    * 
-    * @param string $plugin_name class plugin name to load
-    * @return string|boolean filepath of loaded file or false
-    */
-    public function loadPlugin($plugin_name, $check = true) {
+     * Takes unknown classes and loads plugin files for them
+     * class name format: Smarty_PluginType_PluginName
+     * plugin filename format: plugintype.pluginname.php
+     * 
+     * @param string $plugin_name class plugin name to load
+     * @return string |boolean filepath of loaded file or false
+     */
+    public function loadPlugin($plugin_name, $check = true)
+    { 
         // if function or class exists, exit silently (already loaded)
         if ($check && (is_callable($plugin_name) || class_exists($plugin_name, false)))
-        return true; 
+            return true; 
         // Plugin name is expected to be: Smarty_[Type]_[Name]
         $_plugin_name = strtolower($plugin_name);
         $_name_parts = explode('_', $_plugin_name, 3); 
@@ -439,8 +533,7 @@ class Smarty extends Smarty_Internal_Data {
             if (file_exists($file)) {
                 require_once($file);
                 return $file;
-            } 
-            else {
+            } else {
                 return false;
             } 
         } 
@@ -462,64 +555,204 @@ class Smarty extends Smarty_Internal_Data {
     } 
 
     /**
-    * Sets the exception handler for Smarty.
-    * 
-    * @param mixed $handler function name or array with object/method names
-    * @return string previous exception handler
-    */
-    public function setExceptionHandler($handler) {
+     * load a filter of specified type and name
+     * 
+     * @param string $type filter type
+     * @param string $name filter name
+     * @return bool 
+     */
+    function loadFilter($type, $name)
+    {
+        $_plugin = "smarty_{$type}filter_{$name}";
+        $_filter_name = $_plugin;
+        if ($this->loadPlugin($_plugin)) {
+            if (class_exists($_plugin, false)) {
+                $_plugin = array($_plugin, 'execute');
+            } 
+            if (is_callable($_plugin)) {
+                return $this->registered_filters[$type][$_filter_name] = $_plugin;
+            } 
+        } 
+        throw new Exception("{$type}filter \"{$name}\" not callable");
+        return false;
+    } 
+
+    /**
+     * Sets the exception handler for Smarty.
+     * 
+     * @param mixed $handler function name or array with object/method names
+     * @return string previous exception handler
+     */
+    public function setExceptionHandler($handler)
+    {
         $this->exception_handler = $handler;
         return set_exception_handler($handler);
     } 
 
     /**
-    * Loads cache resource.
-    * 
-    * @return object of cache resource
-    */
-    public function loadCacheResource($type = null) {
-        if (!isset($type)) {
-            $type = $this->caching_type;
-        } 
-        // already loaded?
-        if (isset($this->cache_resource_objects[$type])) {
-            return $this->cache_resource_objects[$type];
-        } 
-        if (in_array($type, $this->cache_resource_types)) {
-            $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type);
-            return $this->cache_resource_objects[$type] = new $cache_resource_class($this);
+     * trigger Smarty error
+     * 
+     * @param string $error_msg 
+     * @param integer $error_type 
+     */
+    public function trigger_error($error_msg, $error_type = E_USER_WARNING)
+    {
+        throw new Exception("Smarty error: $error_msg");
+    } 
+
+    /**
+     * Return internal filter name
+     * 
+     * @param callback $function_name 
+     */
+    public function _get_filter_name($function_name)
+    {
+        if (is_array($function_name)) {
+            $_class_name = (is_object($function_name[0]) ?
+                get_class($function_name[0]) : $function_name[0]);
+            return $_class_name . '_' . $function_name[1];
+        } else {
+            return $function_name;
         } 
-        else {
-            // try plugins dir
-            $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type);
-            if ($this->loadPlugin($cache_resource_class)) {
-                return $this->cache_resource_objects[$type] = new $cache_resource_class($this);
+    } 
+
+    /**
+     * Adds directory of plugin files
+     * 
+     * @param object $smarty 
+     * @param string $ |array $ plugins folder
+     * @return 
+     */
+    function addPluginsDir($plugins_dir)
+    {
+        $this->plugins_dir = array_merge((array)$this->plugins_dir, (array)$plugins_dir);
+        $this->plugins_dir = array_unique($this->plugins_dir);
+        return;
+    } 
+
+    /**
+     * Returns a single or all global  variables
+     * 
+     * @param object $smarty 
+     * @param string $varname variable name or null
+     * @return string variable value or or array of variables
+     */
+    function getGlobal($varname = null)
+    {
+        if (isset($varname)) {
+            if (isset($this->global_tpl_vars[$varname])) {
+                return $this->global_tpl_vars[$varname]->value;
+            } else {
+                return '';
             } 
-            else {
-                throw new Exception("Unable to load cache resource '{$type}'");
+        } else {
+            $_result = array();
+            foreach ($this->global_tpl_vars AS $key => $var) {
+                $_result[$key] = $var->value;
             } 
+            return $_result;
         } 
     } 
 
     /**
-    * trigger Smarty error
-    * 
-    * @param string $error_msg 
-    * @param integer $error_type 
-    */
-    public function trigger_error($error_msg, $error_type = E_USER_WARNING) {
-        throw new Exception("Smarty error: $error_msg");
+     * return a reference to a registered object
+     * 
+     * @param string $name object name
+     * @return object 
+     */
+    function getRegisteredObject($name)
+    {
+        if (!isset($this->registered_objects[$name]))
+            throw new Exception("'$name' is not a registered object");
+
+        if (!is_object($this->registered_objects[$name][0]))
+            throw new Exception("registered '$name' is not an object");
+
+        return $this->registered_objects[$name][0];
     } 
 
     /**
-    * Takes unknown class methods and lazy loads sysplugin files for them
-    * class name format: Smarty_Method_MethodName
-    * plugin filename format: method.methodname.php
-    * 
-    * @param string $name unknown methode name
-    * @param array $args aurgument array
-    */
-    public function __call($name, $args) {
+     * return name of debugging template
+     * 
+     * @return string 
+     */
+    function getDebugTemplate()
+    {
+        return $this->debug_tpl;
+    } 
+
+    /**
+     * set the debug template
+     * 
+     * @param string $tpl_name 
+     * @return bool 
+     */
+    function setDebugTemplate($tpl_name)
+    {
+        return $this->debug_tpl = $tpl_name;
+    } 
+
+    /**
+     * lazy loads (valid) property objects
+     * 
+     * @param string $name property name
+     */
+    public function __get($name)
+    {
+        if (in_array($name, array('register', 'unregister', 'utility', 'cache'))) {
+            $class = "Smarty_Internal_" . ucfirst($name);
+            $this->$name = new $class($this);
+            return $this->$name;
+        } else if ($name == '_version') {
+            // Smarty 2 BC
+            $this->_version = self::SMARTY_VERSION;
+            return $this->_version;
+        }      
+        return null;
+    } 
+
+    /**
+     * Takes unknown class methods and lazy loads sysplugin files for them
+     * class name format: Smarty_Method_MethodName
+     * plugin filename format: method.methodname.php
+     * 
+     * @param string $name unknown methode name
+     * @param array $args aurgument array
+     */
+    public function __call($name, $args)
+    {
+        static $camel_func;
+        if (!isset($camel_func))
+            $camel_func = create_function('$c', 'return "_" . strtolower($c[1]);'); 
+        // PHP4 call to constructor?
+        if (strtolower($name) == 'smarty') {
+            throw new Exception('Please use parent::__construct() to call parent constuctor');
+            return false;
+        } 
+        // see if this is a set/get for a property
+        $first3 = strtolower(substr($name, 0, 3));
+        if (in_array($first3, array('set', 'get')) && substr($name, 3, 1) !== '_') {
+            // try to keep case correct for future PHP 6.0 case-sensitive class methods
+            // lcfirst() not available < PHP 5.3.0, so improvise
+            $property_name = strtolower(substr($name, 3, 1)) . substr($name, 4); 
+            // convert camel case to underscored name
+            $property_name = preg_replace_callback('/([A-Z])/', $camel_func, $property_name);
+            if (!property_exists($this, $property_name)) {
+                throw new Exception("property '$property_name' does not exist.");
+                return false;
+            } 
+            if ($first3 == 'get')
+                return $this->$property_name;
+            else
+                return $this->$property_name = $args[0];
+        } 
+        // Smarty Backward Compatible wrapper
+        if (!isset($this->wrapper)) {
+            $this->wrapper = new Smarty_Internal_Wrapper($this);
+        } 
+        return $this->wrapper->convert($name, $args);
+
+        /*
         $name = strtolower($name);
         if ($name == 'smarty') {
             throw new Exception('Please use parent::__construct() to call parent constuctor');
@@ -532,10 +765,12 @@ class Smarty extends Smarty_Internal_Data {
             require_once(SMARTY_SYSPLUGINS_DIR . $function_name . '.php');
         } 
         return call_user_func_array($function_name, array_merge(array($this), $args));
+        */
     } 
 } 
 
-function smartyAutoload($class) {
+function smartyAutoload($class)
+{
     $_class = strtolower($class);
     if (substr($_class, 0, 16) === 'smarty_internal_' || $_class == 'smarty_security') {
         include SMARTY_SYSPLUGINS_DIR . $_class . '.php';