package org.itscool.weber.tag;

import javax.servlet.jsp.JspException;

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

/**
 * HTMLの&lt;select&gt;タグを生成するタグです。<BR>
 * multiple属性の指定によって複数選択可能なリストか単一選択のプルダウンメニュー
 * かを選択できます。<BR>
 * <BR>
 *【属性】<BR>
 * size 一度に表示できる表示桁数<BR>
 * name このフィールドの初期値を設定する際に使われるBeanの名前（省略可能）<BR>
 * property サブミット時に送信されるリクエストパラメータ名（必須）<BR>
 * multiple 複数の値を選択可能にする場合はtrueを指定する<BR>
 *          デフォルト：false<BR>
 *
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2004/11/1
*/
public class SelectTag extends HtmlBodyTag {
	/** 複数行選択可否フラグ */
    protected String multiple;
    /** 表示フィールドのサイズ */
    protected String size;

    public String getMultiple() {
        return multiple;
    }

    public void setMultiple(String multiple) {
        this.multiple = multiple;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    /**
     * selectタグをHTMLに書き出します。<br>
     * scopeが指定されていない場合は、次の順序でオブジェクトを検索します。
     * request, session, contextの順
    */
    public int doStartTag() throws JspException {
        StringBuffer inputTag = new StringBuffer("<select ");
		if( htmlname != null && htmlname.length() > 0 ){
			inputTag.append( JspTagUtil.createAttribute("name", htmlname) );
		}else{
			inputTag.append( JspTagUtil.createAttribute("name", property) );
		}
        inputTag.append(JspTagUtil.createAttribute("multiple", multiple));
        inputTag.append(JspTagUtil.createAttribute("size", size));
        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());
        inputTag.append(" >");
        
        try{
            pageContext.getOut().print(inputTag.toString());
        }catch(Exception e){
            throw new JspException(e.getMessage());
        }
        
        //name属性がnullでなければ、name属性とproperty属性で指定された
        //オブジェクトのプロパティをリクエストパラメータから取得します。
        //取得されたプロパティは、SELECT_TAG_NAME、SELECT_TAG_VALUE
        //の名前で指定されたリクエストパラメータにセットし、
        //OptionTagのselected属性を判定する為のパラメータとして使用されます
        if(name != null ){
            Object beanVal =
                JspTagUtil.findObject(pageContext, name, scope);
            if( beanVal != null ){
                try {
                	//プロパティ名をセットします
                    pageContext.getRequest().setAttribute(
                        Globals.SELECT_TAG_NAME,
                        property);
                    //プロパティをセットします
					pageContext.getRequest().setAttribute(
						Globals.SELECT_TAG_VALUE,
						beanVal);
                } catch (Exception e) {
                    throw new JspException(e.getMessage());
                }
            }
        }
        return EVAL_BODY_INCLUDE;
    }

    public int doEndTag() throws JspException {
        try {
            pageContext.getOut().print("</select>");
        } catch (Exception e) {
            throw new JspException(e.getMessage());
        }
        return SKIP_BODY;
    }

}
