<?php

namespace {
    /**
     * Class representing a HTML form
     *
     * PHP version 5
     *
     * LICENSE:
     *
     * Copyright (c) 2006-2010, Alexey Borzov <avb@php.net>,
     *                          Bertrand Mansion <golgote@mamasam.com>
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     *    * Redistributions of source code must retain the above copyright
     *      notice, this list of conditions and the following disclaimer.
     *    * Redistributions in binary form must reproduce the above copyright
     *      notice, this list of conditions and the following disclaimer in the
     *      documentation and/or other materials provided with the distribution.
     *    * The names of the authors may not be used to endorse or promote products
     *      derived from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
     * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     * @category   HTML
     * @package    HTML_QuickForm2
     * @author     Alexey Borzov <avb@php.net>
     * @author     Bertrand Mansion <golgote@mamasam.com>
     * @license    http://opensource.org/licenses/bsd-license.php New BSD License
     * @version    SVN: $Id: QuickForm2.php 299706 2010-05-24 18:32:37Z avb $
     * @link       http://pear.php.net/package/HTML_QuickForm2
     */
    /**
     * Abstract base class for QuickForm2 containers
     */
    // require_once 'HTML/QuickForm2/Container.php';
    /**
     * Data source for HTML_QuickForm2 objects based on superglobal arrays
     */
    // require_once 'HTML/QuickForm2/DataSource/SuperGlobal.php';
    /**
     * Class representing a HTML form
     *
     * @category   HTML
     * @package    HTML_QuickForm2
     * @author     Alexey Borzov <avb@php.net>
     * @author     Bertrand Mansion <golgote@mamasam.com>
     * @version    Release: @package_version@
     */
    class HTML_QuickForm2 extends \HTML_QuickForm2_Container
    {
        /**
         * Data sources providing values for form elements
         * @var array
         */
        protected $datasources = array();
        /**
         * We do not allow setting "method" and "id" other than through constructor
         * @var array
         */
        protected $watchedAttributes = array('id', 'method');
        /**
         * Class constructor, form's "id" and "method" attributes can only be set here
         *
         * @param    string  "id" attribute of <form> tag
         * @param    string  HTTP method used to submit the form
         * @param    mixed   Additional attributes (either a string or an array)
         * @param    bool    Whether to track if the form was submitted by adding
         *                   a special hidden field
         */
        public function __construct($id, $method = 'post', $attributes = null, $trackSubmit = \true)
        {
            $method = 'GET' == \strtoupper($method) ? 'get' : 'post';
            if (empty($id)) {
                $id = self::generateId('');
                $trackSubmit = \false;
            } else {
                self::storeId($id);
            }
            $this->attributes = \array_merge(self::prepareAttributes($attributes), array('id' => (string) $id, 'method' => $method));
            if (!isset($this->attributes['action'])) {
                $this->attributes['action'] = $_SERVER['PHP_SELF'];
            }
            if ($trackSubmit && isset($_REQUEST['_qf__' . $id]) || !$trackSubmit && ('get' == $method && !empty($_GET) || 'post' == $method && (!empty($_POST) || !empty($_FILES)))) {
                $this->addDataSource(new \HTML_QuickForm2_DataSource_SuperGlobal($method, \False));
            }
            if ($trackSubmit) {
                $this->appendChild(\HTML_QuickForm2_Factory::createElement('hidden', '_qf__' . $id));
            }
        }
        protected function onAttributeChange($name, $value = null)
        {
            throw new \HTML_QuickForm2_InvalidArgumentException('Attribute \'' . $name . '\' is read-only');
        }
        protected function setContainer(?\HTML_QuickForm2_Container $container = null)
        {
            throw new \HTML_QuickForm2_Exception('Form cannot be added to container');
        }
        public function setId($id = null)
        {
            throw new \HTML_QuickForm2_InvalidArgumentException("Attribute 'id' is read-only");
        }
        /**
         * Adds a new data source to the form
         *
         * @param    HTML_QuickForm2_DataSource  Data source
         */
        public function addDataSource(\HTML_QuickForm2_DataSource $datasource)
        {
            $this->datasources[] = $datasource;
            $this->updateValue();
        }
        /**
         * Replaces the list of form's data sources with a completely new one
         *
         * @param    array   A new data source list
         * @throws   HTML_QuickForm2_InvalidArgumentException    if given array
         *               contains something that is not a valid data source
         */
        public function setDataSources(array $datasources)
        {
            foreach ($datasources as $ds) {
                if (!$ds instanceof \HTML_QuickForm2_DataSource) {
                    throw new \HTML_QuickForm2_InvalidArgumentException('Array should contain only DataSource instances');
                }
            }
            $this->datasources = $datasources;
            $this->updateValue();
        }
        /**
         * Returns the list of data sources attached to the form
         *
         * @return   array
         */
        public function getDataSources()
        {
            return $this->datasources;
        }
        public function getType()
        {
            return 'form';
        }
        public function setValue($value)
        {
            throw new \HTML_QuickForm2_Exception('Not implemented');
        }
        /**
         * Performs the server-side validation
         *
         * @return   boolean Whether all form's elements are valid
         */
        public function validate()
        {
            $isSubmitted = \false;
            foreach ($this->datasources as $ds) {
                if ($ds instanceof \HTML_QuickForm2_DataSource_Submit) {
                    $isSubmitted = \true;
                    break;
                }
            }
            return $isSubmitted ? parent::validate() : \false;
        }
        /**
         * Renders the form using the given renderer
         *
         * @param    HTML_QuickForm2_Renderer    Renderer instance
         * @return   HTML_QuickForm2_Renderer
         */
        public function render(\HTML_QuickForm2_Renderer $renderer)
        {
            $renderer->startForm($this);
            $renderer->getJavascriptBuilder()->startForm($this);
            foreach ($this as $element) {
                $element->render($renderer);
            }
            $renderer->finishForm($this);
            return $renderer;
        }
    }
}
