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

class Goweb_Js_SimpleTree {
    /**
     * Array com a tree a ser desenhada
     * 
     * @var  string
     */
    protected $_tree = '';
    
    /**
     * String com a url da Raiz
     * 
     * @var  string
     */
    protected $_rootUrl = '';
    
    public function __construct($model, $ordem = null, $cols = array(), $rootUrl = null){
        $this->_rootUrl = $rootUrl;
        $this->createArrayTree($model, $ordem, $cols);
    }

    /**
     * Obter uma array com ordenado apartir do model...
     *
     * @param Model $tabela
     * @param String $filtro
     * @return array
     */
    public function createArrayTree($model, $ordem = null, $cols = array()){
        if (!array_key_exists('id', $cols)) {
            $cols['id'] = 'id';
        }
        if (!array_key_exists('pai_id', $cols)) {
            $cols['pai_id'] = 'pai_id';
        }
        if (!array_key_exists('titulo', $cols)) {
            $cols['titulo'] = 'titulo';
        }
        if (!array_key_exists('url', $cols)) {
            $cols['url'] = null;
        }
        
		/**
         * Obter os elementos do Model
         * filtrado por activo, ou por $filtro
         */
        if ($ordem){
            if ($model->colExists($ordem))
            $model->order($ordem);
        } else {
            if ($model->colExists('ordem'))
            $model->order('ordem');
        }
        if ($model->colExists('activo'))
            $model->where('activo = 1');
        /**
         * Especifico para o modu'lo de Cms/Pa'ginas
         */
        if ($model->colExists('sistema'))
            $model->where('sistema = 0');
            
        $campos = $model->fetchAll();
        if (!$campos) return array();
        $list = array();
        foreach ($campos as $campo){
            $list[] = array('id' => $campo->{$cols['id']},
                          'pai_id' => $model->colExists($cols['pai_id']) ? $campo->{$cols['pai_id']} : '0',
                          'titulo' => $campo->{$cols['titulo']},
                          'url' => !is_null($cols['url']) ? preg_replace("~{{id}}~s", $campo->{$cols['id']},  $cols['url'], 1) : 'javascript:void(0);' 
            );
        }

        $lookup = array();
        foreach( $list as $item ){
            $item['filhos'] = array();
            $lookup[$item['id']] = $item;
        }
        
        
        $tree = array();
        foreach( $lookup as $id => $foo ){
            $item = &$lookup[$id];
            if( $item['pai_id'] == 0 ){
                $tree[$id] = &$item;
            } else {
                if( isset( $lookup[$item['pai_id']] ) ){
                    $lookup[$item['pai_id']]['filhos'][$id] = &$item;
                } else {
                //    $tree['_sempai_'][$id] = &$item;
                }
            }
        }
        $this->_tree = $tree;
        return $tree;
    }
    /**
     * Efectua o redering e retorna o output do html.
     *
     * @return String O output do html
     */
    public function render(){
        $baseUrl = str_replace('/admin', '', Zend_Controller_Front::getInstance()->getBaseUrl());
        if (!is_array($this->_tree)) return false;
    	$output = '<div class="simpletree_root"><a href="';
    	if (is_null($this->_rootUrl))
    	    $output .= '" onclick="return false;"';
    	else
    	    $output .= $this->_rootUrl . '"';
    	$output .= '>' . translate('Raiz') . '</a>';
    	foreach ($this->_tree as $item):
    	    $output .= '<div id ="' . $item['id'] . '" class ="simpleTreeRootLevel">';
        	if (count($item['filhos']) > 0):
        		$output .= '<img src="' .  str_replace('/index.php', '', $baseUrl) . '/admin/media/images/simpletree/mais.gif" onclick="simpleTreeToggleNode(this.parentNode); changeImage(this); return false;">';
            else:
                $output .= '<img src="' .  str_replace('/index.php', '', $baseUrl) . '/admin/media/images/simpletree/folder.gif">';
        	endif;
        	if (strpos($item['url'], 'http://') === FALSE && strpos($item['url'], 'http://') === FALSE && strpos($baseUrl, $item['url']) === FALSE){
        	    $item['url'] = $baseUrl . $item['url'];
        	}
    	    $output .= '<a href="' . $item['url'] . '">';
        	$output .= $item['titulo'];
        	$output .= '</a>';
        	if (count($item['filhos']) > 0):
        		$output .= $this->_recursiveSimpleTreeRender($item['filhos']);
        	endif;
    	$output .= '</div>';
    	endforeach;
    	$output .= '</div>';
        return $output;
    }
    
    private function _recursiveSimpleTreeRender($items, $nivel = 1){
        $baseUrl = str_replace('/admin', '', Zend_Controller_Front::getInstance()->getBaseUrl());
        $output = "";
    	foreach ($items as $item):
    	    $output .= '<div id ="' . $item['id'] . '" class ="simpleTreeLevel' . $nivel . '">';
        	if (count($item['filhos']) > 0):
        		$output .= '<img src="' . str_replace('/index.php', '', $baseUrl) . '/admin/media/images/simpletree/mais.gif" onclick="simpleTreeToggleNode(this.parentNode); changeImage(this); return false;">';
            else:
                $output .= '<img src="' . str_replace('/index.php', '', $baseUrl) . '/admin/media/images/simpletree/folder.gif">';
        	endif;
        	if (strpos($item['url'], 'http://') === FALSE && strpos($item['url'], 'http://') === FALSE && strpos($baseUrl, $item['url']) === FALSE){
        	    $item['url'] = $baseUrl . $item['url'];
        	}
        	$output .= '<a href="' . $item['url'] . '">';
    	    $output .= $item['titulo'];
        	$output .= '</a>';
        	if (count($item['filhos']) > 0):
        		$output .= $this->_recursiveSimpleTreeRender($item['filhos'], $nivel + 1);
        	endif;
    	    $output .= '</div>';
    	endforeach;
        return $output;
    }
}