/*
 * 作成日: 2006/10/31
 *
 * ＨＴＭＬタグ置換クラス
 */
package jp.co.ntt.lms.imode.common;

/**
 * ＨＴＭＬファイル内の&lt;%=　%&gt;タグに囲まれた
 * ACTION_NAMEとPAGE_TAGを置き換えます。
 *
 * @author ntc-sakai
 * 
 */
public class ComHtmlConv {
	/** コメント開始マーク */
	private final String JSP_COMMENT_FROM = "<%=";  
	/** コメント終了マーク */
	private final String JSP_COMMENT_TO   = "%>";
	/** 変換対象文字列（ACTION_NAME） */
	private final String C_ACTION_NAME = "ACTION_NAME";
	/** 変換対象文字列 （PAGE_TAG）*/
	private final String C_PAGE_TAG = "PAGE_TAG";

	/** jsessionid */
	private String jsession_id;
	/** 頁SEQ番号 */
	private String page_no;
	/** 変換対象文字列 */
	private String html_data;

	/**
	 * コンストラクタ
	 *
	 */
	public ComHtmlConv() {
	}

	/**
	 * セッションIDを設定します。
	 * 
	 * @param jsession_id セッションID
	 */
	public void setJsession_id(String jsession_id) {
		this.jsession_id = jsession_id;
	}

	/**
	 * 頁SEQ番号を設定します。
	 * 
	 * @param page_no 頁SEQ番号
	 */
	public void setPage_no(String page_no) {
		this.page_no = page_no;
	}

	/**
	 * 置換え対象のＨＴＭＬファイルを設定します。
	 * 
	 * @param html_data ＨＴＭＬファイル（文字列）
	 */
	public void setHtml_data(String html_data) {
		this.html_data = html_data;
	}

	/**
	 * 特定のタグを置換えます。<br>
	 * <table border=1>
	 * <tr><td>置換え対象文字列</td>
	 * <td>置換え後文字列</td></tr>
	 * <tr><td>&lt;%= ACTION_NAME %&gt;</td>
	 * <td>&quot;サーブレット名;jesessionid=セッションID&quot;</td>
	 * <tr><td>&lt;%= PAGE_TAG %&gt;</td>
	 * <td>&lt;input type=&quot;hidden&quot name=&quotpage_seq&quot; value=&quot;頁番号&quot;&gt;</td>
	 * </tr>
	 * </table>
	 * @return 置換え後のＨＴＭＬファイル（文字列）
	 */
	public String convHtml() {
		// 置換え後文字列
		StringBuffer convHtml = new StringBuffer();
		// <%= ACTION_NAME %>の置換え後文字列
		String actionTag = "\"MobSCORMEntry;jsessionid=" + jsession_id + "\"";
		// <%= PAGE_TAG %>の置換え後文字列
		String pageTag = "<input type=\"hidden\" name=\"page_seq\" value=\"" + page_no + "\">";
		int fromPos = 0;
		int toPos = 0;
		int curPos = 0;

		while(html_data.length() > curPos) {
			// JSP_COMMENT_FROM検索
			fromPos = html_data.indexOf(JSP_COMMENT_FROM, curPos);
			// JSP_COMMENT_FROMタグ有無判定
			if (fromPos < 0) {
				// JSP_COMMENT_FROMタグ無し
				convHtml.append(html_data.substring(curPos));
				break;
			}
			// JSP_COMMENT_TO検索
			toPos = html_data.indexOf(JSP_COMMENT_TO, fromPos);
			// JSP_COMMENT_TOタグ有無判定
			if (toPos < 0) {
				// JSP_COMMENT_TOタグ無
				convHtml.append(html_data.substring(curPos));
				break;
			}
			// JSP_COMMENT_FROM,JSP_COMMENT_TO共有る場合
			convHtml.append(html_data.substring(curPos, fromPos));
			String tagname = html_data.substring(fromPos, toPos+2);
			// ACTION_NAMEタグ有無判定
			if (tagname.indexOf(C_ACTION_NAME) != -1) {
				// ACTION_NAMEタグ有り
				convHtml.append(actionTag);
			// PAGE_TAGタグ有無判定
			} else if (tagname.indexOf(C_PAGE_TAG) != -1) {
				// PAGE_TAGタグ有り
				convHtml.append(pageTag);
			}
			// 次の検索位置を設定
			curPos = toPos + JSP_COMMENT_TO.length();
		}

		return convHtml.toString();
	}
}
