/*==================================================================================================
AmuzeS::ContextCli

 [説明]
	AmuzeSコアライブラリ(Webクライアント用)
 [メモ]
	なし
 [更新]
	2008/12/25
==================================================================================================*/
/***********************************************************************
ContextCli(void)

 [概要]
	コンストラクタ
 [引数]
	なし
 [返値]
	return:
		生成インスタンス
 [参照]
	なし
 [メモ]
	なし
***********************************************************************/
function ContextCli(){
	this.elem = document.all ? ContextCli_elemForIE4 : ContextCli_elemForGen;
	this.toWebBodyString = ContextCli_toWebBodyString;
	this.toNNValue = ContextCli_toNNValue;
	this.toIntegerWithRange = ContextCli_toIntegerWithRange;
	this.toFloatWithRange = ContextCli_toFloatWithRange;
	this.toRegLineString = ContextCli_toRegLineString;
	this.toRegTextString = ContextCli_toRegTextString;
	this.toDecimalFormatString = ContextCli_toDecimalFormatString;
	this.toDateFormatString = ContextCli_toDateFormatString;
	this.getDateElement = ContextCli_getDateElement;
	this.createDatetime = ContextCli_createDatetime;
}


/***********************************************************************
DomElement elem(Strnig szElemenetID)

 [概要]
	IDを元にタグに対応するDOM要素オブジェクトを返す
 [引数]
	szElemenetID:
		要素ID
 [返値]
	return:
		DOM要素オブジェクト
 [参照]
	なし
 [メモ]
	なし
***********************************************************************/
function ContextCli_elemForIE4(szElemenetID){
	return(document.all(szElemenetID));
}
function ContextCli_elemForGen(szElemenetID){
	return(document.getElementById(szElemenetID));
}


/***********************************************************************
Strnig toWebBodyString(Strnig szTarget)

 [概要]
	通常文字列(表示目的)用にHTML/XMLエスケープした文字列(タグを含みうる)へ変換
 [引数]
	szTarget:
		対象文字列
 [返値]
	return:
		変換後の文字列
 [参照]
	なし
 [メモ]
	なし
***********************************************************************/
function ContextCli_toWebBodyString(szTarget){
	if(szTarget==null){
		return(null);
	}

	var szReturn = szTarget;
	szReturn = szReturn.replace(/(^ | $)/g,'&nbsp;');
	szReturn = szReturn.replace(/\r*\n /g,'\r\n&nbsp;');
	szReturn = szReturn.replace(/ \r*\n/g,'&nbsp;\r\n');
	szReturn = szReturn.replace(/  /g,' &nbsp;');
	szReturn = szReturn.replace(/(|\r)\n/g,'<br />');
	return(szReturn);
}


/***********************************************************************
Object toNNValue(Object objTarget, Object objDefault)

 [概要]
	null値の可能性のある対象値を非null値に変換する
 [引数]
	objTarget:
		対象値
	objDefault:
		対象値がnull値だった場合の返り値
 [返値]
	return:
		変換後の値
 [参照]
	なし
 [メモ]
	なし
***********************************************************************/
function ContextCli_toNNValue(objTarget,objDefault){
	return(objTarget!=null ? objTarget : objDefault);
}


