<?php

/**
 * Goweb Sitemanager 5 Framework
 *
 * Classe de geracao de XML (alpha!!!)
 *
 * @version    5.0.0
 * @category   Goweb
 * @package    Goweb_Xml
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2009 (c) Goweb (http://www.goweb.pt)
 */

class Goweb_Xml {

    /**
     * noh
     *
     * @var DOMDocument
     */
    private $doc = null;

    /**
     * Constructor
     *
     * @param String $sVersion versao do XML
     * @param String $encoding encoding do XML
     */
    public function __construct($stylesheet = null, $sVersion = '1.0', $encoding = 'iso-8859-15') {
        $this->doc = new DOMDocument($sVersion, $encoding);
        if (is_string($stylesheet) && ! empty($stylesheet))
            $this->insertStylesheet($stylesheet, $encoding) ;
    }
    
    /**
     * Inserir stylesheet no XML
     *
     * @param String $stylesheet link do stylesheet 
     * @param String $encoding encoding do XML
     */
    public function insertStylesheet($stylesheet, $encoding = 'iso-8859-15'){
        if (is_string($stylesheet) && ! empty($stylesheet)){
            $this->doc->insertBefore(
            new DOMProcessingInstruction('xml-stylesheet', "type='text/xsl' encoding='{$encoding}' href='{$stylesheet}'")) ;
        }else
            throw new Goweb_Exception("Par&acirc;metro errado.") ;
    }
    
    /**
     * defenir um noh
     * 
     * @param (string) sText : texto do noh
     * @param (array) aAttr : array de atributos do noh
     * @param (int) pai_id : id do noh pai
     * @return (int) id do novo noh
     */
    public function defineNode($sText, $nodeName = 'node', $aAttr = array(), $pai_id=0, $iNewId = null) {
        $newElem = $this->doc->createElement($nodeName, $sText);
        if (is_null($iNewId)){
            $dump = $this->doc->getElementsByTagName($nodeName);
            $iNewId = $dump->length + 1;
        }
        if($pai_id===0){
            $newElem = $this->doc->appendChild($newElem);
        }
        else {
            $parent = $this->doc->getElementById($pai_id);
            if ($parent){
                $newElem = $parent->appendChild($newElem);
            }else{
                $newElem = $this->doc->appendChild($newElem);
            }
        }
        $newElem->setAttribute('xml:id', $iNewId);
        if(!empty($aAttr) && is_array($aAttr)) {
            $this->defineAttributes($aAttr, $iNewId);
        }
        return $iNewId;
    }

    /**
     * definir atributos para um determinado noh
     * 
     * @param (array) aAttr : array de atributos
     * @param (int) iId : id do noh
     */
    public function defineAttributes($aAttr, $iId) {
        $elem = $this->doc->getElementById($iId);
        foreach($aAttr as $attrName => $attrValue) {
            $elem->setAttribute($attrName, $attrValue);
        }
    }

    /**
     * returna o XML(visivel no browser)
     * 
     * @return (string) XML
     */
    public function __toString() {
        return htmlentities($this->doc->saveXML());
    }

    /**
     * returna o XML
     * 
     * @return (string) XML
     */
    public function getXml() {
        return $this->doc->saveXML();
    }
    
    /**
     * gravar xml para um ficheiro (deve ser usado full path, sem extensao)
     * 
     * @param (string) ficheiro
     */
    public function xmlToFile($ficheiro) {
        $this->doc->save($ficheiro.'.xml');
    }

    /**
     * carregar xml apartir de um ficheiro (deve ser usado full path, sem extensao)
     * 
     * @param (string) ficheiro
     */
    public function fileToXml($ficheiro) {
        $this->doc->load($ficheiro.'.xml');
    }
}