/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	表示用共通処理クラス
//
//		変更履歴
//			2005.02.19  新規作成  村上 靖征
//
//	機能
//
//	このクラスは表示用の共通処理を定義するクラスです。
//
////////////////////////////////////////////////////////////////

package jp.co.ntt.lms.xmf.tools.xmo.Base;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.velocity.context.Context;

import jp.co.ntt.lms.lo.LoComData;
import jp.co.ntt.lms.lo.LoTopClient;
import jp.co.ntt.lms.lo.MaterialNode;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.LoRelation.LoRelationClient;

/**
 * 表示用共通処理クラス
 * 
 * このクラスは表示用の共通処理を定義するクラスです。
 * 
 * @author 村上 靖征
 * @version 1.0
 */
public class ShowCommon
{
	/**
	 * 選択されたツリーのパスに割りあたっている教材のID一覧を取得します
	 * 
	 * @param strTreePath
	 *            選択されたパス
	 * @return Vector LOIDリスト
	 */
	public static Vector getAssignLo(Context context, String strTreePath,
			HttpServletResponse response, HttpSession session) throws Exception
	{

		// ツリーパスからAssignmentsテーブルの検索用のmembershipIDを取得します
		String[] strAllID = getAllID(context, strTreePath, session);

		if (strAllID.length == 0) { return new Vector(); }

		// ここで対象となるのは最後のID
		String strID = strAllID[strAllID.length - 1];

		// AssignmentsClientから検索を行う
		AssignmentsClient objAss = new AssignmentsClient();
		// 検索条件にmemberShipID を設定する
		objAss.setWhereMemberShipID(strID);
		// 検索処理を行います
		if (!objAss.select())
		{
			response.sendRedirect(objAss.getURL());
			return null;
		}

		// 検索結果を取得する
		Vector vecLoID = new Vector();
		while (objAss.next())
		{
			String strMatID = objAss.getMaterialID();
			// LoRelationからMaterialIDをキーにしてLOIDを取得する
			LoRelationClient objRelation = new LoRelationClient();
			// 検索条件にMaterialIDを設定
			objRelation.setmaterialID(strMatID);
			// 検索処理
			if (!objRelation.select())
			{
				response.sendRedirect(objRelation.getURL());
				return null;
			}

			// 検索が成功したら検索結果を取得
			if (objRelation.next())
			{
				String strLoID = objRelation.getChildID();
				vecLoID.add(strLoID);
			}
		}

		return vecLoID;
	}

	/**
	 * 選択されたツリーのパスに割りあたっているグループまたはユーザのID一覧を取得します
	 * 
	 * @param strTreePath
	 *            選択されたパス
	 * @return Vector グループまたはユーザのIDリスト
	 */
	public static Vector getAssignGroup(Context context, String strTreePath,
			HttpServletResponse response, HttpSession session) throws Exception
	{

		// ツリーパスからAssignmentsテーブルの検索用のmembershipIDを取得します
		String[] strAllID = getAllID(context, strTreePath, session);
		if (strAllID == null)
		{
			// エラーページに飛ばす
			response.sendRedirect("../Com/ComErr.vm");
			return null;
		}

		if (strAllID.length == 0) { return new Vector(); }
		// 検索結果格納用のVector
		Vector vecID = new Vector();

		for (int i = 0; i < strAllID.length; i++)
		{
			// AssignmentsClientから検索を行う
			AssignmentsClient objAss = new AssignmentsClient();
			// 検索条件にmemberShipID を設定する
			objAss.setWhereMaterialID(strAllID[i]);
			// 検索処理を行います
			if (!objAss.select())
			{
				response.sendRedirect(objAss.getURL());
				return null;
			}

			// 検索結果を取得する
			while (objAss.next())
			{
				String strMemID = objAss.getMemberShipID();
				if (!vecID.contains(strMemID))
				{
					vecID.add(strMemID);
				}
			}
		}

		return vecID;
	}

	/**
	 * 指定されたツリーパスからすべてのIDの組み合わせを切り出します
	 * 
	 * @param strTreePath
	 *            ツリーパス
	 * @return String[] 切り出されたIDの配列
	 */
	public static String[] getAllID(Context context, String strPath,
			HttpSession session)
	{

		StringTokenizer objToken = new StringTokenizer(strPath, "/");

		int intCount = objToken.countTokens();
		// トークンの分割数-1が必要な配列の数になる
		String[] strAllID = new String[intCount];

		try
		{
			strAllID[0] = objToken.nextToken();
			if (objToken.hasMoreTokens())
			{
				strAllID[1] = objToken.nextToken();
				// パスの先頭がROOTのIDである場合
				String GROUP_TREE_ROOT = (String) context
						.get("GROUP_TREE_ROOT");
				String LO_TREE_ROOT = (String) context.get("LO_TREE_ROOT");
				if (strAllID[0].equals(GROUP_TREE_ROOT)
						|| strAllID[0].equals(LO_TREE_ROOT))
				{
					// セッションからROOT情報を取得する
					String ROOT_INFO = (String) context.get("ROOT_INFO");
					Hashtable htbRootInfo = (Hashtable) session
							.getAttribute(ROOT_INFO);
					if (htbRootInfo == null)
					{
						// セッションが切れていた場合はnullを返す
						return null;
					}
					strAllID[0] = (String) htbRootInfo.get(strAllID[1]);
					if (strAllID[0] == null)
					{
						// 正しいIDが格納されていない場合はnullを返す
						return null;
					}
				}
				strAllID[0] += strAllID[1];
				for (int i = 1; i < intCount - 1; i++)
				{
					strAllID[i + 1] = objToken.nextToken();
					strAllID[i] += strAllID[i + 1];
				}
			}
			else
			{
				// パスがルートしか存在しない場合は長さ0の配列を返す。
				return new String[0];
			}
		}
		catch (NoSuchElementException ne)
		{
		}
		catch (ArrayIndexOutOfBoundsException ae)
		{
		}

		String[] strReturn = new String[strAllID.length - 1];
		System.arraycopy(strAllID, 0, strReturn, 0, strReturn.length);
		return strReturn;

	}

