/*
 * Paraselene
 * Copyright (c) 2009, 2010  Akira Terasaki
 * このファイルは同梱されているLicense.txtに定めた条件に同意できる場合にのみ
 * 利用可能です。
 */
package paraselene.tag.form;


import java.io.*;
import paraselene.*;
import paraselene.tag.*;
import paraselene.ui.*;
import paraselene.supervisor.*;

/**
 * ボタン。
 */
public class Button extends Input implements PageHooker, Clickable {
	private static final long serialVersionUID = 2L;
	private boolean pushed = false;

	/**
	 * ボタンの種類。
	 */
	public enum Type {
		SUBMIT( Input.Type.SUBMIT ),
		RESET( Input.Type.RESET ),
		IMAGE( Input.Type.IMAGE ),
		BUTTON( Input.Type.BUTTON );

		private static final long serialVersionUID = 1L;
		Input.Type	type;
		private Type( Input.Type t ) {
			type = t;
		}
	}

	private Type const_type;

	/**
	 * コンストラクタ。
	 * @param type ボタンの種類。
	 */
	public Button( Type type ) {
		super( type.type );
		const_type = type;
	}

	/**
	 * ボタンの種類の取得。
	 * @return ボタンの種類。
	 */
	public Type getType() {
		return const_type;
	}

	protected Tag newReplica() {
		return copy4Replica( new Button( const_type ) );
	}

	/**
	 * ボタン押下状態の解除。<br>
	 * setClicked( false ) と等価です。
	 */
	public void resetClicked() {
		setClicked( false );
	}

	public boolean isClicked( RequestParameter req ) {
		Form	form = getForm();
		if ( form == null )	return false;
		RequestItem	item = req.getItem( getNameAttribute() );
		if ( item == null )	return false;
		RequestItem	form_id = req.getItem( Form.FORM_ID );
		if ( form_id == null )	return false;
		if ( !form.getID().equals( form_id.getValue() ) )	return false;
		String	iv = item.getValue();
		if ( iv == null )	iv = "";
		String	tv = getValueAttribute();
		if ( tv == null )	tv = "";
		return iv.equals( tv );
	}

	/**
	 * ボタン押下がされたか？
	 * @return true:押下された、false:押下されていない。
	 */
	public boolean isClicked() {
		return pushed;
	}

	public void setClicked( boolean flag ) {
		pushed = flag;
	}

	public Forward beforeInput( Page page, RequestParameter req, Forward fw ) throws Exception {
		return fw;
	}

	public void afterOutput( Page from, Page to, RequestParameter req ) throws Exception {
		commitDaemon();
	}

	public void commitDaemon() {
		StringBuilder	buf = new StringBuilder( "function(ev){" );
		buf = buf.append( "paraselene.form_kill=" );
		buf = buf.append( isAjaxEnable()?	"false":	"true" );
		buf = buf.append( ";}" );
		setAnonymousEventHandler( "click", buf.toString() );
	}
}

