/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	ScormLO更新アクションクラス
//
//		変更履歴
//			2005.02.16  新規作成  梅原 浩司
//
//	機能
//
//	このクラスはScormLO更新画面のアクションクラスです。
//
////////////////////////////////////////////////////////////////

package jp.co.ntt.lms.xmf.actions.lo.scorm;

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

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

import java.util.*;

import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.MessageData;
import jp.co.ntt.lms.xmo.util.HtmlEscape;
import jp.co.ntt.lms.xmo.Lo.HistoryData;
import jp.co.ntt.lms.lo.LoPropertyDef;
import jp.co.ntt.lms.lo.LoTopClient;
import jp.co.ntt.lms.lo.LoComData;
import jp.co.ntt.lms.lo.scorm.ScormLoEnv;
import jp.co.ntt.lms.xmf.common.CommonFunction;
//ADD 2005/02/13 START Katsuhiko Kagami(UNITEC) [LO購入項目追加]
import jp.co.ntt.lms.xmo.Lo.LoExtend.LoExtendTable;
//ADD 2005/02/13 END Katsuhiko Kagami(UNITEC) [LO購入項目追加] 

/**
 *  ScormLO更新アクションクラス
 * 
 *  このクラスはScormLO更新画面のアクションクラスです。
 * 
 *  @author 梅原 浩司
 *  @version 1.0
 */
public class ScormLoUpdateAction extends Action {
//	ADD 2005/02/23 START Tsuboi(UNITEC) [キーワードリスト数]
	private final int NUM_LOSEARCH_KEYWORD_COUNT = 5;
//ADD 2005/02/23 END Tsuboi(UNITEC) [キーワードリスト数] 

