/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	メニュー情報取得Velocity Toolクラス
//
//		変更履歴
//			2005.02.19  新規作成  村上 靖征
//          2006.02.23  instructor 権限を設定している場合にエラーになる
//                      不具合を修正
//
//	機能
//
//	このクラスはメニューの情報を取得するクラスです。
//
////////////////////////////////////////////////////////////////

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

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.velocity.tools.view.context.ViewContext;

import jp.co.ntt.lms.lo.LoComData;
import jp.co.ntt.lms.lo.LoPropertyDef;
import jp.co.ntt.lms.lo.LoTopClient;
import jp.co.ntt.lms.lo.progress.LearningProgressManager;
import jp.co.ntt.lms.toeic650.common.TOEIC650CommonConst;
import jp.co.ntt.lms.xmf.CustomMenuDef;
import jp.co.ntt.lms.lo.MenuMakerExtend;
import jp.co.ntt.lms.xmf.CustomMenuManager;
import jp.co.ntt.lms.xmf.XmfException;
import jp.co.ntt.lms.xmf.tools.ToolBase;
import jp.co.ntt.lms.xmf.tools.URLTool;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.MenuData;
import jp.co.ntt.lms.xmo.XMOClient;
import jp.co.ntt.lms.xmo.XMOException;
import jp.co.ntt.lms.xmo.XMOPropertyDef;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xmo.Base.XMSBaseClient;
import jp.co.ntt.lms.xmo.Base.XMSBaseTable;
import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.Groups.GroupsData;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.Lo.LoData;
import jp.co.ntt.lms.xmo.Method.MethodClient;
import jp.co.ntt.lms.xmo.Method.MethodData;
import jp.co.ntt.lms.xmf.xmo.Base.Common;

/**
 * メニューの情報を取得するVelocity Toolクラス
 * 
 * このクラスはメニューの情報一覧を取得するクラスです。
 * 
 * @author 村上 靖征
 * @version 1.0
 */
public class MenuTool extends ToolBase
{
	public final static String urlKey = "url";
	public final static String widthKey = "width";
	public final static String heightKey = "height";
	public final static String targetKey = "target";
	public final static String titleKey = "title";
	public final static String resizeMaxKey = "resize";
	public final static String menuLoLog         = "学習ログ";
	public final static String menuLoLogDetail = "個別ログ";
	
	/**
	 * @return heightKey を戻します。
	 */
	public String getHeightKey() {
		return heightKey;
	}
	/**
	 * @return resizeMaxKey を戻します。
	 */
	public String getResizeMaxKey() {
		return resizeMaxKey;
	}
	/**
	 * @return targetKey を戻します。
	 */
	public String getTargetKey() {
		return targetKey;
	}
	/**
	 * @return titleKey を戻します。
	 */
	public String getTitleKey() {
		return titleKey;
	}
	/**
	 * @return urlKey を戻します。
	 */
	public String getUrlKey() {
		return urlKey;
	}
	/**
	 * @return widthKey を戻します。
	 */
	public String getWidthKey() {
		return widthKey;
	}
	
	public String getMenu(HttpServletRequest request) throws Exception
	{
		// LOメニューのためのパラメータ
		String loID = request.getParameter("loID");
		String groupUserID = request.getParameter("GroupUserID");
		// XMOメニューのためのパラメータ
		String parentID = request.getParameter("parentID");
		String selectID = request.getParameter("selectID");
		String popupType = request.getParameter("popupType");
		String iniMenu = request.getParameter("ini_menu");
		String treeViewType = request.getParameter("tree_view_type");
		String treePath = request.getParameter("treepath");
		String openInfo = request.getParameter("open_info");
		String serverName = request.getServerName();
		int serverPort = request.getServerPort();
		String contextPath = request.getContextPath();
		
		return getMenu(loID, groupUserID, parentID, selectID, 
				popupType, iniMenu, treeViewType, treePath, openInfo, 
				serverName, serverPort, contextPath,
				request.getSession());
	}

