/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

// 
//	機能名称	
//		GetParam用のクラス.
//
//		変更履歴	
//			2003.12.01 gxl 新規作成
//

package jp.co.ntt.lms.lo.scorm.cbtcom;

/**
 * GetParam用のクラス. <br>
 * @author gxl
 */
public class MaintenanceGetParam implements IMaintenanceGetParam {
	
	/**  
	 * データモデル区分
	 */
	private String modal = null;
	
	/**
	 * MaintenanceGetParamクラスのコンストラクタ。<br>
	 * @param inModal String データモデル
	 */
	public MaintenanceGetParam(String inModal) {
		modal = inModal;
	}
	
	/**			
	 * GetParam用のメソッド<br>
	 * @param element CMIElement エレメント
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	public int getParam(CMIElement element, StringBuffer outstr) {
		// getElementメソッドの戻り値
		if ("getElement".equals(modal)) {
			return getElement(element,outstr);
		}
		// getLesson メソッドの戻り値
		if ("getLesson".equals(modal)) {
			return getLesson(element,outstr);
		}
		// getEntryメソッドの戻り値
		if ("getEntry".equals(modal)) {
			return getEntry(element,outstr);
		}
		// getScoreメソッドの戻り値
		if ("getScore".equals(modal)) {
			return getScore(element,outstr);
		}
		// getCoreGroupメソッドの戻り値
		if ("getCoreGroup".equals(modal)) {
			return getCoreGroup(element,outstr);
		}
		// getCoreLessonGroupメソッドの戻り値
		if ("getCoreLessonGroup".equals(modal)) {
			return getCoreLessonGroup(element,outstr);
		}
		// getCoreVendorGroupメソッドの戻り値
		if ("getCoreVendorGroup".equals(modal)) {
			return getCoreVendorGroup(element,outstr);
		}
		// getCommentsGroupメソッドの戻り値
		if ("getCommentsGroup".equals(modal)) {
			return getCommentsGroup(element,outstr);
		}
		// getObjectivesStatusGroupメソッドの戻り値
		if ("getObjectivesStatusGroup".equals(modal)) {
			return getObjectivesStatusGroup(element,outstr);
		}
		// getStudentDataGroupメソッドの戻り値
		if ("getStudentDataGroup".equals(modal)) {
			return getStudentDataGroup(element,outstr);
		}
		// getStudentDemographicsGroupメソッドの戻り値
		if ("getStudentDemographicsGroup".equals(modal)) {
			return getStudentDemographicsGroup(element,outstr);
		}
		// getGroupメソッドの戻り値
		if ("getGroup".equals(modal)) {
			return getGroup(element,outstr);
		}
		// getEvaluationGroupメソッドの戻り値
		if ("getEvaluationGroup".equals(modal)) {
			return getEvaluationGroup(element,outstr);
		}
		// getStudentPreferencesGroupメソッドの戻り値
		if ("getStudentPreferencesGroup".equals(modal)) {
			return getStudentPreferencesGroup(element,outstr);
		}
			 
		return HACPError.HACP_ERR_SUCCESSFUL;
	}

	/**
	 * getElement処理。<br>
	 * @param element CMIElement エレメント
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	private int getElement(CMIElement element, StringBuffer outstr) {
		
		String strKeyWord = element.getKeyWord();
		
		String strLocalValue = element.localGetValue(element.getName(), false);
		
		outstr.append( strKeyWord );
		
		outstr.append("=");
		
		outstr.append(strLocalValue);
		
		outstr.append(CMIElement.STR_CRLF);
		
		return HACPError.HACP_ERR_SUCCESSFUL;
	}
	
	/**
	 * getLesson処理。<br>
	 * @param element CMIElement エレメント
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	private int getLesson(CMIElement element, StringBuffer outstr) {
		return HACPError.HACP_ERR_SUCCESSFUL;
	}

	/**
	 * getEntry処理。<br>
	 * @param element CMIElement エレメント
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	private int getEntry(CMIElement element, StringBuffer outstr) {
		return HACPError.HACP_ERR_SUCCESSFUL;
	}

	/**
	 * getScore処理。<br>
	 * @param element CMIElement エレメント
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	private int getScore(CMIElement element, StringBuffer outstr) {
		return HACPError.HACP_ERR_SUCCESSFUL;
	}

	/**
	 * Core グループの getParam処理。<br>
	 * @param element CMIElement エレメント
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	private int getCoreGroup(CMIElement element, StringBuffer outstr) {
		CMINode node = null;
		if ( ( element ) instanceof CMINode ) {
			node = (CMINode)element;
		}

		CMIElement	child = null;
		String strSubPath = null;
		String strPath = null;
		String strValue = null;
		String strLocalValue = null;

		// CBTバージョンの取得
		boolean blnCbtV3 = element.isV3Above();
		// AICCバージョンが3.0未満の場合は、レッスン値を取得するように修正
		// （使用メソッドが異なる）
		if ( node != null ) {
			outstr.append("[");
			outstr.append(node.getKeyWord());
			outstr.append("]");
			outstr.append(CMIElement.STR_CRLF);

			// Student_ID
			strSubPath = "student_id";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				if (CMIS13ModelUtil.isScorm13() == true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					strValue = CMIUtil.urlEncode(strValue);
				}
			}

			outstr.append("Student_ID");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Studnet_Name
			strSubPath = "student_name";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				if (CMIS13ModelUtil.isScorm13() == true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					strValue = CMIUtil.urlEncode(strValue);
				}
			}
			outstr.append("Student_Name");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Lesson_Location
			strSubPath = "lesson_location";
			child = node.getChild(strSubPath);
			strLocalValue = child.getLocalValue();
			
			if ( strLocalValue == null ) {
				//strValue = "";
			} else {
				strValue = strLocalValue;
				if (CMIS13ModelUtil.isScorm13() == true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					strValue = CMIUtil.urlEncode(strValue);
				}
				outstr.append("Lesson_Location");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
			}

			//cmi.completion_threshold
			strSubPath = "completion_threshold";
			child = node.getChild(strSubPath);
			
			strLocalValue = child.getLocalValue();

			if ( strLocalValue == null ) {
				// 何もしない
			}else{
				strValue = strLocalValue;
				if (CMIS13ModelUtil.isScorm13() == true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					strValue = CMIUtil.urlEncode(strValue);
				}
				outstr.append("Completion_Threshold");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);	
			}

			//	cmi.progress_measure
			strSubPath = "progress_measure";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				// 何もしない
			}else{
				strValue = strLocalValue;
				if (CMIS13ModelUtil.isScorm13() == true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					strValue = CMIUtil.urlEncode(strValue);
				}
				outstr.append("Progress_Measure");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);	
			}

			// Credit
			strSubPath = "credit";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				if (CMIS13ModelUtil.isScorm13() == true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					strValue = CMIUtil.urlEncode(strValue);
				}
			}
			outstr.append("Credit");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Lesson_Mode
			strSubPath = "lesson_mode";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				if (CMIS13ModelUtil.isScorm13() == true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					strValue = CMIUtil.urlEncode(strValue);
				}
			}
			outstr.append("Lesson_Mode");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

		// SCORM1.3形式のステータスデータ値を AICC2.x形式のデータ値に変換する
			String strSuccessStatus = null;
			String strCompStatus = null;
			// Lesson_Status
			strSubPath = "lesson_status";
			child = node.getChild(strSubPath);
//			strLocalValue = child.localGetValue(strSubPath);
			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strSuccessStatus = "";
			} else {
				strSuccessStatus = strLocalValue;
			}

			strSubPath = "completion_status";
			child = node.getChild(strSubPath);
//			strLocalValue = child.localGetValue(strSubPath);
			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strCompStatus = "";
			} else {
				strCompStatus = strLocalValue;
			}
			if (CMIS13ModelUtil.isScorm13() == true) {
				// クライアントからのSCORM1.3形式での受信要求である場合
				strValue = strSuccessStatus + "," + strCompStatus;
				strValue = CMIUtil.urlEncode(strValue);
			}
			else {
				// クライアントからのAICC2.x形式での受信要求である場合
				try {
					// SCORM1.3形式で保持しているデータをAICC形式に変換する
					strValue = CMIS13ModelUtil.parseAiccStatus(strSuccessStatus,strCompStatus);
				}
				catch( S13LogFormatException ex) {
					element.setError(CMIError.ERR_INCORRECT_DATA_TYPE);
					element.setVendorError("SCORM 1.3 Format Error[" + strSubPath + "]");
				}
			}
			outstr.append("Lesson_Status");
			outstr.append("=");
			outstr.append(strValue);

			strSubPath = "entry";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = "," + strLocalValue;
				if (CMIS13ModelUtil.isScorm13() == true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					strValue = CMIUtil.urlEncode(strValue);
				}
			}
			outstr.append(strValue).append(CMIElement.STR_CRLF);

			// Score
			strSubPath = "score";
			child = node.getChild(strSubPath);
			String str_score = "";
			str_score = CMIUtil.getScoreValue(child);
			if (str_score == null) {
				strValue = "";
			} else {
				strValue = str_score;
				if (CMIS13ModelUtil.isScorm13() == true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					strValue = CMIUtil.urlEncode(strValue);
				}
			}

			outstr.append("Score");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Time
			strSubPath = "total_time";
			child = node.getChild(strSubPath);

			strLocalValue = child.localGetValue(strSubPath);
			if (strLocalValue == null) {
				if (CMIS13ModelUtil.isScorm13() != true) {
					strValue = "0000:00:00.0";
				}
				else {
					strValue = "";
				}
			} else {
				if (CMIS13ModelUtil.isScorm13() != true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					try {
						strLocalValue = 
							CMIS13ModelUtil.parseAiccTimespan(strLocalValue);
					}
					catch( S13LogFormatException ex) {
						element.setError(CMIError.ERR_INCORRECT_DATA_TYPE);
						element.setVendorError("SCORM 1.3 Format Error[" + strSubPath + "]");
					}
					// CBTバージョンをチェックし、
					// バージョンがAICC 2.0の場合、Time の 小数点以下を削除する。
					if (blnCbtV3) {
						strValue = strLocalValue;
					} else {
						int index = strLocalValue.indexOf(".");
						if (index != -1) {
							strValue = strLocalValue.substring(0, index);
						}
						else {
							strValue = strLocalValue;
						}
					}
				}
				else {
					strValue = strLocalValue;
					strValue = CMIUtil.urlEncode(strValue);
				}
			}
			outstr.append("Time");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			if (CMIS13ModelUtil.isScorm13() != true) {
				// クライアントからのAICC2.x形式での受信要求である場合

				// Lesson_ID
				strSubPath = "lesson_id";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Lesson_ID");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
			}
		}
		return HACPError.HACP_ERR_SUCCESSFUL;
	}
	
	/**						
 	* Core_Lesson グループの getParam処理<br>					
	* @param elementエレメント					
	* @param outstr返却の結果					
 	* @return int エラーコード					
 	*/					
	private int getCoreLessonGroup(CMIElement element, StringBuffer outstr) {

		String strSubPath = null;
		String strPath = null;
		String strValue = null;
		String strLocalValue = null;
		
		outstr.append("[");
		outstr.append(element.getKeyWord());
		outstr.append("]");
		outstr.append(CMIElement.STR_CRLF);

		strLocalValue = element.getLocalValue();
		if ( strLocalValue == null ) {
			strValue = "";
		} else {
			if (CMIS13ModelUtil.isScorm13() != true) {
				// クライアントからのAICC2.x形式での受信要求である場合
				strValue = strLocalValue;
			}
			else {
				// クライアントからのSCORM1.3形式での受信要求である場合
				strValue = CMIUtil.urlEncode(strLocalValue);
			}
		}
		outstr.append(strValue);
		outstr.append(CMIElement.STR_CRLF);
		return HACPError.HACP_ERR_SUCCESSFUL;
	}

