/*
Copyright(C) 1998-2000 京葉システム株式会社. All Rights Reserved.
本プログラムは、弊社提供のシステム内で、
所定の目的に沿っての実行のみを許諾します。
その他の流用・公開・解析等の一切を禁止します。
*/
//<SCRIPT language="JScript">
//**Start Encode**
//Copyright(C) 1998-2000 KEIYO-SYSTEM CO.,LTD. All Rights Reserved.
/*
fra/prt.src
JScriptの組み込み型にメンバ追加

＞履歴

2016/11/11 T.Yoshihara　曜日の言語別処理
2017/12/14 T.Yoshihara　Mac環境でコールスタックが溢れうるため修正

*/





function spPrototype (vaoWin) {
	xlInit(vaoWin);
// ローカル
	function xlInit (vaoWin) {
		with (vaoWin) {
			xlString(String.prototype);
			xlNumber(Number.prototype);
			xlDate(Date.prototype);
		}
	}

	/***** Date用メソッド *****/
	function xlDate (vaj_) {
		xlInit(vaj_);
	// ローカル
		function xlInit (vaj_) {
			vaj_.fpdAdd = mldAdd;
			vaj_.fpdAddM = mldAddM;
		// →Number、期間算出	あんま存在意義ないかも
			vaj_.fpiSub = mliSub;
		// →String、整形
			vaj_.fpsFmt8 = mlsFmt8;
			vaj_.fpsFmtS = mlsFmtS;
			vaj_.fpsFmtK = mlsFmtK;
			vaj_.fpsDayK = mlsDayK;
		}
	// ローカル
		// YYYY・MM・DD取得
		function fljYMD (vaj_) {
			with (vaj_) {
				return new Array(
					  getFullYear().fpsFmt0(4)
					, (getMonth() + 1).fpsFmt0(2)	// 月補正に注意！
					, getDate().fpsFmt0(2)
				);
			}
		}

		// 日加算
		function mldAdd (val_) {
			with (this) {
				return new Date(getFullYear(), getMonth(), getDate() + val_);
			}
		}

		// 月加算	丸めに注意
		function mldAddM (val_) {
			with (this) {
				var vld_ = new Date(getFullYear(), getMonth() + val_ + 1, 0);
				var vll_ = getDate() - vld_.getDate();
				return vll_ < 0 ? vld_.fpdAdd(vll_) : vld_;
			}
		}

		// 日数取得	閏秒等は考慮しない
		function mliSub (vad_) {
			return (this.getTime() - vad_.getTime()).fpjiDiv(1000 * 60 * 60 * 24)[0];
		}

		// [YYYYMMDD]形式取得
		function mlsFmt8 () {
			return fljYMD(this).join('');
		}

		// [YYYY/MM/DD]形式取得
		function mlsFmtS () {
			return fljYMD(this).join('/');
		}

		// [YYYY年MM月DD日]形式取得
		function mlsFmtK () {
			var lst_ = fljYMD(this);
			return lst_[0] + '年' + lst_[1] + '月' + lst_[2] + '日';
		}

		// 曜日文字列取得
		//[s]2016/11/11 T.Yoshihara
		function mlsDayK (vasJang) {
			switch (vasJang) {
				case 'E':
					switch (this.getDay()) {
						case 0: return 'sun';
						case 1: return 'mon';
						case 2: return 'tue';
						case 3: return 'wed';
						case 4: return 'thu';
						case 5: return 'fri';
						case 6: return 'sat';
					}
				break;
				default:
					return '日月火水木金土'.charAt(this.getDay());
				break;
			}
		}
		//[c]2016/11/11 T.Yoshihara
		//function mlsDayK () {
		//	return '日月火水木金土'.charAt(this.getDay());
		//}
		//[e]2016/11/11 T.Yoshihara
	}

	/***** String用メソッド *****/
	function xlString (vaj_) {
		xlInit(vaj_);
	// ローカル
		function xlInit (vaj_) {
			vaj_.fpsRep = mlsRep;	// これも公開する意義薄そう
			vaj_.fpsRight = mlsRight;
			vaj_.fpsTrim = mlsTrim;
			vaj_.fpsEncode = mlsEncode;
			vaj_.LPad = mlsLPad;
		// →Number
			vaj_.fpiEval = mliEval;	// これも他であんまり
		// →Date
			vaj_.fpdEval8 = mldDate8;
			vaj_.fpdEvalS = mldDateS;
//// Macの不具合？修正（00/04/24現在）
//// Mac版のString.replaceって空文字列を置換しようとすっとコケっしょ？
//if (/Mac/.test(navigator.platform) && vaj_._replace == null) {
//	vaj_._replace = vaj_.replace;
//	vaj_.replace = mlsReplace;
//}
		}
	// ローカル
		function mlsReplace (vaj_, vas_) {
			if (this == '') return '';
			return this._replace(vaj_, vas_);
		}
		// 文字列→日付型
		function mldDateS () {
			var lst_ = this.split('/');
			if (lst_.length < 3) {
				return null;
			} else {
				var vld_ = new Date(lst_[0].fpiEval(), lst_[1].fpiEval() - 1, lst_[2].fpiEval());
				return isNaN(vld_) ? null : vld_;
			}
		}
		function mldDate8 () {
			return new Date(
				  this.substr(0, 4).fpiEval()
				, this.substr(4, 2).fpiEval() - 1
				, this.substr(6, 2).fpiEval()
			);
		}

		// 文字列→整数
		function mliEval () {
//[s]2017/09/13 K.Hirose 変更 eval→test
			if (!isNaN(this)) if (/[0-9]/.test(this)) return parseInt(this, 10);
//[e]2017/09/13 K.Hirose 変更
			return Number.NaN;
		}

		// 反復
		function mlsRep (val_) {
			return (new Array(val_ + 1)).join(this);
		}

		// 右側文字列取得
		function mlsRight (val_) {
			with (this) {
				var vll_ = length;
				return substr(vll_ - val_);
			}
		}

		// 左右空白削除
/*
先頭の空白に最長一致し、→削除
任意の文字に最長一致し、
空白以外に一致し、
残りに一致→削除
*/
		function mlsTrim () {
//[s]2004/02/10 Y.Watanabe 変更 JScriptの遅延対応。
//前後の空白（含む全角空白）の削除。
		return this.replace(/^[　\s]+/, '').replace(/[　\s]+$/, '');
//[c]2004/02/10 Y.Watanabe 変更 JScriptの遅延対応。
//			return /^[　\s]*((.|\n)*[^　\s]).*/.exec(this) ?
//			RegExp.$1 : '';
//[e]2004/02/10 Y.Watanabe 変更 JScriptの遅延対応。
		}

		// メッセージ整形	HTMLとして表示しても崩れないように！
		function mlsEncode () {
			if (this == '') return '　';
			return this.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/ /g, '&nbsp;');
		}

		// 右寄せ桁埋め
		function mlsLPad (vai_, vas_) {
			if (vas_ == null) vas_ = '0';	// ０埋め数字がデフォルト
			var vli_ = this.length;
			if (vli_ < vai_) return vas_.fpsRep(vai_ - vli_) + this;
			else if (vli_ > vai_) return this.fpsRight(vai_);
			else return this;
		}
	}

	/***** Number用メソッド *****/
	function xlNumber (vaj_) {
		xlInit(vaj_);
	// ローカル
		function xlInit (vaj_) {
vaj_.fpiEval = mliEval;
		// →String
			vaj_.fpsFmt0 = mlsFmt0;
		// →Array
			// 除数→商、剰余	※被除数は絶対値を取ることに注意！
			vaj_.fpjiDiv = mljiDiv;
		}
	// ローカル
function mliEval () {
//	alert('数値を数値に変換しました。：' + this);
	return this + 0;	// Mac対策
}

		// ０埋め桁取り	非負整数対象
		function mlsFmt0 (valLen) {
			var vls_ = Math.abs(this).toString();
			var vll_ = vls_.length;
			return vll_ > valLen ? vls_
				: '0'.fpsRep(valLen - vll_) + vls_;
		}

		// 除数→商、剰余	※被除数は絶対値を取ることに注意！
		function mljiDiv (caiD) {	// 除数
			var vliA = Math.abs(this);	// 絶対値
			var vliR = vliA % caiD;	// 剰余
			return new Array((vliA - vliR) / caiD, vliR);
		}
	}
}
//</SCRIPT>