/***********************************************************************
Integer toIntegerWithRange(String szTarget, Integer iBoundL, Integer iBoundU)

 [概要]
	文字列を10進整数解釈して指定範囲内にあるならその数値を返す(無効／範囲外の場合はnullを返す)
 [引数]
	szTarget:
		対象文字列
	iBoundL:
		範囲下限(>=)
		※nullなら下限なしとみなす
	iBoundU:
		範囲上限(<=)
		※nullなら上限なしとみなす
 [返値]
	return:
		変換後の数値
 [参照]
	なし
 [メモ]
	なし
***********************************************************************/
function ContextCli_toIntegerWithRange(szTarget,iBoundL,iBoundU){
	if(szTarget==null){
		return(null);
	}

	var iReturn = null;
	if(szTarget.match(/^(|\+|-|＋|－)[0-9,０-９，\t\n\r\f 　]+(|(\.|．)[0-9,０-９，\t\n\r\f 　]+)$/)){
		var szAdjTarget = szTarget;
		szAdjTarget = szAdjTarget.replace(/０/g,'0');					//全角文字の半角化
		szAdjTarget = szAdjTarget.replace(/１/g,'1');
		szAdjTarget = szAdjTarget.replace(/２/g,'2');
		szAdjTarget = szAdjTarget.replace(/３/g,'3');
		szAdjTarget = szAdjTarget.replace(/４/g,'4');
		szAdjTarget = szAdjTarget.replace(/５/g,'5');
		szAdjTarget = szAdjTarget.replace(/６/g,'6');
		szAdjTarget = szAdjTarget.replace(/７/g,'7');
		szAdjTarget = szAdjTarget.replace(/８/g,'8');
		szAdjTarget = szAdjTarget.replace(/９/g,'9');
		szAdjTarget = szAdjTarget.replace(/－/g,'-');
		szAdjTarget = szAdjTarget.replace(/．/g,'.');
		szAdjTarget = szAdjTarget.replace(/[,，\t\n\r\f　＋]/g,'');		//無効文字の除去
		iReturn = parseInt(szAdjTarget,10);								//整数化
		if((iBoundL!=null && iReturn<iBoundL)
		|| (iBoundU!=null && iReturn>iBoundU)){
			iReturn = null;
		}
	}
	return(iReturn);
}


/***********************************************************************
Integer toFloatWithRange(String szTarget, Float fsBoundL, Float fsBoundU)

 [概要]
	文字列を10進実数解釈して指定範囲内にあるならその数値を返す(無効／範囲外の場合はnullを返す)
 [引数]
	szTarget:
		対象文字列
	fsBoundL:
		範囲下限(>=)
		※nullなら下限なしとみなす
	fsBoundU:
		範囲上限(<=)
		※nullなら上限なしとみなす
 [返値]
	return:
		変換後の数値
 [参照]
	なし
 [メモ]
	なし
***********************************************************************/
function ContextCli_toFloatWithRange(szTarget,iBoundL,iBoundU){
	if(szTarget==null){
		return(null);
	}

	var fsReturn = null;
	if(szTarget.match(/^(|\+|-|＋|－)[0-9,０-９，\t\n\r\f 　]+(|(\.|．)[0-9,０-９，\t\n\r\f 　]+)$/)){
		var szAdjTarget = szTarget;
		szAdjTarget = szAdjTarget.replace(/０/g,'0');					//全角文字の半角化
		szAdjTarget = szAdjTarget.replace(/１/g,'1');
		szAdjTarget = szAdjTarget.replace(/２/g,'2');
		szAdjTarget = szAdjTarget.replace(/３/g,'3');
		szAdjTarget = szAdjTarget.replace(/４/g,'4');
		szAdjTarget = szAdjTarget.replace(/５/g,'5');
		szAdjTarget = szAdjTarget.replace(/６/g,'6');
		szAdjTarget = szAdjTarget.replace(/７/g,'7');
		szAdjTarget = szAdjTarget.replace(/８/g,'8');
		szAdjTarget = szAdjTarget.replace(/９/g,'9');
		szAdjTarget = szAdjTarget.replace(/－/g,'-');
		szAdjTarget = szAdjTarget.replace(/．/g,'.');
		szAdjTarget = szAdjTarget.replace(/[,，\t\n\r\f　＋]/g,'');		//無効文字の除去
		fsReturn = parseFloat(szAdjTarget,10);							//実数化
		if((fsBoundL!=null && fsReturn<fsBoundL)
		|| (fsBoundU!=null && fsReturn>fsBoundU)){
			fsReturn = null;
		}
	}
	return(fsReturn);
}