	/**
	 * 
	 * @param loID
	 * @param groupUserID 
	 * 		明示的に指定されない場合は
	 * 		セッションから取得されたユーザーIDが使用される。
	 * @param parentID
	 * @param selectID
	 * @param popupType
	 * @param iniMenu
	 * @param treeViewType
	 * @param treePath
	 * @param openInfo
	 * @param serverName
	 * @param serverPort
	 * @param contextPath
	 * @param session
	 * @return
	 * @throws Exception
	 */
	public String getMenu(String loID, String groupUserID, 
			String parentID, String selectID, 
			String popupType, String iniMenu, String treeViewType, 
			String treePath, String openInfo, 
			String serverName, int serverPort, String contextPath,
			HttpSession session) throws Exception
	{
		////////////////////////////////////////////////////////////////
		// パラメータ取得
		// 	・loID loID 必須
		// 	・ini_menu 初期メニュー名称 必須
		// 	・treepath 表示ツリーパス 任意
		// 	・search 検索フラグ 必須
		// 	・open_info ツリー展開情報 必須
		// 	・GroupUserID グループまたはユーザID 必須
		////////////////////////////////////////////////////////////////
		// LOメニューのためのパラメータ
		String strLoID = loID;
		String strGroupUserID = groupUserID;

		// XMOメニューのためのパラメータ
		String strParentID = parentID;
		String strSelectID = selectID;
		String strPopupType = popupType;
		// 戻りページ用のパラメータ
		String strIniMenu = iniMenu;
		String strSelectIniMenu = strIniMenu;
		if (strIniMenu != null)
		{
			// 初期メニューをURLエンコードします
			strIniMenu = iniMenuUrlEncode(strIniMenu);
		}
		String strTreeViewType = treeViewType;
		String strTreepath = treePath;
		//	 URLエンコードはその都度行うようにする。
		String strOpenInfo = openInfo;
		if (strOpenInfo != null)
		{
			// ツリー展開情報をURLエンコードします
			strOpenInfo = urlEncode(strOpenInfo);
		}
		String strServerName = serverName;
		int intServerPort = serverPort;
		String strContextPath = contextPath;

		//ウィンドウサイズ初期値の設定
		//("-1"の場合、ウィンドウサイズは現状のままとする。)
		String strWinWidth = "-1";
		String strWinHeight = "-1";

		///////////////////////////////////////////
		// セッション変数の取得
		// ・userId ユーザID 必須
		// ・password パスワード 必須
		// ・loginid ログインID 必須
		///////////////////////////////////////////
		String USER_ID = Common.USER_ID;
		String PASSWORD = Common.PASSWORD;
		String LEANER = Common.LEANER;
		String LOGIN_ID = Common.LOGIN_ID;
		String strUserID = (String) session.getAttribute(USER_ID);
		String strPassword = (String) session.getAttribute(PASSWORD);
		String strLeaner = (String) session.getAttribute(LEANER);
		String strLoginID = (String) session.getAttribute(LOGIN_ID);

		///////////////////////////////////////////
		// セッション変数のチェック
		///////////////////////////////////////////
		if (strUserID == null || strPassword == null || strLeaner == null) { return "ERR"; }
		
		///////////////////////////////////////////
		// パラメータチェック
		///////////////////////////////////////////
		if (strLoID == null) { return "ERR"; }
		// 親IDがルートの場合
		String GROUP_TREE_ROOT = Common.GROUP_TREE_ROOT;
		String LO_TREE_ROOT = Common.LO_TREE_ROOT;
		if (strParentID.equals(GROUP_TREE_ROOT)
				|| strParentID.equals(LO_TREE_ROOT))
		{
			// セッションから正しい親IDを取得する
			String ROOT_INFO = Common.ROOT_INFO;
			Hashtable htbRootInfo = (Hashtable) session.getAttribute(ROOT_INFO);
			if (htbRootInfo != null)
			{
				strParentID = (String) htbRootInfo.get(strSelectID);
			}
			else
			{
				// セッションが切れていたら何もしない
			    // [2005/08/19] 修正
				//return "ERR";
				if (strParentID.equals(GROUP_TREE_ROOT))
				{
	                Vector vecRootList = null;
	                try
	                {
	                    String GROUP_TYPE = getContextString("GROUP_TYPE");
	                    vecRootList = GetRootList.getRootList(context, GROUP_TYPE, strUserID);
	                }
	                catch (XMOException xe)
	                {
	                    xe.printStackTrace();
	                    return "ERR";
	                }
	                int intGRResult = vecRootList.size();
	                for (int i = 0; i < intGRResult; i++)
	                {
	                    GroupsData objGroupsData = (GroupsData) vecRootList.get(i);
	                    if (objGroupsData.getGroupID().equals(strSelectID))
	                    {
	                        strParentID = objGroupsData.getParentID();
	                        break;
	                    }
	                }
				}
				else if (strParentID.equals(LO_TREE_ROOT))
				{
	                Vector vecRootList = null;
	                try
	                {
	                    String LO_TYPE = getContextString("LO_TYPE");
	                    vecRootList = GetRootList.getRootList(context, LO_TYPE, strUserID);
	                }
	                catch (XMOException xe)
	                {
	                    xe.printStackTrace();
	                    return "ERR";
	                }
	                int intLRResult = vecRootList.size();
	                for (int i = 0; i < intLRResult; i++)
	                {
	                    LoData objLoData = (LoData) vecRootList.get(i);
	                    if (objLoData.getLoID().equals(strSelectID))
	                    {
	                        strParentID = objLoData.getParentID();
	                        break;
	                    }
	                }
				}
				else
				{
				    return "ERR";
				}
			}
		}

		// 戻りURLの作成
		String strLoReturn = "http://" + strServerName + ":" + intServerPort
				+ strContextPath + "/view/xmo/Base/frameset.vm?tree_view_type="
				+ strTreeViewType + "&ini_menu=" + strIniMenu + "&treepath="
				+ urlEncode(strTreepath) + "&open_info=" + strOpenInfo
				+ "&learner=" + strLeaner + "&calatURL=";
		// URLエンコード
		try
		{
			strLoReturn = URLEncoder.encode(strLoReturn, "UTF-8");
			//新しいメニューの表示に対応して２重にエンコードする。
			strLoReturn = URLEncoder.encode(strLoReturn, "UTF-8");
		}
		catch (UnsupportedEncodingException e1)
		{
			e1.printStackTrace();
			return "ERR";
		}

		String strXmoReturn = "http://" + strServerName + ":" + intServerPort
				+ strContextPath
				+ "/view/xmo/Base/frameset_g.vm?tree_view_type="
				+ strTreeViewType + "&ini_menu=" + strIniMenu + "&treepath="
				+ urlEncode(strTreepath) + "&open_info=" + strOpenInfo
				+ "&learner=" + strLeaner + "&calatURL=";
		// URLエンコード

		try
		{
			strXmoReturn = URLEncoder.encode(strXmoReturn, "UTF-8");
			//新しいメニューの表示に対応して２重にエンコードする。
			strXmoReturn = URLEncoder.encode(strXmoReturn, "UTF-8");
		}
		catch (UnsupportedEncodingException e2)
		{
			e2.printStackTrace();
			return "ERR";
		}

		// XMOメニューパラメータの作成
		StringBuffer strXMOMenuParam = new StringBuffer();
		strXMOMenuParam.append("parentID=");
		strXMOMenuParam.append(strParentID);
		strXMOMenuParam.append("&selectID=");
		strXMOMenuParam.append(strSelectID);
		strXMOMenuParam.append("&tree_view_type=");
		strXMOMenuParam.append(strTreeViewType);
		strXMOMenuParam.append("&returnURL=");
		strXMOMenuParam.append(strXmoReturn);
		strXMOMenuParam.append("&xmo_id=");

		//ポップアップメニューリスト
		StringBuffer sbMenu = new StringBuffer();

		try
		{
			//実行メニューカスタマイズによる変更
			CustomMenuDef menuDef = null;
			if (context != null) {
				menuDef = getCustomMenuDef(strUserID);
			}
			
			// ポップアップ種別が指定されている場合のみXMOメニューを作成する
			if (!strPopupType.equals(""))
			{

				// ユーザに割り当てられているXmoIDリストの取得
				Vector vecXmoList = GetAssignXmoList.getAssignXmoList(
						strUserID, strSelectID);
				if (vecXmoList == null)
				{
					// nullのときは検索失敗
					return "ERR";
				}
				/* XMSBaseの取得 */
				XMSBaseClient objXMSBase = new XMSBaseClient();

				// 初期メニュー名称からクラス名を取得する
				//if (strSelectIniMenu != null && !strSelectIniMenu.equals(""))
				//{
				//	objXMSBase.setWhereIniMenu(strSelectIniMenu);
				//}
				objXMSBase.setWhereTreeViewType(strTreeViewType);

				// 検索処理
				if (!objXMSBase.select()) { return "ERR"; }

				while (objXMSBase.next())
				{
					String strXmoId = objXMSBase.getXmoID();
					String strClassName = objXMSBase.getClassName();
					/* 取得するXMOを選別する */
					if (!vecXmoList.contains(strXmoId))
					{
						continue;
					}

					if (strClassName != null && !strClassName.equals("")
							&& !strClassName.equals(XMOPropertyDef.LEARN_XMO)
							&& !strClassName.equals(XMOPropertyDef.LOG_XMO)
							&& !strClassName.equals(XMOPropertyDef.INSTRUCTOR_XMO))
					{
						/* XMOの取得 */
						XMOClient objXMO = new XMOClient(strClassName);

						// メニュー取得用のHashtableを作成して、パラメータを設定する
						Hashtable htbParam = new Hashtable();
						htbParam.put(XMOPropertyDef.PARAM_ID, strSelectID);

						htbParam.put(LoPropertyDef.USER, strUserID);
						htbParam.put(LoPropertyDef.LOID, strSelectID);
						Vector vecMenuList = objXMO.getMenuList(htbParam);
												
						for (int j = 0; j < vecMenuList.size(); j++)
						{
							MenuData objMenu = (MenuData) vecMenuList.get(j);

							//実行メニューカスタマイズによる変更
							boolean visible = customizeMenu(menuDef, objMenu, strSelectID);
							if (!visible)
							{
								continue;
							}
							
							// ポップアップ種別の取得
							if (objMenu.getPopupType().indexOf(strPopupType) >= 0)
							{

								String strTitle = objMenu.getTitle();
								String strURL = objMenu.getURL();
								// URLに'?'がついていない場合は'?'を付加
								if (strURL.indexOf('?') < 0)
								{
									strURL = strURL + "?";
								}
								else
								{
									strURL = strURL + "&";
								}
								String strTargetWindow = objMenu
										.getTargetWindow();

								sbMenu.append(strTitle + "$");
								sbMenu.append(strURL
										+ new String(strXMOMenuParam)
										+ strXmoId + "$");
								sbMenu.append("xmo" + "$");
								//Windowサイズパラメータを追加する。
								//LO側でウィンドウサイズのパラメータを追加したため、XMO側にもウィンドウサイズの
								//パラメータを追加している。但し、値は、縦横それぞれ"-1"が設定されており、
								//XMO側は実際にポップアップメニューからオープンされるウィンドウのサイズは
								//今まで通りのサイズでオープンされる。
								sbMenu.append(strWinWidth + "$");
								sbMenu.append(strWinHeight + ";");

							}
						}
					}
				}

			}

			// LOIDが指定されている場合のみLOのメニューを取得する
			//	 LOIDが仮想ルートの場合はLOを特定できないため、メニューを取得しないように変更
			if (strLoID != null && !strLoID.equals("")
					&& !strLoID.equals(LO_TREE_ROOT))
			{
				// LOXMOから指定されたLOIDのLO種別を取得する
				LoClient objLo = new LoClient();
				// 検索条件にLOIDを設定する
				objLo.setWhereLoID(strLoID);
				// 検索実行
				if (!objLo.select())
				{
					// 検索失敗時
					return "ERR";
				}

				String strLoType = "";
				String strRealLOID = "";
				String strPrere = "";
				// 検索結果の取得
				if (objLo.next())
				{
					strLoType = objLo.getLoType();
					strRealLOID = objLo.getRealLOID();
					strPrere = objLo.getPrere();
				}
				
				// 取得したLo種別を元にLoTopClientをインスタンス化
				Environment objEnv = new Environment();
				String strLoServerName = objEnv.getLoServerName();

// 2005/12/15 仕様変更
// メソッドかどうかにかかわらず、メソッドのメニューのみ表示する。
//				//LOType がメソッドの場合で、リーフ(末端)メソッドの場合、
//				//メソッドのメニューに加えて、
//				//ラップされたLOのメニューを取得する
//				if (isMethod(strLoType))
//				{
//					//メソッドのメニューを取得する
//					try
//					{
//						if (!setLOMenu(strLoServerName, strLoType,
//								strLoID, strRealLOID, strPrere,
//								strLoginID, strPassword, strUserID, strGroupUserID,
//								strTreeViewType, strTreepath, strPopupType,
//								strParentID, strSelectID,
//								strLoReturn,
//								menuDef, sbMenu, false))
//						{
//							return "";
//						}
//					}
//					catch(Exception e)
//					{
//						return "ERR";
//					}
//					
//					//リーフにあるLOの情報を取得する。
//					MethodClient objXmo = new MethodClient();
//					objXmo.setWhereLoID(strRealLOID);					
//					if( !objXmo.select() )
//					{
//						return "ERR";
//					}
//					MethodData[] objMethodList = objXmo.getResultList();
//					if (objMethodList.length == 1)
//					{
//						String methodLOID = objMethodList[0].getMethodLOID();
//						if (methodLOID != null)
//						{
//							strLoID = methodLOID;
//							objLo.clear();
//							objLo.setWhereLoID(strLoID);
//							if (!objLo.select())
//							{
//								return "ERR";
//							}
//							if (objLo.next())
//							{
//								strLoType = objLo.getLoType();
//								strRealLOID = objLo.getRealLOID();
//								strPrere = objLo.getPrere();
//							}
//						}
//					}
//					else
//					{
//						return "ERR";
//					}
//				}
				
				//LO のメニューを取得する
				try
				{
					if (!setLOMenu(strLoServerName, strLoType,
							strLoID, strRealLOID, strPrere,
							strLoginID, strPassword, strUserID, strGroupUserID,
							strTreeViewType, strTreepath, strPopupType,
							strParentID, strSelectID,
							strLoReturn,
							menuDef, sbMenu, false))
					{
						return "";
					}
				}
				catch(Exception e)
				{
					return "ERR";
				}
			}
			
//			 20050126 ADD start Katsuhiko.Sakurai　進捗表示メニュー取得
			 LearningProgressManager manager = new LearningProgressManager();
			 MenuData menu = manager.getMenu( strTreeViewType, strTreepath, strSelectID, strLoID, strParentID, strSelectIniMenu, strUserID );
			 if ( menu != null ) {
				//実行メニューカスタマイズによる変更
				boolean visible = customizeMenu(menuDef, menu, strSelectID);
				if (visible)
				{
					 String strTitle = menu.getTitle();
					 String strURL = menu.getURL();
					 sbMenu.append(strTitle + "$");
					 sbMenu.append(strURL + ";");
				}
			 }
//			 20050126 ADD end

			// ADD 2005/02/09 START Katsuhiko Kagami(UNITEC) カスタマイズメニュー取得
			// MOD 2005/03/17 START Katsuhiko Kagami(UNITEC) [Loツリーの場合のみ]
			if (strTreeViewType != null && strTreeViewType.equals("2")) {
				MenuMakerExtend menuExt = new MenuMakerExtend();
				MenuData[] menuMyP = menuExt.makeMenu(strUserID, strLoID);
				if ( menuMyP != null ) {
					for (int i = 0;i < menuMyP.length;i++) {
						//実行メニューカスタマイズによる変更
						boolean visible = customizeMenu(menuDef, menuMyP[i], strSelectID);
						if (visible)
						{
							String strTitle = menuMyP[i].getTitle();
							String strURL = menuMyP[i].getURL();
							// String strTargetWindow = objMenu.getTargetWindow();
							sbMenu.append(strTitle + "$");
							sbMenu.append(strURL + ";");
							//sbMenu.append(strTargetWindow + "$");
							//Windowサイズパラメータを追加する。
							//sbMenu.append(strWinWidth + "$");
							//sbMenu.append(strWinHeight + ";");
						}
					}
				}
			}
			// MOD 2005/03/17 END Katsuhiko Kagami(UNITEC) [Loツリーの場合のみ]
			// ADD 2005/02/09 END Katsuhiko Kagami(UNITEC) カスタマイズメニュー取得
/*
			// ADD 2005/02/09 START Katsuhiko Kagami(UNITEC) カスタマイズメニュー取得
			MenuMakerExtend menuExt = new MenuMakerExtend();
			MenuData[] menuMyP = menuExt.makeMenu(strUserID, strLoID);
			if ( menuMyP != null ) {
				for (int i = 0;i < menuMyP.length;i++) {
					//実行メニューカスタマイズによる変更
					boolean visible = customizeMenu(menuDef, menuMyP[i], strSelectID);
					if (visible)
					{
						String strTitle = menuMyP[i].getTitle();
						String strURL = menuMyP[i].getURL();
						sbMenu.append(strTitle + "$");
						sbMenu.append(strURL + ";");
					}
				}
			}
			// ADD 2005/02/09 END Katsuhiko Kagami(UNITEC) カスタマイズメニュー取得
*/
			return sbMenu.toString();
		}
		catch (Exception e)
		{
			if (e instanceof XmfException) { throw e; }
			e.printStackTrace();
			return "";
		}
	}
	
