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;select&gt;タグ内の&lt;option&gt;タグを生成するタグです。<BR>
 * 対応するBeanのプロパティ値がオプションの値と一致の場合はそのオプション
 * が選択された状態で表示されます。<BR>
 * 対応するBeanが存在せず、かつselectedプロパティがtrueの場合は、そのオプション
 * が選択された状態で表示されます。<BR>
 * <BR>
 *【属性】<BR>
 * name このフィールドの初期値を設定する際に使われるBeanの名前(必須)<BR>
 * property name属性で指定したオブジェクトのプロパティ名を指定します。(省略可能)<BR>
 *          property属性が指定されていない場合はname属性で取得したインスタンスのtoString()を返します<BR>
 * subproperty property属性によって取得したオブジェクトのメンバを指定するときに使用します。<BR>
 * scope property属性のスコープを指定します（request, session, application)<BR>
 * 
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2004/11/1
*/
public class OptionTag extends HtmlBodyTag {

    /** selected属性 */
    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("<option ");
        /*
        if( htmlname != null && htmlname.length() > 0 ){
            inputTag.append( JspTagUtil.createAttribute("name", htmlname) );
        }else{
            inputTag.append( JspTagUtil.createAttribute("name", property) );
        }
        */
        if( value != null && value.toString().length() > 0){
            //Value属性が指定されている場合は
            //Value属性を出力する
            inputTag.append("value=\"").append(value).append("\" ");
        }else{
            inputTag.append( JspTagUtil.createAttribute( pageContext, name,
        	   property, scope, "value", value));
        }
        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());
        
        //SELECTタグにセットされたBeanのプロパティを検索します。
        String selectName = (String) pageContext.getRequest().getAttribute(
        	Globals.SELECT_TAG_NAME);
        Object selectValue = JspTagUtil.findProperty( pageContext, 
        	Globals.SELECT_TAG_VALUE, selectName, scope);
        	
        //Optionタグにセットされたプロパティを検索します
        Object beanValue = JspTagUtil.findProperty(pageContext, name, property, scope);
        
		//SELECTタグにセットされたプロパティとOptionタグにセットされた
		//プロパティが合致する場合はcheckedオプションを付加します。
        if (JspTagUtil.isCheckedValue(selectValue, value) ||
        JspTagUtil.isCheckedValue(selectValue, beanValue.toString() )) {
            inputTag.append("selected>");
        } else if(( selectValue==null || selectValue.equals("") )
        && selected ){
            inputTag.append("selected>");
        } else {
            inputTag.append(">");
        }
        
        try {
            pageContext.getOut().print(inputTag.toString());
        } catch (Exception e) {
            throw new JspException(e.getMessage());
        }
        //return EVAL_BODY_INCLUDE;
        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("</option>");
        } catch (Exception e) {
            throw new JspException(e.getMessage());
        }
        return EVAL_PAGE;
    }


}
