<?php

/**
 * Goweb Sitemanager 5 Framework
 *
 * Ficheiro de metodos comuns 
 *
 * @version    5.0.19
 * @category   Goweb
 * @package    Goweb_Js
 * @subpackage AjaxTree
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2010 (c) Goweb (http://www.goweb.pt)
 */

/**
 * Classe para gerar o javascript do dtree
 *
 * @version    5.0.19
 * @category   Goweb
 * @package    Goweb_Js
 * @subpackage AjaxTree
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2010 (c) Goweb (http://www.goweb.pt)
 */
class Goweb_Js_AjaxTree {

    /**
     * Nome da variável da tree
     * 
     * @var  string
     */
    protected $_name = '';

    /**
     * Valor da tree no caso de haver um formul&aacute;rio
     * 
     * @var  string
     */
    protected $_value = null;

    /**
     * Array com os nodes
     * 
     * @var  array
     */
    protected $_nodes = array();

    /**
     * Array com os par&acirc;metros
     * 
     * @var  array  
     */
    protected $_params = array();

    /**
     * Titulo da tree
     * 
     * @var  string
     */
    protected $_title = '';
    
    /**
     * ID do node a abrir
     * 
     * @var  int
     */
    protected $_openTo = null;

    /**
     * Expandir ervore
     * 
     * @var  bool
     */
    protected $_model = false;
    
    public function __construct($name, $value = null) {
        $this->_name = $name;
        $this->_value = $value;
    }

    /**
     * Atribui um valor à tree.
     * 
     * @param  mixed  $value  Valor
     */
    public function setValue($value) {
        $this->_value = $value;
    }
    
    /**
     * Atribui os IDs a abrir.
     * 
     * @param  array      $id        Os IDs a abrir
     */
    public function setOpenTo($id) {
        $this->_openTo = $id;
    }

    /**
     * Define se e para expandir a ervore
     * 
     * @param  boolean  $expand  TRUE para expandir
     */
    public function setModel($model) {
        $this->_model = $model;
    }

    /**
     * Efectua o redering e retorna o ouput do javascript.
     *
     * @return  string  O output do javascript
     */
    public function render($expand = false) {
        $output  = '<div id="'.$this->_name.'_parent"></div>'."\n";
        
        $output .= "<script type=\"text/javascript\">\n";
        $output .= "//<![CDATA[\n";
        $output .= "Ajax.Tree.Goweb = Ajax.Tree.create({
				types: {
					node: {
						page: '".str_replace('/admin', '', Goweb::link('/index/jsonModel/')) . '?model=' . $this->_model . ($this->_value ? '&model_value=' . $this->_value : '') . "'
					},
					leafnode: {
						leafNode: true
					}
					
			}\n
			});\n";
        $output .= "new Ajax.Tree.Goweb('".$this->_name."_parent','".$this->_name."-0','node',{
        data:'".translateAdmin('Raiz')."'
    	});\n";
        if ($this->_openTo && is_array($this->_openTo)){
            $output .= "function init_ajax_tree_".$this->_name."(){\n";
            $output .= "$('".$this->_name.'-0'."').triggerEvent('click');\n";
            foreach ($this->_openTo as $open){
                $output .= "$('".$this->_name.'-'.$open."').triggerEvent('click');\n";
            }
            $output .= "}\n";
            $output .= "Event.observe(window, 'load', init_ajax_tree_".$this->_name.", false);\n"; 
        }
        $output .= "//]]>\n";
	    $output .= "</script>\n";
        return $output;
    }

    /**
     * Retorna o titulo da tree.
    */
    public function getTitle() {
        return $this->_title;        
    }
    
    /**
     * Transforma um campo boleano numa string
     * 
     * @return  string
     */
    protected function _booleanToString($value) {
        return ($value) ? 'true' : 'false';
    }
    
    /**
     * Atribui um valor ao par&acirc;metro
     * 
     * @param   string  O nome do par&acirc;metro
     * @param   mixed   O valor do par&acirc;metro
     * @throws  Goweb_Exception  No caso do par&acirc;metro n&atilde;o existir
     */
    public function __set($key, $value) {
        if (!array_key_exists($key, $this->_params)) {
            throw new Goweb_Exception("O par&acirc;metro '$key' n&atilde;o existe na classe '" . get_class($this) . "'");
        }
        $this->_params[$key] = $value;
    }

    /**
     * Retorna o valor de um par&acirc;metro
     * 
     * @param   string  O nome do par&acirc;metro
     * @throws  Goweb_Exception  No caso do par&acirc;metro n&atilde;o existir
     * @return  mixed   O valor do par&acirc;metro
     */
    public function __get($key) {
        if (!array_key_exists($key, $this->_params)) {
            throw new Goweb_Exception("O par&acirc;metro '$key' n&atilde;o existe na classe '" . get_class($this) . "'");
        }
        return $this->_params[$key];
    }
}