	private boolean setLOMenu(String strLoServerName, String strLoType,
				String strLoID, String strRealLOID, String strPrere,
				String strLoginID, String strPassword, String strUserID, String strGroupUserID,
				String strTreeViewType, String strTreepath, String strPopupType,
				String strParentID, String strSelectID,
				String strLoReturn,
				CustomMenuDef menuDef, StringBuffer sbMenu, boolean blnIsStartOnly) throws Exception
    {
		if (strLoType == null) throw new Exception("LOタイプが null です。");
		if (strLoType.equals("")) throw new Exception("LOタイプが空文字です。");
		
		LoTopClient objLoTop = new LoTopClient(strLoServerName, strLoType);

		// LOタイプがコンテナの場合、Windowサイズの取得は行いません。
		String strWinWidth = "-1";
		String strWinHeight = "-1";
		if (!strLoType.equals("0"))
		{
			// Windowサイズの取得を行う。
			if (!objLoTop.getData(strRealLOID))
			{
				// Windowサイズの取得失敗時
				throw new Exception();
			}
			LoComData objData = objLoTop.getDataInfo(0);
			strWinWidth = objData.getWinWidth();
			strWinHeight = objData.getWinHeight();
		}

		// ウィンドウサイズが取得できない場合はウィンドウサイズの初期値を設定する。
		if (strWinWidth.equals("") || strWinWidth == null)
		{
			strWinWidth = "-1";
			strWinHeight = "-1";
		}

		// LoTopClientに以下のパラメータを設定する
		// LOID
		objLoTop.setLoID(strLoID);
		//RealLOID
		objLoTop.setRealLoID(strRealLOID);
		// LO種別
		objLoTop.setLoType(strLoType);
		// ユーザID
		objLoTop.setUserID(strUserID);
		//ログインID
		objLoTop.setValue("LOGIN_ID", strLoginID);
		// 前提条件(LOテーブルから前提条件が取得できた場合、パラメータに設定する。)
		if (strPrere != null && !strPrere.equals(""))
		{
			objLoTop.setValue("Prere", strPrere);
		}

		// ログ取得時などのターゲットID
		if (strGroupUserID == null || strGroupUserID.equals(""))
		{
			strGroupUserID = strUserID;
		}

		//	 ログ参照の場合に、ターゲットとなるグループ/ユーザの親IDをLOに指定する。
		// ポップアップタイプが指定されていない場合はログ参照
		if (strPopupType.equals(""))
		{
			// ツリータイプがグループ（基本画面のツリーがグループの場合）
			// ツリーペインで選択されたオブジェクトのパスの最後から2番目を取得する。
			// ex)
			//      /grouptreeroot/GR000002/PE000002
			//        の場合は、"GR000002" が親IDとなる。
			String GROUP_TYPE = Common.GROUP_TYPE;
			String LO_TYPE = Common.LO_TYPE;
			if (strTreeViewType.equals(GROUP_TYPE))
			{
				int intPos = strTreepath.lastIndexOf('/');
				int intPos2 = strTreepath.lastIndexOf('/', intPos - 1);
				if (intPos >= 0 && intPos2 >= 0)
				{
					objLoTop.setValue(LoTopClient.TARGET_PARENT_ID,
							strTreepath.substring(intPos2 + 1, intPos));
				}
			}
			// グループIDが渡されてきた場合にのみparentIDを設定する。
			// ツリータイプがLO（基本画面のツリーがLOの場合）
			// パラメータで渡ってくる"parentID" が親IDとなる。
			// 基本画面のLOツリーにて学習アサインのみ割当てられているLOを選択した時とする。
			// ユーザ一覧でグループ及びユーザを選択した場合、学習メニューを非表示
			else if (strTreeViewType.equals(LO_TYPE)
					&& !strParentID.startsWith("LO"))
			{
				AssignmentsClient objAssign = new AssignmentsClient();
				boolean isAssign = AssignmentsClient.checkAssignAuth(
						strUserID, strLoID, XMSBaseTable.MANAGE_TYPE);
				if (!isAssign) { return false; }
				if (strParentID.startsWith("GR"))
				{
					objLoTop.setValue(LoTopClient.TARGET_PARENT_ID,
							strParentID);
				}
			}
		}

		objLoTop.setTargetID(strGroupUserID);
		// パスワード
		objLoTop.setPassword(strPassword);
		// 戻りURL
		objLoTop.setReturnURL(strLoReturn);
		// 学習開始メニューのみ取得
		if (blnIsStartOnly) {
			objLoTop.setValue("START_ONLY", "on");
		}
		// LoTopClientのgetMenuListを実行して、メニューを取得する
		if (!objLoTop.getMenuList())
		{
			// メニュー取得失敗
			throw new Exception();
		}

		int intMenuSize = objLoTop.getMenuListSize();

		for (int i = 0; i < intMenuSize; i++)
		{
			MenuData objMenu = objLoTop.getMenuData(i);

			//実行メニューカスタマイズによる変更
			boolean visible = customizeMenu(menuDef, objMenu, strSelectID);
			if (!visible)
			{
				continue;
			}

			String strTitle = objMenu.getTitle();
			String strURL = objMenu.getURL();
			String strTargetWindow = objMenu.getTargetWindow();
			sbMenu.append(strTitle + "$");
			sbMenu.append(strURL + "$");
			sbMenu.append(strTargetWindow + "$");
			//Windowサイズパラメータを追加する。
			sbMenu.append(strWinWidth + "$");
			sbMenu.append(strWinHeight + ";");
		}
		return true;
	}

