<?php
require_once 'HTML/QuickForm/Renderer.php';

class HTML_QuickForm_Renderer_Xml extends HTML_QuickForm_Renderer
{
   /**
    * Current section
    * @var xml_element
    */
    var $_currentSection;

   /**
    * Current group
    * @var xml_element
    */
    var $_currentGroup = null;

    var $_xml_dom;
    
    var $_xml_element;
    
    function HTML_QuickForm_Renderer_Xml($xml_dom, $xml_element)
    {
        $this->HTML_QuickForm_Renderer();

        $xml_form = $xml_dom->create_element('form');
        $xml_element->append_child($xml_form);

        $this->_xml_dom = $xml_dom;
        $this->_xml_element = $xml_form;
    } // end constructor


   /**
    * Returns the resultant array
    * 
    * @access public
    * @return array
    */
    function toArray()
    {
        return $this->_ary;
    }


    function startForm(&$form)
    {
        $this->_xml_element->set_attribute('forzen', $form->isFrozen()); 
        
        $attributes = $form->getAttributes();
        foreach($attributes as $key => $value)
        {
          $this->_xml_element->set_attribute($key, $value);
        }
        

        $xml_javascript = $this->_xml_dom->create_element('javascript');
        $xml_javascript_text = $this->_xml_dom->create_text_node($form->getValidationScript());
        $xml_javascript->append_child($xml_javascript_text);
        $this->_xml_element->append_child($xml_javascript);
        
        $xml_required = $this->_xml_dom->create_element('requirednote');
        $xml_required_text = $this->_xml_dom->create_text_node($form->getRequiredNote());
        $xml_required->append_child($xml_required_text);
        $this->_xml_element->append_child($xml_required);
        
        $this->_elementIdx     = 1;
        $this->_currentSection = null;
        $this->_sectionCount   = 0;
    } // end func startForm


    function renderHeader(&$header)
    {
        $xml_header = $this->_xml_dom->create_element('section');
        $xml_header->set_attribute('name', $header->toHTML());
        $this->_xml_element->append_child($xml_header);
        $this->_currentSection = $xml_header;
    } // end func renderHeader


    function renderElement(&$element, $required, $error)
    {
        $xml_element = $this->_xml_dom->create_element('element');
        $xml_element_text = $this->_xml_dom->create_text_node($element->getValue());
        $xml_element->append_child($xml_element_text);
        $xml_element->set_attribute('name', $element->getName());
        $xml_element->set_attribute('type', $element->getType());
        if ($element->isFrozen())
        {
          $xml_element->set_attribute('frozen', $element->isFrozen());
        }
        if ($required)
        {
          $xml_element->set_attribute('required', 'true');
        }
        if ($error)
        {
          $xml_element->set_attribute('error', $error);
        }
        
        $xml_element->set_attribute('label', $element->getLabel());
        if ($this->_currentGroup)
        {
          $this->_currentGroup->append_child($xml_element);
        }
        elseif ($this->_currentSection)
        {
          $this->_currentSection->append_child($xml_element);
        }
        else
        {
          $this->_xml_element->append_child($xml_element);
        }

        
    } // end func renderElement


    function renderHidden(&$element)
    {
        $xml_hidden = $this->_xml_dom->create_element('hidden');
        $xml_hidden->set_attribute('name', $element->getName());
        $xml_hidden_text = $this->_xml_dom->create_text_node($element->getValue());
        $xml_hidden->append_child($xml_hidden_text);
        if ($this->_currentGroup)
        {
          $this->_currentGroup->append_child($xml_hideen);
        }
        elseif ($this->_currentSection)
        {
          $this->_currentSection->append_child($xml_hidden);
        }
        else
        {
          $this->_xml_element->append_child($xml_hidden);
        }
    } // end func renderHidden


    function startGroup(&$group, $required, $error)
    {
        $xml_group = $this->_xml_dom->create_element('group');
        $xml_group->set_attribute('name', $group->getName());
        if ($required)
        {
          $xml_group->set_attribute('required', 'true');
        }
        if ($error)
        {
          $xml_group->set_attribute('error', $error);
        }
        $this->_currentGroup = $xml_group;
    } // end func startGroup


    function finishGroup(&$group)
    {
        if ($this->_currentSection)
        {
          $this->_currentSection->append_child($this->_currentGroup);
        }
        else
        {
          $this->_xml_element->append_child($this->_currentGroup);
        }
        $this->_currentGroup = null;
    } // end func finishGroup

}
?>