/***********************************************************************
String toRegLineString(String szTarget)

 [概要]
	改行コード、制御コード(タブ含む)、前後の空白を取り除いた文字列を返す(空文字の場合はnull値を返す)
 [引数]
	szTarget:
		対象文字列
 [返値]
	return:
		変換後の文字列
 [参照]
	なし
 [メモ]
	なし
***********************************************************************/
function ContextCli_toRegLineString(szTarget){
	if(szTarget==null){
		return(null);
	}

	var szReturn = szTarget;
	szReturn = szReturn.replace(/[\x00-\x1F]/g,'');						//改行コード、制御コード(タブ含む)の除去
	szReturn = szReturn.replace(/(^[ ]+|[ ]+$)/g,'');					//前後の空白の除去
	if(szReturn==''){
		szReturn = null;
	}
	return(szReturn);
}


/***********************************************************************
String toRegTextString(String szTarget)

 [概要]
	制御コード(タブ含む)、末尾の空白・改行コードを取り除いた文字列を返す(空文字の場合はnull値を返す)
 [引数]
	szTarget:
		対象文字列
 [返値]
	return:
		変換後の文字列
 [参照]
	なし
 [メモ]
	なし
***********************************************************************/
function ContextCli_toRegTextString(szTarget){
	if(szTarget==null){
		return(null);
	}

	var szReturn = szTarget;
	szReturn = szReturn.replace(/[\x00-\x09\x0B\x0C\x0E-\x1F]/g,'');	//制御コード(タブ含む)の除去
	szReturn = szReturn.replace(/[ \r\n]+$/g,'');						//末尾の空白・改行コードの除去
	if(szReturn==''){
		szReturn = null;
	}
	return(szReturn);
}


/***********************************************************************
String toDecimalFormatString(String szFormat, float fsTarget)

 [概要]
	対象値を指定フォーマットの文字列(10進数字列)に変換
 [引数]
	szFormat:
		書式指定({'+'|'-'|''}*1 ＆ {'0'|'#'|','}*N ＆ {'.'|''}*1 ＆ {'0'|'#'|','}*N)
		・'0'	:数字1桁(対応数値がない場合は0で穴埋め)
		・'#'	:数字1桁(対応数値がない場合は省略)
		・','	:桁区切り(上位に表示すべき数値がない場合は省略)
		・'+'	:符号(正数なら'+'、0なら省略、負数なら'-')
		・'-'	:符号(正数/0なら省略、負数なら'-')
	fsTarget:
		対象値
 [返値]
	return:
		変換後の文字列
 [参照]
	なし
 [メモ]
	なし
***********************************************************************/
function ContextCli_toDecimalFormatString(szFormat,fsTarget){
	if(szFormat==null
	|| fsTarget==null || isNaN(fsTarget)==true){
		return('');
	}

	var szReturn = '';
	var iDecimalPoint = szFormat.lastIndexOf('.');
	var iLength;
	var fsValue;
	var szDelay;

	//書式指定を小数点の左側から順に解釈して整数部を解決
	fsValue = (fsTarget<0 ? (fsTarget * -1) : fsTarget);
	szDelay = '';
	var sIsFirstDigit = 1;
	for(var i=(iDecimalPoint<0 ? (szFormat.length-1) : (iDecimalPoint-1)); i>=0; i--){
		var sz = szFormat.substr(i,1);
		if(sz=='0'){
			var iNumber = Math.floor(fsValue % 10);
			fsValue /= 10;
			szReturn = iNumber.toString() + szDelay + szReturn;
			szDelay = '';
			sIsFirstDigit = 0;
		}
		else if(sz=='#'){
			var iNumber = Math.floor(fsValue % 10);
			fsValue /= 10;
			if(sIsFirstDigit==1 || iNumber!=0){
				szReturn = iNumber.toString() + szDelay + szReturn;
				szDelay = '';
			}
			else{
				szDelay = '0' + szDelay;
			}
			sIsFirstDigit = 0;
		}
		else if(sz==','){												//','は遅延処理
			szDelay = ',' + szDelay;
		}
		else if(sz=='.'){												//'.'は無視
		}
		else if(sz=='+'){												//※遅延処理対象は反映せずに破棄
			if(fsTarget<0){
				szReturn = '-' + szReturn;
			}
			else if(fsTarget>0){
				szReturn = '+' + szReturn;
			}
			break;														//終了
		}
		else if(sz=='-'){												//※遅延処理対象は反映せずに破棄
			if(fsTarget<0){
				szReturn = '-' + szReturn;
			}
			break;														//終了
		}
		else{															//※遅延処理対象は反映せずに破棄
			break;														//終了
		}
	}

	//書式指定を小数点の右側から順に解釈して少数部を解決
	fsValue = (fsTarget<0 ? (fsTarget * -1) : fsTarget);
	fsValue *= 10;
	szDelay = '.';														//小数点を遅延処理対象の初期値とする
	for(var i=(iDecimalPoint<0 ? szFormat.length : (iDecimalPoint+1)); i<szFormat.length; i++){
		var sz = szFormat.substr(i,1);
		if(sz=='0'){
			var iNumber = Math.floor(fsValue % 10);
			fsValue *= 10;
			szReturn = szReturn + szDelay + iNumber.toString();
			szDelay = '';
		}
		else if(sz=='#'){
			var iNumber = Math.floor(fsValue % 10);
			fsValue *= 10;
			if(iNumber!=0){
				szReturn = szReturn + szDelay + iNumber.toString();
				szDelay = '';
			}
			else{														//※該当値が0の場合は遅延処理
				szDelay = szDelay + '0';
			}
		}
		else if(sz==','){
			szDelay = szDelay + ',';									//','は遅延処理
		}
		else{															//※遅延処理対象は反映せずに破棄
			break;														//終了
		}
	}
	return(szReturn);
}