	/**
	 * @param strLoType
	 * @return
	 */
	private boolean isMethod(String strLoType)
	{
		return strLoType.equals("21");
	}

	/**
	 * メニュー情報を取得する。
	 * 
	 * request パラメータの以下のパラメータを使用する。
	 * 
	 * loID
	 * auID
	 * GroupUserID
	 * parentID
	 * tree_view_type
	 * selectID
	 * ini_menu
	 * treepath
	 * open_info
	 * popupType
	 * 
	 * @throws Exception
	 */
	private String getMenuOld(HttpServletRequest request) throws Exception
	{
		HttpSession session = request.getSession();
		//ウィンドウサイズ初期値の設定
		//("-1"の場合、ウィンドウサイズは現状のままとする。)
		String strWinWidth = "-1";
		String strWinHeight = "-1";

		////////////////////////////////////////////////////////////////
		// パラメータ取得
		// 	・loID loID 必須
		// 	・ini_menu 初期メニュー名称 必須
		// 	・treepath 表示ツリーパス 任意
		// 	・search 検索フラグ 必須
		// 	・open_info ツリー展開情報 必須
		// 	・GroupUserID グループまたはユーザID 必須
		////////////////////////////////////////////////////////////////
		// LOメニューのためのパラメータ
		String strLoID = request.getParameter("loID"); // tree_view_type
		String strGroupUserID = request.getParameter("GroupUserID");
		String strAuID = request.getParameter("auID");

		// XMOメニューのためのパラメータ
		String strParentID = request.getParameter("parentID");
		String strSelectID = request.getParameter("selectID");
		String strPopupType = request.getParameter("popupType");
		// 戻りページ用のパラメータ
		String strIniMenu = request.getParameter("ini_menu");
		String strSelectIniMenu = strIniMenu;
		if (strIniMenu != null)
		{
			// 初期メニューをURLエンコードします
			strIniMenu = iniMenuUrlEncode(strIniMenu);
		}
		String strTreeViewType = request.getParameter("tree_view_type");
		String strTreepath = request.getParameter("treepath");
		//	 URLエンコードはその都度行うようにする。

		String strOpenInfo = request.getParameter("open_info");
		if (strOpenInfo != null)
		{
			// ツリー展開情報をURLエンコードします
			strOpenInfo = urlEncode(strOpenInfo);
		}
		String strServerName = request.getServerName();
		int intServerPort = request.getServerPort();
		String strContextPath = request.getContextPath();

		///////////////////////////////////////////
		// パラメータチェック
		///////////////////////////////////////////
		if (strLoID == null) { return "ERR"; }
		// 親IDがルートの場合
		String GROUP_TREE_ROOT = Common.GROUP_TREE_ROOT;
		String LO_TREE_ROOT = Common.LO_TREE_ROOT;
		if (strParentID.equals(GROUP_TREE_ROOT)
				|| strParentID.equals(LO_TREE_ROOT))
		{
			// セッションから正しい親IDを取得する
			String ROOT_INFO = Common.ROOT_INFO;
			Hashtable htbRootInfo = (Hashtable) session.getAttribute(ROOT_INFO);
			if (htbRootInfo != null)
			{
				strParentID = (String) htbRootInfo.get(strSelectID);
			}
			else
			{
				// セッションが切れていたら何もしない
				return "ERR";
			}
		}

		///////////////////////////////////////////
		// セッション変数の取得
		// ・userId ユーザID 必須
		// ・password パスワード 必須
		// ・loginid ログインID 必須
		///////////////////////////////////////////
		String USER_ID = Common.USER_ID;
		String PASSWORD = Common.PASSWORD;
		String LEANER = Common.LEANER;
		String LOGIN_ID = Common.LOGIN_ID;
		String strUserID = (String) session.getAttribute(USER_ID);
		String strPassword = (String) session.getAttribute(PASSWORD);
		String strLeaner = (String) session.getAttribute(LEANER);
		String strLoginID = (String) session.getAttribute(LOGIN_ID);

		///////////////////////////////////////////
		// セッション変数のチェック
		///////////////////////////////////////////
		if (strUserID == null || strPassword == null || strLeaner == null) { return "ERR"; }

		// 戻りURLの作成
		String strLoReturn = "http://" + strServerName + ":" + intServerPort
				+ strContextPath + "/view/xmo/Base/frameset.vm?tree_view_type="
				+ strTreeViewType + "&ini_menu=" + strIniMenu + "&treepath="
				+ urlEncode(strTreepath) + "&open_info=" + strOpenInfo
				+ "&learner=" + strLeaner + "&calatURL=";
		// URLエンコード
		try
		{
			strLoReturn = URLEncoder.encode(strLoReturn, "UTF-8");
			//新しいメニューの表示に対応して２重にエンコードする。
			strLoReturn = URLEncoder.encode(strLoReturn, "UTF-8");
		}
		catch (UnsupportedEncodingException e1)
		{
			e1.printStackTrace();
			return "ERR";
		}

		String strXmoReturn = "http://" + strServerName + ":" + intServerPort
				+ strContextPath
				+ "/view/xmo/Base/frameset_g.vm?tree_view_type="
				+ strTreeViewType + "&ini_menu=" + strIniMenu + "&treepath="
				+ urlEncode(strTreepath) + "&open_info=" + strOpenInfo
				+ "&learner=" + strLeaner + "&calatURL=";
		// URLエンコード

		try
		{
			strXmoReturn = URLEncoder.encode(strXmoReturn, "UTF-8");
			//新しいメニューの表示に対応して２重にエンコードする。
			strXmoReturn = URLEncoder.encode(strXmoReturn, "UTF-8");
		}
		catch (UnsupportedEncodingException e2)
		{
			e2.printStackTrace();
			return "ERR";
		}

		// XMOメニューパラメータの作成
		StringBuffer strXMOMenuParam = new StringBuffer();
		strXMOMenuParam.append("parentID=");
		strXMOMenuParam.append(strParentID);
		strXMOMenuParam.append("&selectID=");
		strXMOMenuParam.append(strSelectID);
		strXMOMenuParam.append("&tree_view_type=");
		strXMOMenuParam.append(strTreeViewType);
		strXMOMenuParam.append("&returnURL=");
		strXMOMenuParam.append(strXmoReturn);
		strXMOMenuParam.append("&xmo_id=");

		//ポップアップメニューリスト
		StringBuffer sbMenu = new StringBuffer();

		try
		{
			//実行メニューカスタマイズによる変更
//			CustomMenuManager menuManager = new CustomMenuManager();
//			//ユーザーが所属するグループのID の取得
//			String groupId = getGroupId(strUserID);
//			ViewContext viewContext = (ViewContext)context;
//			int result = menuManager.loadDef(viewContext.getServletContext(), strUserID, groupId);
//			CustomMenuDef menuDef = null;
//			if (result != CustomMenuManager.RESULT_ERROR)
//			{
//				menuDef = menuManager.getCustomMenuDef();
//			}
			CustomMenuDef menuDef = getCustomMenuDef(strUserID);
			
			// ポップアップ種別が指定されている場合のみXMOメニューを作成する
			if (!strPopupType.equals(""))
			{

				// ユーザに割り当てられているXmoIDリストの取得
				Vector vecXmoList = GetAssignXmoList.getAssignXmoList(
						strUserID, strSelectID);
				if (vecXmoList == null)
				{
					// nullのときは検索失敗
					return "ERR";
				}
				/* XMSBaseの取得 */
				XMSBaseClient objXMSBase = new XMSBaseClient();

				// 初期メニュー名称からクラス名を取得する
				if (strSelectIniMenu != null && !strSelectIniMenu.equals(""))
				{
					//objXMSBase.setWhereIniMenu(strSelectIniMenu);
				}
				objXMSBase.setWhereTreeViewType(strTreeViewType);

				// 検索処理
				if (!objXMSBase.select()) { return "ERR"; }

				while (objXMSBase.next())
				{
					String strXmoId = objXMSBase.getXmoID();
					String strClassName = objXMSBase.getClassName();
					/* 取得するXMOを選別する */
					if (!vecXmoList.contains(strXmoId))
					{
						continue;
					}

					if (strClassName != null && !strClassName.equals("")
							&& !strClassName.equals(XMOPropertyDef.LEARN_XMO)
							&& !strClassName.equals(XMOPropertyDef.LOG_XMO))
					{
						/* XMOの取得 */
						XMOClient objXMO = new XMOClient(strClassName);

						// メニュー取得用のHashtableを作成して、パラメータを設定する
						Hashtable htbParam = new Hashtable();
						htbParam.put(XMOPropertyDef.PARAM_ID, strSelectID);

						htbParam.put(LoPropertyDef.USER, strUserID);
						htbParam.put(LoPropertyDef.LOID, strSelectID);
						Vector vecMenuList = objXMO.getMenuList(htbParam);
												
						for (int j = 0; j < vecMenuList.size(); j++)
						{
							MenuData objMenu = (MenuData) vecMenuList.get(j);

							//実行メニューカスタマイズによる変更
							boolean visible = customizeMenu(menuDef, objMenu, strSelectID);
							if (!visible)
							{
								continue;
							}
							
							// ポップアップ種別の取得
							if (objMenu.getPopupType().indexOf(strPopupType) >= 0)
							{

								String strTitle = objMenu.getTitle();
								String strURL = objMenu.getURL();
								// URLに'?'がついていない場合は'?'を付加
								if (strURL.indexOf('?') < 0)
								{
									strURL = strURL + "?";
								}
								else
								{
									strURL = strURL + "&";
								}
								String strTargetWindow = objMenu
										.getTargetWindow();

								sbMenu.append(strTitle + "$");
								sbMenu.append(strURL
										+ new String(strXMOMenuParam)
										+ strXmoId + "$");
								sbMenu.append("xmo" + "$");
								//Windowサイズパラメータを追加する。
								//LO側でウィンドウサイズのパラメータを追加したため、XMO側にもウィンドウサイズの
								//パラメータを追加している。但し、値は、縦横それぞれ"-1"が設定されており、
								//XMO側は実際にポップアップメニューからオープンされるウィンドウのサイズは
								//今まで通りのサイズでオープンされる。
								sbMenu.append(strWinWidth + "$");
								sbMenu.append(strWinHeight + ";");

							}
						}
					}
				}

			}

			// LOIDが指定されている場合のみLOのメニューを取得する
			//	 LOIDが仮想ルートの場合はLOを特定できないため、メニューを取得しないように変更
			if (strLoID != null && !strLoID.equals("")
					&& !strLoID.equals(LO_TREE_ROOT))
			{
				// LOXMOから指定されたLOIDのLO種別を取得する
				LoClient objLo = new LoClient();
				// 検索条件にLOIDを設定する
				objLo.setWhereLoID(strLoID);
				// 検索実行
				if (!objLo.select())
				{
					// 検索失敗時
					return "ERR";
				}

				String strLoType = "";
				String strRealLOID = "";
				String strPrere = "";
				// 検索結果の取得
				if (objLo.next())
				{
					strLoType = objLo.getLoType();
					strRealLOID = objLo.getRealLOID();
					strPrere = objLo.getPrere();
				}

				// 取得したLo種別を元にLoTopClientをインスタンス化
				Environment objEnv = new Environment();
				String strLoServerName = objEnv.getLoServerName();
				LoTopClient objLoTop = new LoTopClient(strLoServerName,
						strLoType);

				// LOタイプがコンテナの場合、Windowサイズの取得は行いません。
				if (!strLoType.equals("0"))
				{
					// Windowサイズの取得を行う。
					if (!objLoTop.getData(strRealLOID))
					{
						// Windowサイズの取得失敗時
						return "ERR";
					}
					LoComData objData = objLoTop.getDataInfo(0);
					strWinWidth = objData.getWinWidth();
					strWinHeight = objData.getWinHeight();
				}

				// ウィンドウサイズが取得できない場合はウィンドウサイズの初期値を設定する。
				if (strWinWidth.equals("") || strWinWidth == null)
				{
					strWinWidth = "-1";
					strWinHeight = "-1";
				}

				// LoTopClientに以下のパラメータを設定する
				// LOID
				objLoTop.setLoID(strLoID);
				//RealLOID
				objLoTop.setRealLoID(strRealLOID);
				// LO種別
				objLoTop.setLoType(strLoType);
				// ユーザID
				objLoTop.setUserID(strUserID);
				//ログインID
				objLoTop.setValue("LOGIN_ID", strLoginID);
				// 前提条件(LOテーブルから前提条件が取得できた場合、パラメータに設定する。)
				if (strPrere != null && !strPrere.equals(""))
				{
					objLoTop.setValue("Prere", strPrere);
				}

				// ログ取得時などのターゲットID
				if (strGroupUserID == null || strGroupUserID.equals(""))
				{
					strGroupUserID = strUserID;
				}

				//	 ログ参照の場合に、ターゲットとなるグループ/ユーザの親IDをLOに指定する。
				// ポップアップタイプが指定されていない場合はログ参照
				if (strPopupType.equals(""))
				{
					// ツリータイプがグループ（基本画面のツリーがグループの場合）
					// ツリーペインで選択されたオブジェクトのパスの最後から2番目を取得する。
					// ex)
					//      /grouptreeroot/GR000002/PE000002
					//        の場合は、"GR000002" が親IDとなる。
					String GROUP_TYPE = Common.GROUP_TYPE;
					String LO_TYPE = Common.LO_TYPE;
					if (strTreeViewType.equals(GROUP_TYPE))
					{
						int intPos = strTreepath.lastIndexOf('/');
						int intPos2 = strTreepath.lastIndexOf('/', intPos - 1);
						if (intPos >= 0 && intPos2 >= 0)
						{
							objLoTop.setValue(LoTopClient.TARGET_PARENT_ID,
									strTreepath.substring(intPos2 + 1, intPos));
						}
					}
					// グループIDが渡されてきた場合にのみparentIDを設定する。
					// ツリータイプがLO（基本画面のツリーがLOの場合）
					// パラメータで渡ってくる"parentID" が親IDとなる。
					// 基本画面のLOツリーにて学習アサインのみ割当てられているLOを選択した時とする。
					// ユーザ一覧でグループ及びユーザを選択した場合、学習メニューを非表示
					else if (strTreeViewType.equals(LO_TYPE)
							&& !strParentID.startsWith("LO"))
					{
						AssignmentsClient objAssign = new AssignmentsClient();
						boolean isAssign = AssignmentsClient.checkAssignAuth(
								strUserID, strLoID, XMSBaseTable.MANAGE_TYPE);
						if (!isAssign) { return ""; }
						if (strParentID.startsWith("GR"))
						{
							objLoTop.setValue(LoTopClient.TARGET_PARENT_ID,
									strParentID);
						}
					}
				}

				objLoTop.setTargetID(strGroupUserID);
				// パスワード
				objLoTop.setPassword(strPassword);
				// 戻りURL
				objLoTop.setReturnURL(strLoReturn);
				// LoTopClientのgetMenuListを実行して、メニューを取得する
				if (!objLoTop.getMenuList())
				{
					// メニュー取得失敗
					return "ERR";
				}

				int intMenuSize = objLoTop.getMenuListSize();

				for (int i = 0; i < intMenuSize; i++)
				{
					MenuData objMenu = objLoTop.getMenuData(i);

					//実行メニューカスタマイズによる変更
					boolean visible = customizeMenu(menuDef, objMenu, strSelectID);
					if (!visible)
					{
						continue;
					}

					String strTitle = objMenu.getTitle();
					String strURL = objMenu.getURL();
					String strTargetWindow = objMenu.getTargetWindow();
					sbMenu.append(strTitle + "$");
					sbMenu.append(strURL + "$");
					sbMenu.append(strTargetWindow + "$");
					//Windowサイズパラメータを追加する。
					sbMenu.append(strWinWidth + "$");
					sbMenu.append(strWinHeight + ";");
				}
			}
			
//			 20050126 ADD start Katsuhiko.Sakurai　進捗表示メニュー取得
			 LearningProgressManager manager = new LearningProgressManager();
			 MenuData menu = manager.getMenu( strTreeViewType, strTreepath, strSelectID, strLoID, strParentID, strSelectIniMenu, strUserID );
			 if ( menu != null ) {
				//実行メニューカスタマイズによる変更
				boolean visible = customizeMenu(menuDef, menu, strSelectID);
				if (visible)
				{
					 String strTitle = menu.getTitle();
					 String strURL = menu.getURL();
					 sbMenu.append(strTitle + "$");
					 sbMenu.append(strURL + ";");
				}
			 }
//			 20050126 ADD end

			// ADD 2005/02/09 START Katsuhiko Kagami(UNITEC) カスタマイズメニュー取得
			MenuMakerExtend menuExt = new MenuMakerExtend();
			MenuData[] menuMyP = menuExt.makeMenu(strUserID, strLoID);
			if ( menuMyP != null ) {
				for (int i = 0;i < menuMyP.length;i++) {
					//実行メニューカスタマイズによる変更
					boolean visible = customizeMenu(menuDef, menuMyP[i], strSelectID);
					if (visible)
					{
						String strTitle = menuMyP[i].getTitle();
						String strURL = menuMyP[i].getURL();
						// String strTargetWindow = objMenu.getTargetWindow();
						sbMenu.append(strTitle + "$");
						sbMenu.append(strURL + ";");
						//sbMenu.append(strTargetWindow + "$");
						//Windowサイズパラメータを追加する。
						//sbMenu.append(strWinWidth + "$");
						//sbMenu.append(strWinHeight + ";");
					}
				}
			}
			// ADD 2005/02/09 END Katsuhiko Kagami(UNITEC) カスタマイズメニュー取得



			return sbMenu.toString();
		}
		catch (Exception e)
		{
			if (e instanceof XmfException) { throw e; }
			e.printStackTrace();
			return "";
		}
	}
	
