<?php

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

goweb::loadClass('Zend_Json');

/**
 * Classe para gerar o javascript do tafeltree
 * baseado em TafelTreeBranch.class.php
 *
 * @version    5.0.0
 * @category   Goweb
 * @package    Goweb_Js
 * @subpackage TafelTree_Branch
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2009 (c) Goweb (http://www.goweb.pt)
 */
class Goweb_Js_TafelTree_Branch {

    /**
     * Identificação do ramo
     *
     * @var string
     */
    public $id;

    /**
     * Texto do ramo
     *
     * @var string
     */
    public $txt;
    
    /**
     * Numero máximo de niveis a abrir
     *
     * @var unknown_type
     */
    protected $_maxLevel = 0;

    /**
     * Contructor
     *
     */
    public function __construct(){
    }

    /**
     * Load les infos depuis une string JSON
     *
     * @access	public
     * @param 	string			$json					La string JSON
     * @return 	array									Les Goweb_Js_TafelTree_Branch créées
     */
    public function loadJSON ($json) {
        $service = new Zend_Json();
        $obj = $service->decode($json);
        $branches = array();
        foreach ($obj as $s) {
            $branches[] = Goweb_Js_TafelTree_Branch::loadServiceJSON($s);
        }
        return $branches;
    }

    /**
     * Load les infos depuis un objet Zend_Json
     *
     * @access	public
     * @param 	Zend_Json	$service				L'objet Zend_Json
     * @return 	array									Les Goweb_Js_TafelTree_Branch créées
     */
    public function loadServiceJSON ($service) {
        $branch = new Goweb_Js_TafelTree_Branch();
        // On check toutes les propriétés de branche
        foreach ($service as $property => $value) {
            if ($property != 'items') {
                $branch->setParam($property, $value);
            }
        }
        // On check les enfants
        if (isset($service) && isset($service->items)) {
            $branch->items = array();
            foreach ($service->items as $b) {
                $branch->items[] = Goweb_Js_TafelTree_Branch::loadServiceJSON($b);
            }
        }
        return $branch;
    }



    /**
     *------------------------------------------------------------------------------
     *							Fonctions getters et setters
     *------------------------------------------------------------------------------
     */

    public function getId () {
        return $this->id;
    }
    public function setId ($id) {
        $this->id = $id;
    }

    public function getText () {
        return $this->txt;
    }
    public function setText ($txt) {
        $this->txt = $txt;
    }

    /**
     * Retourne la valeur d'une propriété, si elle existe
     *
     * @access 	public
     * @param 	string			$param					La propriété à chercher
     * @return 	string									La valeur de la propriété
     */
    public function getParam ($param) {
        if (isset($this->$param)) {
            return $this->$param;
        }
    }

    /**
     * Set un paramètre pour la branche
     *
     * @access 	public
     * @param 	string			$param					Le nom de la propriété
     * @param 	string			$value					La valeur de la propriété
     */
    public function setParam ($param, $value) {
        if ($param == 'id') {
            $this->setId($value);
        } elseif ($param == 'txt') {
            $this->setText($value);
        } else {
            $this->$param = $value;
        }
    }


    /**
     *------------------------------------------------------------------------------
     *							Fonctions publiques
     *------------------------------------------------------------------------------
     */

    /**
     * Ajoute une branche comme enfant
     *
     * @access 	public
     * @param 	Goweb_Js_TafelTree_Branch		$branch				La branche à ajouter
     * @return 	void
     */
    public function add (Goweb_Js_TafelTree_Branch $branch) {
        if (!isset($this->items)) {
            $this->items = array();
        }
        $this->items[] = $branch;
    }
    
    /**
     * Configurar o nível máximo para abrir a arvore
     *
     * @param int $level
     */
    public function setMaxLevel($level = 1){
        $this->_maxLevel = $level;
    }

    /**
     * Ajoute une sous-branche à la branche courante
     *
     * @access 	public
     * @param 	string			$id						L'id de la sous-branche
     * @param 	string			$txt					Le texte de la sous-branche
     * @param 	array			$options				Les informations complémentaires
     * @return 	Goweb_Js_TafelTree_Branch							La sous-branche
     */
    public function addBranch ($id, $txt, $options = array(), $level = 0) {
        $branch = new Goweb_Js_TafelTree_Branch ();
        $branch->setMaxLevel($this->_maxLevel);
        $branch->setId($id);
        $branch->setText($txt);
        if ($level >= $this->_maxLevel && isset($options['open'])) unset($options['open']);
        foreach ($options as $property => $value) {
            if ($property != 'items') {
                $branch->setParam($property, $value);
            }
        }
        if (isset($options['items'])) {
            foreach ($options['items'] as $opt) {
                $level++;
                $branch->addBranch(null, null, $opt, $level);
                $level--;
            }
        }
        if (!isset($this->items)) {
            $this->items = array();
        }
        $this->items[] = $branch;
        return $branch;
    }

    /**
     * Retourne la string JSON qui correspond à la structure de la branche et sous-branches
     *
     * @access 	public
     * @return 	string									La string JSON de la branche
     */
    public function getJSON () {
        $service = new Zend_Json();
        return $service->encode($this);
    }
}
