<?php
/**
 * @copyright NetMonsters <team@netmonsters.ru>
 * @link http://netmonsters.ru
 * @package Majestic
 * @subpackage View
 * @since 2010-02-25
 * @version SVN: $Id$
 * @filesource $URL$
 */

/**
 * @method BreadcrumbViewHelper breadcrumb() breadcrumb(string $text = false, string $href = false) Append next link to breadcrumb
 * @method GetViewHelper get() get(array $replace) Replace some HTTP GET parameters with $replace
 * @method HeadViewHelper head() head(string $string = false) Append another string to HEAD section of Layout
 * @method MsgViewHelper msg() msg(string $msg = null, string $type = null) Set a message to display for user in Layout
 * @method TitleViewHelper title() title(string $string = false) Append another setcion for TITLE of Layout
 *
 */
class PHPView implements iView
{
    
    protected $path      = '';
    protected $variables = array();
    protected $helpers   = array();
    protected $extension = '.phtml';
    protected $template  = '';
    
    public function __construct($config)
    {
        if (!isset($config['path'])) {
            throw new InitializationException('Configuration must have a "path" set.');
        }
        $this->setPath($config['path']);
    }
    
    public function getPath()
    {
        return $this->path;
    }
    
    public function setPath($path)
    {
        $this->path = $path;
    }
    
    /**
     * @param Action $object
     */
    public function assignObject($object)
    {
        foreach (get_object_vars($object) as $name => $value) {
            $this->assign($name, $value);
        }
    }
    
    /**
     * @param string $name
     * @param mixed $value
     */
    public function assign($name, $value = null)
    {
        $this->variables[$name] = $value;
    }
    
    /**
     * @param string $name
     * @param mixed $value
     */
    public function prepend($name, $value)
    {
        if (isset($this->variables[$name])) {
            $this->variables[$name] = $value . $this->variables[$name];
        } else {
            $this->variables[$name] = $value;
        }
    }
    
    /**
     * @param string $name
     * @param mixed $value
     */
    public function append($name, $value)
    {
        if (isset($this->variables[$name])) {
            $this->variables[$name] .= $value;
        } else {
            $this->variables[$name] = $value;
        }
    }
    
    public function fetch($template)
    {
        $this->template = $this->getTemplatePath($template);
        unset($template);
        extract($this->variables);
        ob_start();
        if (!is_readable($this->template)) {
            ob_clean();
            throw new GeneralException('Template "' . $this->template .'" not found.');
        }
        include($this->template);
        return ob_get_clean();
    }
    
    public function escape($var)
    {
        return htmlentities($var, ENT_QUOTES, 'UTF-8');
    }
    
    /**
     * Helpers call
     * 
     * @param mixed $name
     * @param mixed $args
     * @return ViewHelper
     */
    public function __call($name, $args)
    {
        $helper = $this->getHelper($name);
        return call_user_func_array(array($helper, $name), $args);
    }
    
    protected function getHelper($name)
    {
        if (!isset($this->helpers[$name])) {
            $class = ucfirst($name) . 'ViewHelper';
            if (!class_exists($class)) {
                throw new GeneralException('View helper "' . $class . '" not found.');
            }
            $this->helpers[$name] = new $class($this);
        }
        return $this->helpers[$name];
    }
    
    protected function getTemplatePath($template)
    {
        return $this->path . $template . $this->extension;
    }
}