	/**
	 * カスタマイズメニュー設定のデフォルト情報を取得する。
	 * 
	 * @return カスタマイズメニュー設定情報
	 */
	public CustomMenuDef getCustomMenuDefaultDef()
	{
		CustomMenuManager menuManager = new CustomMenuManager();
		ViewContext viewContext = (ViewContext)context;
		menuManager.loadDefaultDef(viewContext.getServletContext());
		return menuManager.getCustomMenuDef();
	}
	
	/**
	 * 指定したユーザーIDに関連付けられたカスタマイズメニューの設定情報を取得する。
	 * 
	 * @param userId ユーザーID
	 * @return カスタマイズメニュー設定情報
	 */
	public CustomMenuDef getCustomMenuDef(String userId)
	{
		CustomMenuManager menuManager = new CustomMenuManager();
		//ユーザーが所属するグループのID の取得
		String groupId;
		try
		{
			groupId = getGroupId(userId);
		}
		catch (Exception e)
		{
			groupId = "";
		}
		ViewContext viewContext = (ViewContext)context;
		int result = menuManager.loadDef(viewContext.getServletContext(), userId, groupId);
		CustomMenuDef menuDef = null;
		if (result != CustomMenuManager.RESULT_ERROR)
		{
			return menuManager.getCustomMenuDef();
		}
		else
		{
			return null;
		}
	}
	
