/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	検索結果画面表示Actionクラス
//
//		変更履歴
//			2005.02.16  新規作成  氏名 石崎賢太郎
//			2005.05.26	seart_window_typeパラメタ追加	koji
//
//	機能
//
//	検索結果画面表示Actionクラスです。
//
/////////////////////////////////////////////////////////////////
package jp.co.ntt.lms.xmf.actions.xmo.Search;

import java.net.URLEncoder;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jp.co.ntt.lms.xmf.common.CommonFunction;
import jp.co.ntt.lms.xmo.Base.SearchPath;
import jp.co.ntt.lms.xmo.Lo.LoClient;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 * 検索結果画面表示Actionクラスです。
 * 
 * @author Kentaro Ishizaki (UNITEC)
 * @version 1.0
 */
public class SearchFrame_ResultAction extends Action
{
	/**
	 * ユーザIDのセッションキー文字列。
	 */
	public final String USER_ID = "userId";
	/**
	 * 学習者の判断用キー文字列定数。
	 */ 
	public final String LEANER = "learner";
	/**
	 * グループのツリータイプを表す定数。
	 */
	public final String GROUP_TYPE = "1";
	/**
	 * LOのツリータイプを表す定数。
	 */
	public final String LO_TYPE = "2";
	
	/**
	 * strutsフレームワークから呼ばれるメソッドです。
	 * 
	 * @param mapping マッピングオブジェクト。
	 * @param form アクションフォームオブジェクト。
	 * @param request リクエストオブジェクト。
	 * @param response レスポンスオブジェクト。
	 * @return ActionForward アクションフォワードオブジェクト。
	 * @throws Exception
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		///////////////////////////////////////////
		// セッション変数の取得
		// ・userID		ユーザID	必須
		// ・isLeaner	学習者種別	任意
		///////////////////////////////////////////
		String strUserID = (String)request.getSession().getAttribute( USER_ID );
		String strLearner = (String)request.getSession().getAttribute( LEANER );

		///////////////////////////////////////////
		// セッション変数のチェック
		///////////////////////////////////////////
		if( strLearner == null ) {
			request.setAttribute("message", "");
			request.setAttribute("detail", "");
			request.setAttribute("close", "on");
			request.setAttribute("errorurl", "../Com/ComLoginRedirector.vm");
			return mapping.findForward("error");
		}

		
		/////////////////////////////////////////////////////////////
		// パラメータ取得
		// 	・tree_view_type	ツリータイプ		必須
		// 	・searchStr			検索文字列
		// 	・ini_menu			初期メニュー
		/////////////////////////////////////////////////////////////
		String strTreeViewType 	= request.getParameter("tree_view_type");	// tree_view_type
		String strSearch    	= request.getParameter("txtSearch" );		// 検索文字列
		String strSearchType 	= request.getParameter("rdoSearchType");	// 検索対象
		String strIniMenu 		= request.getParameter("ini_menu"); 		// IniMenu
		String strSearchFlg		= request.getParameter("SearchFlg");		// 検索開始フラグ
		String strDisplayRenge	= request.getParameter("DisplayRenge");		// 表示範囲レンジ(1ページに表示する件数)
		String strMaxRecCount	= request.getParameter("MaxRecCount");		// 検索時の最大件数
		String strDisplayFrom	= request.getParameter("DisplayFrom");		// 表示範囲の開始位置
		String strDisplayTo		= request.getParameter("DisplayTo");		// 表示範囲の終了位置
		String strPrevSearchID	= request.getParameter("PrevSearchID");		// 戻るページ用検索条件ID(グループであればグループID)
		String strNextSearchID	= request.getParameter("NextSearchID");		// 次ページ用の検索条件ID(グループであればグループID)
		String strEndPageFlg	= request.getParameter("EndPageFlg");		// 最終ページであればフラグ"END"を立てる。以外は""となる。
		String strEndPageTo		= request.getParameter("EndPageTo");		// 最終ページに表示するToの件数
		String strSearchWinType = request.getParameter("search_window_type" );

		if ( strTreeViewType == null)
		{
			strTreeViewType = "";
		}
		if ( strSearch == null)
		{
			strSearch = "";
		}
		if ( strSearchType == null)
		{
			strSearchType = "";
		}
		if( strIniMenu == null )
		{
			strIniMenu = "";
		}
		if ( strSearchFlg == null)
		{
			strSearchFlg = "";
		}
		if ( strDisplayRenge == null)
		{
			strDisplayRenge = "";
		}
		if ( strMaxRecCount == null)
		{
			strMaxRecCount = "";
		}
		if ( strDisplayFrom == null)
		{
			strDisplayFrom = "";
		}
		if ( strDisplayTo == null)
		{
			strDisplayTo = "";
		}
		if ( strNextSearchID == null)
		{
			strNextSearchID = "";
		}
		if ( strEndPageFlg == null)
		{
			strEndPageFlg = "";
		}
		if ( strEndPageTo == null)
		{
			strEndPageTo = "";
		}
		if ( strPrevSearchID == null)
		{
			strPrevSearchID = "START";
		}

		if (strSearchFlg == null || strSearchFlg.equals("") || strSearch.equals(""))
		{
			return mapping.findForward("success");
		}
		if (strSearchWinType == null)
		{
			strSearchWinType = "";
		}

		// 検索タイプをint型に変換
		int intSearchType = 0;
		try {
			intSearchType = new Integer( strSearchType ).intValue();
		}
		catch( NumberFormatException e ) {}

		// 検索タイプによりツリータイプを振り分ける
		if( intSearchType == SearchPath.GROUP_NAME  ||
			intSearchType == SearchPath.USER_NAME  
		) {
			strTreeViewType = GROUP_TYPE;
		}
		else {
			strTreeViewType = LO_TYPE;
		}

		String[][]	strSearchResultList = null;
		int intTopCount = 0;
		if( strSearch != null && !strSearch.equals( "" ) ) {
			// 検索条件にあいまい条件を付加します
			String strAstar = strSearch;
			/////////////////////////////////////////////////
			// 検索処理
			/////////////////////////////////////////////////
			// 検索APIのインスタンス化
			SearchPath objSearch = new SearchPath( intSearchType, strTreeViewType, strUserID );

			//検索範囲の取得
			String strLimit = null;
			String strWkPrevSearchID;
			if ( strSearchFlg.equals("NEXT"))
			{
				if (strNextSearchID.equals(""))
				{
					strNextSearchID = null;
				}
				strLimit = strNextSearchID;
			}
			else if ( strSearchFlg.equals("PREV"))
			{
				if (strPrevSearchID.equals(""))
				{
					strPrevSearchID = null;
					strLimit =strPrevSearchID;
				}
				else
				{

					strWkPrevSearchID = strPrevSearchID.substring(0, strPrevSearchID.lastIndexOf( '/' ));
					strWkPrevSearchID = strWkPrevSearchID.substring(0, strWkPrevSearchID.lastIndexOf( '/' ));
					strLimit = strWkPrevSearchID.substring(strWkPrevSearchID.lastIndexOf( '/' ) + 1);
					strPrevSearchID = strWkPrevSearchID;

					if ( strLimit.equals("START"))
					{
						strLimit = null;
					}
				}
			}
			else if ( strSearchFlg.equals("ON"))
			{
				strLimit = null;
			}

			//検索リストの取得
			strSearchResultList = objSearch.searchPath( CommonFunction.replace(strAstar, "\\", "\\\\"), strLimit );
			if (strSearchResultList.length == 0)
			{
				// 一致なしの処理
			}

			//1ページ内に表示する件数を取得
			strDisplayRenge = new Integer(objSearch.getPageRowCount()).toString();
			intTopCount = objSearch.getPageRowCount();
			//検索キーワードに対する総ヒット件数を取得
			strMaxRecCount = new Integer(objSearch.getSearchHitCount()).toString();
			//検索Hit時の最大IDを取得する。
			strPrevSearchID = strPrevSearchID + "/" + objSearch.getSearchResultMaxId();
			//検索Hit時の最大IDを取得する。
			strNextSearchID = objSearch.getSearchResultMaxId();

		}



		Vector vecArefStr = new Vector();

		String prId = "";
		String myId = "";
		int index = 0;

		if( strSearchResultList != null ) {
			for( int i = 0; i < strSearchResultList.length; i++ ) {
				if( strSearchResultList[i][0] != null) {

					// 最後の'/'区切りをカンマ区切りにする
					String strFirstPath = strSearchResultList[i][0].substring( 0, strSearchResultList[i][0].lastIndexOf( '/' ) );
					String strLastPath = strSearchResultList[i][0].substring( strSearchResultList[i][0].lastIndexOf( '/' ) + 1, strSearchResultList[i][0].length() );

//	 スラッシュ区切り、カンマ区切りの場合わけをＬＯ検索のときのみとする。
//	 ifブロックの開始
					if ( intSearchType == SearchPath.LO_NAME) {

						//strLastPath(LOID)よりLOタイプを取得
						LoClient objClient = new LoClient();
						objClient.setWhereLoID(strLastPath);
						if( !objClient.select() ) {
							// 検索がうまくいかなかった場合
							if( objClient.isErr() ) {
								// エラーの場合
								response.sendRedirect( objClient.getURL() );
							}
						}
						//LOタイプ
						String strParentType = "";
						if( objClient.next() ) {
							//Loタイプ
							strParentType = objClient.getLoType();
						}

						if(strParentType.equals("0")){
							strSearchResultList[i][0] = strFirstPath + "," + strLastPath;
						}else{
							strSearchResultList[i][0] = strFirstPath + "/" + strLastPath;
						}

//	 スラッシュ区切り、カンマ区切りの場合わけをＬＯ検索のときのみとする。
//	 その他の検索は、常に最後はカンマ区切りにする。
					} else {
						strSearchResultList[i][0] = strFirstPath + "," + strLastPath;
					}
					
				
					strSearchResultList[i][0] = URLEncoder.encode( new String( strSearchResultList[i][0].getBytes( "8859_1" ), "JISAutoDetect" ), "UTF-8");
				}
			}
		}

		//-------------------------------------------------------------------------
		//表示件数計算処理
		//-------------------------------------------------------------------------
		//表示範囲(Pre)の件数計算
		int intWkFrom = 0;
		if (strSearchFlg.equals("ON"))
		{
			intWkFrom = 1;
		}
		else if (strSearchFlg.equals("PREV"))
		{
			intWkFrom = (new Integer(strDisplayTo).intValue()) - (intTopCount*2 -1 );
		}
		else
		{
			intWkFrom = (new Integer(strDisplayTo).intValue()) + 1;
		}

		//表示範囲(Next)の件数計算
		int intWkTo = intWkFrom + intTopCount - 1;


		strDisplayFrom = new Integer(intWkFrom).toString();
		strDisplayTo = new Integer(intWkTo).toString();

		int intHasuu = 0;
		if ( (new Integer(strMaxRecCount).intValue()) <= intWkTo )
		{
			strEndPageFlg = "END";
			strEndPageTo = strMaxRecCount;
		}
		else
		{
			strEndPageFlg = "";
		}
		
		
		// リクエストに変数をセット
		request.setAttribute("strSearchFlg", strSearchFlg);
		request.setAttribute("strSearchResultList", strSearchResultList);
		request.setAttribute("intLength", new Integer(strSearchResultList.length));
		request.setAttribute("strSearch", strSearch);
		request.setAttribute("strDisplayRenge", strDisplayRenge);
		request.setAttribute("strMaxRecCount", strMaxRecCount);
		request.setAttribute("strDisplayFrom", strDisplayFrom);
		request.setAttribute("strDisplayTo", strDisplayTo);
		request.setAttribute("strTreeViewType", strTreeViewType);
		request.setAttribute("strIniMenu", strIniMenu);
		request.setAttribute("strSearchType", strSearchType);
		request.setAttribute("strPrevSearchID", strPrevSearchID);
		request.setAttribute("strNextSearchID", strNextSearchID);
		request.setAttribute("strEndPageFlg", strEndPageFlg);
		request.setAttribute("strEndPageTo", strEndPageTo);
		
		if (strSearchWinType.equals("method"))
		{
			return mapping.findForward("method");
		}
		else
		{
			return mapping.findForward("success");
		}
	}
}
