<?php
/**
 * Set of radio buttons designed to emulate a dropdown.
 * It even uses the same constructor as a dropdown field.
 * @package forms
 * @subpackage fields-basic
 */
class OptionsetField extends DropdownField {
	
	/**
	 * @var Array
	 */
	protected $disabledItems = array();
	
	/**
	 * Creates a new optionset field.
	 * @param name The field name
	 * @param title The field title
	 * @param source An map of the dropdown items
	 * @param value The current value
	 * @param form The parent form
	 */
	function __construct($name, $title = "", $source = array(), $value = "", $form = null) {
		parent::__construct($name, $title, $source, $value, $form);
	}

	/**
	 * Create a UL tag containing sets of radio buttons and labels.  The IDs are set to
	 * FieldID_ItemKey, where ItemKey is the key with all non-alphanumerics removed.
	 * 
	 * @todo Should use CheckboxField FieldHolder rather than constructing own markup.
	 */
	function Field() {
		$options = '';
		$odd = 0;
		$source = $this->getSource();
		foreach($source as $key => $value) {
			$itemID = $this->id() . "_" . ereg_replace('[^a-zA-Z0-9]+','',$key);
		
			if($key == $this->value/* || $useValue */) {
				$useValue = false;
				$checked = " checked=\"checked\"";
			} else {
				$checked="";
			}
			
			$odd = ($odd + 1) % 2;
			$extraClass = $odd ? "odd" : "even";
			$extraClass .= " val" . preg_replace('/[^a-zA-Z0-9\-\_]/','_', $key);
			$disabled = ($this->disabled || in_array($key, $this->disabledItems)) ? 'disabled="disabled"' : '';
			
			$options .= "<li class=\"".$extraClass."\"><input id=\"$itemID\" name=\"$this->name\" type=\"radio\" value=\"$key\"$checked $disabled class=\"radio\" /> <label for=\"$itemID\">$value</label></li>\n";
		}
		$id = $this->id();
		return "<ul id=\"$id\" class=\"optionset {$this->extraClass()}\">\n$options</ul>\n";
	}
	
	protected $disabled = false;
	function setDisabled($val) {
		$this->disabled = $val;
	}
	
	function performReadonlyTransformation() {
		// Source and values are DataObject sets.
		$items = $this->getSource();
		$field = new LookupField($this->name,$this->title ? $this->title : "" ,$items,$this->value);
		$field->setForm($this->form);
		$field->setReadonly(true);
		return $field;
	}
	
	/**
	 * Mark certain elements as disabled,
	 * regardless of the {@link setDisabled()} settings.
	 * 
	 * @param array $items Collection of array keys, as defined in the $source array
	 */
	function setDisabledItems($items) {
		$this->disabledItems = $items;
	}
	
	/**
	 * @return Array
	 */
	function getDisabledItems() {
		return $this->disabledItems;
	}
	
	function ExtraOptions() {
		return new DataObjectSet();
	}
}
?>