	/**
	 * 設定内容を参照して、MenuData を書き換える。
	 * 
	 * @param menuDef カスタマイズメニュー設定情報
	 * @param menuData メニューデータ
	 * @param selectId 現在選択しているユーザー・LOなどのID
	 * @return メニューを非表示とするかどうかを示すフラグ
	 */
	public boolean customizeMenu(CustomMenuDef menuDef, MenuData menuData, String selectId)
	{
		if (menuDef != null)
		{
			if (!isMenuVisible(menuDef, menuData, selectId, menuDef.getUserId(), menuDef.getGroupId()))
			{
				return false;
			}
			changeMenuTitle(menuDef, menuData, selectId, menuDef.getUserId(), menuDef.getGroupId());
		}
		return true;
	}

	private static String iniMenuUrlEncode(String target) throws Exception
	{
		URLTool tool = new URLTool();
		return tool.iniMenuUrlEncode(target);
	}

	private static String urlEncode(String target) throws Exception
	{
		URLTool tool = new URLTool();
		return tool.encodeURL(target);
	}
	
	/**
	 * 
	 * @param menuDef
	 * @param menu
	 * @param selectId
	 * @param userId
	 * @param groupId
	 */
	private void changeMenuTitle(CustomMenuDef menuDef, MenuData menu, String selectId, String userId, String groupId)
	{
		String title = menuDef.changeMenuTitle(menu.getTitle(), selectId);
		menu.setTitle(title);
	}

	/**
	 * 
	 * @param menuDef
	 * @param menu
	 * @param selectId
	 * @param userId
	 * @param groupId
	 * @return
	 */
	private boolean isMenuVisible(CustomMenuDef menuDef, MenuData menu, String selectId, String userId, String groupId)
	{
		return menuDef.isMenuVisible(menu.getTitle(), selectId);
	}
	
	private String getGroupId(String userId) throws Exception
	{
        //グループIDの取得
        String groupId = "";
        GroupAndPeopleClient gpClient = new GroupAndPeopleClient();
        gpClient.setWhereChildID(userId);
        if (gpClient.select())
        {
            if (gpClient.next())
            {
                groupId = gpClient.getParentID();
            }
        }
        return groupId;
	}
	
	public List makeMenu(String menuString, String availWidth, String availHeight)
	{
		menuString = menuString.substring(0, menuString.length() - 1);
		//取得したメニュー情報を配列に格納します。
		String[] strMenu = menuString.split(";");
		int size = strMenu.length;
		String[] strMenuData = null;
		String[] MenuName  = new String[size];
		String[] MenuURL   = new String[size];
		String[] Target    = new String[size];
		String[] WinWidth  = new String[size];
		String[] WinHeight = new String[size];

		for (int i=0; i < strMenu.length; i++)
		{
			//メニューデータを1レコードづつ配列に格納します。
			strMenuData  = strMenu[i].split("\\$");
			MenuName[i]  = (strMenuData.length > 0) ? strMenuData[0] : null;
			MenuURL[i]   = (strMenuData.length > 1) ? strMenuData[1] : null;
			Target[i]    = (strMenuData.length > 2) ? strMenuData[2] : null;
			WinWidth[i]  = (strMenuData.length > 3) ? strMenuData[3] : null;
			WinHeight[i] = (strMenuData.length > 4) ? strMenuData[4] : null;
		}

		//メニューリストを設定します。
		return fwAddMenus(MenuName, MenuURL, Target, WinWidth, WinHeight, availWidth, availHeight);
	}

