package org.itscool.weber.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;

import org.itscool.commons.util.JspTagUtil;

/**
 * HTMLの&lt;a href &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>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>title</td>
 *   <td>hrefタグに表示するタイトル文字列</td>
 * </tr>
 * <tr>
 *   <td>path</td>
 *   <td>
 *     リンク先のURL<BR>
 *     指定するパスはWebアプリケーションからの相対パスを指定してください
 *   </td>
 * </tr>
 * <tr>
 *   <td>queryString</td>
 *   <td>URLに付属するクエリー文字列</td>
 * </tr>
 * <tr>
 *   <td>queryParams</td>
 *   <td>
 *     クエリー文字列にセットするプロパティリスト<BR> 
 *     プロパティ名からオブジェクトのプロパティを取得し、結果をクエリー文字列
 *     で返します。<BR>
 *     queryParamsにセットするプロパティリストは以下の書式である必要があります。
 *     <P>
 *     オブジェクト名:オブジェクト取得時のプロパティ名（省略可能):ＨＴＭＬに出力するときのプロパティ名（省略可能),
 *     オブジェクト名2:プロパティ名2,ＨＴＭＬに出力するときのプロパティ名2（省略可能),･･･(以降パラメータ数分繰り返し)
 *   </td>
 * </tr>
 * </table>
 *
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2004/11/1
*/
public class LinkTag extends HtmlBodyTag {
    /** hrefタグに表示するタイトル文字列 */
    private String title;
    /** リンク先のURL（Webアプリケーションからの相対パスを指定) */
    private String path;
    /** URLに付属するクエリー文字列 */
    protected String queryString = "";
    protected String charset = "";
    /** 
     * クエリー文字列にセットするプロパティリスト<BR> 
     * プロパティ名からオブジェクトのプロパティを取得し、結果をクエリー文字列
     * で返します。<BR>
     * queryParamsにセットするプロパティリストは以下の書式である必要があります。
     * <P>
     * オブジェクト名:オブジェクト取得時のプロパティ名（省略可能):ＨＴＭＬに出力するときのプロパティ名（省略可能),
     *     オブジェクト名2:プロパティ名2,ＨＴＭＬに出力するときのプロパティ名2（省略可能),･･･(以降パラメータ数分繰り返し)
     */
	protected String queryParams = "";
	
	/**
	 * タイトルを取得
	 * @return タイトル
	 */
    public String getTitle(){
    	return title;
    }
    
    /**
     * タイトルをセット
     * @param title タイトル
     */
    public void setTitle(String title){
    	this.title = title;
    }
    
    /**
     * パスを取得
     * @return パス
     */
    public String getPath() {
		return path;
	}
    
    /**
     * パスをセット
     * @param path パス
     */
	public void setPath(String path) {
		this.path = path;
	}

	/**
	 * クエリーパラメータを取得
	 * @return クエリーパラメータ
	 */
	public String getQueryParams() {
		return queryParams;
	}
	
	/**
	 * クエリーパラメータをセット
	 * @param queryParams クエリーパラメータ
	 */
	public void setQueryParams(String queryParams) {
		this.queryParams = queryParams;
	}

	/**
	 * クエリー文字列を取得
	 * @return クエリー文字列
	 */
	public String getQueryString() {
		return queryString;
	}
	
	/**
	 * クエリー文字列をセット
	 * @param queryString クエリー文字列
	 */
	public void setQueryString(String queryString) {
		this.queryString = queryString;
	}

	public String getCharset() {
		return charset;
	}

	public void setCharset(String charset) {
		this.charset = charset;
	}

    /**
     * HTMLの&lt;a href&gt;タグを生成します<br>
     * scopeが指定されていない場合は、次の順序でオブジェクトを検索します。<br>
     * request, session, contextの順
    */
    public int doStartTag() throws JspException {
        StringBuffer inputTag = new StringBuffer("<a ");
//        String url = JspTagUtil.createAttribute( pageContext, name,
//			property, scope, "href", value);
//        String url = value;
        
//        if(value == null || value.length() == 0 ){
//            url = (String)JspTagUtil.findProperty(pageContext, id, name, scope);
//        }else{
//            url = value;
//        }
        
//        if( url.indexOf("/") == 0 ){
//            HttpServletRequest req = (HttpServletRequest)pageContext.getRequest();
//            String contextPath = req.getContextPath();
//            url = contextPath + url;
//        }
//        inputTag.append(" " + "href" + "=\"").append(url);
        String stackPath;
		if(property != null ){
			//オブジェクトからパスを取得
			stackPath = JspTagUtil.createAttribute( pageContext, name,
        		property, scope, "href", value);
        }else{
        	//path属性に指定されたパスを取得
        	stackPath = JspTagUtil.createRealPath(pageContext, path);
        	stackPath = "href = \"" + stackPath;
        }
		
        inputTag.append(" " + stackPath).append(createQueryString());
        inputTag.append("\" ");
        
		//inputTag.append( url );
        inputTag.append(JspTagUtil.createAttribute("charset", charset));
		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(">");
		if( title != null && title.length() > 0 ){
			inputTag.append(title);
		}
		//inputTag.append("</a>");

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

        //return SKIP_BODY;
        return EVAL_BODY_AGAIN;
    }
    
    /**
     * クエリー文字列を作成します
     * @return クエリー文字列
     * @throws JspException
     */
    protected String createQueryString() throws JspException{
		StringBuffer addQueryString = new StringBuffer();
		
        addQueryString.append(JspTagUtil.createQueryString(pageContext, queryParams, scope));
        
		if( queryString != null && queryString.length() > 0 ){
			if( addQueryString.length() == 0 ){
				addQueryString.append("?").append(queryString);
			}else{
				addQueryString.append("&").append(queryString);
			}
		}
		return addQueryString.toString();
	}
    
    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("</a>");
        } catch (Exception e) {
            throw new JspException(e.getMessage());
        }
        return EVAL_PAGE;
    }

}