	/**
	 * 指定された隠しグループパスから最後の親グループIDを取得する
	 * 
	 * @param strPath
	 *            隠しグループパス(例：GR1/GR2/GR3、LO1/LO2/:/LO2)
	 * @return String 親グループID(例：GR3、LO2)
	 */
	public static String getLastParentID(String strPath)
	{
		String strRet = strPath;
		StringTokenizer objToken = new StringTokenizer(strPath, "/");
		int intCount = objToken.countTokens();
		for (int i = 0; i < intCount; i++)
		{
			// 最後が戻り値となる
			strRet = objToken.nextToken();
		}
		return strRet;
	}

	/**
	 * トグルボタン押下時、配下を表示するかどうかチェックする <BR>
	 * 
	 * <PRE>
	 * 
	 * trueならば教材構造の下位表示可能 falseならば教材構造の下位表示不可
	 * 
	 * </PRE>
	 * 
	 * @param String
	 *            LoID
	 * @return boolean trueかfalse
	 */
	public static boolean checkUnderDisplay(String strLoID)
	{
		boolean boolRet = false;
		try
		{
			// LoClientをインスタンス化して、LOIDを元に詳細情報を取得する
			LoClient objLoClient = new LoClient();
			objLoClient.setWhereLoID(strLoID);
			String strMaterialID = "";
			// 検索処理の実行
			if (objLoClient.select() && objLoClient.next())
			{
				String strLoType = objLoClient.getLoType();
				// RealLOIDを取得する
				String strRealLOID = objLoClient.getRealLOID();
				// LOサーバ名の取得
				Environment objEnv = new Environment();
				String strLoServerName = objEnv.getLoServerName();
				// LOクラスをインスタンス化します
				LoTopClient objLoTopClient = new LoTopClient(strLoServerName,
						strLoType);
				// 教材IDの取得
				// LOから教材詳細情報を取得
				if (objLoTopClient.getData(strRealLOID))
				{
					if (objLoTopClient.getDataLength() > 0)
					{
						LoComData objData = objLoTopClient.getDataInfo(0);
						// 教材IDの取得
						strMaterialID = objData.getMaterialID();
					}
				}
				Hashtable objParams = new Hashtable();
				objParams.put("MATID", strMaterialID);
				objParams.put("AUID", strMaterialID);
				if (!objLoTopClient.getMaterialStruct(objParams))
				{
					// ここにエラー処理記述
					throw new Exception("教材構造取得エラー");
				}
				MaterialNode objNode = (MaterialNode) objLoTopClient
						.getMaterialStruct();
				if (objNode != null)
				{
					boolRet = true;
				}
			}
		}
		catch (Exception e)
		{
			boolRet = false;
		}
		return boolRet;
	}

	/**
	 * ソートの昇順・降順を入れ替えるメソッドです。
	 * 
	 * @param strSortName
	 *            ｿｰﾄ要求ﾊﾟﾗﾒｰﾀ：名前
	 * @param strComment
	 *            ｿｰﾄ要求ﾊﾟﾗﾒｰﾀ：コメント
	 * @param strSortFlag_Name
	 *            昇順/降順判定ﾌﾗｸﾞ(名前)
	 * @param strSortFlag_Comm
	 *            昇順/降順判定ﾌﾗｸﾞ(ｺﾒﾝﾄ)
	 */
	public static ArrayList changeSortFlag(String strSortName,
			String strComment, String strSortFlag_Name, String strSortFlag_Comm)
	{

		//*************************************************************************************************
		//釦を押下する度に昇順←→降順を切り替える為､昇順/降順判定ﾌﾗｸﾞを変更する。
		//*************************************************************************************************
		//項目名によるｿｰﾄ指定ありならば
		if (strSortName != null)
		{
			//昇順指定ならば
			if (strSortFlag_Name.equalsIgnoreCase("0"))
			{
				//降順指定に設定
				strSortFlag_Name = "1";
			}
			//降順指定ならば
			else
			{
				//昇順指定に設定
				strSortFlag_Name = "0";
			}
			strSortFlag_Comm = "0";
		}
		//ｺﾒﾝﾄによるｿｰﾄ指定ありならば
		else if (strComment != null)
		{
			//昇順指定ならば
			if (strSortFlag_Comm.equalsIgnoreCase("0"))
			{
				//降順指定に設定
				strSortFlag_Comm = "1";
			}
			//降順指定ならば
			else
			{
				//昇順指定に設定
				strSortFlag_Comm = "0";
			}
			strSortFlag_Name = "0";
		}

		ArrayList ret = new ArrayList();
		ret.add(strSortFlag_Name);
		ret.add(strSortFlag_Comm);
		return ret;
	}
}