	//pop_menu.js から移植
	private List fwAddMenus(String[] MenuName, String[] MenuURL, String[] Target, String[] WinWidth, String[] WinHeight, String availWidth, String availHeight)
	{
		//--------------------------------------
		//ポップアップメニューに項目を追加します
		//--------------------------------------
		List menuList = new ArrayList();
		for (int i=0; i < MenuName.length; i++)
		{
			//--------------------------------------
			//ウィンドウサイズを決定します。
			//--------------------------------------
			String strWidth = "";
			String strHeight = "";
			String strResizeMax = "";

			//サイズ指定なしの場合
			if ( WinWidth[i] == "-1" && WinHeight[i] == "-1" )
			{
				strWidth = "800";
				strHeight = "500";
				strResizeMax = "";
			}
			//最大化の場合
			else if ( WinWidth[i] == "0" && WinHeight[i] == "0" )
			{
				//学習開始以外のメニューの場合
				String menuURL = new String(MenuURL[i]);
				if (menuURL.indexOf("StartLearnServlet") == -1)
				{
					strWidth = "800";
					strHeight = "600";
					strResizeMax = "";
				}
				//学習開始の場合
				else
				{
					strWidth = availWidth;
					strHeight = availHeight;
					strResizeMax = "objLoWindow.resizeTo(screen.availWidth,screen.availHeight);";
				}
			}
			//サイズ指定の場合
			else
			{
				//学習開始以外のメニューの場合
				String menuURL = new String(MenuURL[i]);
				if (menuURL.indexOf("StartLearnServlet") == -1 )
				{
					strWidth = "800";
					strHeight = "600";
				}
				//学習開始の場合
				else
				{
					strWidth = WinWidth[i];
					strHeight = WinHeight[i];
				}
				strResizeMax = "";
			}
			//メニューの追加

			if("xmo".equals(Target[i]))
			{
				menuList.add("<a target=\"main\" href=\"javascript:var objLoWindow=window.parent.parent.parent.open('" + MenuURL[i] + "','xmo','top=0,left=0,width=" + strWidth + ",height=" + strHeight + ",resizable=yes,scrollbars=yes');" + strResizeMax + "\">" + MenuName[i] + "</a>");
			}
			else if("Function".equals(Target[i]))
			{
				menuList.add("<a href=\"" + MenuURL[i] + "\">" + MenuName[i] + "</a>");
			}
			else
			{
				menuList.add("<a target=\"main\" href=\"javascript:var objLoWindow=openWindow('" + MenuURL[i] + "','" + Target[i] + "','"+ strWidth +"','"+strHeight + "');" + strResizeMax + "\">" + MenuName[i] + "</a>");
			}
		}
		return menuList;
	}
	
	/**
	 * メソッドの学習開始メニューだけを取得する
	 * 
	 * @deprecated
	 * 
	 * @param loID
	 * @param treeViewType
	 * @param serverName
	 * @param serverPort
	 * @param contextPath
	 * @param session
	 * @return
	 * @throws Exception
	 */
 	public Hashtable getStartLearnMenuOfMethod(String loID, String treeViewType, 
			String serverName, int serverPort, String contextPath,
			HttpSession session, String strLoReturn) throws Exception
	{
		return getStartLearnMenuOfMethod(loID, treeViewType,
				serverName, serverPort, contextPath,
				session, null, null, strLoReturn);
	}
	
	/**
	 * メソッドの学習開始メニューだけを取得する(ユーザーID指定版)
	 * 
	 * @deprecated
	 * 
	 * @param loID
	 * @param treeViewType
	 * @param serverName
	 * @param serverPort
	 * @param contextPath
	 * @param session
	 * @param strUID
	 * @param strPWD
	 * @return
	 * @throws Exception
	 */
	public Hashtable getStartLearnMenuOfMethod(String loID, String treeViewType, 
			String serverName, int serverPort, String contextPath,
			HttpSession session, 
			String strUID, String strPWD,	// ADD 2005/06/03 KOJI UMEHARA [カウンセラー対応]
			String strLoReturn
			) throws Exception
	{
		String menuTitle = "";
		String menuURL = "";
		String target = "";
		String width = "";
		String height = "";
		String resizeMax = "";
		
		String menu = this.getStartLearnMenuStringOfMethod(loID, "", "", "",
				"", "", treeViewType, "", "",
				serverName, serverPort, contextPath, session
				, strUID, strPWD,	// ADD 2005/06/03 KOJI UMEHARA [カウンセラー対応]
				strLoReturn
				);

		String[] menus = menu.split(";");
		for( int i = 0; i < menus.length; i++ ) {
			//メニューデータを1レコードづつ配列に格納します。
			String[] menuItems = menus[i].split("\\$");
			if (menuItems.length > 0) {
				menuTitle = menuItems[0]; 
				if (menuTitle.equals(TOEIC650CommonConst.START_MENU_TITLE)) {
					if (menuItems.length > 1) {	menuURL = menuItems[1]; }
					if (menuItems.length > 2) {	target = menuItems[2]; }
					if (menuItems.length > 3) {	width = menuItems[3]; }
					if (menuItems.length > 4) {	height = menuItems[4]; }
					break;
				}
			}
		}

		//サイズ指定なしの場合
		if ( width.equals("-1") && height.equals("-1") )
		{
			width = "800";
			height = "500";
			resizeMax = "";
		}

		//最大化の場合
		else if ( width.equals("0") && height.equals("0") )
		{
			//学習開始以外のメニューの場合
			if (menuURL.indexOf("StartLearnServlet") == -1 )
			{
				width = "800";
				height = "600";
				resizeMax = "";
			}
			//学習開始の場合
			else
			{
				width = "800";
				height = "600";
				resizeMax = "objLoWindow.resizeTo(screen.availWidth,screen.availHeight);";
			}
		}

		//サイズ指定の場合
		else
		{
			//学習開始以外のメニューの場合
			if (menuURL.indexOf("StartLearnServlet") == -1 )
			{
				width = "800";
				height = "600";
			}
			//学習開始の場合
			else
			{
//				width = width;
//				height = height;
			}
			resizeMax = "";
		}
		
		Hashtable ht = new Hashtable();
		ht.put(titleKey, menuTitle);
		ht.put(urlKey, menuURL);
		ht.put(targetKey, target);
		ht.put(widthKey, width);
		ht.put(heightKey, height);
		ht.put(resizeMaxKey, resizeMax);
		
		return ht;
	}
	
