<?php
/**
 * Single action button.
 * The action buttons are <input type="submit"> tags.
 * 
 * <b>Usage</b>
 * 
 * Upon clicking the button below will redirect the user to doAction under the current controller.
 * 
 * <code>
 * new FormAction (
 *    // doAction has to be a defined controller member
 *    $action = "doAction",
 *    $title = "Submit button"
 * )
 * </code>
 * 
 * @package forms
 * @subpackage actions
 */
class FormAction extends FormField {

	protected $template = 'FormAction';

	protected $action;
	
	/**
	 * Enables the use of <button> instead of <input>
	 * in {@link Field()} - for more customizeable styling.
	 * 
	 * @var boolean $useButtonTag
	 */
	public $useButtonTag = false;
	
	private $buttonContent = null;
	
	/**
	 * Add content inside a button field.
	 */
	function setButtonContent($content) {
		$this->buttonContent = (string) $content;
	}
	
	
	/**
	 * Create a new action button.
	 * @param action The method to call when the button is clicked
	 * @param title The label on the button
	 * @param form The parent form, auto-set when the field is placed inside a form 
	 */
	function __construct($action, $title = "", $form = null) {
		$this->action = "action_$action";
		parent::__construct($this->action, $title, null, $form);
	}

	static function create($action, $title = "") {
		return new FormAction($action, $title);
	}

	function actionName() {
		return substr($this->name, 7);
	}
	
	/**
	 * Set the full action name, including action_
	 * This provides an opportunity to replace it with something else
	 */
	function setFullAction($fullAction) {
		$this->action = $fullAction;
	}

	function Field($properties = array()) {
		$properties = array_merge(
			$properties,
			array(
				'Name' => $this->action,
				'Title' => ($this->description) ? $this->description : $this->Title(),
				'UseButtonTag' => $this->useButtonTag
			)
		);
		return $this->customise($properties)->renderWith($this->getTemplate());
	}

	public function Type() {
		return 'action';
	}

	function getAttributes() {
		return array_merge(
			parent::getAttributes(),
			array(
				'disabled' => ($this->isReadonly() || $this->isDisabled()),
				'value' => $this->Title(),
				'type' => ($this->useButtonTag) ? null : 'submit'
			)
		);
	}

	function extraClass() {
		return 'action ' . parent::extraClass();
	}

	/**
	 * Does not transform to readonly by purpose.
	 * Globally disabled buttons would break the CMS.
	 */
	function performReadonlyTransformation() {
		$clone = clone $this;
		$clone->setReadonly(true);
		return $clone;
	}

}