/////////////////////////////////////////////
// ストップウォッチ
// 引数1　：TimeFlag		0=Start,1=Stop
// 引数2　：FormatFlag		0=ms,1=SS:ms,2=MM:SS:ms
// 戻り値 ：文字列
/////////////////////////////////////////////
var GTFlag = 0;
function TimeWatch(TimeFlag,FormatFlag){
	var TWork='';
	if (TimeFlag==0){									// Start Flag
		GTFlag = 1;										// Global Time Flag
		myStart=new Date();								// スタート時間取得
	}else if (TimeFlag==1){								// [STOP]ボタンを押した
		myStop = new Date();							// ストップ時間取得
		myTime = myStop.getTime() - myStart.getTime();	// 通算ミリ秒計算
		myH = Math.floor(myTime/(60*60*1000));			// '時間'取得
		myGosa = myTime-(myH*60*60*1000);
		myM = Math.floor(myTime/(60*1000));				// '分'取得
		myTime = myTime-(myM*60*1000);
		myS = Math.floor(myTime/1000);					// '秒'取得
		myMS = myTime%1000;								// 'ミリ秒'取得
		switch (FormatFlag){
			case 0:
				TWork=LRStrFill(''+myMS,'0',3,1);
				break;
			case 1:
				TWork=myS+'.'+LRStrFill(''+myMS,'0',3,1);
				break;
			case 2:
				TWork=LRStrFill(''+myM,'0',2,1)+':'+LRStrFill(''+myS,'0',2,1)+'.'+LRStrFill(''+myMS,'0',3,1);
				break;
			default:
				TWork='PARAMETER ERROR!!';
				break;
		}
	} else {
		TWork='PARAMETER ERROR!!';
	}
	if (TimeFlag!=0){
		GTFlag = 0;
		return TWork;
	}
}

/////////////////////////////////////////////
// 指定アスキーコード文字列を指定バイト分埋める。
// 引数　：StrValue  指定文字列 '1'=0x31
// 戻り値：文字列
/////////////////////////////////////////////
function CharFill(Value,MaxCount) {
	var Work = '';
	var i = 1;
	for (i = 1; i <= MaxCount; i++){
		Work = Work + String.fromCharCode(Value);
	}
return Work;
}

/////////////////////////////////////////////
// 対象文字列を右詰又は左詰にして
//                 nバイトスペースで埋める。
// 引数1：StrValue  対象文字列
// 引数2：nSpc      スペースで埋めるバイト数
// 引数3：LRValue   (0=左詰め/1=右詰め)指定
// 戻り値： 変換後文字列
/////////////////////////////////////////////
function LRSpcFill(StrValue,nSpc,LRValue) {
	var Work = '';
	var i = 1;
	var MaxCount = 0;
	
	MaxCount = nSpc - getByteCount(FRTrim(StrValue));
	
	for (i = 1; i <= MaxCount; i++){
		Work = Work + String.fromCharCode(0x20);
	}
	if (LRValue == 0){
		Work = FRTrim(StrValue) + Work;
	} else if (LRValue == 1){
		Work = Work + FRTrim(StrValue);
	} else {
		Work = 'PARAM_ERROR!!'
	}
return Work;
}

/////////////////////////////////////////////
// 全角であるかをチェックします。
// @param チェックする値
// @return ture : 全角 / flase : 全角以外
/////////////////////////////////////////////
function checkIsZenkaku(value) {
	for (var i = 0; i < value.length; ++i) {
		var c = value.charCodeAt(i);
		//  半角カタカナは不許可
		if (c < 256 || (c >= 0xff61 && c <= 0xff9f)) {
			return false;
		}
	}
return true;
}
    
/////////////////////////////////////////////
// 文字列のバイト数を取得する。
// 全角を2バイト、半角を1バイトとしてカウントします。
// @param バイトを取得する値
// @return 取得したバイト数
/////////////////////////////////////////////
function getByteCount(value) {
	var count = 0;
	for ( var i = 0; i < value.length; ++i ) {
		var sub = value.substring(i, i + 1);
		//全角の場合２バイト追加。
		if( checkIsZenkaku(sub) ){
			count += 2;
		} 
		else {
			count += 1;
		}
	}
return count;
    }

/////////////////////////////////////////////
// 文字列から先頭の指定バイト数分を抜き出す
// 引数1　：strSrc　  対象文字列
// 引数2　：numStBite 開始バイト
// 引数3　：numBite　 抜き出しバイト
// 戻り値 ：抜き出した文字列
/////////////////////////////////////////////
function substrB(strSrc,numStBite,numBite){
	var Trimlength ;
	var len = 0 ;
	var iCode ; // キャラクタコード
	var RtnStr = "" ;

	//不要な改行コードを無視する
	Trimlength = strSrc.length ;
	for(i=strSrc.length-1 ; i>=0 ; i-- ){
		iCode = strSrc.charCodeAt(i) ;
		if(iCode!=13 && iCode!=10){
		Trimlength = i+1 ;
		break ;
		}
	}

	for(i=0;i<Trimlength;i++){
		iCode = strSrc.charCodeAt(i); 
		len += ((iCode>=0 && iCode<=255)||(iCode>=0xff61 && iCode<=0xff9f)) ? 1 : 2; 
		if(len>=numStBite && len<numStBite+numBite){ 
			RtnStr = RtnStr + strSrc.substr(i,1); 
		} 
	} 
return RtnStr; 
}

