/*
 * Copyright (c) 2003, Morpho Project.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *	  this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *	  this list of conditions and the following disclaimer in the documentation
 *	  and/or other materials provided with the distribution.
 * 3. Neither the name of the Morpho Project nor the names of its contributors
 *	  may be used to endorse or promote products derived from this software
 *	  without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
package jp.morpho.webapp.servlet.jsp.tagext.html;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;

/**
 * <P>
 * OPTGROUP 要素によって、著者は選択項目を論理的にグループ化することができます。
 * グループ化は、ユーザが長大な選択リストから選び出さねばならないような場合に特に有用です。
 * 関連項目がグループ化されている方が、単調で長いリストよりも、全体像の把握が容易でかつ覚えやすくなります。
 * HTML 4 では、どの OPTGROUP 要素も SELECT 要素の直接の子である必要があります (すなわち、グループは入れ子にできません)。
 * </P>
 * <P>
 * OPTGROUP の HTML 4 定義は次のとおりです。
 * <PRE>
 * &lt;!ELEMENT OPTGROUP - - (OPTION)+ -- option group --&gt;
 * &lt;!ATTLIST OPTGROUP
 *   %attrs;                              -- %coreattrs, %i18n, %events --
 *   disabled    (disabled)     #IMPLIED  -- unavailable in this context --
 *   label       %Text;         #REQUIRED -- for use in hierarchical menus --
 *   &gt;
 * </PRE>
 * </P>
 * @author Kumiko Hiroi
 */
public class OptgroupTag extends ControlTagSupport
{

	/**
	 * <P>
	 * OptgroupTag を作成します。
	 * </P>
	 */
	public OptgroupTag()
	{
		super();
	}

	/**
	 * <P>
	 * disabled 属性を返します。
	 * </P>
	 * @return disabled 属性
	 */
	public boolean getDisabled()
	{
		return getAttributeMap().getBoolean("disabled");
	}

	/**
	 * <P>
	 * label 属性を返します。
	 * </P>
	 * @return label 属性
	 */
	public String getLabel()
	{
		return getAttributeMap().getString("label");
	}

	/**
	 * <P>
	 * disabled 属性を設定します。
	 * </P>
	 * @param disabled disabled 属性
	 */
	public void setDisabled(boolean disabled)
	{
		getAttributeMap().putBoolean("disabled", disabled);
	}

	/**
	 * <P>
	 * label 属性を設定します。
	 * </P>
	 * @param label label 属性
	 */
	public void setLabel(String label)
	{
		getAttributeMap().putString("label", label);
	}

	/**
	 * <P>
	 * 終了タグの処理です。
	 * </P>
	 * @return EVAL_PAGE
	 * @see javax.servlet.jsp.tagext.Tag#doEndTag()
	 */
	public int doEndTag() throws JspException
	{
		StringBuffer buf = new StringBuffer();

		buf.append("</optgroup>");

		try
		{
			JspWriter out = pageContext.getOut();
			out.print(buf.toString());
		}
		catch (IOException e)
		{
			throw new JspException(e.getMessage());
		}

		return super.doEndTag();
	}

	/**
	 * <P>
	 * 開始タグの処理です。
	 * </P>
	 * @return EVAL_BODY_BUFFERED
	 * @see javax.servlet.jsp.tagext.Tag#doStartTag()
	 */
	public int doStartTag() throws JspException
	{
		//OPTGROUPタグを作成する
		StringBuffer buf = new StringBuffer();
		buf.append("<optgroup");

		String keys[] = new String[this.getAttributeMap().size()];
		keys = (String[])this.getAttributeMap().keySet().toArray(keys);
		for (int i = 0; i < keys.length; i++)
		{
			if (keys[i].equals("disabled"))
			{
				if (this.getAttributeMap().getBoolean(keys[i]))
				{
					buf.append(" ").append(keys[i]);
				}
			}
			else
			{
				buf.append(" ").append(keys[i]).append("=\"").append(this.getAttributeMap().getString(keys[i])).append("\"");
			}
		}
		buf.append(">");

		try
		{
			JspWriter out = pageContext.getOut();
			out.print(buf.toString());
		}
		catch (IOException e)
		{
			throw new JspException(e.getMessage());
		}

		return super.doStartTag();
	}

}