	/**
	 * メソッド専用の実行開始メニュー文字列取得
	 * 
	 * @deprecated
	 * 
	 */
	public String getStartLearnMenuStringOfMethod(String strLoID, String strGroupUserID, 
			String strParentID, String strSelectID, 
			String strPopupType, String iniMenu, String strTreeViewType, 
			String strTreepath, String openInfo, 
			String strServerName, int intServerPort, String strContextPath,
			HttpSession session, 
			String strUID, String strPWD,	// ADD 2005/06/03 KOJI UMEHARA [カウンセラー対応]
			String strLoReturn
			) throws Exception
	{

		//ウィンドウサイズ初期値の設定
		//("-1"の場合、ウィンドウサイズは現状のままとする。)
		String strWinWidth = "-1";
		String strWinHeight = "-1";
		
		// セッション変数の取得
		// ADD 2005/06/03 START KOJI UMEHARA [カウンセラー対応]
		String strUserID = (strUID != null) ? strUID : (String) session.getAttribute(Common.USER_ID);
		String strPassword = (strPWD != null) ? strPWD : (String) session.getAttribute(Common.PASSWORD);
		// ADD 2005/06/03 END KOJI UMEHARA [カウンセラー対応]
		//String strUserID = (String) session.getAttribute(Common.USER_ID);
		//String strPassword = (String) session.getAttribute(Common.PASSWORD);
		String strLeaner = (String) session.getAttribute(Common.LEANER);
		String strLoginID = (String) session.getAttribute(Common.LOGIN_ID);

		// セッション変数のチェック
		if (strUserID == null || strPassword == null || strLeaner == null) { return "ERR"; }

		//ポップアップメニューリスト
		StringBuffer sbMenu = new StringBuffer();

		try
		{

			// LOIDが指定されている場合のみLOのメニューを取得する
			//	 LOIDが仮想ルートの場合はLOを特定できないため、メニューを取得しないように変更
			if (strLoID != null && !strLoID.equals("")
					&& !strLoID.equals(Common.LO_TREE_ROOT))
			{

				// メソッド配下のLO取得
				MethodClient mc = new MethodClient();
				mc.setWhereLoID(strLoID);
				if( !mc.select() )
				{
					return "ERR";
				}
				MethodData[] methodList = mc.getResultList();
				if (methodList.length == 1)
				{
					strLoID = methodList[0].getMethodLOID();

					// LOの情報取得
					String strLoType = "";
					String strRealLOID = "";
					String strPrere = "";
					LoClient objLo = new LoClient();
					objLo.setWhereLoID(strLoID);
					if (!objLo.select())
					{
						return "ERR";
					}
					if (objLo.next())
					{
						strLoType = objLo.getLoType();
						strRealLOID = objLo.getRealLOID();
						strPrere = objLo.getPrere();
					}

					//LO のメニューを取得する
					try
					{
						Environment objEnv = new Environment();
						String strLoServerName = objEnv.getLoServerName();
						if (!setLOMenu(strLoServerName, strLoType,
								strLoID, strRealLOID, strPrere,
								strLoginID, strPassword, strUserID, strGroupUserID,
								strTreeViewType, strTreepath, strPopupType,
								strParentID, strSelectID,
								strLoReturn, null, sbMenu, true
								))
						{
							return "";
						}
					}
					catch(Exception e)
					{
						return "ERR";
					}
				}
			}

			return sbMenu.toString();
		}
		catch (Exception e)
		{
			if (e instanceof XmfException) { throw e; }
			e.printStackTrace();
			return "";
		}
	}
	
	
	/**
	 * 指定したメニューの情報が返される。
	 * @param loID LOID。
	 * @param userID ユーザーID。
	 * @param loginID ログインID。
	 * @param password パスワード。
	 * @param loReturn 戻りURL。
             * @prama title メニュータイトル
	 * @return メニューデータ。
	 * @throws Exception
	 */
	private static MenuData getMenuData(String loID, String userID, String loginID, String password, String loReturn, String title)
		throws Exception
	{
		// パラメータチェック
		if (loID == null)
			return null;
		if (userID == null)
			return null;
		if (password == null)
			return null;
		if (loginID == null)
			return null;

		// LO情報の取得
		LoClient objLo = new LoClient();
		objLo.setWhereLoID(loID);
		if (!objLo.select())
			return null;
		if (!objLo.next())
			return null;

		String strLoType = objLo.getLoType();
		String strRealLOID = objLo.getRealLOID();
		String strPrere = objLo.getPrere();
		
		Environment objEnv = new Environment();
		String strLoServerName = objEnv.getLoServerName();
		
		// メニュー情報の取得
		LoTopClient objLoTop = new LoTopClient(strLoServerName, strLoType);
		objLoTop.setLoID(loID);
		objLoTop.setRealLoID(strRealLOID);
		objLoTop.setLoType(strLoType);
		objLoTop.setUserID(userID);
		objLoTop.setValue("LOGIN_ID", loginID);
		if (strPrere != null && !strPrere.equals(""))
			objLoTop.setValue("Prere", strPrere);
		objLoTop.setTargetID(userID);
		objLoTop.setPassword(password);
		objLoTop.setReturnURL(loReturn);
		
		if (!objLoTop.getMenuList())
			return null;
		if (objLoTop.getMenuListSize() <= 0)
			return null;
		MenuData objMenu= new MenuData() ;
		for (int i = 0; i < objLoTop.getMenuListSize(); i++)
		{
			objMenu = objLoTop.getMenuData(i);
			if(objMenu.getTitle().equals(title))
					break;
		}

		// Windowサイズの取得
		if (!strLoType.equals("0"))
		{
			if (objLoTop.getData(strRealLOID))
			{
				LoComData objData = objLoTop.getDataInfo(0);
				objMenu.setWidth(objData.getWinWidth());
				objMenu.setHeight(objData.getWinHeight());
			}
			
			if (objMenu.getWidth() == null || objMenu.getWidth().equals("") || objMenu.getHeight() == null || objMenu.getHeight().equals(""))
			{
				objMenu.setWidth("-1");
				objMenu.setHeight("-1");
			}
		}
		
		return objMenu;
	}

	/**
	 * 学習ログメニューの情報が返される。
	 * @param loID LOID。
	 * @param userID ユーザーID。
	 * @param loginID ログインID。
	 * @param password パスワード。
	 * @param loReturn 戻りURL。
	 * @return メニューデータ。
	 * @throws Exception
	 */
            public static MenuData getLoLogMenuData(String loID, String userID, String loginID, String password, String loReturn)
		throws Exception
            {
                    return getMenuData(loID, userID, loginID, password, loReturn, menuLoLog);
            }

	/**
	 * 学習詳細ログメニューの情報が返される。
	 * @param loID LOID。
	 * @param userID ユーザーID。
	 * @param loginID ログインID。
	 * @param password パスワード。
	 * @param loReturn 戻りURL。
	 * @return メニューデータ。
	 * @throws Exception
	 */
            public static MenuData getLoLogDetailMenuData(String loID, String userID, String loginID, String password, String loReturn)
		throws Exception
            {
                    return getMenuData(loID, userID, loginID, password, loReturn, menuLoLogDetail);
            }

	/**
	 * 学習開始メニューの情報が返される。
	 * @param loID LOID。
	 * @param userID ユーザーID。
	 * @param loginID ログインID。
	 * @param password パスワード。
	 * @param loReturn 戻りURL。
	 * @return メニューデータ。
	 * @throws Exception
	 */
	public static MenuData getStartLearnData(String loID, String userID, String loginID, String password, String loReturn)
		throws Exception
	{
		// パラメータチェック
		if (loID == null)
			return null;
		if (userID == null)
			return null;
		if (password == null)
			return null;
		if (loginID == null)
			return null;

		// LO情報の取得
		LoClient objLo = new LoClient();
		objLo.setWhereLoID(loID);
		if (!objLo.select())
			return null;
		if (!objLo.next())
			return null;

		String strLoType = objLo.getLoType();
		String strRealLOID = objLo.getRealLOID();
		String strPrere = objLo.getPrere();
		
		Environment objEnv = new Environment();
		String strLoServerName = objEnv.getLoServerName();
		
		// メニュー情報の取得
		LoTopClient objLoTop = new LoTopClient(strLoServerName, strLoType);
		objLoTop.setLoID(loID);
		objLoTop.setRealLoID(strRealLOID);
		objLoTop.setLoType(strLoType);
		objLoTop.setUserID(userID);
		objLoTop.setValue("LOGIN_ID", loginID);
		if (strPrere != null && !strPrere.equals(""))
			objLoTop.setValue("Prere", strPrere);
		objLoTop.setTargetID(userID);
		objLoTop.setPassword(password);
		objLoTop.setReturnURL(loReturn);
		// 学習開始メニューのみ取得
		objLoTop.setValue("START_ONLY", "on");
		
		if (!objLoTop.getMenuList())
			return null;
		if (objLoTop.getMenuListSize() <= 0)
			return null;

		MenuData objMenu = objLoTop.getMenuData(0);

		// Windowサイズの取得
		if (!strLoType.equals("0"))
		{
			if (objLoTop.getData(strRealLOID))
			{
				LoComData objData = objLoTop.getDataInfo(0);
				objMenu.setWidth(objData.getWinWidth());
				objMenu.setHeight(objData.getWinHeight());
			}
			
			if (objMenu.getWidth() == null || objMenu.getWidth().equals("") || objMenu.getHeight() == null || objMenu.getHeight().equals(""))
			{
				objMenu.setWidth("-1");
				objMenu.setHeight("-1");
			}
		}
		
		return objMenu;
	}
	}