/////////////////////////////////////////////
// 前後のスペースを取り除く 
// 引数  ： p_val　変換元文字列 
// 戻り値： p_val　変換後文字列 
/////////////////////////////////////////////
function FRTrim(p_val){ 
    var flg = 1; 

    // 先頭のスペースを取る 
    for(i=0; i<p_val.length; i++){ 
        if((p_val.substring(i, i+1) != ' ') && (p_val.substring(i, i+1) != '　')) { 
            p_val = p_val.substring(i, p_val.length+1); 
            flg = 0; break; 
        } 
    } 
    // 末尾のスペースを取る 
    for(i=p_val.length-1; i>=0; i--){ 
        if((p_val.substring(i, i+1) != ' ') && (p_val.substring(i, i+1) != '　')) { 
            p_val = p_val.substring(0, i+1); 
            flg = 0; break; 
        } 
    } 
    // すべてスペースの場合はクリア 
    if(flg){ p_val = ''; } 
    return(p_val); 
}

/////////////////////////////////////////////
// 対象文字列を右詰又は左詰にして
//                 nバイト0x**で埋める。
// 引数1：StrValue  対象文字列
// 引数2：HexValue  ASCIIコード指定(例：0 = '0x30')
// 引数3：nSpc      HexValueで埋めるバイト数
// 引数4：LRValue   (0=左詰め/1=右詰め)指定
// 戻り値： 変換後文字列
/////////////////////////////////////////////
function LRAscFill(StrValue,HexValue,nSpc,LRValue) {
	var Work = '';
	var i = 1;
	var MaxCount = 0;
	
	MaxCount = nSpc - getByteCount(FRTrim(StrValue));
	
	for (i = 1; i <= MaxCount; i++){
		Work = Work + String.fromCharCode(HexValue);
	}
	if (LRValue == 0){
		Work = FRTrim(StrValue) + Work;
	} else if (LRValue == 1){
		Work = Work + FRTrim(StrValue);
	} else {
		Work = 'PARAM_ERROR!!';
	}
	return Work;
}

/////////////////////////////////////////////
// 対象文字列を右詰又は左詰にして
//                 nバイト指定文字列で埋める。
// 引数1：StrValue  対象文字列
// 引数2：UStrValue 指定文字列(例：'20')
// 引数3：nSpc      UStrValueで埋めるバイト数
// 引数4：LRValue   (0=左詰め/1=右詰め)指定
// 戻り値： 変換後文字列
/////////////////////////////////////////////
function LRStrFill(StrValue,UStrValue,nSpc,LRValue) {
	var Work = '';
	var i = 1;
	var MaxCount = 0;
	
	MaxCount = nSpc - getByteCount(FRTrim(StrValue));
	
	for (i = 1; i <= MaxCount; i++){
		Work = Work + UStrValue;
	}
	if (LRValue == 0){
		Work = FRTrim(StrValue) + Work;
	} else if (LRValue == 1){
		Work = Work + FRTrim(StrValue);
	} else {
		Work = 'PARAM_ERROR!!';
	}
	return Work;
}

/////////////////////////////////////////////
// 対象文字列を右詰又は左詰にして
//                 nバイト'20'で埋める。
// 引数1：StrValue  対象文字列
// 引数2：nSpc      スペースで埋めるバイト数
// 引数3：LRValue   (0=左詰め/1=右詰め)指定
// 戻り値： 変換後文字列
/////////////////////////////////////////////
function LRAsciiSpcFill(StrValue,nSpc,LRValue) {
	var Work = '';
	var i = 1;
	var MaxCount = 0;
	
	MaxCount = nSpc - getByteCount(FRTrim(StrValue));
	
	for (i = 1; i <= (MaxCount/2); i++){
		Work = Work + '20';
	}
	if (LRValue == 0){
		Work = FRTrim(StrValue) + Work;
	} else if (LRValue == 1){
		Work = Work + FRTrim(StrValue);
	} else {
		Work = 'PARAM_ERROR!!';
	}
return Work;
}

/////////////////////////////////////////////
// 対象文字列を右詰又は左詰にして
//                 nバイト0x30で埋める。
// 引数1：StrValue  対象文字列
// 引数2：nSpc      '0'で埋めるバイト数
// 引数3：LRValue   (0=左詰め/1=右詰め)指定
// 戻り値： 変換後文字列
/////////////////////////////////////////////
function LRZroFill(StrValue,nSpc,LRValue) {
	var Work = '';
	var i = 1;
	var MaxCount = 0;
	
	MaxCount = nSpc - getByteCount(FRTrim(StrValue));
	
	for (i = 1; i <= MaxCount; i++){
		Work = Work + String.fromCharCode(0x30);
	}
	if (LRValue == 0){
		Work = FRTrim(StrValue) + Work;
	} else if (LRValue == 1){
		Work = Work + FRTrim(StrValue);
	} else {
		Work = 'PARAM_ERROR!!'
	}
	return Work;
}