	/**			
 	* Core_Vendor グループの getParam処理<br>		
	* @param elementエレメント		
	* @param outstr返却の結果		
 	* @return int エラーコード		
 	*/
	private int getCoreVendorGroup(CMIElement element, StringBuffer outstr) {

		String strSubpath = null;
		String strPath = null;
		String strValue = null;
		String strLocalValue = null;

		outstr.append("[");
		outstr.append(element.getKeyWord());
		outstr.append("]");
		outstr.append(CMIElement.STR_CRLF);

		strLocalValue = element.getLocalValue();
		if (strLocalValue == null) {
			strValue = "";
		} else {
			if (CMIS13ModelUtil.isScorm13() != true) {
				// クライアントからのAICC2.x形式での受信要求である場合
				strValue = strLocalValue;
			}
			else {
				// クライアントからのSCORM1.3形式での受信要求である場合
				strValue = CMIUtil.urlEncode(strLocalValue);
			}
		}
		outstr.append(strValue);
		outstr.append(CMIElement.STR_CRLF);
		return HACPError.HACP_ERR_SUCCESSFUL;
	}

	/**				
 	* Comments グループの getParam処理<br>			
	* @param elementエレメント			
	* @param outstr返却の結果			
 	* @return int エラーコード			
 	*/			
	private int getCommentsGroup(CMIElement element, StringBuffer outstr) {

		if (CMIS13ModelUtil.isScorm13() != true) {
			// クライアントからのAICC2.x形式での受信要求である場合
			String strSubPath = null;
			String strPath = null;
			String strValue = null;
			String strLocalValue = null;
	
			outstr.append("[");
			outstr.append(element.getKeyWord());
			outstr.append("]");
			outstr.append(CMIElement.STR_CRLF);
	
			strLocalValue = element.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);
		}
		return HACPError.HACP_ERR_SUCCESSFUL;
	}
	
	/**
	 * Evaluation グループの getParam処理<br>
	 * @param elementエレメント
	 * @param outstr返却の結果
	 * @return int エラーコード
	 */			
	private int getEvaluationGroup(CMIElement element, StringBuffer outstr) {

		CMINode node = null;
		if ( (element) instanceof CMINode ) {
			node = (CMINode)element;
		}
		CMIElement	child = null;
		String strSubPath = null;
		String strPath = null;
		String strValue = null;
		String strLocalValue = null;

		if (node != null) {
			outstr.append("[");
			outstr.append(node.getKeyWord());
			outstr.append("]");
			outstr.append(CMIElement.STR_CRLF);

			if (CMIS13ModelUtil.isScorm13() != true) {
				// Course_ID
				strSubPath = "course_id";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				} else {
					strValue = strLocalValue;
					if (CMIS13ModelUtil.isScorm13() == true) {
						// クライアントからのAICC2.x形式での受信要求である場合
						strValue = CMIUtil.urlEncode(strValue);
					}
				}
				outstr.append("Course_ID");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
			}

			// Comments_File
			strSubPath = "comments";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				if (CMIS13ModelUtil.isScorm13() == true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					strValue = CMIUtil.urlEncode(strValue);
				}
			}
			outstr.append("Comments_File");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Interactions_File
			strSubPath = "interactions";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				if (CMIS13ModelUtil.isScorm13() == true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					strValue = CMIUtil.urlEncode(strValue);
				}
			}
			outstr.append("Interactions_File");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Objectives_Status_File
			strSubPath = "objectives_status";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				if (CMIS13ModelUtil.isScorm13() == true) {
					// クライアントからのAICC2.x形式での受信要求である場合
					strValue = CMIUtil.urlEncode(strValue);
				}
			}
			outstr.append("Objectives_Status_File");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			if (CMIS13ModelUtil.isScorm13() != true) {
				// クライアントからのAICC2.x形式での受信要求である場合

				// Path_File
				strSubPath = "path";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Path_File");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
			}
		}
		return HACPError.HACP_ERR_SUCCESSFUL;
	}
	
	/**						
	 * Objectives_Status グループの getParam処理<br>
	 * @param element CMIElement データモデルオブジェクト
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */					
	private int getObjectivesStatusGroup(CMIElement element, StringBuffer outstr) {

		int intErrCode = HACPError.HACP_ERR_SUCCESSFUL;
		if (CMIS13ModelUtil.isScorm13() != true) {
			// クライアントからのAICC2.x形式での受信要求である場合
			intErrCode = getObjectivesStatusGroupForAICC(element, outstr);
		}
		else {
			// クライアントからのSCORM1.3形式での受信要求である場合
			intErrCode = getObjectivesStatusGroupForSCORM(element, outstr);
		}	
		return intErrCode;
	}

	/**
	 * Objectives_Status グループの情報をAICC2.x用のGetParamコマンド
	 * （HACP通信）形式で取得する。<br>
	 * @param element CMIElement データモデルオブジェクト
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	private int getObjectivesStatusGroupForAICC(CMIElement element, StringBuffer outstr) {
		
		int intErrCode = HACPError.HACP_ERR_SUCCESSFUL;
		CMINode node = null;
		if ( (element) instanceof CMINode ) {
			node = (CMINode)element;
		}
		CMIElement	child = null;
		String strSubPath = null;
		String strPath = null;
		String strValue = null;
		String strLocalValue = null;

		// CBTバージョンの取得
		int intVersion = element.getVersion();

		if ( node != null ) {
			/// グループデータ
			outstr.append("[");
			outstr.append(node.getKeyWord());
			outstr.append("]");
			outstr.append(CMIElement.STR_CRLF);

			int intCount = node.getChildCount();
			for ( int i = 0; i < intCount; i++ ) {
				CMINode	child_n = (CMINode)node.getChild(i);
				// n  
				String str_n = child_n.getName();	

				// J_ID.n	n.id
				strSubPath = "id";
				child = child_n.getChild(strSubPath);

				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				}else{
					strValue = strLocalValue;
				}
				outstr.append("J_ID.");
				outstr.append(String.valueOf(i+1));
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);

				// バージョン情報により、処理を分岐する
				
				// バージョン情報が3.5以降の場合には、n.score. raw, max, minをGetParamする
				if ( intVersion >= 3500 ) {
					// score.raw の値取得
					strSubPath = "score.raw";
					strValue = "";

					strLocalValue = child_n.getLocalValue(strSubPath);

					if ( strLocalValue != null ) {
						strValue += strLocalValue;
						strValue += ",";
					}
					// J_Score が空であれば、GetParamデータに出力しない。
					if ( !"".equals(strValue) ) {
						// score.max の値取得
						strSubPath = "score.max";
						strLocalValue = child_n.getLocalValue(strSubPath);
						if ( strLocalValue != null ) {
							strValue += strLocalValue;
							strValue += ",";
						}

						// score.min の値取得
						strSubPath = "score.min";
						strLocalValue = child_n.getLocalValue(strSubPath);
						if ( strLocalValue != null ) {
							strValue += strLocalValue;
						}

						if ( strValue.endsWith(",") ) {
							strValue = strValue.substring( 0, strValue.length() - 1 );
						}

						// J_Score	 n.score.[raw,max,min]
						outstr.append("J_Score.");
						outstr.append( String.valueOf( i + 1 ) );
						outstr.append("=");
						outstr.append(strValue);
						outstr.append(CMIElement.STR_CRLF);
					}

					// n.status の処理
					strSubPath = "status";
					child = child_n.getChild(strSubPath);

					strLocalValue = child.getLocalValue();
					if ( strLocalValue == null ) {
						strValue = "";
					} else {
						strValue = strLocalValue;
					}
					
					// J_Status が空であれば、GetParamデータに出力しない。
					if ( !"".equals(strValue) ) {
						// J_Status
						outstr.append("J_Status.");
						outstr.append(String.valueOf(i+1));
						outstr.append("=");
						outstr.append(strValue);
						outstr.append(CMIElement.STR_CRLF);
					}
				} else {
				// バージョンが3.5以前の場合
				
				// AICCバージョン3.5未満時の、複数スコア対応のための改修
				// このあたりでAICCバージョンが3.5未満の際のスコアのメモリからの取得処理を行っている
				// よって、ここに複数スコアがあったときの取得処理を書く
					boolean blnCbtV3 = element.isV3Above();
					String strSeparate = null;
					if ( blnCbtV3 ) {	
						// CBTバージョンが「3.0」、「3.0.1」、「3.0.2」の場合
						// スコア間の区切り文字をセミコロン「;」にする
						strSeparate = ";";
					} else {
						// CBTバージョンが「2.0」、「2.1」、「2.2」の場合
						// スコア間の区切り文字をカンマ「,」にする
						strSeparate = ",";
					}

					// J_Score.n	n.attempts.n.score
					strSubPath = "attempts";
					CMINode	attempts = (CMINode)child_n.getChild(strSubPath);

					// attempts配下の設定件数を取得する
					//出力用に連結したスコアを保存するために使用
					String strVal_score = null;
					//一時的にscoreを格納するために使用
					String strTemp_val_score = null;
					//メモリ中のscoreの数を取得
					int intCount_2 = attempts.getChildCount();
					for ( int j = 0; j < intCount_2; j++) {
						// インデックス0から順に子(attempts.n)の項目を取得する
						CMINode	child_n2 = (CMINode)attempts.getChild(j);
					
						strSubPath = "score";
						CMINode	scores = (CMINode)child_n2.getChild(strSubPath);

						// score（AICC Ver 3.xならraw,max,min、AICC Ver2.xならraw）を取得する
						if ( blnCbtV3 ) {						
							//AICC Ver3.xの時
							strTemp_val_score = CMIUtil.getScoreValue(scores);
						} else {
							//AICC Ver2.xの時
							strPath = strSubPath + ".raw";
							//scoreを取得する
							strLocalValue = scores.localGetValue(strPath);
							if ( strLocalValue != null ) {
								strTemp_val_score = strLocalValue;
							} else {
								strTemp_val_score = "";
							}
						}
						if ( strVal_score == null ) {
							// 1つ目のscoreなので、素直に代入する
							strVal_score = strTemp_val_score;
						} else {
							//２つ目以降なので連結する
							strVal_score = strVal_score + strSeparate + strTemp_val_score;
						}
					}
					// J_Score が空であれば、GetParamデータに出力しない。
					if ( !"".equals(strVal_score) ) {
						// J_Score.n   n.attempts.n.scores.[raw,max,min]
						outstr.append("J_Score.");
						outstr.append( String.valueOf( i + 1 ) );
						outstr.append("=");
						outstr.append(strVal_score);
						outstr.append(CMIElement.STR_CRLF);
					}

					//attempts以下に要素が無ければ、statusをとりに行かない。
					if ( intCount_2 > 0 ) {
						String strVal_status = null;
						strSubPath = "status";
						CMINode	child_n2 = (CMINode)attempts.getChild(0);
						CMIElement child_status = child_n2.getChild(strSubPath);
						//child_statusがNULLならば、statusが無いので、取得処理をしない
						if ( child_status != null ) {
						
							//nodeから、ステータスを取得
							strLocalValue = child_status.localGetValue(strSubPath);
							if ( strLocalValue != null ) {
								strVal_status = strLocalValue;
							} else {
								strVal_status = "";
							}
							// J_Status が空であれば、GetParamデータに出力しない。
							if (!"".equals(strVal_status)) {
								outstr.append("J_Status.");
								outstr.append(String.valueOf( i + 1 ) );
								outstr.append("=");
								outstr.append( strVal_status );
								outstr.append(CMIElement.STR_CRLF);
							}
						}//if(child_status != NULL)のend
					}//if(nCount_2 > 0)のend
				} // バージョンによる分岐ここまで
			}
		}
		return intErrCode;
	}

	/**
	 * Objectives_Status グループの情報をAICC2.x用のGetParamコマンド
	 * （HACP通信）形式で取得する。<br>
	 * @param element CMIElement データモデルオブジェクト
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	private int getObjectivesStatusGroupForSCORM(CMIElement element, StringBuffer outstr) {
		
		int intErrCode = HACPError.HACP_ERR_SUCCESSFUL;
		CMINode node = null;
		if ( (element) instanceof CMINode ) {
			node = (CMINode)element;
		}
		CMIElement	child = null;
		String strSubPath = null;
		String strPath = null;
		String strValue = null;
		String strLocalValue = null;

		// CBTバージョンの取得
		int intVersion = element.getVersion();

		if ( node != null ) {
			/// グループデータ
			outstr.append("[");
			outstr.append(node.getKeyWord());
			outstr.append("]");
			outstr.append(CMIElement.STR_CRLF);

			int intCount = node.getChildCount();
			for ( int i = 0; i < intCount; i++ ) {
				CMINode	child_n = (CMINode)node.getChild(i);
				// n  
				String str_n = child_n.getName();	

				// J_ID.n	n.id
				strSubPath = "id";
				child = child_n.getChild(strSubPath);

				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				}else{
					strValue = strLocalValue;
					strValue = CMIUtil.urlEncode(strValue);
				}
				outstr.append("J_ID.");
				outstr.append(String.valueOf(i+1));
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);

				String str_scaled = "";
				String str_raw = "";
				String str_max = "";
				String str_min = "";
				// score.scaled の値取得
				strSubPath = "score.scaled";
				strValue = "";

				strLocalValue = child_n.getLocalValue(strSubPath);

				if ( strLocalValue != null ) {
					str_scaled += strLocalValue;
				}

				// score.raw の値取得
				strSubPath = "score.raw";
				strLocalValue = child_n.getLocalValue(strSubPath);

				if ( strLocalValue != null ) {
					str_raw += strLocalValue;
				}

				// J_Score が空であれば、GetParamデータに出力しない。
				if ( !"".equals(str_scaled) || !"".equals(str_raw) ) {
					// score.max の値取得
					strSubPath = "score.max";
					strLocalValue = child_n.getLocalValue(strSubPath);
					if ( strLocalValue != null ) {
						str_max += strLocalValue;
					}

					// score.min の値取得
					strSubPath = "score.min";
					strLocalValue = child_n.getLocalValue(strSubPath);
					if ( strLocalValue != null ) {
						str_min += strLocalValue;
					}

					strValue = str_scaled + "," + str_raw + "," + str_max + "," + str_min;
					if ( strValue.endsWith(",") ) {
						strValue = strValue.substring( 0, strValue.length() - 1 );
					}

					strValue = CMIUtil.urlEncode(strValue);
					// J_Score	 n.score.[raw,max,min]
					
					outstr.append("J_Score.");
					outstr.append( String.valueOf( i + 1 ) );
					outstr.append("=");
					outstr.append(strValue);
					outstr.append(CMIElement.STR_CRLF);
				}

				// n.status の処理
				strSubPath = "status";
				child = child_n.getChild(strSubPath);

				strLocalValue = child.getLocalValue();
				if ( strLocalValue == null ) {
					strValue = "";
				} else {
					strValue = strLocalValue;
					strValue += ",";
				}
				// n.completion_status の処理
				strSubPath = "completion_status";
				child = child_n.getChild(strSubPath);

				strLocalValue = child.getLocalValue();
				if ( strLocalValue == null ) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}

				// J_Status が空であれば、GetParamデータに出力しない。
				if ( !"".equals(strValue) ) {
					strValue = CMIUtil.urlEncode(strValue);
					// J_Status
					outstr.append("J_Status.");
					outstr.append(String.valueOf(i+1));
					outstr.append("=");
					outstr.append(strValue);
					outstr.append(CMIElement.STR_CRLF);
				}
			}
		}
		return intErrCode;
	}

	/**
	 * Student_Data グループの getParam処理<br>
	 * @param element CMIElement データモデルオブジェクト
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	private int getStudentDataGroup(CMIElement element, StringBuffer outstr) {

		int intErrCode = HACPError.HACP_ERR_SUCCESSFUL;
		if (CMIS13ModelUtil.isScorm13() != true) {
			// クライアントからのAICC2.x形式での受信要求である場合
			intErrCode = getStudentDataGroupForAICC(element, outstr);
		}
		else {
			// クライアントからのSCORM1.3形式での受信要求である場合
			intErrCode = getStudentDataGroupForSCORM(element, outstr);
		}	
		return intErrCode;
	}

	/**
	 * Student_Data グループの情報をAICC2.x用のGetParamコマンド
	 * （HACP通信）形式で取得する。<br>
	 * @param element CMIElement データモデルオブジェクト
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	private int getStudentDataGroupForAICC(CMIElement element, StringBuffer outstr) {

		CMINode node = null;
		if ( (element) instanceof CMINode ) {
			node = (CMINode)element;
		}
		CMIElement	child = null;
		String strSubPath = null;
		String strPath = null;
		String strValue = null;
		String strLocalValue = null;

		if ( node != null ) {
			outstr.append("[");
			outstr.append(node.getKeyWord());
			outstr.append("]");
			outstr.append(CMIElement.STR_CRLF);

			// Attempt_Number
			strSubPath = "attempt_number";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Attempt_Number");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Mastery_Score
			strSubPath = "mastery_score";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Mastery_Score");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Max_Time_Allowed
			strSubPath = "max_time_allowed";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Max_Time_Allowed");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Time_Limit_Action
			strSubPath = "time_limit_action";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Time_Limit_Action");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// attempt_records
			strSubPath = "attempt_records";
			CMINode child_attempt = (CMINode)node.getChild(strSubPath);
			int intCount = child_attempt.getChildCount();
			for ( int i = 0; i < intCount; i++ ) {
				int intCount_2;
				CMINode	child_n = (CMINode)child_attempt.getChild(i);
				// n 
				String str_n = child_n.getName();	 

				// n.lesson_statuses.n の最大の n を使用する。
				strSubPath = "lesson_statuses";
				CMINode statusNode = (CMINode)child_n.getNChild(strSubPath);
				intCount_2 = statusNode.getChildCount();
				if ( intCount_2 > 0 ) {
					CMIElement	child_n2 = statusNode.getChild(intCount_2-1);

					strLocalValue = child_n2.getLocalValue();
					if ( strLocalValue == null ) {
						strValue = "";
					} else {
						strValue = strLocalValue;
					}
					outstr.append("Lesson_Status.");
					outstr.append(String.valueOf(i+1));
					outstr.append("=");
					outstr.append(strValue);
					outstr.append(CMIElement.STR_CRLF);
				}
				// Score
				// n.lesson_scores.n の最大の n を使用する。
				strSubPath = "lesson_scores";
				CMINode scoresNode = (CMINode)child_n.getNChild(strSubPath);
				intCount_2 = scoresNode.getChildCount();
				if (intCount_2 > 0) {
					CMIElement	child_n2 = scoresNode.getChild(intCount_2-1);
					String str_score = CMIUtil.getScoreValue(child_n2);
					outstr.append("Score.");
					outstr.append( String.valueOf( i + 1 ) );
					outstr.append("=");
					outstr.append(str_score);
					outstr.append(CMIElement.STR_CRLF);
				}
			}
		}
		return HACPError.HACP_ERR_SUCCESSFUL;
	}

	/**
	 * Student_Data グループの情報をSCORM1.3用のGetParamコマンド
	 * （HACP通信）形式で取得する。<br>
	 * @param elementエレメント
	 * @param outstr返却の結果
	 * @return int エラーコード
	 */
	private int getStudentDataGroupForSCORM(CMIElement element, StringBuffer outstr) {

		CMINode node = null;
		if ( (element) instanceof CMINode ) {
			node = (CMINode)element;
		}
		CMIElement	child = null;
		String strSubPath = null;
		String strPath = null;
		String strValue = null;
		String strLocalValue = null;

		if ( node != null ) {
			outstr.append("[");
			outstr.append(node.getKeyWord());
			outstr.append("]");
			outstr.append(CMIElement.STR_CRLF);

			// Mastery_Score
			strSubPath = "mastery_score";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				strValue = CMIUtil.urlEncode(strValue);
			}
			outstr.append("Mastery_Score");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Max_Time_Allowed
			strSubPath = "max_time_allowed";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				strValue = CMIUtil.urlEncode(strValue);
			}
			outstr.append("Max_Time_Allowed");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Time_Limit_Action
			strSubPath = "time_limit_action";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				strValue = CMIUtil.urlEncode(strValue);
			}
			outstr.append("Time_Limit_Action");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

		}
		return HACPError.HACP_ERR_SUCCESSFUL;
	}
	
	/**							
 	* Student_Demographics グループの getParam処理<br>						
	* @param elementエレメント						
	* @param outstr返却の結果						
 	* @return int エラーコード						
 	*/						
	private int getStudentDemographicsGroup(CMIElement element, StringBuffer outstr) {
		
		int intErrCode = HACPError.HACP_ERR_SUCCESSFUL;
		if (CMIS13ModelUtil.isScorm13() != true) {
			// クライアントからのAICC2.x形式での受信要求である場合
			CMINode node = null;
			if ( (element ) instanceof CMINode ){
				node = (CMINode)element;
			}
			CMIElement	child = null;
			String strSubPath = null;
			String strPath = null;
			String strValue = null;
			String strLocalValue = null;
	
			if (node != null) {
				outstr.append("[");
				outstr.append(node.getKeyWord());
				outstr.append("]");
				outstr.append(CMIElement.STR_CRLF);
	
				// City
				strSubPath = "city";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if ( strLocalValue == null ) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("City");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
	
				// Class
				strSubPath = "class";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Class");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
	
				// Company
				strSubPath = "company";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if ( strLocalValue == null ) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Company");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
	
				// Country
				strSubPath = "country";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Country");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
	
				// Experience
				strSubPath = "experience";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Experience");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
	
				// Familiar_Name
				strSubPath = "familiar_name";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Familiar_Name");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
	
				// Instructor_Name
				strSubPath = "instructor_name";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if ( strLocalValue == null ) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Instructor_Name");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
	
				// Job_Title
				strSubPath = "title";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Job_Title");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
	
				// Native_Language
				strSubPath = "native_language";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if ( strLocalValue == null ) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Native_Language");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
	
				// State
				strSubPath = "state";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("State");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
	
				// Street_Address
				strSubPath = "street_address";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Street_Address");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
	
				// Telephone
				strSubPath = "telephone";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if (strLocalValue == null) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Telephone");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
	
				// Years_Experience
				strSubPath = "years_experience";
				child = node.getChild(strSubPath);
	
				strLocalValue = child.getLocalValue();
				if ( strLocalValue == null ) {
					strValue = "";
				} else {
					strValue = strLocalValue;
				}
				outstr.append("Years_Experience");
				outstr.append("=");
				outstr.append(strValue);
				outstr.append(CMIElement.STR_CRLF);
			}
		}
		return intErrCode;
	}
	
	/**
 	* Student_Preferences グループの getParam処理<br>
	* @param elementエレメント
	* @param outstr返却の結果
 	* @return int エラーコード
 	*/
	private int getStudentPreferencesGroup(CMIElement element, 
																StringBuffer outstr) {

		int intErrCode = HACPError.HACP_ERR_SUCCESSFUL;
		if (CMIS13ModelUtil.isScorm13() != true) {
			// クライアントからのAICC2.x形式での受信要求である場合
			intErrCode = getStudentPreferencesGroupForAICC(element, outstr);
		}
		else {
			// クライアントからのSCORM1.3形式での受信要求である場合
			intErrCode = getStudentPreferencesGroupForSCORM(element, outstr);
		}	
		return intErrCode;
	}

	/**
	 * Student_Preferences グループの情報をAICC2.x用のGetParamコマンド
	 * （HACP通信）形式で取得する。<br>
	 * @param element CMIElement データモデルオブジェクト
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	private int getStudentPreferencesGroupForAICC(CMIElement element, StringBuffer outstr) {

		CMINode node = null;
		if ( (element) instanceof CMINode ) {
			node = (CMINode)element;
		}
		CMIElement	child = null;
		String strSubPath = null;
		String strPath = null;
		String strValue = null;
		String strLocalValue = null;

		if ( node != null ) {
			outstr.append("[");
			outstr.append(node.getKeyWord());
			outstr.append("]");
			outstr.append(CMIElement.STR_CRLF);
			// Audio
			strSubPath = "audio";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Audio");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Language
			strSubPath = "language";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Language");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Lesson_Type
			strSubPath = "lesson_type";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Lesson_Type");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Speed
			strSubPath = "speed";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Speed");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Text
			strSubPath = "text";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Text");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Text_Color
			strSubPath = "text_color";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Text_Color");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);
	
			// Text_Location
			strSubPath = "text_location";
			child = node.getChild(strSubPath);
	
			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Text_Location");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);
	
			// Text_Size
			strSubPath = "text_size";
			child = node.getChild(strSubPath);
	
			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Text_Size");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);
	
			// Video
			strSubPath = "video";
			child = node.getChild(strSubPath);
	
			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
			}
			outstr.append("Video");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);
	
			// Window.n
			strSubPath = "windows";
			CMINode windowsNode = (CMINode)node.getNChild(strSubPath);
			int intCount = windowsNode.getChildCount();
			if ( intCount > 0 ) {
				for ( int i = 0; i < intCount; i++ ) {
					CMIElement child_n = windowsNode.getChild(i);
	
					strLocalValue = child_n.getLocalValue();
					if ( strLocalValue == null ) {
						strValue = "";
					} else {
						strValue = strLocalValue;
					}
					outstr.append("Window.");
					outstr.append( String.valueOf( i + 1 ) );
					outstr.append("=");
					outstr.append(strValue);
					outstr.append(CMIElement.STR_CRLF);
				}
			} else {
				outstr.append("Window.1=");
				outstr.append(CMIElement.STR_CRLF);
			}
		}
		return HACPError.HACP_ERR_SUCCESSFUL;
	}

	/**
	 * Student_Preferences グループの情報をSCORM1.3用のGetParamコマンド
	 * （HACP通信）形式で取得する。<br>
	 * @param element CMIElement データモデルオブジェクト
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	private int getStudentPreferencesGroupForSCORM(CMIElement element, StringBuffer outstr) {

		CMINode node = null;
		if ( (element) instanceof CMINode ) {
			node = (CMINode)element;
		}
		CMIElement	child = null;
		String strSubPath = null;
		String strPath = null;
		String strValue = null;
		String strLocalValue = null;

		if ( node != null ) {
			outstr.append("[");
			outstr.append(node.getKeyWord());
			outstr.append("]");
			outstr.append(CMIElement.STR_CRLF);
			// Audio
			strSubPath = "audio";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				strValue = CMIUtil.urlEncode(strValue);
			}
			outstr.append("Audio");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Language
			strSubPath = "language";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				strValue = CMIUtil.urlEncode(strValue);
			}
			outstr.append("Language");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Speed
			strSubPath = "speed";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if (strLocalValue == null) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				strValue = CMIUtil.urlEncode(strValue);
			}
			outstr.append("Speed");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);

			// Text
			strSubPath = "text";
			child = node.getChild(strSubPath);

			strLocalValue = child.getLocalValue();
			if ( strLocalValue == null ) {
				strValue = "";
			} else {
				strValue = strLocalValue;
				strValue = CMIUtil.urlEncode(strValue);
			}
			outstr.append("Text");
			outstr.append("=");
			outstr.append(strValue);
			outstr.append(CMIElement.STR_CRLF);
		}
		return HACPError.HACP_ERR_SUCCESSFUL;
	}
	
	/**
	 * getGroup用の getParam処理。<br>
	 * @param element CMIElement データモデルオブジェクト
	 * @param outstr StringBuffer 返却の結果
	 * @return int HACPエラーコード
	 */
	private int getGroup(CMIElement element, StringBuffer outstr) {
		
		CMINode node = null;
		if ( (element) instanceof CMINode ) {
			node = (CMINode)element;
		}
		if ( node != null ) {
			outstr.append("[");
			outstr.append(node.getKeyWord());
			outstr.append("]");
			outstr.append(CMIElement.STR_CRLF);

			CMIElement child = null;
			int intChildCount = node.getChildCount();
			for( int index = 0; index < intChildCount; index++ ) {
				child = node.getChild(index);
				if ( child != null ) {
					child.getParam(outstr);
				}
			}
		}
		return HACPError.HACP_ERR_SUCCESSFUL;
	}

}