package org.itscool.weber.tag;

import javax.servlet.jsp.JspException;

import org.itscool.commons.util.JspTagUtil;

/**
 * HTMLの&lt;inut type="text"&gt;タグを生成するタグです。<BR>
 * テキストボックス内に初期表示される値はvalue属性で指定した値です。<BR>
 * value属性を指定しない場合はname属性で指定したBeanに対応するプロパティ
 * の値になります。<BR>
 * name属性を指定しない場合はnull値を返します。<BR>
 *（sturtsの場合はStruts設定ファイルでこのフォームに関連づけられたBean
 * に対応するプロパティの値になります。)<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>maxlength</td>
 *   <td>このフィールドに入力できるテキストの最大値</td>
 * </tr>
 * <tr>
 *   <td>size</td>
 *   <td>このフィールドの表示桁数</td>
 * </tr>
 * </table>
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2004/11/1
*/
public class TextTag extends HtmlTag {
    /** 文字列の最大長 */
    protected String maxlength;
    /** テキストフィールドのサイズ */
    protected String size;

    /**
     * 文字列の最大長を取得します
     * @return 文字列の最大長
    */
    public String getMaxlength() {
        return maxlength;
    }

    /**
     * 文字列の最大長をセットします
     * @param maxlength 文字列の最大長
    */
    public void setMaxlength(String maxlength) {
        this.maxlength = maxlength;
    }

    /**
     * テキストフィールドのサイズを取得します
     * @return size テキストフィールドのサイズ
    */
    public String getSize() {
        return size;
    }

    /**
     * テキストフィールドのサイズをセットします
     * @param size テキストフィールドのサイズ
    */
    public void setSize(String size) {
        this.size = size;
    }

    /**
     * HTMLの&lt;inut type="text"&gt;タグを生成します<br>
     * scopeが指定されていない場合は、次の順序でオブジェクトを検索します。<br>
     * request, session, contextの順
    */
    public int doStartTag() throws JspException {
        StringBuffer inputTag = new StringBuffer("<input type=\"text\" ");
		if( htmlname != null && htmlname.length() > 0 ){
			inputTag.append( JspTagUtil.createAttribute("name", htmlname) );
		}else{
			inputTag.append( JspTagUtil.createAttribute("name", property) );
		}
        inputTag.append(JspTagUtil.createAttribute("maxlength", maxlength));
        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(JspTagUtil.createAttribute(pageContext, name,
        	property, scope, "value", value));
        inputTag.append(">");

        try {
            pageContext.getOut().print(inputTag.toString());
        } catch (Exception e) {
            throw new JspException(e.getMessage());
        }
        return SKIP_BODY;
    }

    public int doEndTag() {
        return EVAL_PAGE;
    }

}