/***********************************************************************
String toDateFormatString(String szFormat, Date dateTarget)

 [概要]
	対象日時を指定フォーマットの文字列に変換
 [引数]
	szFormat:
		書式指定
		・'yyyy':年(4桁固定)
		・'y'	:年(1～4桁可変)
		・'YY'	:年下2桁(2桁固定)
		・'Y'	:年下2桁(1～2桁可変)
		・'MM'	:月(2桁固定)
		・'M'	:月(1～2桁可変)
		・'dd'	:日(2桁固定)
		・'d'	:日(1～2桁可変)
		・'D'	:1/1からの日数(1～3桁可変)
		・'EEE'	:曜日(英語省略形表記)
		・'EE'	:曜日(日本語表記)
		・'E'	:曜日(英語表記)
		・'HH'	:24時間式の時(2桁固定)
		・'H'	:24時間式の時(1～2桁可変)
		・'hh'	:12時間式の時(2桁固定)
		・'h'	:12時間式の時(1～2桁可変)
		・'mm'	:分(2桁固定)
		・'m'	:分(1～2桁可変)
		・'ss'	:秒(2桁固定)
		・'s'	:秒(1～2桁可変)
	dateTarget:
		対象日時
 [返値]
	return:
		変換後の文字列
 [参照]
	なし
 [メモ]
	なし
***********************************************************************/
function ContextCli_toDateFormatString(szFormat,dateTarget){
	if(szFormat==null
	|| dateTarget==null || typeof(dateTarget)!=typeof(new Date())){
		return('');
	}

	//日時要素の取得
	var iTarget_DY = dateTarget.getFullYear();
	var iTarget_DM = dateTarget.getMonth() + 1;
	var iTarget_DD = dateTarget.getDate();
	var iTarget_DE = dateTarget.getDay();
	var iTarget_TH = dateTarget.getHours();
	var iTarget_TM = dateTarget.getMinutes();
	var iTarget_TS = dateTarget.getSeconds();

	//置換文字列の生成
	var szYear = iTarget_DY.toString();
	var szYear4 = ('0000' + szYear);
	szYear4 = szYear4.substr(szYear4.length-4,4);
	var szYearLo = (iTarget_DY % 100).toString();
	var szYearLo2 = szYear4.substr(2,2);
	var szMonth = iTarget_DM.toString();
	var szMonth2 = ('00' + szMonth);
	szMonth2 = szMonth2.substr(szMonth2.length-2,2);
	var szDay = iTarget_DD.toString();
	var szDay2 = ('00' + szDay);
	szDay2 = szDay2.substr(szDay2.length-2,2);
	var iDayCount = new Array(0,31,59,90,120,151,181,212,243,273,304,334)[iTarget_DM-1] + iTarget_DD;
	if(iTarget_DM>2 && iTarget_DY%4==0 && (iTarget_DY%100!=0 || iTarget_DY%400==0)){
		iDayCount ++;													//うるう日があるなら補正
	}
	var szWeek = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[iTarget_DE];
	var szWeek2 = new Array('日','月','火','水','木','金','土')[iTarget_DE];
	var szWeek3 = new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat')[iTarget_DE];
	var szHour = iTarget_TH.toString();
	var szHour2 = ('00' + szHour);
	szHour2 = szHour2.substr(szHour2.length-2,2);
	var szHourAP = new Array('0','1','2','3','4','5','6','7','8','9','10','11','12','1','2','3','4','5','6','7','8','9','10','11')[iTarget_TH];
	var szHourAP2 = ('00' + szHourAP);
	szHourAP2 = szHourAP2.substr(szHourAP2.length-2,2);
	var szMinute = iTarget_TM.toString();
	var szMinute2 = ('00' + szMinute);
	szMinute2 = szMinute2.substr(szMinute2.length-2,2);
	var szSecond = iTarget_TS.toString();
	var szSecond2 = ('00' + szSecond);
	szSecond2 = szSecond2.substr(szSecond2.length-2,2);

	//書式文字を置換
	var szReturn = szFormat;
	szReturn = szReturn.replace(/yyyy/g,szYear4);
	szReturn = szReturn.replace(/y/g,szYear);
	szReturn = szReturn.replace(/YY/g,szYearLo2);
	szReturn = szReturn.replace(/Y/g,szYearLo);
	szReturn = szReturn.replace(/MM/g,szMonth2);
	szReturn = szReturn.replace(/M/g,szMonth);
	szReturn = szReturn.replace(/dd/g,szDay2);
	szReturn = szReturn.replace(/d/g,szDay);
	szReturn = szReturn.replace(/D/g,iDayCount);
	szReturn = szReturn.replace(/HH/g,szHour2);
	szReturn = szReturn.replace(/H/g,szHour);
	szReturn = szReturn.replace(/hh/g,szHourAP2);
	szReturn = szReturn.replace(/h/g,szHourAP);
	szReturn = szReturn.replace(/mm/g,szMinute2);
	szReturn = szReturn.replace(/m/g,szMinute);
	szReturn = szReturn.replace(/ss/g,szSecond2);
	szReturn = szReturn.replace(/s/g,szSecond);
	szReturn = szReturn.replace(/EEE/g,szWeek3);						//曜日変換は最後に行う(衝突回避のため)
	szReturn = szReturn.replace(/EE/g,szWeek2);
	szReturn = szReturn.replace(/E/g,szWeek);
	return(szReturn);
}


