<?php

require_once "Zend/View/Abstract.php";
require_once 
"Zend/View/Interface.php";
require_once 
"Smarty/Smarty.class.php";

class 
Jazz_View_Smarty extends Zend_View_Abstract implements Zend_View_Interface {

    const 
TEMPLATE_EXTENSION 'tpl';

    
/**
     * @var Smarty
     */
    
protected $_smarty;

    
/**
     * Constructor
     *
     * @param string $tmplPath
     * @param array $extraParams
     * @return void
     */
    
public function __construct($tmplPath null$extraParams = array()) {

        
$this->_smarty = new Smarty;
        
$this->_registerModifiers();

        if (
null !== $tmplPath) {
            
$this->setScriptPath($tmplPath);
        }

        foreach (
$extraParams as $key => $value) {
            
$this->_smarty->$key $value;
        }
    }
    
    
/**
     * Registers additional modifiers
     * 
     * @return void
     */
    
protected function _registerModifiers() {
        
        
$this->_smarty->register_modifier('num''number_format');
    }

    
/**
     * Return the template engine object
     *
     * @return Smarty
     */
    
public function getEngine() {
        return 
$this->_smarty;
    }

    
/**
     * Set the path to the templates
     *
     * @param string $path The directory to set as the path.
     * @return void
     */
    
public function setScriptPath($path) {

        if (
is_readable($path)) {
            
$this->_smarty->template_dir $path;
                return 
$this;
        }
        throw new 
Exception('Invalid path provided');
    }

    
/**
     * Retrieve the current template directory
     *
     * @return string
     */
    
public function getScriptPaths() {
        return array(
$this->_smarty->template_dir);
    }

    
/**
     * Alias for setScriptPath
     *
     * @param string $path
     * @param string $prefix Unused
     * @return void
     */
    
public function setBasePath($path$prefix 'Zend_View') {
        return 
$this->setScriptPath($path);
    }

    
/**
     * Alias for setScriptPath
     *
     * @param string $path
     * @param string $prefix Unused
     * @return void
     */
    
public function addBasePath($path$prefix 'Zend_View') {
        return 
$this->setScriptPath($path);
    }

    
/**
     * Assign a variable to the template
     *
     * @param string $key The variable name.
     * @param mixed $val The variable value.
     * @return void
     */
    
public function __set($key$val) {
        
$this->_smarty->assign($key$val);
    }

    
/**
     * Returns a variable assigned to the template
     *
     * @param string $key The variable name.
     * @return void
     */
    
public function & __get($key) {
        return 
$this->_smarty->get_template_vars($key);
    }

    
/**
     * Allows testing with empty() and isset() to work
     *
     * @param string $key
     * @return boolean
     */
    
public function __isset($key) {
        return (
null !== $this->_smarty->get_template_vars($key));
    }

    
/**
     * Allows unset() on object properties to work
     *
     * @param string $key
     * @return void
     */
    
public function __unset($key) {
        
$this->_smarty->clear_assign($key);
    }

    
/**
     * Assign variables to the template
     *
     * Allows setting a specific key to the specified value, OR passing
     * an array of key => value pairs to set en masse.
     *
     * @see __set()
     * @param string|array $spec The assignment strategy to use (key or
     * array of key => value pairs)
     * @param mixed $value (Optional) If assigning a named variable,
     * use this as the value.
     * @return void
     */
    
public function assign($spec$value null) {

        if (
is_array($spec)) {
            
$this->_smarty->assign($spec);
                return 
$this;
        }
        
$this->_smarty->assign($spec$value);
    }

    
/**
     * Clear all assigned variables
     *
     * Clears all variables assigned to Zend_View either via
     * {@link assign()} or property overloading
     * ({@link __get()}/{@link __set()}).
     *
     * @return void
     */
    
public function clearVars() {
        
$this->_smarty->clear_all_assign();
    }

    
/**
     * Processes a template and returns the output.
     *
     * @param string $name The template to process.
     * @param string $cacheId [optional]
     * @param string $compileId [optional]
     * @return string The output.
     */
    
public function render($name$cacheId null$compileId null) {

        return 
$this->_smarty->fetch($name$cacheId$compileId);
    }
    
    
/**
     * Enables Smarty caching
     *
     * @param integer $lifeTime in seconds
     * @param bool $global whether $lifeTime applies to all files
     * @return Jazz_View_Smarty
     */
    
public function enableCaching($lifeTime 300$global true) {
        
$this->_smarty->caching $global === true 2;
        
$this->_smarty->cache_lifetime $lifeTime;
        return 
$this;
    }

    
/**
     * Disables Smarty caching
     *
     * @return Jazz_View_Smarty
     */
    
public function disableCaching() {
        
$this->_smarty->caching 0;
        return 
$this;
    }

    
/**
     * Finds out if template is cached
     *
     * @param string $template Path to the template
     * @return boolean
     */
    
public function isCached($template$cacheId null$compileId null) {
        return 
$this->_smarty->is_cached($template$cacheId$compileId);
    }

    
/**
     * Here to satisfy Zend_View_Abstract
     *
     * @return void
     */
    
protected function _run() {
    }
}