	/**
	 * executeメソッド
	 * 
	 * @param ActionMapping このアクションが選択されたときに使用されたActionMapping
	 * @param ActionForm 入力フォーム
	 * @param HttpServletRequest HTTPリクエスト
	 * @param HttpServletResponse HTTPレスポンス
	 * @return ActionForward アクションフォワード
	 * @throws Exception 
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {

		// メッセージリソース取得
		MessageResources resCnt = getResources(request, "msg.xmf.lo.scorm.MessageResources");
		MessageResources resMsg = getResources(request, "msg.xmf.xmo.lo.MessageResources");

		// URLパラメータの取得
		String strLoID = request.getParameter( "LoID" );
		String strLoType = request.getParameter( "LoType" );
		String strReturnURL = request.getParameter( "returnURL" );
		String strAction = request.getParameter( "action" );
		// ログインユーザID
		String strLogin_UserID = (String)request.getSession().getAttribute( "userId" );
		////////////////////////////////////////////////////////////////////////////
		// 入力項目
		// =========================================================================
		// LOタイトル
		String strLoTytle       = CommonFunction.null2blank( request.getParameter( "LoTytle" ) );
		// 外部ID
		String strForeignID     = CommonFunction.null2blank( request.getParameter( "ForeignID" ) );
		// 教材ID
		String strMaterialID    = CommonFunction.null2blank( request.getParameter( "MaterialID" ) );
		// キーワード
		String strKeyWord       = CommonFunction.null2blank( request.getParameter( "KeyWord" ) );
		// 説明
		String strLoExplanation = CommonFunction.null2blank( request.getParameter( "Loexplanation" ) );
		// バージョン
		String strVersion       = CommonFunction.null2blank( request.getParameter( "Version" ) );
		// 完結要件
		String strConclusion    = CommonFunction.null2blank( request.getParameter( "hdnConclusion" ) );
		// Windowサイズ(縦)
		String strWinHeight     = CommonFunction.null2blank( request.getParameter( "txtWinHeight" ) );
		// Windowサイズ(横)
		String strWinWidth      = CommonFunction.null2blank( request.getParameter( "txtWinWidth" ) );
		// 登録日
		String strEntryDate     = CommonFunction.null2blank( request.getParameter( "EntryDate" ) );
		// 登録者
		String strEntryName     = CommonFunction.null2blank( request.getParameter( "EntryName" ) );
		// 登録ログインID
		String strEntryID       = CommonFunction.null2blank( request.getParameter( "EntryID" ) );
		// 最終更新日
		String strLastDate      = CommonFunction.null2blank( request.getParameter( "LastDate" ) );
		// 最終更新者
		String strLastName      = CommonFunction.null2blank( request.getParameter( "LastName" ) );
		// 最終登録ログインID
		String strLastID        = CommonFunction.null2blank( request.getParameter( "LastID" ) );
		// 更新回数
		String strRenewCnt      = CommonFunction.null2blank( request.getParameter( "RenewCnt" ) );
		// 前提条件
		String strPrere         = CommonFunction.null2blank( request.getParameter( "hdnPrere" ) );

//		 ADD 2005/02/13 START Katsuhiko Kagami(UNITEC) [LO購入項目追加]
		String strBuyStatus 	= CommonFunction.null2blank( request.getParameter( "BuyStatus" ) );		// 購入ステータス
// ADD 2005/02/13 END Katsuhiko Kagami(UNITEC) [LO購入項目追加]
// ADD 2005/02/14 START s-mori [推奨LO検索キーワード追加]
		String[] strLoSearchKeyWord = new String[NUM_LOSEARCH_KEYWORD_COUNT];
		for(int k = 0; k < NUM_LOSEARCH_KEYWORD_COUNT; k++){
			strLoSearchKeyWord[k] = CommonFunction.null2blank(request.getParameter("LoSearchKeyWord_" + k));
		}
// ADD 2005/02/14 END
//	ADD 2005/02/16 START MASUDA [属性追加対応]
		String strLomDetail 	= CommonFunction.null2blank( request.getParameter( "LomDetail" ) );
//	ADD 2005/02/16 END MASUDA

		// RealLOID
		String strRealLOID = "";
		// 登録情報
		String entryInfo = null;
		// 最終更新情報
		String lastUpdateInfo = null;

		// アクションフラグが設定されていた場合は更新処理を行います
		if( strAction != null && strAction.equals( "on" ) ) {
			LoClient objLo = new LoClient();

			// LOテーブルの設定
			// LOID
			objLo.setWhereLoID( strLoID );
			// LOタイプ
			objLo.setLoType( strLoType );
			// 外部ID
			objLo.setForeignID( strForeignID );
			// キーワード
			objLo.setKeyWord( strKeyWord );
			// 隠しフラグ("0"で固定)
			objLo.setDeleteFlag( "0" );

			// Scorm教材個別テーブルの設定
			// 共通登録項目の設定
			objLo.setValue( LoPropertyDef.LOID, strLoID );
			// LO説明
			objLo.setValue( LoPropertyDef.LOEXPLANATION, strLoExplanation );
			// LOタイトル
			objLo.setValue( LoPropertyDef.LOTITLE, strLoTytle );
			// バージョン
			objLo.setValue( LoPropertyDef.LOVERSION, strVersion );
			// 教材ID
			objLo.setValue( LoPropertyDef.MATERIALID, strMaterialID );
			// 完結要件
			objLo.setValue( LoPropertyDef.CONCLUSION, strConclusion );
			// Windowサイズ(縦)
			objLo.setValue( LoPropertyDef.WINHEIGHT, strWinHeight );
			// Windowサイズ(横)
			objLo.setValue( LoPropertyDef.WINWIDTH, strWinWidth );
			// ログインユーザID
			objLo.setValue( LoPropertyDef.LOGIN_USER_ID, strLogin_UserID );
			// 前提条件
			objLo.setValue( LoPropertyDef.PRERE, strPrere );

//			 ADD 2005/02/13 START Katsuhiko Kagami(UNITEC) [LO購入項目追加]
			// 先にLoExtendの更新を試みる。
			String strRegLoID = strLoID;
			String strRegBuyStatus = null;
			// 新規か更新かの判断
			boolean bExistLoExtend = false;
			if (objLo.selectLoExtend(strLoID)) {
				if (objLo.isExistLoExtend()) {
					// 更新処理
					bExistLoExtend = true;
				}
			}
			if (strBuyStatus.equals("")) {
				// 購入ステータスの選択が無かった場合は初期値は購入不要
				strRegBuyStatus = LoExtendTable.LOEXTEND_NOREQUIRE_BUY;
			} else {
				strRegBuyStatus = strBuyStatus;
			}

			// ADD 2005/02/14 START s-mori [推奨LO検索キーワード追加]
			//for(int k = 0; k < NUM_LOSEARCH_KEYWORD_COUNT; k++){
			//	if(!strLoSearchKeyWord[k].equals("")){
			//		strLoSearchKeyWord[k] = CommonFunction.encodeSJIS(strLoSearchKeyWord[k]);
			//	}
			//}
			// ADD 2005/02/14 END

			if (bExistLoExtend) {
				// 既存のレコードの更新処理
				if (!objLo.updateLoExtend(strRegLoID, strRegBuyStatus, strLoSearchKeyWord[0], strLoSearchKeyWord[1], strLoSearchKeyWord[2], strLoSearchKeyWord[3], strLoSearchKeyWord[4])) {
					// LoExtendの更新の失敗
// ADD 2005/02/23 START Tsuboi [エラーURLを返却]						
					request.setAttribute("errorurl", objLo.getURL());
// ADD 2005/02/23 END Tsuboi
					return mapping.findForward("error");
				}
			} else {
				// 未登録なので新規登録する
				if (!objLo.insertLoExtend(strRegLoID, strRegBuyStatus, strLoSearchKeyWord[0], strLoSearchKeyWord[1], strLoSearchKeyWord[2], strLoSearchKeyWord[3], strLoSearchKeyWord[4])) {
					// LoExtendの登録の失敗
// ADD 2005/02/23 START Tsuboi [エラーURLを返却]						
					request.setAttribute("errorurl", objLo.getURL());
// ADD 2005/02/23 END Tsuboi
					return mapping.findForward("error");
				}
			}
// ADD 2005/02/13 END Katsuhiko Kagami(UNITEC) [LO購入項目追加]

//	ADD 2005/02/16 START MASUDA [属性追加対応]
			//LOM情報設定
			if ((strLomDetail != null) && !strLomDetail.trim().equals("")) {
				//改行変換
				for (int cnt = 0; cnt < strLomDetail.trim().length(); cnt ++) {
					strLomDetail = CommonFunction.replace(strLomDetail.trim(), "<br>", "\r\n");
				}
				Vector inDisoData = objLo.setLomDetailData(strLomDetail, strRegLoID);
				if (!objLo.updateLomData(inDisoData)) {
					// Lom更新の失敗
// ADD 2005/02/23 START Tsuboi [エラーURLを返却]						
					request.setAttribute("errorurl", objLo.getURL());
// ADD 2005/02/23 END Tsuboi
					return mapping.findForward("error");
				}
			}
//	ADD 2005/02/16 END MASUDA

			// 更新処理の実行
			if( !objLo.update() ) {
				// 更新がうまくいかなかった場合
				if( objLo.isErr() ) {
					// エラーの場合
					response.sendRedirect( objLo.getURL() );
				}
				else {
					String strMessage =  objLo.getMessage();
					String strWarURL = CommonFunction.getParamErrURL( strMessage, null, true );
					response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, true ) );
				}
			}

			//文字化け対応
			//strForeignID		= CommonFunction.encodeSJIS(strForeignID);
			//strKeyWord			= CommonFunction.encodeSJIS(strKeyWord);
			//strLoTytle			= CommonFunction.encodeSJIS(strLoTytle);
			//strLoExplanation	= CommonFunction.encodeSJIS(strLoExplanation);
			//strVersion			= CommonFunction.encodeSJIS(strVersion);
			//strMaterialID		= CommonFunction.encodeSJIS(strMaterialID);
			//完結要件
			//strConclusion		= CommonFunction.encodeSJIS(strConclusion);

			//strWinHeight		= CommonFunction.encodeSJIS(strWinHeight);
			//strWinWidth			= CommonFunction.encodeSJIS(strWinWidth);
			//strEntryDate		= CommonFunction.encodeSJIS(strEntryDate);
			//strEntryName		= CommonFunction.encodeSJIS(strEntryName);
			//strEntryID			= CommonFunction.encodeSJIS(strEntryID);
			//strLastDate			= CommonFunction.encodeSJIS(strLastDate);
			//strLastName			= CommonFunction.encodeSJIS(strLastName);
			//strLastID			= CommonFunction.encodeSJIS(strLastID);
			//strRenewCnt			= CommonFunction.encodeSJIS(strRenewCnt);
			//strPrere			= CommonFunction.encodeSJIS(strPrere);

//			 ADD 2005/02/13 START Katsuhiko Kagami(UNITEC) [LO購入項目追加]
			//strBuyStatus		= CommonFunction.encodeSJIS(strBuyStatus);
// ADD 2005/02/13 END Katsuhiko Kagami(UNITEC) [LO購入項目追加]
//	ADD 2005/02/16 START MASUDA [属性追加対応]
			//strLomDetail 		= CommonFunction.encodeSJIS(strLomDetail);
//	ADD 2005/02/16 END MASUDA
		}
		////////////////////////////////////////////////////////////////////////////
		// アクションフラグが設定されていない場合は更新情報を取得します
		// =========================================================================
		else {
			// LO情報をLOXMOより取得します。
			LoClient objLo = new LoClient();
			// 検索条件を設定
			objLo.setWhereLoID(strLoID);
			if( !objLo.select() ) {
				// 検索がうまくいかなかった場合
				if( objLo.isErr() ) {
					// エラーの場合
					response.sendRedirect( objLo.getURL() );
				}
				else {
					String strMessage =  objLo.getMessage();
					response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, true ) );
				}
			}

			////////////////////////////////////////////////////////////////////////
			// LOデータの取得
			// =====================================================================
			if( objLo.next() ) {
				strLoExplanation = objLo.getLoExplanation();
				strLoTytle = objLo.getLoTytle();
				strVersion = objLo.getLoVersion();
				strConclusion = objLo.getConclusion();
				strRealLOID = objLo.getRealLOID();
				strPrere = objLo.getPrere();
			}
			else {
				//LO名が存在しない場合エラーを出力する
				String strMessage =  resMsg.getMessage("M042010");
				response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, true ) );
			}
			// 検索条件を設定
			if( !objLo.selectHistory(strRealLOID) ) {
				// 検索がうまくいかなかった場合
				if( objLo.isErr() ) {
					// エラーの場合
					response.sendRedirect( objLo.getURL() );
				}
				else {
					String strMessage =  objLo.getMessage();
					response.sendRedirect( CommonFunction.getParamErrURL( strMessage, null, true ) );
				}
			}
			////////////////////////////////////////////////////////////////////////
			// LOHistoryデータの取得
			// =====================================================================
			HistoryData objHistory = (HistoryData)objLo.getHistory();
			strEntryDate	= objHistory.getEntryDate();
			strLastDate		= objHistory.getLastDate();
			strRenewCnt		= objHistory.getRenewCnt();
			strEntryID		= objHistory.getEntryLoginID();
			strEntryName	= objHistory.getEntryUserName();
			strLastID = objHistory.getLastLoginID();
			strLastName = objHistory.getLastUserName();
			////////////////////////////////////////////////////////////////////////
			// Loサーバ名を取得する
			Environment objEnv = new Environment();
			String strLoServerName = objEnv.getLoServerName();

			LoTopClient objLoTop = new LoTopClient( strLoServerName, strLoType );
			// 検索処理
			if( !objLoTop.getData(strRealLOID) ) {
				// 検索がうまくいかなかった場合
				MessageData objMessage = objLoTop.getMessageData();
				response.sendRedirect( objMessage.getURL() );
			}

			// 検索がうまくいった場合はデータを取得する
			int intLength = objLoTop.getDataLength();
			for( int i = 0; i < intLength; i++ ) {
				LoComData objData = objLoTop.getDataInfo(i);
				strMaterialID = objData.getMaterialID();
				strWinHeight = objData.getWinHeight();
				strWinWidth = objData.getWinWidth();
			}

			//文字化け対応
			//strForeignID = CommonFunction.encodeSJIS(strForeignID);
			//strKeyWord   = CommonFunction.encodeSJIS(strKeyWord);

		
//			 ADD 2005/02/13 START Katsuhiko Kagami(UNITEC) [LO購入項目追加]
			if (objLo.selectLoExtend(strLoID)) {
				// LoExtendがあれば取得する
				if (objLo.isExistLoExtend()) {
					// 購入ステータスの更新
					strBuyStatus = CommonFunction.null2blank(objLo.getLoExtendRecord().getBuy());
					//if( strBuyStatus != "" )
					//{
					//	strBuyStatus = CommonFunction.encodeSJIS(strBuyStatus);
					//}
				}
			}
//	 ADD 2005/02/13 END Katsuhiko Kagami(UNITEC) [LO購入項目追加]
//	 ADD 2005/02/14 START s-mori [推奨LO検索キーワード追加]
			if(objLo.getLoExtendRecord() != null){
				strLoSearchKeyWord[0] = CommonFunction.null2blank(objLo.getLoExtendRecord().getKeyword1());
				strLoSearchKeyWord[1] = CommonFunction.null2blank(objLo.getLoExtendRecord().getKeyword2());
				strLoSearchKeyWord[2] = CommonFunction.null2blank(objLo.getLoExtendRecord().getKeyword3());
				strLoSearchKeyWord[3] = CommonFunction.null2blank(objLo.getLoExtendRecord().getKeyword4());
				strLoSearchKeyWord[4] = CommonFunction.null2blank(objLo.getLoExtendRecord().getKeyword5());
			}else{
				for(int k = 0; k < NUM_LOSEARCH_KEYWORD_COUNT; k++){
					strLoSearchKeyWord[k] = "";
				}
			}
//	 ADD 2005/02/14 END
		}
		// =====================================================================
		// 登録情報
		if( strEntryID == null || strEntryID.equals("")) {
			strEntryID = resCnt.getMessage("OUTPUT_NULL_DATA");
		}
		if( strEntryName == null || strEntryName.equals("")) {
			strEntryName = resCnt.getMessage("OUTPUT_NULL_DATA");
		}
		// 登録についての表示する文字列を設定
		if ( strEntryName.equals( resCnt.getMessage("OUTPUT_NULL_DATA") ) == true ) {
			entryInfo = strEntryDate
				+ " " + HtmlEscape.escape(strEntryName)
				+ " / " + resCnt.getMessage("OUTPUT_NULL_DATA");
		}
		else {
			entryInfo = strEntryDate
				+ " " + HtmlEscape.escape(strEntryName)
				+ " / " + strEntryID;
		}
		// =====================================================================
		// 最終更新情報
		if( strLastID == null || strLastID.equals("")) {
			strLastID  = resCnt.getMessage("OUTPUT_NULL_DATA");
		}
		if( strLastName == null || strLastName.equals("")) {
			strLastName = resCnt.getMessage("OUTPUT_NULL_DATA");
		}
		// 最終更新についての表示する文字列を設定
		if(strLastName.equals( resCnt.getMessage("OUTPUT_NULL_DATA") ) == true ) {
			lastUpdateInfo = strLastDate
				+ " " + HtmlEscape.escape(strLastName)
				+ " / " + resCnt.getMessage("OUTPUT_NULL_DATA");
		}
		else {
			lastUpdateInfo = strLastDate
				+ " " + HtmlEscape.escape(strLastName)
				+ " / " + strLastID;
		}

		// 教材リストの取得
		Environment objEnv = new Environment();
		String strLoServerName = objEnv.getLoServerName();

		LoTopClient objLoTop = new LoTopClient(strLoServerName, strLoType);
		objLoTop.setValue( resCnt.getMessage("METHOD_TYPE"), resCnt.getMessage("METHOD_UPDATE") );
		objLoTop.setValue( resCnt.getMessage("MATERIAL_ID"), strMaterialID );
		Vector vecMaterialList = new Vector();
		if( objLoTop.getMaterialList() ) {
			for( int i = 0; i < objLoTop.getMaterialSize(); i++ ) {
				vecMaterialList.add( objLoTop.getMaterialData(i) );
			}
		}

		
		// 改行コード"\n"を"<br>"に置換
		String strShowPrere = "";
		if ( strPrere != null && !strPrere.equals( "" ) ) {
			strShowPrere = CommonFunction.replace( strPrere, "\n", "<br>" );
		}

//		 ADD 2005/02/23 START Tsuboi [strLoSearchKeyWordをVectorに挿入]
		Vector vecLoSearchKeyWordList = new Vector();		
		for(int k = 0; k < NUM_LOSEARCH_KEYWORD_COUNT; k++){
			vecLoSearchKeyWordList.add(strLoSearchKeyWord[k]) ;
		}
//		 ADD 2005/02/23 END Tsuboi

		ScormLoEnv objLoEnv = new ScormLoEnv();
		
		request.setAttribute("strLoID", strLoID);
		request.setAttribute("strReturnURL", strReturnURL);
		request.setAttribute("strAction", strAction);
		request.setAttribute("strLoType", strLoType);
		request.setAttribute("strConclusion", strConclusion);
		request.setAttribute("strEntryDate", strEntryDate);
		request.setAttribute("strEntryName", strEntryName);
		request.setAttribute("strEntryID", strEntryID);
		request.setAttribute("strLastDate", strLastDate);
		request.setAttribute("strLastName", strLastName);
		request.setAttribute("strLastID", strLastID);
		request.setAttribute("strRenewCnt", strRenewCnt);
		request.setAttribute("strPrere", strPrere);
		request.setAttribute("strLoTytle", strLoTytle);
		request.setAttribute("strForeignID", strForeignID);
		request.setAttribute("vecMaterialList", vecMaterialList);
		request.setAttribute("strKeyWord", strKeyWord);
		request.setAttribute("strLoExplanation", strLoExplanation);
		request.setAttribute("strVersion", strVersion);
		request.setAttribute("entryInfo", entryInfo);
		request.setAttribute("lastUpdateInfo", lastUpdateInfo);
		request.setAttribute("strRenewCnt", strRenewCnt);
		request.setAttribute("strShowPrere", strShowPrere);
		request.setAttribute("objLoEnv", objLoEnv);
		request.setAttribute("strMaterialID", strMaterialID);
		request.setAttribute("strWinHeight", strWinHeight);
		request.setAttribute("strWinWidth", strWinWidth);
//		 ADD 2005/02/23 START Tsuboi [購入フラグ、LO詳細の為のパラメータ、推奨LO検索キーワードの引渡] 他
		request.setAttribute("LOEXTEND_REQUIRE_BUY", LoExtendTable.LOEXTEND_REQUIRE_BUY);
		request.setAttribute("LOEXTEND_NOREQUIRE_BUY", LoExtendTable.LOEXTEND_NOREQUIRE_BUY);
		request.setAttribute("strBuyStatus", strBuyStatus);
		request.setAttribute("strLomDetail", strLomDetail);
		request.setAttribute("vecLoSearchKeyWordList", vecLoSearchKeyWordList);
// ADD 2005/02/23 END

//		 セッションに入っているLOM属性をクリアする。
		request.getSession().setAttribute("sesLomDetail" , "");  

		return mapping.findForward("success");
	}
}