/***********************************************************************
Integer getDateElement(String szElement, Date dateTarget)

 [概要]
	対象日時から指定要素値を取得
 [引数]
	szElement:
		要素指定
		・'y'	:年(1900～)
		・'Y'	:年下2桁(0～99)
		・'M'	:月(1～12)
		・'d'	:日(1～31)
		・'D'	:1/1からの日数(1～366)
		・'E'	:曜日(0:日、1:月、2:火、3:水、4:木、5:金、6:土)
		・'H'	:24時間式の時(0～23)
		・'h'	:12時間式の時(0～12)
		・'m'	:分(0～59)
		・'s'	:秒(0～59)
	dateTarget:
		対象日時
 [返値]
	return:
		取得値
 [参照]
	なし
 [メモ]
	なし
***********************************************************************/
function ContextCli_getDateElement(szElement,dateTarget){
	if(szElement==null
	|| dateTarget==null || typeof(dateTarget)!=typeof(new Date())){
		return(null);
	}

	//日時要素の取得
	var iTarget_DY = dateTarget.getFullYear();
	var iTarget_DM = dateTarget.getMonth() + 1;
	var iTarget_DD = dateTarget.getDate();
	var iTarget_DE = dateTarget.getDay();
	var iTarget_TH = dateTarget.getHours();
	var iTarget_TM = dateTarget.getMinutes();
	var iTarget_TS = dateTarget.getSeconds();

	//置換文字列の生成
	var iReturn = null;
	if(szElement=='y'){
		iReturn = iTarget_DY;
	}
	else if(szElement=='Y'){
		iReturn = iTarget_DY % 100;
	}
	else if(szElement=='M'){
		iReturn = iTarget_DM;
	}
	else if(szElement=='d'){
		iReturn = iTarget_DD;
	}
	else if(szElement=='D'){
		iReturn = new Array(0,31,59,90,120,151,181,212,243,273,304,334)[iTarget_DM-1] + iTarget_DD;
		if(iTarget_DM>2 && iTarget_DY%4==0 && (iTarget_DY%100!=0 || iTarget_DY%400==0)){
			iReturn ++;													//うるう日があるなら補正
		}
	}
	else if(szElement=='E'){
		iReturn = iTarget_DE;
	}
	else if(szElement=='H'){
		iReturn = iTarget_TH;
	}
	else if(szElement=='h'){
		iReturn = new Array(0,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11)[iTarget_TH];
	}
	else if(szElement=='m'){
		iReturn = iTarget_TM;
	}
	else if(szElement=='s'){
		iReturn = iTarget_TS;
	}
	return(iReturn);
}


