package org.itscool.weber.tag;

import javax.servlet.jsp.JspException;

import org.itscool.commons.util.JspTagUtil;

/**
 * HTMLの&lt;inut type="checkbox"&gt;タグを生成するタグです。<BR>
 * name属性で指定したBeanに対応するプロパティの値になります。<BR>
 * name属性を指定しない場合はnull値を返します。<BR>
 *（sturtsの場合はStruts設定ファイルでこのフォームに関連づけられたBean
 * に対応するプロパティの値になります。)<BR>
 * タグのボディ部はラベル表示文字列として記述する事もできます。<BR>
 * <BR>
 *【属性】<BR>
 * <table cellSpacing=0 cellPadding=0 border=1 >
 * <tr>
 *   <td>property</td>
 *   <td>
 *   サブミット時に送信されるリクエストパラメータ名（必須）又、サーブレットからフォワード
 *   されたときにnameで指定されたBeanインスタンスに該当するプロパティがセットされます。<br>
 *   name属性が指定されていない場合はpropertyに指定された値をサーバから取得します。<br>
 *   尚、HTMLのname属性にはpropertyに指定した文字列が出力されます。
 *  （ただしoption、link、imgタグは除く）
 *   </td>
 * <tr>
 * <tr>
 *   <td>name</td>
 *   <td>propertyが属するBeanの名前を指定します。</td>
 * </tr>
 * <tr>
 *   <td>htmlname</td>
 *   <td>
 *   HTMLのname属性にpropertyを使用したくない場合は、htmlnameにname属性を指定します。
 *   この属性を指定するとHTML出力時にpropertyではなくhtmlnameの値がname属性として出力されます。
 *   </td>
 * </tr>
 * <tr>
 *   <td>value</td>
 *   <td>このコンポーネントにセットされる初期値</td>
 * </tr>
 * <tr>
 *   <td>style</td>
 *   <td>このコンポーネントのスタイル</td>
 * </tr>
 * <tr>
 *   <td>scope</td>
 *   <td>propertyのスコープ</td>
 * </tr>
 * <tr>
 *   <td>readonly</td>
 *   <td>このコンポーネントの読取属性（trueの場合は読取専用）</td>
 * </tr>
 * <tr>
 *   <td>disabled</td>
 *   <td>このコンポーネントの使用可否属性（falseの場合は使用不可）</td>
 * </tr>
 * <tr>
 *   <td>csclass</td>
 *   <td>このコンポーネントに指定するスタイルシート</td>
 * </tr>
 * <tr>
 *   <td>
 *   onblur<br>
 *   onchange<br>
 *   onclick<br>
 *   ondblclick<br>
 *   onfocus<br>
 *   onkeydown<br>
 *   onkeypress<br>
 *   onkeyup<br>
 *   onmousedown<br>
 *   onmousemove<br>
 *   onmouseout<br>
 *   onmouseover<br>
 *   onmouseup<br>
 *   </td>
 *   <td>
 *    Javaスクリプト
 *   </td>
 * </tr>
 * <tr>
 *   <td>selected</td>
 *   <td>ラジオタグの初期表示を行う際、デフォルト設定を指定する場合は
 *       trueを指定してください。
 *   </td>
 * </tr>
 * <tr>
 *   <td>text</td>
 *   <td>表示するテキスト</td>
 * </tr>
 * </table>
 * <BR>
 *
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2004/11/1
*/
public class CheckBoxTag 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;
    }
    
    /**
     * HTMLの&lt;inut type="checkbox"&gt;タグを生成します<br>
     * scopeが指定されていない場合は、次の順序でオブジェクトを検索します。<br>
     * request, session, contextの順
    */
    public int doStartTag() throws JspException {
        StringBuffer inputTag = new StringBuffer("<input type=\"checkbox\" ");
        //inputTag.append( TagUtil.createAttribute("name", property) );
        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));
        inputTag.append(this.createJavaScriptTag());
        
        //リクエストにセットされたBeanのプロパティを検索します。
        //該当するプロパティが存在する場合はcheckedオプションを付加します。
        Object beanVal = JspTagUtil.findProperty(pageContext, 
            name, property, JspTagUtil.SCOPE_REQUEST);
        
        //EL対応
        value = JspTagUtil.findValue(pageContext, value, scope).toString();
        
        if( JspTagUtil.isCheckedValue(beanVal, value) ){
            inputTag.append("checked>");
        }else if(beanVal==null && selected ){
            inputTag.append("checked>");
        }else{
            inputTag.append(">");
        }
        if( style != null && style.length() > 0 ){
            inputTag.append(JspTagUtil.createAttribute("style", style));
        }
        
        try{
            pageContext.getOut().print(inputTag.toString());
        }catch( Exception e ){
            throw new JspException(e.getMessage());
        }
        
        //return SKIP_BODY;
        return EVAL_BODY_INCLUDE; 
    }
    
    /**
     * Body内を評価します
    */
    public int doAfterBody() throws JspException {

        if (this.bodyContent != null) {
            value = this.bodyContent.getString().trim();
            if (value.length() > 0) {
                this.text = value;
            }
        }
        
        return (SKIP_BODY);
    }

    public int doEndTag() throws JspException {

        // Render any description for this radio button
        if (this.text != null) {
            try{
                pageContext.getOut().print(text);
            }catch( Exception e ){
                throw new JspException(e.getMessage());
            }
        }
        
        return (EVAL_PAGE);

    }
    
    
    
}
