<?php
    /**
     *	base include file for SimpleTest
     *	@package	SimpleTest
     *	@subpackage	WebTester
     *	@version	$Id: encoding.php,v 1.6 2005/01/02 23:43:23 lastcraft Exp $
     */

    /**
     *    Bundle of GET/POST parameters. Can include
     *    repeated parameters.
	 *    @package SimpleTest
	 *    @subpackage WebTester
     */
    class SimpleFormEncoding {
        protected $_request;
        protected $_x;
        protected $_y;
        
        /**
         *    Starts empty.
         *    @param array $query/SimpleQueryString  Hash of parameters.
         *                                           Multiple values are
         *                                           as lists on a single key.
         *    @access public
         */
        function SimpleFormEncoding($query = false) {
            if (! $query) {
                $query = array();
            }
            $this->_request = array();
            $this->setCoordinates();
            $this->merge($query);
        }
        
        /**
         *    Adds a parameter to the query.
         *    @param string $key            Key to add value to.
         *    @param string/array $value    New data.
         *    @access public
         */
        function add($key, $value) {
            if ($value === false) {
                return;
            }
            if (! isset($this->_request[$key])) {
                $this->_request[$key] = array();
            }
            if (is_array($value)) {
                foreach ($value as $item) {
                    $this->_request[$key][] = $item;
                }
            } else {
                $this->_request[$key][] = $value;
            }
        }
        
        /**
         *    Adds a set of parameters to this query.
         *    @param array/SimpleQueryString $query  Multiple values are
         *                                           as lists on a single key.
         *    @access public
         */
        function merge($query) {
            if (is_object($query)) {
                foreach ($query->getKeys() as $key) {
                    $this->add($key, $query->getValue($key));
                }
                if ($query->getX() !== false) {
                    $this->setCoordinates($query->getX(), $query->getY());
                }
            } elseif (is_array($query)) {
                foreach ($query as $key => $value) {
                    $this->add($key, $value);
                }
            }
        }
        
        /**
         *    Sets image coordinates. Set to false to clear
         *    them.
         *    @param integer $x    Horizontal position.
         *    @param integer $y    Vertical position.
         *    @access public
         */
        function setCoordinates($x = false, $y = false) {
            if (($x === false) || ($y === false)) {
                $this->_x = $this->_y = false;
                return;
            }
            $this->_x = (integer)$x;
            $this->_y = (integer)$y;
        }
        
        /**
         *    Accessor for horizontal image coordinate.
         *    @return integer        X value.
         *    @access public
         */
        function getX() {
            return $this->_x;
        }
         
        /**
         *    Accessor for vertical image coordinate.
         *    @return integer        Y value.
         *    @access public
         */
        function getY() {
            return $this->_y;
        }
        
        /**
         *    Accessor for single value.
         *    @return string/array    False if missing, string
         *                            if present and array if
         *                            multiple entries.
         *    @access public
         */
        function getValue($key) {
            if (! isset($this->_request[$key])) {
                return false;
            } elseif (count($this->_request[$key]) == 1) {
                return $this->_request[$key][0];
            } else {
                return $this->_request[$key];
            }
        }
        
        /**
         *    Accessor for key list.
         *    @return array        List of keys present.
         *    @access public
         */
        function getKeys() {
            return array_keys($this->_request);
        }
        
        /**
         *    Renders the query string as a URL encoded
         *    request part.
         *    @return string        Part of URL.
         *    @access public
         */
        function asString() {
            $statements = array();
            foreach ($this->_request as $key => $values) {
                foreach ($values as $value) {
                    $statements[] = "$key=" . urlencode($value);
                }
            }
            $coords = ($this->_x !== false) ? '?' . $this->_x . ',' . $this->_y : '';
            return implode('&', $statements) . $coords;
        }
    }
?>