/***********************************************************************
Date createDatetime(int iTarget_DY, int iTarget_DM, int iTarget_DD, int iTarget_TH, int iTarget_TM, int iTarget_TS)

 [概要]
	指定情報から、日時を生成
 [引数]
	iTarget_DY:
		年(1000～)
	iTarget_DM:
		月(1～12)
		※範囲オーバーの場合は前後の日時に補正
	iTarget_DD:
		日(1～31)
		※範囲オーバーの場合は前後の日時に補正
	iTarget_TH:
		24時間式の時(0～23)
		※範囲オーバーの場合は前後の日時に補正
	iTarget_TM:
		分(0～59)
		※範囲オーバーの場合は前後の日時に補正
	iTarget_TS:
		秒(0～59)
		※範囲オーバーの場合は前後の日時に補正
 [返値]
	return:
		生成日時
 [参照]
	なし
 [メモ]
	なし
***********************************************************************/
function ContextCli_createDatetime(iTarget_DY,iTarget_DM,iTarget_DD,iTarget_TH,iTarget_TM,iTarget_TS){
	if(iTarget_DY==null || isNaN(iTarget_DY)==true || parseInt(iTarget_DY)!=iTarget_DY
	|| iTarget_DM==null || isNaN(iTarget_DM)==true || parseInt(iTarget_DM)!=iTarget_DM
	|| iTarget_DD==null || isNaN(iTarget_DD)==true || parseInt(iTarget_DD)!=iTarget_DD
	|| iTarget_TH==null || isNaN(iTarget_TH)==true || parseInt(iTarget_TH)!=iTarget_TH
	|| iTarget_TM==null || isNaN(iTarget_TM)==true || parseInt(iTarget_TM)!=iTarget_TM
	|| iTarget_TS==null || isNaN(iTarget_TS)==true || parseInt(iTarget_TS)!=iTarget_TS){
		return(null);
	}

	var dateReturn = new Date();
	dateReturn.setFullYear(iTarget_DY);
	dateReturn.setMonth(iTarget_DM - 1);
	dateReturn.setDate(iTarget_DD);
	dateReturn.setHours(iTarget_TH);
	dateReturn.setMinutes(iTarget_TM);
	dateReturn.setSeconds(iTarget_TS);
	dateReturn.setMilliseconds(0);
	return(dateReturn);
}
