/*
 * 作成日: 2005/02/17
 *
 * TODO この生成されたファイルのテンプレートを変更するには次へジャンプ:
 * ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
 */
package jp.co.ntt.lms.xmf.tools.xmo.GroupAndPeople;

import java.util.Hashtable;
import java.util.Vector;

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

import jp.co.ntt.lms.xmf.common.CommonFunction;
import jp.co.ntt.lms.xmf.tools.ToolBase;
import jp.co.ntt.lms.xmo.Base.XMSBaseClient;
import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.Groups.GroupsData;
import jp.co.ntt.lms.xmo.People.PeopleClient;
import jp.co.ntt.lms.xmo.util.HtmlEscape;

/**
 * @author Administrator
 *
 * TODO この生成された型コメントのテンプレートを変更するには次へジャンプ:
 * ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
 */
public class GroupAndPeopleTool extends ToolBase {

	public String getChildGroups(HttpServletRequest request, HttpServletResponse response) {
		
		HttpSession session = request.getSession();
		
		// パラメータ取得
		String strParentID = request.getParameter( "ParentID" );

		GroupAndPeopleClient objXMO = null;
		try {
			StringBuffer strGetLine = new StringBuffer();
			strGetLine.append( "<childlenlist>\n" );

			// 選択された親IDがGROUP_TREE_ROOTの場合
			if( strParentID.equals(getContextString("GROUP_TREE_ROOT")) ) {
				// ログインしているユーザに管理アサインされているLOを取得します。
				// ログインユーザIDの取得
				String strUserID = (String)session.getAttribute(getContextString("USER_ID"));
				if( strUserID == null ) {
					return "ERR";
				}

				// セッションからXMOIDを取得する
				String strXmoID = (String)session.getAttribute( getContextString("GAPKOUSEI_XMO_ID") );
				if( strXmoID == null ) {
					return "ERR";
				}

				XMSBaseClient objXms = new XMSBaseClient();

				// ルートGroupリスト検索処理(構成変更管理(LO)が割当たっているものを取得)
				if( !objXms.searchRootGroupList(strUserID, strXmoID ) ) {
					return "ERR";
				}

				// 検索がうまくいった場合
				GroupsData[] objGroupsList = objXms.getRootGroupList();
				// ルート直下のMenberShipIDをセッションに格納するためのHashtableをインスタンス化
				Hashtable htbRootInfo = new Hashtable();
				// セッションに格納します
				session.setAttribute(getContextString("GAP_ROOT_INFO"), htbRootInfo);

				for( int i = 0; i < objGroupsList.length; i++ ) {
					GroupsData objGroupsData = objGroupsList[i];

					String strGroupID = objGroupsData.getGroupID();
					String strParentGroupID = objGroupsData.getParentID();
					
					// セッションに格納します
					htbRootInfo.put(strGroupID, strParentGroupID);
					
					// 出力文字列の作成
					strGetLine.append( "<child title=\"" );
					strGetLine.append( HtmlEscape.escape(objGroupsData.getGroupName()) );
					strGetLine.append( "\" iconid=\"group\" id=\"" );
					strGetLine.append( strGroupID );
					strGetLine.append( "\" type=\"" );
					if( i == objGroupsList.length - 1 ) {
						strGetLine.append( objGroupsData.getGroupType() + "^L");
					}
					else {
						strGetLine.append( objGroupsData.getGroupType() );
					}
					strGetLine.append( "\" />\n" );
				}
			}
			else {
				// グループと人管理XMOの取得
				objXMO = new GroupAndPeopleClient();
				objXMO.setParentID( strParentID );

				int intGPResult = 0;
				if( !objXMO.select() ) {
					throw new Exception( "グループと人検索失敗 " + objXMO.getMessage() );
				}else{
					//検索件数を取得
					intGPResult = objXMO.getResultCount();
				}
				// グループ管理XMOの取得
				GroupsClient objGroups = new GroupsClient();
				// 人管理XMOの取得
				PeopleClient objPelple = new PeopleClient();

				int Counter = 0;
				while( objXMO.next() ) {
					Counter++;
					// グループIDの取得
					String strChildID = objXMO.getChildID();
					if( strChildID.substring( 0, 2 ).equals( "PE" ) ) {
						// グループIDを元にグループ名称を取得する
						objPelple.clear();
						objPelple.setWhereUserID( strChildID );
						if( objPelple.select() ) {
							String strUserName = "";
							String strType = "";
							if( objPelple.next() ) {
								strUserName = objPelple.getUserName();
								strType = objPelple.getSex() + "^" + objPelple.getUserType();
							}
							//階層の最終レコードの場合
							if(Counter==intGPResult){
								strType = strType + "^L";
							}
							strGetLine.append( "<child title=\"" );
							strGetLine.append( HtmlEscape.escape(strUserName) );
							strGetLine.append( "\" iconid=\"person\" id=\"" );
							strGetLine.append( strChildID );
							strGetLine.append( "\" type=\"" );
							strGetLine.append( strType );
							strGetLine.append( "\" />\n" );
						}
						else {
							throw new Exception( "ユーザ検索失敗 " + objXMO.getMessage() );
						}
					}
					else {
						// グループIDを元にグループ名称を取得する
						objGroups.clear();
						objGroups.setWhereGroupID( strChildID, objGroups.SEARCH_EQUALS );
						if( objGroups.select() ) {
							String strGroupName = "";
							String strGroupType = "";
							if( objGroups.next() ) {
								strGroupName = objGroups.getGroupName();
								strGroupType = objGroups.getGroupType();
							}
							//階層の最終レコードの場合
							if(Counter==intGPResult){
								strGroupType = strGroupType + "^L";
							}
							strGetLine.append( "<child title=\"" );
							strGetLine.append( HtmlEscape.escape(strGroupName) );
							strGetLine.append( "\" iconid=\"group\" id=\"" );
							strGetLine.append( strChildID );
							strGetLine.append( "\" type=\"" );
							strGetLine.append( strGroupType );
							strGetLine.append( "\" />\n" );
						}
						else {
							throw new Exception( "グループ検索失敗 " + objXMO.getMessage() );
						}
					}
				}
			}
			strGetLine.append( "</childlenlist>\n" );

			return strGetLine.toString();
		}
		catch( Exception e ) {
			e.printStackTrace();
			return "ERR";
		}
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	// パラメータ取得
	//	SendTargetRelationID	更新するmenberShipID配列 必須
	//							配列内のメンバーシップIDは親ID^子IDのように"^"で区切られている
	//	ReceiveTargetRelationID	移動先のmemberShipID	必須
	//							メンバーシップIDは親ID^子IDのように"^"で区切られている
	//	type					処理区分（1: 上へ 2: 中へ 3: 下へ) 必須
	//////////////////////////////////////////////////////////////////////////////////
	public String updateChildGroup(HttpServletRequest request, HttpServletResponse response) throws Exception {

		HttpSession session = request.getSession();
		
		// 移動元メンバーシップIDリストを取得する
		String[] strMemberShipIDList = request.getParameterValues( "SendTargetRelationID" );
		// 移動先メンバーシップIDを取得する
		String strReceiveMemberShipID = request.getParameter("ReceiveTargetRelationID");
		// 処理区分を取得する
		String strType = request.getParameter("type");
		// 移動元メンバーシップIDが未設定の場合
		if( strMemberShipIDList == null ) {
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}
		// 移動先メンバーシップIDが未設定の場合
		if( strReceiveMemberShipID == null ) {
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}
		//処理区分が数値ではない場合
		int intType = 0;
		try{
			intType = new Integer(strType).intValue();
		}
		catch(NumberFormatException ne){
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}
		//処理区分が1、2、3ではない場合
		if( intType < 1 || intType > 3 ) {
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}

		// ダミーの親ID(grouptreeroot)を見つけたらDBの親ID(GR〜)に変換する
		for( int i = 0; i < strMemberShipIDList.length; i++ ) {
			String strMemberShipID = strMemberShipIDList[i];
			if(strMemberShipID.indexOf(getContextString("GROUP_TREE_ROOT")) != -1) {
				int intIndex = getContextString("GROUP_TREE_ROOT").length();
				String strTempChildID = strMemberShipID.substring(intIndex + 1);
				Hashtable htbRootInfo = (Hashtable)session.getAttribute(getContextString("GAP_ROOT_INFO"));
				// DBの親ID + 子供ID = メンバID
				strMemberShipID = (String)htbRootInfo.get(strTempChildID) + "^" + strTempChildID;
			}
			// 元の配列の値を新しく作成したメンバーシップIDで置き換える
			strMemberShipIDList[i] = strMemberShipID;
		}

		// ダミーの親ID(grouptreeroot)を見つけたらDBの親ID(GR〜)に変換する
		if(strReceiveMemberShipID.indexOf(getContextString("GROUP_TREE_ROOT")) != -1) {
			int intIndex = getContextString("GROUP_TREE_ROOT").length();
			String strTempChildID = strReceiveMemberShipID.substring(intIndex + 1);
			Hashtable htbRootInfo = (Hashtable)session.getAttribute(getContextString("GAP_ROOT_INFO"));
			// DBの親ID + 子供ID = メンバID
			strReceiveMemberShipID = (String)htbRootInfo.get(strTempChildID) + "^" + strTempChildID;
		}

		GroupAndPeopleClient objGandPeople = new GroupAndPeopleClient();
		try {

			// グループと人XMOの移動処理をコールする
			if( !objGandPeople.transfer(strMemberShipIDList, strReceiveMemberShipID, new Integer(strType).intValue() ) ) {
				// 削除がうまくいかなかった場合
				if( objGandPeople.isErr() ) {
					return "err";
				}
				else {
					String strMessage =  objGandPeople.getMessage();
					return "warn^" + strMessage;
				}
			}

			return "true";
		}
		catch( Throwable e ) {
			e.printStackTrace();
			return  e.getMessage();
		}

	}
	
	//////////////////////////////////////////////////////////////////////////////////
	// パラメータ取得
	//	SendTargetRelationID	更新するmenberShipID配列 必須
	//							配列内のメンバーシップIDは親ID^子IDのように"^"で区切られている
	//	ReceiveTargetRelationID	移動先のmemberShipID	必須
	//							メンバーシップIDは親ID^子IDのように"^"で区切られている
	//	type					処理区分（1: 上へ 2: 中へ 3: 下へ) 必須
	//////////////////////////////////////////////////////////////////////////////////
	public String copy(HttpServletRequest request, HttpServletResponse response) throws Exception {

		HttpSession session = request.getSession();
		
		String[] strMemberShipIDList = request.getParameterValues( "SendTargetRelationID" );
		// 所属追加先メンバーシップIDを取得する
		String strReceiveMemberShipID = request.getParameter("ReceiveTargetRelationID");
		// 処理区分を取得する
		String strType = request.getParameter("type");

		// 所属追加元メンバーシップIDが未設定の場合
		if( strMemberShipIDList == null ) {
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}
		// 所属追加先メンバーシップIDが未設定の場合
		if( strReceiveMemberShipID == null ) {
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}
		//処理区分が数値ではない場合
		int intType = 0;
		try{
			intType = new Integer(strType).intValue();
		}
		catch(NumberFormatException ne){
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}
		//処理区分が1、2、3ではない場合
		if( intType < 1 || intType > 3 ) {
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}

		// ダミーの親ID(grouptreeroot)を見つけたらDBの親ID(GR〜)に変換する
		for(int i = 0; i < strMemberShipIDList.length; i++ ) {
			String strMemberShipID = strMemberShipIDList[i];
			if(strMemberShipID.indexOf(getContextString("GROUP_TREE_ROOT")) != -1) {
				int intIndex = getContextString("GROUP_TREE_ROOT").length();
				String strTempChildID = strMemberShipID.substring(intIndex + 1);
				Hashtable htbRootInfo = (Hashtable)session.getAttribute(getContextString("GAP_ROOT_INFO"));
				// DBの親ID + 子供ID = メンバID
				strMemberShipID = (String)htbRootInfo.get(strTempChildID) + "^" + strTempChildID;
			}
			// 元の配列の値を新しく作成したメンバーシップIDで置き換える
			strMemberShipIDList[i] = strMemberShipID;
		}

		// ダミーの親ID(grouptreeroot)を見つけたらDBの親ID(GR〜)に変換する
		if(strReceiveMemberShipID.indexOf(getContextString("GROUP_TREE_ROOT")) != -1) {
			int intIndex = getContextString("GROUP_TREE_ROOT").length();
			String strTempChildID = strReceiveMemberShipID.substring(intIndex + 1);
			Hashtable htbRootInfo = (Hashtable)session.getAttribute(getContextString("GAP_ROOT_INFO"));
			// DBの親ID + 子供ID = メンバID
			strReceiveMemberShipID = (String)htbRootInfo.get(strTempChildID) + "^" + strTempChildID;
		}

		GroupAndPeopleClient objGandPeople = new GroupAndPeopleClient();
		try {

			// グループと人XMOの移動処理をコールする
			if( !objGandPeople.copy(strMemberShipIDList, strReceiveMemberShipID, new Integer(strType).intValue() ) ) {
				// 削除がうまくいかなかった場合
				if( objGandPeople.isErr() ) {
					return "err";
				}
				else {
					String strMessage =  objGandPeople.getMessage();
					return "warn^" + strMessage;
				}
			}

			return "true";
		}
		catch( Throwable e ) {
			e.printStackTrace();
			return  e.getMessage();
		}
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	// パラメータ取得
	//	SendTargetRelationID	更新するmenberShipID配列 必須
	//							配列内のメンバーシップIDは親ID^子IDのように"^"で区切られている
	//	ReceiveTargetRelationID	移動および所属追加先のmemberShipID	必須
	//							メンバーシップIDは親ID^子IDのように"^"で区切られている
	//	type					処理区分（1: 上へ 2: 中へ 3: 下へ) 必須
	//////////////////////////////////////////////////////////////////////////////////
	public String copyCheck(HttpServletRequest request, HttpServletResponse response) throws Exception {

		HttpSession session = request.getSession();
		
		// 移動および所属追加元メンバーシップIDリストを取得する
		String[] strMemberShipIDList = request.getParameterValues( "SendTargetRelationID" );
		// 移動および所属追加先メンバーシップIDを取得する
		String strReceiveMemberShipID = request.getParameter("ReceiveTargetRelationID");
		// 処理区分を取得する
		String strType = request.getParameter("type");

		// 所属追加元メンバーシップIDが未設定の場合
		if( strMemberShipIDList == null ) {
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}
		// 所属追加先メンバーシップIDが未設定の場合
		if( strReceiveMemberShipID == null ) {
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}
		//処理区分が数値ではない場合
		int intType = 0;
		try{
			intType = new Integer(strType).intValue();
		}
		catch(NumberFormatException ne){
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}
		//処理区分が1、2、3ではない場合
		if( intType < 1 || intType > 3 ) {
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}
		// ダミーの親ID(grouptreeroot)を見つけたらDBの親ID(GR〜)に変換する
		for(int i = 0; i < strMemberShipIDList.length; i++ ) {
			String strMemberShipID = strMemberShipIDList[i];
			if(strMemberShipID.indexOf(getContextString("GROUP_TREE_ROOT")) != -1) {
				int intIndex = getContextString("GROUP_TREE_ROOT").length();
				String strTempChildID = strMemberShipID.substring(intIndex + 1);
				Hashtable htbRootInfo = (Hashtable)session.getAttribute(getContextString("GAP_ROOT_INFO"));
				// DBの親ID + 子供ID = メンバID
				strMemberShipID = (String)htbRootInfo.get(strTempChildID) + "^" + strTempChildID;
			}
			// 元の配列の値を新しく作成したメンバーシップIDで置き換える
			strMemberShipIDList[i] = strMemberShipID;
		}
		// ダミーの親ID(grouptreeroot)を見つけたらDBの親ID(GR〜)に変換する
		if(strReceiveMemberShipID.indexOf(getContextString("GROUP_TREE_ROOT")) != -1) {
			int intIndex = getContextString("GROUP_TREE_ROOT").length();
			String strTempChildID = strReceiveMemberShipID.substring(intIndex + 1);
			Hashtable htbRootInfo = (Hashtable)session.getAttribute(getContextString("GAP_ROOT_INFO"));
			// DBの親ID + 子供ID = メンバID
			strReceiveMemberShipID = (String)htbRootInfo.get(strTempChildID) + "^" + strTempChildID;
		}

		// 移動及び所属追加先をメンバシップIDから取得する
		String strReceiveGroupLoID = "";
		// 中への場合
		if( strType.equals( "2" ) ) {
			strReceiveGroupLoID = strReceiveMemberShipID.substring( strReceiveMemberShipID.indexOf("^") + 1, strReceiveMemberShipID.length() );
		}
		// 上へ、下への場合
		else {
			strReceiveGroupLoID = strReceiveMemberShipID.substring( 0, strReceiveMemberShipID.indexOf("^") );
		}
		
		// 移動及び所属追加元をメンバシップIDから取得する
		Vector vecSendIDList = new Vector();
		for( int i = 0; i < strMemberShipIDList.length; i++ ) {
			String strSendparentID = strMemberShipIDList[i].substring( 0, strMemberShipIDList[i].indexOf("^") );
			if(!strSendparentID.equals(strReceiveGroupLoID)){
				vecSendIDList.add(strMemberShipIDList[i].substring( strMemberShipIDList[i].indexOf("^") + 1, strMemberShipIDList[i].length() ));
			}
		}

		GroupAndPeopleClient objGandPeople = new GroupAndPeopleClient();
		try {
			objGandPeople.setWhereParentID( strReceiveGroupLoID );
			if( !objGandPeople.select() ) {
				// 検索失敗
				return "ERR";
			}
			while( objGandPeople.next() ) {
				if(!objGandPeople.isGroup()){
					String strID = objGandPeople.getChildID();
					if ( vecSendIDList.contains(strID) ){
						for( int i = 0; i < vecSendIDList.size(); i++ ) {
							if(strID.equals((String)vecSendIDList.get(i))) {
								return "warn^" + i;
							}
						}
					}
				}
			}

			return "true";
		}
		catch( Throwable e ) {
			e.printStackTrace();
			return  e.getMessage();
		}
	}

	//////////////////////////////////////////////////////////////////////////////////
	// パラメータ取得
	//	SendTargetRelationID	更新するmenberShipID配列 必須
	//							配列内のメンバーシップIDは親ID^子IDのように"^"で区切られている
	//////////////////////////////////////////////////////////////////////////////////
	public String errCheck(HttpServletRequest request, HttpServletResponse response) throws Exception {

		// 移動元メンバーシップIDリストを取得する
		String[] strMemberShipIDList = request.getParameterValues( "SendTargetRelationID" );

		// 移動元メンバーシップIDが未設定の場合
		if( strMemberShipIDList == null ) {
			String strMessage = "パラメータは不正です。";
			response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, null ) );
		}
		
		GroupAndPeopleClient objGandPeople = new GroupAndPeopleClient();
		try {
			for( int i = 0; i < strMemberShipIDList.length; i++ ) {
				// メンバーシップＩＤから子ＩＤを取得する
				String strChildID = strMemberShipIDList[i].substring( strMemberShipIDList[i].indexOf( "^" ) + 1 );
				// GroupAndPeopleテーブルをChildIDを指定して、検索を行う.
				objGandPeople.setWhereChildID( strChildID );
				if( !objGandPeople.select() ) {
					// 検索失敗
					return  "ERR";
				}
				
				// 検索が成功したら、検索件数を取得する
				int intResultCount = objGandPeople.getResultCount();
				// 検索結果が２以上ならエラーとする
				if( intResultCount > 1 ) {
					return "warn^" + i;
				}
			}
			
			return "true";
		}
		catch( Throwable e ) {
			e.printStackTrace();
			return  e.getMessage();
		}
	}
	
}
