package org.itscool.weber.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;

import org.itscool.commons.util.JspTagUtil;
import org.itscool.weber.controller.Globals;

/**
 * HTMLの&lt;inut type="radio"&gt;タグを生成するタグです。<BR>
 * name属性で指定したBeanに対応するプロパティの値になります。<BR>
 * name属性を指定しない場合はnull値を返します。<BR>
 *（sturtsの場合はStruts設定ファイルでこのフォームに関連づけられたBean
 * に対応するプロパティの値になります。)<BR>
 * ラベル表示文字列はタグのボディ部として記述する事もできます。<BR>
 * <BR>
 *【属性】<BR>
 * name このフィールドの初期値を設定する際に使われるBeanの名前（必須）<BR>
 * property このラジオボタンに対応するパラメータ名（必須）<BR>
 * value サブミット時に送信される値(必須)<BR>
 * selected ラジオタグの初期表示を行う際、デフォルト設定を指定する場合は
 *          trueを指定してください。<BR>
 *
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2004/11/1
*/
public class RadioTag extends HtmlBodyTag {
    protected String text = null;    //ボディに表示するテキスト
    
    /**
     * デフォルトの選択値を設定します。
    */
    protected boolean selected;
    
    /**
     * @return selected
     */
    public boolean getSelected() {
        return selected;
    }
    /**
     * @param selected selected を設定します。
     */
    public void setSelected(boolean selected) {
        this.selected = selected;
    }
    
    /**
     * scopeが指定されていない場合は、次の順序でオブジェクトを検索します。
     * request, session, contextの順
    */
    public int doStartTag() throws JspException {
        StringBuffer inputTag = new StringBuffer("<input type=\"radio\" ");
        if( htmlname != null && htmlname.length() > 0 ){
			inputTag.append( JspTagUtil.createAttribute("name", htmlname) );
        }else{
        	inputTag.append( JspTagUtil.createAttribute("name", property) );
        }
        inputTag.append( JspTagUtil.createAttribute(pageContext, name, 
            property, scope, "value", value) );
		
		//SELECTタグにセットされたBeanのプロパティを検索します。
		String selectName = (String) pageContext.getRequest().getAttribute(
			Globals.SELECT_TAG_NAME);
		Object selectValue = JspTagUtil.findProperty( pageContext, 
			Globals.SELECT_TAG_VALUE, selectName, scope);
        	
        
        //リクエストにセットされたBeanのプロパティを検索します。
        //該当するプロパティが存在する場合はcheckedオプションを付加します。
        Object beanValue = JspTagUtil.findProperty(pageContext, 
            name, property, scope);
        
		inputTag.append(JspTagUtil.createAttribute("style", style));
		inputTag.append(JspTagUtil.createBoolAttribute("readonly", readonly));
		inputTag.append(JspTagUtil.createBoolAttribute("disabled", disabled));
		inputTag.append(JspTagUtil.createBoolAttribute("class", csClass));
        inputTag.append(this.createJavaScriptTag());
        
        //EL対応
        value = JspTagUtil.findValue(pageContext, value, scope).toString();
		
        if (JspTagUtil.isCheckedValue(selectValue, value) ||
		JspTagUtil.isCheckedValue(selectValue, beanValue.toString() )) {
			inputTag.append("checked>");
		} else if(( selectValue==null || selectValue.equals("") )
		&& selected ){
			inputTag.append("checked>");
		} else {
			inputTag.append(">");
		}
        
        try{
            pageContext.getOut().print(inputTag.toString());
        }catch( Exception e ){
            throw new JspException(e.getMessage());
        }
        
        return EVAL_BODY_AGAIN; 
    }
    
	public int doAfterBody() throws JspException{
		try {
			BodyContent body = getBodyContent();
			body.writeOut(getPreviousOut());
			body.clearBody();
		} catch (Exception e) {
			throw new JspException(e.getMessage());
		}
		return SKIP_BODY;
	}
    
	public int doEndTag()  throws JspException{
		try {
			pageContext.getOut().print("</input>");
		} catch (Exception e) {
			throw new JspException(e.getMessage());
		}
		return EVAL_PAGE;
	}
}
