data = $data;
		if (!$type) 
		{
			$type = $this->calculateType();
		}
		$this->type = $type;
		if ($type == 'struct') 
		{
			// Turn all the values in the array into new Value objects
			foreach ($this->data as $key => $value) 
			{
				$this->data[$key] = new Value($value);
			}
		}
		if ($type == 'array') 
		{
			for ($i = 0, $j = count($this->data); $i < $j; $i++) 
			{
				$this->data[$i] = new Value($this->data[$i]);
			}
		}
	}
	function calculateType() 
	{
		if ($this->data === true || $this->data === false) 
		{
			return 'boolean';
		}
		if (is_integer($this->data)) 
		{
			return 'int';
		}
		if (is_double($this->data)) 
		{
			return 'double';
		}
		// Deal with IXR object types base64 and date
		if (is_object($this->data) && $this->data instanceof Date) 
		{
			return 'date';
		}
		if (is_object($this->data) && $this->data instanceof Base64) 
		{
			return 'base64';
		}
		// If it is a normal PHP object convert it into a struct
		if (is_object($this->data)) 
		{
			$this->data = get_object_vars($this->data);
			return 'struct';
		}
		if (!is_array($this->data)) 
		{
			return 'string';
		}
		// We have an array - is it an array or a struct?
		if ($this->isStruct($this->data)) 
		{
			return 'struct';
		} 
		else 
		{
			return 'array';
		}
	}
	function getXml() 
	{
		// Return XML for this value
		switch ($this->type) 
		{
			case 'boolean':
				return '' . ($this->data ? '1' : '0') . '';
				break;
			case 'int':
				return '' . $this->data . '';
				break;
			case 'double':
				return '' . $this->data . '';
				break;
			case 'string':
				return '' . htmlspecialchars($this->data) . '';
				break;
			case 'array':
				$return = '' . LF;
				foreach ($this->data as $item) 
				{
					$return .= '	' . $item->getXml() . '' . LF;
				}
				$return .= '';
				return $return;
				break;
			case 'struct':
				$return = '' . LF;
				foreach ($this->data as $name => $value) 
				{
					$return .= '	' . $name . '';
					$return .= $value->getXml() . '' . LF;
				}
				$return .= '';
				return $return;
				break;
			case 'date':
			case 'base64':
				return $this->data->getXml();
				break;
		}
		return false;
	}
	function isStruct($array) 
	{
		// Nasty function to check if an array is a struct or not
		$expected = 0;
		foreach ($array as $key => $value) 
		{
			if ((string)$key != (string)$expected) 
			{
				return true;
			}
			$expected++;
		}
		return false;
	}
}
?>